A tool to evaluate the consistency between EIDA nodes' availability and dataselect web services.
Designed for use in quality control and monitoring tasks across the European Integrated Data Archive (EIDA).
You can use eida-consistency in two ways:
uvx eida-consistency <command> [options]uv tool install eida-consistencyNow itβs available globally:
eida-consistency <command> [options]Update it with:
uv tool upgrade eida-consistencyCheck if availability spans align with dataselect results:
uvx eida-consistency consistency --node RESIF --epochs 10 --duration 600
# OR check 5% of available stations:
uvx eida-consistency consistency --node RESIF --epochs "5%"Options:
--node: Node code (e.g.RESIF,NOA,ETH)--epochs: Number of random test epochs (default: 10) OR percentage (e.g.,"5%",0.05)--duration: Epoch length in seconds (β₯600)--seed: Reproducible seed--delete-old: Keep only the most recent report--stdout: Print JSON report to stdout--report-dir: Save reports to a custom folder (default:reports/)--log-level: Control verbosity (DEBUG,INFO,WARNING,ERROR)
Compare results across two runs with the same seed:
uvx eida-consistency compare reports/resif_run1.json reports/resif_run2.jsonDrill down into inconsistencies with day-by-day exploration:
uvx eida-consistency explore reports/nodes/noa/*.json --index 7 --days 15 --verboseYou can also use:
uvx eida-consistency explore --latestto automatically use the newest report.
Reload routing cache:
uvx eida-consistency reload-nodesList currently cached nodes:
uvx eida-consistency list-nodesReports are stored in ./reports/ by default, or in a custom folder using --report-dir.
- JSON reports:
reports/resif_<seed>.json - Markdown reports:
reports/resif_<seed>.md - Global summary:
summary.md
You can also use eida-consistency as a Python library to run checks programmatically or build custom tools.
from eida_consistency.core.checker import check_candidate
# Define a candidate (network, station, channel, starttime)
candidate = {
"network": "GR",
"station": "ATH",
"channel": "BHZ",
"starttime": "2023-01-01T00:00:00",
}
# Run the check
results, stats = check_candidate(
base_url="http://node.eida.eu/fdsnws",
candidate=candidate,
epochs=5,
duration=600
)
for res in results:
url, available, start, end, loc, span = res
print(f"Time: {start} -> Available: {available}")from eida_consistency.runner import run_consistency_check
# Run check for a specific node and get the report path
report_path = run_consistency_check(
node="NOA",
epochs=10,
duration=600
)
print(f"Report generated at: {report_path}")For full API documentation, please visit our Documentation Site or run:
uv run mkdocs serveuvx eida-consistency consistency --seed 1234 --node NOA --epochs 20 --duration 600 --report-dir reports/test_noaIf inconsistencies are found:
uvx eida-consistency explore reports/nodes/resif/*.json --verboseInvestigate the reported service inconsistencies and fix them at node level. Maybe use dmtri command suggested.
uvx eida-consistency consistency --seed 1234 --node NOA --epochs 20 --duration 600 --report-dir reports/test_noauv run eida-consistency compare reports/test_noa/old.json reports/test_noa/new.json| Node | Epochs Requested | Epochs Usable | Total Checks | Consistent | Inconsistent | Score |
|---|---|---|---|---|---|---|
| BGR | 20 | 20 | 20 | 15 | 5 | 75.0 % |
| BGS | 20 | 11 | 11 | 6 | 5 | 54.55 % |
| ETH | 20 | 20 | 20 | 19 | 1 | 95.0 % |
| GEOFON | 20 | 20 | 20 | 20 | 0 | 100.0 % |
| KOERI | 20 | 20 | 20 | 10 | 10 | 50.0 % |
| LMU | 20 | 20 | 20 | 20 | 0 | 100.0 % |
| NIEP | 20 | 20 | 20 | 15 | 5 | 75.0 % |
| NOA | 20 | 20 | 20 | 16 | 4 | 80.0 % |
| RESIF | 20 | 20 | 20 | 20 | 0 | 100.0 % |
| UIB-NORSAR | 20 | 20 | 20 | 18 | 2 | 90.0 % |
π Full details: summary.md