{ "cells": [ { "cell_type": "markdown", "id": "c6a29764-f39c-431c-8e77-fbc6bfe20f01", "metadata": {}, "source": [ "# Demo: Instrument-Level Processing (Compact Workflow)\n", "\n", "This notebook walks through the complete instrument-level processing pipeline in the oceanarray codebase, from raw files to science-ready datasets. It demonstrates the same processing steps as `demo_stage1.ipynb` and `demo_stage2.ipynb` but in a more compact, streamlined format.\n", "\n", "## Processing Overview\n", "\n", "### Stage 1: Format Conversion (`*_raw.nc`)\n", "- **Purpose**: Convert raw instrument files to standardized NetCDF format\n", "- **Input**: Raw instrument files (`.cnv`, `.rsk`, `.dat`, `.mat`) \n", "- **Output**: Standardized NetCDF files (`*_raw.nc`)\n", "- **Processing**: Uses `oceanarray.stage1.MooringProcessor` - same as `demo_stage1.ipynb`\n", "\n", "### Stage 2: Temporal Corrections & Trimming (`*_use.nc`)\n", "- **Purpose**: Apply clock corrections and trim to deployment periods\n", "- **Input**: Stage1 files (`*_raw.nc`) + updated YAML with clock offsets\n", "- **Output**: Time-corrected files (`*_use.nc`)\n", "- **Processing**: Uses `oceanarray.stage2.process_multiple_moorings_stage2` - same as `demo_stage2.ipynb`\n", "\n", "### Stage 3: Calibrations & Corrections (Optional)\n", "- **Purpose**: Apply sensor-specific calibrations and corrections\n", "- **Status**: Commented out sections showing how to apply additional calibrations\n", "\n", "### Stage 4: Format Conversion (Optional)\n", "- **Purpose**: Convert to OceanSites or other standardized formats\n", "- **Status**: Commented out sections for format conversion\n", "\n", "## Key Features\n", "\n", "- **Compact Format**: Covers the same ground as separate stage notebooks in one place\n", "- **Instrument-Level Processing**: Each instrument processed independently before mooring-level coordination\n", "- **Multiple Instrument Types**: Handles various instrument types with analysis functions\n", "- **Visualization**: Includes plotting and analysis of processed results\n", "- **Metadata Management**: YAML configuration files drive processing parameters\n", "\n", "## Comparison with Other Notebooks\n", "\n", "- **vs demo_stage1.ipynb**: Same Stage1 processing but more concise\n", "- **vs demo_stage2.ipynb**: Same Stage2 processing but integrated workflow \n", "- **vs demo_step1.ipynb**: Focuses on individual instruments rather than mooring-level time gridding\n", "\n", "Choose this notebook if you want a complete instrument processing workflow in one place, or use the separate stage notebooks for more detailed exploration of each processing step.\n", "\n", "Version: 1.0 \n", "Date: 2025-01-15" ] }, { "cell_type": "code", "execution_count": 1, "id": "6a1920f3", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:11.445684Z", "iopub.status.busy": "2025-09-25T06:33:11.445437Z", "iopub.status.idle": "2025-09-25T06:33:20.047129Z", "shell.execute_reply": "2025-09-25T06:33:20.046538Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Matplotlib is building the font cache; this may take a moment.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/runner/micromamba/envs/TEST/lib/python3.13/site-packages/pycnv/pycnv.py:7: UserWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html. The pkg_resources package is slated for removal as early as 2025-11-30. Refrain from using this package or pin to Setuptools<81.\n", " import pkg_resources\n" ] } ], "source": [ "from pathlib import Path\n", "from datetime import datetime\n", "\n", "import os\n", "import sys\n", "import yaml\n", "import scipy.io\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import xarray as xr\n", "\n", "from oceanarray.stage1 import MooringProcessor, process_multiple_moorings, stage1_mooring\n", "from oceanarray import writers\n", "from ctd_tools.readers import NortekAsciiReader, AdcpMatlabReader\n", "from ctd_tools.plotters import TimeSeriesPlotter\n", "from ctd_tools.writers import NetCdfWriter\n" ] }, { "cell_type": "markdown", "id": "3e40a0b1", "metadata": {}, "source": [ "## Configuration\n", " \n", "Set up the base directory and mooring lists for processing" ] }, { "cell_type": "code", "execution_count": 2, "id": "dff9ed08", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:20.049018Z", "iopub.status.busy": "2025-09-25T06:33:20.048709Z", "iopub.status.idle": "2025-09-25T06:33:20.052119Z", "shell.execute_reply": "2025-09-25T06:33:20.051634Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Base directory: ../data/\n", "Processing 1 moorings: ['dsE_1_2018']\n" ] } ], "source": [ "# Base directory containing the mooring data\n", "basedir = '../data/'\n", "\n", "# Define mooring lists\n", "single_test = ['dsE_1_2018']\n", "\n", "# Choose which set to process\n", "moorlist = single_test\n", "\n", "print(f\"Base directory: {basedir}\")\n", "print(f\"Processing {len(moorlist)} moorings: {moorlist}\")" ] }, { "cell_type": "markdown", "id": "58fd7f96", "metadata": {}, "source": [ "## Stage 1: Load raw instrument files and convert to *_raw.nc\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "ed615f11", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:20.053773Z", "iopub.status.busy": "2025-09-25T06:33:20.053574Z", "iopub.status.idle": "2025-09-25T06:33:21.840196Z", "shell.execute_reply": "2025-09-25T06:33:21.839691Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606363_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606363_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606363_2018_08_27.cnv')\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe16/DSE18_sbe16_2419efw1.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:Could not parse custom header ** recovery DS-E-18\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:Could not compute datetime dates based on timeM\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv:Dates computed based on timeS\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================================================\n", "Processing mooring: dsE_1_2018\n", "============================================================\n", "Processing mooring: dsE_1_2018\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606363_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606363_2018_08_27.cnv'\n", "Date\n", "Computing date\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606401_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606401_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606401_2018_08_27.cnv')\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606402_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606402_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606402_2018_08_27.cnv')\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05608482_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:Could not parse custom header * ** recovery DS-E-18\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:parse_header() start_time: Could not decode time: ( Aug 11 2018 12:00:00 )unconverted data remains: locale('C', 'UTF-8')\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:parse_header() start_time: Could not decode time: ( Aug 11 2018 12:00:00 )unconverted data remains: locale(None, None)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "EXCEPT: Error reading file moor/raw/msm76_2018/sbe16/DSE18_sbe16_2419efw1.cnv: Variable 'depth': Could not convert tuple of form (dims, data[, attrs, encoding]): (['time'], None) to Variable.\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606401_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606401_2018_08_27.cnv'\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606402_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606402_2018_08_27.cnv'\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:Could not compute datetime dates based on timeM\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:Could not compute datetime dates based on timeS\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:Could not compute datetime dates based on start_date and time_interval\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606365_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606365_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606365_2018_08_27.cnv')\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606409_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606409_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606409_2018_08_27.cnv')\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606397_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606397_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606397_2018_08_27.cnv')\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606366_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606366_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606366_2018_08_27.cnv')\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606394_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606394_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606394_2018_08_27.cnv')\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606370_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606370_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606370_2018_08_27.cnv')\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Date\n", "Computing date\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05608482_2018_08_27.cnv: 'NoneType' object has no attribute 'strftime'\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606365_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606365_2018_08_27.cnv'\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606409_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606409_2018_08_27.cnv'\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606397_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606397_2018_08_27.cnv'\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606366_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606366_2018_08_27.cnv'\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606394_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606394_2018_08_27.cnv'\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606370_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606370_2018_08_27.cnv'\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe16/DSE18_sbe16_2418.hex: Unknown file type: sbe-hex\n", "EXCEPT: Error reading file moor/raw/msm76_2018/tr1050/DSE18_013889_20180827_1349.mat: Unknown file type: rbr-matlab\n", "--> Processing rbrsolo: moor/raw/msm76_2018/rbrsolo/DSE18_101651_20180827_1541.rsk\n", "Creating output file: moor/proc/dsE_1_2018/rbrsolo/dsE_1_2018_101651_raw.nc\n", "ERROR: Failed to process moor/raw/msm76_2018/rbrsolo/DSE18_101651_20180827_1541.rsk: Invalid value for attr 'processor_input_file_type': . For serialization to netCDF files, its value must be of one of the following types: str, Number, ndarray, number, list, tuple, bytes\n", "EXCEPT: Error reading file moor/raw/msm76_2018/tr1050/DSE18_015580_20180827_1403.mat: Unknown file type: rbr-matlab\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "--> Processing rbrsolo: moor/raw/msm76_2018/rbrsolo/DSE18_101647_20180827_1551.rsk\n", "Creating output file: moor/proc/dsE_1_2018/rbrsolo/dsE_1_2018_101647_raw.nc\n", "ERROR: Failed to process moor/raw/msm76_2018/rbrsolo/DSE18_101647_20180827_1551.rsk: Invalid value for attr 'processor_input_file_type': . For serialization to netCDF files, its value must be of one of the following types: str, Number, ndarray, number, list, tuple, bytes\n", "EXCEPT: Error reading file moor/raw/msm76_2018/tr1050/DSE18_013874_20180827_1410.mat: Unknown file type: rbr-matlab\n", "--> Processing rbrsolo: moor/raw/msm76_2018/rbrsolo/DSE18_101645_20180827_1553.rsk\n", "Creating output file: moor/proc/dsE_1_2018/rbrsolo/dsE_1_2018_101645_raw.nc\n", "ERROR: Failed to process moor/raw/msm76_2018/rbrsolo/DSE18_101645_20180827_1553.rsk: Invalid value for attr 'processor_input_file_type': . For serialization to netCDF files, its value must be of one of the following types: str, Number, ndarray, number, list, tuple, bytes\n", "EXCEPT: Error reading file moor/raw/msm76_2018/tr1050/DSE18_015574_20180827_1407.mat: Unknown file type: rbr-matlab\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/microcat/DSE18_SBE37SM_RS232_03707518_2018_08_26efw1.cnv\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "--> Processing rbrsolo: moor/raw/msm76_2018/rbrsolo/DSE18_101646_20180827_1548.rsk\n", "Creating output file: moor/proc/dsE_1_2018/rbrsolo/dsE_1_2018_101646_raw.nc\n", "ERROR: Failed to process moor/raw/msm76_2018/rbrsolo/DSE18_101646_20180827_1548.rsk: Invalid value for attr 'processor_input_file_type': . For serialization to netCDF files, its value must be of one of the following types: str, Number, ndarray, number, list, tuple, bytes\n", "EXCEPT: Error reading file moor/raw/msm76_2018/tr1050/DSE18_015577_20180827_1338.mat: Unknown file type: rbr-matlab\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:Could not compute datetime dates based on timeM\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING:pycnv:Could not compute datetime dates based on timeS\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv:Dates computed based on start_date and time_interval\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Date\n", "Computing date\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "INFO:pycnv: Opening file: ../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606364_2018_08_27.cnv\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "CRITICAL:pycnv:Could not open file:../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606364_2018_08_27.cnv (Exception: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606364_2018_08_27.cnv')\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "--> Processing microcat: moor/raw/msm76_2018/microcat/DSE18_SBE37SM_RS232_03707518_2018_08_26efw1.cnv\n", "Creating output file: moor/proc/dsE_1_2018/microcat/dsE_1_2018_7518_raw.nc\n", "Removing variable: potential_temperature\n", "Removing variable: julian_days_offset\n", "Removing variable: density\n", "Removing coordinate: depth\n", "Removing coordinate: latitude\n", "Removing coordinate: longitude\n", "EXCEPT: Error reading file moor/raw/msm76_2018/sbe56/DSE18_SBE05606364_2018_08_27.cnv: [Errno 2] No such file or directory: '../data/moor/raw/msm76_2018/sbe56/DSE18_SBE05606364_2018_08_27.cnv'\n", "Completed processing: 1/23 instruments successful\n", "\n", "Result for dsE_1_2018: ✅ SUCCESS\n", "\n", "============================================================\n", "FINAL PROCESSING SUMMARY\n", "============================================================\n", "Successfully processed: 1/1 moorings\n", "✅ dsE_1_2018\n" ] } ], "source": [ "# Initialize the processor\n", "processor = MooringProcessor(basedir)\n", "\n", "# Process each mooring individually with detailed output\n", "results = {}\n", "for mooring_name in moorlist:\n", " print(f\"\\n{'='*60}\")\n", " print(f\"Processing mooring: {mooring_name}\")\n", " print(f\"{'='*60}\")\n", "\n", " success = processor.process_mooring(mooring_name)\n", " results[mooring_name] = success\n", "\n", " status = \"✅ SUCCESS\" if success else \"❌ FAILED\"\n", " print(f\"\\nResult for {mooring_name}: {status}\")\n", "\n", "# Print final summary\n", "print(f\"\\n{'='*60}\")\n", "print(\"FINAL PROCESSING SUMMARY\")\n", "print(f\"{'='*60}\")\n", "successful = sum(results.values())\n", "total = len(results)\n", "print(f\"Successfully processed: {successful}/{total} moorings\")\n", "\n", "for mooring, success in results.items():\n", " status = \"✅\" if success else \"❌\"\n", " print(f\"{status} {mooring}\")" ] }, { "cell_type": "code", "execution_count": 4, "id": "6b1ecfad", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:21.841828Z", "iopub.status.busy": "2025-09-25T06:33:21.841667Z", "iopub.status.idle": "2025-09-25T06:33:22.175275Z", "shell.execute_reply": "2025-09-25T06:33:22.174771Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Analyzing successful mooring: dsE_1_2018\n", "Analyzing processed files in: ../data/moor/proc/dsE_1_2018/microcat\n", "Found 1 NetCDF files:\n", "\n", "📄 Loading: dsE_1_2018_7518_raw.nc\n", " Variables: ['temperature', 'salinity', 'conductivity', 'pressure', 'serial_number', 'InstrDepth', 'instrument', 'clock_offset', 'start_time', 'end_time']\n", " Attributes: ['latitude', 'longitude', 'CreateTime', 'DataType', 'mooring_name', 'waterdepth', 'deployment_latitude', 'deployment_longitude', 'deployment_time', 'seabed_latitude', 'seabed_longitude', 'recovery_time']\n", " Mooring: dsE_1_2018\n", " Instrument: microcat\n", " Serial: 7518\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAGGCAYAAACqvTJ0AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjYsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvq6yFwwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAichJREFUeJzt3Xd8U/X3x/F3uguUltGy9xRkq4gioCJDRVQERVRARFHAgTiQjQNxgeJAvwq4mIqIoqIgyFYQUFD2lFl2KdDSNvf3x/2laTqTNmmS5vV8PPq4yc3NvafpaXJz7mdYDMMwBAAAAAAAABSiIG8HAAAAAAAAgMBDUQoAAAAAAACFjqIUAAAAAAAACh1FKQAAAAAAABQ6ilIAAAAAAAAodBSlAAAAAAAAUOgoSgEAAAAAAKDQUZQCAAAAAABAoaMoBQAAAAAAgEJHUQoAENDGjBkji8Xi7TDgQdWrV1efPn28HQYAAAAyoSgFAICL9u3bJ4vFkuPPq6++6vS+EhMTNXr0aHXq1EmlS5eWxWLR9OnT8xXXunXrNGjQIDVs2FDFixdX1apV1aNHD+3YsSPb7bdu3apOnTqpRIkSKl26tO6//34dP348y3Yvv/yybrvtNpUrV04Wi0VjxozJMYbFixfr+uuvV9myZRUTE6OrrrpKn3/+eb5+H9j9+++/GjNmjPbt2+fU9u3atcsxP0NDQx22rV69erbbDRgwwGG7I0eO6Pnnn9f111+vqKgoWSwWLVu2LNvjW61WTZkyRU2bNlWJEiVUrlw5de7cWatXr87Pr5+tPn365Pp/aPsJ5ILk6tWrNWbMGJ05c8bboQAAkK0QbwcAAIC/6tmzp26++eYs65s1a+b0Pk6cOKFx48apatWqatKkSY5f8p0xYcIErVq1St27d1fjxo119OhRvfvuu2revLnWrl2ryy+/PH3bgwcPqk2bNoqOjtYrr7yixMREvfHGG9q8ebP++OMPhYWFpW87YsQIlS9fXs2aNdOiRYtyPP6CBQt0++23q1WrVukt0ObMmaMHHnhAJ06c0FNPPZXv360gtm/frqAg/74O9++//2rs2LFq166dqlevnuf2w4cP10MPPeSw7vz58xowYIA6dOiQZfumTZvq6aefdlhXt25dh/vbt2/XhAkTVKdOHTVq1Ehr1qzJ8fjPPPOM3nrrLd1333167LHHdObMGX344Ydq27atVq1apauuuirP3yEvjzzyiNq3b59+f+/evRo1apQefvhhXXfddenra9WqVeBj+avVq1dr7Nix6tOnj2JiYrwdDgAAWVCUAgAgn5o3b6777ruvQPuoUKGCjhw5ovLly2v9+vW68sor872vIUOGaMaMGQ4FpbvvvluNGjXSq6++qi+++CJ9/SuvvKLz58/rzz//VNWqVSVJV111lW666SZNnz5dDz/8cPq2e/fuVfXq1XXixAnFxsbmePx3331XFSpU0K+//qrw8HBJZuGgfv36mj59uteKUrZYCiopKUlhYWF+UeC66aabsqyz/f179eqV5bFKlSrlmcstWrTQyZMnVbp0aX311Vfq3r17ttulpqbqgw8+0F133eXQSq579+6qWbOmvvzyS7cUpVq1aqVWrVql31+/fr1GjRqlVq1aFfj/0ledP39exYsX93YYPhMHAMD/+f5ZFQAAbrJy5UpdeeWVioiIUK1atfThhx9mu90vv/yi1q1bKyYmRiVKlFC9evX0wgsveCSm8PBwlS9f3i37uuaaaxwKUpJUp04dNWzYUFu3bnVY//XXX+vWW29NL0hJUvv27VW3bl3NmTPHYVtnWuZIUkJCgkqVKuVQBAoJCVHZsmUVGRnpsO2BAwe0bdu2PPe5bNmy9BZXY8eOVaVKlRQVFaW77rpLZ8+eVXJysp588knFxcWpRIkS6tu3r5KTk7PEn7kL15kzZ/TUU0+pevXqCg8PV+XKldNbdGU87qxZszRixAhVqlRJxYoVU0JCgiRp7ty5atGihSIjI1W2bFndd999OnToUJb4t23bph49eig2NlaRkZGqV6+ehg8fnv74/v379dhjj6levXqKjIxUmTJl1L17d4duetOnT08vAF1//fXp3dJcbVU3Y8YMFS9eXF27ds328UuXLun8+fM5Pj8qKkqlS5fO8zgpKSm6ePGiypUr57A+Li5OQUFBWXLB037//Xd16tRJ0dHRKlasWHprrYxsLft27Nih++67T9HR0YqNjdXIkSNlGIb+++8/de3aVSVLllT58uX15ptvOjzfli+zZ8/WCy+8oPLly6t48eK67bbb9N9//xUopn///Vf33nuvSpUqpdatW0uS/v77b/Xp00c1a9ZURESEypcvrwcffFAnT550eP4zzzwjSapRo0Z63uzbty+9C3J2XYUzd9HNLQ7JLHba/hdKly6te+65J9vfGQCA7NBSCgAQEDZv3qwOHTooNjZWY8aMUWpqqkaPHp3li/M///yjW2+9VY0bN9a4ceMUHh6uXbt2ZfnCKEkXLlxIL2JkFBMTo5AQ3/iINQxDx44dU8OGDdPXHTp0SPHx8briiiuybH/VVVfphx9+yNex2rVrpwkTJmjkyJHq3bu3LBaLZsyYofXr12cpdD3wwAP67bffZBiGU/seP368IiMj9fzzz2vXrl2aPHmyQkNDFRQUpNOnT2vMmDFau3atpk+frho1amjUqFE57isxMVHXXXedtm7dqgcffFDNmzfXiRMntGDBAh08eFBly5ZN3/bFF19UWFiYhg4dquTkZIWFhWn69Onq27evrrzySo0fP17Hjh3T22+/rVWrVmnjxo3p3aT+/vtvXXfddQoNDdXDDz+s6tWra/fu3fruu+/08ssvSzLHAVu9erXuueceVa5cWfv27dMHH3ygdu3a6d9//1WxYsXUpk0bPf7443rnnXf0wgsv6LLLLpOk9KUzjh8/rl9++UV33313ti1cfv31VxUrVkxpaWmqVq2annrqKT3xxBNO7z+jyMhItWzZUtOnT1erVq103XXX6cyZM3rxxRdVqlQph1Z4nvbrr7+qc+fOatGihUaPHq2goCBNmzZNN9xwg1asWJGlxdbdd9+tyy67TK+++qoWLlyol156SaVLl9aHH36oG264QRMmTNCXX36poUOH6sorr1SbNm0cnv/yyy/LYrHoueeeU3x8vCZNmqT27dtr06ZN6cU4V2Pq3r276tSpo1deeSX9/+WXX37Rnj171LdvX5UvX17//POPPvroI/3zzz9au3atLBaL7rzzTu3YsUMzZ87UxIkT0/M6NjY227Hj8pJdHC+//LJGjhypHj166KGHHtLx48c1efJktWnTxuF/AQCAHBkAAASA22+/3YiIiDD279+fvu7ff/81goODjYwfhxMnTjQkGcePH89xX3v37jUk5fizZs2afMW4bt06Q5Ixbdq0fD0/O59//rkhyfjkk0+yHOezzz7Lsv0zzzxjSDKSkpKyPHb8+HFDkjF69Ohsj5WYmGj06NHDsFgs6a9FsWLFjPnz52fZtm3btoYzpyFLly41JBmXX365cenSpfT1PXv2NCwWi9G5c2eH7Vu1amVUq1bNYV21atWM3r17p98fNWqUIcmYN29eluNZrVaH49asWdO4cOFC+uOXLl0y4uLijMsvv9y4ePFi+vrvv//ekGSMGjUqfV2bNm2MqKgoh5zLeAzDMBz2bbNmzZosf5+5c+cakoylS5dm2d4ZkydPNiQZP/zwQ5bHunTpYkyYMMGYP3++8cknnxjXXXedIcl49tlnc9xfXvHs3LnTaN68ucP/Rc2aNY1t27blK35nZP7/sVqtRp06dYyOHTtmec1r1Khh3HTTTenrRo8ebUgyHn744fR1qampRuXKlQ2LxWK8+uqr6etPnz5tREZGOuSULV8qVapkJCQkpK+fM2eOIcl4++238x1Tz549s/yu2eXNzJkzDUnG8uXL09e9/vrrhiRj7969Dtva3sOye6/J/D+eUxz79u0zgoODjZdfftlh/ebNm42QkJAs6wEAyA7d9wAARV5aWpoWLVqk22+/3aG72mWXXaaOHTs6bGu7sv/tt9/KarXmut+HH35Yv/zyS5afBg0auP13yI9t27Zp4MCBatWqlXr37p2+/uLFi5KyH2spIiLCYRtXhIeHq27durrrrrs0c+ZMffHFF7riiit03333ae3atQ7bLlu2zOlWUpLZsirjrHEtW7aUYRh68MEHHbZr2bKl/vvvP6Wmpua4r6+//lpNmjTRHXfckeUxi8XicL93794O3c3Wr1+v+Ph4PfbYY+mvlSTdcsstql+/vhYuXCjJbJm0fPlyPfjggw45l/kYGfedkpKikydPqnbt2oqJidGGDRty/B1cNWPGDMXGxmY71tSCBQv07LPPqmvXrnrwwQf122+/qWPHjnrrrbd08ODBfB0vKipKDRs21MCBAzVv3jy9//77Sk1N1e23355t60JP2LRpk3bu3Kl7771XJ0+e1IkTJ3TixAmdP39eN954o5YvX57lfzzj4PDBwcG64oorZBiG+vXrl74+JiZG9erV0549e7Ic84EHHlBUVFT6/bvuuksVKlRIb32Yn5gyz4IoOeZNUlKSTpw4oauvvlqS3Jo3ucUxb948Wa1W9ejRI/33OHHihMqXL686depo6dKlHokDAFC0+EbfAgAAPOj48eO6ePGi6tSpk+WxevXqOXRXu/vuu/Xxxx/roYce0vPPP68bb7xRd955p+66664sA1zXqVPHYfYvX3L06FHdcsstio6O1ldffaXg4OD0x2xfaDOPvSSZX3AzbuOK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hpoFKUmKirKvL1PGbBllEx5uLuvXN2P58097YQsAAAAAAMBZFKX8zJ9/mssWLcxl2bJmQco2hNX58+YyY8Ep89hRtm0L2t3OYpGaNpX27y/YfgAAAAAAQOBhFCA/ZbGYP9WrS5Ur29fHxZnLjAWniAjH59paO7ljoPNcJhoEAAAAAABOslikqVO9HUXhoijlQ8aMGaOmTZvm+LitG15uM93FxJgFqYyT/5Utm/U5FovZZQ8AAAAAAHiX7Tt8xkYngYCiVAEdP35cjz76qKpWraqIiAhVqVJFnTp10qpVq9K3sVgsmj9/foGPZRuAPCezZs2SxWLRuHG357rdsmXLdMUVFoWHW2Sx2H+OHj3qsN17772n6tWrKyIiQi1bttQff/zh8Pj27dt17bXX6tprK+ull17KcpyNGzeqe/fuKleunCIiIlSnTh31799fOzKP0g4AAAAAQICyFaTuukvq0MG7sRQ2ilIF1K1bN23cuFGffvqptm/frnnz5qlt27Y6efKk24+VW8umffv2aejQobruuuuc3t/27dt15MiR9J84W98/SbNnz9aQIUM0evRobdiwQU2aNFHHjh0VHx+fvs2gQYN033336cMPv9V3332r1atXpz/2/fff6+qrr1ZycrK+/PJLbd26VV988YWio6M1cuRI135xAAAAAACKIFvbkHHjpLlzvRuLNzAiUAGcOXNGK1as0LJly9S2bVsZhqFKlSqpVatWsvx/qbN69eqSpDvuuEOSVK1aNe3bt0+S9Oqrr2rixIm6cOGCevToodjY2FyPl3kWPZu0tDT16tVLY8eO1YoVK3TmzBmn4o+Li1NMTEy2j7311lvq37+/+vbtK0maMmWKFi5cqKlTp+r555+XJJ0+fVotWrRQdHRjVahQMf24Fy5cUN++fXXzzTfrm2++Sd9njRo11LJlS6fjAwAAAACgqDp1SqpQwbwdqG03vNpSavz48bryyisVFRWluLg43X777dq+fbvDNklJSRo4cKDKlCmjEiVKqFu3bjp27JiXInZUokQJlShRQvPnz1dycnK226xbt06SNG3aNB05ciT9/pw5czRmzBi98sorWr9+vSpUqKD333/f4bnLli2TxWJJL2LlNMvduHHjFBcXp379+rkUf9OmTVWhQgXddNNNDt0NL126pD///FPt27dPXxcUFKT27dtrzZo1Dsdt3769Lr+8mIKCgtSxY0dJ0qJFi3TixAk9++yz2R43p0IYAAAAAACBwGKRypQxb7tjEjJ/5dWi1G+//aaBAwdq7dq1+uWXX5SSkqIOHTro/Pnz6ds89dRT+u677zR37lz99ttvOnz4sO68804vRm0XEhKi6dOn69NPP1VMTIxat26tESNG6O+//07fxtb6KSYmRuXLl0+/P2nSJPXr10/9+vVTvXr19NJLL6lBgwYO+y9WrJjq1aun0P/vt3fxYtYYVq5cqU8++UT/+9//nI67QoUKmjJlir7++mt9/fXXqlKlitq1a6cNGzZIkk6cOKG0tDSVK1fO4XnlypVzGHfq5ptv1vHjx7V69WF9/fU3Cg4OliTt3LlTklS/fn2nYwIAAAAAIBDs2mW//f9fnwOWV7vv/fTTTw73p0+frri4OP35559q06aNzp49q08++UQzZszQDTfcIMlscXTZZZdp7dq1uvrqq70RtoNu3brplltu0YoVK7RmzRr9+OOPevPNN/Xxxx+rT58+OT5v69atGjBggMO6Vq1aaenSpen3r7rqKm3bti39fpMmjhXUc+fO6f7779f//vc/lS1b1umY69Wrp3r16qXfv+aaa7R7925NnDhRn3/+udP7kaTw8HCVKePY7dAI5DIvAAAAAAA5SEmRPvrIvP3bb1Lt2t6Nx9t8aqDzs2fPSpJKly4tSfrzzz+VkpLi0I2sfv36qlq1qkM3Mm+LiIjQTTfdpJEjR2r58uXq3bu3Ro8e7fbjhIZKYWH2+7t379a+ffvUpUsXhYSEKCQkRJ999pkWLFigkJAQ7d692+l9X3XVVdr1/+XasmXLKjg4OEs3yWPHjql8+fJ57qtu3bqS5FBQAwAAAAAg0IWFSa+/LjVuLLVp4+1ovM9nBjq3Wq168sknde211+ryyy+XJB09elRhYWFZxiDK3I0so+TkZIfxnRISEtL3b81ppHAn45PybgVkGIYaNGigb7/9Nn3b0NBQpaamOjzX1trr/vvvT1+3du1ap45hU69ePYeugpI0cuRInTt3TpMmTVLlypWd3temTZtUoUIFGYah0NBQtWjRQosXL1bXrl0lmb//kiVLNHDgwGz3aRj2Vlw33XSTypYtq9dee03z5s3Lsu2ZM2fcOq6UYRgyDKNAf19vslqtfh0/vIO8gavIGeQHeQNXkTPID/IGrvLvnDHbBv3+uzXHycyKAmf/Nj5TlBo4cKC2bNmilStXFmg/48eP19ixY7OsP378uJKSkvK933PnziktLU2pqanp606ePKmePXuqd+/eatSokUqUKKH169fr9ddfV5cuXdK3rVatmhYvXqyWLVsqPDxcpUqV0sCBA/XQQw+pefPmatWqlWbOnKl//vlHNWrUSH/eunXr1LdvXy1atEiVKlXKElNISEiWcZtKliwpq9Wavj41NVXDhw/X4cOHNW3aNEnSO++8o+rVq6tBgwZKSkrStGnT9Ouvv+qHH35IP/bjjz+ufv36qVmzZrryyis1efJknT9/Xvfff7/DayBJVmuwUlPT0otS4eHhmjJlinr27KkuXbpo0KBBqlWrlk6ePKm5c+fqv//+05dffpnvv0VmVqtVFy9eVHx8vNv2WZisVqvOnj0rwzAUFORTjRfhw8gbuIqcQX6QN3AVOYP8IG/gKv/OmfL6/vuTOnMmxduBeNS5c+ec2s4nilKDBg3S999/r+XLl6ty5crp68uXL69Lly5laVmTWzeyYcOGaciQIen3ExISVKVKFcXGxqpkyZL5jjEqKkrBwcEKCbG/ZDExMWrZsqUmT56s3bt3KyUlRZUrV9ZDDz2kF154IX3bN998U08//bQ++eQTVapUSXv37tW9996rffv2adiwYUpKSlK3bt00YMAA/fzzz+nPS05O1o4dO2QYhsNxcxMUFKSgoCCH7ePj43Xw4MH0dampqXruued06NAhFStWTI0bN9Yvv/yi66+/Pv059957r06dOqVx48bp6NGjatq0qX788cdsi2NBQWaB7P/HOZck3XnnnVq1apVeffVVPfDAA+l/h+uvv14vv/yy07+Ps79zZGSk4uLi3LbPwmS1WmWxWBQbG+uHb6jwFvIGriJnkB/kDVxFziA/yBu4yh9z5tAhqWpVM9bOnUt5ORrPi4iIcGo7i+HFUakNw9DgwYP1zTffaNmyZapTp47D42fPnlVsbKxmzpypbt26SZK2b9+u+vXra82aNU4NdJ6QkKDo6GidPXu2QEWpjz76SPPnz9cPP/yQ6++TmpqqkJAQWSyWfB/L3+zZI1WrJoeiVGF6/vnnde7cOb333nveCaCArFar4uPjFRcX5zdvqPA+8gauImeQH+QNXEXOID/IG7jKV3ImMVEKDzfHf87LihX2MaQCYW4wZ2sxXm0p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6dOzzRmLxaL4+Pg891+UkTe5v9csWbJE11xzjaKiolS+fHk999xzSk1NzXPfRV2g5s2+ffvUr18/1ahRQ5GRkapVq5ZGjx6tS5cuOfzeffr0UaNGjRQSEqLbb789z1gDATmTc85s375d119/vcqVK6eIiAjVrFlTI0aMUEpKSp4xF3XkTc55s2/fvmzPa9auXZtnzEUZOZNzzowZMybbnClevHieMSMDww917NjRmDZtmrFlyxZj06ZNxs0332xUrVrVSExMTN9mwIABRpUqVYwlS5YY69evN66++mrjmmuucdjP4MGDjXfffde4//77jSZNmmQ5zp49e4zw8HBj2LBhxq5du4w///zTaNOmjdGsWbNc41u1apURHBxsvPbaa8a///5rjBgxwggNDTU2b96cvk3//v2NWrVqGUuXLjX27t1rfPjhh0ZwcLDx7bff5rrvUaNGGW+99ZYxZMgQIzo6Osvjp06dMt5//31j3bp1xr59+4zFixcb9erVM3r27JnrfgMBeZNz3hiGYUgypk2bZhw5ciT95+LFi7nut6gjZ3LOmQsXLjjkypEjR4yOHTsabdu2zXW/gYC8yTlvNm3aZISFhRljx441du7caSxbtsyoX7++8fTTT+e630AQqHnz448/Gn369DEWLVpk7N692/j222+NuLg4h5xITEw0BgwYYHz00UdGx44dja5du+bxagYGcibnnNm9e7cxdepUY9OmTca+ffvStxk2bFheL2uRR97knDd79+41JBmLFy92OL+5dOlSXi9rkUbO5Jwz586dy3I+3KBBA6N37955vKrIyC+LUpnFx8cbkozffvvNMAzDOHPmjBEaGmrMnTs3fZutW7cakow1a9Zkef7o0aOz/ceYO3euERISYqSlpaWvW7BggWGxWHJ9c+rRo4dxyy23OKxr2bKl8cgjj6Tfb9iwoTFu3DiHbZo3b24MHz4891/2/02bNi3H4kJmb7/9tlG5cmWntg0k5I0jScY333zj1H4CFTmTs/j4eCM0NNT47LPPnNpvICFv7IYNG2ZcccUVDusWLFhgREREGAkJCU7tO1AEYt7YvPbaa0aNGjWyfax3794UpXJAzmSfMzZPPfWU0bp1a5f2GwjIG3ve2IpSGzdudGk/gYacyfm9ZtOmTYYkY/ny5S7tN9D5Zfe9zM6ePStJKl26tCTpzz//VEpK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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ " 📊 Plot saved: dsE_1_2018_microcat_7518_temperature_raw.png\n", "Analyzing processed files in: ../data/moor/proc/dsE_1_2018/sbe16\n", "No NetCDF files found\n", "Analyzing processed files in: ../data/moor/proc/dsE_1_2018/sbe56\n", "No NetCDF files found\n" ] } ], "source": [ "# Analyze processed files\n", "def analyze_processed_mooring(mooring_name, basedir, instrument_type='microcat'):\n", " \"\"\"Analyze processed files for a specific mooring and instrument type.\"\"\"\n", " proc_dir = Path(basedir) / 'moor/proc' / mooring_name / instrument_type\n", " fig_dir = proc_dir\n", "\n", " if not proc_dir.exists():\n", " print(f\"Directory not found: {proc_dir}\")\n", " return\n", "\n", " print(f\"Analyzing processed files in: {proc_dir}\")\n", "\n", " # Find all NetCDF files\n", " nc_files = list(proc_dir.glob('*raw.nc'))\n", " if not nc_files:\n", " print(\"No NetCDF files found\")\n", " return\n", "\n", " print(f\"Found {len(nc_files)} NetCDF files:\")\n", "\n", " for file_path in nc_files:\n", " try:\n", " print(f\"\\n📄 Loading: {file_path.name}\")\n", "\n", " with xr.open_dataset(file_path) as dataset:\n", " print(f\" Variables: {list(dataset.data_vars)}\")\n", " print(f\" Attributes: {list(dataset.attrs.keys())}\")\n", "\n", " # Extract key metadata\n", " mooring_name_attr = dataset.attrs.get('mooring_name', 'Unknown')\n", " instrument_name = dataset.get('instrument', 'Unknown').values if 'instrument' in dataset else 'Unknown'\n", " serial_number = dataset.get('serial_number', 0).values if 'serial_number' in dataset else 0\n", "\n", " print(f\" Mooring: {mooring_name_attr}\")\n", " print(f\" Instrument: {instrument_name}\")\n", " print(f\" Serial: {serial_number}\")\n", "\n", " # Plot temperature if available\n", " if 'temperature' in dataset.data_vars:\n", " fig, ax = plt.subplots(figsize=(12, 4))\n", " ax.plot(dataset['time'], dataset['temperature'], 'b-', linewidth=0.5)\n", " ax.set_ylabel('Temperature (°C)')\n", " ax.set_title(f'{mooring_name_attr}: {instrument_name} {serial_number} - Temperature')\n", " ax.set_xlabel('Time')\n", " ax.grid(True, alpha=0.3)\n", "\n", " # Add stats\n", " temp_mean = dataset['temperature'].mean().values\n", " temp_std = dataset['temperature'].std().values\n", " ax.text(0.02, 0.98, f'Mean: {temp_mean:.2f}°C\\nStd: {temp_std:.2f}°C',\n", " transform=ax.transAxes, verticalalignment='top',\n", " bbox=dict(boxstyle='round', facecolor='white', alpha=0.8))\n", "\n", " plt.tight_layout()\n", " plt.show()\n", "\n", " # Save plot\n", " plot_name = f\"{mooring_name_attr}_{instrument_name}_{serial_number}_temperature_raw.png\"\n", " fig.savefig(fig_dir / plot_name, dpi=150, bbox_inches='tight')\n", " print(f\" 📊 Plot saved: {plot_name}\")\n", "\n", " except Exception as e:\n", " print(f\" ❌ Error loading {file_path.name}: {e}\")\n", "\n", "# Example usage\n", "if results and any(results.values()):\n", " # Analyze the first successfully processed mooring\n", " successful_mooring = next(mooring for mooring, success in results.items() if success)\n", " print(f\"\\nAnalyzing successful mooring: {successful_mooring}\")\n", " analyze_processed_mooring(successful_mooring, basedir, 'microcat')\n", " analyze_processed_mooring(successful_mooring, basedir, 'sbe16')\n", " analyze_processed_mooring(successful_mooring, basedir, 'sbe56')\n", "else:\n", " print(\"No successfully processed moorings to analyze\")" ] }, { "cell_type": "markdown", "id": "b74ee21e", "metadata": {}, "source": [ "## Stage 2: Trim to deployment period" ] }, { "cell_type": "code", "execution_count": 5, "id": "0847e657", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:22.176946Z", "iopub.status.busy": "2025-09-25T06:33:22.176773Z", "iopub.status.idle": "2025-09-25T06:33:22.227415Z", "shell.execute_reply": "2025-09-25T06:33:22.226930Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "==================================================\n", "Processing Stage 2 for mooring dsE_1_2018\n", "==================================================\n", "Starting Stage 2 processing for mooring: dsE_1_2018\n", "Deployment time: 2018-08-12T22:44:00.000000000\n", "Recovery time: 2018-08-26T10:38:00.000000000\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6363_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe16/dsE_1_2018_2419_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6401_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6402_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_8482_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6365_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6409_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6397_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6366_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6394_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6370_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe16/dsE_1_2018_2418_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/tr1050/dsE_1_2018_13889_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/rbrsolo/dsE_1_2018_101651_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/tr1050/dsE_1_2018_15580_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/rbrsolo/dsE_1_2018_101647_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/tr1050/dsE_1_2018_13874_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/rbrsolo/dsE_1_2018_101645_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/tr1050/dsE_1_2018_15574_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/rbrsolo/dsE_1_2018_101646_raw.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/tr1050/dsE_1_2018_15577_raw.nc\n", "Processing microcat serial 7518\n", "Applying clock offset: -2050 seconds\n", "Trimming start to deployment time: 2018-08-12T22:44:00.000000000\n", "Trimming end to recovery time: 2018-08-26T10:38:00.000000000\n", "Trimmed from 124619 to 113473 records\n", "Final time range: 2018-08-13T07:25:51.008000000 to 2018-08-26T10:37:50.979200000\n", "Successfully wrote: ../data/moor/proc/dsE_1_2018/microcat/dsE_1_2018_7518_use.nc\n", "WARNING: Raw file not found: ../data/moor/proc/dsE_1_2018/sbe56/dsE_1_2018_6364_raw.nc\n", "Stage 2 completed: 1/23 instruments successful\n" ] } ], "source": [ "from oceanarray.stage2 import Stage2Processor, process_multiple_moorings_stage2\n", "\n", "results = process_multiple_moorings_stage2(moorlist, basedir)" ] }, { "cell_type": "markdown", "id": "4ae7f50d", "metadata": {}, "source": [ "## Stage 3: Apply calibrations + corrections" ] }, { "cell_type": "code", "execution_count": 6, "id": "60fab40c", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:22.229013Z", "iopub.status.busy": "2025-09-25T06:33:22.228851Z", "iopub.status.idle": "2025-09-25T06:33:22.231156Z", "shell.execute_reply": "2025-09-25T06:33:22.230754Z" } }, "outputs": [], "source": [ "#ds_cal = process_rodb.apply_microcat_calibration_from_txt(data_dir / 'wb1_12_2015_005.microcat.txt', data_dir / 'wb1_12_2015_6123.use')\n", "#ds_cal" ] }, { "cell_type": "code", "execution_count": 7, "id": "2e19689c", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:22.232529Z", "iopub.status.busy": "2025-09-25T06:33:22.232376Z", "iopub.status.idle": "2025-09-25T06:33:22.234656Z", "shell.execute_reply": "2025-09-25T06:33:22.234229Z" } }, "outputs": [], "source": [ "#fig = plotters.plot_microcat(ds_cal)" ] }, { "cell_type": "code", "execution_count": 8, "id": "1e1b7d98", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:22.235993Z", "iopub.status.busy": "2025-09-25T06:33:22.235849Z", "iopub.status.idle": "2025-09-25T06:33:22.237886Z", "shell.execute_reply": "2025-09-25T06:33:22.237498Z" } }, "outputs": [], "source": [ "#ds_diff = tools.calc_ds_difference(ds_cal, ds2)\n", "#fig = plotters.plot_microcat(ds_diff)\n", "#fig.suptitle(\"difference between *.use and *.microcat\")" ] }, { "cell_type": "markdown", "id": "f0627f85", "metadata": {}, "source": [ "## Stage 4: Convert to OceanSites format\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "42ff46bc", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:22.239282Z", "iopub.status.busy": "2025-09-25T06:33:22.239137Z", "iopub.status.idle": "2025-09-25T06:33:22.241702Z", "shell.execute_reply": "2025-09-25T06:33:22.241314Z" } }, "outputs": [], "source": [ "if 0:\n", " metadata_txt = data_dir / 'wb1_12_2015_6123.use'\n", " config_dir = Path(\"..\") / \"oceanarray\" / \"config\"\n", " var_map_yaml = config_dir / \"OS1_var_names.yaml\"\n", " vocab_yaml = config_dir / \"OS1_vocab_attrs.yaml\"\n", " sensor_yaml = config_dir / \"OS1_sensor_attrs.yaml\"\n", " project_yaml = config_dir / \"project_RAPID.yaml\"\n", " ds_OS = convertOS.convert_rodb_to_oceansites(ds_cal, metadata_txt, var_map_yaml, vocab_yaml, sensor_yaml=sensor_yaml,project_yaml=project_yaml)\n", " ds_OS\n", "\n" ] }, { "cell_type": "code", "execution_count": 10, "id": "dee6bcea", "metadata": { "execution": { "iopub.execute_input": "2025-09-25T06:33:22.243034Z", "iopub.status.busy": "2025-09-25T06:33:22.242888Z", "iopub.status.idle": "2025-09-25T06:33:22.245039Z", "shell.execute_reply": "2025-09-25T06:33:22.244672Z" } }, "outputs": [], "source": [ "if 0:\n", " filepath = writers.save_OS_instrument(ds_OS, basedir)\n", " print(filepath)" ] } ], "metadata": { "kernelspec": { "display_name": "venv (3.11.7)", "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.13.7" } }, "nbformat": 4, "nbformat_minor": 5 }