gea-program 0.9.0__tar.gz → 0.10.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {gea_program-0.9.0 → gea_program-0.10.0}/PKG-INFO +2 -2
- {gea_program-0.9.0 → gea_program-0.10.0}/README.md +1 -1
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/__init__.py +1 -1
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/__main__.py +28 -2
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/acceptance_tests.py +110 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/client_reports.py +24 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/seismic.md +1 -1
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/sra.md +1 -1
- gea_program-0.10.0/gea/seismic_assoc.py +421 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/sra.py +12 -2
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/workspace.py +65 -1
- {gea_program-0.9.0 → gea_program-0.10.0}/gea_program.egg-info/PKG-INFO +2 -2
- {gea_program-0.9.0 → gea_program-0.10.0}/gea_program.egg-info/SOURCES.txt +1 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/pyproject.toml +1 -1
- {gea_program-0.9.0 → gea_program-0.10.0}/LICENSE +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/accuracy_statement.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/alarm_engine.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/bench.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/blind_harness.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/med_160_sapropels.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/certificates.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/cli.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/config_versioning.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/correlation.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/dashboard.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/deviation.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/doctor.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/downhole_engine.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/drift_monitor.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/earth_model.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/example_register_map.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/fat_sat.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/files.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/follower.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/forward_model.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/gamma.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/gauge_aging.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/gauge_specs.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/geodesy.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/gravity_reference.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/TESTER_GUIDE.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/alarms.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/audit-update.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/data-in.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/doctor.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/drift.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/files.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/instruments.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/notifications.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/patches.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/quality.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/site.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/sites.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/start.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/transients.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/upkeep.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/help/well-tests.md +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/helplib.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/housekeeping.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/inverse_engine.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/jobs.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/live_ports.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/loadtest.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/matplotlib_demo.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/modbus.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/model_card.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/mqtt_port.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/notify.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/opcua_port.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/operator_app.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/patches.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/permits.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/ports.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/profile_catalog.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/project.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/qt6_downhole_app.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/reconciler.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/reference/libmseed_steim.provenance.json +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/rock_inventory.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/sample_record.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/sample_well_profile.csv +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/sbom.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/segy.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_array.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_detect.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_film.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_harmonic.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_qc.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_response.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_signature.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_track.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_uncertainty.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/seismic_unlisted.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/sensor_swap.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/service.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/service_life.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/shell.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/shut_in.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/sla_report.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/store_forward.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/strata_join.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/supervisor.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/survey_cmd.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/survey_view.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/telemetry.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/tool_library.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/transient.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/web/app.html +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/well_assembler.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/well_test_validation.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/wits0.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea/witsml.py +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea_program.egg-info/dependency_links.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea_program.egg-info/entry_points.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea_program.egg-info/requires.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/gea_program.egg-info/top_level.txt +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/setup.cfg +0 -0
- {gea_program-0.9.0 → gea_program-0.10.0}/tests/test_acceptance.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gea-program
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.10.0
|
|
4
4
|
Summary: GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline.
|
|
5
5
|
Author: Daniel T. Murphy
|
|
6
6
|
License: MPL-2.0
|
|
@@ -125,7 +125,7 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
|
|
|
125
125
|
gea client-report --report accuracy --out client_report
|
|
126
126
|
gea model-cards --out model_cards
|
|
127
127
|
gea sbom --out sbom
|
|
128
|
-
gea accept # the product gate (
|
|
128
|
+
gea accept # the product gate (314 checks)
|
|
129
129
|
gea help drift # the help library, by the job (16 pages; the same text is on every dashboard page)
|
|
130
130
|
gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
|
|
131
131
|
gea gui # the desktop window (pip install "gea-program[desktop]")
|
|
@@ -86,7 +86,7 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
|
|
|
86
86
|
gea client-report --report accuracy --out client_report
|
|
87
87
|
gea model-cards --out model_cards
|
|
88
88
|
gea sbom --out sbom
|
|
89
|
-
gea accept # the product gate (
|
|
89
|
+
gea accept # the product gate (314 checks)
|
|
90
90
|
gea help drift # the help library, by the job (16 pages; the same text is on every dashboard page)
|
|
91
91
|
gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
|
|
92
92
|
gea gui # the desktop window (pip install "gea-program[desktop]")
|
|
@@ -282,7 +282,7 @@ def main(argv=None) -> int:
|
|
|
282
282
|
choices=["init", "add-file", "add-catalog", "add-live", "remove", "list", "migrate", "refresh", "audit",
|
|
283
283
|
"add-seismic", "refresh-seismic", "remove-seismic", "sar-film", "refresh-all", "add-track", "refresh-track", "remove-track",
|
|
284
284
|
"seismic-dataset", "seismic-field", "add-site", "sites", "site-report", "remove-site", "rename",
|
|
285
|
-
"set-well", "sra-define", "sra-report"])
|
|
285
|
+
"set-well", "sra-define", "sra-report", "associate"])
|
|
286
286
|
p_ws.add_argument("--stations", type=str, nargs="+", default=None, help="add-track: two or more array station ids of this workspace")
|
|
287
287
|
p_ws.add_argument("--site", type=str, default=None, help="site-report/remove-site: the site id")
|
|
288
288
|
p_ws.add_argument("--api", type=str, default=None, help="set-well: the API number")
|
|
@@ -308,6 +308,9 @@ def main(argv=None) -> int:
|
|
|
308
308
|
p_ws.add_argument("--aftershocks", type=str, nargs="*", default=None, help="sra-report: catalogue ids the operator declares as aftershocks (exempt)")
|
|
309
309
|
p_ws.add_argument("--start", type=str, default=None, help="sra-report: first day of the record, YYYY-MM-DD")
|
|
310
310
|
p_ws.add_argument("--end", type=str, default=None, help="sra-report: last day of the record, YYYY-MM-DD")
|
|
311
|
+
p_ws.add_argument("--vp", type=float, default=5.8, help="associate: the P velocity of the model, km/s (declared)")
|
|
312
|
+
p_ws.add_argument("--depth-km", type=float, default=6.0, help="associate: the hypocentral depth the location is made under, km (declared)")
|
|
313
|
+
p_ws.add_argument("--rms-tol", type=float, default=0.15, help="associate: the RMS residual an event must fit within, s")
|
|
311
314
|
p_ws.add_argument("--wells", type=str, nargs="+", default=None, help="add-site: well ids of this workspace")
|
|
312
315
|
p_ws.add_argument("--seismic", type=str, nargs="+", default=None, help="add-site: seismic station ids of this workspace")
|
|
313
316
|
p_ws.add_argument("--tracks", type=str, nargs="+", default=None, help="add-site: track ids of this workspace")
|
|
@@ -422,7 +425,8 @@ def main(argv=None) -> int:
|
|
|
422
425
|
p_se.add_argument("--action", choices=["info", "spectrum", "lines", "fetch", "stations", "detect", "selftest", "convert", "response", "remove-response",
|
|
423
426
|
"beam", "array-detect", "locate", "array-selftest", "sar-film", "bearings", "track", "track-selftest",
|
|
424
427
|
"signatures", "multi-beam", "multi-bearings", "multi-track", "signature-selftest", "field-selftest",
|
|
425
|
-
"harmonics", "harmonic-selftest", "datum", "geodesy-selftest", "array-qc", "qc-selftest", "unlisted", "unlisted-selftest", "bearing-sigma", "coverage", "uncertainty-selftest"
|
|
428
|
+
"harmonics", "harmonic-selftest", "datum", "geodesy-selftest", "array-qc", "qc-selftest", "unlisted", "unlisted-selftest", "bearing-sigma", "coverage", "uncertainty-selftest",
|
|
429
|
+
"assoc-selftest"], default="info")
|
|
426
430
|
p_se.add_argument("--signatures", type=str, default=None, help="multi-beam/multi-bearings: the signatures JSON from --action signatures")
|
|
427
431
|
p_se.add_argument("--histories", type=str, nargs="+", default=None, help="track: two or more bearing-history JSONs (from --action bearings), one per array")
|
|
428
432
|
p_se.add_argument("--truth", type=str, default=None, help="track: ground truth CSV (point_id, lat, lon, utc[, note]) - the lateral's points in time")
|
|
@@ -878,6 +882,18 @@ def main(argv=None) -> int:
|
|
|
878
882
|
+ (f"; verdict {v['verdict']} ({v['hit']} of {v['of']} inside their ellipse)" if v else "")
|
|
879
883
|
+ (f" - {row.get('detail', '')}" if row.get("detail") else ""))
|
|
880
884
|
return 0 if r["ok"] else 1
|
|
885
|
+
if a.action == "assoc-selftest":
|
|
886
|
+
from . import seismic_assoc as _SA
|
|
887
|
+
r = _SA.selftest()
|
|
888
|
+
print(f"association selftest [{r['label']}]: {r['status']} - {r['n_picks']} picks, {len(r['events'])} events, errors {r['errors_km']} km")
|
|
889
|
+
for k, v in r["checks"].items():
|
|
890
|
+
print(f" {'ok ' if v else 'BAD'} {k}")
|
|
891
|
+
for e in r["events"]:
|
|
892
|
+
print(f" {e['id']}: {e['origin_utc']} {e['lat']:.4f}, {e['lon']:.4f} {e['n_stations']} stations RMS {e['rms_s']} s "
|
|
893
|
+
f"misfit region {e['region_km']['extent_east_km']} x {e['region_km']['extent_north_km']} km magnitude: not estimated")
|
|
894
|
+
for x in r["catalogue"]["rows"]:
|
|
895
|
+
print(f" vs catalogue: {x['event']} {x['standing']}")
|
|
896
|
+
return 0 if r["status"] == "OK" else 1
|
|
881
897
|
if a.action == "uncertainty-selftest":
|
|
882
898
|
from . import seismic_uncertainty as UQ
|
|
883
899
|
r = UQ.selftest()
|
|
@@ -1697,6 +1713,16 @@ def main(argv=None) -> int:
|
|
|
1697
1713
|
r = ws.write_sra_packet(a.site, catalog_csv=a.catalog, aftershocks=a.aftershocks, start=a.start, end=a.end, actor=a.actor)
|
|
1698
1714
|
print(_sra_text(r["packet"]))
|
|
1699
1715
|
print(" report:", r["paths"]["html"]); print(" daily export:", r["paths"]["daily_csv"], f"({r['export_rows']} rows)"); return 0
|
|
1716
|
+
elif a.action == "associate":
|
|
1717
|
+
from .seismic_assoc import report_text as _assoc_text
|
|
1718
|
+
if not a.site:
|
|
1719
|
+
raise SystemExit("associate needs --site <id>")
|
|
1720
|
+
r = ws.associate_site(a.site, vp_km_s=a.vp, depth_km=a.depth_km, band=a.band, start=a.start, end=a.end, catalog_csv=a.catalog,
|
|
1721
|
+
rms_tol_s=a.rms_tol, actor=a.actor)
|
|
1722
|
+
for sid, x in r["stations"].items():
|
|
1723
|
+
print(f" {sid}: {x['status']}, {x['picks']} pick(s)")
|
|
1724
|
+
print(_assoc_text(r["association"], r["catalogue"]))
|
|
1725
|
+
print(" written:", os.path.join(ws.path, "reports", "sites", a.site, "association.json")); return 0
|
|
1700
1726
|
elif a.action == "seismic-dataset":
|
|
1701
1727
|
r = ws.write_seismic_dataset_report(actor=a.actor)
|
|
1702
1728
|
inv = r["inventory"]
|
|
@@ -4722,6 +4722,115 @@ def section_bc_sra(tmp: str) -> None:
|
|
|
4722
4722
|
"labels it SIMULATION_SELF_TEST; the help page exists")
|
|
4723
4723
|
|
|
4724
4724
|
|
|
4725
|
+
def section_bd_association(tmp: str) -> None:
|
|
4726
|
+
"""Section BD - association: several stations heard the same thing, or they did not. The onset picker,
|
|
4727
|
+
the associator with its grid search and its refusals, the location with its misfit region, the array as
|
|
4728
|
+
one station, the catalogue comparison, and the workspace run that feeds the SRA packet."""
|
|
4729
|
+
import csv as _csv
|
|
4730
|
+
import subprocess as _sp
|
|
4731
|
+
import numpy as _np
|
|
4732
|
+
from . import seismic as S
|
|
4733
|
+
from . import seismic_assoc as SA
|
|
4734
|
+
from .workspace import Workspace, WorkspaceError
|
|
4735
|
+
d = Path(tmp, "bd"); d.mkdir()
|
|
4736
|
+
|
|
4737
|
+
# -- the self-test -----------------------------------------------------------------------
|
|
4738
|
+
r = SA.selftest()
|
|
4739
|
+
ok(r["status"] == "OK" and all(r["checks"].values()) and r["label"] == "SIMULATION_SELF_TEST"
|
|
4740
|
+
and r["errors_km"]["ev-A"] < 1.0 and r["errors_km"]["ev-B"] < 1.0,
|
|
4741
|
+
"BD1 the self-test on a labelled scene: picks at every station, two events located to within a kilometre and a third of a second with all "
|
|
4742
|
+
"five stations and RMS under 0.05 s, a two-station event refused rather than located, a spurious burst left unused, finite misfit "
|
|
4743
|
+
"regions, no magnitude, and against the catalogue one AGREES, one DIFFERS by its separation and one catalogue event the stations did "
|
|
4744
|
+
"not associate")
|
|
4745
|
+
|
|
4746
|
+
# -- the picker: the onset is the first energy, not half a window early ------------------
|
|
4747
|
+
sc = SA.synthetic_scene()
|
|
4748
|
+
fr = sc["frame"]
|
|
4749
|
+
from .seismic_array import local_xy
|
|
4750
|
+
devs = []
|
|
4751
|
+
for sid, s in sc["stations"].items():
|
|
4752
|
+
ex, ey = local_xy(sc["truth"][0]["lat"], sc["truth"][0]["lon"], fr["lat0"], fr["lon0"])
|
|
4753
|
+
tt = SA.travel_time(ex, ey, s, sc["vp"], sc["depth_km"])
|
|
4754
|
+
pk = [p for p in SA.picks(sc["traces"][sid], band=(2.0, 20.0)) if abs(p.time - (sc["truth"][0]["t0"] + tt)) < 2.0]
|
|
4755
|
+
devs.append(pk[0].time - sc["truth"][0]["t0"] - tt if pk else 9.0)
|
|
4756
|
+
quiet = S.Trace("XX", "Q", "", "HHZ", 0.0, 100.0, _np.random.default_rng(1).normal(0, 1, 60000).astype(_np.float32), "synthetic", "FLOAT32")
|
|
4757
|
+
ok(all(abs(x) < 0.08 for x in devs) and not SA.picks(quiet, band=(2.0, 20.0)) and all(p.snr > 10 for p in SA.picks(sc["traces"]["STA5"], band=(2.0, 20.0))),
|
|
4758
|
+
"BD2 the picker puts every onset within 80 ms of the true arrival (the first refinement walked back into the noise and every pick came "
|
|
4759
|
+
"out 150 ms early, which the location absorbed into the origin time and nobody would have seen), picks nothing on a minute of plain "
|
|
4760
|
+
"noise, and carries a signal-to-noise ratio on every pick")
|
|
4761
|
+
|
|
4762
|
+
# -- the locator: refuses two stations, refines about the coarse best, names the model ----
|
|
4763
|
+
two = SA.locate({"STA1": 10.0, "STA2": 10.5}, sc["stations"], sc["vp"], sc["depth_km"])
|
|
4764
|
+
ex, ey = local_xy(sc["truth"][1]["lat"], sc["truth"][1]["lon"], fr["lat0"], fr["lon0"])
|
|
4765
|
+
pset = {sid: sc["truth"][1]["t0"] + SA.travel_time(ex, ey, s, sc["vp"], sc["depth_km"]) for sid, s in sc["stations"].items()}
|
|
4766
|
+
exact = SA.locate(pset, sc["stations"], sc["vp"], sc["depth_km"])
|
|
4767
|
+
off = SA.locate({**pset, "STA2": pset["STA2"] + 0.6}, sc["stations"], sc["vp"], sc["depth_km"])
|
|
4768
|
+
ok(two["status"] == "NOT ASSOCIATED" and "three" in two["detail"]
|
|
4769
|
+
and exact["status"] == "LOCATED" and abs(exact["best"]["x_km"] - ex) < 0.1 and abs(exact["best"]["y_km"] - ey) < 0.1 and exact["best"]["rms_s"] < 0.01
|
|
4770
|
+
and abs(exact["best"]["t0"] - sc["truth"][1]["t0"]) < 0.02 and not exact["region_km"]["reaches_grid_edge"]
|
|
4771
|
+
and "flat earth" in exact["model"]["basis"] and exact["model"]["depth_km"] == sc["depth_km"]
|
|
4772
|
+
and off["best"]["rms_s"] > 0.15 and abs(off["residuals_s"]["STA2"]) == max(abs(v) for v in off["residuals_s"].values()),
|
|
4773
|
+
"BD3 the locator refuses two stations, finds exact picks to within 100 m of the true epicentre and 20 ms of the origin time (the first "
|
|
4774
|
+
"version refined about the stations' centroid instead of the coarse best node and lost every event more than a kilometre from the "
|
|
4775
|
+
"centre), names the straight-ray flat-earth model and the declared depth on the result, and a pick 0.6 s off shows as the largest residual")
|
|
4776
|
+
|
|
4777
|
+
# -- the associator: the outlier is dropped, the event stands on the rest ----------------
|
|
4778
|
+
picks_all = []
|
|
4779
|
+
for sid, tr in sc["traces"].items():
|
|
4780
|
+
picks_all += SA.picks(tr, band=(2.0, 20.0))
|
|
4781
|
+
bad = [SA.Pick("STA4", sc["truth"][0]["t0"] + 3.2, 50.0, 1.0)] # a wrong pick at STA4 near event A
|
|
4782
|
+
picks_mix = [p for p in picks_all if not (p.station == "STA4" and abs(p.time - sc["truth"][0]["t0"]) < 3.0)] + bad
|
|
4783
|
+
res = SA.associate(picks_mix, sc["stations"], sc["vp"], sc["depth_km"], frame_info=fr)
|
|
4784
|
+
evA = sorted(res["events"], key=lambda e: e["origin_utc"])[0]
|
|
4785
|
+
ok(res["n_events"] == 2 and evA["n_stations"] == 4 and evA["dropped"] == ["STA4"] and evA["rms_s"] < 0.05
|
|
4786
|
+
and evA["magnitude"] is None and "not estimated" in evA["magnitude_basis"],
|
|
4787
|
+
"BD4 a wrong pick at one station is dropped as the largest residual and the event stands on the other four; an event carries no "
|
|
4788
|
+
"magnitude and says why")
|
|
4789
|
+
|
|
4790
|
+
# -- an array is one station ----------------------------------------------------------------
|
|
4791
|
+
raw = [SA.Pick("ARR", 100.0 + k * 0.03, 20.0 + k, 1.0, channel=f"S{k}") for k in range(6)] + [SA.Pick("ARR", 130.0, 9.0, 0.5, channel="S3")]
|
|
4792
|
+
col = SA.collapse_array_picks(raw, "ARR")
|
|
4793
|
+
ok(len(col) == 1 and abs(col[0].time - 100.075) < 0.02 and "6 sensor" in col[0].channel,
|
|
4794
|
+
"BD5 an array's sensors' picks within half a second become one pick at the median time at the array's position, and a burst one sensor "
|
|
4795
|
+
"alone saw is not an arrival at the array")
|
|
4796
|
+
|
|
4797
|
+
# -- through the workspace and the command line, into the packet ---------------------------
|
|
4798
|
+
for sid, tr in sc["traces"].items():
|
|
4799
|
+
S.write_mseed([tr], str(d / f"{sid}.mseed"))
|
|
4800
|
+
cat = d / "cat.csv"
|
|
4801
|
+
with open(cat, "w", newline="") as f:
|
|
4802
|
+
w = _csv.writer(f); w.writerow(["EventID", "Origin Time", "Local Magnitude", "Latitude", "Longitude", "Depth"])
|
|
4803
|
+
for c in sc["catalog"]:
|
|
4804
|
+
w.writerow([c["event_id"], c["time"], c["magnitude"], c["lat"], c["lon"], 6.0])
|
|
4805
|
+
ws = Workspace.create(str(d / "ws"), "Pad 3", actor="tester")
|
|
4806
|
+
ids = [ws.add_seismic_station(sid, [str(d / f"{sid}.mseed")], st.lat, st.lon, "tester", datum=st.datum, band=[2.0, 20.0])["id"]
|
|
4807
|
+
for sid, st in sc["stations"].items()]
|
|
4808
|
+
ws.add_site("Assoc block", seismic=ids[:2], client="Acme", actor="tester")
|
|
4809
|
+
try:
|
|
4810
|
+
ws.associate_site("Assoc-block"); few = False
|
|
4811
|
+
except WorkspaceError as e:
|
|
4812
|
+
few = "three" in str(e)
|
|
4813
|
+
ws.add_site("Assoc block 5", seismic=ids, client="Acme", actor="tester")
|
|
4814
|
+
run = lambda *a: _sp.run([sys.executable, "-m", "gea", "workspace", "--path", ws.path, "--actor", "tester", *a], capture_output=True, text=True)
|
|
4815
|
+
r1 = run("--action", "associate", "--site", "Assoc-block-5", "--catalog", str(cat))
|
|
4816
|
+
r2 = run("--action", "sra-define", "--site", "Assoc-block-5", "--name", "Test SRA", "--lat", "31.95", "--lon", "-102.25", "--radius-km", "9.08", "--plan-date", "2026-02-25")
|
|
4817
|
+
r3 = run("--action", "sra-report", "--site", "Assoc-block-5", "--catalog", str(cat))
|
|
4818
|
+
aj = json.loads(Path(ws.path, "reports", "sites", "Assoc-block-5", "association.json").read_text(encoding="utf-8"))
|
|
4819
|
+
md = Path(ws.path, "reports", "sites", "Assoc-block-5", "sra_packet.md").read_text(encoding="utf-8")
|
|
4820
|
+
pk = json.loads(Path(ws.path, "reports", "sites", "Assoc-block-5", "sra_packet.json").read_text(encoding="utf-8"))["packet"]
|
|
4821
|
+
audit = Path(ws.path, "records", "audit.jsonl").read_text(encoding="utf-8")
|
|
4822
|
+
r4 = _sp.run([sys.executable, "-m", "gea", "seismic", "--action", "assoc-selftest"], capture_output=True, text=True)
|
|
4823
|
+
ok(few and r1.returncode == 0 and "2 event(s)" in r1.stdout and "AGREES" in r1.stdout and "DIFFERS" in r1.stdout and "NOT ASSOCIATED BY THE STATIONS" in r1.stdout
|
|
4824
|
+
and aj["association"]["n_events"] == 2 and all(v["status"] == "PICKED" for v in aj["stations"].values())
|
|
4825
|
+
and r2.returncode == 0 and r3.returncode == 0 and pk["association"]["n_inside"] == 2
|
|
4826
|
+
and "Events located by the site's own stations" in md and "AGREES" in md and "no magnitude is estimated here" in md
|
|
4827
|
+
and "site.associate" in audit and r4.returncode == 0 and "SIMULATION_SELF_TEST" in r4.stdout,
|
|
4828
|
+
"BD6 `--action associate` refuses a site with fewer than three stations, picks five miniSEED stations, associates and locates two events, "
|
|
4829
|
+
"sets them against the catalogue, writes association.json and audits it; the SRA packet then carries the events the site's own stations "
|
|
4830
|
+
"located beside the catalogue's, inside or outside the area, with the model named and no magnitude; `gea seismic --action assoc-selftest` "
|
|
4831
|
+
"runs the labelled scene from the command line")
|
|
4832
|
+
|
|
4833
|
+
|
|
4725
4834
|
def main() -> int:
|
|
4726
4835
|
print("GEA-Program - ACCEPTANCE SUITE (the product gate)")
|
|
4727
4836
|
# a handle a job subprocess still holds at the end must not turn a finished gate into a traceback on Windows:
|
|
@@ -4780,6 +4889,7 @@ def main() -> int:
|
|
|
4780
4889
|
section_ba_sites(tmp)
|
|
4781
4890
|
section_bb_supervisor(tmp)
|
|
4782
4891
|
section_bc_sra(tmp)
|
|
4892
|
+
section_bd_association(tmp)
|
|
4783
4893
|
if _FAILS:
|
|
4784
4894
|
print(f"[ACCEPTANCE] {len(_FAILS)} FAILURES ({_PASS} passed):")
|
|
4785
4895
|
for f in _FAILS:
|
|
@@ -1644,6 +1644,30 @@ def sra_packet_report(pk: dict, evaluated_at: Optional[datetime] = None, program
|
|
|
1644
1644
|
else:
|
|
1645
1645
|
secs.append(Section(str(n), 'Seismicity against the plan', ['No catalogue export was handed in. This section is empty and the goal clock is not stated.']))
|
|
1646
1646
|
n += 1
|
|
1647
|
+
ao = pk.get('association')
|
|
1648
|
+
if ao:
|
|
1649
|
+
mo = ao.get('model') or {}
|
|
1650
|
+
paras = [f"The site's own stations: {ao['n_picks']} arrival(s) picked at {ao['n_stations']} station(s), associated into {ao['n_events']} event(s) "
|
|
1651
|
+
f"under a straight-ray model at {mo.get('vp_km_s', '-')} km/s with the hypocentre at a declared {mo.get('depth_km', '-')} km; {ao['n_inside']} inside the area. "
|
|
1652
|
+
f"An event needs {mo.get('min_stations', 3)} or more stations within {mo.get('rms_tol_s', '-')} s; a depth is declared, not located; no magnitude is estimated here."]
|
|
1653
|
+
rows = [[e['id'], e['origin_utc'][:19].replace('T', ' '), f"{e['lat']:.4f}, {e['lon']:.4f}", e['n_stations'], _fmt(e['rms_s']),
|
|
1654
|
+
f"{e['region_km']['extent_east_km']} x {e['region_km']['extent_north_km']}", _fmt(e['distance_km']), 'inside' if e['inside'] else 'outside']
|
|
1655
|
+
for e in ao['events']]
|
|
1656
|
+
tabs = [Table(['Event', 'Origin (UTC)', 'Epicentre (WGS84)', 'Stations', 'RMS (s)', 'Misfit region E x N (km)', 'From centre (km)', 'Area'], rows,
|
|
1657
|
+
'Events the stations located')]
|
|
1658
|
+
cq = ao.get('catalogue')
|
|
1659
|
+
if cq:
|
|
1660
|
+
paras.append(f"Against the catalogue: {cq['n_agree']} agree, {cq['n_differ']} differ, {cq['n_not_in_catalogue']} not in the catalogue; "
|
|
1661
|
+
f"{len(cq['missed'])} catalogue event(s) the stations did not associate. Where they differ, both positions are printed and neither is chosen.")
|
|
1662
|
+
tabs.append(Table(['Event', 'Catalogue event', 'Catalogue M', 'dt (s)', 'Separation (km)', 'Allowed (km)', 'Standing'],
|
|
1663
|
+
[[r['event'], r.get('catalog_event') or '-', _fmt(r.get('catalog_magnitude')), _fmt(r.get('dt_s')), _fmt(r.get('separation_km')),
|
|
1664
|
+
_fmt(r.get('allowed_km')), r['standing']] for r in cq['rows']]
|
|
1665
|
+
+ [['-', m['catalog_event'], _fmt(m['magnitude']), '-', '-', '-', m['standing']] for m in cq['missed']], 'Against the catalogue'))
|
|
1666
|
+
if ao['refused']:
|
|
1667
|
+
paras.append(f"{len(ao['refused'])} candidate arrival(s) not associated: " + '; '.join(f"{r['first_pick'][:19]} at {r['station']} - {r['why']}" for r in ao['refused'][:5])
|
|
1668
|
+
+ ('; ...' if len(ao['refused']) > 5 else '') + '.')
|
|
1669
|
+
secs.append(Section(str(n), 'Events located by the site\'s own stations', paras, tabs))
|
|
1670
|
+
n += 1
|
|
1647
1671
|
secs.append(Section(str(n), 'The schedule', ['Checkpoints with Commission staff from the plan date, and the goal date.'],
|
|
1648
1672
|
[Table(['#', 'Date', 'What'], [[c['n'], c['date'], c['what']] for c in pk['checkpoints']])]))
|
|
1649
1673
|
n += 1
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> Raw seismic records in (miniSEED, SAC, or fetched from an FDSN archive), spectra and persistent lines out, one measured number before anything else is promised - the distance at which a known rig shows in this station's record - and, with an array, the direction it came from.
|
|
4
4
|
|
|
5
|
-
**The command**: `gea seismic --action info --file day.mseed` reads a file (the format is decided by its content); `--action spectrum` and `--action lines --win 600` give the Welch PSD and the lines that persist above the local floor in the band (`--band 1 50` by default, where pumps, rotary and engines sit); `--action fetch --base texnet --network TX --station XXXX --channel HHZ --start ... --end ... --out tx.mseed` downloads from TexNet or EarthScope (`--base iris`); `--action detect --file tx.mseed --station-lat LAT --station-lon LON --sources rigs.csv` is the detectability test, with the rigs' positions and working windows in the CSV (`source_id, lat, lon, start_utc, end_utc[, kind, note]`). `--action selftest` runs the test on a synthetic scene and labels it `SIMULATION_SELF_TEST`. The station's response: `--action response --stationxml station.xml` lists what the file holds; `--action remove-response --file tx.mseed --stationxml station.xml --output VEL --pre-filt 0.5 1 40 45 --out tx_vel.mseed` turns counts into m/s (or `DISP` m, `ACC` m/s^2); `spectrum`, `lines` and `detect` take `--stationxml` and do it first; `fetch --with-response` fetches the StationXML beside the record. The array: `--action beam --files s1.mseed s2.mseed ... --sensors sensors.csv --band 1 20 --start ... --end ...` gives the back-azimuth and slowness the band's energy crossed the array with (`sensor_id, lat, lon` in the CSV, one record per sensor, three or more); `--action array-detect --files ... --sensors sensors.csv --sources rigs.csv` is the array's detectability test - did the array point at each listed rig in the windows it worked alone; `--action locate --bearings bearings.csv` crosses the bearings of two or more arrays (`lat, lon, back_azimuth_deg, sigma_deg`); `--action array-selftest` runs all of it on a labelled synthetic scene. The time dimension: `--action bearings --files ... --sensors sensors.csv --win 600 --name A1 --out a1.json` is the beam on every window of an array's record - a bearing with the array's tolerance where the beam was coherent, a gap where it was not, and the change points; `--action track --histories a1.json a2.json [--truth lateral.csv] --out track.json` crosses two or more arrays' histories window by window into positions with their ellipses, fits the longest continuous segment into a heading and a length, and judges it against the ground truth (`point_id, lat, lon, utc` - the lateral's surveyed points, or a permit's surface hole with its date); `--action track-selftest` runs the tracker on a labelled scene of a bit advancing along a lateral past two arrays. Several rigs at once: `--action signatures --file rec.mseed --sources rigs.csv --out sigs.json` learns each rig's own lines from the windows it worked alone; `--action multi-beam --files ... --sensors sensors.csv --signatures sigs.json` gives a bearing per rig in one window, each from that rig's own bins; `--action multi-bearings ... --out a1.json` does it window by window, and `--action multi-track --histories a1.json a2.json [--truth truth.csv]` crosses two or more arrays into a track per rig. `--action signature-selftest` and `--action field-selftest` run both on labelled scenes. Ground truth from a permit export: `gea permits --file export.csv --out rigs.csv [--within LAT LON KM] [--mapping map.json]` finds the columns by name and writes the rigs CSV with an import note beside it; `--action sar-film --hours 8 --step 600 --out film.json` writes the SAR panel's film - the same scene played forward in time, one frame per window, every frame stamped `SIMULATION_SELF_TEST`. On a site: `gea workspace --path C:\site --action add-seismic --name "Pad 3 node" --files tx.mseed --lat LAT --lon LON --sources rigs.csv [--stationxml station.xml] [--sensors sensors.csv --files s1.mseed s2.mseed ...]` registers a station or an array (the Seismic page does the same by upload; `--permits export.csv` in place of `--sources` converts a permit export on the way in), and `--action refresh-seismic` runs the whole leg on it; `--action add-track --name "Pad 7 lateral" --stations <array-1> <array-2> [--truth lateral.csv]` makes a track over two or more array stations and `--action refresh-track` runs the tracker on it - the Tracks card on the Seismic page is the same by upload, and the track view shows the map with every position's ellipse, a slider through time, and the bearings over time - the Seismic page's Refresh button is that command as a job. The page's SAR panel is the control panel and the screen: `--action sar-film` as a job makes the film, and the screen plays it - the trace, the spectrogram column arriving, the beam power map swinging onto the working rig, the bearing against the rig's true bearing with the array's tolerance wedge beside it, the tally per rig, and at the end the array detectability test's verdict on the whole scene, the same function a real record goes through.
|
|
5
|
+
**The command**: `gea seismic --action info --file day.mseed` reads a file (the format is decided by its content); `--action spectrum` and `--action lines --win 600` give the Welch PSD and the lines that persist above the local floor in the band (`--band 1 50` by default, where pumps, rotary and engines sit); `--action fetch --base texnet --network TX --station XXXX --channel HHZ --start ... --end ... --out tx.mseed` downloads from TexNet or EarthScope (`--base iris`); `--action detect --file tx.mseed --station-lat LAT --station-lon LON --sources rigs.csv` is the detectability test, with the rigs' positions and working windows in the CSV (`source_id, lat, lon, start_utc, end_utc[, kind, note]`). `--action selftest` runs the test on a synthetic scene and labels it `SIMULATION_SELF_TEST`. The station's response: `--action response --stationxml station.xml` lists what the file holds; `--action remove-response --file tx.mseed --stationxml station.xml --output VEL --pre-filt 0.5 1 40 45 --out tx_vel.mseed` turns counts into m/s (or `DISP` m, `ACC` m/s^2); `spectrum`, `lines` and `detect` take `--stationxml` and do it first; `fetch --with-response` fetches the StationXML beside the record. The array: `--action beam --files s1.mseed s2.mseed ... --sensors sensors.csv --band 1 20 --start ... --end ...` gives the back-azimuth and slowness the band's energy crossed the array with (`sensor_id, lat, lon` in the CSV, one record per sensor, three or more); `--action array-detect --files ... --sensors sensors.csv --sources rigs.csv` is the array's detectability test - did the array point at each listed rig in the windows it worked alone; `--action locate --bearings bearings.csv` crosses the bearings of two or more arrays (`lat, lon, back_azimuth_deg, sigma_deg`); `--action array-selftest` runs all of it on a labelled synthetic scene. The time dimension: `--action bearings --files ... --sensors sensors.csv --win 600 --name A1 --out a1.json` is the beam on every window of an array's record - a bearing with the array's tolerance where the beam was coherent, a gap where it was not, and the change points; `--action track --histories a1.json a2.json [--truth lateral.csv] --out track.json` crosses two or more arrays' histories window by window into positions with their ellipses, fits the longest continuous segment into a heading and a length, and judges it against the ground truth (`point_id, lat, lon, utc` - the lateral's surveyed points, or a permit's surface hole with its date); `--action track-selftest` runs the tracker on a labelled scene of a bit advancing along a lateral past two arrays. Several rigs at once: `--action signatures --file rec.mseed --sources rigs.csv --out sigs.json` learns each rig's own lines from the windows it worked alone; `--action multi-beam --files ... --sensors sensors.csv --signatures sigs.json` gives a bearing per rig in one window, each from that rig's own bins; `--action multi-bearings ... --out a1.json` does it window by window, and `--action multi-track --histories a1.json a2.json [--truth truth.csv]` crosses two or more arrays into a track per rig. `--action signature-selftest` and `--action field-selftest` run both on labelled scenes. Ground truth from a permit export: `gea permits --file export.csv --out rigs.csv [--within LAT LON KM] [--mapping map.json]` finds the columns by name and writes the rigs CSV with an import note beside it; `--action sar-film --hours 8 --step 600 --out film.json` writes the SAR panel's film - the same scene played forward in time, one frame per window, every frame stamped `SIMULATION_SELF_TEST`. On a site: `gea workspace --path C:\site --action add-seismic --name "Pad 3 node" --files tx.mseed --lat LAT --lon LON --sources rigs.csv [--stationxml station.xml] [--sensors sensors.csv --files s1.mseed s2.mseed ...]` registers a station or an array (the Seismic page does the same by upload; `--permits export.csv` in place of `--sources` converts a permit export on the way in), and `--action refresh-seismic` runs the whole leg on it; `--action add-track --name "Pad 7 lateral" --stations <array-1> <array-2> [--truth lateral.csv]` makes a track over two or more array stations and `--action refresh-track` runs the tracker on it - the Tracks card on the Seismic page is the same by upload, and the track view shows the map with every position's ellipse, a slider through time, and the bearings over time - the Seismic page's Refresh button is that command as a job. Association: `gea workspace --path C:\site --action associate --site <id> [--vp 5.8 --depth-km 6 --catalog texnet.csv]` picks the onsets on every station of a site, associates them into events under a declared straight-ray model (three or more stations within the RMS tolerance, the worst pick dropped while more than three remain), locates each with its misfit region, and sets them against a catalogue export - AGREES, DIFFERS with both positions printed, or NOT ASSOCIATED BY THE STATIONS; `gea seismic --action assoc-selftest` runs it on a labelled scene. A depth is declared, not located; no magnitude is estimated. The page's SAR panel is the control panel and the screen: `--action sar-film` as a job makes the film, and the screen plays it - the trace, the spectrogram column arriving, the beam power map swinging onto the working rig, the bearing against the rig's true bearing with the array's tolerance wedge beside it, the tally per rig, and at the end the array detectability test's verdict on the whole scene, the same function a real record goes through.
|
|
6
6
|
|
|
7
7
|
**What it writes**: `signatures --out` a JSON of every source's lines with the windows they were learned from and the reason any source has none; `multi-beam --out` a bearing per source with the bins it used, the lines another source also claims, and the whole-band bearing beside them; `multi-track --out` a position history and a track per source. `info` prints each trace with its start, end, rate, sample count, encoding and gaps - in counts, with the instrument response left as recorded; `spectrum --out` a CSV of frequency, PSD and dB; `lines --out` a JSON of the persistent lines (frequency, excess over the floor, the fraction of windows present); `fetch` the miniSEED plus a `.request.json` beside it with the URL and time (and `.stationxml` with `--with-response`); `remove-response` a FLOAT64 miniSEED in the chosen unit with a `.units.json` sidecar carrying the water level, the pre-filter and the check of the stages against the declared sensitivity; `beam --out` a JSON with the back-azimuth, the slowness and apparent velocity, the best-bin coherence and the coherent frequencies, the array response function's half-width, whether the geometry has aliasing lobes at this band, the other peaks, and the plane-wave limit; `array-detect` a verdict per rig (`POINTED`, `NOT_POINTED`, `INCOHERENT`, `AMBIGUOUS`, `INSUFFICIENT_WINDOWS`) with the beam's bearing against the true one and the tolerance it was judged by; `locate` the crossing point with its 1-sigma ellipse, the crossing angle, the residual of each bearing and whether the point is in front of every array; on a site, `refresh-seismic` writes the Seismic Station Report (html, md, json) and the spectrum, lines, detect, beam and array JSONs under `reports/seismic/<station>/`, which the Seismic page shows; `sar-film` writes `reports/seismic/SIMULATION/sar_film.json` (the frames) and its summary, never under a real station's folder; `refresh-track` writes the Seismic Track Report (html, md, json), every array's bearing history, `positions.json` and `verdict.json` under `reports/seismic/tracks/<track>/`; `permits` writes the rigs CSV and `<out>.import.json` - the columns used, the rows dropped and why, the end dates assumed; `detect --out` a JSON with a verdict per source (`DETECTED`, `NOT_DETECTED`, `AMBIGUOUS` when the rig never worked alone, `INSUFFICIENT_WINDOWS`), the quiet baseline, the lines that belong to each detected source and not to the quiet hours, and the radius bracketed between the farthest rig heard and the nearest not heard.
|
|
8
8
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**The command**: declare each disposal well once - `gea workspace --path C:\site --action set-well --well <id> --lat LAT --lon LON --datum NAD27 --api 42-329-12345 --uic 123456 --depth-tier deep --formation "completed below the base of the Wolfcamp" --channel-pressure P_surf_psi --channel-rate Q_bpm --rate-unit bbl/min --bhp-method probe --channel-bhp P_bh_psi`; define the area on the site once - `--action sra-define --site <id> --name "Gardendale SRA" --lat 31.95 --lon -102.25 --datum WGS84 --radius-km 9.08 --plan-date 2022-12-16 --triggering-event texnet2022yxab`; then every month - `--action sra-report --site <id> --catalog texnet_export.csv [--aftershocks id1 id2] [--start 2026-03-01 --end 2026-03-31]`. `gea sra` runs the self-test on a labelled scene.
|
|
6
6
|
|
|
7
|
-
**What it writes**: `reports/sites/<site>/sra_packet.html` (and `.md`, `.json`) - the area and the plan as declared, what is inside it with each well's depth tier, the daily record per well rolled up by month, the seismicity against the plan, the checkpoint schedule, and every gap by name; and `sra_daily_export.csv` - one line per well per day under the Notice's own parameter names (maximum surface injection pressure, average surface injection pressure, injection volume, maximum injection rate), the bottomhole pressure and its method, and the well's API and UIC numbers. Every declaration and every packet is in `records/audit.jsonl`.
|
|
7
|
+
**What it writes**: `reports/sites/<site>/sra_packet.html` (and `.md`, `.json`) - the area and the plan as declared, what is inside it with each well's depth tier, the daily record per well rolled up by month, the seismicity against the plan, the events the site's own stations located (when `--action associate` has been run on the site: each inside or outside the area, against the catalogue, no magnitude), the checkpoint schedule, and every gap by name; and `sra_daily_export.csv` - one line per well per day under the Notice's own parameter names (maximum surface injection pressure, average surface injection pressure, injection volume, maximum injection rate), the bottomhole pressure and its method, and the well's API and UIC numbers. Every declaration and every packet is in `records/audit.jsonl`.
|
|
8
8
|
|
|
9
9
|
**The number to check**: `Response:` in section "Seismicity against the plan" - TRIGGERED names the event, its magnitude and the deadline for the response group's meeting; NOT TRIGGERED names why. `Goal:` gives the days without a threshold event and the date the plan's goal falls on. The packet's front says COMPLETE or INCOMPLETE with the count of gaps.
|
|
10
10
|
|