diff --git a/.ipynb_checkpoints/RBR_Processing_Report_2024-017_GitTest-checkpoint.ipynb b/.ipynb_checkpoints/RBR_Processing_Report_2024-017_GitTest-checkpoint.ipynb new file mode 100644 index 0000000..3715855 --- /dev/null +++ b/.ipynb_checkpoints/RBR_Processing_Report_2024-017_GitTest-checkpoint.ipynb @@ -0,0 +1,4687 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "95c0a9f1-823b-475b-a80f-4021a4420e76", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "## Changes to the original steps:
\n", + "Changes to Notebook in Docoumnets/GitHub/RBR-Processing
\n", + "To call functions from the python file rather than have them embedded into the Notebook\n", + "* Check profiles plots and pressure difference FIRST
\n", + "* Call plotting and write file functions from outside this notebook
\n", + "* changed made to write file function so that they could be read in IOS Shell
\n", + "* change made to write file encoding=\"ascii\" otherwise files coulndn't be read by ios_shell shell_file package\n", + "* Clip doesn't match because it cuts too much off on python clip - or I didn't cut off enough in IOS shell.
\n", + "* Rounded the Pressure for BINAVE to 0 decimal places, was getting 0.1 or 0.9, need whole numbers or 'bin value'\n", + "**------------------------------------------------------------------------------------------------------**" + ] + }, + { + "cell_type": "markdown", + "id": "f7c22279-40f1-41b2-8587-a79c87df274d", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "show" + ] + }, + "source": [ + "**RBR CTD DATA PROCESSING NOTES**
\n", + "Cruise: 2024-017
\n", + "Locations: Clayoquot Sound
\n", + "Project: Clayoquot Weather Station Network - ACRDP
\n", + "Party Chief: Cooper G.
\n", + "Platform: Doug Anderson
\n", + "Date: February 4, 2024 - February 7, 2024
\n", + "
\n", + "Processed by: Samantha Huntington
\n", + "Date of Processing: May 23, 2024 - May 23, 2024
\n", + "Number of Raw files: 52 Number of Processed Files: 51
\n", + "\n", + "**Instrument Summary**
\n", + "Equipment: RBR Maestro CTD (s/n 232531) with a Turner Cyclops Fluorometer (s/n 2111617) and a JFE Advantech Rinko III oxygen sensor (s/n 0480).
\n", + "Sampling frequency was at 8Hz.
\n", + " \n", + "**Summary of Quality and Concerns**
\n", + "A cast list of times and locations was provided, “2024-017CTDTapLogFile_Final.csv”. The log file contained 56 casts, 5 of which were zooplankton
\n", + "nets, these five casts were removed when making the header merge file.
\n", + "The winch stopped working at 20m for cast 18, it was brought to the surface and restarted, creating an additional profile.
\n", + "
\n", + "The data overall look good with some spikes in Fluroescence. There is a lot of noisy data at the surfce during the CTD soak.
\n", + "\n", + "\n", + "**Processing Summary**\n", + "\n", + "*All processing code is available on request in RBR_Processing_Report_2024-017_suggested.ipynb.
* \n", + "\n", + "File **232531_20240206_1745.rsk** contained the 52 profiles. All profiles were extracted using python function READ_RSK().
\n", + "Profile numbers were matched to the event numbers provided in the log file.
\n", + "
\n", + "A dummy profile of 918 was assigned to the rsk profile for the first attempt at cast 18 using the header merge csv file.
\n", + "The extracted csv file from this function ws then deleted before the next step. \n", + "\n", + "File **2024-017_header-merge.csv** was created, based on the information provided by the chief scientist.
\n", + "* Column “File_Name”: entries were derived from the event number.\n", + "* Column “LOC:LATITUDE”: latitude was provided and reformatted to “XX XX.XXXX N !(deg min)”.\n", + "* Column “LOC:LONGITUDE”: longitude was provided and reformatted to “XX XX.XXXX W !(deg min)”.\n", + "* Column “LOC: Event Number”: entries were event numbers. \n", + "* Column “LOC: STATION”: entries were taken from the Log file.
\n", + "\n", + "A 6-line header was inserted using python function ADD_6LINEHDR_2().

\n", + "A Metadata Dictionary was created to hold information for the header files **2024-017_METADATA.csv**. Python function CREATE_METADATA_DICT() was used to add addtional metadata to this csv file and it was saved as **2024-017_METADATA_filled.csv**. Additional information is stored in the python function for later use in the creation of header files.

\n", + "The sampling site was mapped (Figure 1) using from **2024-017_header-merge.csv** using python function PLOT_TRACK_LOCATION() to check the location of all casts.
\n", + "The presence of zero-order holds were checked using Python function PLOT_PRESSURE_DIFF(). Zero-order holds were found (Figure 2.) and confirmed with python function CHECK_FOR_ZOH.py().

\n", + "Profiles were checked using function CHECK_PROFILES(). A few Spikes were found in Fluorescence but were not related to gain changes and most were within reasonable limits. There was a significate spike in cast 52 and despiking was applied while corrections were made to the zero order holds and the spikes in corrections by re-running READ_RSK() and adding corrections rsk.correcthold() and rsk.despike(). from the pyRSKtools package.

\n", + "After the corrections were made, a new csv file was created **2024-017_CSV_DATA-6Linedr_corr_hold_spk.csv** and the corrected values were checked in python function Plot_Pressure_Diff(). Zero-order holds were found to be removed (Figure 3.).
\n", + "
\n", + "Cast variables were created from the output csv so they could be used in further processing using python function CREATE_CAST_VARIABLES(). A plotting templates were also created using functions FORMAT_PROCESSING_PLOT() and DO_TS_PLOT(). Pre-processing plots were examined with python function FIRST_PLOTS.py()
\n", + "
\n", + "Raw data were plotted and examined:
\n", + "* Salinity looks good with some noisy data during the soak for many casts.\n", + "* Temperature looks good with bad data the surface of many casts and the bottom of cast 43.\n", + "* Conductivity looks good with some noisy data during the soak for many casts.\n", + "* Oxygen looks good with some bad data at the surface of many casts.\n", + "* Fluorescence looks good with some spikes in the downcast of many casts.
\n", + "\n", + "**Data processing**\n", + "* Correction to Pressure: there were no negative pressures found at the surface so pressure was not calibrated in in python funcion CALIB.py() .
\n", + "* All cast times matched the Log so there were no corrections made in CORRECT_TIME_OFFSET.py(). \n", + "* CLIP: Pressure is steady for a variable number of scans. Records were removed from the beginning and end of the cast using CLIP_CAST.py().
\n", + "* Profile plots were examined after CLIP. \n", + "* SHIFT: Based on suggested values in document “Guidelines for processing RBR CTD profiles”, the alignment of temperature and conductivity was
\n", + "corrected by applying a shift of -2 scans in conductivity using SHIFT_CONDUCTIVITY.py().
\n", + "* SHIFT: Better alignment with Oxygen profiles was found by advancing it by 11 scans using SHIFT_OXYGEN. The advice given in document “Guidelines for processing
\n", + "RBR CTD Profiles” was that an advance between 2 and 3 seconds is appropriate. T-O plots before and after alignment were compared.
\n", + "* Convert Oxygen: Oxygen saturation was converted to Oxygen concentration in umol/kg and mL/L using python function DERIVE_OXYGEN_CONCENTRATION.py()
\n", + "* DELETE: Pressure reversals and swells were detected and delted using python function DELETE_PRESSURE_REVERSALS.py(). Plots were examined before
and after delete to confirm that reasonable values were shown.
\n", + "* Despiking: No date despiking took place on Fluorescence.
\n", + "\n", + "**Final Checks and header editing**\n", + "* Time, Date, Cast_direction, and Event_number were removed from the channels using *2024-017_vars_to_drop.csv* and python function
\n", + "DROP_SELECT_VARS.py()
\n", + "* Python function BINAVE.py() was used to metre-average the data.
\n", + "* FINAL_EDIT.py() was used to calibrate conductivity unist to S/m, edit header information, and reorder the channels. \n", + "* Processed data was examined after in had been plotted using function PLOT_PROCESSED.py(). \n", + "\n", + "**Write IOS Header Files**\n", + "* Python function WRITE_FILE.py() was used to write the final files in IOS Header format.
" + ] + }, + { + "cell_type": "markdown", + "id": "734180bf-6ed9-4847-9cb8-1e39f8c825ba", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Set the parameters for this cruise**" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "456e5070-ca77-40f1-942e-8f7535e03053", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "year = \"2024\"\n", + "cruise_number = \"017\"\n", + "#dest_dir = f\"C:\\\\Users\\\\huntingtons\\\\Desktop\\\\RBR_Processing\\\\CURRENT_PROCESSING\\\\{year}-{cruise_number}\\\\Suggested\\\\\"\n", + "dest_dir = \"C:\\\\Users\\\\huntingtons\\\\\\Desktop\\\\RBR_Processing\\\\Github_June2024_test\\\\\"\n", + "skipcasts = 0\n", + "rsk_start_end_times_file = None\n", + "rsk_time1, rsk_time2 = [None, None]\n", + "rsk_file = dest_dir + \"232531_20240206_1745.rsk\" # \"232531_20240223_1125.rsk\"]\n", + "sample_rate = 8\n", + "left_lon, right_lon, bot_lat, top_lat = [None, None, None, None]\n", + "start_time_correction_file = None\n", + "verbose = True\n", + "shift_recs_conductivity: int = 2\n", + "shift_recs_oxygen = -11 \n", + "drop_vars_file = \"2024_017_vars_to_drop.csv\"\n", + "processing_report_name = f\"{year}-{cruise_number}_RBR_Processing_Report.docx\"\n", + "# 5 lines of processing comments are added here and included in the write_comments function. If more lines are needed, adjust the function. \n", + "processing_comments1 = \" \" + \"Cast 18 stopped at 20m and was brought to the surface and re-started.\" \n", + "processing_comments2 = None # format is \" \" + \"Your text here\"\n", + "processing_comments3 = None\n", + "processing_comments4 = None\n", + "processing_comments5 = None" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "a9c73041-2695-46af-b2cc-1ddb1a9d5248", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "#import cartopy.crs as ccrs\n", + "#from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter, LatitudeLocator\n", + "import sys\n", + "import os\n", + "import pyrsktools\n", + "import numpy as np\n", + "import pandas as pd\n", + "from mpl_toolkits.basemap import Basemap\n", + "from copy import deepcopy # copy,\n", + "from scipy import signal\n", + "import gsw\n", + "from matplotlib import pyplot as plt\n", + "from datetime import datetime\n", + "import random\n", + "from o2conversion import O2stoO2c\n", + "from seawater import eos80\n", + "import shutil\n", + "import pandoc" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "253847d6-40bc-4206-86ec-0fc66cf9771a", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "# Set Global variables\n", + "VARIABLES_POSSIBLE = [\n", + " \"Salinity\",\n", + " \"Temperature\",\n", + " \"Conductivity\",\n", + " \"Oxygen\",\n", + " \"Fluorescence\",\n", + " \"Oxygen_mL_L\",\n", + " \"Oxygen_umol_kg\",\n", + "]\n", + "VARIABLE_UNITS = [\"PSS-78\", \"C\", \"mS/cm\", \"%\", \"ug/L\", \"mL/L\", \"umol/kg\"]\n", + "VARIABLE_COLOURS = [\"b\", \"r\", \"goldenrod\", \"grey\", \"g\", \"grey\", \"grey\"]" + ] + }, + { + "cell_type": "markdown", + "id": "5f18a366-372f-442d-88f1-7917e010cf21", + "metadata": {}, + "source": [ + "**Read the rsk file**
\n", + "Inputs
\n", + "*dest_dir
\n", + "*year
\n", + "*cruise_number
\n", + "*skipcasts
\n", + "*rsk_time1, rsk_time2
\n", + "*zoh, fix_spk
\n", + "
\n", + "This function reads in the rsk file and takes the cast numbers from the header merge csv file and outputs a \n", + "In this first instance no corrections will be made to the rsk data." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "daf2304f-b18a-439a-8a46-d4083dbbfa22", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "232531_20240206_1745.rsk\n", + "no corrections being made\n", + "Using original values\n" + ] + }, + { + "data": { + "text/plain": [ + "'_CTD_DATA-6linehdr.csv'" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from RBR_CTD_IOS_2024 import READ_RSK\n", + "READ_RSK(dest_dir=dest_dir, year=year, cruise_number=cruise_number, skipcasts=skipcasts, zoh=False, fix_spk=False, rsk_start_end_times_file=None, rsk_time1=None, rsk_time2=None)" + ] + }, + { + "cell_type": "markdown", + "id": "ad8595e3-0e62-4a83-a3c2-2b1ec4e90aad", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Merge the files**
\n", + "
\n", + "Merge all the profile csv files into one data file" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "b9d5f0c4-f15b-4739-bdf2-a223da42c232", + "metadata": {}, + "outputs": [], + "source": [ + "from RBR_CTD_IOS_2024 import MERGE_FILES\n", + "MERGE_FILES(dest_dir=dest_dir, year=year, cruise_number=cruise_number)" + ] + }, + { + "cell_type": "markdown", + "id": "a0d543d9-5f89-4931-a372-d84d43cd505d", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Create Metadata Dictionary**
\n", + "Read in a csv file and then populate it with more information from the rsk file.
\n", + "This function outputs a new csv file while also creating a dictionary for use in functions further in the process." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "e3e81532-cb86-4f2b-adec-4d6036991bfe", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'Processing_Start_time': datetime.datetime(2024, 6, 27, 16, 8, 45, 404924),\n", + " 'Instrument_information': Instrument(instrumentID=1, serialID=232531, model='RBRmaestro³', firmwareVersion='1.149', firmwareType=104, partNumber='L3-M11-F13-SEC11-BEC12-INT11-G2-SCT12-SP11-SDOX113-SFL13-STU12'),\n", + " 'Sampling_Interval': '0.125',\n", + " 'RSK_filename': array(['232531_20240206_1745.rsk'], dtype=object),\n", + " 'Channels': ['conductivity',\n", + " 'temperature',\n", + " 'pressure',\n", + " 'chlorophyll_a',\n", + " 'temperature1',\n", + " 'dissolved_o2_saturation',\n", + " 'turbidity',\n", + " 'sea_pressure',\n", + " 'salinity',\n", + " 'depth'],\n", + " 'Channel_details': [Channel(channelID=1, shortName='cond19', longName='conductivity', unitsPlainText='mS/cm', isMeasured=1, isDerived=0, units='mS/cm', label='conductivity_00', feModuleType='FE-cond3-cond', feModuleVersion=6.041, _dbName='Conductivity'),\n", + " Channel(channelID=2, shortName='temp14', longName='temperature', unitsPlainText='Degrees_C', isMeasured=1, isDerived=0, units='°C', label='temperature_00', feModuleType='CPU-temp', feModuleVersion=1.149, _dbName='Temperature'),\n", + " Channel(channelID=3, shortName='pres24', longName='pressure', unitsPlainText='dbar', isMeasured=1, isDerived=0, units='dbar', label='pressure_00', feModuleType='CPU-pres', feModuleVersion=1.149, _dbName='Pressure'),\n", + " Channel(channelID=4, shortName='fluo10', longName='chlorophyll_a', unitsPlainText='ug/l', isMeasured=1, isDerived=0, units='µg/l', label='chlorophyll_00', feModuleType='FE-v2-ch00', feModuleVersion=10.041, _dbName='Chlorophyll a'),\n", + " Channel(channelID=5, shortName='temp01', longName='temperature1', unitsPlainText='Degrees_C', isMeasured=1, isDerived=0, units='°C', label='rinkotemperature_00', feModuleType='FE-v2-ch00', feModuleVersion=10.041, _dbName='Temperature'),\n", + " Channel(channelID=6, shortName='doxy32', longName='dissolved_o2_saturation', unitsPlainText='%', isMeasured=1, isDerived=0, units='%', label='oxygensaturation_00', feModuleType='FE-v2-ch01', feModuleVersion=10.041, _dbName='Dissolved O₂ saturation'),\n", + " Channel(channelID=7, shortName='turb00', longName='turbidity', unitsPlainText='NTU', isMeasured=1, isDerived=0, units='NTU', label='turbidity_00', feModuleType='FE-v2-ch01', feModuleVersion=10.041, _dbName='Turbidity'),\n", + " Channel(channelID=8, shortName='pres08', longName='sea_pressure', unitsPlainText=None, isMeasured=None, isDerived=None, units='dbar', label='', feModuleType='', feModuleVersion=0, _dbName='Sea pressure'),\n", + " Channel(channelID=9, shortName='sal_00', longName='salinity', unitsPlainText=None, isMeasured=None, isDerived=None, units='PSU', label='', feModuleType='', feModuleVersion=0, _dbName='Salinity'),\n", + " Channel(channelID=10, shortName='dpth01', longName='depth', unitsPlainText=None, isMeasured=None, isDerived=None, units='m', label='', feModuleType='', feModuleVersion=0, _dbName='Depth')],\n", + " 'Number_of_channels': 10,\n", + " 'Location': File_Name LOC:LATITUDE LOC:LONGITUDE \\\n", + " 0 2024-017-0001 49 30.1560 N ! (deg min) 126 17.5620 W ! (deg min) \n", + " 1 2024-017-0002 49 29.2560 N ! (deg min) 126 17.0940 W ! (deg min) \n", + " 2 2024-017-0003 49 28.2180 N ! (deg min) 126 16.5180 W ! (deg min) \n", + " 3 2024-017-0004 49 26.2500 N ! (deg min) 126 15.5580 W ! (deg min) \n", + " 4 2024-017-0005 49 25.6020 N ! (deg min) 126 14.6040 W ! (deg min) \n", + " 5 2024-017-0007 49 23.9760 N ! (deg min) 126 14.6160 W ! (deg min) \n", + " 6 2024-017-0008 49 23.9100 N ! (deg min) 126 12.9360 W ! (deg min) \n", + " 7 2024-017-0009 49 23.3640 N ! (deg min) 126 11.1420 W ! (deg min) \n", + " 8 2024-017-0010 49 23.6340 N ! (deg min) 126 9.7440 W ! (deg min) \n", + " 9 2024-017-0011 49 24.0360 N ! (deg min) 126 8.1840 W ! (deg min) \n", + " 10 2024-017-0012 49 24.7980 N ! (deg min) 126 7.7940 W ! (deg min) \n", + " 11 2024-017-0013 49 25.4280 N ! (deg min) 126 6.4740 W ! (deg min) \n", + " 12 2024-017-0014 49 25.5060 N ! (deg min) 126 5.0880 W ! (deg min) \n", + " 13 2024-017-0015 49 25.6620 N ! (deg min) 126 3.2520 W ! (deg min) \n", + " 14 2024-017-0016 49 26.3940 N ! (deg min) 126 2.7600 W ! (deg min) \n", + " 15 2024-017-0017 49 22.8120 N ! (deg min) 126 5.1300 W ! (deg min) \n", + " 16 2024-017-0018 49 20.2200 N ! (deg min) 126 4.0920 W ! (deg min) \n", + " 17 2024-017-0018 49 20.2200 N ! (deg min) 126 4.0920 W ! (deg min) \n", + " 18 2024-017-0019 49 17.7300 N ! (deg min) 126 2.1180 W ! (deg min) \n", + " 19 2024-017-0020 49 15.6120 N ! (deg min) 126 2.2800 W ! (deg min) \n", + " 20 2024-017-0021 49 14.1780 N ! (deg min) 126 1.9320 W ! (deg min) \n", + " 21 2024-017-0022 49 7.0380 N ! (deg min) 125 54.8760 W ! (deg min) \n", + " 22 2024-017-0023 49 9.0780 N ! (deg min) 125 54.9300 W ! (deg min) \n", + " 23 2024-017-0024 49 24.5340 N ! (deg min) 125 54.4140 W ! (deg min) \n", + " 24 2024-017-0025 49 23.5500 N ! (deg min) 125 56.3160 W ! (deg min) \n", + " 25 2024-017-0026 49 21.6600 N ! (deg min) 125 56.7000 W ! (deg min) \n", + " 26 2024-017-0027 49 19.6920 N ! (deg min) 125 58.6620 W ! (deg min) \n", + " 27 2024-017-0029 49 18.7740 N ! (deg min) 126 0.7200 W ! (deg min) \n", + " 28 2024-017-0030 49 17.7420 N ! (deg min) 126 2.1300 W ! (deg min) \n", + " 29 2024-017-0031 49 14.1360 N ! (deg min) 125 56.4420 W ! (deg min) \n", + " 30 2024-017-0032 49 14.9700 N ! (deg min) 125 52.5360 W ! (deg min) \n", + " 31 2024-017-0033 49 21.1440 N ! (deg min) 125 47.3280 W ! (deg min) \n", + " 32 2024-017-0034 49 20.1420 N ! (deg min) 125 48.2820 W ! (deg min) \n", + " 33 2024-017-0035 49 17.8620 N ! (deg min) 125 48.6540 W ! (deg min) \n", + " 34 2024-017-0037 49 16.2000 N ! (deg min) 125 49.2900 W ! (deg min) \n", + " 35 2024-017-0038 49 14.2680 N ! (deg min) 125 45.4560 W ! (deg min) \n", + " 36 2024-017-0040 49 11.1420 N ! (deg min) 125 45.7680 W ! (deg min) \n", + " 37 2024-017-0041 49 8.0820 N ! (deg min) 125 42.9960 W ! (deg min) \n", + " 38 2024-017-0042 49 7.5480 N ! (deg min) 125 45.8460 W ! (deg min) \n", + " 39 2024-017-0043 49 7.1580 N ! (deg min) 125 47.8320 W ! (deg min) \n", + " 40 2024-017-0044 49 7.7640 N ! (deg min) 125 50.7540 W ! (deg min) \n", + " 41 2024-017-0045 49 8.4960 N ! (deg min) 125 52.5480 W ! (deg min) \n", + " 42 2024-017-0046 49 13.6680 N ! (deg min) 125 35.8860 W ! (deg min) \n", + " 43 2024-017-0047 49 12.5160 N ! (deg min) 125 36.6180 W ! (deg min) \n", + " 44 2024-017-0048 49 11.7420 N ! (deg min) 125 38.9340 W ! (deg min) \n", + " 45 2024-017-0050 49 10.9080 N ! (deg min) 125 38.8560 W ! (deg min) \n", + " 46 2024-017-0051 49 9.6780 N ! (deg min) 125 39.8820 W ! (deg min) \n", + " 47 2024-017-0052 49 11.7840 N ! (deg min) 125 40.4820 W ! (deg min) \n", + " 48 2024-017-0053 49 9.9240 N ! (deg min) 125 41.4180 W ! (deg min) \n", + " 49 2024-017-0054 49 9.0480 N ! (deg min) 125 41.5800 W ! (deg min) \n", + " 50 2024-017-0055 49 8.0640 N ! (deg min) 125 42.9840 W ! (deg min) \n", + " 51 2024-017-0056 49 7.5420 N ! (deg min) 125 45.8520 W ! (deg min) \n", + " \n", + " LOC:Event Number LOC:STATION LOC:WATER DEPTH \\\n", + " 0 1 Sydney head 77 \n", + " 1 2 Sydney 1 106 \n", + " 2 3 Sydney 2 126 \n", + " 3 4 Sydney 3 70 \n", + " 4 5 Sydney 4 63 \n", + " 5 7 Sydney shelter confluence 61 \n", + " 6 8 Shelter mouth 66 \n", + " 7 9 Shelter 6 74 \n", + " 8 10 Shelter 5 91 \n", + " 9 11 Shelter Millar confluence 120 \n", + " 10 12 Shelter 4 164 \n", + " 11 13 Shelter 3 149 \n", + " 12 14 Shelter 2 147 \n", + " 13 15 Shelter 1 122 \n", + " 14 16 Shelter head 89 \n", + " 15 17 Millar Channel North 148 \n", + " 16 918 dummy dummy \n", + " 17 18 Millar Channel South 95 \n", + " 18 19 Herbert Mouth South 45 \n", + " 19 20 Herbert sill 4 \n", + " 20 21 Herbert Russell channel 11.5 \n", + " 21 22 Tofino offshore 10 \n", + " 22 23 Tofino mouth Templar channel 24 \n", + " 23 24 Herbert head 105 \n", + " 24 25 Herbert 1 124 \n", + " 25 26 Herbert 2 136 \n", + " 26 27 Herbert 3 127 \n", + " 27 29 Herbert Mouth 114 \n", + " 28 30 Herbert Mouth South 46 \n", + " 29 31 Hecate bay 22 \n", + " 30 32 Cypress bay 46 \n", + " 31 33 Bedwell head 71 \n", + " 32 34 Bedwell 1 66 \n", + " 33 35 Bedwell 2 54 \n", + " 34 37 Bedwell mouth 55 \n", + " 35 38 Warn bay 137 \n", + " 36 40 Fortune channel 74 \n", + " 37 41 Tofino 6 54 \n", + " 38 42 Tofino 7 40 \n", + " 39 43 Tofino Browning passage 1 39 \n", + " 40 44 Tofino Browning passage 2 15 \n", + " 41 45 Tofino Browning passage 3 11 \n", + " 42 46 Tofino head 1 44 \n", + " 43 47 Tofino 1 89 \n", + " 44 48 Tofino 2 116 \n", + " 45 50 Tofino 3 102 \n", + " 46 51 Tofino 4 78 \n", + " 47 52 Tranquil head 46 \n", + " 48 53 Tranquil mouth 65 \n", + " 49 54 Tofino 5 62 \n", + " 50 55 Tofino 6 54 \n", + " 51 56 Tofino 7 41 \n", + " \n", + " ADM:MISSION ADM:AGENCY ADM:COUNTRY \\\n", + " 0 2024-017 IOS Canada \n", + " 1 2024-017 IOS Canada \n", + " 2 2024-017 IOS Canada \n", + " 3 2024-017 IOS Canada \n", + " 4 2024-017 IOS Canada \n", + " 5 2024-017 IOS Canada \n", + " 6 2024-017 IOS Canada \n", + " 7 2024-017 IOS Canada \n", + " 8 2024-017 IOS Canada \n", + " 9 2024-017 IOS Canada \n", + " 10 2024-017 IOS Canada \n", + " 11 2024-017 IOS Canada \n", + " 12 2024-017 IOS Canada \n", + " 13 2024-017 IOS Canada \n", + " 14 2024-017 IOS Canada \n", + " 15 2024-017 IOS Canada \n", + " 16 dummy dummy dummy \n", + " 17 2024-017 IOS Canada \n", + " 18 2024-017 IOS Canada \n", + " 19 2024-017 IOS Canada \n", + " 20 2024-017 IOS Canada \n", + " 21 2024-017 IOS Canada \n", + " 22 2024-017 IOS Canada \n", + " 23 2024-017 IOS Canada \n", + " 24 2024-017 IOS Canada \n", + " 25 2024-017 IOS Canada \n", + " 26 2024-017 IOS Canada \n", + " 27 2024-017 IOS Canada \n", + " 28 2024-017 IOS Canada \n", + " 29 2024-017 IOS Canada \n", + " 30 2024-017 IOS Canada \n", + " 31 2024-017 IOS Canada \n", + " 32 2024-017 IOS Canada \n", + " 33 2024-017 IOS Canada \n", + " 34 2024-017 IOS Canada \n", + " 35 2024-017 IOS Canada \n", + " 36 2024-017 IOS Canada \n", + " 37 2024-017 IOS Canada \n", + " 38 2024-017 IOS Canada \n", + " 39 2024-017 IOS Canada \n", + " 40 2024-017 IOS Canada \n", + " 41 2024-017 IOS Canada \n", + " 42 2024-017 IOS Canada \n", + " 43 2024-017 IOS Canada \n", + " 44 2024-017 IOS Canada \n", + " 45 2024-017 IOS Canada \n", + " 46 2024-017 IOS Canada \n", + " 47 2024-017 IOS Canada \n", + " 48 2024-017 IOS Canada \n", + " 49 2024-017 IOS Canada \n", + " 50 2024-017 IOS Canada \n", + " 51 2024-017 IOS Canada \n", + " \n", + " ADM:Project ADM:SCIENTIST ADM:PLATFORM \\\n", + " 0 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 1 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 2 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 3 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 4 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 5 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 6 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 7 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 8 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 9 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 10 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 11 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 12 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 13 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 14 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 15 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 16 dummy dummy dummy \n", + " 17 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 18 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 19 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 20 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 21 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 22 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 23 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 24 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 25 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 26 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 27 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 28 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 29 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 30 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 31 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 32 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 33 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 34 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 35 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 36 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 37 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 38 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 39 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 40 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 41 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 42 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 43 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 44 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 45 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 46 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 47 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 48 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 49 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 50 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 51 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " \n", + " FIL:TIME INCREMENT FIL:DATA DESCRIPTION FIL:FILE TYPE \\\n", + " 0 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 1 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 2 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 3 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 4 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 5 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 6 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 7 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 8 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 9 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 10 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 11 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 12 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 13 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 14 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 15 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 16 dummy dummy dummy \n", + " 17 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 18 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 19 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 20 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 21 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 22 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 23 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 24 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 25 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 26 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 27 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 28 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 29 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 30 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 31 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 32 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 33 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 34 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 35 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 36 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 37 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 38 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 39 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 40 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 41 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 42 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 43 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 44 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 45 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 46 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 47 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 48 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 49 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 50 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 51 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " \n", + " INS:MODEL INS:SERIAL NUMBER INS:DATA DESCRIPTION INS:INSTRUMENT TYPE \\\n", + " 0 Maestro 232531 CTD RBR CTD \n", + " 1 Maestro 232531 CTD RBR CTD \n", + " 2 Maestro 232531 CTD RBR CTD \n", + " 3 Maestro 232531 CTD RBR CTD \n", + " 4 Maestro 232531 CTD RBR CTD \n", + " 5 Maestro 232531 CTD RBR CTD \n", + " 6 Maestro 232531 CTD RBR CTD \n", + " 7 Maestro 232531 CTD RBR CTD \n", + " 8 Maestro 232531 CTD RBR CTD \n", + " 9 Maestro 232531 CTD RBR CTD \n", + " 10 Maestro 232531 CTD RBR CTD \n", + " 11 Maestro 232531 CTD RBR CTD \n", + " 12 Maestro 232531 CTD RBR CTD \n", + " 13 Maestro 232531 CTD RBR CTD \n", + " 14 Maestro 232531 CTD RBR CTD \n", + " 15 Maestro 232531 CTD RBR CTD \n", + " 16 dummy dummy dummy dummy \n", + " 17 Maestro 232531 CTD RBR CTD \n", + " 18 Maestro 232531 CTD RBR CTD \n", + " 19 Maestro 232531 CTD RBR CTD \n", + " 20 Maestro 232531 CTD RBR CTD \n", + " 21 Maestro 232531 CTD RBR CTD \n", + " 22 Maestro 232531 CTD RBR CTD \n", + " 23 Maestro 232531 CTD RBR CTD \n", + " 24 Maestro 232531 CTD RBR CTD \n", + " 25 Maestro 232531 CTD RBR CTD \n", + " 26 Maestro 232531 CTD RBR CTD \n", + " 27 Maestro 232531 CTD RBR CTD \n", + " 28 Maestro 232531 CTD RBR CTD \n", + " 29 Maestro 232531 CTD RBR CTD \n", + " 30 Maestro 232531 CTD RBR CTD \n", + " 31 Maestro 232531 CTD RBR CTD \n", + " 32 Maestro 232531 CTD RBR CTD \n", + " 33 Maestro 232531 CTD RBR CTD \n", + " 34 Maestro 232531 CTD RBR CTD \n", + " 35 Maestro 232531 CTD RBR CTD \n", + " 36 Maestro 232531 CTD RBR CTD \n", + " 37 Maestro 232531 CTD RBR CTD \n", + " 38 Maestro 232531 CTD RBR CTD \n", + " 39 Maestro 232531 CTD RBR CTD \n", + " 40 Maestro 232531 CTD RBR CTD \n", + " 41 Maestro 232531 CTD RBR CTD \n", + " 42 Maestro 232531 CTD RBR CTD \n", + " 43 Maestro 232531 CTD RBR CTD \n", + " 44 Maestro 232531 CTD RBR CTD \n", + " 45 Maestro 232531 CTD RBR CTD \n", + " 46 Maestro 232531 CTD RBR CTD \n", + " 47 Maestro 232531 CTD RBR CTD \n", + " 48 Maestro 232531 CTD RBR CTD \n", + " 49 Maestro 232531 CTD RBR CTD \n", + " 50 Maestro 232531 CTD RBR CTD \n", + " 51 Maestro 232531 CTD RBR CTD \n", + " \n", + " COM: \n", + " 0 232531_20240206_1745.rsk \n", + " 1 NaN \n", + " 2 NaN \n", + " 3 NaN \n", + " 4 NaN \n", + " 5 NaN \n", + " 6 NaN \n", + " 7 NaN \n", + " 8 NaN \n", + " 9 NaN \n", + " 10 NaN \n", + " 11 NaN \n", + " 12 NaN \n", + " 13 NaN \n", + " 14 NaN \n", + " 15 NaN \n", + " 16 NaN \n", + " 17 NaN \n", + " 18 NaN \n", + " 19 NaN \n", + " 20 NaN \n", + " 21 NaN \n", + " 22 NaN \n", + " 23 NaN \n", + " 24 NaN \n", + " 25 NaN \n", + " 26 NaN \n", + " 27 NaN \n", + " 28 NaN \n", + " 29 NaN \n", + " 30 NaN \n", + " 31 NaN \n", + " 32 NaN \n", + " 33 NaN \n", + " 34 NaN \n", + " 35 NaN \n", + " 36 NaN \n", + " 37 NaN \n", + " 38 NaN \n", + " 39 NaN \n", + " 40 NaN \n", + " 41 NaN \n", + " 42 NaN \n", + " 43 NaN \n", + " 44 NaN \n", + " 45 NaN \n", + " 46 NaN \n", + " 47 NaN \n", + " 48 NaN \n", + " 49 NaN \n", + " 50 NaN \n", + " 51 NaN ,\n", + " 'number_of_profiles': '51',\n", + " 'Data_description': 'CTD',\n", + " 'Final_file_type': 'ASCII',\n", + " 'Mission': '2024-017',\n", + " 'Agency': 'IOS',\n", + " 'Country': 'Canada',\n", + " 'Project': 'Clayoquot Weather Station Network - ACRDP',\n", + " 'Scientist': 'Cooper G.',\n", + " 'Platform': 'Doug Anderson',\n", + " 'Instrument_Model': 'RBRMaestro',\n", + " 'Serial_number': '232531',\n", + " 'Instrument_type': 'RBR CTD'}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from RBR_CTD_IOS_2024 import CREATE_META_DICT\n", + "CREATE_META_DICT(dest_dir, rsk_file, year, cruise_number, rsk_time1, rsk_time2)" + ] + }, + { + "cell_type": "markdown", + "id": "9d8d9f49-e3b9-48be-b78e-e006df4e87de", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**ADD 6LINEHEADER**" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "1c98ed1b-553a-472a-ad28-1c2635c96a8c", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "def ADD_6LINEHEADER(output_ext):\n", + " # Add six-line header to the .csv file.\n", + " # This file could be used for data processing via IOSShell\n", + " input_name = str(year) + \"-\" + str(cruise_number) + \"_CTD_DATA.csv\"\n", + " output_name = str(year) + \"-\" + str(cruise_number) + output_ext\n", + " input_filename = os.path.join(dest_dir, input_name)\n", + " ctd_data = pd.read_csv(input_filename, header=0)\n", + " \n", + " ctd_data[\"Time(yyyy-mm-dd HH:MM:ss.FFF)\"] = ctd_data[\n", + " \"Time(yyyy-mm-dd HH:MM:ss.FFF)\"\n", + " ].str[:19]\n", + " ctd_data[\"Date\"] = pd.to_datetime(\n", + " ctd_data[\"Time(yyyy-mm-dd HH:MM:ss.FFF)\"]) # add new column of Date\n", + " ctd_data[\"Date\"] = [d.date() for d in ctd_data[\"Date\"]]\n", + " ctd_data[\"TIME:UTC\"] = pd.to_datetime(ctd_data[\"Time(yyyy-mm-dd HH:MM:ss.FFF)\"]) # add new column of time\n", + " ctd_data[\"TIME:UTC\"] = [d.time() for d in ctd_data[\"TIME:UTC\"]]\n", + " ctd_data[\"Date\"] = pd.to_datetime(ctd_data[\"Date\"], format=\"%Y-%m-%d\").dt.strftime(\n", + " \"%d/%m/%Y\")\n", + " \n", + " # Rules to replace list of columns to drop; may not be full-proof\n", + " is_temperature_secondary = (\n", + " lambda name: \"temperature\" in name.lower() and \"1\" in name\n", + " )\n", + " is_speedofsound = lambda name: \"speed\" in name.lower() and \"sound\" in name.lower()\n", + " is_specificconductivity = (\n", + " lambda name: \"specific\" in name.lower() and \"conductivity\" in name.lower()\n", + " )\n", + " is_densityanomaly = (\n", + " lambda name: \"density\" in name.lower() and \"anomaly\" in name.lower()\n", + " )\n", + " is_dissolvedO2concentration = (\n", + " lambda name: \"dissolved\" in name.lower()\n", + " and \"O\" in name\n", + " and \"concentration\" in name.lower()\n", + " )\n", + " is_turbidity = lambda name: \"turbidity\" in name.lower()\n", + " \n", + " drop_list = [\"Time(yyyy-mm-dd HH:MM:ss.FFF)\", \"Unnamed: 0\"]\n", + " for col in ctd_data.columns:\n", + " if any(\n", + " [\n", + " is_temperature_secondary(col),\n", + " is_speedofsound(col),\n", + " is_specificconductivity(col),\n", + " is_densityanomaly(col),\n", + " is_dissolvedO2concentration(col),\n", + " is_turbidity(col),\n", + " ]\n", + " ):\n", + " drop_list.append(col)\n", + " \n", + " # Drop first indexing row and Time(HH....) plus everything else in drop_list if present\n", + " # Ignore KeyError if columns in drop_list do not exist in the dataframe\n", + " ctd_data.drop(columns=drop_list, inplace=True, errors=\"ignore\")\n", + " # ctd_data.reset_index(drop=True, inplace=True)\n", + " \n", + " col_list = ctd_data.columns.tolist()\n", + " #print(col_list)\n", + " \n", + " # set empty column names\n", + " column_names = {\n", + " old: new for old, new in zip(col_list, np.arange(len(ctd_data.columns)))\n", + " }\n", + " ctd_data.rename(columns=column_names, inplace=True) # remove column names\n", + " \n", + " # append header information into the empty lists\n", + " channel_list = [\"Y\", \"Y\", \"N\", \"Y\", \"Y\", \"Y\", \"Y\", \"Y\", \"N\", \"Y\", \"Y\", \"Y\"]\n", + " index_list = [\n", + " \"Conductivity\",\n", + " \"Temperature\",\n", + " \"Pressure_Air\",\n", + " \"Fluorescence\",\n", + " \"Oxygen:Dissolved:Saturation\",\n", + " \"Pressure\",\n", + " \"Depth\",\n", + " \"Salinity:CTD\",\n", + " \"Cast_direction\",\n", + " \"Event_number\",\n", + " \"Date\",\n", + " \"TIME:UTC\",\n", + " ]\n", + " unit_list = [\n", + " \"mS/cm\",\n", + " \"deg C(ITS90)\",\n", + " \"decibar\",\n", + " \"mg/m^3\",\n", + " \"%\",\n", + " \"decibar\",\n", + " \"meters\",\n", + " \"PSS-78\",\n", + " \"n/a\",\n", + " \"n/a\",\n", + " \"n/a\",\n", + " \"n/a\",\n", + " ]\n", + " input_format_list = [\n", + " \"R4\",\n", + " \"R4\",\n", + " \"R4\",\n", + " \"R4\",\n", + " \"R4\",\n", + " \"R4\",\n", + " \"R4\",\n", + " \"R4\",\n", + " \" \",\n", + " \"I4\",\n", + " \"D:dd/mm/YYYY\",\n", + " \"T:HH:MM:SS\",\n", + " ]\n", + " output_format_list = [\n", + " \"R4:F11.4\",\n", + " \"R4:F9.4\",\n", + " \"R4:F7.1\",\n", + " \"R4:F8.3\",\n", + " \"R4:F11.4\",\n", + " \"R4:F7.1\",\n", + " \"R4:F7.1\",\n", + " \"R4:F9.4\",\n", + " \" \",\n", + " \"I:I4\",\n", + " \"D:YYYY/mm/dd\",\n", + " \"T:HH:MM:SS\",\n", + " ]\n", + " na_value_list = [\n", + " \"-99\",\n", + " \"-99\",\n", + " \"-99\",\n", + " \"-99\",\n", + " \"-99\",\n", + " \"-99\",\n", + " \"-99\",\n", + " \"-99\",\n", + " \"\",\n", + " \"-99\",\n", + " \"\",\n", + " \"\",\n", + " ]\n", + " \n", + " is_conductivity = lambda name: \"conductivity\" in name.lower()\n", + " is_temperature_primary = lambda name: \"temperature\" in name.lower()\n", + " is_pressure = lambda name: \"pressure\" in name.lower() and \"sea\" not in name.lower()\n", + " is_chlorophyll = lambda name: \"chlorophyll\" in name.lower()\n", + " is_O2saturation = (\n", + " lambda name: \"saturation\" in name.lower()\n", + " and \"o\" in name.replace(\"saturation\", \"\").lower()\n", + " )\n", + " is_seapressure = lambda name: \"pressure\" in name.lower() and \"sea\" in name.lower()\n", + " is_depth = lambda name: \"depth\" in name.lower()\n", + " is_salinity = lambda name: \"salinity\" in name.lower()\n", + " is_castdirection = lambda name: name == \"Cast_direction\"\n", + " is_event = lambda name: name == \"Event\"\n", + " is_date = lambda name: name == \"Date\"\n", + " is_time = lambda name: name == \"TIME:UTC\"\n", + " \n", + " is_channel_functions = [\n", + " is_conductivity,\n", + " is_temperature_primary,\n", + " is_pressure,\n", + " is_chlorophyll,\n", + " is_O2saturation,\n", + " is_seapressure,\n", + " is_depth,\n", + " is_salinity,\n", + " is_castdirection,\n", + " is_event,\n", + " is_date,\n", + " is_time,\n", + " ]\n", + " \n", + " # Create empty lists to add information of available channels to\n", + " channel = []\n", + " index = []\n", + " unit = []\n", + " input_format = []\n", + " output_format = []\n", + " na_value = []\n", + " \n", + " for col in col_list:\n", + " for i in range(len(channel_list)):\n", + " if is_channel_functions[i](col):\n", + " channel.append(channel_list[i]), index.append(\n", + " index_list[i]\n", + " ), unit.append(unit_list[i]), input_format.append(\n", + " input_format_list[i]\n", + " ), output_format.append(\n", + " output_format_list[i]\n", + " ), na_value.append(\n", + " na_value_list[i]\n", + " )\n", + " \n", + " header = pd.DataFrame([channel, index, unit, input_format, output_format, na_value])\n", + " \n", + " # If plan shapes not aligned error, then may need to add another variable to channel_spellings\n", + " try:\n", + " ctd_data_header = pd.concat((header, ctd_data))\n", + " ctd_data_header.to_csv(dest_dir + output_name, index=False, header=False)\n", + " # Do a check to make sure the right columns were captured or discarded\n", + " if np.nan in ctd_data_header.columns:\n", + " print(\"Warning: Not all the right columns have been captured or discarded\")\n", + " print(\"Output csv file data column names:\", ctd_data_header.columns)\n", + " except ValueError as e:\n", + " print(\n", + " \"If plan shapes are not aligned, then may need to add new channel name \"\n", + " \"spellings to channel_spellings list\"\n", + " )\n", + " print(e.args)\n", + "\n", + "ADD_6LINEHEADER(output_ext=\"_CTD_DATA-6linehdr.csv\")" + ] + }, + { + "cell_type": "markdown", + "id": "afff1982-9703-4dea-964e-005fb051ef90", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**PLOT TRACK LOCATION**" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "bc7c06e5-11fd-4d2d-bf6d-0dc88ad06831", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "show" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "sampling area\n" + ] + }, + { + "data": { + "image/png": "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x49vUXZdUTFnIN27d0f//v3V/jWksLAQjLEGR2RqO0pTF++++67qRW9hYYGAgACN9122bBnef/99fPDBB2qFAAC4uroCqHtjeFRBQQFEIhHatWtX777ExERMmzYNo0aNwurVq9UKq5ycHLz99tt45513YGlpiaKiIhQVFUEul0OhUKCoqAiVlZUAgCeeeELt91K+IemaSxsJCQm4e/cunnrqKY229/X1BVDXDaCrL774AgsXLsSgQYOwadMmpKam4sSJExg7dqzqMVF68cUXUVpaitWrVwMAvv32W3To0AGTJ09WbdPY9VJeXl6q+5X/beh12tzo3abk5+fDw8OjXlHt5uYGc3PzBp87TT3cZXrmzBkUFRUhLCwMABAUFIT27dvj4MGDSE1NVbteTtlduWTJErXXlYWFhaqLStmVpc1z0Rzl61XJysoKAFTHuXfvnur949Fcqamp9brXtB0RKhaLMWLECLz99tvYvn07bt++jZkzZ+LUqVOqUYhN0edjoaR8/ht7fT76+rC1tYW1tbXabVZWVjpdTvHxxx9DKpU2Oh3JvXv3sGPHjnrPhfISFE2mmlF2ne7duxfJycmQyWQYOXIkoqKiVEXZ3r17MXToUNjY2ADQ/jFp6nVw5coVpKWlYdy4cRpP+aTt58i1a9dw+PBhREdHgzGmei9XfoF7+LXl6+ur9XujjY2NqhFlx44dCA8Px9q1a+tNqaMJZdGvfO9TWrx4MU6cOIFTp07h+vXruHPnDp555hmtj68v9ZuKSKtydnaGSCRq8KJMTecma4lnnnlGbVi38sOiOcuWLcPSpUuxdOlSvPHGG/XuDwgIgI2NDTIyMurdl5GRgc6dO9d7g01MTMSUKVMQFhaGTZs2qbVUAnXzDFVWVmLx4sUNDhd3dnbG4sWL8dVXX2Hp0qVqBaaDg4POubT166+/wtLSEv/4xz802r5///5wcXHBtm3b8OGHH+rUMvjXX38hPDwcK1asULu9oRaEzp07Y9y4cfjuu+8wbtw4bN++HcuWLYOZmZlqG1dXV9y5c6fevsprdiQSiWq748eP19uuodeutbV1vYv3gfofcK6urkhLSwNjTO2xuH//PuRyuercuujZs6eqYLOysoK7uzu6deumun/EiBE4cOCA6sNPWcwpz/n66683erF1165dAWj3XLSUcvDQkSNHGvzbffS2lrY6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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Create a folder for figures if it doesn't already exist\n", + "figure_dir = os.path.join(dest_dir, \"FIG\")\n", + "if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + "\n", + "input_name = str(year) + \"-\" + str(cruise_number) + \"_header-merge.csv\"\n", + "input_filename = dest_dir + input_name\n", + "header = pd.read_csv(input_filename, header=0)\n", + "header[\"lat_degree\"] = header[\"LOC:LATITUDE\"].str[:2].astype(int)\n", + "header[\"lat_min\"] = header[\"LOC:LATITUDE\"].str[3:10].astype(float)\n", + "header[\"lat\"] = header[\"lat_degree\"] + header[\"lat_min\"] / 60\n", + "header[\"lon_degree\"] = header[\"LOC:LONGITUDE\"].str[:3].astype(int)\n", + "header[\"lon_min\"] = header[\"LOC:LONGITUDE\"].str[4:12].astype(float)\n", + "header[\"lon\"] = 0 - (header[\"lon_degree\"] + header[\"lon_min\"] / 60)\n", + "# event = header['LOC:STATION'].astype(str)\n", + "project_name = header[\"ADM:Project\"][0]\n", + "\n", + "lon = header[\"lon\"].tolist()\n", + "lat = header[\"lat\"].tolist()\n", + "# event = event.tolist()\n", + "\n", + "# If map extent limits are not provided, then make some up based on the data\n", + "coord_limits = [\n", + " np.floor(np.min(header[\"lon\"]) * 10) / 10,\n", + " np.ceil(np.max(header[\"lon\"]) * 10) / 10,\n", + " np.floor(np.min(header[\"lat\"]) * 10) / 10,\n", + " np.ceil(np.max(header[\"lat\"]) * 10) / 10,\n", + "]\n", + "\n", + "left_lon = coord_limits[0] if left_lon is None else left_lon\n", + "right_lon = coord_limits[1] if right_lon is None else right_lon\n", + "bot_lat = coord_limits[2] if bot_lat is None else bot_lat\n", + "top_lat = coord_limits[3] if top_lat is None else top_lat\n", + "\n", + "m = Basemap(\n", + " llcrnrlon=left_lon,\n", + " llcrnrlat=bot_lat,\n", + " urcrnrlon=right_lon,\n", + " urcrnrlat=top_lat,\n", + " projection=\"lcc\",\n", + " resolution=\"i\",\n", + " lat_0=0.5 * (bot_lat + top_lat),\n", + " lon_0=0.5 * (left_lon + right_lon),\n", + ") # lat_0=53.4, lon_0=-129.0)\n", + "\n", + "x, y = m(lon, lat)\n", + "\n", + "fig = plt.figure(num=None, figsize=(8, 6), dpi=100)\n", + "m.drawcoastlines(linewidth=0.2)\n", + "m.drawmapboundary(fill_color=\"white\")\n", + "# m.fillcontinents(color='0.8')\n", + "m.drawrivers()\n", + "\n", + "m.scatter(x, y, marker=\"D\", color=\"m\", s=5)\n", + "# m.plot(x, y, marker='D', color='m', markersize=4)\n", + "# for event, xpt, ypt in zip(event, x, y):\n", + "# plt.text(xpt, ypt, event)\n", + "\n", + "parallels = np.arange(bot_lat, top_lat, 0.5)\n", + "m.drawparallels(\n", + " parallels, labels=[True, False, True, False]\n", + ") # draw parallel lat lines\n", + "meridians = np.arange(left_lon, right_lon, 0.5)\n", + "m.drawmeridians(meridians, labels=[False, False, False, True])\n", + "plt.title(\"Fig 1 - \" + year + \"-\" + cruise_number + \" \" + project_name)\n", + "plt.tight_layout()\n", + "plt.savefig(\n", + " os.path.join(figure_dir, f\"{year}-{cruise_number}_basemap_sampling_area.png\")\n", + ") # 'Fig_1.png'\n", + "print('sampling area')\n", + "plt.show()\n", + "plt.close(fig)" + ] + }, + { + "cell_type": "markdown", + "id": "30ef2809-518d-42b6-ab65-9847e71ce430", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Plot Pressure Difference**" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "df76d1de-2a91-4acf-89eb-43a8db453d51", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "show" + ] + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABWwAAAJOCAYAAAAjyk6bAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd5zURP8H8M/ecUc/em+CgmLBAhYsICpNRKz42FCK/WfDBjYECxZU1EesFLEiFlQ8OogUUaqKiCJdeu8ce3f5/ZEnty3JpkyS2d3P+/W6191ls8lkMplMvplMQoqiKCAiIiIiIiIiIiKiwGUFnQAiIiIiIiIiIiIiUjFgS0RERERERERERCQJBmyJiIiIiIiIiIiIJMGALREREREREREREZEkGLAlIiIiIiIiIiIikgQDtkRERERERERERESSYMCWiIiIiIiIiIiISBIM2BIRERERERERERFJggFbIiIiIiIiIiIiIkkwYEtERERSGTVqFEKhkO7Pgw8+iDVr1iAUCmHUqFHC1vn+++/jsssuw1FHHYWyZcvimGOOwR133IFNmzY5XuamTZvw+OOPo3Xr1qhevTry8vLQsmVLvPvuuygqKkqYf//+/bjvvvtQt25dlClTBqeccgo+++yzmHmKiorwyiuvoFOnTqhfvz7KlSuH5s2bo1+/fti9e7dpepYtW4bSpUsjFAphwYIFlrfDSroAYPbs2ejTpw9atmxZsp41a9YkzGe2f0OhEJ5//nnLaTNTUFCA//73vzj33HNRpUoV5Obmol69eujevTtmzpwJADjqqKNM06L9aGUtelp2djaqVKmCk08+GbfddhvmzZvnKJ3nn39+yTKzsrJQsWJFHHPMMbj66qvxxRdfoLi42PC7v//+O0KhEHJycmLK6s0332xpu26++eaS72zfvt1R+dAcOHAATz75JJo1a4bSpUujWrVqaNeuHVasWFEyzw8//IBQKIQffvihZNpTTz2FUChke312aHXGkCFDHC/j5ptvxlFHHSUuUUREREQmSgWdACIiIiI9I0eOxHHHHRczrW7duqhVqxZ++uknHH300cLWNWDAALRr1w7PPfcc6tWrh7/++gtPP/00vvnmGyxevBi1atWyvcyFCxdi9OjR6NGjB5544gnk5ORgwoQJuOOOOzBv3jyMGDEiZv4rrrgC8+fPx/PPP49mzZrhk08+wbXXXovi4mJcd911AIBDhw7hqaeewrXXXos+ffqgevXqWLRoEZ555hl89913WLBgAcqWLZuQlqKiIvTq1QvVq1fHxo0bbW2HlXQBwLRp0zB16lSceuqpyMvLiwnKRevSpQt++umnhOlPPvkkpkyZgssvv9xW+vRs374dnTp1wm+//YZevXrhoYceQtWqVbFhwwZ88803uPDCC7Fw4UJ8/fXXKCgoKPne+++/j+HDh2PixImoVKlSyfTosnbVVVfhgQcegKIo2Lt3L5YuXYrRo0fj3XffxT333IPXXnvNdnqbNGmCjz/+GIAa+Fy9ejXGjRuHq6++Gueddx6+++67mPREpxcACgsLMXr0aDzyyCMAgCeeeAK33357yXyLFi3CXXfdheeeew7t2rUrmV6jRo2Svz/88EMcOXIEADB8+HC0atXKcvr379+Pdu3aYePGjejXrx9atGiBPXv2YO7cuTh48KDpd/v06YNOnTpZXhcRERFRRlCIiIiIJDJy5EgFgDJ//nzf1rlly5aEafPnz1cAKE8//bSjZe7cuVM5cuRIwvS77rpLAaCsW7euZNr333+vAFA++eSTmHnbt2+v1K1bVyksLFQURVEKCwuV7du3Jyxz7NixCgDlww8/1E3LSy+9pNSrV0957bXXbOWt1XQpiqIUFRXFrA+Asnr1akvr2b9/v1KhQgXl3HPPtTR/Mp07d1ZKlSqlTJs2TffzX375RVm7dm3C9AEDBigAlG3btul+D4By1113JUwvLCxUevXqpQBQhg0bZiutbdu2VU444QTdz0aMGKEAULp3757w2eHDh5Vq1aopJ598slKvXj2lWbNmhuuYMWOGAkAZO3as4TwnnniiUrNmTeX0009XKlWqpBw8eNDyNtx7771K+fLllZUrV5rOp6VjxowZlpctwurVqxUAyksvveR4GTfddJPSqFEj03kKCwuVw4cPO14HERERkYZDIhAREVFKMRoS4ZtvvkGLFi1QunRpNGnSBK+99prlx61r1qyZMK1ly5bIzs7G+vXrHaWzSpUqyMnJSZh+xhlnAAD+/fffkmlff/01KlSogKuvvjpm3p49e2Ljxo34+eefAQDZ2dmoVq2a4TL10rpixQo8+eSTGDZsGPLy8mxtg9V0AUBWlvNm5ZgxY7B//3706dPH8TI0CxcuxIQJE9C7d29ccMEFuvOcfvrpaNiwoet1abKzs/Hf//4X1atXx0svvSRsuT179sTFF1+MsWPHYu3atTGfjRs3Djt27ECfPn1w00034e+//8bs2bMdrefnn3/G0qVLceONN+KWW27Bnj178OWXX1r67sGDB/H+++/j6quvRpMmTWyvW+8YPeqoo3DJJZdg4sSJOO2001C2bFkcd9xxCb3SAWDz5s247bbbUL9+feTm5qJx48YYOHAgCgsLddf3yiuvoHHjxqhQoQJat26tO5TFqFGjcOyxx6J06dJo3rw5Ro8enTCPVg+9+OKLeOaZZ9C4cWOULl0aM2bM0F3v8uXLce2116JWrVooXbo0GjZsiB49epT08D548CAefPBBNG7cGGXKlEHVqlXRqlUrfPrppwCAoUOHIhQK4Z9//klY9iOPPILc3Fxs375dd91ERESUehiwJSIiIikVFRWhsLAw5sfIxIkTccUVV6BatWoYM2YMXnzxRXz66af44IMPHK9/5syZKCoqwgknnBAzXRsfVG98ViumT5+OUqVKoVmzZiXTli5diubNm6NUqdjRqlq0aFHyebJlAkhIq6Io6NOnDy655BJceumlttPqNl1WDR8+HHl5eQmBYScmT54MALjssstcL8uOsmXL4qKLLsLq1atjgvFuXXrppVAUBbNmzYqZPnz4cJQuXRrXX389evXqhVAohOHDhztah/a9Xr164T//+Q/KlStneVkLFy7EgQMH0LRpU9xxxx0l4wW3atUK33//vaP0AMCvv/6KBx54APfff3/JzZjevXvjxx9/LJln8+bNOOOMMzBp0iQ8+eSTJYH6wYMH45ZbbklY5ptvvokpU6Zg6NCh+Pjjj3HgwAFcfPHF2LNnT8k8o0aNQs+ePdG8eXN8+eWXePzxx/H000+XHGPxXn/9dUyfPh1DhgzBhAkTEoZx0bbl9NNPx7x58zBo0CBMmDABgwcPRkFBQckwFH379sVbb72Fe+65BxMnTsSHH36Iq6++Gjt27AAA3HDDDcjNzU24UVVUVISPPvoIXbt2RfXq1W3nMxEREcmJY9gSERGRlM4666yEaeFwWHfeJ598EvXq1cOkSZOQm5sLAOjUqZPjlwTt27cPd955Jxo0aIBevXrFfJadnY3s7GxHL0qaPHkyPvzwQ9x7770xPWV37Nih2zuxatWqJZ8b2bBhA/r164dWrVrhkksuifnszTffxO+//47PP//cdlrdpsuq5cuXY+7cubjttttQrlw518tbt24dAKBx48aul2VXo0aNAAAbN25E/fr1hS9Ts3btWkybNg3du3dHlSpVUKVKFbRp0wZjx47F66+/jooVK1pe/sGDBzFmzBicddZZOP744wEAV199NUaPHo2VK1cmHSt6w4YNAIAXXngBJ510EkaPHo2srCy8/PLL6Nq1KyZMmICOHTva3Wxs374dc+bMKekJ3aZNG0ybNg2ffPIJ2rRpA0Dtnbtr1y788ccfJfNdeOGFKFu2LB588EE89NBDJdsEABUrVsT48eORnZ0NQB0T+4wzzsCECRPwn//8B8XFxXjsscdw2mmn4euvvy45xs8991w0bdoUdevWTUhnmTJlMGnSJN3e9Jq+ffuiVKlS+OWXX2LGDb7++utL/p4zZw46dOiA+++/v2Raly5dSv6uXr06LrnkEnzwwQcYNGhQSY/2yZMnY+PGjejZs6fFnCUiIqJUwB62REREJKXRo0dj/vz5MT/xPT0B9SVNCxYswGWXXVYSrAWAChUqoGvXrrbXe/jwYVxxxRVYu3Ytxo4diwoVKsR8Pnz4cBQWFpYE0qxatGgRunfvjrPOOguDBw9O+NwsAGz02c6dO3HxxRdDURSMGTMmZliCtWvXon///njppZdMX5qmKIppT2Yn6bJD68kpYjiEoCmK4ssyR44cieLi4pibCb169cKBAwcwZswYW8v//PPPsXfv3oRlKYqCkSNHlkyL7/FeXFwMACW/c3NzMWHCBHTt2hVdunTB+PHjUadOHTz99NO20qM55ZRTYoatKFOmDJo1axYzNMT48ePRrl071K1bNyZtnTt3BqD2ko/WpUuXkmAtEOkpri3zr7/+wsaNG3HdddfFlO1GjRrh7LPP1k3npZdeahqsPXjwIGbOnInu3bvHBGvjaYHjfv364YcffsChQ4cS5unZsyf+/fdfTJ06tWTayJEjUbt27ZJtJiIiovTAgC0RERFJqXnz5mjVqlXMj55du3ZBURTdoKRZoFJPQUEBLr/8csyePRvffvstzjzzTEdpj7d48WK0b98eTZs2RX5+PkqXLh3zebVq1XR7q+7cuRNApEdrtF27dqF9+/bYsGEDpkyZktAT9q677sKJJ56IK6+8Ert378bu3btx8OBBAMD+/ftLHgOfOXMmcnJyYn604R6cpMuOcDiM0aNH4+STTzbcv3ZpQb7Vq1cLWZ4dWuBPryemqGUWFxdj1KhRqFu3Llq2bFmyby+66CKUL1/e9rAIw4cPR5kyZdCpU6eSZbVo0QJHHXUURo0ahaKiIgBqz9XoMqIFeLWe4meffXZMz95y5cqhbdu2WLRokaPt1huruXTp0jGBzC1btuC7775LKL/a0CDxY7rGL1M7DrVlamW9du3aCevWmwYAderUMd2OXbt2oaioKGmP69dffx2PPPIIxo0bh3bt2qFq1aq47LLLsGLFipJ5OnfujDp16pQE0nft2oVvv/0WPXr0iAlEExERUerjkAhERESU0qpUqYJQKIQtW7YkfLZ582bLyykoKMBll12GGTNm4JtvvsGFF14oJH2LFy/GRRddhEaNGmHy5MmoVKlSwjwnnXQSPv30UxQWFsb0Iv79998BACeeeGLM/Lt27SoZL3XatGklPQWjLV26FGvXrkWVKlUSPmvXrh0qVaqE3bt3o2XLlpg/f37M51pw0G667Bo/fjy2bt2KJ554wtVyonXs2BGPPvooxo0bh06dOglbbjKHDh3C1KlTcfTRRwsbDgEAvv32W4RCoZJhAKZOnVoSxNULas6bNw/Lli2LGQrASPSLyoxewjZp0iRcfPHFeOedd7Bv376S6dp4qXplT6MoiquX0SVTvXp1tGjRAs8++6zu53YD51p+6tUbRnVJsl7mVatWRXZ2dtJxjcuXL4+BAwdi4MCB2LJlS0lv265du2L58uUA1OFYbrzxRrz++uvYvXs3PvnkExQUFHA4BCIiojTEgC0RERGltPLly6NVq1YYN24chgwZUjIswv79+zF+/HhLy9B61k6fPh1fffWVozE39SxZsgQXXXQR6tevjylTpugGTwHg8ssvx3vvvYcvv/wS11xzTcn0Dz74AHXr1o3p6asFa1etWoUpU6bg1FNP1V3mZ599hsOHD8dMmzhxIl544QW8/fbbJb0QK1asaNi71U66nNB6d0aP5enWaaedhs6dO2P48OHo3r07LrjggoR5FixYgJo1axoGKe0qKirC//3f/2HHjh26w104NXLkSEyYMAHXXXddSVqHDx+OrKwsfPXVVwnB/3///Rc33ngjRowYgSFDhiRdvtYb97333sMxxxwT89mhQ4fQrVs3jBgxAhdffDGOPfZY3WXUqVMHrVu3xpw5c7B3717k5eUBiAwFoDcWtSiXXHIJ8vPzcfTRRxseW3Yce+yxqFOnDj799FP07du3JBi7du1azJ0711HP6bJly6Jt27YYO3Ysnn32WUsvBqtVqxZuvvlm/Prrrxg6dCgOHjxYMr5zz549S16qOGrUKLRu3Vr3RWdERESU2hiwJSIiopQ3aNAgdOnSBR07dsS9996LoqIivPTSS6hQoULJ4/tmrrrqKkyYMAGPPfYYqlWrhnnz5pV8lpeXF9NbsXfv3vjggw+wcuVK03Fs//rrL1x00UUAgGeffRYrVqyIebz56KOPLhnTsnPnzmjfvj3uuOMO7N27F8cccww+/fRTTJw4ER999FHJ486HDh1Cx44dsXjxYgwdOhSFhYUxaa1Ro0bJS6L0AmXaUActW7a0NASB1XQBwLZt20rGDNV64E6YMAE1atRAjRo10LZt25hlb9y4ERMnTsQ111wjJNgWbfTo0ejUqRM6d+6MXr16oXPnzqhSpQo2bdqE7777Dp9++ikWLlzoKGC7ZcsWzJs3D4qiYN++fVi6dClGjx6NX3/9Fffffz9uueUW28s8dOhQyX48dOgQVq1ahXHjxmH8+PFo27Yt3n77bQDqI/vffPMNOnbsiG7duuku69VXX8Xo0aMxePBg07FVCwsLMXr0aDRv3txw/OCuXbvi22+/xbZt20zHXx0yZAjatWuHjh074pFHHkEoFMLLL7+M7du3Ox7D1opBgwZhypQpOPvss3HPPffg2GOPxeHDh7FmzRrk5+fj7bffttXbOSsrC08//TT69OmDyy+/HLfccgt2796Np556ynBIBL00DRo0CNOmTSsp86+88grOPfdcnHnmmejXrx+OOeYYbNmyBd9++y3eeecdVKxYEWeeeSYuueQStGjRAlWqVMGff/6JDz/8EK1bt455Gd9xxx2H1q1bY/DgwVi/fj3effdde5lGREREqUEhIiIiksjIkSMVAMr8+fN1P1+9erUCQBk5cmTM9K+//lo56aSTlNzcXKVhw4bK888/r9xzzz1KlSpVkq4TgOFP27ZtY+a96aabFADK6tWrLW2H0U98+vft26fcc889Su3atZXc3FylRYsWyqeffqq77UY/N910k6U0GeWtHivpUhRFmTFjhuU8VBRFefbZZxUAyvTp0y2nxY5Dhw4pr7/+utK6dWslLy9PKVWqlFK3bl3liiuuUL7//nvd7wwYMEABoGzbtk338+htysrKUvLy8pSTTjpJufXWW5WffvrJUTrbtm0bs9zy5csrTZo0Ua666ipl7NixSlFRUcm8Q4cOVQAo48aNM1ze22+/rQBQvvzyy5Jp2r4ZO3ZsybRx48YpAJShQ4caLmvixIkKAOXll19Ouh2zZs1S2rZtq5QrV04pV66ccsEFFyhz5syJmUdLx4wZM0qmaXkerVGjRkqXLl0S1tG2bduEsrRt2zblnnvuURo3bqzk5OQoVatWVVq2bKk89thjyv79+xVFiRw3L730UsIyASgDBgyImfb+++8rTZs2VXJzc5VmzZopI0aMUG666SalUaNGJfMYLVPbnuhtVBRFWbZsmXL11Vcr1apVK6mjbr75ZuXw4cOKoihKv379lFatWilVqlRRSpcurTRp0kS5//77le3btyek+d1331UAKGXLllX27NmT8DkRERGlvpCiePA6WyIiIqKAhcNhnHLKKahXrx4mT54cdHKIiIiIiIgs4ZAIRERElBZ69+6N9u3bo06dOti8eTPefvtt/Pnnn3jttdeCThoREREREZFlDNgSERFRWti3bx8efPBBbNu2DTk5OTjttNOQn59fMo4spb7CwkLTz7OyspCVleVTaswVFRXB7EG2UCgUMwYwEREREZGGQyIQERERUUoIhUKmn990000YNWqUP4lJ4qijjsLatWsNP2/bti1++OEH/xJERERERCmDPWyJiIiIKCXMnz/f9PPq1av7lJLkvvvuOxQUFBh+XrFiRR9TQ0RERESphD1siYiIiIiIiIiIiCQhxyBfRERERERERERERMQhEZIpLi7Gxo0bUbFixaTjphEREREREREREVF6UhQF+/btQ926dT192S0Dtkls3LgRDRo0CDoZREREREREREREJIH169ejfv36ni2fAdsktBdCrF+/Hnl5eQGnxlvhcBiTJ09Ghw4dkJOTE3RyiMgFHs9E6YPHM1H64PFMlD54PBOlDzvH8969e9GgQQPPXyDLgG0S2jAIeXl5GRGwLVeuHPLy8njCIUpxPJ6J0gePZ6L0weOZKH3weCZKH06OZ6+HTeVLx4iIiIiIiIiIiIgkwYAtERERERERERERkSQYsCUiIiIiIiIiIiKSBMewJSIiIiIiIiKijFFUVIRwOBx0MkgS4XAYpUqVQkFBAbKyspCdnR10khiwJSIiIiIiIiKi9KcoCjZv3ozdu3cHnRSSiKIoqF27NtatW4dQKITKlSujdu3anr9YzAwDtkRERERERERElPa0YG3NmjVRrly5QANyJI/i4mLs378f5cuXx+HDh7F161YAQJ06dQJLEwO2RERERERERESU1oqKikqCtdWqVQs6OSSR4uJiHDlyBGXLlkX58uUBAFu3bkXNmjUDGx6BLx0jIiIiIiIiIqK0po1ZW65cuYBTQrLTykiQ4xwzYEtERERERERERBmBwyBQMjKUEQZsiYiIiIiIiIiIiCTBgC0RERERERERERGllKeeegqnnHJKyf8333wzLrvsspL/FUXBrbfeiqpVqyIUCmHJkiW602TEgC0REREREREREZGkbr75ZoRCIYRCIeTk5KBJkyZ48MEHceDAgaCTJpXXXnsNo0aNKvl/4sSJGDVqFMaPH49NmzbhxBNP1J0mo1JBJ4CIiIiIiIiIiIiMderUCSNHjkQ4HMasWbPQp08fHDhwAG+99VbMfOFwGDk5OQGlUp9faapUqVLM/ytXrkSdOnVw9tlnm04rLi72PG12sYctERERERERERGRxEqXLo3atWujQYMGuO6663D99ddj3LhxJcMCjBgxAk2aNEHp0qWhKAr27NmDW2+9FTVr1kReXh4uuOAC/PrrryXL+/XXX9GuXTtUrFgReXl5aNmyJRYsWAAAWLt2Lbp27YoqVaqgfPnyOOGEE5Cfnw8AGDVqFCpXrhyTtnHjxsW8qMtpmpJ5/vnnUatWLVSsWBG9e/fG4cOHYz6PHhLh5ptvxt13341169YhFArhqKOO0p0mK/awJSIiIiIiIiIiSiFly5ZFOBwGAPzzzz/4/PPP8eWXXyI7OxsA0KVLF1StWhX5+fmoVKkS3nnnHVx44YX4+++/UbVqVVx//fU49dRT8dZbbyE7OxtLliwp6QV711134ciRI/jxxx9Rvnx5LFu2DBUqVLCVPidpMvP5559jwIABePPNN3Heeefhww8/xOuvv44mTZrozv/aa6/h6KOPxrvvvov58+cjOzsbubm5CdNkxYAtERERERERERFRivjll1/wySef4MILLwQAHDlyBB9++CFq1KgBAJg+fTp+//13bN26FaVLlwYADBkyBOPGjcMXX3yBW2+9FevWrcNDDz2E4447DgDQtGnTkuWvW7cOV155JU466SQAMAyKmnGSJjNDhw5Fr1690KdPHwDAM888g6lTpyb0stVUqlQJFStWRHZ2NmrXrl0yXW+ajBiwJSIiIiIiIiKijHXHHcCGDf6sq149IG7YWUvGjx+PChUqoLCwEOFwGN26dcMbb7yBYcOGoVGjRiWBUQBYuHAh9u/fj2rVqsUs49ChQ1i5ciUAoG/fvujTpw8+/PBDXHTRRbj66qtx9NFHAwDuuece3HHHHZg8eTIuuugiXHnllWjRooWt9DpJk5k///wTt99+e8y01q1bY8aMGbbSlSoYsCUiIiIiIiIioozlJIDqt3bt2uGtt95CTk4O6tatG/MSr/Lly8fMW1xcjDp16uCHH35IWI42/uxTTz2F6667Dt9//z0mTJiAAQMG4LPPPsPll1+OPn36oGPHjvj+++8xefJkDB48GC+//DLuvvtuZGVlQVGUmGVqQzNEc5ImimDAloiIiIiIiIiISGLly5fHMcccY2ne0047DZs3b0apUqVMX6zVrFkzNGvWDPfffz+uvfZajBw5EpdffjkAoEGDBrj99ttx++23o3///njvvfdw9913o0aNGti3bx8OHDhQEpRdsmSJsDQZad68OebNm4cePXqUTJs3b57t5aSKrKATQERERERERERERGJcdNFFaN26NS677DJMmjQJa9aswdy5c/H4449jwYIFOHToEP7v//4PP/zwA9auXYs5c+Zg/vz5aN68OQDgvvvuw6RJk7B69WosWrQI06dPL/nszDPPRLly5fDoo4/in3/+wSeffIJRo0a5TlMy9957L0aMGIERI0bg77//xoABA/DHH3+4yieZMWBLREREREREFIA77gAGDw46FUSUbkKhEPLz89GmTRv06tULzZo1w3/+8x+sWbMGtWrVQnZ2Nnbs2IEePXqgWbNm6N69Ozp37oyBAwcCAIqKinDXXXehefPm6NSpE4499lgMGzYMAFC1alV89NFHyM/Px0knnYRPP/0UTz31lOs0JXPNNdfgySefxCOPPIKWLVti7dq1uOOOO1zlk8xCSvzAExRj7969qFSpEvbs2YO8vLygk+OpcDiM/Px8XHzxxTFjoRBR6uHxTJQ+eDwTpQ8ezxTvnHOAZs2AkSODTgnZxeM59Rw+fBirV69G48aNUaZMmaCTQxIpLi7G3r17kZeXh6ysLNOy4leckD1siYiIiIiIiIiIiCTBgC0REREREREREREF5oQTTkCFChV0fz7++OOgk+e7UkEngIiIiIiIiIiIiDJXfn4+wuGw7mdWxrhNNwzYEhERERERERERUWAaNWoUdBKkwiERiIiIiIiIiIiIiCTBgC0REREREREREWUERVGCTgJJToYywoAtERERERERERGltZycHADAwYMHA04JyU4rI1qZCQLHsCUiIiIiIiIiorSWnZ2NypUrY+vWrQCAcuXKIRQKBZwqkkFxcTGOHDmCQ4cO4fDhw9i6dSsqV66M7OzswNLEgC0REREREREREaW92rVrA0BJ0JYIUIdAOHToEMqWLYtQKITKlSuXlJWgMGBLRERERERERERpLxQKoU6dOqhZsybC4XDQySFJhMNh/Pjjj2jbti3Kli0baM9aDQO2RERERERERAGR4N02RBknOztbiqAcySE7OxuFhYUoXbq0NOWCLx0jIiIiIiIiCgCHzyQiIj0M2BIRERERERERERFJggFbIiIiIiIiIiIiIkkwYEtEREREREREREQkCQZsiYiIiIiIiIiIiCTBgC0RERERERERERGRJBiwJSIiIiIiIiIiIpIEA7ZEREREREREREREkmDAloiIiIiIiIiIiEgSDNgSERERERERERERSYIBWyIiIiIiIiIiIiJJMGBLREREREREFBBFCToFREQkGwZsiYiIiIiIiAIQCgWdAiIikhEDtkRERERERERERESSYMCWiIiIiIiIiIiISBIM2BIRERERERERERFJggFbIiIiIiIiIiIiIkkwYEtEREREREREREQkCQZsiYiIiIiIiIiIiCTBgC0RERERERERERGRJFIuYDts2DA0btwYZcqUQcuWLTFr1izT+QsKCvDYY4+hUaNGKF26NI4++miMGDHCp9QSERERERERERERWVcq6ATYMWbMGNx3330YNmwYzjnnHLzzzjvo3Lkzli1bhoYNG+p+p3v37tiyZQuGDx+OY445Blu3bkVhYaHPKSciIiIiIiIiIiJKLqUCtq+88gp69+6NPn36AACGDh2KSZMm4a233sLgwYMT5p84cSJmzpyJVatWoWrVqgCAo446ys8kExEREREREREREVmWMkMiHDlyBAsXLkSHDh1ipnfo0AFz587V/c63336LVq1a4cUXX0S9evXQrFkzPPjggzh06JAfSSYiIiIiIiIypShBp4CIiGSTMj1st2/fjqKiItSqVStmeq1atbB582bd76xatQqzZ89GmTJl8PXXX2P79u248847sXPnTsNxbAsKClBQUFDy/969ewEA4XAY4XBY0NbISdu+dN9OokzA45koffB4JkofPJ4pUTaKi4FwuCjohJBNPJ6J0oed49mvYz5lAraaUCgU87+iKAnTNMXFxQiFQvj4449RqVIlAOqwCldddRXefPNNlC1bNuE7gwcPxsCBAxOmT548GeXKlROwBfKbMmVK0EkgIkF4PBOlDx7PROmDxzNpdu48B6VKHUJ+/qKgk0IO8XgmSh9WjueDBw/6kJIUCthWr14d2dnZCb1pt27dmtDrVlOnTh3Uq1evJFgLAM2bN4eiKPj333/RtGnThO/0798fffv2Lfl/7969aNCgATp06IC8vDxBWyOncDiMKVOmoH379sjJyQk6OUTkAo9novTB45koffB4pnhDhmSjXj3g4otrB50UsonHM1H6sHM8a0/iey1lAra5ublo2bIlpkyZgssvv7xk+pQpU9CtWzfd75xzzjkYO3Ys9u/fjwoVKgAA/v77b2RlZaF+/fq63yldujRKly6dMD0nJydjKuFM2laidMfjmSh98HgmSh88nkkTCgFZWUBOTsq8Xobi8HgmSh9Wjme/jveUOiv07dsX77//PkaMGIE///wT999/P9atW4fbb78dgNo7tkePHiXzX3fddahWrRp69uyJZcuW4ccff8RDDz2EXr166Q6HQERERERERERERBSklOlhCwDXXHMNduzYgUGDBmHTpk048cQTkZ+fj0aNGgEANm3ahHXr1pXMX6FCBUyZMgV33303WrVqhWrVqqF79+545plngtoEIiIiIiIiIiIiIkMpFbAFgDvvvBN33nmn7mejRo1KmHbcccdxEHAiIiIiIiIiIiJKCSk1JAIRERERERERERFROmPAloiIiIiIiIiIiEgSDNgSERERERERERERSYIBWyIiIiIiIiIiIiJJMGBLREREREREFBBFCToFREQkGwZsiYiIiIiIiAIQCgWdAiIikhEDtkRERERERERERESSYMCWiIiIiIiIiIiISBIM2BIRERERERERERFJggFbIiIiIiIiIiIiIkkwYEtEREREREREREQkCQZsiYiIiIiIiIiIiCTBgC0RERERERERERGRJBiwJSIiIiIiIiIiIpIEA7ZEREREREREREREkmDAloiIiIiIiIiIiEgSDNgSERERERERBURRgk4BERHJhgFbIiIiIiIiogCEQkGngIiIZMSALREREREREREREZEkGLAlIiIiIiIiIiIikgQDtkRERERERERERESSYMCWiIiIiIiIiIiISBIM2BIRERERERERERFJggFbIiIiIiIiIiIiIkkwYEtEREREREREREQkCQZsiYiIiIiIiIiIiCTBgC0RERERERERERGRJBiwJSIiIiIiIiIiIpIEA7ZEREREREREAVGUoFNARESyYcCWiIiIiIiIKAChUNApICIiGTFgS0RERERERERERCQJBmyJiIiIiIiIiIiIJMGALREREREREREREZEkGLAlIiIiaU2eHHQKiIiIiIiI/MWALREREUmrY8egU0BEREREROQvBmyJiFJAURGwcmXQqSAimQ0ZAgwcGHQqiIiIiIjILQZsiYhSwLx5wDHHBJ0KIpLZzz8Dc+cGnQqi1HLttUGngIiIiCgRA7ZERERERJSRPvss6BQQERERJWLAloiIiIiIiIiIiEgSDNgSERERERERERERSYIBWyIiIiIiIqKAKErQKSAiItkwYEtEREREREQUgFAo6BQQEZGMGLAlIkoBbMwTZa6iIqC4OOhUEBERERGRXxiwJUpxU6cCbdoEnQoiIvLKZZdlY9y4Y4JOBhH5qH9/4NZbg04F+YHDIQSnsJA3RIlIXgzYEqW49euBWbOCTgUREXllzZoQdu8ubWleXvgTpYc1a4CVK4NORfo6fBjYsyfoVETwSapgXHgh8MYbQaeCiEgfA7Zk2yOPBJ0CIiIiiscLfiIia559FrjooqBTQUFbswbYvj3oVBAR6WPAlmx78cXg1r18eXDrJiKSxYwZwHvvGX9eWAgMGeJfeoiIiFLJ4cPA/v1Bp4KIiMgYA7aUUpo3DzoFRMFgzzmK9u23wNChxp/v2wc89JBvySEi8lVRUdApsG7iRKBFi6BTQUSZ6oMPgC+/DDoVROQEA7ZEREREZGrsWKBPn6BTQaQqVQo4dCjoVFizZQvw++9Bp4KIMtXo0cBXXwWdCiJyggFbIiJKwBcXEclDhh72S5cCkyYFnYoIGfKEgsU3uxPJp3Nne/PLdF4hIpINA7ZERJQgi2cHIWbOBFatCjoVRESUimS9eTpzJtCjR9CpyCyp8mKsiRPt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gO3NN9+Mm266qeTnxhtvRKdOnVClShXR6UswbNgwNG7cGGXKlEHLli0xa9Ys0/lnzpyJli1bokyZMmjSpAnefvttz9OYqqIDrOeeG/sY5oUXqr0c9EybpvY4iD7goy/ygMhFQLQHH3Se1lBIvTusd0dMj5aWhx5Sf69frzbMGjY0/55ZJWa3p5d20tYaciecANSvn/xiPllPhWT0AurJeg1ce636e+JEdQxFIPKCsp9/1v+O1bvIdeoAlSqpgcl7703+He2xrXgXXhj5u2nT5MuxKvqxmAYNEstYsgaHFli06pVXIn9fc43xY6FGFi82Hk/PiBaomj5d7dVz1lmxjS4rQXIzInoCDRyojp2Un682WDROA7YiHvE7/XT195df6qfFSY8fJ4/7auvauFFtvA8apPas1Rx3nPnFqxEnp8fLLovUacXFkcCqFUY3J6Lp9XbZtAn4/nvr6zGivZjRa8nWo/V8sOPnn9XxVp367jvjFydFi744jb7RpDefpndv/Xm0m7Tx7Iy7a+a//7U2n9E51ck7c+0MxaPReqFWrarepJs+XR2T0ekNUa1HoF1645uefTbQuLF67vOjV6vezcE9e9ThgpIFAsxEj+mfjN5FrBm9YE1xsbUeq8kef+7USf1tpWen03cQRH/XqG4yu7S6/37ghhvMh0wzatdq42a/8ELyTg9aACs+v7XjVys7p52m1ofVq+s/1mx0Di4sVANCO3aoASy9+ZwMiQBEniC0Kr7s/P672jazco5K1rbR6td69aw/PWU0X3x6+vZV5y1VKnGYOCv1h1GeR2+PVma0JzUrVNBf1n//m3gdovXenTgxcgNFr4et9si39mRQz57qMViuXOK8hYVqz0+jPNfOCb//rv+5nq+/Tt55B1DbfPv3q3mkvTIoJ8c4qKdHm2/KFOvpmzMn8ek7N0+WJBP9FOobb0SOj7p11R7hRj77zHys72g5OWq7uXx5NSisdeZKxujGcOnS6s0WwOyJCv3p0U9jvP66+v09e4D589VpeufJv/82bmtp+vUDjj8euOiiyLT4usao/ojehhkzImmfNCmxTg7iCZhM4yhgO3HiRMyePbvk/zfffBOnnHIKrrvuOuyKH5xToDFjxuC+++7DY489hsWLF+O8885D586dsc6gtb969WpcfPHFOO+887B48WI8+uijuOeee/CldrVNMV59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nTtrY8eODWZnEMXQkCFDtMsvv7zhb5ZnomiYN2+eVlJSot15553asmXLtGeffVZr3Lix9swzzzR8huWZKBrOOeccrVOnTtobb7yhrVixQps8ebLWpk0b7Zprrmn4DMszkbq2bNmiffLJJ9onn3yiAdDuu+8+7ZNPPtFWrlypaZpa5XfTpk1au3bttDPOOENbtGiRNnnyZK158+baPffc42qbOWBLmqZp2t/+9jetW7duWllZmbbffvtps2bNCjtJRAUDgOXPE0880fCZZDKp3XLLLVr79u218vJy7bDDDtMWLVqUFs727du1sWPHaq1atdIaNWqkjRgxQlu1alXaZzZu3KideeaZWrNmzbRmzZppZ555pvbTTz+lfWblypXa8OHDtUaNGmmtWrXSxo4dq+3YsUPW5hPFXuaALcszUXS8/vrrWp8+fbTy8nJtzz331P7xj3+k/Z/lmSgaNm/erF1++eVa165dtYqKCq1nz57ajTfeqO3cubPhMyzPROqaMWOG5TnzOeeco2maeuX3008/1Q499FCtvLxca9++vXbrrbdqyWTS1TYnNO2XlW+JiIiIiIiIiIiIKFRcw5aIiIiIiIiIiIhIERywJSIiIiIiIiIiIlIEB2yJiIiIiIiIiIiIFMEBWyIiIiIiIiIiIiJFcMCWiIiIiIiIiIiISBEcsCUiIiIiIiIiIiJSBAdsiYiIiIiIiIiIiBTBAVsiIiIiIiIiIiIiRXDAloiIiIiIiIiIiEgRHLAlIiIiothat24dLr74YnTt2hXl5eVo3749hg0bhrlz54adNCIiIiIiSyVhJ4CIiIiISJZTTjkFtbW1+Oc//4mePXvihx9+wNtvv40ff/wx7KQREREREVniDFsiIiIiiqVNmzbhvffew1133YUjjjgC3bp1w6BBg3D99ddj+PDhDZ+56KKL0K5dO1RUVKBPnz544403AAAbN27EGWecgc6dO6Nx48bo27cvnn/++bQ4Dj/8cIwbNw7XXHMNWrVqhfbt2+PWW29N+8ytt97aMMO3Y8eOGDduXCDbT0RERETRxBm2RERERBRLTZs2RdOmTfHqq6/igAMOQHl5edr/k8kkjjvuOGzZsgXPPPMMdt11VyxevBjFxcUAgB07dmDAgAG49tpr0bx5c/z3v//FmDFj0LNnTwwePLghnH/+858YP348PvzwQ8ydOxfnnnsuDj74YBx99NF46aWXcP/99+OFF17A3nvvjbVr1+J///tfoPuBiIiIiKIloWmaFnYiiIiIiIhkePnll3HhhRdi+/bt2G+//TBkyBCMGjUK/fr1w9SpU3HcccdhyZIl2H333R2FN3z4cPTu3Rv33HMPAH2GbX19Pd59992GzwwaNAhHHnkkJk6ciPvuuw8PP/wwPvvsM5SWlkrZRiIiIiKKFy6JQERERESxdcopp+D777/Ha6+9hmHDhmHmzJnYb7/98OSTT2LhwoXo3Lmz7WBtfX097rzzTvTr1w+tW7dG06ZNMXXqVKxatSrtc/369Uv7u0OHDli3bh0A4NRTT8X27dvRs2dPXHjhhXjllVdQV1cnZ2OJiIiIKBY4YEtEREREsVZRUYGjjz4av//97zFnzhyce+65uOWWW9CoUaOc37v33ntx//3345prrsE777yDhQsXYtiwYaipqUn7XObM2UQigWQyCQDo0qULli5dir/97W9o1KgRLr30Uhx22GGora0Vu5FEREREFBscsCUiIiKigrLXXnvh559/Rr9+/fDtt9/iyy+/tPzcu+++i5EjR+Kss85C//790bNnTyxbtsx1fI0aNcKJJ56IBx98EDNnzsTcuXOxaNEiv5tBRERERDHFh44RERERUSxt3LgRp556Ks4//3z069cPzZo1w8cff4w//elPGDlyJIYMGYLDDjsMp5xyCu677z706tULX3zxBRKJBI499lj06tULL7/8MubMmYOWLVvivvvuw9q1a9G7d2/HaXjyySdRX1+PwYMHo3Hjxnj66afRqFEjdOvWTeKWExEREVGUccCWiIiIiGKpadOmGDx4MO6//358/fXXqK2tRZcuXXDhhRfihhtuAKA/lOyqq67CGWecgZ9//hm9evXCxIkTAQA333wzVqxYgWHDhqFx48a46KKLcNJJJ6G6utpxGlq0aIGJEydi/PjxqK+vR9++ffH666+jdevWUraZiIiIiKIvoWmaFnYiiIiIiIiIiIiIiIhr2BIREREREREREREpgwO2RERERERERERERIrggC0RERERERERERGRIjhgS0RERERERERERKQIDtgSERERERERERERKYIDtkRERERERERERESK4IAtERERERERERERkSI4YEtERERERERERESkCA7YEhERERERERERESmCA7ZEREREREREREREiuCALREREREREREREZEiOGBLREREREREREREpIj/B5+T+VQ9bXuRAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def PLOT_PRESSURE_DIFF(dest_dir: str, year: str, cruise_number: str, input_ext: str):\n", + " # Create a folder for figures if it doesn't already exist\n", + " figure_dir = os.path.join(dest_dir, \"FIG\")\n", + " if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + "\n", + " # input_name will depend on the need for zero order holds\n", + " input_name = str(year) + \"-\" + str(cruise_number) + input_ext\n", + " input_filename = dest_dir + input_name\n", + " ctd_data = pd.read_csv(input_filename, header=None, low_memory=False)\n", + " ctd_data = ctd_data.rename(\n", + " columns=ctd_data.iloc[1]\n", + " ) # assign the second row as column names\n", + " ctd_data = ctd_data.rename(\n", + " columns={\n", + " \"Oxygen:Dissolved:Saturation\": \"Oxygen\",\n", + " \"Salinity:CTD\": \"Salinity\",\n", + " \"TIME:UTC\": \"TIME\",\n", + " }\n", + " )\n", + " ctd = ctd_data.iloc[6:]\n", + " ctd.index = np.arange(0, len(ctd))\n", + " # ctd = ctd[1000:4000] # to limit the number of records plotted -\n", + "\n", + " pressure = ctd[\"Pressure\"].apply(pd.to_numeric)\n", + " pressure_lag = pressure[1:]\n", + " pressure_lag.index = np.arange(0, len(pressure_lag))\n", + " pressure_diff = pressure_lag - pressure\n", + "\n", + " fig = plt.figure(num=None, figsize=(14, 6), dpi=100)\n", + " plt.plot(pressure_diff, color=\"blue\", linewidth=0.5, label=\"Pressure_diff\")\n", + " plt.ylabel(\"Pressure (decibar)\")\n", + " plt.xlabel(\"Scans\")\n", + " plt.grid()\n", + " plt.legend()\n", + " plt.title(\"Fig 2: \" + year + \"-\" + cruise_number + \" \" + input_ext)\n", + " plt.tight_layout()\n", + " plt.savefig(os.path.join(figure_dir, \"zero_order_holds_\" + input_ext + \".png\"))\n", + " plt.show()\n", + " plt.close(fig)\n", + " return\n", + "\n", + "PLOT_PRESSURE_DIFF(dest_dir, year, cruise_number, input_ext = '_CTD_DATA-6linehdr.csv')\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "f4f15ce6-da23-4cec-8637-208811956af1", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Check for Zero order hold**" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "ca8c4e26-d9be-41c1-a604-2d63c7c47ef6", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], + "source": [ + "def check_for_zoh(\n", + " dest_dir, year: str, cruise_number: str, sampling_interval: float\n", + ") -> bool:\n", + "\n", + " input_name = str(year) + \"-\" + str(cruise_number) + \"_CTD_DATA-6linehdr.csv\"\n", + " input_filename = dest_dir + input_name\n", + " ctd_data = pd.read_csv(input_filename, header=None, low_memory=False)\n", + " # assign the second row as column names\n", + " ctd_data = ctd_data.rename(columns=ctd_data.iloc[1])\n", + " ctd_data = ctd_data.rename(\n", + " columns={\n", + " \"Oxygen:Dissolved:Saturation\": \"Oxygen\",\n", + " \"Salinity:CTD\": \"Salinity\",\n", + " \"TIME:UTC\": \"TIME\",\n", + " }\n", + " )\n", + " ctd = ctd_data.iloc[6:]\n", + " ctd.index = np.arange(0, len(ctd))\n", + "\n", + " pressure = ctd[\"Pressure\"].apply(pd.to_numeric)\n", + " pressure_diffs = np.diff(pressure)\n", + "\n", + " sec2min = 1 / 60 # Convert seconds to minutes b/c sampling interval in seconds\n", + " if sum(pressure_diffs == 0) >= np.floor(\n", + " len(pressure) * sampling_interval * sec2min\n", + " ):\n", + " zoh_correction_needed = True\n", + " else:\n", + " zoh_correction_needed = False\n", + " return zoh_correction_needed\n", + "\n", + "zoh = check_for_zoh(\n", + " dest_dir, year, cruise_number, float(meta_dict[\"Sampling_Interval\"]))\n", + "print(zoh)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "bf40d3fb-af45-448e-ae67-6f3b632c77f1", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "# if you need to check the channels\n", + "# rsk.printchannels()" + ] + }, + { + "cell_type": "markdown", + "id": "ad018b2d-68d0-437c-801e-ef4386899ac8", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Check Profile Plots**\n", + "Look for any obvious spikes" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "34503ce7-b7ff-412b-9560-00a5917cbe2d", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "def check_profiles(name1, name2):\n", + " files = os.listdir(dest_dir) # list all the files in dest_dir\n", + " files = list(filter(lambda f: f.endswith(\".rsk\"), files)) # keep the rsk files only\n", + " n_files = len(files) # get the number of files\n", + "\n", + " # current_profile = event_start\n", + " header_merge_file = os.path.join(dest_dir, f\"{year}-{cruise_number}_header-merge.csv\")\n", + " header_merge_df = pd.read_csv(header_merge_file)\n", + " # Get event numbers from the header-merge.csv file\n", + " header_event_no = header_merge_df.loc[:, \"LOC:Event Number\"].to_numpy()\n", + " # initialize counter to go through the event numbers in header_merge_df\n", + " event_number_idx = 0 \n", + "\n", + "\n", + " for k in range(n_files):\n", + " print(files[k])\n", + " # Open the rsk file and read the data within it\n", + " filename = os.path.join(\n", + " str(dest_dir), str(files[k])\n", + " ) # full path and name of .rsk file\n", + " # readHiddenChannels=True does not reveal the derived variables\n", + " rsk = pyrsktools.RSK(filename, readHiddenChannels=False) # load up an RSK\n", + " rsk.open()\n", + " rsk.readdata()\n", + "\n", + " \n", + "\n", + " # Compute the derived channels so as to make number of channels accurate\n", + " rsk.derivesalinity()\n", + " rsk.deriveseapressure()\n", + " rsk.derivedepth()\n", + " \n", + " downcastIndices = rsk.getprofilesindices(direction=\"down\")\n", + " for i in range(0,len(downcastIndices)):\n", + " # for i in range(skipcasts[k],len(downcastIndices)):\n", + " fig, axes = rsk.plotprofiles(\n", + " channels=[\"conductivity\", \"temperature\", \"chlorophyll_a\", \"salinity\", 'dissolved_o2_saturation'],\n", + " profiles=i,\n", + " direction=\"down\",\n", + " )\n", + " plot_name = f\"{name1}Plot_cast_{str(header_event_no[event_number_idx])}_rsk.png\"\n", + " plt.savefig(os.path.join(dest_dir + \"FIG\\\\\" + plot_name)) \n", + " plt.show()\n", + " plt.close() \n", + " event_number_idx +=1\n", + " \n", + " \n", + "check_profiles(name1=\"Pre_Processing_\", name2=\"Pre_Processing_\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "3dbb328b-ea4f-4c7c-a849-bd904c2f8369", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Make first corrections**
\n", + "* Correct the hold using rsk.correcthold(), this will correct holds in all channels.
\n", + "* CSV files will be re-generated and replaced and merged. \n", + "* Despike Fluorescence and any other channels if needed. The default is 2 standard deviations in a window of 11. Add channels if needed.
\n" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "9759662a-6fd0-4026-af54-db42abd0f757", + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "show" + ] + }, + "outputs": [ + { + "name": "stdin", + "output_type": "stream", + "text": [ + "Is despiking needed? True or False True\n", + "Is zoh correction needed? True or False True\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "232531_20240206_1745.rsk\n", + "52\n" + ] + } + ], + "source": [ + "# confirm despiking\n", + "spk_input = input('Is despiking needed? True or False')\n", + "if spk_input == 'True':\n", + " spk_input = True\n", + "elif spk_input == 'False':\n", + " spk_input = False\n", + "else:\n", + " print('spike input is incorrect')\n", + "\n", + "zoh_input = input('Is zoh correction needed? True or False')\n", + "\n", + "if zoh_input == 'True':\n", + " zoh_input = True\n", + "elif zoh_input == 'False':\n", + " zoh_input = False\n", + "else:\n", + " print('zoh input is incorrect')\n", + "\n", + "fix_spk = spk_input\n", + "zoh = zoh_input \n", + "\n", + "fill_action = \"interp\"\n", + "fill_type = \"interpolated value\"\n", + "spk_window = 11\n", + "spk_std = 3\n", + "spk_var = \"Fluorescence:URU\"\n", + "\n", + "# get the new input extension\n", + "input_ext = READ_RSK(dest_dir, year, cruise_number, skipcasts, rsk_start_end_times_file, rsk_time1, rsk_time2, zoh=zoh,fix_spk=fix_spk)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "c02e77b4-1539-4f79-bc44-7a1c39bbbb13", + "metadata": { + "scrolled": true, + "slideshow": { + "slide_type": "" + }, + "tags": [ + "show" + ] + }, + "outputs": [ + { + "data": { + "image/png": "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JcM+9/l86N69u+m6qKlevTpee+01ZGVl4b333hNSZpEiRTBp0iQkJyfjlVdeCft80qRJSElJwZQpU1CtWjVMmTIFkiSZmtakSZMAAC+99BKuueYafPLJJzh9+rSu786ZMwf79+/HE088oWtbChXaJYLSVcWsWbMwdOhQVKlSBenp6WjdujW2bNkS9v3FixejVatWSE9PR9GiRXHttdfi+++/V53Wf//9hzvuuAMlS5ZExYoV0bdvX5w4cSJonMzMTNx7770oW7Ysihcvjvbt2+Pvv/8OK0vZd6xbtw633HILSpcubSir//jx43j88cdRq1YtpKamokKFCujYsSM2b95cMM7Ro0cxcOBAVK1aFSkpKahVqxaGDh2K7OzsoLJ8Ph8efPBBTJw4EfXq1UNqaiqmTZtW0AXBwoUL0bdvX5QvXx5FixYN+340r7/+OmrWrInixYujadOmWLNmTdg4X331FZo2bYqiRYuiRIkSaNOmjWqmfChJkvDyyy+jRo0aSEtLw5VXXon58+cbqp9iyZIluOGGG1C2bFkUKVIE1atXx80331ywLivHhpdffhmjRo1C9erVkZaWhkaNGmmuM4E2b96MWrVqoXHjxlG7QNm8eTPuuOMOVKxYEampqahevTp69epVMO9Pnz6NIUOGoGbNmkhLS0OZMmXQqFEjzJo1CwAwbtw4+Hw+/PPPP2FlP/XUU0hJSWF3DUREVCgwYEtERBRj8vLykJubG/SnZcGCBejevTvKli2L2bNn4+WXX8asWbMwbdo009Nfvnw58vLycMkllwQN79Onj+5+GtUsWbIESUlJqFu3bsGwP//8E/Xq1UNSUnAvTpdddlnB59HKBBBWV0mS0L9/f9x444246aabDNfVar30mjRpEtLT08MCw2oWLlyIihUrokmTJkKmrVfHjh2RmJiIFStWCCuzSpUqaNiwIVavXh20fu/ZswcLFy5Ely5dUL58efTu3Rv//POPqWmfOXMGs2bNwlVXXYX69eujb9++yMrKwpw5c3R9X5lmXl4errvuOqSkpKB06dK44447DHevEejZZ5/Frl278OGHH+L999/H1q1b0blz56D+nWfMmIG2bdsiPT0d06ZNw6effooyZcqgXbt2qgG4m2++GXXr1sXcuXPx9NNPY+bMmXjssccKPpckCV27dsX06dPx+OOP44svvkCTJk3Q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KX3WFi1a1OWakNcp64ib/RwzYEtERERERERERIUCu0GgaLywjjBgS0REREREREREROQRDNgSERERERERERFRTBk+fDiuuOKKgv/79OmDrl27FvwvSRLuu+8+lClTBj6fDxs2bFAd5kUM2BIREREREREREXlUnz594PP54PP5kJycjFq1amHIkCE4deqU21XzlDfffBNTp04t+H/BggWYOnUqvvnmG+zfvx/169dXHeZFSW5XgIiIiIiIiIiIiLS1b98eU6ZMQU5ODlauXIn+/fvj1KlTmDBhQtB4OTk5SE5OdqmW6pyqU8mSJYP+37ZtGypXroxrrrkm4rD8/Hzb62YUM2yJiIiIiIiIiIg8LDU1FZUqVUK1atXQs2dP3HnnnZg3b15BtwCTJ09GrVq1kJqaCkmScOLECdx3332oUKEC0tPT0bJlS/z2228F5f32229o0aIFSpQogfT0dDRs2BC//PILAGDXrl3o3LkzSpcujWLFiuGSSy5BRkYGAGDq1KkoVapUUN3mzZsX9KAus3WK5qWXXkLFihVRokQJ9OvXD2fPng36PLBLhD59+uChhx7C7t274fP5cP7556sO8ypm2BIREREREREREcWQIkWKICcnBwDwzz//4NNPP8XcuXORmJgIAOjUqRPKlCmDjIwMlCxZEu+99x5atWqFv//+G2XKlMGdd96JBg0aYMKECUhMTMSGDRsKsmAHDRqEc+fOYcWKFShWrBg2btyI4sWLG6qfmTpF8umnn2LYsGF499130axZM0yfPh1vvfUWatWqpTr+m2++idq1a+P999/H2rVrkZiYiJSUlLBhXsWALRERERERERERUYz4+eefMXPmTLRq1QoAcO7cOUyfPh3ly5cHACxZsgR//PEHDh48iNTUVADAq6++innz5uGzzz7Dfffdh927d+OJJ57ARRddBAC44IILCsrfvXs3br75Zlx66aUAoBkUjcRMnSIZN24c+vbti/79+wMAXnzxRSxevDgsy1ZRsmRJlChRAomJiahUqVLBcLVhXsSALRERERERERERFVoPPADs3evMtKpWBUK6ndXlm2++QfHixZGbm4ucnBx06dIFb7/9NsaPH48aNWoUBEYB4Ndff8XJkydRtmzZoDLOnDmDbdu2AQAGDx6M/v37Y/r06WjdujVuvfVW1K5dGwDw8MMP44EHHsDChQvRunVr3HzzzbjssssM1ddMnSLZtGkTBgwYEDSsadOmWLp0qaF6xQoGbImIiIiIiIiIqNAyE0B1WosWLTBhwgQkJyejSpUqQQ/xKlasWNC4+fn5qFy5MpYtWxZWjtL/7PDhw9GzZ098++23mD9/PoYNG4ZPPvkE3bp1Q//+/dGuXTt8++23WLhwIcaMGYPXXnsNDz30EBISEiBJUlCZStcMgczUifwYsCUiIiIiIiIiIvKwYsWKoU6dOrrGvfLKK3HgwAEkJSVFfLBW3bp1UbduXTz22GO44447MGXKFHTr1g0AUK1aNQwYMAADBgzAM888gw8++AAPPfQQypcvj6ysLJw6daogKLthwwZhddJSr149rFmzBr169SoYtmbNGsPlxIoEtytAREREREREREREYrRu3RpNmzZF165d8d1332Hnzp1YvXo1nnvuOfzyyy84c+YMHnzwQSxbtgy7du3CDz/8gLVr16JevXoAgEcffRTfffcdduzYgXXr1mHJkiUFnzVu3BhFixbFs88+i3/++QczZ87E1KlTLdcpmkceeQSTJ0/G5MmT8ffff2PYsGH466+/LM0nL2PAloiIiIiIiMgFDzwAjBnjdi2IKN74fD5kZGTg+uuvR9++fVG3bl3cfvvt2LlzJypWrIjExEQcOXIEvXr1Qt26ddGjRw906NABI0aMAADk5eVh0KBBqFevHtq3b48LL7wQ48ePBwCUKVMGM2bMQEZGBi699FLMmjULw4cPt1ynaG677TY8//zzeOqpp9CwYUPs2rULDzzwgKX55GU+KbTjCQqSmZmJkiVL4sSJE0hPT3e7OrbKyclBRkYGOnbsGNQXChHFHm7PRPGD2zNR/OD2TKGuvRaoWxeYMsXtmpBR3J5jz9mzZ7Fjxw7UrFkTaWlpbleHPCQ/Px+ZmZlIT09HQkJCxHXFqTghM2yJiIiIiIiIiIiIPIIBWyIiIiIiIiIiInLNJZdcguLFi6v+ffzxx25Xz3FJbleAiIiIiIiIiIiICq+MjAzk5OSofqanj9t4w4AtERERERERERERuaZGjRpuV8FT2CUCERERERERERERkUcwYEtERERERERERIWCJEluV4E8zgvrCAO2REREREREREQU15KTkwEAp0+fdrkm5HXKOqKsM25gH7ZERERERERERBTXEhMTUapUKRw8eBAAULRoUfh8Ppdr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luDLL7/EVVddhYSEBNSoUQNt2rRBeno6xowZg06dOomuJxE5rFw5npQREcUau/bb7MqFiIiIiMg5pjJsT506hQoVKgAAypQpg0OHDgEALr30Uqxbt05c7YiIiIgorvHmIBG5gfse4s1IIvIyUwHbCy+8EFu2bAEAXHHFFXjvvfewd+9eTJw4EZUrVxZaQSIiIqJ4JypwEGsXn7FWXyIiIiIiJ5jqEuHRRx/F/v37AQDDhg1Du3bt8PHHHyMlJQVTp04VWT8iIiKiuMagJRERERFZkZkJDBgAzJzpdk1IFFMB2zvvvLPgfYMGDbBz505s3rwZ1atXR7ly5YRVjogoXrEZHsW64cPlk8JKldyuCRERUWzjeSERWXXkCDBrFgO28cRUlwiBJElCkSJFcOWVVzJYS0SkA7PpouOFi/eNGAH8f+9IREREZBLPC4mISI3pgO2kSZNQv359pKWlIS0tDfXr18eHH34osm5ERESkgUFtIiIiclK8nXvE2+8hovhiqkuE//3vf3jjjTfw0EMPoWnTpgCAH3/8EY899hh27tyJF198UWgliYiIyI/ZOERERERERPHLVMB2woQJ+OCDD3DHHXcUDLvppptw2WWX4aGHHmLAlkjDV18BN93kdi2IKNYxI4TiCddnInIDb34SEZGXmeoSIS8vD40aNQob3rBhQ+Tm5lquFFG86tLF7RoQUbzghWZ8iYWgpR115HpMRERERBTOVMD2rrvuwoQJE8KGv//++7jzzjstV4qIiIiosIiFoGUs1JGISC/u04iIyOt0d4kwePDggvc+nw8ffvghFi5ciCZNmgAA1qxZg3///Re9evUSX0siIiIiisquTN1YyAAmIiIiKqx4Iyr+6A7Yrl+/Puj/hg0bAgC2bdsGAChfvjzKly+Pv/76S2D1iIioMGJwiMg4u0/UeSFAREREROQM3QHbpUuX2lkPIqJChQFJIiIiIoolPH8lInKOqT5siYjIPGapUbzghRsREREREZF4ujNsu3fvjqlTpyI9PR3du3ePOO7nn39uuWJEpA+Df0RERERERERE8UN3wLZkyZLw/X9kqGTJkrZViIiIiKiwKczZyoX5txMRFQazZgF33OF2LYiIYovugO2UKVNU3xMRERGReYW5pURh/u1ERIVFz54M2BLZjedU8cdUH7Y7duzA1q1bw4Zv3boVO3futFon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dCleeOGTtPX49NOpqF69JGU5vaxq1fphzx77cIV+XAHA/Pmr4bRvAMD06Z8D6F3+3qVLxfWkk6++moW1a8UArgULDgDQEXffvRDduomZ8bZtOxlALccy4tIf2rMnua95bVODrHvduhoATsXo0fvQvLlVm+N+fX6PheLi9Me88b1FRb0BVMOhh+bh3XdFbqtff20P4EDHMr766its3LjVsm4vvvgFGjdOzefYtm03/PyzfX/666/ltbM7dmzBlCnJyUx+/70WgJNx5ZUrcdllxkcc3X4HYrmBAzfj9tu/SXnN37VNfJivn63s2rUrhJoACU2L24MY1tasWYP9998fs2fPRteuXctfv+eee/Dyyy/jZ4tpMA855BBcdtlluPXWW8tf++qrr9CtWzesXbsWTSymmbYaYdu8eXNs2rQJderUkfyp4qVqVfsOZJcuZcjJAebMyakwisP4vn37xJ3w/PzUER9OZZu5GSXy1VcJnHhiLq68shSPP55+JEy69XsZmWIs6/ffi2G6JyC9Dvr70v3dzr/+VYoRIypuI6dy/dQ1SHmXXVaGp56qGNyTXcd0ZaYrN91+or93+3bnEbY1argb8eDGmWdWweTJOfjzz2LUMvQXi4uLMW3aNJx66qkpTxPce28ORo92vjs8a1YJOnf2d2rQt4G5Pm717FkFs2fbj575y19KMWaM9xG26b53N++146fM446rgu++y1FWJ6/let0+3btXwTff2H9Po0aVYuxY++/J7fpUbPu3307g/PNzsXGjeURBeub6uK2/03JLlgBHHOH8OT/9dA927Pik/HjWy73vvlLccENyO3s517qxZEkxDj00D1dfXYqnn7ZvNzZuLEbDhs7rnjq1BD17ahW2iYzv2Mv+m259L79cgvPOc9f++WlXZO/Tbs47furhtS56eTt3FrtOXSO7b2gs8803SzBwYPrv0et20Jdv1kzDb7+JINPzzycwdKjzGJh9+4pRtWoeDj5Yw7Jl6YcgW63T6jUv5eiefTaBa6/NRaNGGlavrnjTKkjZfvtt5uWPOSYX33+fwIIFxTjssOTrL7yQwDXX2G9rczl//AG0apWHO+4oxR13JNvK4mKgZk25x+LWrUCjRt7bhO3bgfr1o7lGAIClS4txwAHJ/19xRRW8/HJOeZutGzKkCl57zf68b94/mzbVsHJlSdp6GPuLfs4P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7kMTZZnt27drBx98sDZt2jStR48e5QFbHs9EmePmm2/WunXrZvt3Hs9EmaNfv37a5ZdfnvLamWeeqV188cWapvF4Jsok5oBt3I7fxx9/XCsoKND27NlTvsyYMWO0wsJCrayszPXnZEqESm7fvn2YN28eevXqlfJ6r169MHv27IhqRVS5bdu2DQBQr149AMDy5cuxbt26lOM0Pz8fPXr0KD9O582bh+Li4pRlCgsL0b59+/Jl5syZg4KCAnTp0qV8mWOPPRYFBQUpy7Rv3x6FhYXly/Tu3Rt79+5NeQSUiJxdd9116NevH0455ZSU13k8E2WO999/H0cffTTOOeccNGrUCEceeSSeeeaZ8r/zeCbKHN26dcNnn32GpUuXAgC+//57zJo1C3379gXA45kok8Xt+J0zZw569OiB/Pz8lGXWrFmDFStWuP5cuR62AWWhTZs2obS0FI0bN055vXHjxli3bl1EtSKqvDRNw6hRo9CtWze0b98eAMqPRavjdOXKleXLVK1aFXXr1q2wjP7+devWoVGjRhXW2ahRo5RlzOupW7cuqlatyjaByKWJEydi/vz5+Pbbbyv8jcczUeb47bff8MQTT2DUqFG47bbbMHfuXAwfPhz5+fm45JJLeDwTZZCbb74Z27ZtQ9u2bVGlShWUlpbinnvuwQUXXACA52eiTBa343fdunU44IADKqxH/1urVq1cfS4GbAkAkEgkUv6vaVqF14hIvWHDhuGHH37ArFmzKvzNz3FqXsZqeT/LEJG133//HSNGjMDUqVNRrVo12+V4PBPFX1lZGY4++mjce++9AIAjjzwSP/74I5544glccskl5cvxeCaKv9dffx2vvPIKXnvtNRx22GFYuHAhRo4cicLCQlx66aXly/F4JspccTp+repi9147TIlQyTVo0ABVqlSpcCdvw4YNFe4aEJFa119/Pd5//3188cUXaNasWfnrTZo0AQDH47RJkybYt28ftmzZ4rjM+vXrK6x348aNKcuY17NlyxYUFxezTSByYd68ediwYQM6deqE3Nxc5Obm4ssvv8T48eORm5ubcnfdiMczUfw0bdoUhx56aMpr7dq1w6pVqwDw/EyUSf7617/illtuwfnnn4/DDz8cgwcPxg033IAxY8YA4PFMlMnidvxaLbNhwwYAFUcBO2HAtpKrWrUqOnXqhGnTpqW8Pm3aNBx33HER1YqoctE0DcOGDcPbb7+Nzz//vMIjEq1atUKTJk1SjtN9+/bhyy+/LD9OO3XqhLy8vJRl1q5di8WLF5cv07VrV2zbtg1z584tX+abb77Btm3bUpZZvHgx1q5dW77M1KlTkZ+fj06dOsn/8ERZ5uSTT8aiRYuwcOHC8n9HH300LrroIixcuBCtW7fm8UyUIY4//nj88ssvKa8tXboULVu2BMDzM1Em2bVrF3JyUsMfVapUQVlZGQAez0SZLG7Hb9euXTFjxgzs27cvZZnCwsIKqRIcuZ6ejLLWxIkTtby8PO25557TlixZoo0cOVKrWbOmtmLFiqirRlQp/N///Z9WUFCgTZ8+XVu7dm35v127dpUvM3bsWK2goEB7++23tUWLFmkXXHCB1rRpU62oqKh8maFDh2rNmjXTPv30U23+/PnaSSedpHXs2FErKSkpX6ZPnz5ahw4dtDlz5mhz5szRDj/8cO30008v/3tJSYnWvn177eSTT9bmz5+vffrpp1qzZs20YcOGhbMxiLJQjx49tBEjRpT/n8czUWaYO3eulpubq91zzz3asmXLtFdffVWrUaOG9sorr5Qvw+OZKDNceuml2v77769NnjxZW758ufb2229rDRo00G666abyZXg8E8XX9u3btQULFmgLFizQAGjjxo3TFixYoK1cuVLTtHgdv1u3btUaN26sXXDBBdqiRYu0t99+W6tTp472wAMPePrMDNiSpmma9thjj2ktW7bUqlatqh111FHal19+GXWViCoNAJb/XnjhhfJlysrKtDvvvFNr0qSJlp+fr51wwgnaokWLUsrZvXu3NmzYMK1evXpa9erVtdNPP11btWpVyjKbN2/WLrroIq127dpa7dq1tYsuukjbsmVLyjIrV67U+vXrp1WvXl2rV6+eNmzYMG3Pnj2qPj5R1jMHbHk8E2WODz74QGvfvr2Wn5+vtW3bVnv66adT/s7jmSgzFBUVaSNGjNBatGihVatWTWvdurX2t7/9Tdu7d2/5MjyeieLriy++sLxmvvTSSzVNi9/x+8MPP2jdu3fX8vPztSZNmmijR4/WysrKPH3mhKb9L/MtEREREREREREREUWKOWyJiIiIiIiIiIiIYoIBWyIiIiIiIiIiIqKYYMCWiIiIiIiIiIiIKCYYsCUiIiIiIiIiIiKKCQZsiYiIiIiIiIiIiGKCAVsiIiIiIiIiIiKimGDAloiIiIiIiIiIiCgmGLAlIiIiIiIiIiIiigkGbImIiIiIiIiIiIhiggFbIiIiIspaGzZswDXXXIMWLVogPz8fTZo0Qe/evTFnzpyoq0ZEREREZCk36goQEREREaly1llnobi4GC+99BJat26N9evX47PPPsOff/4ZddWIiIiIiCxxhC0RERERZaWtW7di1qxZuO+++3DiiSeiZcuW6Ny5M2699Vb069evfJmrr74ajRs3RrVq1dC+fXtMnjwZALB582ZccMEFaNasGWrUqIHDDz8cEyZMSFlHz549MXz4cNx0002oV68emjRpgtGjR6csM3r06PIRvoWFhRg+fHgon5+IiIiIMhNH2BIRERFRVqpVqxZq1aqFd999F8ceeyzy8/NT/l5WVobTTjsN27dvxyuvvIIDDzwQS5YsQZUqVQAAe/bsQadOnXDzzTejTp06+PDDDzF48GC0bt0aXbp0KS/npZdewqhRo/DNN99gzpw5GDJkCI4//niceuqpeOutt/DQQw9h4sSJOOyww7Bu3Tp8//33oW4HIiIiIsosCU3TtKgrQURERESkwqRJk3DVVVdh9+7dOOqoo9CjRw+cf/756NChA6ZOnYrTTjsNP/30Ew455BBX5fXr1w/t2rXDAw88AECMsC0tLcXMmTPLl+ncuTNOOukkjB07FuPGjcNTTz2FxYsXIy8vT8lnJCIiIqLswpQIRERERJS1zjrrLKxZswbvv/8+evfujenTp+Ooo47Ciy++iIULF6JZs2a2wdrS0lLcc8896NChA+rXr49atWph6tSpWLVqVcpyHTp0SPl/06ZNsWHDBgDAOeecg927d6N169a46qqr8M4776CkpETNhyUiIiKirMCALRERERFltWrVquHUU0/F3//+d8yePRtDhgzBnXfeierVqzu+78EHH8RDDz2Em266CZ9//jkWLlyI3r17Y9++fSnLmUfOJhIJlJWVAQCaN2+OX375BY899hiqV6+Oa6+9FieccAKKi4vlfkgiIiIiyhoM2BIRERFRpXLooYdi586d6NChA1avXo2lS5daLjdz5kwMHDgQF198MTp27IjWrVtj2bJlntdXvXp1DBgwAOPHj8f06dMxZ84cLFq0KOjHICIiIqIsxUnHiIiIiCgrbd68Geeccw4uv/xydOjQAbVr18Z3332H+++/HwMHDkSPHj1wwgkn4KyzzsK4ceNw0EEH4eeff0YikUCfPn1w0EEHYdKkSZg9ezbq1q2LcePGYd26dWjXrp3rOrz44osoLS1Fly5dUKNGDbz88suoXr06WrZsqfCTExEREVEmY8CWiIiIiLJSrVq10KVLFzz00EP49ddfUVxcjObNm+Oqq67CbbfdBkBMSnbjjTfiggsuwM6dO3HQQQdh7NixAIA77rgDy5cvR+/evVGjRg1cffXVGDRoELZt2+a6Dvvttx/Gjh2LUaNGobS0FIcffjg++OAD1K9fX8lnJiIiIqLMl9A0TYu6EkRERERERERERETEHLZEREREREREREREscGALREREREREREREVFMMGBLREREREREREREFBMM2BIRERERERERERHFBAO2RERERERERERERDHBgC0RERERERERERFRTDBgS0RERERERERERBQTDNgSERERERERERERxQQDtkREREREREREREQxwYAtERERERERERERUUwwYEtEREREREREREQUEwzYEhEREREREREREcXE/wP5Fk4TMunDXQAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Using despiked and zero-order holds corrected variables\n" + ] + } + ], + "source": [ + " \n", + "if zoh:\n", + "\n", + " MERGE_FILES()\n", + " ADD_6LINEHEADER(output_ext = input_ext)\n", + " PLOT_PRESSURE_DIFF(dest_dir, year, cruise_number, input_ext)\n", + "\n", + " if verbose:\n", + " if fix_spk==True:\n", + " print(\"Using despiked and zero-order holds corrected variables\")\n", + " elif fix_spk==False:\n", + " print(\"Using zero-order holds corrected variables\")\n", + "\n", + "\n", + "else:\n", + " if fix_spike==True:\n", + " MERGE_FILES()\n", + " ADD_6LINEHEADER(output_ext = input_ext)\n", + " PLOT_PRESSURE_DIFF(dest_dir, year, cruise_number, input_ext)\n", + " print('using despiked fluorescence')\n", + " elif fix_spike==False:\n", + " \n", + " print(\"using original variables\")\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "63bdde02-f750-46b0-b1ba-db050a986691", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Create Cast Variables and Format processing Plots**\n", + "* Set input_extension needed depending on a zero-order-holds correction\n", + "* format processing plots" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "28bbdb49-82ec-428d-b082-e9f874ffec78", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2024-017CTD_DATA-6linehdr_corr_hold_spk.csv\n", + "have_oxy: True, have_fluor: True\n" + ] + } + ], + "source": [ + "def CREATE_CAST_VARIABLES(\n", + " year: str, cruise_number: str, dest_dir: str, input_ext: str\n", + ") -> tuple:\n", + " \"\"\"\n", + " Read in a csv file and output data dictionaries to hold profile data\n", + " Inputs:\n", + " - dest_dir\n", + " - year\n", + " - cruise_number\n", + " - input_ext: '_CTD_DATA-6linehdr.csv' or '_CTD_DATA-6linehdr_corr_hold.csv', or hold & spike\n", + " Outputs:\n", + " - three dictionaries containing casts, downcasts and upcasts\n", + " \"\"\"\n", + " input_name = str(year) + \"-\" + str(cruise_number) + input_ext\n", + " print(input_name)\n", + " input_filename = dest_dir + input_name\n", + " ctd_data = pd.read_csv(\n", + " input_filename, header=None, low_memory=False\n", + " ) # read data without header\n", + " ctd_data = ctd_data.rename(\n", + " columns=ctd_data.iloc[1]\n", + " ) # assign the second row as column names\n", + " ctd_data = ctd_data.rename(\n", + " columns={\n", + " \"Oxygen:Dissolved:Saturation\": \"Oxygen\",\n", + " \"Salinity:CTD\": \"Salinity\",\n", + " \"TIME:UTC\": \"TIME\",\n", + " }\n", + " )\n", + " ctd = ctd_data.iloc[6:]\n", + " # drop NaNs from Zero order holds correction\n", + " # (not including O or F in case they aren't present - but will capture)\n", + " if input_ext == \"_CTD_DATA-6linehdr.csv\":\n", + " pass # ctd = ctd\n", + " elif input_ext == \"_CTD_DATA-6linehdr_corr_hold.csv\":\n", + " ctd = ctd.dropna(\n", + " axis=0,\n", + " subset=[\n", + " \"Conductivity\",\n", + " \"Temperature\",\n", + " \"Pressure_Air\",\n", + " \"Pressure\",\n", + " \"Depth\",\n", + " \"Salinity\",\n", + " ],\n", + " how=\"all\",\n", + " ) # I don't think this does anything - NaNs now dropped in Correct_Hold stage # this was changed\n", + " # fill with an interpolated value instead of NaN\n", + " ctd = ctd.copy()\n", + " cols = ctd.columns[0:-4]\n", + " # cols_names = ctd.columns.tolist()\n", + " ctd[cols] = ctd[cols].apply(pd.to_numeric, errors=\"coerce\", axis=1)\n", + " ctd[\"Cast_direction\"] = ctd[\"Cast_direction\"].str.strip()\n", + "\n", + " # Fix the iteration to account for event numbers that aren't sequential or start at n>1\n", + " unique_event_numbers = ctd[\"Event_number\"].unique()\n", + "\n", + " var_holder = {}\n", + " for i in unique_event_numbers:\n", + " # Assign values of type DataFrame\n", + " var_holder[\"cast\" + str(i)] = ctd.loc[(ctd[\"Event_number\"] == str(i))]\n", + " # var_holder['Processing_history'] = \"\"\n", + "\n", + " # Downcast dictionary\n", + " var_holder_d = {}\n", + " # for i in range(1, n + 1):\n", + " for i in unique_event_numbers:\n", + " var_holder_d[\"cast\" + str(i)] = ctd.loc[\n", + " (ctd[\"Event_number\"] == str(i)) & (ctd[\"Cast_direction\"] == \"d\")\n", + " ]\n", + " # var_holder_d['Processing_history'] = \"\"\n", + "\n", + " # Upcast dictionary\n", + " var_holder_u = {}\n", + " # for i in range(1, n + 1, 1):\n", + " for i in unique_event_numbers:\n", + " var_holder_u[\"cast\" + str(i)] = ctd.loc[\n", + " (ctd[\"Event_number\"] == str(i)) & (ctd[\"Cast_direction\"] == \"u\")\n", + " ]\n", + " # var_holder_u['Processing_history'] = \"\"\n", + "\n", + " return var_holder, var_holder_d, var_holder_u\n", + "\n", + "cast, cast_d, cast_u = CREATE_CAST_VARIABLES(\n", + " year, cruise_number, dest_dir, input_ext\n", + " )\n", + "for cast_i in cast_d.keys():\n", + " have_oxy = True if \"Oxygen\" in cast_d[cast_i].columns else False\n", + " have_fluor = True if \"Fluorescence\" in cast_d[cast_i].columns else False\n", + " \n", + " #if verbose:\n", + " \n", + " print(f\"have_oxy: {have_oxy}, have_fluor: {have_fluor}\")\n", + " break\n" + ] + }, + { + "cell_type": "markdown", + "id": "5a4763cc-55e6-4820-abee-b30c32597aae", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Call the plotting functions**" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "764b53a5-129b-419d-b4ff-fd367617ba1a", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "from RBR_plots import format_processing_plot, do_ts_plot" + ] + }, + { + "cell_type": "markdown", + "id": "3e98a5b1-8e26-4314-95eb-c26bdcb21998", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Pre-Processing Plots**" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "28377817-ca65-4eb3-a13f-b54103bf2200", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "def first_plots(year: str, cruise_number: str, dest_dir: str, input_ext: str) -> None:\n", + " \n", + "\n", + " # Create a folder for figures if it doesn't already exist\n", + " figure_dir = os.path.join(dest_dir, \"FIG\")\n", + " if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + "\n", + " # Input ext specifies whether to use 6lineheader file with or without\n", + " # the zero-order hold removed\n", + " # cast, cast_d, cast_u = CREATE_CAST_VARIABLES(\n", + " # year, cruise_number, dest_dir, input_ext\n", + " # )\n", + "\n", + " # number_of_colors = len(cast)\n", + " # color = [\"#\" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)])\n", + " # for i in range(number_of_colors)]\n", + "\n", + " # get variables; cast numbering might not start from 1!\n", + " cast_numbers = [cast_i for cast_i in cast.keys()]\n", + " vars_available = list(dict.fromkeys(cast[cast_numbers[0]]))\n", + " # vars_available = list(dict.fromkeys(cast['cast1']))\n", + "\n", + " # Iterate through all the channels, plot data from all casts on one plot per channel\n", + " for j, var in enumerate(VARIABLES_POSSIBLE):\n", + " if var in vars_available:\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast.keys():\n", + " ax.plot(\n", + " cast_d[cast_i].loc[:, var],\n", + " cast_d[cast_i].Pressure,\n", + " color=VARIABLE_COLOURS[j],\n", + " )\n", + " # label='cast' + str(i + 1))\n", + " ax.plot(\n", + " cast_u[cast_i].loc[:, var],\n", + " cast_u[cast_i].Pressure,\n", + " color=VARIABLE_COLOURS[j],\n", + " ) # '--'\n", + " # label='cast' + str(i + 1))\n", + " # ax.plot(cast_d['cast1'].Salinity, cast_d['cast1'].Pressure, color='blue', label='cast1')\n", + " # ax.plot(cast_u['cast1'].Salinity, cast_u['cast1'].Pressure, '--', color='blue', label='cast1')\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=var,\n", + " x_var_units=VARIABLE_UNITS[j],\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"Pre-Processing\",\n", + " invert_yaxis=True,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, f\"Pre_Processing_{var[0]}.png\"))\n", + " plt.close(fig)\n", + "\n", + " # TS Plot add labeled isopycnals to T-S plots as in IOS Shell\n", + " do_ts_plot(\n", + " figure_dir, \"Pre-Processing T-S Plot\", \"Pre_Processing_T-S.png\", cast_d, cast_u\n", + " )\n", + "\n", + " # pressure check\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast.keys():\n", + " ax.plot(\n", + " cast_d[cast_i].Conductivity[0:20],\n", + " cast_d[cast_i].Pressure[0:20],\n", + " color=\"goldenrod\",\n", + " ) # , label='cast' + str(i + 1))\n", + " ax.plot(\n", + " cast_u[cast_i].Conductivity[-20:-1],\n", + " cast_u[cast_i].Pressure[-20:-1],\n", + " color=\"goldenrod\",\n", + " ) # label='cast' + str(i + 1))\n", + " # ax.plot(cast_d['cast1'].Conductivity[0:10], cast_d['cast1'].Pressure[0:10],\n", + " # color='blue', label='cast1')\n", + " # ax.plot(cast_d['cast2'].Conductivity[0:10], cast_d['cast2'].Pressure[0:10],\n", + " # color='red', label='cast2')\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=\"Conductivity\",\n", + " x_var_units=\"mS/cm\",\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"Checking need for Pressure correction\",\n", + " invert_yaxis=True,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, \"PressureCorrection_need_CvP.png\"))\n", + " plt.close(fig)\n", + "\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast.keys():\n", + " ax.plot(\n", + " cast_d[cast_i].Conductivity[0:20],\n", + " cast_d[cast_i].Depth[0:20],\n", + " color=\"goldenrod\",\n", + " )\n", + " # label='cast' + str(i + 1))\n", + " ax.plot(\n", + " cast_u[cast_i].Conductivity[-20:-1],\n", + " cast_u[cast_i].Depth[-20:-1],\n", + " color=\"goldenrod\",\n", + " ) # label='cast' + str(i + 1))\n", + " # ax.plot(cast_d['cast1'].Conductivity[0:10], cast_d['cast1'].Depth[0:10],\n", + " # color='blue', label='cast1')\n", + " # ax.plot(cast_d['cast2'].Conductivity[0:10], cast_d['cast2'].Depth[0:10],\n", + " # color='red', label='cast2')\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=\"Conductivity\",\n", + " x_var_units=\"mS/cm\",\n", + " y_var_name=\"Depth\",\n", + " y_var_units=\"m\",\n", + " plot_title=\"Checking need for Pressure correction\",\n", + " invert_yaxis=True,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, \"PressureCorrection_need_CvD.png\"))\n", + " plt.close(fig)\n", + " return\n", + "\n", + "first_plots(year, cruise_number, dest_dir, input_ext)\n" + ] + }, + { + "cell_type": "markdown", + "id": "4b3a7e39-a2ef-47cd-968f-5d6d27487d64", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "## Start Data Processing
" + ] + }, + { + "cell_type": "markdown", + "id": "ce24d59b-6882-4645-a805-8d4cab540a98", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Correct Time Offset**
\n", + "This function will only run if there is a correct_start_time_file. " + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "effcac8b-1b57-46f0-adc8-eb7a67f68415", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "def CORRECT_TIME_OFFSET(\n", + " dest_dir: str,\n", + " var: dict,\n", + " var_downcast: dict,\n", + " var_upcast: dict,\n", + " metadata_dict: dict,\n", + " correct_start_time_file: str,\n", + "):\n", + "\n", + " # Read in the csv file of correct times\n", + " correct_time_df = pd.read_csv(\n", + " os.path.join(dest_dir, correct_start_time_file), header=None,\n", + " names=[\"cast_number\", \"correct_time\"]\n", + " )\n", + "\n", + " correct_time_df[\"time_dt\"] = pd.to_datetime(correct_time_df[\"correct_time\"])\n", + "\n", + " var1 = deepcopy(var)\n", + " var2 = deepcopy(var_downcast)\n", + " var3 = deepcopy(var_upcast)\n", + "\n", + " # Initialize processing history log if it doesn't already exist\n", + " if \"Processing_history\" not in metadata_dict.keys():\n", + " metadata_dict[\"Processing_history\"] = \"\"\n", + "\n", + " # Iterate through each cast\n", + " # index set as j instead of i, because the cast number might not equal the index\n", + " for j, cast_i in enumerate(var1.keys()):\n", + " # if type(correction_value) in [int, float]:\n", + " # # Apply one correction value to all casts\n", + " # correction_i = correction_value\n", + " # elif type(correction_value) in [list, tuple, np.ndarray]:\n", + " # # Apply different correction values to different casts\n", + " # correction_i = correction_value[i]\n", + " # else:\n", + " # print(\"Correction value\", correction_value, \"format not supported\")\n", + " # return\n", + " correct_time_j = correct_time_df.loc[j, \"time_dt\"]\n", + "\n", + " if correct_time_j == np.nan:\n", + " # Skip iteration if correction not needed for cast_i\n", + " continue\n", + " else:\n", + " # Find the offset of the correct time\n", + " # Index may not necessarily start at 0\n", + " var1_first_index = var1[cast_i].index[0]\n", + " data_start_time = pd.to_datetime(\n", + " var1[cast_i].loc[var1_first_index, \"Date\"] +\n", + " \" \" +\n", + " var1[cast_i].loc[var1_first_index, \"TIME\"]\n", + " )\n", + " # Take the difference between the two times\n", + " time_offset_j = correct_time_df.loc[j, \"time_dt\"] - data_start_time\n", + " # print(\"Time advance needed:\", time_offset_j)\n", + "\n", + " # Apply the difference to the cast, downcast and upcast\n", + " for v in [var1, var2, var3]:\n", + " date = v[cast_i][\"Date\"]\n", + " time = v[cast_i][\"TIME\"]\n", + " date_time = [f\"{d} {t}\" for d, t in zip(date, time)]\n", + " # print('time string data:', date_time[:10])\n", + " date_time_pd = pd.to_datetime(date_time)\n", + " # print('datetime data:', date_time_pd[:10])\n", + " # Add the correction in units of hours\n", + " corrected_date_time = date_time_pd + time_offset_j\n", + " # print('corrected datetime:', corrected_date_time[:10])\n", + " # Copy formatting from ADD_6LINEHEADER_2() function\n", + " v[cast_i].loc[:, \"Date\"] = corrected_date_time.strftime(\"%d/%m/%Y\")\n", + " v[cast_i].loc[:, \"TIME\"] = corrected_date_time.strftime(\"%H:%M:%S\")\n", + " # print(\"Date:\", v[cast_i].loc[:, \"Date\"])\n", + " # print('TIME:', v[cast_i].loc[:, \"TIME\"])\n", + "\n", + " # Update processing history log\n", + " metadata_dict['Processing_history'] += (\n", + " f\"-CORRECT_TIME_OFFSET_{cast_i}: {time_offset_j} hours|\"\n", + " )\n", + "\n", + " metadata_dict[\"CORRECT_TIME_OFFSET_Time\"] = datetime.now()\n", + "\n", + " return var1, var2, var3\n", + "\n", + " if verbose:\n", + " print(\"Time offset(s) corrected\")\n", + " \n", + "if start_time_correction_file is not None:\n", + " cast_correct_t, cast_d_correct_t, cast_u_correct_t = CORRECT_TIME_OFFSET(\n", + " dest_dir, cast, cast_d, cast_u, metadata_dict, start_time_correction_file\n", + " )\n", + " if verbose:\n", + " print(\"Time offset(s) corrected\")\n", + "else:\n", + " cast_correct_t, cast_d_correct_t, cast_u_correct_t = cast, cast_d, cast_u\n", + "\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "5c0bcf81-5384-4650-bf02-3b3fd7f390d5", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Correct pressure and depth data**
\n", + "
\n", + "This function will only run if negative pressures are noticed in the pre-processing plots. " + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "3eeb1cd3-7dbe-41e5-a2d8-f2cf107dc008", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "pd_correction_value = 0\n", + "\n", + "def CALIB(\n", + " var: dict,\n", + " var_downcast: dict,\n", + " var_upcast: dict,\n", + " metadata_dict: dict,\n", + " pd_correction_value=0,\n", + ") -> tuple:\n", + "\n", + " var1 = deepcopy(var)\n", + " var2 = deepcopy(var_downcast)\n", + " var3 = deepcopy(var_upcast)\n", + "\n", + " for cast_i in var1.keys():\n", + " var1[cast_i].Pressure = var1[cast_i].Pressure + pd_correction_value\n", + " var1[cast_i].Depth = var1[cast_i].Depth + pd_correction_value\n", + " var2[cast_i].Pressure = var2[cast_i].Pressure + pd_correction_value\n", + " var2[cast_i].Depth = var2[cast_i].Depth + pd_correction_value\n", + " var3[cast_i].Pressure = var3[cast_i].Pressure + pd_correction_value\n", + " var3[cast_i].Depth = var3[cast_i].Depth + pd_correction_value\n", + "\n", + " # check if a correction was done - need to see if this is the first addition of \"processing history'\n", + " if \"Processing_history\" not in metadata_dict.keys():\n", + " metadata_dict[\"Processing_history\"] = \"\"\n", + "\n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-CALIB parameters:|\"\n", + " \" Calibration type = Correct|\"\n", + " \" Calibrations applied:|\"\n", + " f\" Pressure (decibar) = {pd_correction_value}|\"\n", + " f\" Depth (meters) = {pd_correction_value}|\"\n", + " )\n", + "\n", + " meta_dict[\"CALIB_Time\"] = datetime.now()\n", + "\n", + " return var1, var2, var3\n", + " \n", + "if pd_correction_value != 0:\n", + " cast_pc, cast_d_pc, cast_u_pc = CALIB(\n", + " cast_correct_t, cast_d_correct_t, cast_u_correct_t, meta_dict,\n", + " pd_correction_value\n", + " ) # 0 if no neg pressures\n", + " if verbose:\n", + " print(\n", + " \"The following correction value has been applied to Pressure and Depth:\",\n", + " pd_correction_value,\n", + " sep=\"\\n\",\n", + " )\n", + "else:\n", + " cast_pc, cast_d_pc, cast_u_pc = cast_correct_t, cast_d_correct_t, cast_u_correct_t\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "175be718-305a-4ec6-9c97-1dac8bd79a96", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**CLIP**
\n", + "Remove the unstable measurement from sea surface and bottom**
\n", + "Then PLOT the clipped cast for comparison
" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "30e84a43", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Casts clipped\n" + ] + } + ], + "source": [ + "limit_pressure_change= 0.02\n", + "\n", + "def CLIP_CAST(\n", + " var: dict, metadata_dict: dict, limit_pressure_change: float, cast_direction: str\n", + "):\n", + " var_clip = deepcopy(var)\n", + " for cast_i in var.keys():\n", + " pressure = var_clip[cast_i].Pressure\n", + " # print(\"start pressure\", pressure[0:15])\n", + " diff = var_clip[cast_i].Pressure.diff()\n", + " index_start = pressure.index[0]\n", + " # index_end = pressure.index[-1]\n", + " if cast_direction == \"down\":\n", + " limit_drop = limit_pressure_change\n", + " diff_mask = diff > limit_drop\n", + " elif cast_direction == \"up\":\n", + " limit_rise = limit_pressure_change\n", + " diff_mask = diff < limit_rise\n", + " else:\n", + " print(f\"cast_direction {cast_direction} is invalid. Ending program\")\n", + " return\n", + " diff_rise = diff.loc[diff_mask]\n", + " for j in range(len(diff.loc[diff_mask])):\n", + " index_1 = diff_rise.index[j]\n", + " if (\n", + " (diff_rise.index[j + 1] == index_1 + 1)\n", + " and (diff_rise.index[j + 2] == index_1 + 2)\n", + " and (diff_rise.index[j + 3] == index_1 + 3)\n", + " and (diff_rise.index[j + 4] == index_1 + 4)\n", + " and (diff_rise.index[j + 5] == index_1 + 5)\n", + " and (diff_rise.index[j + 6] == index_1 + 6)\n", + " and (diff_rise.index[j + 7] == index_1 + 7)\n", + " and (diff_rise.index[j + 8] == index_1 + 8)\n", + " ):\n", + " index_end_1 = index_1 - 1\n", + " break\n", + " cut_start = index_end_1 - index_start\n", + "\n", + " for j in range(-1, -len(diff.loc[diff_mask]), -1):\n", + " index_2 = diff_rise.index[j]\n", + " if (\n", + " (diff_rise.index[j - 1] == index_2 - 1)\n", + " and (diff_rise.index[j - 2] == index_2 - 2)\n", + " and (diff_rise.index[j - 3] == index_2 - 3)\n", + " and (diff_rise.index[j - 4] == index_2 - 4)\n", + " and (diff_rise.index[j - 5] == index_2 - 5)\n", + " ):\n", + " index_end_2 = index_2 + 1\n", + " break\n", + " cut_end = index_end_2 - index_start\n", + " var_clip[cast_i] = var_clip[cast_i][cut_start:cut_end]\n", + " # print(\"final pressure\", var_clip[cast_i].Pressure[0:15])\n", + "\n", + " # check if a correction was done - need to see if this is the first addition of \"processing history'\n", + " if \"Processing_history\" not in metadata_dict.keys():\n", + " metadata_dict[\"Processing_history\"] = \"\"\n", + "\n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-CLIP_{}{}\".format(cast_direction, cast_i)\n", + " + \": First Record = {}\".format(str(cut_start))\n", + " + \", Last Record = {}\".format(str(cut_end))\n", + " + \"|\"\n", + " )\n", + " metadata_dict[\n", + " \"CLIP_{}_Time{}\".format(cast_direction[0].upper(), cast_i.split(\"cast\")[-1])\n", + " ] = datetime.now()\n", + " return var_clip\n", + "cast_d_clip = CLIP_CAST(\n", + " cast_d_pc, meta_dict, limit_pressure_change=0.02, cast_direction=\"down\"\n", + " )\n", + "cast_u_clip = CLIP_CAST(\n", + " cast_u_pc, meta_dict, limit_pressure_change=-0.02, cast_direction=\"up\"\n", + " )\n", + "\n", + "def plot_clip(cast_d_clip: dict, cast_d_pc: dict, dest_dir: str) -> None:\n", + "\n", + " figure_dir = os.path.join(dest_dir, \"FIG\")\n", + " if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + "\n", + " fig, ax = plt.subplots() # Before\n", + " for cast_i in cast_d_pc.keys():\n", + " ax.plot(cast_d_pc[cast_i].TIME, cast_d_pc[cast_i].Pressure, color=\"blue\")\n", + " # ax.plot(cast_u_pc[cast_i].TIME, cast_u_pc[cast_i].Pressure,\n", + " # color='blue')\n", + " # How to only apply tick reduction if it's too crowded?\n", + " xticks = ax.get_xticks()\n", + " ax.set_xticks(ticks=xticks[:: int(len(xticks) / 4)]) # Make ticks farther apart\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=\"Time\",\n", + " x_var_units=None,\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"Downcasts before clip\",\n", + " invert_yaxis=True,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, \"Before_Clip_P_vs_t.png\"))\n", + " plt.close(fig)\n", + "\n", + " fig, ax = plt.subplots() # After\n", + " for cast_i in cast_d_pc.keys():\n", + " ax.plot(cast_d_clip[cast_i].TIME, cast_d_clip[cast_i].Pressure, color=\"blue\")\n", + " # ax.plot(cast_u_clip[cast_i].TIME, cast_u_clip[cast_i].Pressure,\n", + " # color='blue')\n", + " xticks = ax.get_xticks()\n", + " ax.set_xticks(ticks=xticks[:: int(len(xticks) / 4)])\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=\"Time\",\n", + " x_var_units=None,\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"Downcasts after clip\",\n", + " invert_yaxis=True,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, \"After_Clip_P_vs_t.png\"))\n", + " plt.close(fig)\n", + "plot_clip(cast_d_clip, cast_d_pc, dest_dir)\n", + "\n", + "if verbose:\n", + " print(\"Casts clipped\")" + ] + }, + { + "cell_type": "markdown", + "id": "0a37c0a7-a101-4d4f-b0ad-1d7bfcf4796f", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Filter the data**
\n", + "* Filter the temperature, conductivity, pressure, and fluorescence (if available)
\n", + " data using a low pass filter: FIR (0) or Moving Average (1)
\n", + "* Confirm the sample rate from the rsk file.
\n", + "* Plot and save the files after filtering. " + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "823b5ba1-344b-4109-86d3-1888fadfc91a", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Casts filtered, assuming a sample rate of 8 records per second\n" + ] + } + ], + "source": [ + "filter_type = 1 # Moving average, 0 for FIR\n", + "sample_rate = 8 #from rsk file, could be 6Hz\n", + "time_constant = 1/8\n", + "window_width = 3\n", + "\n", + "def FILTER(\n", + " var_downcast: dict,\n", + " var_upcast: dict,\n", + " metadata_dict: dict,\n", + " have_fluor: bool,\n", + " window_width,\n", + " sample_rate: int,\n", + " time_constant: float,\n", + " filter_type: int,\n", + "):\n", + "\n", + " # cast_number = len(var_downcast.keys())\n", + " if filter_type == 0:\n", + " Wn = (1.0 / time_constant) / (sample_rate * 2)\n", + " # Numerator (b) and denominator (a) polynomials of the IIR filter\n", + " b, a = signal.butter(2, Wn, \"low\")\n", + " filter_name = \"FIR\"\n", + " elif filter_type == 1:\n", + " b = (\n", + " np.ones(window_width)\n", + " ) / window_width # numerator co-effs of filter transfer function\n", + " a = np.ones(1) # denominator co-effs of filter transfer function\n", + " filter_name = \"Moving average filter\"\n", + " else:\n", + " print(\"Invalid filter type:\", filter_type)\n", + " return\n", + "\n", + " var1 = deepcopy(var_downcast)\n", + " var2 = deepcopy(var_upcast)\n", + "\n", + " # Filter select variables in each cast\n", + " for cast_i in var1.keys():\n", + " var1[cast_i].Temperature = signal.filtfilt(b, a, var1[cast_i].Temperature)\n", + " var1[cast_i].Conductivity = signal.filtfilt(b, a, var1[cast_i].Conductivity)\n", + " var1[cast_i].Pressure = signal.filtfilt(b, a, var1[cast_i].Pressure)\n", + " var2[cast_i].Temperature = signal.filtfilt(b, a, var2[cast_i].Temperature)\n", + " var2[cast_i].Conductivity = signal.filtfilt(b, a, var2[cast_i].Conductivity)\n", + " var2[cast_i].Pressure = signal.filtfilt(b, a, var2[cast_i].Pressure)\n", + " if have_fluor:\n", + " var1[cast_i].Fluorescence = signal.filtfilt(b, a, var1[cast_i].Fluorescence)\n", + " var2[cast_i].Fluorescence = signal.filtfilt(b, a, var2[cast_i].Fluorescence)\n", + "\n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-FILTER parameters:|\"\n", + " f\" {filter_name} was used.|\"\n", + " f\" Filter width = {window_width}.|\"\n", + " \"The following channel(s) were filtered.|\"\n", + " \" Pressure|\"\n", + " \" Temperature|\"\n", + " \" Conductivity|\"\n", + " )\n", + " if have_fluor:\n", + " metadata_dict[\"Processing_history\"] += \" Fluorescence|\"\n", + "\n", + " metadata_dict[\"FILTER_Time\"] = datetime.now()\n", + "\n", + " return var1, var2\n", + "\n", + "def plot_filter(\n", + " cast_d_filtered: dict,\n", + " cast_u_filtered: dict,\n", + " cast_d_clip: dict,\n", + " cast_u_clip: dict,\n", + " dest_dir: str,\n", + " have_fluor: bool,\n", + ") -> None:\n", + "\n", + " figure_dir = os.path.join(dest_dir, \"FIG\")\n", + " if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + "\n", + " # vars_available = list(dict.fromkeys(cast_d_filtered['cast1']))\n", + " # n_casts = len(cast_d_filtered)\n", + "\n", + " filtered_vars = [\"Temperature\", \"Conductivity\"]\n", + " units = [VARIABLE_UNITS[1], VARIABLE_UNITS[2]]\n", + " colours = [VARIABLE_COLOURS[1], VARIABLE_COLOURS[2]]\n", + " if have_fluor:\n", + " filtered_vars.append(\"Fluorescence\")\n", + " units.append(VARIABLE_UNITS[4])\n", + " colours.append(VARIABLE_COLOURS[4])\n", + "\n", + " for j, var in enumerate(filtered_vars): # Before\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast_d_clip.keys():\n", + " ax.plot(\n", + " cast_d_clip[cast_i].loc[:, var],\n", + " cast_d_clip[cast_i].loc[:, \"Pressure\"],\n", + " color=colours[j],\n", + " )\n", + " ax.plot(\n", + " cast_u_clip[cast_i].loc[:, var],\n", + " cast_u_clip[cast_i].loc[:, \"Pressure\"],\n", + " color=colours[j],\n", + " )\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=var,\n", + " x_var_units=units[j],\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"Pre-Filter\",\n", + " invert_yaxis=True,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, f\"Pre_Filter_{var[0]}.png\"))\n", + " plt.close(fig)\n", + "\n", + " for j, var in enumerate(filtered_vars): # After\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast_d_clip.keys():\n", + " ax.plot(\n", + " cast_d_filtered[cast_i].loc[:, var],\n", + " cast_d_filtered[cast_i].loc[:, \"Pressure\"],\n", + " color=colours[j],\n", + " )\n", + " ax.plot(\n", + " cast_u_filtered[cast_i].loc[:, var],\n", + " cast_u_filtered[cast_i].loc[:, \"Pressure\"],\n", + " color=colours[j],\n", + " )\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=var,\n", + " x_var_units=units[j],\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"Post-Filter\",\n", + " invert_yaxis=True,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, f\"Post_Filter_{var[0]}.png\"))\n", + " plt.close(fig)\n", + "\n", + " return\n", + "\n", + "sample_rate = int(np.round(1 / float(meta_dict[\"Sampling_Interval\"])))\n", + "cast_d_filtered, cast_u_filtered = FILTER(\n", + " cast_d_clip,\n", + " cast_u_clip,\n", + " meta_dict,\n", + " have_fluor,\n", + " window_width,\n", + " sample_rate=sample_rate,\n", + " time_constant=float(meta_dict[\"Sampling_Interval\"]),\n", + " filter_type=filter_type,\n", + " ) # n = 5 should be good.\n", + "\n", + " # Plot the filtered data\n", + "plot_filter(\n", + " cast_d_filtered, cast_u_filtered, cast_d_clip, cast_u_clip, dest_dir, have_fluor\n", + " )\n", + "\n", + "if verbose:\n", + " print(\n", + " f\"Casts filtered, assuming a sample rate of {sample_rate} records per second\"\n", + " )\n" + ] + }, + { + "cell_type": "markdown", + "id": "873f7048-7dd4-450f-8597-d3530720e149", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Shift Conductivity**
\n", + "Delay the conductivity signal, and recalculate salinity
\n", + "Plot afterwards for comparison" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "bdd23667-2745-4c01-a862-7f27bfcb6ba9", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Conductivity shifted 2 scans\n" + ] + } + ], + "source": [ + "def SHIFT_CONDUCTIVITY(\n", + " var_downcast: dict, var_upcast: dict, metadata_dict: dict, shifted_scan_number=2\n", + ") -> tuple:\n", + " var1 = deepcopy(var_downcast)\n", + " var2 = deepcopy(var_upcast)\n", + " # Apply the shift to each cast\n", + " for cast_i in var1.keys():\n", + " index_1 = var1[cast_i].Conductivity.index[0]\n", + " v1 = var1[cast_i].Conductivity[index_1]\n", + " index_2 = var2[cast_i].Conductivity.index[0]\n", + " v2 = var2[cast_i].Conductivity[index_2]\n", + " # shift C for n scans\n", + " var1[cast_i].Conductivity = var1[cast_i].Conductivity.shift(\n", + " periods=shifted_scan_number, fill_value=v1\n", + " )\n", + " # calculates SP from C using the PSS-78 algorithm (2 < SP < 42)\n", + " var1[cast_i].Salinity = gsw.SP_from_C(\n", + " var1[cast_i].Conductivity, var1[cast_i].Temperature, var1[cast_i].Pressure\n", + " )\n", + " var2[cast_i].Conductivity = var2[cast_i].Conductivity.shift(\n", + " periods=shifted_scan_number, fill_value=v2\n", + " )\n", + " var2[cast_i].Salinity = gsw.SP_from_C(\n", + " var2[cast_i].Conductivity, var2[cast_i].Temperature, var2[cast_i].Pressure\n", + " )\n", + "\n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-SHIFT parameters:|\"\n", + " \" Shift Channel: Conductivity|\"\n", + " \" # of Records to Delay (-ve for Advance):|\"\n", + " f\" Shift = {shifted_scan_number}|\"\n", + " \" Salinity was recalculated after shift|\"\n", + " )\n", + " metadata_dict[\"SHIFT_Conductivity_Time\"] = datetime.now()\n", + "\n", + " return var1, var2\n", + "\n", + "\n", + "def plot_shift_c(\n", + " cast_d_shift_c: dict,\n", + " cast_u_shift_c: dict,\n", + " cast_d_filtered: dict,\n", + " cast_u_filtered: dict,\n", + " dest_dir: str,\n", + ") -> None:\n", + " \"\"\"\n", + " Plot Salinity and T-S to check the index after shift\n", + " inputs:\n", + " - cast_d_shift_c, cast_u_shift_c: downcast and upcast data dictionaries\n", + " - cast_d_filtered, cast_u_filtered: downcast and upcast data dictionaries\n", + " - dest_dir:\n", + " outputs:\n", + " - profile plots of salinity and T-S plots before and after shifting conductivity and\n", + " recalculating salinity\n", + " \"\"\"\n", + "\n", + " # Create a folder for figures if it doesn't already exist\n", + " figure_dir = os.path.join(dest_dir, \"FIG\")\n", + " if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + "\n", + " fig, ax = plt.subplots() # Before\n", + " for cast_i in cast_d_filtered.keys():\n", + " ax.plot(\n", + " cast_d_filtered[cast_i].Salinity,\n", + " cast_d_filtered[cast_i].Pressure,\n", + " color=\"blue\",\n", + " )\n", + " ax.plot(\n", + " cast_u_filtered[cast_i].Salinity,\n", + " cast_u_filtered[cast_i].Pressure,\n", + " color=\"blue\",\n", + " )\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=\"Salinity\",\n", + " x_var_units=\"PSS-78\",\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"Before Shift Conductivity\",\n", + " invert_yaxis=True,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, \"Before_Shift_Conductivity_S.png\"))\n", + " plt.close(fig)\n", + "\n", + " fig, ax = plt.subplots() # After\n", + " for cast_i in cast_d_filtered.keys():\n", + " ax.plot(\n", + " cast_d_shift_c[cast_i].Salinity,\n", + " cast_d_shift_c[cast_i].Pressure,\n", + " color=\"blue\",\n", + " )\n", + " ax.plot(\n", + " cast_u_shift_c[cast_i].Salinity,\n", + " cast_u_shift_c[cast_i].Pressure,\n", + " color=\"blue\",\n", + " )\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=\"Salinity\",\n", + " x_var_units=\"PSS-78\",\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"After Shift Conductivity\",\n", + " invert_yaxis=True,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, \"After_Shift_Conductivity_S.png\"))\n", + " plt.close(fig)\n", + "\n", + " # TS Plot before\n", + " do_ts_plot(\n", + " figure_dir, \"Before Shift Conductivity T-S Plot\",\n", + " \"Before_Shift_Conductivity_T-S.png\", cast_d_filtered, cast_u_filtered,\n", + " )\n", + "\n", + " # T-S plot After\n", + " do_ts_plot(\n", + " figure_dir, \"After Shift Conductivity T-S Plot\",\n", + " \"After_Shift_Conductivity_T-S.png\", cast_d_shift_c, cast_u_shift_c,\n", + " )\n", + "\n", + " return\n", + "\n", + "cast_d_shift_c, cast_u_shift_c = SHIFT_CONDUCTIVITY(\n", + " cast_d_filtered,\n", + " cast_u_filtered,\n", + " metadata_dict=meta_dict,\n", + " shifted_scan_number=shift_recs_conductivity,\n", + " )\n", + "\n", + "plot_shift_c(\n", + " cast_d_shift_c, cast_u_shift_c, cast_d_filtered, cast_u_filtered, dest_dir\n", + " )\n", + "\n", + "if verbose:\n", + " print(f\"Conductivity shifted {shift_recs_conductivity} scans\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "e6d7d819-39a0-4296-846c-d39b8e65d44b", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**SHIFT OXYGEN**\n", + "Shift oxygen if it is present.
\n", + "If Oxygen is not present the cast variables will simply be renamed to the above cast." + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "197912df-ba11-4e4f-81dc-5652bdfea59a", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Oxygen shifted -11 scans\n" + ] + } + ], + "source": [ + "if have_oxy:\n", + "\n", + " def SHIFT_OXYGEN(\n", + " var_downcast: dict, var_upcast: dict, metadata_dict: dict, shifted_scan_number\n", + " ) -> tuple:\n", + " \n", + " # cast_number = len(var_downcast.keys())\n", + " var1 = deepcopy(var_downcast)\n", + " var2 = deepcopy(var_upcast)\n", + " for cast_i in var1.keys():\n", + " index_1 = var1[cast_i].Oxygen.index[-1]\n", + " v1 = var1[cast_i].Oxygen[index_1]\n", + " index_2 = var2[cast_i].Oxygen.index[-1]\n", + " v2 = var2[cast_i].Oxygen[index_2]\n", + " # shift C for n scans\n", + " var1[cast_i].Oxygen = var1[cast_i].Oxygen.shift(\n", + " periods=shifted_scan_number, fill_value=v1\n", + " )\n", + " var2[cast_i].Oxygen = var2[cast_i].Oxygen.shift(\n", + " periods=shifted_scan_number, fill_value=v2\n", + " )\n", + " \n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-SHIFT parameters:|\"\n", + " \" Shift Channel: Oxygen:Dissolved:Saturation|\"\n", + " \" # of Records to Delay (-ve for Advance):|\"\n", + " f\" Shift = {shifted_scan_number}|\"\n", + " )\n", + " metadata_dict[\"SHIFT_Oxygen_Time\"] = datetime.now()\n", + " \n", + " return var1, var2\n", + "\n", + "\n", + " def plot_shift_o(\n", + " cast_d_shift_o: dict,\n", + " cast_u_shift_o: dict,\n", + " cast_d_shift_c: dict,\n", + " cast_u_shift_c: dict,\n", + " dest_dir: str,\n", + " ) -> None:\n", + " \n", + "\n", + " # Create a folder for figures if it doesn't already exist\n", + " figure_dir = os.path.join(dest_dir, \"FIG\")\n", + " if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + " \n", + " # num_casts = len(cast_d_shift_o)\n", + " \n", + " # Before shift\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast_d_shift_c.keys():\n", + " ax.plot(\n", + " cast_d_shift_c[cast_i].Oxygen,\n", + " cast_d_shift_c[cast_i].Temperature,\n", + " color=\"blue\",\n", + " )\n", + " ax.plot(\n", + " cast_u_shift_c[cast_i].Oxygen,\n", + " cast_u_shift_c[cast_i].Temperature,\n", + " color=\"blue\",\n", + " )\n", + " \n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=\"Oxygen\",\n", + " x_var_units=\"%\",\n", + " y_var_name=\"Temperature\",\n", + " y_var_units=\"C\",\n", + " plot_title=\"Before Shift Oxygen T-O Plot\",\n", + " invert_yaxis=False,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, \"Before_Shift_Oxygen_T-O.png\"))\n", + " plt.close(fig)\n", + " \n", + " # After shift\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast_d_shift_c.keys():\n", + " ax.plot(\n", + " cast_d_shift_o[cast_i].Oxygen,\n", + " cast_d_shift_o[cast_i].Temperature,\n", + " color=\"blue\",\n", + " )\n", + " ax.plot(\n", + " cast_u_shift_o[cast_i].Oxygen,\n", + " cast_u_shift_o[cast_i].Temperature,\n", + " color=\"blue\",\n", + " )\n", + " \n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=\"Oxygen\",\n", + " x_var_units=\"%\",\n", + " y_var_name=\"Temperature\",\n", + " y_var_units=\"C\",\n", + " plot_title=\"After Shift Oxygen T-O Plot\",\n", + " invert_yaxis=False,\n", + " )\n", + " plt.savefig(os.path.join(figure_dir, \"After_Shift_Oxygen_T-O.png\"))\n", + " plt.close(fig)\n", + " return\n", + "\n", + " \n", + " cast_d_shift_o, cast_u_shift_o = SHIFT_OXYGEN(\n", + " cast_d_shift_c,\n", + " cast_u_shift_c,\n", + " metadata_dict=meta_dict,\n", + " shifted_scan_number=shift_recs_oxygen,\n", + " )\n", + "\n", + " plot_shift_o(\n", + " cast_d_shift_o, cast_u_shift_o, cast_d_shift_c, cast_u_shift_c, dest_dir\n", + " )\n", + "\n", + " if verbose:\n", + " print(f\"Oxygen shifted {shift_recs_oxygen} scans\")" + ] + }, + { + "cell_type": "markdown", + "id": "905ccad2-5c31-45e1-912e-f63eea97ee09", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Convert Oxygen**" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "4a86532f-aa1a-4ac8-888a-ccf5f1cc65fc", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Oxygen concentration derived from oxygen saturation\n" + ] + } + ], + "source": [ + "if have_oxy:\n", + " def DERIVE_OXYGEN_CONCENTRATION(\n", + " var_downcast: dict, var_upcast: dict, metadata_dict: dict\n", + " ) -> tuple:\n", + " \"\"\"\n", + " Derive oxygen concentration in umol/kg and mL/L from oxygen percent saturation\n", + " using SCOR WG 142 (DOI:10.13155/45915)\n", + " inputs:\n", + " - var_downcast, var_upcast: downcast and upcast data dictionaries\n", + " - metadata_dict\n", + " outputs:\n", + " - downcast and upcast data dictionaries with derived oxygen concentration\n", + " variables added\n", + " \"\"\"\n", + " umol_L_to_mL_L = 1 / 44.6596\n", + " m3_to_L = 1e3\n", + " # cast_number = len(var_downcast.keys())\n", + " var1 = deepcopy(var_downcast)\n", + " var2 = deepcopy(var_upcast)\n", + " \n", + " # O_sat_num_decimal_places = None\n", + " \n", + " for cast_i in var1.keys():\n", + " for var in [var1, var2]:\n", + " T = var[cast_i].Temperature.to_numpy()\n", + " S = var[cast_i].Salinity.to_numpy()\n", + " O_sat = var[cast_i].Oxygen.to_numpy()\n", + " P = var[cast_i].Pressure.to_numpy()\n", + " \n", + " # Convert oxygen saturation to molar oxygen concentration\n", + " # Use default P=0dbar and p_atm=1013.25 mbar, where\n", + " # P: hydrostatic pressure in dbar, and\n", + " # p_atm: atmospheric (air) pressure in mbar\n", + " O_umol_L = O2stoO2c(O_sat, T, S)\n", + " # Convert to mL/L\n", + " O_mL_L = O_umol_L * umol_L_to_mL_L\n", + " # Convert to umol/kg using potential density of seawater (kg/L) from\n", + " # Fofonoff and Millard (1983) and Millero et al. (1980).\n", + " # rho: potential density of seawater referenced to a hydrostatic pressure\n", + " # of 0 dbar and using practical salinity.\n", + " # Since TEOS-10 is based off ABSOLUTE salinity, it can't be used here!\n", + " # One option is seawater.eos80.pden() potential density\n", + " # Returns potential density relative to the ref. pressure [kg m :sup:3]\n", + " rho_kg_m3 = eos80.pden(S, T, P)\n", + " rho_kg_L = rho_kg_m3 / m3_to_L\n", + " O_umol_kg = O_umol_L / rho_kg_L\n", + " var[cast_i][\"Oxygen_mL_L\"] = O_mL_L\n", + " var[cast_i][\"Oxygen_umol_kg\"] = O_umol_kg\n", + " \n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-Oxygen concentration was calculated from oxygen \"\n", + " \"saturation using SCOR WG 142|\"\n", + " )\n", + " metadata_dict[\"DERIVE_OXYGEN_CONCENTRATION_Time\"] = datetime.now()\n", + " return var1, var2\n", + " \n", + " cast_d_o_conc, cast_u_o_conc = DERIVE_OXYGEN_CONCENTRATION(\n", + " cast_d_shift_o, cast_u_shift_o, meta_dict\n", + " )\n", + " \n", + " if verbose:\n", + " print(\"Oxygen concentration derived from oxygen saturation\")\n", + "else:\n", + " # Rename the variables\n", + " cast_d_shift_o, cast_u_shift_o = cast_d_shift_c, cast_u_shift_c\n", + " cast_d_o_conc, cast_u_o_conc = cast_d_shift_c, cast_u_shift_c\n" + ] + }, + { + "cell_type": "markdown", + "id": "55e24c86-de96-460f-868d-4d6fc97d23eb", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Delete Pressure Rerversal**\n" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "id": "fdbff92e-fe13-47b2-86b7-eac997807e44", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Deleted pressure change reversals\n" + ] + } + ], + "source": [ + "def DELETE_PRESSURE_REVERSAL(\n", + " var_downcast: dict, var_upcast: dict, metadata_dict: dict\n", + ") -> tuple:\n", + " \n", + " # cast_number = len(var_downcast.keys())\n", + " var1 = deepcopy(var_downcast)\n", + " var2 = deepcopy(var_upcast)\n", + " for cast_i in var1.keys():\n", + " press = var1[cast_i].Pressure.values\n", + " ref = press[0]\n", + " # print(press[0:15])\n", + " inversions = np.diff(np.r_[press, press[-1]]) < 0 # a mask\n", + " mask = np.zeros_like(inversions)\n", + " for k, p in enumerate(inversions):\n", + " if p:\n", + " ref = press[k]\n", + " cut = press[k + 1:] < ref\n", + " mask[k + 1:][cut] = True\n", + " var1[cast_i][mask] = np.NaN\n", + "\n", + " for cast_i in var2.keys():\n", + " press = var2[cast_i].Pressure.values\n", + " ref = press[0]\n", + " inversions = np.diff(np.r_[press, press[-1]]) > 0\n", + " mask = np.zeros_like(inversions)\n", + " for k, p in enumerate(inversions):\n", + " if p:\n", + " ref = press[k]\n", + " cut = press[k + 1:] > ref\n", + " mask[k + 1:][cut] = True\n", + " var2[cast_i][mask] = np.NaN\n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-DELETE_PRESSURE_REVERSAL parameters:|\" \" Remove pressure reversals|\"\n", + " )\n", + " metadata_dict[\"DELETE_PRESSURE_REVERSAL_Time\"] = datetime.now()\n", + "\n", + " return var1, var2\n", + "\n", + "\n", + "def plot_delete(cast_d_wakeeffect: dict, cast_d_shift_o: dict, dest_dir: str) -> None:\n", + " \n", + " # Create a folder for figures if it doesn't already exist\n", + " figure_dir = os.path.join(dest_dir, \"FIG\")\n", + " if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + "\n", + " # Get a list of the available variables\n", + " for cast_i in cast_d_wakeeffect.keys():\n", + " vars_available = list(dict.fromkeys(cast_d_wakeeffect[cast_i]))\n", + " break\n", + "\n", + " # Plot BEFORE: Iterate through the casts and variables\n", + " for j, var in enumerate(VARIABLES_POSSIBLE):\n", + " if var in vars_available:\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast_d_shift_o.keys():\n", + " ax.plot(\n", + " cast_d_shift_o[cast_i].loc[:, var],\n", + " cast_d_shift_o[cast_i].Pressure,\n", + " color=VARIABLE_COLOURS[j],\n", + " )\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=var,\n", + " x_var_units=VARIABLE_UNITS[j],\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"Before Delete\",\n", + " invert_yaxis=True,\n", + " )\n", + "\n", + " if len(var.split(\"_\")) > 1:\n", + " var_abbrev = var[0] + \"_\" + var.split(\"_\")[1] + \"_\" + var.split(\"_\")[2]\n", + " else:\n", + " var_abbrev = var[0]\n", + " plt.savefig(os.path.join(figure_dir, f\"Before_Delete_{var_abbrev}.png\"))\n", + " plt.close(fig)\n", + "\n", + " # Iterate through the casts and variables\n", + " for j, var in enumerate(VARIABLES_POSSIBLE):\n", + " if var in vars_available:\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast_d_wakeeffect.keys():\n", + " ax.plot(\n", + " cast_d_wakeeffect[cast_i].loc[:, var],\n", + " cast_d_wakeeffect[cast_i].Pressure,\n", + " color=VARIABLE_COLOURS[j],\n", + " )\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=var,\n", + " x_var_units=VARIABLE_UNITS[j],\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"After Delete\",\n", + " invert_yaxis=True,\n", + " )\n", + " if len(var.split(\"_\")) > 1:\n", + " # Capture derived oxygen concentration without overwriting O sat plot\n", + " var_abbrev = var[0] + \"_\" + var.split(\"_\")[1] + \"_\" + var.split(\"_\")[2]\n", + " else:\n", + " var_abbrev = var[0]\n", + " plt.savefig(os.path.join(figure_dir, f\"After_Delete_{var_abbrev}.png\"))\n", + " plt.close(fig)\n", + "\n", + " # TS Plots\n", + " do_ts_plot(\n", + " figure_dir, plot_title=\"T-S Plot (before delete pressure reversal)\",\n", + " figure_filename=\"Before_Delete_T-S.png\", cast_d=cast_d_shift_o\n", + " )\n", + " do_ts_plot(\n", + " figure_dir, plot_title=\"T-S Plot (after delete pressure reversal)\",\n", + " figure_filename=\"After_Delete_T-S.png\", cast_d=cast_d_wakeeffect\n", + " )\n", + "\n", + " return\n", + "\n", + "cast_d_wakeeffect, cast_u_wakeeffect = DELETE_PRESSURE_REVERSAL(\n", + " cast_d_o_conc, cast_u_o_conc, metadata_dict=meta_dict\n", + " )\n", + "\n", + "if verbose:\n", + " print(\"Deleted pressure change reversals\")\n", + "\n", + "# Plot before and after comparisons of the delete step\n", + "plot_delete(cast_d_wakeeffect, cast_d_o_conc, dest_dir)\n" + ] + }, + { + "cell_type": "markdown", + "id": "f1c8ea43-487e-47aa-beba-9357b3efb3eb", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**REMOVE**
\n", + "Similare to IOS Shell's REMOVE, this function will drop channels based on a 'vars_to_drop.csv'
\n", + "Currently the variables in the csv must be in without quotations and separated by a space. " + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "b31377ec-0d2c-41ef-9250-5a98bfa83d2d", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Select variables dropped from casts specified in 2024_017_vars_to_drop.csv\n" + ] + } + ], + "source": [ + "def DROP_SELECT_VARS(\n", + " dest_dir: str, var_downcast: dict, drop_vars_file: str, metadata_dict: dict\n", + ") -> dict:\n", + " \n", + " drop_vars_df = pd.read_csv(\n", + " os.path.join(dest_dir, drop_vars_file), header=None,\n", + " names=[\"cast_number\", \"vars_to_drop\"]\n", + " )\n", + "\n", + " var = deepcopy(var_downcast)\n", + "\n", + " # Iterate through all the casts in the dataframe\n", + " for i in range(len(drop_vars_df)):\n", + " # String may be in format \"Oxygen, Fluorescence\", hence unsplit\n", + " vars_to_drop_unsplit = drop_vars_df.loc[i, \"vars_to_drop\"]\n", + " #print(i)\n", + " \n", + "\n", + " # Skip if there are no vars to drop for the cast\n", + " if vars_to_drop_unsplit != np.nan:\n", + " cast_number = drop_vars_df.loc[i, \"cast_number\"]\n", + " \n", + " # This works IF and only IF the vars are listed with spaces and no quotations in the vars to drop csv\n", + " vars_to_drop_split = list(vars_to_drop_unsplit.split())\n", + " # print(vars_to_drop_split)\n", + " #print(var[f\"cast{cast_number}\"].columns)\n", + " var[f\"cast{cast_number}\"] = var[f\"cast{cast_number}\"].drop(\n", + " columns=vars_to_drop_split\n", + " )\n", + " #print(var[f\"cast{cast_number}\"].columns)\n", + " # Append a note to the processing history\n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-Remove Channels:|\"\n", + " f\" The following CHANNEL(S) were removed from cast {cast_number}:|\"\n", + " )\n", + " for var_to_drop in vars_to_drop_split: # vars_to_drop_split:\n", + " metadata_dict[\"Processing_history\"] += f\" {var_to_drop}|\"\n", + "\n", + " metadata_dict[\"DROP_SELECT_VARS_Time\"] = datetime.now()\n", + "\n", + " return var\n", + "\n", + "if drop_vars_file is not None:\n", + " cast_d_dropvars = DROP_SELECT_VARS(\n", + " dest_dir, cast_d_wakeeffect, drop_vars_file, meta_dict\n", + " )\n", + " if verbose:\n", + " print(\"Select variables dropped from casts specified in\", drop_vars_file)\n", + "else:\n", + " cast_d_dropvars = cast_d_wakeeffect" + ] + }, + { + "cell_type": "markdown", + "id": "1428c336-8b81-4503-bb31-08870a3c6ec9", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Bin Average**
\n", + "The average values for each bin are calculated.
\n", + "Pressure is set to the bin value and not the average within the bin. " + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "56e8f7b5-e449-4e3a-8d44-4492d02e4db2", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:20: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + "C:\\Users\\huntingtons\\AppData\\Local\\Temp\\1\\ipykernel_16340\\1610420428.py:23: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Records averaged into equal-width pressure bins\n" + ] + } + ], + "source": [ + "def BINAVE(\n", + " var_downcast: dict, metadata_dict: dict, interval=1\n", + ") -> tuple: # Hana's original code had the upcast, I have dropped it here var_upcast: dict, \n", + " \n", + " # cast_number = len(var_downcast.keys())\n", + " var1 = deepcopy(var_downcast)\n", + " \n", + " for cast_i in var1.keys():\n", + " \n", + " start_d = np.floor(np.nanmin(var1[cast_i].Pressure.values))\n", + " # print(\"floor\", start_d)\n", + " # start_d = np.round(start_d)\n", + " stop_d = np.ceil(np.nanmax(var1[cast_i].Pressure.values))\n", + " # stop_d = np.round(stop_d)\n", + " # print(\"ceil\",stop_d)\n", + " new_press_d = np.arange(start_d - 0.5, stop_d + 1.5, interval)\n", + " # print(\"new_press_d\", new_press_d)\n", + " binned_d = pd.cut(var1[cast_i].Pressure, bins=new_press_d)\n", + " # print(\"binned_d\", binned_d)\n", + " obs_count_d = var1[cast_i].groupby(binned_d).size()\n", + " # print(\"obs_count_d\", obs_count_d)\n", + "\n", + " var1[cast_i] = var1[cast_i].groupby(binned_d).mean()\n", + " var1[cast_i][\"Observation_counts\"] = obs_count_d\n", + " # Potential for whole row Nan values at top and bottom of output files\n", + " var1[cast_i] = var1[cast_i].dropna(\n", + " axis=0, how=\"any\"\n", + " ) # drop the nans - ask if this is OK?\n", + " var1[cast_i].reset_index(drop=True, inplace=True)\n", + " # Replicate IOS Shell's output Bin Channel = Bin value not average value\n", + " # might need to change this with round_to_int in HH adcp code. \n", + " var1[cast_i]['Pressure'] = var1[cast_i]['Pressure'].round(decimals=0)\n", + " \n", + "\n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-BINAVE parameters:\"\n", + " \" Bin channel = Pressure|\"\n", + " \" Averaging interval = 1.00|\"\n", + " \" Minimum bin value = 0.000|\"\n", + " \" Average value were used|\"\n", + " \" Interpolated values were NOT used for empty bins|\"\n", + " \" Channel NUMBER_OF_BIN_RECORDS was added to file|\"\n", + " )\n", + " metadata_dict[\"BINAVE_Time\"] = datetime.now()\n", + "\n", + " return var1 \n", + "\n", + "cast_d_binned = BINAVE(\n", + " cast_d_dropvars, metadata_dict=meta_dict\n", + " )\n", + "\n", + "figure_dir = os.path.join(dest_dir, \"FIG\")\n", + "if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + "\n", + "do_ts_plot(\n", + " figure_dir, plot_title=\"T-S Plot (after bin average)\",\n", + " figure_filename=\"After_BINAVE_T-S.png\", cast_d=cast_d_binned\n", + " )\n", + "\n", + "\n", + "\n", + "if verbose:\n", + " print(\"Records averaged into equal-width pressure bins\")" + ] + }, + { + "cell_type": "markdown", + "id": "e3f8c04f-7cbc-4b74-850a-7f5aec9669f3", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Final Edits**
\n", + "Conductivity is converted to S/m
\n", + "Final edits on the header information
\n", + "Formatting the channels correctly." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "da001084-dd42-420f-992e-4f4b3eccb593", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Final edit completed\n" + ] + } + ], + "source": [ + "def FINAL_EDIT(var_downcast: dict, metadata_dict: dict) -> dict:\n", + " \n", + " # vars = list(dict.fromkeys(var_cast['cast1']))\n", + " # cast_number = len(var_cast.keys())\n", + " var = deepcopy(var_downcast)\n", + "\n", + " # Do channel format corrections, unit conversions for each cast\n", + " for cast_i in var.keys():\n", + " # # Drop Date and Time:UTC columns - already dropped earlier\n", + " # print(var[cast_i].columns)\n", + " # var[cast_i] = var[cast_i].drop(columns=[\"Date\", \"TIME\"])\n", + " # drop index column\n", + " var[cast_i] = var[cast_i].reset_index(drop=True)\n", + " # var[cast_i] = var[cast_i][col_list] # select columns\n", + "\n", + " # Add \"if\" conditions for all vars in case they were dropped in\n", + " # DROP_SELECT_VARS\n", + " if \"Conductivity\" in var[cast_i].columns:\n", + " var[cast_i].Conductivity = (\n", + " var[cast_i].Conductivity * 0.1\n", + " ) # convert Conductivity to S/m\n", + "\n", + " var[cast_i].Pressure = var[cast_i].Pressure.apply(\"{:,.1f}\".format)\n", + " var[cast_i].Depth = var[cast_i].Depth.apply(\"{:,.1f}\".format)\n", + "\n", + " # Prepare columns to be re-arranged to make writing to the header files easier\n", + " column_order = [\"Pressure\", \"Depth\"]\n", + "\n", + " if \"Temperature\" in var[cast_i].columns:\n", + " var[cast_i].Temperature = var[cast_i].Temperature.apply(\"{:,.4f}\".format)\n", + " column_order.append(\"Temperature\")\n", + " if \"Salinity\" in var[cast_i].columns:\n", + " var[cast_i].Salinity = var[cast_i].Salinity.apply(\"{:,.4f}\".format)\n", + " column_order.append(\"Salinity\")\n", + " if \"Fluorescence\" in var[cast_i].columns:\n", + " var[cast_i].Fluorescence = var[cast_i].Fluorescence.apply(\"{:,.3f}\".format)\n", + " column_order.append(\"Fluorescence\")\n", + " if \"Oxygen\" in var[cast_i].columns:\n", + " var[cast_i].Oxygen = var[cast_i].Oxygen.apply(\"{:,.2f}\".format)\n", + " var[cast_i].Oxygen_mL_L = var[cast_i].Oxygen_mL_L.apply(\"{:,.2f}\".format)\n", + " var[cast_i].Oxygen_umol_kg = var[cast_i].Oxygen_umol_kg.apply(\n", + " \"{:,.2f}\".format\n", + " )\n", + " column_order.append(\"Oxygen\")\n", + " column_order.append(\"Oxygen_mL_L\")\n", + " column_order.append(\"Oxygen_umol_kg\")\n", + " if \"Conductivity\" in var[cast_i].columns:\n", + " var[cast_i].Conductivity = var[cast_i].Conductivity.apply(\"{:,.6f}\".format)\n", + " column_order.append(\"Conductivity\")\n", + "\n", + " column_order.append(\"Observation_counts\")\n", + "\n", + " # Re-sort the columns\n", + " var[cast_i] = var[cast_i][column_order]\n", + "\n", + " \n", + " # Update the Processing history\n", + " metadata_dict[\"Processing_history\"] += (\n", + " \"-Remove Channels:|\"\n", + " \" The following CHANNEL(S) were removed:|\"\n", + " \" Date|\"\n", + " \" TIME:UTC|\"\n", + " \"-CALIB parameters:|\"\n", + " \" Calibration type = Correct|\"\n", + " \" Calibration applied:|\"\n", + " \" Conductivity (S/m) = 0.1* Conductivity (mS/cm)|\"\n", + " )\n", + " metadata_dict[\"FINALEDIT_Time\"] = datetime.now()\n", + "\n", + " return var\n", + "cast_d_final = FINAL_EDIT(cast_d_binned, meta_dict)\n", + "if verbose:\n", + " print(\"Final edit completed\")" + ] + }, + { + "cell_type": "markdown", + "id": "628841a9-0b7a-4e3b-8c77-7a7efe8ebb83", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Plot final casts**" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "id": "a71fd61a-f440-412d-8b1d-f812ffa28cc0", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "def plot_processed(cast_final: dict, dest_dir: str) -> None:\n", + " \n", + " # Create a folder for figures if it doesn't already exist\n", + " figure_dir = os.path.join(dest_dir, \"FIG\")\n", + " if not os.path.exists(figure_dir):\n", + " os.makedirs(figure_dir)\n", + "\n", + " for cast_i in cast_final.keys():\n", + " vars_available = list(dict.fromkeys(cast_final[cast_i]))\n", + " break\n", + "\n", + " # ------------------------- Plot processed profiles ------------------------------\n", + " # number_of_colors = len(cast)\n", + " # color = [\"#\" + ''.join([random.choice('0123456789ABCDEF') for j in range(6)])\n", + " # for i in range(number_of_colors)]\n", + "\n", + " # Change conductivity units from mS/cm to agree with FINAL_EDIT()\n", + " variable_units_final = VARIABLE_UNITS\n", + " variable_units_final[2] = \"S/m\"\n", + "\n", + " # Plot the first cast before and after processing\n", + " for j, var in enumerate(VARIABLES_POSSIBLE):\n", + " if var in vars_available:\n", + " fig, ax = plt.subplots()\n", + " for cast_i in cast_final.keys():\n", + " # Need to convert to float because FINAL_EDIT() converted values to strings\n", + " ax.plot(\n", + " cast_final[cast_i].loc[:, var].astype(float),\n", + " cast_final[cast_i].Pressure.astype(float),\n", + " color=VARIABLE_COLOURS[j],\n", + " )\n", + " format_processing_plot(\n", + " ax,\n", + " x_var_name=var,\n", + " x_var_units=variable_units_final[j],\n", + " y_var_name=\"Pressure\",\n", + " y_var_units=\"dbar\",\n", + " plot_title=\"Post-Processing\",\n", + " invert_yaxis=True,\n", + " )\n", + " if len(var.split(\"_\")) > 1:\n", + " # Capture derived oxygen concentration without overwriting O sat plot: O_ml_l and O_umol_kg\n", + " var_abbrev = var[0] + \"_\" + var.split(\"_\")[1] + \"_\" + var.split(\"_\")[2]\n", + " else:\n", + " var_abbrev = var[0]\n", + " plt.savefig(os.path.join(figure_dir, f\"Post_Processing_{var_abbrev}.png\"))\n", + " plt.close(fig)\n", + "\n", + " # T-S plot\n", + " do_ts_plot(\n", + " figure_dir, \"Post-Processing T-S Plot\", \"Post_Processing_T-S.png\", cast_d=cast_d_binned #cast_final isn't working yet\n", + " )\n", + "\n", + " return\n", + "plot_processed(cast_d_final, dest_dir)" + ] + }, + { + "cell_type": "markdown", + "id": "bb922089-91dc-4094-bcbc-f4dd411da723", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Import the write file function**" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "5e548cf0-1e90-42e4-8729-da10d406c180", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "# from RBR_files import write_file, write_admin, write_location, write_instrument, write_history, write_comments, write_data, main_header" + ] + }, + { + "cell_type": "markdown", + "id": "37be002a-2c63-42b1-b6a1-49f0cb507100", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "**Finally write all the files from the final cast**" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "215c8c02-6c0b-4ca1-9e80-c0290a28df11", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "outputs": [], + "source": [ + "import warnings\n", + "# stop from printing warnings in the output, suppress this if needed\n", + "warnings.filterwarnings('ignore') \n", + "\n", + "def write_file(\n", + " cast_number,\n", + " cast_original: dict,\n", + " cast_final: dict,\n", + " metadata_dict: dict,\n", + ") -> None:\n", + " \"\"\"\n", + " Write file section of IOS header file\n", + " Inputs:\n", + " - cast_number: event number\n", + " - cast_original: data dictionary containing original unprocessed data\n", + " cast_final: data dictionary containing final processed data,\n", + " - metadata_dict: dictionary containing metadata for the cruise\n", + " Outputs:\n", + " - File information added to IOS header file that is open, but nothing returned\n", + " by the function\n", + " \"\"\"\n", + "\n", + " # vars = list(dict.fromkeys(cast_original['cast1']))\n", + "\n", + " start_time = pd.to_datetime(\n", + " cast_original[\"cast\" + str(cast_number)].Date.values[0]\n", + " + \" \"\n", + " + cast_original[\"cast\" + str(cast_number)].TIME.values[0]\n", + " ).strftime(\"%Y/%m/%d %H:%M:%S.%f\")[0:-3]\n", + " end_time = pd.to_datetime(\n", + " cast_original[\"cast\" + str(cast_number)].Date.values[-1]\n", + " + \" \"\n", + " + cast_original[\"cast\" + str(cast_number)].TIME.values[-1]\n", + " ).strftime(\"%Y/%m/%d %H:%M:%S.%f\")[0:-3]\n", + "\n", + " sample_interval = metadata_dict[\"Sampling_Interval\"]\n", + " time_increment = \"0 0 0 \" + sample_interval + \" 0 ! (day hr min sec ms)\"\n", + "\n", + " # Number of ensembles\n", + " number_of_records = str(cast_final[\"cast\" + str(cast_number)].shape[0])\n", + " data_description = metadata_dict[\"Data_description\"]\n", + " number_of_channels = str(cast_final[\"cast\" + str(cast_number)].shape[1])\n", + " nan = -99\n", + " file_type = \"ASCII\"\n", + "\n", + " print(\"*FILE\")\n", + " print(\" \" + \"{:20}\".format(\"START TIME\") + \": UTC \" + start_time)\n", + " print(\" \" + \"{:20}\".format(\"END TIME\") + \": UTC \" + end_time)\n", + " print(\" \" + \"{:20}\".format(\"TIME INCREMENT\") + \": \" + time_increment)\n", + " print(\" \" + \"{:20}\".format(\"NUMBER OF RECORDS\") + \": \" + number_of_records)\n", + " print(\" \" + \"{:20}\".format(\"DATA DESCRIPTION\") + \": \" + data_description)\n", + " print(\" \" + \"{:20}\".format(\"FILE TYPE\") + \": \" + file_type)\n", + " print(\" \" + \"{:20}\".format(\"NUMBER OF CHANNELS\") + \": \" + number_of_channels)\n", + " print()\n", + " print(\"{:>20}\".format(\"$TABLE: CHANNELS\"))\n", + " print(\n", + " \" \"\n", + " + \"! No Name Units Minimum Maximum\"\n", + " )\n", + " print(\n", + " \" \"\n", + " + \"!--- -------------------------------- --------------- -------------- --------------\"\n", + " )\n", + "\n", + " # Create a dictionary of channel information\n", + " # Don't use the channel names as the dict keys because Oxygen:Dissolved:RBR repeats\n", + " # format: {df_column: (ios_channel_name, channel_unit, format_channel_max, channel_pad,\n", + " # channel_width, channel_format, channel_type, channel_decimal_places)}\n", + "\n", + " # Column names no longer changed in FINAL_EDIT()\n", + " channel_dict = {\n", + " \"Pressure\": (\"Pressure\", \"decibar\", False, nan, 7, \"F\", \"R4\", 1),\n", + " \"Depth\": (\"Depth\", \"metres\", False, nan, 7, \"F\", \"R4\", 1),\n", + " \"Temperature\": (\"Temperature\", \"'deg C (ITS90)'\", False, nan, 9, \"F\", \"R4\", 4),\n", + " \"Salinity\": (\"Salinity\", \"PSS-78\", \"%.04f\", nan, 9, \"F\", \"R4\", 4),\n", + " \"Fluorescence\": (\"Fluorescence:URU\", \"mg/m^3\", \"%.03f\", nan, 8, \"F\", \"R4\", 3),\n", + " \"Oxygen\": (\n", + " \"Oxygen:Dissolved:Saturation:RBR\",\n", + " \"%\",\n", + " \"%.04f\",\n", + " nan,\n", + " 8,\n", + " \"F\",\n", + " \"R4\",\n", + " 2,\n", + " ),\n", + " \"Oxygen_mL_L\": (\"Oxygen:Dissolved:Rinko\", \"mL/L\", \"%.04f\", nan, 8, \"F\", \"R4\", 2),\n", + " \"Oxygen_umol_kg\": (\n", + " \"Oxygen:Dissolved:Rinko\",\n", + " \"umol/kg\",\n", + " \"%.04f\",\n", + " nan,\n", + " 8,\n", + " \"F\",\n", + " \"R4\",\n", + " 2,\n", + " ),\n", + " \"Conductivity\": (\"Conductivity\", \"S/m\", \"%.05f\", nan, 10, \"F\", \"R4\", 6),\n", + " \"Observation_counts\": (\n", + " \"Number_of_bin_records\",\n", + " \"n/a\",\n", + " False,\n", + " \"' '\",\n", + " 5,\n", + " \"I\",\n", + " \"I\",\n", + " 0,\n", + " ),\n", + " }\n", + "\n", + " # Remove unavailable channels\n", + " for channel in VARIABLES_POSSIBLE:\n", + " if channel not in cast_final[f\"cast{cast_number}\"]:\n", + " _ = channel_dict.pop(channel)\n", + "\n", + " current_chan_no = 1 # Update current channel number as iteration progresses\n", + " for i, key in enumerate(channel_dict):\n", + " df_name = key\n", + " # Unpack the first three elements of the tuple to more descriptive names\n", + " ios_name, unit, format_max = channel_dict[key][:3]\n", + " # Add this variable since number of bin records is the only int type channel, the rest are float\n", + " dtype_minmax = float if channel_dict[key][5] == \"F\" else int\n", + "\n", + " if format_max:\n", + " # The min is not formatted but the max is\n", + " # nanmin and nanmax will still include -99 pad values in computation????\n", + " print(\n", + " \"{:>8}\".format(str(current_chan_no))\n", + " + \" \"\n", + " + \"{:33}\".format(ios_name)\n", + " + \"{:16}\".format(unit) # was 15\n", + " + \"{:15}\".format(\n", + " str(\n", + " np.nanmin(\n", + " cast_final[f\"cast{cast_number}\"]\n", + " .loc[:, df_name]\n", + " .astype(dtype_minmax)\n", + " )\n", + " )\n", + " )\n", + " + \"{:14}\".format(\n", + " str(\n", + " float(\n", + " format_max\n", + " % np.nanmax(\n", + " cast_final[f\"cast{cast_number}\"]\n", + " .loc[:, df_name]\n", + " .astype(dtype_minmax)\n", + " )\n", + " )\n", + " )\n", + " )\n", + " )\n", + " else:\n", + " print(\n", + " \"{:>8}\".format(str(current_chan_no))\n", + " + \" \"\n", + " + \"{:33}\".format(ios_name)\n", + " + \"{:16}\".format(unit) # was 15\n", + " + \"{:15}\".format(\n", + " str(\n", + " np.nanmin(\n", + " cast_final[f\"cast{cast_number}\"]\n", + " .loc[:, df_name]\n", + " .astype(dtype_minmax)\n", + " )\n", + " )\n", + " )\n", + " + \"{:14}\".format(\n", + " str(\n", + " np.nanmax(\n", + " cast_final[f\"cast{cast_number}\"]\n", + " .loc[:, df_name]\n", + " .astype(dtype_minmax)\n", + " )\n", + " )\n", + " )\n", + " )\n", + " # Update channel counter\n", + " current_chan_no += 1\n", + "\n", + " # Add in table of Channel summary\n", + " print(\"{:>8}\".format(\"$END\"))\n", + " print()\n", + " print(\"{:>26}\".format(\"$TABLE: CHANNEL DETAIL\"))\n", + " print(\" \" + \"! No Pad Start Width Format Type Decimal_Places\")\n", + " print(\" \" + \"!--- ---- ----- ----- ------ ---- --------------\")\n", + " # print('{:>8}'.format('1') + \" \" + '{:15}'.format(\"' '\") + '{:7}'.format(' ') +\n", + " # '{:7}'.format(\"' '\") + '{:22}'.format('YYYY-MM-DDThh:mm:ssZ') +\n", + " # '{:6}'.format('D, T') + '{:14}'.format(\"' '\"))\n", + "\n", + " current_chan_no = 1\n", + " for key, value in channel_dict.items():\n", + " # Unpack the tuple to more descriptive names\n", + " pad, width, chan_format, chan_type, decimals = value[3:]\n", + " print(\n", + " \"{:>8}\".format(str(current_chan_no))\n", + " + \" \"\n", + " + \"{:6}\".format(str(pad))\n", + " + \"{:7}\".format(\"' '\")\n", + " + \"{:7}\".format(str(width))\n", + " + \"{:8}\".format(chan_format)\n", + " + \"{:6}\".format(chan_type)\n", + " + \"{:3}\".format(decimals)\n", + " )\n", + " # Update channel counter\n", + " current_chan_no += 1\n", + "\n", + " # Add in table of Channel detail summary\n", + " print(\"{:>8}\".format(\"$END\"))\n", + " print()\n", + " return\n", + "\n", + "\n", + "def write_admin(metadata_dict: dict) -> None:\n", + " \"\"\"\n", + " function to write administation section of IOS header file\n", + " inputs:\n", + " - metadata_dict: dictionary containing metadata for the RBR CTD\n", + " outputs:\n", + " - Administration section added to open IOS header file, but nothing returned\n", + " by the function\n", + " \"\"\"\n", + " mission = metadata_dict[\"Mission\"]\n", + " agency = metadata_dict[\"Agency\"]\n", + " country = metadata_dict[\"Country\"]\n", + " project = metadata_dict[\"Project\"]\n", + " scientist = metadata_dict[\"Scientist\"]\n", + " platform = metadata_dict[\"Platform\"]\n", + " print(\"*ADMINISTRATION\")\n", + " print(\" \" + \"{:20}\".format(\"MISSION\") + \": \" + mission)\n", + " print(\" \" + \"{:20}\".format(\"AGENCY\") + \": \" + agency)\n", + " print(\" \" + \"{:20}\".format(\"COUNTRY\") + \": \" + country)\n", + " print(\" \" + \"{:20}\".format(\"PROJECT\") + \": \" + project)\n", + " print(\" \" + \"{:20}\".format(\"SCIENTIST\") + \": \" + scientist)\n", + " print(\" \" + \"{:20}\".format(\"PLATFORM \") + \": \" + platform)\n", + " print()\n", + " return\n", + "\n", + "\n", + "def write_location(cast_number: int, metadata_dict: dict) -> None:\n", + " \"\"\"\n", + " write location part in IOS header file\n", + " Inputs:\n", + " - cast_number\n", + " - metadata_dict: dictionary containing metadata for the RBR CTD\n", + " Outputs:\n", + " - location section added to open IOS header file, but nothing returned\n", + " by the function\n", + " \"\"\"\n", + " station = metadata_dict[\"Location\"][\"LOC:STATION\"].to_numpy()\n", + " event_number = metadata_dict[\"Location\"][\"LOC:Event Number\"].to_numpy()\n", + " lon = metadata_dict[\"Location\"][\"LOC:LONGITUDE\"].to_numpy()\n", + " lat = metadata_dict[\"Location\"][\"LOC:LATITUDE\"].to_numpy()\n", + " water_depth = metadata_dict[\"Location\"][\"LOC:WATER DEPTH\"].to_numpy()\n", + "\n", + " event_mask = event_number == cast_number\n", + "\n", + " station = str(station[event_mask][0])\n", + " event_number = str(event_number[event_mask][0])\n", + " lon = lon[event_mask][0].split(\" \") \n", + " lat = lat[event_mask][0].split(\" \")\n", + " water_depth = str(water_depth[event_mask][0])\n", + "\n", + " # Correct lat and lon formatting\n", + " # Fill lat and lon degree placement to 3 characters with spaces if needed\n", + " lat[0] = f\" {lat[0]}\"[-3:]\n", + " lon[0] = f\" {lon[0]}\"[-3:]\n", + " # Remove filler zero from minutes part of coordinates\n", + " if lat[2][0] == \"0\": # might be lat[1][0]\n", + " lat[2] = lat[2][1:] # might be lat[1]=lat[1][1:]\n", + " if lon[2][0] == \"0\": #might be 1 as above\n", + " lon[2] = lon[2][1:] # might b 1 as above\n", + "\n", + " print(\"*LOCATION\")\n", + " print(\" \" + \"{:20}\".format(\"STATION\") + \": \" + station)\n", + " print(\" \" + \"{:20}\".format(\"EVENT NUMBER\") + \": \" + str(event_number))\n", + " print(\n", + " \" \"\n", + " + \"{:20}\".format(\"LATITUDE\")\n", + " + \": \"\n", + " + lat[0]\n", + " + \" \"\n", + " + lat[2] # might be [1]\n", + " + \"0 \"\n", + " + lat[3] # might be [2]\n", + " + \" ! (deg min)\"\n", + " )\n", + " print(\n", + " \" \"\n", + " + \"{:20}\".format(\"LONGITUDE\")\n", + " + \": \"\n", + " + lon[0]\n", + " + \" \"\n", + " + lon[2] #might be [1]\n", + " + \"0 \"\n", + " + lon[3] # might be [1]\n", + " + \" ! (deg min)\"\n", + " )\n", + " print(\" \" + \"{:20}\".format(\"WATER DEPTH\") + \": \" + water_depth)\n", + " print()\n", + " return\n", + "\n", + "\n", + "def write_instrument(metadata_dict: dict) -> None:\n", + " \"\"\"function to write instrument info\n", + " inputs:\n", + " - metadata_dict: dictionary containing metadata for the RBR CTD\n", + " outputs:\n", + " - Instrument section added to open IOS header file, but nothing returned\n", + " by the function\n", + " \"\"\"\n", + " model = metadata_dict[\"Instrument_Model\"]\n", + " if int(metadata_dict[\"Serial_number\"]) < 1000:\n", + " serial_number = f\"{0:0}\" + metadata_dict[\"Serial_number\"]\n", + " else:\n", + " serial_number = metadata_dict[\"Serial_number\"]\n", + " data_description = metadata_dict[\"Data_description\"]\n", + " instrument_type = metadata_dict[\"Instrument_type\"]\n", + " print(\"*INSTRUMENT\")\n", + " print(\" MODEL : \" + model)\n", + " print(\" SERIAL NUMBER : \" + serial_number)\n", + " print(\n", + " \" DATA DESCRIPTION : \"\n", + " + data_description\n", + " + \" ! custom item\"\n", + " )\n", + " print(\n", + " \" INSTRUMENT TYPE : \"\n", + " + instrument_type\n", + " + \" ! custom item\"\n", + " )\n", + " print()\n", + " return\n", + "\n", + "\n", + "def write_history(\n", + " cast_original: dict,\n", + " cast_correct_time: dict,\n", + " cast_calib: dict,\n", + " cast_clip: dict,\n", + " cast_filtered: dict,\n", + " cast_shift_c: dict,\n", + " cast_shift_o: dict,\n", + " cast_d_o_conc: dict,\n", + " cast_wakeeffect: dict,\n", + " cast_binned: dict,\n", + " cast_dropvars: dict,\n", + " cast_final: dict,\n", + " cast_number: int,\n", + " metadata_dict: dict,\n", + "):\n", + " \"\"\"\n", + " function to write raw info\n", + " inputs:\n", + " - have_fluor: boolean flag to indicate if fluorescence channel is available\n", + " - have_oxy: boolean flag to indicate if oxygen channels are available\n", + " (saturation + derived concentration)\n", + " - cast_original:\n", + " - cast_clip:\n", + " - cast_filtered:\n", + " - cast_shift_c:\n", + " - cast_shift_o: dict or None if no oxygen sensor\n", + " - cast_wakeeffect:\n", + " - cast_binned:\n", + " - cast_final:\n", + " - cast_number:\n", + " - metadata_dict: dictionary containing metadata for the RBR CTD\n", + " outputs:\n", + " - history section added to open IOS header file, but nothing returned\n", + " by the function\n", + " \"\"\"\n", + "\n", + " time_format = \"%Y/%m/%d %H:%M:%S.%f\"\n", + " print(\"*HISTORY\")\n", + " print()\n", + " print(\" $TABLE: PROGRAMS\")\n", + " print(\" ! Name Vers Date Time Recs In Recs Out\")\n", + " print(\" ! -------- ------ ---------- -------- --------- ---------\")\n", + " print(\n", + " \" Z_ORDER \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"ZEROORDER_Time\"].strftime(time_format)[0:-7].split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"ZEROORDER_Time\"].strftime(time_format)[0:-7].split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_original[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(str(cast_original[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + "\n", + " if \"DESPIKE_time\" in metadata_dict.keys():\n", + " print(\n", + " \" DESPIKE \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"DESPIKE_time\"].strftime(time_format)[0:-7].split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"DESPIKE_time\"].strftime(time_format)[0:-7].split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_original[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(str(cast_correct_time[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + " \n", + " if \"CORRECT_TIME_OFFSET_Time\" in metadata_dict.keys():\n", + " print(\n", + " \" CORRECT_T\"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"CORRECT_TIME_OFFSET_Time\"].strftime(time_format)[0:-7].split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"CORRECT_TIME_OFFSET_Time\"].strftime(time_format)[0:-7].split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_original[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(str(cast_correct_time[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + " if \"CALIB_Time\" in metadata_dict.keys():\n", + " print(\n", + " \" CALIB \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"CALIB_Time\"].strftime(time_format)[0:-7].split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"CALIB_Time\"].strftime(time_format)[0:-7].split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_correct_time[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(str(cast_calib[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + " print(\n", + " \" CLIP \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"CLIP_D_Time\" + str(cast_number)]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"CLIP_D_Time\" + str(cast_number)]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_calib[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(str(cast_clip[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + " print(\n", + " \" FILTER \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"FILTER_Time\"].strftime(time_format)[0:-7].split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"FILTER_Time\"].strftime(time_format)[0:-7].split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_clip[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(str(cast_filtered[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + " print(\n", + " \" SHIFT \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"SHIFT_Conductivity_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"SHIFT_Conductivity_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_filtered[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(str(cast_shift_c[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + " if \"SHIFT_Oxygen_Time\" in metadata_dict.keys():\n", + " # Add entries for oxygen saturation shift and oxygen concentration derivation\n", + " print(\n", + " \" SHIFT \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"SHIFT_Oxygen_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"SHIFT_Oxygen_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_shift_c[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(str(cast_shift_o[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + " print(\n", + " \" DERIVE \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"DERIVE_OXYGEN_CONCENTRATION_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"DERIVE_OXYGEN_CONCENTRATION_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_shift_o[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(str(cast_d_o_conc[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + " # applies to all cases\n", + " print(\n", + " \" DELETE \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"DELETE_PRESSURE_REVERSAL_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"DELETE_PRESSURE_REVERSAL_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_shift_o[\"cast\" + str(cast_number)].shape[0]))\n", + " + \"{:>10}\".format(\n", + " str(\n", + " cast_wakeeffect[\"cast\" + str(cast_number)].shape[0]\n", + " - list(cast_wakeeffect[\"cast\" + str(cast_number)].isna().sum())[0]\n", + " )\n", + " )\n", + " )\n", + " \n", + " if \"DROP_SELECT_VARS_Time\" in metadata_dict.keys():\n", + " print(\n", + " \" DROPSLCT \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"DROP_SELECT_VARS_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"DROP_SELECT_VARS_Time\"]\n", + " .strftime(time_format)[0:-7]\n", + " .split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(\n", + " cast_wakeeffect[\"cast\" + str(cast_number)].shape[0]\n", + " - list(cast_dropvars[\"cast\" + str(cast_number)].isna().sum())[0] # was cast binned but had to change order\n", + " )) # was cast binnted but had to change order\n", + " + \"{:>10}\".format(\n", + " str(\n", + " cast_dropvars[\"cast\" + str(cast_number)].shape[0]\n", + " - list(cast_dropvars[\"cast\" + str(cast_number)].isna().sum())[0]\n", + " )\n", + " )\n", + " )\n", + "\n", + " print(\n", + " \" BINAVE \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"BINAVE_Time\"].strftime(time_format)[0:-7].split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"BINAVE_Time\"].strftime(time_format)[0:-7].split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(\n", + " str(\n", + " cast_wakeeffect[\"cast\" + str(cast_number)].shape[0]\n", + " - list(cast_dropvars[\"cast\" + str(cast_number)].isna().sum())[0] # was cast binned but had to change order\n", + " )\n", + " )\n", + " + \"{:>10}\".format(str(cast_binned[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + " print(\n", + " \" EDIT \"\n", + " + \"{:7}\".format(str(1.0))\n", + " + \"{:11}\".format(\n", + " metadata_dict[\"FINALEDIT_Time\"].strftime(time_format)[0:-7].split(\" \")[0]\n", + " )\n", + " + \"{:9}\".format(\n", + " metadata_dict[\"FINALEDIT_Time\"].strftime(time_format)[0:-7].split(\" \")[1]\n", + " )\n", + " + \"{:>9}\".format(str(cast_binned[\"cast\" + str(cast_number)].shape[0])) # was cast drop vars but had to change order\n", + " + \"{:>10}\".format(str(cast_final[\"cast\" + str(cast_number)].shape[0]))\n", + " )\n", + "\n", + " print(\" $END\")\n", + " print(\" $REMARKS\")\n", + "\n", + " list_number = len(metadata_dict[\"Processing_history\"].split(\"|\"))\n", + " for i in range(list_number):\n", + " print(\" \" + metadata_dict[\"Processing_history\"].split(\"|\")[i])\n", + " print(\"$END\")\n", + " print()\n", + " return\n", + "\n", + "\n", + "def write_comments(\n", + " processing_report_name: str, channel_names # have_fluor: bool, have_oxy: bool,\n", + ") -> None:\n", + " \"\"\"Write comments section in the IOS header file\n", + " inputs:\n", + " - have_fluor: boolean flag, True if fluorescence channel is available\n", + " - have_oxy: boolean flag, True if oxygen channels are available\n", + " - processing_report_name: name of the RBR processing report for the selected cruise\n", + " outputs:\n", + " - Comments section added to open IOS header file, but nothing returned by\n", + " the function\n", + " \"\"\"\n", + " # cruise_ID = metadata_dict[\"Mission\"]\n", + " print(\"*COMMENTS\")\n", + " print(\" \" + \"-\" * 85)\n", + " print()\n", + " print(\" Data Processing Notes:\")\n", + " print(\" \" + \"-\" * 22)\n", + " print(\" \" + \"No calibration sampling was available.\")\n", + " print()\n", + " if processing_comments1 is not None:\n", + " print(processing_comments1)\n", + " if processing_comments2 is not None:\n", + " print(processing_comments2)\n", + " print()\n", + " if processing_comments3 is not None:\n", + " print(processing_comments3)\n", + " if processing_comments4 is not None:\n", + " print(processing_comments4)\n", + " if processing_comments5 is not None:\n", + " print(processing_comments5)\n", + " print()\n", + " \n", + " # print(\" \" + \"For details on the processing see document: \" + cruise_ID + \"RBR_Processing_Report.doc.\")\n", + " print(\n", + " \" \"\n", + " + \"For details on the processing see document: \"\n", + " + processing_report_name\n", + " + \".\"\n", + " )\n", + " # add name of processing report as an input parameter as some say \"RBR\" and have docx suffix\n", + " print()\n", + " print(\" \" + \"-\" * 85)\n", + "\n", + " # ----------------------\n", + " # 7-line table header\n", + " print_list = [\"!--1--- --2--- \",\n", + " \"!Pressu Depth \",\n", + " \"!re \",\n", + " \"! \",\n", + " \"! \",\n", + " \"! \",\n", + " \"!------ ------ \"]\n", + "\n", + " print_dict = {\"Temperature\": [\"---*---- \",\n", + " \"Temperat \",\n", + " \"ure \",\n", + " \" \",\n", + " \" \",\n", + " \" \",\n", + " \"-------- \"],\n", + " \"Salinity\": [\"---*---- \",\n", + " \"Salinity \",\n", + " \" \",\n", + " \" \",\n", + " \" \",\n", + " \" \",\n", + " \"-------- \"],\n", + " \"Fluorescence\": [\"---*--- \",\n", + " \"Fluores \",\n", + " \"cence: \",\n", + " \"URU \",\n", + " \" \",\n", + " \" \",\n", + " \"------- \"],\n", + " \"Oxygen\": [\"---*--- \",\n", + " \"Oxygen: \",\n", + " \"Dissolv \",\n", + " \"ed: \",\n", + " \"Saturat \",\n", + " \"ion:RBR \",\n", + " \"------- \"],\n", + " \"Oxygen_mL_L\": [\"---*--- \",\n", + " \"Oxygen: \",\n", + " \"Dissolv \",\n", + " \"ed: RBR \",\n", + " \" \",\n", + " \" \",\n", + " \"------- \"],\n", + " \"Oxygen_umol_kg\": [\"---*--- \",\n", + " \"Oxygen: \",\n", + " \"Dissolv \",\n", + " \"ed: RBR \",\n", + " \" \",\n", + " \" \",\n", + " \"------- \"],\n", + " \"Conductivity\": [\"----*---- \",\n", + " \"Conductiv \",\n", + " \"ity \",\n", + " \" \",\n", + " \" \",\n", + " \" \",\n", + " \"--------- \"],\n", + " \"Observation_counts\": [\"-*--\",\n", + " \"Numb\",\n", + " \"er_o\",\n", + " \"~bin\",\n", + " \"_rec\",\n", + " \"ords\",\n", + " \"----\"]}\n", + "\n", + " channel_counter = 3\n", + " \n", + " # Skip Pressure and Depth\n", + " for cn in channel_names[2:]:\n", + " # Add columns to print list\n", + " if cn == \"Observation_counts\":\n", + " # account for single vs double digit channel numbers observation counts\n", + " # in terms of maintaining constant channel width\n", + " print_list[0] += print_dict[cn][0].replace(\"*\", str(channel_counter)[:4])\n", + " else:\n", + " print_list[0] += print_dict[cn][0].replace(\"*\", str(channel_counter))\n", + " #print(print_list)\n", + " for i in range(1, len(print_list)):\n", + " print_list[i] += print_dict[cn][i]\n", + " # Update channel counter\n", + " channel_counter += 1\n", + "\n", + " print_list.append(\"*END OF HEADER\")\n", + " # Now print the statements\n", + " for line in print_list:\n", + " print(line)\n", + "\n", + " return\n", + "\n", + "\n", + "def write_data(\n", + " cast_data: dict, cast_number: int, channel_names\n", + ") -> None: # , have_fluor: bool, have_oxy: bool, cast_d):\n", + " \"\"\"\n", + " Write data to header file, taking into account if fluorescence and oxygen data are there\n", + " inputs:\n", + " - have_fluor: boolean flag, True if fluorescence channel is available\n", + " - have_oxy: boolean flag, True if oxygen channels are available\n", + " - cast_data: dictionary containing the processed data for the selected cast\n", + " - cast_number: the event number for the cast\n", + " outputs:\n", + " - Data values printed to open IOS header file, but nothing returned by the function\n", + " \"\"\"\n", + " # --------------\n", + " channel_widths_all = {\"Pressure\": \"{:>7}\",\n", + " \"Depth\": \"{:>6}\",\n", + " \"Temperature\": \"{:>8}\",\n", + " \"Salinity\": \"{:>8}\",\n", + " \"Fluorescence\": \"{:>7}\",\n", + " \"Oxygen\": \"{:>7}\",\n", + " \"Oxygen_mL_L\": \"{:>7}\",\n", + " \"Oxygen_umol_kg\": \"{:>7}\",\n", + " \"Conductivity\": \"{:>9}\",\n", + " \"Observation_counts\": \"{:>4}\"}\n", + "\n", + " channel_widths_available = {}\n", + " for cn in channel_names:\n", + " channel_widths_available[cn] = channel_widths_all[cn]\n", + "\n", + " # for cn in channel_widths.keys(): RuntimeError: dictionary changed size during iteration\n", + " # if cn not in channel_names:\n", + " # _ = channel_widths.pop(cn)\n", + "\n", + " for i in range(len(cast_data[\"cast\" + str(cast_number)])):\n", + " print_line = \"\"\n", + " for cn, wd in channel_widths_available.items():\n", + " if cn != \"Observation_counts\":\n", + " print_line += (\n", + " wd.format(cast_data[\"cast\" + str(cast_number)].loc[i, cn])\n", + " + \" \"\n", + " )\n", + " else:\n", + " print_line += (\n", + " wd.format(cast_data[\"cast\" + str(cast_number)].loc[i, cn])\n", + " ) # Omit space after the last column, which is Observation_counts\n", + " print(print_line)\n", + " \n", + "\n", + " return\n", + "\n", + "\n", + "def main_header(\n", + " dest_dir: str,\n", + " n_cast: int,\n", + " metadata_dict: dict,\n", + " cast: dict,\n", + " cast_d: dict,\n", + " cast_d_correct_t: dict,\n", + " cast_d_calib: dict,\n", + " cast_d_clip: dict,\n", + " cast_d_filtered: dict,\n", + " cast_d_shift_c: dict,\n", + " cast_d_shift_o: dict,\n", + " cast_d_o_conc: dict,\n", + " cast_d_wakeeffect: dict,\n", + " cast_d_binned: dict,\n", + " cast_d_dropvars: dict,\n", + " cast_d_final: dict,\n", + " channel_names,\n", + " processing_report_name: str,\n", + ") -> str:\n", + " \"\"\"\n", + " Main function for creating an IOS header file containing final processed RBR CTD data\n", + " inputs:\n", + " - dest_dir: working directory that output files are saved to\n", + " - n_cast: cast/event number\n", + " - metadata_dict: dictionary containing metadata for the selected RBR cruise\n", + " - cast: dictionary containing the original raw data from both the upcast and\n", + " downcast\n", + " - cast_d: dictionary containing the original raw data from the downcast only\n", + " - cast_d_clip: dictionary containing the clipped downcast data\n", + " - cast_d_filtered: dictionary containing the low-pass filtered downcast data\n", + " - cast_d_shift_c: dictionary containing the downcast data that had conductivity\n", + " shifted\n", + " - cast_d_shift_o: dictionary containing the downcast data that had oxygen shifted\n", + " - cast_d_wakeeffect: dictionary containing the downcast data that had pressure\n", + " reversals deleted\n", + " - cast_d_binned: dictionary containing the downcast data that was binned into\n", + " 1dbar vertical bins\n", + " - cast_d_final: dictionary containing the final processed data, with conductivity\n", + " in units of S/m\n", + " - have_fluor: boolean flag, True if fluorescence channel is available\n", + " - have_oxy: boolean flag, True if oxygen channels are available\n", + " outputs:\n", + " - absolute path of the output data file\n", + " \"\"\"\n", + " path_slash_type = \"/\" if \"/\" in dest_dir else \"\\\\\"\n", + " f_name = dest_dir.split(path_slash_type)[-2]\n", + " #f_output = f_name.split(\"_\")[0] + \"-\" + f\"{n_cast:04}\" + \".ctd\"\n", + " f_output = f\"test_Suggested-{n_cast:04}.ctd\"\n", + " new_dir = os.path.join(dest_dir, f\"CTD{path_slash_type}\")\n", + " output = new_dir + f_output\n", + " if not os.path.exists(new_dir):\n", + " os.makedirs(new_dir)\n", + " # Start\n", + " # datetime object containing current date and time\n", + " now = datetime.now()\n", + "\n", + " # dd/mm/YY H:M:S\n", + " dt_string = now.strftime(\"%Y/%m/%d %H:%M:%S.%f\")[0:-4]\n", + "\n", + " IOS_string = \"*IOS HEADER VERSION 2.0 2020/03/01 2020/04/15 PYTHON\"\n", + "\n", + " orig_stdout = sys.stdout\n", + " file_handle = open(output, \"wt\", encoding=\"ascii\")\n", + " try:\n", + " sys.stdout = file_handle\n", + " print(\"*\" + dt_string)\n", + " print(IOS_string)\n", + " print() # print(\"\\n\") pring(\"\\n\" * 40)\n", + " write_file(n_cast, cast, cast_d_final, meta_dict)\n", + " write_admin(metadata_dict=meta_dict)\n", + " write_location(cast_number=n_cast, metadata_dict=meta_dict)\n", + " write_instrument(metadata_dict=meta_dict)\n", + " write_history(\n", + " cast_d,\n", + " cast_d_correct_t,\n", + " cast_d_calib,\n", + " cast_d_clip,\n", + " cast_d_filtered,\n", + " cast_d_shift_c,\n", + " cast_d_shift_o,\n", + " cast_d_o_conc,\n", + " cast_d_wakeeffect,\n", + " cast_d_binned,\n", + " cast_d_dropvars,\n", + " cast_d_final,\n", + " cast_number=n_cast,\n", + " metadata_dict=meta_dict,\n", + " )\n", + " write_comments(\n", + " processing_report_name, channel_names\n", + " ) # , metadata_dict=meta_data, cast_d=cast_d) have_fluor, have_oxy,\n", + " write_data(\n", + " cast_d_final, cast_number=n_cast, channel_names=channel_names\n", + " ) # , cast_d=cast_d) have_fluor, have_oxy,\n", + " sys.stdout.flush()\n", + " finally:\n", + " sys.stout = orig_stdout\n", + "\n", + " return os.path.abspath(output)\n", + "\n", + "cast_numbers = list(map(lambda x: int(x.split(\"cast\")[-1]), cast_d_final.keys()))\n", + "for i in cast_numbers:\n", + " # # Update have_fluor and have_oxy flags, since it could be different for different casts\n", + " # have_fluor = True if \"Fluorescence\" in cast_d_final[f\"cast{i}\"].columns else False\n", + " # have_oxy = True if \"Oxygen\" in cast_d_final[f\"cast{i}\"].columns else False\n", + " channel_names = cast_d_final[f\"cast{i}\"].columns\n", + " # Call the main header creation function\n", + " main_header(\n", + " dest_dir,\n", + " i,\n", + " meta_dict,\n", + " cast,\n", + " cast_d,\n", + " cast_d_correct_t,\n", + " cast_d_pc,\n", + " cast_d_clip,\n", + " cast_d_filtered,\n", + " cast_d_shift_c,\n", + " cast_d_shift_o,\n", + " cast_d_o_conc,\n", + " cast_d_wakeeffect,\n", + " cast_d_binned,\n", + " cast_d_dropvars,\n", + " cast_d_final,\n", + " channel_names,\n", + " processing_report_name,\n", + " )\n" + ] + }, + { + "cell_type": "markdown", + "id": "8253d184-61b3-4db5-8e5b-de9ba7a102d5", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [ + "hide" + ] + }, + "source": [ + "# !conda install nbconvert[webpdf]\n", + "# \"jupyter nbconvert CTD_dfo-rosie713-20220531_v2.ipynb --to=webpdf --TemplateExporter.exclude_input=True\"\n", + "# --TagRemovePreprocessor.remove_cell_tags='{'hide'}'\n", + "\n", + "# jupyter nbconvert RBR_Processing_Report_2024-039_suggestions.ipynb --to=pdf --TemplateExporter.exclude_input=True --TagRemovePreProcessor.enabled=True --TagRemovePreprocessor.remove_cell_tags='hide'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "25fe77f8-9c92-4cb7-b1fa-64d4ba00d17a", + "metadata": { + "slideshow": { + "slide_type": "" + }, + "tags": [] + }, + "outputs": [], + "source": [ + "jupyter nbconvert RBR_Processing_Report_2024-039_suggestions.ipynb --to=html --TemplateExporter.exclude_input=True --TagRemovePreProcessor.enabled=True --TagRemovePreprocessor.remove_cell_tags='hide'" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c25d68e0-eb9b-428c-a6ec-2237d1c938f1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.14" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/RBR_CTD_IOS_2024.py b/RBR_CTD_IOS_2024.py index c9f23b9..49e09a8 100644 --- a/RBR_CTD_IOS_2024.py +++ b/RBR_CTD_IOS_2024.py @@ -759,7 +759,7 @@ def CREATE_META_DICT( return meta_dict -def ADD_6LINEHEADER_2(dest_dir: str, year: str, cruise_number: str) -> None: +def ADD_6LINEHEADER_2(dest_dir: str, year: str, cruise_number: str, output_ext: str) -> None: """ Read in a csv file and output in csv format for use in IOSShell Filter through the csv and remove un-needed columns. @@ -772,7 +772,7 @@ def ADD_6LINEHEADER_2(dest_dir: str, year: str, cruise_number: str) -> None: # Add six-line header to the .csv file. # This file could be used for data processing via IOSShell input_name = str(year) + "-" + str(cruise_number) + "_CTD_DATA.csv" - output_name = str(year) + "-" + str(cruise_number) + "_CTD_DATA-6linehdr.csv" + output_name = str(year) + "-" + str(cruise_number) + output_ext input_filename = os.path.join(dest_dir, input_name) ctd_data = pd.read_csv(input_filename, header=0) diff --git a/RBR_Processing_Report_2024-017_GitTest.ipynb b/RBR_Processing_Report_2024-017_GitTest.ipynb index 79a542e..aef6241 100644 --- a/RBR_Processing_Report_2024-017_GitTest.ipynb +++ b/RBR_Processing_Report_2024-017_GitTest.ipynb @@ -136,7 +136,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 15, "id": "456e5070-ca77-40f1-942e-8f7535e03053", "metadata": { "slideshow": { @@ -151,7 +151,7 @@ "year = \"2024\"\n", "cruise_number = \"017\"\n", "#dest_dir = f\"C:\\\\Users\\\\huntingtons\\\\Desktop\\\\RBR_Processing\\\\CURRENT_PROCESSING\\\\{year}-{cruise_number}\\\\Suggested\\\\\"\n", - "dest_dir = \"C:\\\\Users\\\\huntingtons\\\\Documents\\\\GitHub\\\\RBR-Processing\\\\\"\n", + "dest_dir = \"C:\\\\Users\\\\huntingtons\\\\\\Desktop\\\\RBR_Processing\\\\Github_June2024_test\\\\\"\n", "skipcasts = 0\n", "rsk_start_end_times_file = None\n", "rsk_time1, rsk_time2 = [None, None]\n", @@ -186,8 +186,8 @@ }, "outputs": [], "source": [ - "import cartopy.crs as ccrs\n", - "from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter, LatitudeLocator\n", + "#import cartopy.crs as ccrs\n", + "#from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter, LatitudeLocator\n", "import sys\n", "import os\n", "import pyrsktools\n", @@ -236,17 +236,17 @@ }, { "cell_type": "markdown", - "id": "50092258-3631-4851-afbd-b6754506c94c", + "id": "5f18a366-372f-442d-88f1-7917e010cf21", "metadata": {}, "source": [ "**Read the rsk file**
\n", "Inputs
\n", - "*dest_dir\n", - "*year\n", - "*cruise_number\n", - "*skipcasts\n", - "*rsk_time1, rsk_time2\n", - "*zoh, fix_spk\n", + "*dest_dir
\n", + "*year
\n", + "*cruise_number
\n", + "*skipcasts
\n", + "*rsk_time1, rsk_time2
\n", + "*zoh, fix_spk
\n", "
\n", "This function reads in the rsk file and takes the cast numbers from the header merge csv file and outputs a \n", @@ -255,7 +255,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 16, "id": "daf2304f-b18a-439a-8a46-d4083dbbfa22", "metadata": {}, "outputs": [ @@ -274,7 +274,7 @@ "'_CTD_DATA-6linehdr.csv'" ] }, - "execution_count": 11, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -284,256 +284,9 @@ "READ_RSK(dest_dir=dest_dir, year=year, cruise_number=cruise_number, skipcasts=skipcasts, zoh=False, fix_spk=False, rsk_start_end_times_file=None, rsk_time1=None, rsk_time2=None)" ] }, - { - "cell_type": "code", - "execution_count": 20, - "id": "34b9eaf6-e73d-4de0-a367-60eb8f9d7e66", - "metadata": { - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide" - ] - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "232531_20240206_1745.rsk\n", - "no corrections being made\n", - "Using original values\n", - "52\n" - ] - }, - { - "data": { - "text/plain": [ - "'_CTD_DATA-6linehdr.csv'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def READ_RSK(dest_dir, year, cruise_number, skipcasts, rsk_start_end_times_file, rsk_time1, rsk_time2, zoh, fix_spk):\n", - " files = os.listdir(dest_dir) # list all the files in dest_dir\n", - " files = list(filter(lambda f: f.endswith(\".rsk\"), files)) # keep the rsk files only\n", - " n_files = len(files) # get the number of files\n", - " \n", - " # current_profile = event_start\n", - " header_merge_file = os.path.join(dest_dir, f\"{year}-{cruise_number}_header-merge.csv\")\n", - " header_merge_df = pd.read_csv(header_merge_file)\n", - " # Get event numbers from the header-merge.csv file\n", - " header_event_no = header_merge_df.loc[:, \"LOC:Event Number\"].to_numpy()\n", - " # initialize counter to go through the event numbers in header_merge_df\n", - " event_number_idx = 0 \n", - " \n", - " # Open the optional start and end times file? \n", - " # No deleted this for this cruise\n", - " \n", - " # Iterate through all the rsk files that were found\n", - " for k in range(n_files):\n", - " print(files[k])\n", - " # Open the rsk file and read the data within it\n", - " filename = os.path.join(\n", - " str(dest_dir), str(files[k])\n", - " ) # full path and name of .rsk file\n", - " # readHiddenChannels=True does not reveal the derived variables\n", - " rsk = pyrsktools.RSK(filename, readHiddenChannels=False) # load up an RSK\n", - " rsk.open()\n", - " # keep a copy of the raw file before processing \n", - " raw = rsk.copy() \n", - " \n", - " \n", - " if rsk_start_end_times_file is not None:\n", - " rsk_time1, rsk_time2 = rsk_start_end_times_df.loc[\n", - " rsk_start_end_times_df.rsk_file == files[k], [\"start_time\", \"end_time\"]\n", - " ]\n", - " \n", - " # Convert input start and end times to numpy datetime64 format\n", - " if type(rsk_time1) == str:\n", - " rsk_time1 = np.datetime64(rsk_time1)\n", - " else:\n", - " rsk_time1 = None # np.nan, pd.na, or something similar\n", - " if type(rsk_time2) == str:\n", - " rsk_time2 = np.datetime64(rsk_time2)\n", - " else:\n", - " rsk_time2 = None\n", - " \n", - " rsk.readdata(t1=rsk_time1, t2=rsk_time2)\n", - " # rsk.data now returns data in a structured array format\n", - " \n", - " if zoh == False:\n", - " # at this first stage we are not correcting for zero order holds or spikes\n", - " if fix_spk==False:\n", - " print('no corrections being made')\n", - " # Compute the derived channels\n", - " rsk.derivesalinity()\n", - " rsk.deriveseapressure()\n", - " rsk.derivedepth()\n", - " \n", - " input_ext = \"_CTD_DATA-6linehdr.csv\"\n", - " print('Using original values')\n", - "\n", - " elif fix_spike==True:\n", - " print('correcting spikes only')\n", - " rsk.derivesalinity()\n", - " rsk.deriveseapressure()\n", - " rsk.derivedepth()\n", - " rsk.despike(channels=\"chlorophyll_a\", windowLength=spk_window, action=\"interp\")\n", - " meta_dict['DESPIKE_time'] = datetime.now()\n", - " meta_dict[\"Processing_history\"] = (\n", - " \"-Despike Parameters:|\"\n", - " f\"CHANNEL = {spk_var}|\"\n", - " f\" Replace Spikes with {fill_type}|\"\n", - " \" Corrections applied:|\"\n", - " f\" Reference time series produced using a median filter of length {spk_window}:|\"\n", - " f\" Residuals that fall outside {spk_std} standard deviations are replaced:|\"\n", - " )\n", - " print('despiked')\n", - " \n", - " input_ext = \"CTD_DATA-6linehdr_corr_spk.csv\"\n", - " print('Using values with de-spiked chlorophyll')\n", - " \n", - "\n", - " \n", - " elif zoh == True:\n", - "\n", - " meta_dict[\"Processing_history\"] = (\n", - " \"-Zero-Order Holds Correction:|\"\n", - " f\" Correction type = Substitute with {fill_type}|\"\n", - " \" Corrections applied:|\"\n", - " \" All channels corrected where zero-order holds concur with Pressure Holds:|\"\n", - " )\n", - " meta_dict[\"ZEROORDER_Time\"] = datetime.now()\n", - " \n", - "\n", - " if fix_spk == False:\n", - " print('correcting hold only')\n", - "\n", - " # Compute the derived channels\n", - " rsk.derivesalinity()\n", - " rsk.deriveseapressure()\n", - " rsk.derivedepth()\n", - " # correct the hold with an interpolated value\n", - " # this function will find all instances and replace them with an interpolated value\n", - " \n", - " rsk.correcthold(action = fill_action)\n", - " \n", - " \n", - " input_ext = \"CTD_DATA-6linehdr_corr_hold.csv\"\n", - " print(\"using zoh correted values\")\n", - "\n", - " elif fix_spk == True:\n", - "\n", - " meta_dict['DESPIKE_time'] = datetime.now()\n", - " meta_dict[\"Processing_history\"] += (\n", - " \"-Despike Parameters:|\"\n", - " f\" CHANNEL = {spk_var}|\"\n", - " f\" Replace Spikes with {fill_type}|\"\n", - " \" Corrections applied:|\"\n", - " f\" Reference time series produced using a median filter of length {spk_window}:|\"\n", - " f\" Residuals that fall outside {spk_std} standard deviations are replaced:|\"\n", - " )\n", - " #print('despiked')\n", - " \n", - " input_ext = \"CTD_DATA-6linehdr_corr_spk.csv\"\n", - " #print('Using values with de-spiked chlorophyll')\n", - " #print('correcting hold and spikes')\n", - " # Compute the derived channels\n", - " rsk.derivesalinity()\n", - " rsk.deriveseapressure()\n", - " rsk.derivedepth()\n", - "\n", - " rsk.correcthold(action = fill_action)\n", - " \n", - "\n", - " #print('zoh corrected')\n", - " rsk.despike(channels=\"chlorophyll_a\", windowLength=spk_window, action=fill_action)\n", - " \n", - " \n", - " #print('despiked')\n", - "\n", - " input_ext = \"CTD_DATA-6linehdr_corr_hold_spk.csv\" \n", - "\n", - " else:\n", - " print('There is a problem')\n", - " \n", - " \n", - " \n", - " try:\n", - " downcastIndices = rsk.getprofilesindices(direction=\"down\")\n", - " upcastIndices = rsk.getprofilesindices(direction=\"up\")\n", - " except AttributeError:\n", - " rsk.computeprofiles() # This should fix the problem\n", - " downcastIndices = rsk.getprofilesindices(direction=\"down\")\n", - " upcastIndices = rsk.getprofilesindices(direction=\"up\")\n", - " \n", - " # check the number of profiles\n", - " n_profiles = len(downcastIndices) # get the number of profiles recorded\n", - " print(n_profiles)\n", - " \n", - " if type(skipcasts) == int:\n", - " profile_range = range(skipcasts, n_profiles)\n", - " # elif len(skipcasts) == len(header_event_no):\n", - " elif len(skipcasts) == len(files): # original above but that didn't work\n", - " # Check that for each event there is a corresponding number of casts to skip\n", - " profile_range = range(skipcasts[k], n_profiles)\n", - " else:\n", - " print(f\"Invalid skipcasts value, {skipcasts}. Must be int or same length as number of rsk files.\")\n", - " \n", - " \n", - " if len(profile_range) == 0:\n", - " print(\"Warning: Number of casts to skip in file\",\n", - " files[k],\n", - " \"equals the number of casts in the file\",)\n", - " \n", - " # Iterate through the selected profiles in one rsk file\n", - " for i in profile_range:\n", - " downcast_dataframe = pd.DataFrame(rsk.data).loc[downcastIndices[i]]\n", - " upcast_dataframe = pd.DataFrame(rsk.data).loc[upcastIndices[i]]\n", - " \n", - " column_names = list(downcast_dataframe.columns) # read the column names\n", - " channel_units = [chan.units for chan in rsk.channels]\n", - " \n", - " # update the column names to include units\n", - " column_names[0] = \"Time(yyyy-mm-dd HH:MM:ss.FFF)\" # update time first\n", - " for j in range(1, len(column_names)):\n", - " column_names[j] = column_names[j] + \"(\" + channel_units[j - 1] + \")\"\n", - " \n", - " # update column names in downcast and upcast data frames\n", - " downcast_dataframe.columns = column_names\n", - " upcast_dataframe.columns = column_names\n", - " \n", - " # add a column for cast direction\n", - " downcast_dataframe[\"Cast_direction\"] = \"d\"\n", - " downcast_dataframe[\"Event\"] = header_event_no[event_number_idx]\n", - " \n", - " upcast_dataframe[\"Cast_direction\"] = \"u\"\n", - " upcast_dataframe[\"Event\"] = header_event_no[event_number_idx]\n", - " \n", - " # combine downcast and upcast into one profile\n", - " profile_data = pd.concat([downcast_dataframe, upcast_dataframe])\n", - " \n", - " profile_name = \"{}_profile{}.csv\".format(os.path.basename(filename)[:-4],\n", - " str(header_event_no[event_number_idx]).zfill(4),)\n", - " \n", - " profile_data.to_csv(dest_dir + profile_name, index=False) # export each profile\n", - " \n", - " # Update counter\n", - " event_number_idx += 1\n", - " rsk.close()\n", - " return input_ext\n", - "READ_RSK(dest_dir, year, cruise_number, skipcasts, rsk_start_end_times_file, rsk_time1, rsk_time2, zoh=False,fix_spk=False)" - ] - }, { "cell_type": "markdown", - "id": "f58caba4-de07-4cae-9de6-27c7511a6c50", + "id": "ad8595e3-0e62-4a83-a3c2-2b1ec4e90aad", "metadata": { "slideshow": { "slide_type": "" @@ -543,55 +296,25 @@ ] }, "source": [ - "**Merge the files**" + "**Merge the files**
\n", + "
\n", + "Merge all the profile csv files into one data file" ] }, { "cell_type": "code", - "execution_count": 21, - "id": "19dcd2e6-ed0a-4ca5-8731-463283917416", - "metadata": { - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide" - ] - }, + "execution_count": 17, + "id": "b9d5f0c4-f15b-4739-bdf2-a223da42c232", + "metadata": {}, "outputs": [], "source": [ - "def MERGE_FILES():\n", - " files = os.listdir(dest_dir) # list all the files in dest_dir\n", - " # keep the profile csv files only\n", - " # deleted code related to using events from header-merge. This code can be found in the processing template.\n", - " files = list(filter(lambda fname: \"profile\" in fname, files))\n", - " files.sort(key=lambda x: int(x[-8:-4])) # reorder the files according to profile number\n", - " \n", - " ctd_data = pd.DataFrame() # set an empty pandas dataframe to store data\n", - " \n", - " # Iterate through all profiles and concatenate them together to form one dataset\n", - " for i in range(len(files)):\n", - " input_filename = str(dest_dir) + str(files[i])\n", - " data = pd.read_csv(input_filename, sep=\",\", encoding=\"unicode_escape\")\n", - " data.loc[:, \"Event\"] = np.repeat(int(files[i][-8:-4]), len(data))\n", - " ctd_data = pd.concat([ctd_data, data], ignore_index=True)\n", - " \n", - " if ctd_data.columns.to_list()[0] == \"//Time(yyyy-mm-dd HH:MM:ss.FFF)\":\n", - " ctd_data.rename(\n", - " {\"//Time(yyyy-mm-dd HH:MM:ss.FFF)\": \"Time(yyyy-mm-dd HH:MM:ss.FFF)\"},\n", - " axis=1,\n", - " inplace=True,\n", - " )\n", - " \n", - " # Output merged dataset in csv format\n", - " output_filename = year + \"-\" + cruise_number + \"_CTD_DATA.csv\"\n", - " ctd_data.to_csv(dest_dir + output_filename, index=False)\n", - "MERGE_FILES()" + "from RBR_CTD_IOS_2024 import MERGE_FILES\n", + "MERGE_FILES(dest_dir=dest_dir, year=year, cruise_number=cruise_number)" ] }, { "cell_type": "markdown", - "id": "80eacf66-767c-4c67-bba5-178366939ba8", + "id": "a0d543d9-5f89-4931-a372-d84d43cd505d", "metadata": { "slideshow": { "slide_type": "" @@ -601,121 +324,449 @@ ] }, "source": [ - "**Create Metadata Dictionary**
" + "**Create Metadata Dictionary**
\n", + "Read in a csv file and then populate it with more information from the rsk file.
\n", + "This function outputs a new csv file while also creating a dictionary for use in functions further in the process." ] }, { "cell_type": "code", - "execution_count": 22, - "id": "ff5176da-6fc2-4ea8-b458-bd47cb111500", - "metadata": { - "slideshow": { - "slide_type": "" - }, - "tags": [ - "hide" - ] - }, + "execution_count": 19, + "id": "e3e81532-cb86-4f2b-adec-4d6036991bfe", + "metadata": {}, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "starting\n", - "0.125\n", - "time_interval 0.125\n", - "Filled in *METADATA.csv file and saved to C:\\Users\\huntingtons\\Desktop\\RBR_Processing\\CURRENT_PROCESSING\\2024-017\\Suggested\\\n" - ] + "data": { + "text/plain": [ + "{'Processing_Start_time': datetime.datetime(2024, 6, 27, 16, 8, 45, 404924),\n", + " 'Instrument_information': Instrument(instrumentID=1, serialID=232531, model='RBRmaestro³', firmwareVersion='1.149', firmwareType=104, partNumber='L3-M11-F13-SEC11-BEC12-INT11-G2-SCT12-SP11-SDOX113-SFL13-STU12'),\n", + " 'Sampling_Interval': '0.125',\n", + " 'RSK_filename': array(['232531_20240206_1745.rsk'], dtype=object),\n", + " 'Channels': ['conductivity',\n", + " 'temperature',\n", + " 'pressure',\n", + " 'chlorophyll_a',\n", + " 'temperature1',\n", + " 'dissolved_o2_saturation',\n", + " 'turbidity',\n", + " 'sea_pressure',\n", + " 'salinity',\n", + " 'depth'],\n", + " 'Channel_details': [Channel(channelID=1, shortName='cond19', longName='conductivity', unitsPlainText='mS/cm', isMeasured=1, isDerived=0, units='mS/cm', label='conductivity_00', feModuleType='FE-cond3-cond', feModuleVersion=6.041, _dbName='Conductivity'),\n", + " Channel(channelID=2, shortName='temp14', longName='temperature', unitsPlainText='Degrees_C', isMeasured=1, isDerived=0, units='°C', label='temperature_00', feModuleType='CPU-temp', feModuleVersion=1.149, _dbName='Temperature'),\n", + " Channel(channelID=3, shortName='pres24', longName='pressure', unitsPlainText='dbar', isMeasured=1, isDerived=0, units='dbar', label='pressure_00', feModuleType='CPU-pres', feModuleVersion=1.149, _dbName='Pressure'),\n", + " Channel(channelID=4, shortName='fluo10', longName='chlorophyll_a', unitsPlainText='ug/l', isMeasured=1, isDerived=0, units='µg/l', label='chlorophyll_00', feModuleType='FE-v2-ch00', feModuleVersion=10.041, _dbName='Chlorophyll a'),\n", + " Channel(channelID=5, shortName='temp01', longName='temperature1', unitsPlainText='Degrees_C', isMeasured=1, isDerived=0, units='°C', label='rinkotemperature_00', feModuleType='FE-v2-ch00', feModuleVersion=10.041, _dbName='Temperature'),\n", + " Channel(channelID=6, shortName='doxy32', longName='dissolved_o2_saturation', unitsPlainText='%', isMeasured=1, isDerived=0, units='%', label='oxygensaturation_00', feModuleType='FE-v2-ch01', feModuleVersion=10.041, _dbName='Dissolved O₂ saturation'),\n", + " Channel(channelID=7, shortName='turb00', longName='turbidity', unitsPlainText='NTU', isMeasured=1, isDerived=0, units='NTU', label='turbidity_00', feModuleType='FE-v2-ch01', feModuleVersion=10.041, _dbName='Turbidity'),\n", + " Channel(channelID=8, shortName='pres08', longName='sea_pressure', unitsPlainText=None, isMeasured=None, isDerived=None, units='dbar', label='', feModuleType='', feModuleVersion=0, _dbName='Sea pressure'),\n", + " Channel(channelID=9, shortName='sal_00', longName='salinity', unitsPlainText=None, isMeasured=None, isDerived=None, units='PSU', label='', feModuleType='', feModuleVersion=0, _dbName='Salinity'),\n", + " Channel(channelID=10, shortName='dpth01', longName='depth', unitsPlainText=None, isMeasured=None, isDerived=None, units='m', label='', feModuleType='', feModuleVersion=0, _dbName='Depth')],\n", + " 'Number_of_channels': 10,\n", + " 'Location': File_Name LOC:LATITUDE LOC:LONGITUDE \\\n", + " 0 2024-017-0001 49 30.1560 N ! (deg min) 126 17.5620 W ! (deg min) \n", + " 1 2024-017-0002 49 29.2560 N ! (deg min) 126 17.0940 W ! (deg min) \n", + " 2 2024-017-0003 49 28.2180 N ! (deg min) 126 16.5180 W ! (deg min) \n", + " 3 2024-017-0004 49 26.2500 N ! (deg min) 126 15.5580 W ! (deg min) \n", + " 4 2024-017-0005 49 25.6020 N ! (deg min) 126 14.6040 W ! (deg min) \n", + " 5 2024-017-0007 49 23.9760 N ! (deg min) 126 14.6160 W ! (deg min) \n", + " 6 2024-017-0008 49 23.9100 N ! (deg min) 126 12.9360 W ! (deg min) \n", + " 7 2024-017-0009 49 23.3640 N ! (deg min) 126 11.1420 W ! (deg min) \n", + " 8 2024-017-0010 49 23.6340 N ! (deg min) 126 9.7440 W ! (deg min) \n", + " 9 2024-017-0011 49 24.0360 N ! (deg min) 126 8.1840 W ! (deg min) \n", + " 10 2024-017-0012 49 24.7980 N ! (deg min) 126 7.7940 W ! (deg min) \n", + " 11 2024-017-0013 49 25.4280 N ! (deg min) 126 6.4740 W ! (deg min) \n", + " 12 2024-017-0014 49 25.5060 N ! (deg min) 126 5.0880 W ! (deg min) \n", + " 13 2024-017-0015 49 25.6620 N ! (deg min) 126 3.2520 W ! (deg min) \n", + " 14 2024-017-0016 49 26.3940 N ! (deg min) 126 2.7600 W ! (deg min) \n", + " 15 2024-017-0017 49 22.8120 N ! (deg min) 126 5.1300 W ! (deg min) \n", + " 16 2024-017-0018 49 20.2200 N ! (deg min) 126 4.0920 W ! (deg min) \n", + " 17 2024-017-0018 49 20.2200 N ! (deg min) 126 4.0920 W ! (deg min) \n", + " 18 2024-017-0019 49 17.7300 N ! (deg min) 126 2.1180 W ! (deg min) \n", + " 19 2024-017-0020 49 15.6120 N ! (deg min) 126 2.2800 W ! (deg min) \n", + " 20 2024-017-0021 49 14.1780 N ! (deg min) 126 1.9320 W ! (deg min) \n", + " 21 2024-017-0022 49 7.0380 N ! (deg min) 125 54.8760 W ! (deg min) \n", + " 22 2024-017-0023 49 9.0780 N ! (deg min) 125 54.9300 W ! (deg min) \n", + " 23 2024-017-0024 49 24.5340 N ! (deg min) 125 54.4140 W ! (deg min) \n", + " 24 2024-017-0025 49 23.5500 N ! (deg min) 125 56.3160 W ! (deg min) \n", + " 25 2024-017-0026 49 21.6600 N ! (deg min) 125 56.7000 W ! (deg min) \n", + " 26 2024-017-0027 49 19.6920 N ! (deg min) 125 58.6620 W ! (deg min) \n", + " 27 2024-017-0029 49 18.7740 N ! (deg min) 126 0.7200 W ! (deg min) \n", + " 28 2024-017-0030 49 17.7420 N ! (deg min) 126 2.1300 W ! (deg min) \n", + " 29 2024-017-0031 49 14.1360 N ! (deg min) 125 56.4420 W ! (deg min) \n", + " 30 2024-017-0032 49 14.9700 N ! (deg min) 125 52.5360 W ! (deg min) \n", + " 31 2024-017-0033 49 21.1440 N ! (deg min) 125 47.3280 W ! (deg min) \n", + " 32 2024-017-0034 49 20.1420 N ! (deg min) 125 48.2820 W ! (deg min) \n", + " 33 2024-017-0035 49 17.8620 N ! (deg min) 125 48.6540 W ! (deg min) \n", + " 34 2024-017-0037 49 16.2000 N ! (deg min) 125 49.2900 W ! (deg min) \n", + " 35 2024-017-0038 49 14.2680 N ! (deg min) 125 45.4560 W ! (deg min) \n", + " 36 2024-017-0040 49 11.1420 N ! (deg min) 125 45.7680 W ! (deg min) \n", + " 37 2024-017-0041 49 8.0820 N ! (deg min) 125 42.9960 W ! (deg min) \n", + " 38 2024-017-0042 49 7.5480 N ! (deg min) 125 45.8460 W ! (deg min) \n", + " 39 2024-017-0043 49 7.1580 N ! (deg min) 125 47.8320 W ! (deg min) \n", + " 40 2024-017-0044 49 7.7640 N ! (deg min) 125 50.7540 W ! (deg min) \n", + " 41 2024-017-0045 49 8.4960 N ! (deg min) 125 52.5480 W ! (deg min) \n", + " 42 2024-017-0046 49 13.6680 N ! (deg min) 125 35.8860 W ! (deg min) \n", + " 43 2024-017-0047 49 12.5160 N ! (deg min) 125 36.6180 W ! (deg min) \n", + " 44 2024-017-0048 49 11.7420 N ! (deg min) 125 38.9340 W ! (deg min) \n", + " 45 2024-017-0050 49 10.9080 N ! (deg min) 125 38.8560 W ! (deg min) \n", + " 46 2024-017-0051 49 9.6780 N ! (deg min) 125 39.8820 W ! (deg min) \n", + " 47 2024-017-0052 49 11.7840 N ! (deg min) 125 40.4820 W ! (deg min) \n", + " 48 2024-017-0053 49 9.9240 N ! (deg min) 125 41.4180 W ! (deg min) \n", + " 49 2024-017-0054 49 9.0480 N ! (deg min) 125 41.5800 W ! (deg min) \n", + " 50 2024-017-0055 49 8.0640 N ! (deg min) 125 42.9840 W ! (deg min) \n", + " 51 2024-017-0056 49 7.5420 N ! (deg min) 125 45.8520 W ! (deg min) \n", + " \n", + " LOC:Event Number LOC:STATION LOC:WATER DEPTH \\\n", + " 0 1 Sydney head 77 \n", + " 1 2 Sydney 1 106 \n", + " 2 3 Sydney 2 126 \n", + " 3 4 Sydney 3 70 \n", + " 4 5 Sydney 4 63 \n", + " 5 7 Sydney shelter confluence 61 \n", + " 6 8 Shelter mouth 66 \n", + " 7 9 Shelter 6 74 \n", + " 8 10 Shelter 5 91 \n", + " 9 11 Shelter Millar confluence 120 \n", + " 10 12 Shelter 4 164 \n", + " 11 13 Shelter 3 149 \n", + " 12 14 Shelter 2 147 \n", + " 13 15 Shelter 1 122 \n", + " 14 16 Shelter head 89 \n", + " 15 17 Millar Channel North 148 \n", + " 16 918 dummy dummy \n", + " 17 18 Millar Channel South 95 \n", + " 18 19 Herbert Mouth South 45 \n", + " 19 20 Herbert sill 4 \n", + " 20 21 Herbert Russell channel 11.5 \n", + " 21 22 Tofino offshore 10 \n", + " 22 23 Tofino mouth Templar channel 24 \n", + " 23 24 Herbert head 105 \n", + " 24 25 Herbert 1 124 \n", + " 25 26 Herbert 2 136 \n", + " 26 27 Herbert 3 127 \n", + " 27 29 Herbert Mouth 114 \n", + " 28 30 Herbert Mouth South 46 \n", + " 29 31 Hecate bay 22 \n", + " 30 32 Cypress bay 46 \n", + " 31 33 Bedwell head 71 \n", + " 32 34 Bedwell 1 66 \n", + " 33 35 Bedwell 2 54 \n", + " 34 37 Bedwell mouth 55 \n", + " 35 38 Warn bay 137 \n", + " 36 40 Fortune channel 74 \n", + " 37 41 Tofino 6 54 \n", + " 38 42 Tofino 7 40 \n", + " 39 43 Tofino Browning passage 1 39 \n", + " 40 44 Tofino Browning passage 2 15 \n", + " 41 45 Tofino Browning passage 3 11 \n", + " 42 46 Tofino head 1 44 \n", + " 43 47 Tofino 1 89 \n", + " 44 48 Tofino 2 116 \n", + " 45 50 Tofino 3 102 \n", + " 46 51 Tofino 4 78 \n", + " 47 52 Tranquil head 46 \n", + " 48 53 Tranquil mouth 65 \n", + " 49 54 Tofino 5 62 \n", + " 50 55 Tofino 6 54 \n", + " 51 56 Tofino 7 41 \n", + " \n", + " ADM:MISSION ADM:AGENCY ADM:COUNTRY \\\n", + " 0 2024-017 IOS Canada \n", + " 1 2024-017 IOS Canada \n", + " 2 2024-017 IOS Canada \n", + " 3 2024-017 IOS Canada \n", + " 4 2024-017 IOS Canada \n", + " 5 2024-017 IOS Canada \n", + " 6 2024-017 IOS Canada \n", + " 7 2024-017 IOS Canada \n", + " 8 2024-017 IOS Canada \n", + " 9 2024-017 IOS Canada \n", + " 10 2024-017 IOS Canada \n", + " 11 2024-017 IOS Canada \n", + " 12 2024-017 IOS Canada \n", + " 13 2024-017 IOS Canada \n", + " 14 2024-017 IOS Canada \n", + " 15 2024-017 IOS Canada \n", + " 16 dummy dummy dummy \n", + " 17 2024-017 IOS Canada \n", + " 18 2024-017 IOS Canada \n", + " 19 2024-017 IOS Canada \n", + " 20 2024-017 IOS Canada \n", + " 21 2024-017 IOS Canada \n", + " 22 2024-017 IOS Canada \n", + " 23 2024-017 IOS Canada \n", + " 24 2024-017 IOS Canada \n", + " 25 2024-017 IOS Canada \n", + " 26 2024-017 IOS Canada \n", + " 27 2024-017 IOS Canada \n", + " 28 2024-017 IOS Canada \n", + " 29 2024-017 IOS Canada \n", + " 30 2024-017 IOS Canada \n", + " 31 2024-017 IOS Canada \n", + " 32 2024-017 IOS Canada \n", + " 33 2024-017 IOS Canada \n", + " 34 2024-017 IOS Canada \n", + " 35 2024-017 IOS Canada \n", + " 36 2024-017 IOS Canada \n", + " 37 2024-017 IOS Canada \n", + " 38 2024-017 IOS Canada \n", + " 39 2024-017 IOS Canada \n", + " 40 2024-017 IOS Canada \n", + " 41 2024-017 IOS Canada \n", + " 42 2024-017 IOS Canada \n", + " 43 2024-017 IOS Canada \n", + " 44 2024-017 IOS Canada \n", + " 45 2024-017 IOS Canada \n", + " 46 2024-017 IOS Canada \n", + " 47 2024-017 IOS Canada \n", + " 48 2024-017 IOS Canada \n", + " 49 2024-017 IOS Canada \n", + " 50 2024-017 IOS Canada \n", + " 51 2024-017 IOS Canada \n", + " \n", + " ADM:Project ADM:SCIENTIST ADM:PLATFORM \\\n", + " 0 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 1 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 2 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 3 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 4 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 5 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 6 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 7 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 8 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 9 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 10 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 11 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 12 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 13 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 14 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 15 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 16 dummy dummy dummy \n", + " 17 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 18 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 19 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 20 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 21 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 22 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 23 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 24 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 25 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 26 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 27 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 28 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 29 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 30 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 31 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 32 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 33 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 34 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 35 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 36 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 37 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 38 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 39 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 40 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 41 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 42 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 43 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 44 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 45 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 46 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 47 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 48 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 49 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 50 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " 51 Clayoquot Weather Station Network - ACRDP Cooper G. Doug Anderson \n", + " \n", + " FIL:TIME INCREMENT FIL:DATA DESCRIPTION FIL:FILE TYPE \\\n", + " 0 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 1 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 2 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 3 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 4 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 5 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 6 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 7 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 8 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 9 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 10 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 11 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 12 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 13 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 14 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 15 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 16 dummy dummy dummy \n", + " 17 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 18 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 19 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 20 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 21 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 22 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 23 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 24 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 25 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 26 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 27 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 28 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 29 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 30 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 31 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 32 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 33 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 34 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 35 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 36 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 37 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 38 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 39 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 40 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 41 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 42 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 43 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 44 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 45 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 46 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 47 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 48 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 49 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 50 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " 51 0 0 0 0.125 0 ! (day hr min sec ms) CTD ASCII \n", + " \n", + " INS:MODEL INS:SERIAL NUMBER INS:DATA DESCRIPTION INS:INSTRUMENT TYPE \\\n", + " 0 Maestro 232531 CTD RBR CTD \n", + " 1 Maestro 232531 CTD RBR CTD \n", + " 2 Maestro 232531 CTD RBR CTD \n", + " 3 Maestro 232531 CTD RBR CTD \n", + " 4 Maestro 232531 CTD RBR CTD \n", + " 5 Maestro 232531 CTD RBR CTD \n", + " 6 Maestro 232531 CTD RBR CTD \n", + " 7 Maestro 232531 CTD RBR CTD \n", + " 8 Maestro 232531 CTD RBR CTD \n", + " 9 Maestro 232531 CTD RBR CTD \n", + " 10 Maestro 232531 CTD RBR CTD \n", + " 11 Maestro 232531 CTD RBR CTD \n", + " 12 Maestro 232531 CTD RBR CTD \n", + " 13 Maestro 232531 CTD RBR CTD \n", + " 14 Maestro 232531 CTD RBR CTD \n", + " 15 Maestro 232531 CTD RBR CTD \n", + " 16 dummy dummy dummy dummy \n", + " 17 Maestro 232531 CTD RBR CTD \n", + " 18 Maestro 232531 CTD RBR CTD \n", + " 19 Maestro 232531 CTD RBR CTD \n", + " 20 Maestro 232531 CTD RBR CTD \n", + " 21 Maestro 232531 CTD RBR CTD \n", + " 22 Maestro 232531 CTD RBR CTD \n", + " 23 Maestro 232531 CTD RBR CTD \n", + " 24 Maestro 232531 CTD RBR CTD \n", + " 25 Maestro 232531 CTD RBR CTD \n", + " 26 Maestro 232531 CTD RBR CTD \n", + " 27 Maestro 232531 CTD RBR CTD \n", + " 28 Maestro 232531 CTD RBR CTD \n", + " 29 Maestro 232531 CTD RBR CTD \n", + " 30 Maestro 232531 CTD RBR CTD \n", + " 31 Maestro 232531 CTD RBR CTD \n", + " 32 Maestro 232531 CTD RBR CTD \n", + " 33 Maestro 232531 CTD RBR CTD \n", + " 34 Maestro 232531 CTD RBR CTD \n", + " 35 Maestro 232531 CTD RBR CTD \n", + " 36 Maestro 232531 CTD RBR CTD \n", + " 37 Maestro 232531 CTD RBR CTD \n", + " 38 Maestro 232531 CTD RBR CTD \n", + " 39 Maestro 232531 CTD RBR CTD \n", + " 40 Maestro 232531 CTD RBR CTD \n", + " 41 Maestro 232531 CTD RBR CTD \n", + " 42 Maestro 232531 CTD RBR CTD \n", + " 43 Maestro 232531 CTD RBR CTD \n", + " 44 Maestro 232531 CTD RBR CTD \n", + " 45 Maestro 232531 CTD RBR CTD \n", + " 46 Maestro 232531 CTD RBR CTD \n", + " 47 Maestro 232531 CTD RBR CTD \n", + " 48 Maestro 232531 CTD RBR CTD \n", + " 49 Maestro 232531 CTD RBR CTD \n", + " 50 Maestro 232531 CTD RBR CTD \n", + " 51 Maestro 232531 CTD RBR CTD \n", + " \n", + " COM: \n", + " 0 232531_20240206_1745.rsk \n", + " 1 NaN \n", + " 2 NaN \n", + " 3 NaN \n", + " 4 NaN \n", + " 5 NaN \n", + " 6 NaN \n", + " 7 NaN \n", + " 8 NaN \n", + " 9 NaN \n", + " 10 NaN \n", + " 11 NaN \n", + " 12 NaN \n", + " 13 NaN \n", + " 14 NaN \n", + " 15 NaN \n", + " 16 NaN \n", + " 17 NaN \n", + " 18 NaN \n", + " 19 NaN \n", + " 20 NaN \n", + " 21 NaN \n", + " 22 NaN \n", + " 23 NaN \n", + " 24 NaN \n", + " 25 NaN \n", + " 26 NaN \n", + " 27 NaN \n", + " 28 NaN \n", + " 29 NaN \n", + " 30 NaN \n", + " 31 NaN \n", + " 32 NaN \n", + " 33 NaN \n", + " 34 NaN \n", + " 35 NaN \n", + " 36 NaN \n", + " 37 NaN \n", + " 38 NaN \n", + " 39 NaN \n", + " 40 NaN \n", + " 41 NaN \n", + " 42 NaN \n", + " 43 NaN \n", + " 44 NaN \n", + " 45 NaN \n", + " 46 NaN \n", + " 47 NaN \n", + " 48 NaN \n", + " 49 NaN \n", + " 50 NaN \n", + " 51 NaN ,\n", + " 'number_of_profiles': '51',\n", + " 'Data_description': 'CTD',\n", + " 'Final_file_type': 'ASCII',\n", + " 'Mission': '2024-017',\n", + " 'Agency': 'IOS',\n", + " 'Country': 'Canada',\n", + " 'Project': 'Clayoquot Weather Station Network - ACRDP',\n", + " 'Scientist': 'Cooper G.',\n", + " 'Platform': 'Doug Anderson',\n", + " 'Instrument_Model': 'RBRMaestro',\n", + " 'Serial_number': '232531',\n", + " 'Instrument_type': 'RBR CTD'}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "# Initialize metadata dictionary\n", - "print('starting')\n", - "meta_dict = {}\n", - "# Read in a .rsk file just to get the channel details\n", - "rsk_full_path = os.path.join(str(dest_dir), str(rsk_file)) # full path and name of a .rsk file\n", - "rsk = pyrsktools.RSK(rsk_full_path, readHiddenChannels=False) # load up an RSK\n", - "rsk.open()\n", - "rsk.readdata(t1=rsk_time1, t2=rsk_time2)\n", - "\n", - "# Compute the derived channels so as to make number of channels accurate\n", - "rsk.derivesalinity()\n", - "rsk.deriveseapressure()\n", - "rsk.derivedepth()\n", - "\n", - "header_input_name = str(year) + \"-\" + str(cruise_number) + \"_header-merge.csv\"\n", - "header_input_filename = dest_dir + header_input_name\n", - "header = pd.read_csv(header_input_filename, header=0)\n", - "\n", - "# get the time interval for the IOS Header (sampling period)\n", - "time_input_name = str(year) + \"-\" + str(cruise_number) + \"_CTD_DATA.csv\"\n", - "time_input_filename = dest_dir + time_input_name\n", - "time_input = pd.read_csv(time_input_filename)\n", - "time_interval = pd.to_datetime(time_input[\"Time(yyyy-mm-dd HH:MM:ss.FFF)\"][2]) - pd.to_datetime(time_input[\"Time(yyyy-mm-dd HH:MM:ss.FFF)\"][1])\n", - "time_interval = str(time_interval)\n", - "time_interval = time_interval[-8:-3]\n", - "\n", - "\n", - "# Metadata file\n", - "csv_input_name = str(year) + \"-\" + str(cruise_number) + \"_METADATA.csv\"\n", - "csv_input_filename = dest_dir + csv_input_name\n", - "meta_csv = pd.read_csv(csv_input_filename)\n", - "\n", - "# Fill in metadata values\n", - "meta_dict[\"Processing_Start_time\"] = datetime.now()\n", - "meta_dict[\"Instrument_information\"] = rsk.instrument\n", - "meta_dict[\"Sampling_Interval\"] = time_interval\n", - "print(meta_dict[\"Sampling_Interval\"])\n", - "print(\"time_interval\", time_interval)\n", - "# meta_dict['RSK_filename'] = rsk.name\n", - "meta_dict[\"RSK_filename\"] = meta_csv[\"Value\"][\n", - " meta_csv[\"Name\"] == \"RSK_filename\"\n", - " ].values[0:] # if more than one (list??)\n", - "# meta_dict['Channels'] = list(rsk.channels.keys())\n", - "meta_dict[\"Channels\"] = rsk.channelNames\n", - "# meta_dict['Channel_details'] = list(rsk.channels.items())\n", - "meta_dict[\"Channel_details\"] = rsk.channels\n", - "meta_dict[\"Number_of_channels\"] = len(rsk.channels)\n", - "meta_dict[\"Location\"] = header\n", - "\n", - "for key in [\n", - " \"number_of_profiles\",\n", - " \"Data_description\",\n", - " \"Final_file_type\",\n", - " \"Mission\",\n", - " \"Agency\",\n", - " \"Country\",\n", - " \"Project\",\n", - " \"Scientist\",\n", - " \"Platform\",\n", - " \"Instrument_Model\",\n", - " \"Serial_number\",\n", - " \"Instrument_type\",\n", - "]:\n", - " meta_dict[key] = meta_csv[\"Value\"][meta_csv[\"Name\"] == key].values[0]\n", - "\n", - "# Fill out the rest of the METADATA.csv file and export it to csv as a record for users\n", - "meta_csv.loc[meta_csv[\"Name\"] == \"Instrument_information\", \"Value\"] = str(\n", - " meta_dict[\"Instrument_information\"]\n", - ")\n", - "meta_csv.loc[meta_csv[\"Name\"] == \"Channels\", \"Value\"] = str(meta_dict[\"Channels\"])\n", - "meta_csv.loc[meta_csv[\"Name\"] == \"Channel_details\", \"Value\"] = str(\n", - " meta_dict[\"Channel_details\"]\n", - ")\n", - "meta_csv.loc[meta_csv[\"Name\"] == \"Number_of_channels\", \"Value\"] = str(\n", - " meta_dict[\"Number_of_channels\"]\n", - ")\n", - "\n", - "updated_meta_filename = csv_input_filename.replace(\".csv\", \"_FILLED.csv\")\n", - "meta_csv.to_csv(updated_meta_filename, index=False)\n", - "\n", - "if verbose:\n", - " print(\"Filled in *METADATA.csv file and saved to\", dest_dir)\n" + "from RBR_CTD_IOS_2024 import CREATE_META_DICT\n", + "CREATE_META_DICT(dest_dir, rsk_file, year, cruise_number, rsk_time1, rsk_time2)" ] }, { "cell_type": "markdown", - "id": "9d8d9f49-e3b9-48be-b78e-e006df4e87de", + "id": "06d9a0e8-1251-4be4-a2da-7cd891f80cb1", "metadata": { "slideshow": { "slide_type": "" @@ -725,7 +776,32 @@ ] }, "source": [ - "**ADD 6LINEHEADER**" + "**ADD 6LINEHEADER**\n", + "Create a 6 line header csv file that can be used in IOS Shell if need be, to be archived with the
\n", + "output files." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "4a1d3803-e610-4b67-a411-120c1961914d", + "metadata": {}, + "outputs": [ + { + "ename": "TypeError", + "evalue": "ADD_6LINEHEADER_2() got an unexpected keyword argument 'output_ext'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[1;32mIn[24], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;28;01mfrom\u001b[39;00m \u001b[38;5;21;01mRBR_CTD_IOS_2024\u001b[39;00m \u001b[38;5;28;01mimport\u001b[39;00m ADD_6LINEHEADER_2\n\u001b[1;32m----> 2\u001b[0m \u001b[43mADD_6LINEHEADER_2\u001b[49m\u001b[43m(\u001b[49m\u001b[43mdest_dir\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43myear\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcruise_number\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutput_ext\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m_CTD_DATA-6linehdr.csv\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n", + "\u001b[1;31mTypeError\u001b[0m: ADD_6LINEHEADER_2() got an unexpected keyword argument 'output_ext'" + ] + } + ], + "source": [ + "from RBR_CTD_IOS_2024 import ADD_6LINEHEADER_2\n", + "ADD_6LINEHEADER_2(dest_dir, year, cruise_number, output_ext=\"_CTD_DATA-6linehdr.csv\")" ] }, {