This project builds a high-resolution earthquake catalog for coastal and offshore Cascadia (2010–2015) from the Cascadia Initiative ocean-bottom seismometers (OBS) and regional land networks, using an ensemble deep-learning pipeline:
- Detection & phase picking with an ensemble picker (ELEP; Yuan et al., 2023),
- Phase association with the GENIE graph neural network (PyOcto was also tested),
- Relocation with GraphDD double-difference relocation, refined by waveform cross-correlation differential times (HypoDD was also tested),
- Quality control, magnitude estimation, and comparison against established catalogs — USGS ComCat and Morton et al., 2023.
The manuscript describing this work is authored in paper/ (Quarto → LaTeX,
synced to Overleaf; see paper/README.md).
Repository / software — code and analysis in this repository:
| Author | Affiliation | Contribution |
|---|---|---|
| Marine Denolle (mdenolle@uw.edu) | UW Earth & Space Sciences | project lead, magnitudes, QC/post-processing |
| Hiroto Bito (hbito@uw.edu) | UW Earth & Space Sciences | picking, amplitude, QC & post-processing pipeline |
| Qibin Shi (qibins@uw.edu) | UW Earth & Space Sciences | code |
| Yiyu Ni (niyiyu@uw.edu) | UW Earth & Space Sciences | code |
| Nathan T. Stevens (ntstevens@uw.edu) | Pacific Northwest Seismic Network | code |
| Ian W. McBrearty | Stanford Geophysics | graph networks — GENIE association & GraphDD relocation |
| Yifan Yu | Stanford Geophysics | graph networks — GENIE association & GraphDD relocation |
| Zoe Krauss (zkrauss@uw.edu) | UW Oceanography | results cross-checking |
Manuscript — the working paper draft in paper/ has a longer author
list: Marine Denolle, Hiroto Bito, Qibin Shi, Yiyu Ni, Ian W. McBrearty, Zoe Krauss,
Nathan T. Stevens, Yifan Yu, and Gregory C. Beroza (Stanford Geophysics).
| Stage | Where | Product | Version used |
|---|---|---|---|
| 1. Picking (ELEP ensemble) | workflow/01_picking/ |
39.6 M P/S picks | tag stage-picking-ver3, ELEP 2f3f22a9 |
| 2. Association (GENIE) | external (I. McBrearty); workflow/02_association/ |
116,591 events | see PROVENANCE |
| 3. Relocation (GraphDD) + CC refinement | external; CC datasets in workflow/03_relocation/ |
63,887 events, 1.00 M picks | tag stage-reloc-cc-qc-ver3 |
| 4. Merge + QC | workflow/04_merge_qc/ |
origin/arrival/assoc tables; 31,020-event QC subset | tag stage-reloc-cc-qc-ver3 |
| 5. Amplitudes (Route A) | workflow/05_magnitude/ (scale/run_route_a.sh) |
Wood–Anderson amplitude per pick | tag stage-routeA-v2-amplitudes |
| 6. Magnitudes | workflow/05_magnitude/ phase18 → phase19, then workflow/06_analysis/ phase10 |
preferred M (ML < 4.5, Mw above) for 55,707 events | tag magnitudes-v1 |
| 7. Analysis, figures, paper | workflow/06_analysis/, figures/, paper/ |
manuscript | release tag |
PROVENANCE.md records, for every product, the date, the code version
(git tag), the external tool and its version, the environment and checksums, and how to
check out the code of any single stage. GENIE and GraphDD are not part of this repository;
only their outputs are used. data/LINEAGE.md gives the file-by-file
creation chain and row counts. The planned reorganization and Zenodo release are in
CLEANUP_PLAN.md.
📜 README.md · PROVENANCE.md · INSTALL.md · LICENSE · CITATIONS.cff · CLEANUP_PLAN.md
📜 pixi.toml / pixi.lock # environments: default, internal (pnwstore), amplitude, paper
📜 Makefile # `make paper` (manuscript), `make figs` (collect paper figures)
📜 download_data.sh # rsync pipeline input catalogs from the lab server
📦 workflow # the pipeline, in run order
┣ 📦 01_picking # ELEP picking: run_picking.py + picking_config.csv; v5 picker dryrun_models.py; legacy/
┣ 📦 02_association # GENIE (external): version and outputs
┣ 📦 03_relocation # GraphDD (external); CC differential-time waveform dataset builders
┣ 📦 04_merge_qc # merge GraphDD + CC output; QC notebooks that write the final catalog
┣ 📦 05_magnitude # Route A amplitudes and magnitudes (phase1-4, 16-19), counts baseline
┗ 📦 06_analysis # maps and supplement analyses (phase5, 7-14), classification (phase10)
📦 scale # at-scale drivers: run_route_a.sh, run_fill.sh, inventory builders, RUNBOOK.md
📦 notebooks/diagnostics # notebooks behind QC choices; no paper figure
📦 figures # notebooks for Figs 1, 2, 3 (QC histograms), 4 (picks), 8
📦 data # small inputs and config; large CSVs as chunks in data/split_files/
📦 utils # data_client, paper_style, plot_utils, qc_utils, fetch_*, Zenodo helpers
📦 paper # Quarto → Seismica manuscript, auto-synced to Overleaf
Removed in the 2026-09 cleanup and kept at tag pre-cleanup-2026-09: old/ (abandoned
PyOcto association and HypoInverse location), 3_post_processing/ (a duplicate of
the old 4_relocation/), 0_data_availability/, and the superseded *_old.csv amplitude files.
Recommended: pixi — one command, reproducible.
# 1. Install pixi (once)
curl -fsSL https://pixi.sh/install.sh | bash
# 2. Clone (lightweight: see "Cloning" below)
git clone --filter=blob:none https://github.com/Denolle-Lab/cascadia_obs_ensemble.git
cd cascadia_obs_ensemble
# 3a. Public / EarthScope FDSN (default — works anywhere)
pixi install
# 3b. UW internal — also installs pnwstore waveform-archive access
pixi install --environment internal
# 3c. Manuscript toolchain (Quarto + LaTeX) — only if building the paper
pixi install --environment paper
# 4. Verify the install (imports the core deps + notebook stack)
pixi run verify
# 5. Use it
pixi run notebook # Jupyter (notebook workflow)
pixi run pick # example CLI entry point (workflow/01_picking)The git history is about 1.4 GB, mostly large CSVs and notebooks that were deleted long ago. It is kept on purpose, so that every stage in PROVENANCE.md can be checked out. The files at the tip are about 0.3 GB. You rarely need the history, so pick the lightest clone that works for you:
# files at the tip only, no history (smallest; cannot check out older tags)
git clone --depth 1 https://github.com/Denolle-Lab/cascadia_obs_ensemble.git
# full commit history, but file contents fetched only when needed (recommended):
# fast to clone, and `git checkout <tag>` still works (it downloads what that tag needs)
git clone --filter=blob:none https://github.com/Denolle-Lab/cascadia_obs_ensemble.git
# later, get one stage's code without the rest of the history
git fetch --depth 1 origin tag stage-routeA-v2-amplitudes
git worktree add ../cascadia-routeA-v2 stage-routeA-v2-amplitudes
# turn a shallow clone into a full one, if ever needed
git fetch --unshallowConda fallback: conda env create -f environment.yml && conda activate seismo_cobs
pip fallback: pip install -r requirements.txt (note: basemap and pygmt need
conda-forge / a system GMT; obspy is easiest via conda-forge).
The pipeline produces three nested datasets (each a smaller, higher-quality subset:
~39.6 M ELEP picks → 1.09 M associated picks / 116,591 events → 1.00 M relocated picks /
63,887 events → 31,020 events after QC). See data/LINEAGE.md for the
full creation-time lineage, row counts, and which files are final vs alternative.
Three distinct data products span the pipeline; they are not the same artifact:
- Raw ELEP picks (per-station P/S picks, 2010–2015) — the picker output, upstream of association. Currently on Google Drive (private until archived on Zenodo): Picks folder.
- Relocated catalog + picks (shipped in this repo,
data/) — the GraphDD-relocated event catalog (Cascadia_relocated_catalog_ver_3.csv) and its phase picks (Cascadia_relocated_catalog_picks_ver_3*, with optional Wood-Anderson amplitudes). These exceed GitHub's file-size limit, so they are committed as ≤50 MB chunks indata/split_files/(viautils/split_large_csvs.py). Rebuild the monoliths with:pixi run python utils/reconstruct_split_csvs.py # --list to preview - Final cross-correlated + QC-filtered catalog used in the paper figures
(
origin_2010_2015_reloc_cog_ver3_cc_p_4_s_4_rms_2_5.csv, plusarrival_*,assoc_*,all_stations_*, comparison catalogs) — these live on the lab server, not in the repo. Fetch them with:./download_data.sh mdenolle@<host> # small catalogs (fig1/4/5/6) ./download_data.sh mdenolle@<host> --with-picks # + arrival/assoc (fig3, large)
Filename conventions: reloc = GraphDD-relocated; cog = center-of-gravity cluster
step; cc = cross-correlation-refined; p_4_s_4_rms_2_5 = QC filter (more than 4 P and
more than 4 S picks, RMS < 2.5 s; this reproduces the 31,020-event file, see
PROVENANCE.md, stage 6). data/ds01.csv is Morton et al. (2023); nodes_*/vel_*.csv are
GraphDD velocity/region config; jgrb52524-* are external published supplements.
For publication, the code will be released through the GitHub–Zenodo integration, and the
data products (ANSS-style pick, association and origin tables with the magnitudes) as a
separate Zenodo data record. The plan is in CLEANUP_PLAN.md §6;
data/ZENODO.md is the older layout proposal.
make paper # paper/main.qmd -> paper/main.tex + main.pdf (Quarto -> Seismica -> tectonic)
make figs # collect figure PNGs into paper/figures/ (needs the data above)To regenerate the magnitude catalog and the figures that depend on it (from
workflow/05_magnitude/, default env, after the Route A products exist; see the
runbook):
python phase18_moment_tensor_match.py # ComCat moment tensors -> data/focal/comcat_mt_matched.csv
python phase19_preferred_magnitude.py # -> data/magnitude/cascadia_catalog_M_routeA.csv
cd ../06_analysis
python phase10_event_classification.py # -> cascadia_catalog_classified.csv (+ Fig. S4)See paper/README.md for the authoring + Overleaf-sync workflow.