Skip to content

Latest commit

 

History

18 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

AxialFetch

Seafloor Geodetic Monitoring at Axial Seamount

Processing multi-year acoustic ranging data from cabled FETCH instruments to measure tectonic baseline distances on the Juan de Fuca Ridge

Python NumPy Pandas Matplotlib GSW


Overview

AxialFetch processes pressure, temperature, salinity, sound speed, and acoustic travel-time time series from three ocean-bottom stations at the summit caldera of Axial Seamount. The two-stage pipeline produces calibrated baseline distance measurements between all station pairs, enabling detection of volcanic deformation at centimeter-scale precision.

         Northern (2504)
         /            \
    NW  /              \  NE
       /                \
 Western (2503) ---- Eastern (2502)
           WE / EW

Station Network

Station ID Coordinates Caldera Position
Northern 2504 45.959 N, 130.011 W North side
Western 2503 45.947 N, 130.027 W West side
Eastern 2502 45.963 N, 129.991 W East side

Acoustic Baselines

Baseline Direction Length
NW / WN North ↔ West 1.765 km
NE / EN North ↔ East 1.642 km
WE / EW West ↔ East 3.260 km

Quick Start

# Step 1 — Build calibrated station DataFrames and harmonic velocities
python -m src.create_dataframes

# Step 2 — Compute distances, apply corrections, generate figures
python -m src.calculate_range

Pipeline 1 must complete before Pipeline 2 can run (Pipeline 2 loads pickle files produced by Pipeline 1).


Processing Pipelines

Pipeline 1 — create_dataframes

Ingests raw instrument data and produces calibrated, corrected per-station DataFrames.

Processing Steps
Step Description
1. Load FETCH CSVs Parse multi-code instrument files (TMP, DQZ, SSP, BSL, INC) for all three stations
2. Salinity correction Align CTD salinity from OOI cabled array (MJ03F), apply calibration residuals, correct data gaps via mean-shift
3. Build combined DataFrames Merge pressure, temperature (+0.351 °C offset for station 2504), and salinity per station
4. Tidal pressure correction Fit tidal predictions via least-squares optimization, remove tidal signal from pressure
5. Velocity computation Compute two sound speed estimates: SSP (onboard velocimeter) and TEOS-10 (via gsw)
6. Pressure post-processing Demean pressure and compute 15-day moving average, incorporating external NANO sensors
7. Harmonic mean velocities Compute pairwise harmonic means for both SSP-based and TEOS-10-based velocities
8. Tilt perturbation Project inclinometer pitch/roll through instrument headings onto baseline directions
Outputssrc/output/
File Contents
combined_df4.pkl Northern station (2504) — pressure, temperature, salinity, velocity, tidal correction
combined_df3.pkl Western station (2503)
combined_df2.pkl Eastern station (2502)
harmonic_mean_dfs.pkl SSP-based harmonic mean velocities (column: Harmonic Mean)
harmonic_df_dict.pkl TEOS-10-based harmonic mean velocities (column: HMean)
baseline_perturb.pkl Tilt-induced baseline perturbations (2504-2502_dL, 2504-2503_dL, 2502-2503_dL)

Pipeline 2 — calculate_range

Extracts acoustic range measurements, computes inter-station distances, applies corrections, and generates figures.

Processing Steps
Step Description
1. Load inputs Re-parse FETCH CSVs for BSL data; load pickle files from Pipeline 1
2. Extract & filter BSL Apply station-specific outlier filtering (see table below)
3. Compute distances Interpolate harmonic-mean velocity onto timestamps, calculate one-way distance
4. Tilt correction Subtract tilt-induced path-length perturbation from each distance
5. 30-day moving average Compute rolling 30-day mean on each baseline time series
6. Save distance CSVs Export 6 CSVs with Record Time, Distance (cm), Moving Average (cm)
7. Perturbation correction Apply tilt correction via merge_asof (nearest, 1-hour tolerance), save corrected CSVs
8. Generate figures Produce 21 PNG plots: time series, binned stats, bidirectional comparisons, precision analysis

Outlier Filtering Rules:

Baseline Method Parameters
NE (2504 → 2502) IQR Quantiles (0.15, 0.85)
NW (2504 → 2503) Hard threshold Range(ms) ≥ 2618
WE (2503 → 2502) IQR Quantiles (0.25, 0.75)
WN (2503 → 2504) IQR Quantiles (0.25, 0.75)
EW (2502 → 2503) Hard threshold Range(ms) ∈ [4636.2, 4638]
EN (2502 → 2504) Hard threshold Range(ms) ≥ 2400
Outputs — Distance CSVs

All saved to src/output/distances/:

Raw Corrected Baseline
NW_distance.csv NW_distance_corrected.csv North → West
NE_distance.csv NE_distance_corrected.csv North → East
WN_distance.csv WN_distance_corrected.csv West → North
WE_distance.csv WE_distance_corrected.csv West → East
EN_distance.csv EN_distance_corrected.csv East → North
EW_distance.csv EW_distance_corrected.csv East → West
Outputs — Figures

All saved to src/output/figures/:

Figure Description
{NW,NE,WE,WN,EW,EN}_distance.png Distance time series with scatter + 30-day moving average
{NW,NE,WE,WN,EW,EN}_binned.png 30-day binned mean ± 1 std error bars
North_West_vs_West_North.png Bidirectional comparison: NW vs WN
East_North_vs_North_East.png Bidirectional comparison: EN vs NE
West_East_vs_East_West.png Bidirectional comparison: WE vs EW
10day_std_all.png 10-day binned standard deviation, all 6 baselines
10day_std_normalized.png 10-day STD normalized by baseline length (cm/km)
10day_std_subplots.png 10-day STD in 3×1 subplot panels
10day_std_normalized_subplots.png Normalized 10-day STD in 3×1 subplot panels
rolling_std_normalized.png 30-day rolling STD normalized by baseline length
rolling_std_3baselines.png 30-day rolling STD for WN, NE, WE

Project Structure

AxialFetch/
├── src/
│   ├── __init__.py
│   ├── config.py               # Paths, constants, station metadata, baseline mappings
│   ├── data_loader.py          # FETCH CSV parsing (multi-code instrument files)
│   ├── salinity.py             # CTD salinity correction pipeline
│   ├── station_data.py         # Per-station combined DataFrame assembly
│   ├── tidal.py                # Tidal pressure correction (least-squares fit)
│   ├── velocity.py             # Sound speed: SSP interpolation + TEOS-10 via gsw
│   ├── pressure.py             # Pressure demeaning + 15-day moving average
│   ├── harmonic.py             # Harmonic mean computation (SSP + TEOS-10 based)
│   ├── tilt.py                 # Inclinometer → baseline perturbation + tilt correction
│   ├── create_dataframes.py    # Pipeline 1 orchestration
│   ├── range_filter.py         # BSL extraction, outlier filtering, distance computation
│   ├── range_correction.py     # Moving average, CSV export, perturbation correction
│   ├── range_figures.py        # All figure generation (21 plots)
│   ├── calculate_range.py      # Pipeline 2 orchestration
│   ├── VSM_forward.py          # Okada dislocation forward model (used by Slead notebooks)
│   ├── *.ipynb                 # Source notebooks + modeling/analysis work
│   └── output/
│       ├── *.pkl               # Pickle files from Pipeline 1
│       ├── distances/          # CSV files from Pipeline 2
│       ├── figures/            # PNG plots from Pipeline 2
│       └── drift/              # Drift-correction outputs from drift2.ipynb
├── Data/                       # All static inputs (referenced via config.DATA_DIR)
│   ├── Data_*_2502_.csv        # FETCH instrument data (Eastern)
│   ├── Data_*_2503_.csv        # FETCH instrument data (Western)
│   ├── Data_*_2504_.csv        # FETCH instrument data (Northern)
│   ├── model3a.h5, model3b.h5  # Slead et al. slip-inversion models
│   └── *_drifcor.csv, *.mat    # Drift corrections, misc inputs
├── Extra_files_fetch/          # Archived/exploratory work (PINN, common-mode, older baselines)
├── MJ03{E-B,F-B,F-E}/          # Differential pressure records
└── README.md

Paths to Data/ are centralised in src/config.py (DATA_DIR). Notebooks in src/ and Extra_files_fetch/ reach model files via the relative path ../Data/, so run them from the directory they live in.


Notebooks (src/)

The .py modules above are the maintained pipeline. The notebooks are the research record — where each processing step was worked out, plus modeling and figure work that never moved into the pipeline.

Pipeline sources

Notebook Description
Create_Dataframes.ipynb Source notebook for Pipeline 1; the modules were refactored out of this
Calculate_Range.ipynb Source notebook for Pipeline 2
FETCH StreamLine Final.ipynb Monolithic ancestor (172 cells) — full load → salinity → velocity → harmonic mean → range workflow in one notebook
FETCH Range Calculation.ipynb Later revision of the same monolith (140 cells); the two-notebook split came from these

Deformation forward modeling

Okada dislocation models from the Slead et al. slip inversions (Data/model3{a,b}.h5), used to predict what range change a given magma-source geometry should produce.

Notebook Description
Slead 3a.ipynb Loads model 3a → 574 patches → VSM_forward.okada on the full grid → validates UZ against saved Z → station displacements → predicted Δrange per baseline
Slead 3b.ipynb Same for model 3b
Slead_3a_station_only_fast.ipynb Fast path: evaluates Okada only at station coordinates, skipping the grid. No map or UZ validation

Pressure-driven range modeling

Least-squares fits of baseline range against bottom pressure plus an annual sine/cosine, to separate real deformation from seasonal and pressure-correlated signal.

Notebook Description
Axial Modeling West Final.ipynb West↔North baseline vs central pressure + annual terms; reports R² and de-seasonalised residuals
Axial Modeling East-West Final.ipynb East↔West baseline against three z-scored pressures (west, east, central) + annual terms

These two label station 2504 as "Central" (co-located with NodeF), not "Northern" as elsewhere in this README.

Drift and seasonality removal

Notebook Description
drift2.ipynb Piecewise instrument-drift fits P ≈ a + b·Pc + c·t' over manually chosen segments; converts F2025_all.dat to MJ03F format; writes F_node_pressure.csv
drift_removal.ipynb Successor to drift2 — same fit, cleaner workflow, plus depth-change extension. Writes per-station *_driftcorr_daily_*.csv
seasonality removal.ipynb Fits L = a·Pc + b·sin + c·cos + d to 30-day-MA baselines and subtracts the seasonal term. Writes baselines_fit_outputs.csv and the 4-panel summary figure
plots.ipynb Publication figures: cumulative seismic moment east vs west from the ForMaleenV4.mat earthquake catalogue, and baseline projections onto station geometry

Technical Reference

Sound Speed Computation

Two independent velocity estimates are computed for each station:

1. SSP (onboard velocimeter) Direct measurement from the FETCH instrument's sound speed profiler.

Station 2503 SSP data is unreliable and set to NaN.

2. TEOS-10 (derived) Calculated from temperature, pressure, and salinity using the Gibbs SeaWater library:

SA = gsw.SA_from_SP(S, P_dbar, lon, lat)   # Absolute Salinity
CT = gsw.CT_from_t(SA, T, P_dbar)           # Conservative Temperature
V  = gsw.sound_speed(SA, CT, P_dbar)        # Sound speed (m/s)

Pairwise harmonic means of velocities are used for distance calculation, representing the average velocity along the acoustic path between two stations.

Distance Formula
Distance (m) = V_harmonic × (Range_ms − TAT_ms) / 2000
Symbol Description
V_harmonic Pairwise harmonic mean sound speed (m/s)
Range_ms Measured two-way acoustic travel time (ms)
TAT_ms Instrument turnaround time (ms)
/ 2000 Converts ms → s (÷ 1000) and two-way → one-way (÷ 2)
Special Handling
Condition Treatment
Station 2503 SSP Set to NaN (no reliable velocimeter). harmonic_mean_dfs['2502_2503'] uses 2502_2504 data; harmonic_mean_dfs['2503_2504'] uses only station 2504 SSP
Station 2504 temperature +0.351 °C offset applied to TMP sensor readings
Tilt correction Inclinometer pitch/roll projected onto baseline directions to remove apparent distance changes from instrument tilting

Data Sources

Data Source Format
FETCH instrument data 3 CSV files in Data/ Multi-header CSV with codes (TMP, DQZ, SSP, BSL, INC)
CTD salinity OOI Cabled Array (RS03CCAL, MJ03F) CSV
Tidal predictions Pre-computed (2022–2025) Text (Year, Month, Day, Hour, Min, Sec, Value)
NANO pressure Bottom pressure recorders (MJ03F, MJ03E, MJ03B) .Data files

Requirements

python >= 3.8
pandas
numpy
scipy
matplotlib
gsw

About

This repository is designed to explore the FETCH data from Axial Seamount

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages