Repository files navigation

Helicorder Plotter

Helicorder Plotter is a Python-based tool that fetches seismic waveform data from FDSN web services, generates 24-hour helicorder (dayplot) images with earthquake event annotations, and produces a self-contained static website for browsing the results — including an interactive Leaflet map of all station locations.

How It Works

config.ini FDSN dataselect IRIS event service
│ │ │
▼ ▼ ▼
read_station_config get_waveforms fetch_earthquake_events
│ │ │
│ ▼ │
│ ObsPy Stream ──────────────────┘
│ │
│ ▼
│ create_helicorder()
│ ├─ full-res PNG
│ └─ thumbnail PNG
│ │
▼ ▼
generate_html() copy_static_files()
│
▼
helicorder_plots/
├── index.html
├── map_view.html
├── station_data.json
├── <station>.html (one per station)
├── <station>.png
├── <station>_thumb.png
└── static/
├── css/styles.css
└── js/main.js

Pipeline Steps

  1. Configuration — Station definitions (network, station, channel, location) are read from config.ini.
  2. Earthquake events — Recent significant earthquakes (M5.5+, last 24 hours) are fetched from the IRIS FDSN event service to annotate the plots.
  3. Waveform retrieval — For each station, 24 hours of waveform data is requested from a local (or remote) FDSN dataselect service. Requests are parallelised across stations using a process pool.
  4. Plot generation — Each waveform stream is rendered as a helicorder dayplot via ObsPy, with earthquake events overlaid as annotations. A thumbnail is generated alongside the full-resolution image.
  5. HTML generation — Jinja2 templates produce an index page with thumbnail grid, individual station detail pages, and an interactive Leaflet map that plots each station's geographic coordinates.

Requirements

Python Dependencies

Listed in requirements.txt:

PackagePurpose
ObsPyWaveform I/O, dayplot rendering, UTCDateTime
matplotlibPlotting backend (used by ObsPy)
PillowThumbnail generation
requestsHTTP requests to FDSN services
Jinja2HTML template rendering

Installation

git clone https://github.com/comoglu/helicorder-plotter.git
cd helicorder-plotter
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt

Configuration

Station List (config.ini)

Each section defines a station to plot. The section name is Network.Station:

[AU.CNB]detecstream = BHZ
deteclocid = 00
[AU.CTA]detecstream = BHZ
deteclocid =
KeyDescription
detecstreamSEED channel code (e.g. BHZ, SHZ, HHZ, EHZ)
deteclocidSEED location code (e.g. 00, 01, or empty for --)

Service URLs (run.py)

Edit the constants at the top of run.py to point at your data sources:

BASE_URL="http://127.0.0.1:18081"# FDSN dataselect + station serviceEVENT_SERVICE_URL="http://service.iris.edu/fdsnws/event/1/query"# Earthquake event service

BASE_URL should point to a server that exposes both /fdsnws/dataselect/1/query and /fdsnws/station/1/query endpoints.

Usage

python run.py

The script will:

  1. Validate the station configuration
  2. Fetch M5.5+ earthquake events from the last 24 hours
  3. Download waveforms for each configured station (in parallel)
  4. Generate helicorder dayplots with event annotations
  5. Build a static HTML site in the helicorder_plots/ directory

Open helicorder_plots/index.html in a browser to view the results.

Output Structure

helicorder_plots/
├── index.html # Thumbnail grid of all stations
├── map_view.html # Interactive Leaflet map
├── station_data.json # Station coordinates for the map
├── AU.CNB.00.BHZ.html # Individual station detail page
├── AU.CNB.00.BHZ.png # Full-resolution helicorder plot
├── AU.CNB.00.BHZ_thumb.png # Thumbnail
├── static/
│ ├── css/styles.css
│ └── js/main.js
└── ...

Logs

Log files are written to logs/ with timestamps (e.g. logs/helicorder_plotter_20260318_120000.log). Both file and console logging are enabled.

Project Structure

helicorder-plotter/
├── run.py # Entry point and configuration constants
├── config.ini # Station definitions
├── requirements.txt # Python dependencies
├── src/
│ ├── __init__.py
│ ├── data_fetcher.py # Config parsing, FDSN requests, station info
│ ├── plot_generator.py # Helicorder plot creation, parallel processing
│ ├── html_generator.py # Jinja2 HTML generation, static file copying
│ └── utils.py # Logging setup, timing decorator
├── templates/
│ ├── all_stations.html # Index page template
│ ├── station.html # Individual station page template
│ └── map_view.html # Leaflet map template
└── static/
├── css/styles.css # Shared stylesheet
└── js/main.js # Map initialisation script

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License — see the LICENSE file for details.

About

Helicorder Plotter is a Python-based tool for generating and visualizing helicorder plots from seismic data. It fetches data from seismic stations, creates helicorder plots, and generates an interactive web interface for viewing the plots.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Helicorder Plotter

Helicorder Plotter is a Python-based tool that fetches seismic waveform data from FDSN web services, generates 24-hour helicorder (dayplot) images with earthquake event annotations, and produces a self-contained static website for browsing the results — including an interactive Leaflet map of all station locations.

How It Works

config.ini FDSN dataselect IRIS event service
│ │ │
▼ ▼ ▼
read_station_config get_waveforms fetch_earthquake_events
│ │ │
│ ▼ │
│ ObsPy Stream ──────────────────┘
│ │
│ ▼
│ create_helicorder()
│ ├─ full-res PNG
│ └─ thumbnail PNG
│ │
▼ ▼
generate_html() copy_static_files()
│
▼
helicorder_plots/
├── index.html
├── map_view.html
├── station_data.json
├── <station>.html (one per station)
├── <station>.png
├── <station>_thumb.png
└── static/
├── css/styles.css
└── js/main.js

Pipeline Steps

  1. Configuration — Station definitions (network, station, channel, location) are read from config.ini.
  2. Earthquake events — Recent significant earthquakes (M5.5+, last 24 hours) are fetched from the IRIS FDSN event service to annotate the plots.
  3. Waveform retrieval — For each station, 24 hours of waveform data is requested from a local (or remote) FDSN dataselect service. Requests are parallelised across stations using a process pool.
  4. Plot generation — Each waveform stream is rendered as a helicorder dayplot via ObsPy, with earthquake events overlaid as annotations. A thumbnail is generated alongside the full-resolution image.
  5. HTML generation — Jinja2 templates produce an index page with thumbnail grid, individual station detail pages, and an interactive Leaflet map that plots each station's geographic coordinates.

Requirements

Python Dependencies

Listed in requirements.txt:

PackagePurpose
ObsPyWaveform I/O, dayplot rendering, UTCDateTime
matplotlibPlotting backend (used by ObsPy)
PillowThumbnail generation
requestsHTTP requests to FDSN services
Jinja2HTML template rendering

Installation

git clone https://github.com/comoglu/helicorder-plotter.git
cd helicorder-plotter
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt

Configuration

Station List (config.ini)

Each section defines a station to plot. The section name is Network.Station:

[AU.CNB]detecstream = BHZ
deteclocid = 00
[AU.CTA]detecstream = BHZ
deteclocid =
KeyDescription
detecstreamSEED channel code (e.g. BHZ, SHZ, HHZ, EHZ)
deteclocidSEED location code (e.g. 00, 01, or empty for --)

Service URLs (run.py)

Edit the constants at the top of run.py to point at your data sources:

BASE_URL="http://127.0.0.1:18081"# FDSN dataselect + station serviceEVENT_SERVICE_URL="http://service.iris.edu/fdsnws/event/1/query"# Earthquake event service

BASE_URL should point to a server that exposes both /fdsnws/dataselect/1/query and /fdsnws/station/1/query endpoints.

Usage

python run.py

The script will:

  1. Validate the station configuration
  2. Fetch M5.5+ earthquake events from the last 24 hours
  3. Download waveforms for each configured station (in parallel)
  4. Generate helicorder dayplots with event annotations
  5. Build a static HTML site in the helicorder_plots/ directory

Open helicorder_plots/index.html in a browser to view the results.

Output Structure

helicorder_plots/
├── index.html # Thumbnail grid of all stations
├── map_view.html # Interactive Leaflet map
├── station_data.json # Station coordinates for the map
├── AU.CNB.00.BHZ.html # Individual station detail page
├── AU.CNB.00.BHZ.png # Full-resolution helicorder plot
├── AU.CNB.00.BHZ_thumb.png # Thumbnail
├── static/
│ ├── css/styles.css
│ └── js/main.js
└── ...

Logs

Log files are written to logs/ with timestamps (e.g. logs/helicorder_plotter_20260318_120000.log). Both file and console logging are enabled.

Project Structure

helicorder-plotter/
├── run.py # Entry point and configuration constants
├── config.ini # Station definitions
├── requirements.txt # Python dependencies
├── src/
│ ├── __init__.py
│ ├── data_fetcher.py # Config parsing, FDSN requests, station info
│ ├── plot_generator.py # Helicorder plot creation, parallel processing
│ ├── html_generator.py # Jinja2 HTML generation, static file copying
│ └── utils.py # Logging setup, timing decorator
├── templates/
│ ├── all_stations.html # Index page template
│ ├── station.html # Individual station page template
│ └── map_view.html # Leaflet map template
└── static/
├── css/styles.css # Shared stylesheet
└── js/main.js # Map initialisation script

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License — see the LICENSE file for details.

About

Helicorder Plotter is a Python-based tool for generating and visualizing helicorder plots from seismic data. It fetches data from seismic stations, creates helicorder plots, and generates an interactive web interface for viewing the plots.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Helicorder Plotter

Helicorder Plotter is a Python-based tool that fetches seismic waveform data from FDSN web services, generates 24-hour helicorder (dayplot) images with earthquake event annotations, and produces a self-contained static website for browsing the results — including an interactive Leaflet map of all station locations.

How It Works

config.ini FDSN dataselect IRIS event service
│ │ │
▼ ▼ ▼
read_station_config get_waveforms fetch_earthquake_events
│ │ │
│ ▼ │
│ ObsPy Stream ──────────────────┘
│ │
│ ▼
│ create_helicorder()
│ ├─ full-res PNG
│ └─ thumbnail PNG
│ │
▼ ▼
generate_html() copy_static_files()
│
▼
helicorder_plots/
├── index.html
├── map_view.html
├── station_data.json
├── <station>.html (one per station)
├── <station>.png
├── <station>_thumb.png
└── static/
├── css/styles.css
└── js/main.js

Pipeline Steps

  1. Configuration — Station definitions (network, station, channel, location) are read from config.ini.
  2. Earthquake events — Recent significant earthquakes (M5.5+, last 24 hours) are fetched from the IRIS FDSN event service to annotate the plots.
  3. Waveform retrieval — For each station, 24 hours of waveform data is requested from a local (or remote) FDSN dataselect service. Requests are parallelised across stations using a process pool.
  4. Plot generation — Each waveform stream is rendered as a helicorder dayplot via ObsPy, with earthquake events overlaid as annotations. A thumbnail is generated alongside the full-resolution image.
  5. HTML generation — Jinja2 templates produce an index page with thumbnail grid, individual station detail pages, and an interactive Leaflet map that plots each station's geographic coordinates.

Requirements

Python Dependencies

Listed in requirements.txt:

PackagePurpose
ObsPyWaveform I/O, dayplot rendering, UTCDateTime
matplotlibPlotting backend (used by ObsPy)
PillowThumbnail generation
requestsHTTP requests to FDSN services
Jinja2HTML template rendering

Installation

git clone https://github.com/comoglu/helicorder-plotter.git
cd helicorder-plotter
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt

Configuration

Station List (config.ini)

Each section defines a station to plot. The section name is Network.Station:

[AU.CNB]detecstream = BHZ
deteclocid = 00
[AU.CTA]detecstream = BHZ
deteclocid =
KeyDescription
detecstreamSEED channel code (e.g. BHZ, SHZ, HHZ, EHZ)
deteclocidSEED location code (e.g. 00, 01, or empty for --)

Service URLs (run.py)

Edit the constants at the top of run.py to point at your data sources:

BASE_URL="http://127.0.0.1:18081"# FDSN dataselect + station serviceEVENT_SERVICE_URL="http://service.iris.edu/fdsnws/event/1/query"# Earthquake event service

BASE_URL should point to a server that exposes both /fdsnws/dataselect/1/query and /fdsnws/station/1/query endpoints.

Usage

python run.py

The script will:

  1. Validate the station configuration
  2. Fetch M5.5+ earthquake events from the last 24 hours
  3. Download waveforms for each configured station (in parallel)
  4. Generate helicorder dayplots with event annotations
  5. Build a static HTML site in the helicorder_plots/ directory

Open helicorder_plots/index.html in a browser to view the results.

Output Structure

helicorder_plots/
├── index.html # Thumbnail grid of all stations
├── map_view.html # Interactive Leaflet map
├── station_data.json # Station coordinates for the map
├── AU.CNB.00.BHZ.html # Individual station detail page
├── AU.CNB.00.BHZ.png # Full-resolution helicorder plot
├── AU.CNB.00.BHZ_thumb.png # Thumbnail
├── static/
│ ├── css/styles.css
│ └── js/main.js
└── ...

Logs

Log files are written to logs/ with timestamps (e.g. logs/helicorder_plotter_20260318_120000.log). Both file and console logging are enabled.

Project Structure

helicorder-plotter/
├── run.py # Entry point and configuration constants
├── config.ini # Station definitions
├── requirements.txt # Python dependencies
├── src/
│ ├── __init__.py
│ ├── data_fetcher.py # Config parsing, FDSN requests, station info
│ ├── plot_generator.py # Helicorder plot creation, parallel processing
│ ├── html_generator.py # Jinja2 HTML generation, static file copying
│ └── utils.py # Logging setup, timing decorator
├── templates/
│ ├── all_stations.html # Index page template
│ ├── station.html # Individual station page template
│ └── map_view.html # Leaflet map template
└── static/
├── css/styles.css # Shared stylesheet
└── js/main.js # Map initialisation script

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License — see the LICENSE file for details.

About

Helicorder Plotter is a Python-based tool for generating and visualizing helicorder plots from seismic data. It fetches data from seismic stations, creates helicorder plots, and generates an interactive web interface for viewing the plots.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Helicorder Plotter

Helicorder Plotter is a Python-based tool that fetches seismic waveform data from FDSN web services, generates 24-hour helicorder (dayplot) images with earthquake event annotations, and produces a self-contained static website for browsing the results — including an interactive Leaflet map of all station locations.

How It Works

config.ini FDSN dataselect IRIS event service
│ │ │
▼ ▼ ▼
read_station_config get_waveforms fetch_earthquake_events
│ │ │
│ ▼ │
│ ObsPy Stream ──────────────────┘
│ │
│ ▼
│ create_helicorder()
│ ├─ full-res PNG
│ └─ thumbnail PNG
│ │
▼ ▼
generate_html() copy_static_files()
│
▼
helicorder_plots/
├── index.html
├── map_view.html
├── station_data.json
├── <station>.html (one per station)
├── <station>.png
├── <station>_thumb.png
└── static/
├── css/styles.css
└── js/main.js

Pipeline Steps

  1. Configuration — Station definitions (network, station, channel, location) are read from config.ini.
  2. Earthquake events — Recent significant earthquakes (M5.5+, last 24 hours) are fetched from the IRIS FDSN event service to annotate the plots.
  3. Waveform retrieval — For each station, 24 hours of waveform data is requested from a local (or remote) FDSN dataselect service. Requests are parallelised across stations using a process pool.
  4. Plot generation — Each waveform stream is rendered as a helicorder dayplot via ObsPy, with earthquake events overlaid as annotations. A thumbnail is generated alongside the full-resolution image.
  5. HTML generation — Jinja2 templates produce an index page with thumbnail grid, individual station detail pages, and an interactive Leaflet map that plots each station's geographic coordinates.

Requirements

Python Dependencies

Listed in requirements.txt:

PackagePurpose
ObsPyWaveform I/O, dayplot rendering, UTCDateTime
matplotlibPlotting backend (used by ObsPy)
PillowThumbnail generation
requestsHTTP requests to FDSN services
Jinja2HTML template rendering

Installation

git clone https://github.com/comoglu/helicorder-plotter.git
cd helicorder-plotter
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt

Configuration

Station List (config.ini)

Each section defines a station to plot. The section name is Network.Station:

[AU.CNB]detecstream = BHZ
deteclocid = 00
[AU.CTA]detecstream = BHZ
deteclocid =
KeyDescription
detecstreamSEED channel code (e.g. BHZ, SHZ, HHZ, EHZ)
deteclocidSEED location code (e.g. 00, 01, or empty for --)

Service URLs (run.py)

Edit the constants at the top of run.py to point at your data sources:

BASE_URL="http://127.0.0.1:18081"# FDSN dataselect + station serviceEVENT_SERVICE_URL="http://service.iris.edu/fdsnws/event/1/query"# Earthquake event service

BASE_URL should point to a server that exposes both /fdsnws/dataselect/1/query and /fdsnws/station/1/query endpoints.

Usage

python run.py

The script will:

  1. Validate the station configuration
  2. Fetch M5.5+ earthquake events from the last 24 hours
  3. Download waveforms for each configured station (in parallel)
  4. Generate helicorder dayplots with event annotations
  5. Build a static HTML site in the helicorder_plots/ directory

Open helicorder_plots/index.html in a browser to view the results.

Output Structure

helicorder_plots/
├── index.html # Thumbnail grid of all stations
├── map_view.html # Interactive Leaflet map
├── station_data.json # Station coordinates for the map
├── AU.CNB.00.BHZ.html # Individual station detail page
├── AU.CNB.00.BHZ.png # Full-resolution helicorder plot
├── AU.CNB.00.BHZ_thumb.png # Thumbnail
├── static/
│ ├── css/styles.css
│ └── js/main.js
└── ...

Logs

Log files are written to logs/ with timestamps (e.g. logs/helicorder_plotter_20260318_120000.log). Both file and console logging are enabled.

Project Structure

helicorder-plotter/
├── run.py # Entry point and configuration constants
├── config.ini # Station definitions
├── requirements.txt # Python dependencies
├── src/
│ ├── __init__.py
│ ├── data_fetcher.py # Config parsing, FDSN requests, station info
│ ├── plot_generator.py # Helicorder plot creation, parallel processing
│ ├── html_generator.py # Jinja2 HTML generation, static file copying
│ └── utils.py # Logging setup, timing decorator
├── templates/
│ ├── all_stations.html # Index page template
│ ├── station.html # Individual station page template
│ └── map_view.html # Leaflet map template
└── static/
├── css/styles.css # Shared stylesheet
└── js/main.js # Map initialisation script

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License — see the LICENSE file for details.

About

Helicorder Plotter is a Python-based tool for generating and visualizing helicorder plots from seismic data. It fetches data from seismic stations, creates helicorder plots, and generates an interactive web interface for viewing the plots.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Helicorder Plotter

Helicorder Plotter is a Python-based tool that fetches seismic waveform data from FDSN web services, generates 24-hour helicorder (dayplot) images with earthquake event annotations, and produces a self-contained static website for browsing the results — including an interactive Leaflet map of all station locations.

How It Works

config.ini FDSN dataselect IRIS event service
│ │ │
▼ ▼ ▼
read_station_config get_waveforms fetch_earthquake_events
│ │ │
│ ▼ │
│ ObsPy Stream ──────────────────┘
│ │
│ ▼
│ create_helicorder()
│ ├─ full-res PNG
│ └─ thumbnail PNG
│ │
▼ ▼
generate_html() copy_static_files()
│
▼
helicorder_plots/
├── index.html
├── map_view.html
├── station_data.json
├── <station>.html (one per station)
├── <station>.png
├── <station>_thumb.png
└── static/
├── css/styles.css
└── js/main.js

Pipeline Steps

  1. Configuration — Station definitions (network, station, channel, location) are read from config.ini.
  2. Earthquake events — Recent significant earthquakes (M5.5+, last 24 hours) are fetched from the IRIS FDSN event service to annotate the plots.
  3. Waveform retrieval — For each station, 24 hours of waveform data is requested from a local (or remote) FDSN dataselect service. Requests are parallelised across stations using a process pool.
  4. Plot generation — Each waveform stream is rendered as a helicorder dayplot via ObsPy, with earthquake events overlaid as annotations. A thumbnail is generated alongside the full-resolution image.
  5. HTML generation — Jinja2 templates produce an index page with thumbnail grid, individual station detail pages, and an interactive Leaflet map that plots each station's geographic coordinates.

Requirements

Python Dependencies

Listed in requirements.txt:

PackagePurpose
ObsPyWaveform I/O, dayplot rendering, UTCDateTime
matplotlibPlotting backend (used by ObsPy)
PillowThumbnail generation
requestsHTTP requests to FDSN services
Jinja2HTML template rendering

Installation

git clone https://github.com/comoglu/helicorder-plotter.git
cd helicorder-plotter
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt

Configuration

Station List (config.ini)

Each section defines a station to plot. The section name is Network.Station:

[AU.CNB]detecstream = BHZ
deteclocid = 00
[AU.CTA]detecstream = BHZ
deteclocid =
KeyDescription
detecstreamSEED channel code (e.g. BHZ, SHZ, HHZ, EHZ)
deteclocidSEED location code (e.g. 00, 01, or empty for --)

Service URLs (run.py)

Edit the constants at the top of run.py to point at your data sources:

BASE_URL="http://127.0.0.1:18081"# FDSN dataselect + station serviceEVENT_SERVICE_URL="http://service.iris.edu/fdsnws/event/1/query"# Earthquake event service

BASE_URL should point to a server that exposes both /fdsnws/dataselect/1/query and /fdsnws/station/1/query endpoints.

Usage

python run.py

The script will:

  1. Validate the station configuration
  2. Fetch M5.5+ earthquake events from the last 24 hours
  3. Download waveforms for each configured station (in parallel)
  4. Generate helicorder dayplots with event annotations
  5. Build a static HTML site in the helicorder_plots/ directory

Open helicorder_plots/index.html in a browser to view the results.

Output Structure

helicorder_plots/
├── index.html # Thumbnail grid of all stations
├── map_view.html # Interactive Leaflet map
├── station_data.json # Station coordinates for the map
├── AU.CNB.00.BHZ.html # Individual station detail page
├── AU.CNB.00.BHZ.png # Full-resolution helicorder plot
├── AU.CNB.00.BHZ_thumb.png # Thumbnail
├── static/
│ ├── css/styles.css
│ └── js/main.js
└── ...

Logs

Log files are written to logs/ with timestamps (e.g. logs/helicorder_plotter_20260318_120000.log). Both file and console logging are enabled.

Project Structure

helicorder-plotter/
├── run.py # Entry point and configuration constants
├── config.ini # Station definitions
├── requirements.txt # Python dependencies
├── src/
│ ├── __init__.py
│ ├── data_fetcher.py # Config parsing, FDSN requests, station info
│ ├── plot_generator.py # Helicorder plot creation, parallel processing
│ ├── html_generator.py # Jinja2 HTML generation, static file copying
│ └── utils.py # Logging setup, timing decorator
├── templates/
│ ├── all_stations.html # Index page template
│ ├── station.html # Individual station page template
│ └── map_view.html # Leaflet map template
└── static/
├── css/styles.css # Shared stylesheet
└── js/main.js # Map initialisation script

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License — see the LICENSE file for details.

About

Helicorder Plotter is a Python-based tool for generating and visualizing helicorder plots from seismic data. It fetches data from seismic stations, creates helicorder plots, and generates an interactive web interface for viewing the plots.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Helicorder Plotter

Helicorder Plotter is a Python-based tool that fetches seismic waveform data from FDSN web services, generates 24-hour helicorder (dayplot) images with earthquake event annotations, and produces a self-contained static website for browsing the results — including an interactive Leaflet map of all station locations.

How It Works

config.ini FDSN dataselect IRIS event service
│ │ │
▼ ▼ ▼
read_station_config get_waveforms fetch_earthquake_events
│ │ │
│ ▼ │
│ ObsPy Stream ──────────────────┘
│ │
│ ▼
│ create_helicorder()
│ ├─ full-res PNG
│ └─ thumbnail PNG
│ │
▼ ▼
generate_html() copy_static_files()
│
▼
helicorder_plots/
├── index.html
├── map_view.html
├── station_data.json
├── <station>.html (one per station)
├── <station>.png
├── <station>_thumb.png
└── static/
├── css/styles.css
└── js/main.js

Pipeline Steps

  1. Configuration — Station definitions (network, station, channel, location) are read from config.ini.
  2. Earthquake events — Recent significant earthquakes (M5.5+, last 24 hours) are fetched from the IRIS FDSN event service to annotate the plots.
  3. Waveform retrieval — For each station, 24 hours of waveform data is requested from a local (or remote) FDSN dataselect service. Requests are parallelised across stations using a process pool.
  4. Plot generation — Each waveform stream is rendered as a helicorder dayplot via ObsPy, with earthquake events overlaid as annotations. A thumbnail is generated alongside the full-resolution image.
  5. HTML generation — Jinja2 templates produce an index page with thumbnail grid, individual station detail pages, and an interactive Leaflet map that plots each station's geographic coordinates.

Requirements

Python Dependencies

Listed in requirements.txt:

PackagePurpose
ObsPyWaveform I/O, dayplot rendering, UTCDateTime
matplotlibPlotting backend (used by ObsPy)
PillowThumbnail generation
requestsHTTP requests to FDSN services
Jinja2HTML template rendering

Installation

git clone https://github.com/comoglu/helicorder-plotter.git
cd helicorder-plotter
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt

Configuration

Station List (config.ini)

Each section defines a station to plot. The section name is Network.Station:

[AU.CNB]detecstream = BHZ
deteclocid = 00
[AU.CTA]detecstream = BHZ
deteclocid =
KeyDescription
detecstreamSEED channel code (e.g. BHZ, SHZ, HHZ, EHZ)
deteclocidSEED location code (e.g. 00, 01, or empty for --)

Service URLs (run.py)

Edit the constants at the top of run.py to point at your data sources:

BASE_URL="http://127.0.0.1:18081"# FDSN dataselect + station serviceEVENT_SERVICE_URL="http://service.iris.edu/fdsnws/event/1/query"# Earthquake event service

BASE_URL should point to a server that exposes both /fdsnws/dataselect/1/query and /fdsnws/station/1/query endpoints.

Usage

python run.py

The script will:

  1. Validate the station configuration
  2. Fetch M5.5+ earthquake events from the last 24 hours
  3. Download waveforms for each configured station (in parallel)
  4. Generate helicorder dayplots with event annotations
  5. Build a static HTML site in the helicorder_plots/ directory

Open helicorder_plots/index.html in a browser to view the results.

Output Structure

helicorder_plots/
├── index.html # Thumbnail grid of all stations
├── map_view.html # Interactive Leaflet map
├── station_data.json # Station coordinates for the map
├── AU.CNB.00.BHZ.html # Individual station detail page
├── AU.CNB.00.BHZ.png # Full-resolution helicorder plot
├── AU.CNB.00.BHZ_thumb.png # Thumbnail
├── static/
│ ├── css/styles.css
│ └── js/main.js
└── ...

Logs

Log files are written to logs/ with timestamps (e.g. logs/helicorder_plotter_20260318_120000.log). Both file and console logging are enabled.

Project Structure

helicorder-plotter/
├── run.py # Entry point and configuration constants
├── config.ini # Station definitions
├── requirements.txt # Python dependencies
├── src/
│ ├── __init__.py
│ ├── data_fetcher.py # Config parsing, FDSN requests, station info
│ ├── plot_generator.py # Helicorder plot creation, parallel processing
│ ├── html_generator.py # Jinja2 HTML generation, static file copying
│ └── utils.py # Logging setup, timing decorator
├── templates/
│ ├── all_stations.html # Index page template
│ ├── station.html # Individual station page template
│ └── map_view.html # Leaflet map template
└── static/
├── css/styles.css # Shared stylesheet
└── js/main.js # Map initialisation script

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License — see the LICENSE file for details.

About

Helicorder Plotter is a Python-based tool for generating and visualizing helicorder plots from seismic data. It fetches data from seismic stations, creates helicorder plots, and generates an interactive web interface for viewing the plots.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Helicorder Plotter

Helicorder Plotter is a Python-based tool that fetches seismic waveform data from FDSN web services, generates 24-hour helicorder (dayplot) images with earthquake event annotations, and produces a self-contained static website for browsing the results — including an interactive Leaflet map of all station locations.

How It Works

config.ini FDSN dataselect IRIS event service
│ │ │
▼ ▼ ▼
read_station_config get_waveforms fetch_earthquake_events
│ │ │
│ ▼ │
│ ObsPy Stream ──────────────────┘
│ │
│ ▼
│ create_helicorder()
│ ├─ full-res PNG
│ └─ thumbnail PNG
│ │
▼ ▼
generate_html() copy_static_files()
│
▼
helicorder_plots/
├── index.html
├── map_view.html
├── station_data.json
├── <station>.html (one per station)
├── <station>.png
├── <station>_thumb.png
└── static/
├── css/styles.css
└── js/main.js

Pipeline Steps

  1. Configuration — Station definitions (network, station, channel, location) are read from config.ini.
  2. Earthquake events — Recent significant earthquakes (M5.5+, last 24 hours) are fetched from the IRIS FDSN event service to annotate the plots.
  3. Waveform retrieval — For each station, 24 hours of waveform data is requested from a local (or remote) FDSN dataselect service. Requests are parallelised across stations using a process pool.
  4. Plot generation — Each waveform stream is rendered as a helicorder dayplot via ObsPy, with earthquake events overlaid as annotations. A thumbnail is generated alongside the full-resolution image.
  5. HTML generation — Jinja2 templates produce an index page with thumbnail grid, individual station detail pages, and an interactive Leaflet map that plots each station's geographic coordinates.

Requirements

Python Dependencies

Listed in requirements.txt:

PackagePurpose
ObsPyWaveform I/O, dayplot rendering, UTCDateTime
matplotlibPlotting backend (used by ObsPy)
PillowThumbnail generation
requestsHTTP requests to FDSN services
Jinja2HTML template rendering

Installation

git clone https://github.com/comoglu/helicorder-plotter.git
cd helicorder-plotter
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt

Configuration

Station List (config.ini)

Each section defines a station to plot. The section name is Network.Station:

[AU.CNB]detecstream = BHZ
deteclocid = 00
[AU.CTA]detecstream = BHZ
deteclocid =
KeyDescription
detecstreamSEED channel code (e.g. BHZ, SHZ, HHZ, EHZ)
deteclocidSEED location code (e.g. 00, 01, or empty for --)

Service URLs (run.py)

Edit the constants at the top of run.py to point at your data sources:

BASE_URL="http://127.0.0.1:18081"# FDSN dataselect + station serviceEVENT_SERVICE_URL="http://service.iris.edu/fdsnws/event/1/query"# Earthquake event service

BASE_URL should point to a server that exposes both /fdsnws/dataselect/1/query and /fdsnws/station/1/query endpoints.

Usage

python run.py

The script will:

  1. Validate the station configuration
  2. Fetch M5.5+ earthquake events from the last 24 hours
  3. Download waveforms for each configured station (in parallel)
  4. Generate helicorder dayplots with event annotations
  5. Build a static HTML site in the helicorder_plots/ directory

Open helicorder_plots/index.html in a browser to view the results.

Output Structure

helicorder_plots/
├── index.html # Thumbnail grid of all stations
├── map_view.html # Interactive Leaflet map
├── station_data.json # Station coordinates for the map
├── AU.CNB.00.BHZ.html # Individual station detail page
├── AU.CNB.00.BHZ.png # Full-resolution helicorder plot
├── AU.CNB.00.BHZ_thumb.png # Thumbnail
├── static/
│ ├── css/styles.css
│ └── js/main.js
└── ...

Logs

Log files are written to logs/ with timestamps (e.g. logs/helicorder_plotter_20260318_120000.log). Both file and console logging are enabled.

Project Structure

helicorder-plotter/
├── run.py # Entry point and configuration constants
├── config.ini # Station definitions
├── requirements.txt # Python dependencies
├── src/
│ ├── __init__.py
│ ├── data_fetcher.py # Config parsing, FDSN requests, station info
│ ├── plot_generator.py # Helicorder plot creation, parallel processing
│ ├── html_generator.py # Jinja2 HTML generation, static file copying
│ └── utils.py # Logging setup, timing decorator
├── templates/
│ ├── all_stations.html # Index page template
│ ├── station.html # Individual station page template
│ └── map_view.html # Leaflet map template
└── static/
├── css/styles.css # Shared stylesheet
└── js/main.js # Map initialisation script

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License — see the LICENSE file for details.

About

Helicorder Plotter is a Python-based tool for generating and visualizing helicorder plots from seismic data. It fetches data from seismic stations, creates helicorder plots, and generates an interactive web interface for viewing the plots.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Helicorder Plotter

Helicorder Plotter is a Python-based tool that fetches seismic waveform data from FDSN web services, generates 24-hour helicorder (dayplot) images with earthquake event annotations, and produces a self-contained static website for browsing the results — including an interactive Leaflet map of all station locations.

How It Works

config.ini FDSN dataselect IRIS event service
│ │ │
▼ ▼ ▼
read_station_config get_waveforms fetch_earthquake_events
│ │ │
│ ▼ │
│ ObsPy Stream ──────────────────┘
│ │
│ ▼
│ create_helicorder()
│ ├─ full-res PNG
│ └─ thumbnail PNG
│ │
▼ ▼
generate_html() copy_static_files()
│
▼
helicorder_plots/
├── index.html
├── map_view.html
├── station_data.json
├── <station>.html (one per station)
├── <station>.png
├── <station>_thumb.png
└── static/
├── css/styles.css
└── js/main.js

Pipeline Steps

  1. Configuration — Station definitions (network, station, channel, location) are read from config.ini.
  2. Earthquake events — Recent significant earthquakes (M5.5+, last 24 hours) are fetched from the IRIS FDSN event service to annotate the plots.
  3. Waveform retrieval — For each station, 24 hours of waveform data is requested from a local (or remote) FDSN dataselect service. Requests are parallelised across stations using a process pool.
  4. Plot generation — Each waveform stream is rendered as a helicorder dayplot via ObsPy, with earthquake events overlaid as annotations. A thumbnail is generated alongside the full-resolution image.
  5. HTML generation — Jinja2 templates produce an index page with thumbnail grid, individual station detail pages, and an interactive Leaflet map that plots each station's geographic coordinates.

Requirements

Python Dependencies

Listed in requirements.txt:

PackagePurpose
ObsPyWaveform I/O, dayplot rendering, UTCDateTime
matplotlibPlotting backend (used by ObsPy)
PillowThumbnail generation
requestsHTTP requests to FDSN services
Jinja2HTML template rendering

Installation

git clone https://github.com/comoglu/helicorder-plotter.git
cd helicorder-plotter
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt

Configuration

Station List (config.ini)

Each section defines a station to plot. The section name is Network.Station:

[AU.CNB]detecstream = BHZ
deteclocid = 00
[AU.CTA]detecstream = BHZ
deteclocid =
KeyDescription
detecstreamSEED channel code (e.g. BHZ, SHZ, HHZ, EHZ)
deteclocidSEED location code (e.g. 00, 01, or empty for --)

Service URLs (run.py)

Edit the constants at the top of run.py to point at your data sources:

BASE_URL="http://127.0.0.1:18081"# FDSN dataselect + station serviceEVENT_SERVICE_URL="http://service.iris.edu/fdsnws/event/1/query"# Earthquake event service

BASE_URL should point to a server that exposes both /fdsnws/dataselect/1/query and /fdsnws/station/1/query endpoints.

Usage

python run.py

The script will:

  1. Validate the station configuration
  2. Fetch M5.5+ earthquake events from the last 24 hours
  3. Download waveforms for each configured station (in parallel)
  4. Generate helicorder dayplots with event annotations
  5. Build a static HTML site in the helicorder_plots/ directory

Open helicorder_plots/index.html in a browser to view the results.

Output Structure

helicorder_plots/
├── index.html # Thumbnail grid of all stations
├── map_view.html # Interactive Leaflet map
├── station_data.json # Station coordinates for the map
├── AU.CNB.00.BHZ.html # Individual station detail page
├── AU.CNB.00.BHZ.png # Full-resolution helicorder plot
├── AU.CNB.00.BHZ_thumb.png # Thumbnail
├── static/
│ ├── css/styles.css
│ └── js/main.js
└── ...

Logs

Log files are written to logs/ with timestamps (e.g. logs/helicorder_plotter_20260318_120000.log). Both file and console logging are enabled.

Project Structure

helicorder-plotter/
├── run.py # Entry point and configuration constants
├── config.ini # Station definitions
├── requirements.txt # Python dependencies
├── src/
│ ├── __init__.py
│ ├── data_fetcher.py # Config parsing, FDSN requests, station info
│ ├── plot_generator.py # Helicorder plot creation, parallel processing
│ ├── html_generator.py # Jinja2 HTML generation, static file copying
│ └── utils.py # Logging setup, timing decorator
├── templates/
│ ├── all_stations.html # Index page template
│ ├── station.html # Individual station page template
│ └── map_view.html # Leaflet map template
└── static/
├── css/styles.css # Shared stylesheet
└── js/main.js # Map initialisation script

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License — see the LICENSE file for details.

About

Helicorder Plotter is a Python-based tool for generating and visualizing helicorder plots from seismic data. It fetches data from seismic stations, creates helicorder plots, and generates an interactive web interface for viewing the plots.

Resources

Stars

5 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages