gea-program 0.28.0__tar.gz → 0.29.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.28.0/gea_program.egg-info → gea_program-0.29.0}/PKG-INFO +31 -14
- {gea_program-0.28.0 → gea_program-0.29.0}/README.md +30 -13
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/__init__.py +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/__main__.py +56 -37
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/acceptance_tests.py +225 -3
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/backup.py +2 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +15 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/barbados_110_consolidation.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +14 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/fram_909_organic_petrography.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +14 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +26 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +11 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +18 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +11 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +11 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +11 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +18 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/l06_06_nl_survey.provenance.json +18 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +17 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/med_160_sapropels.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +21 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/sumatra_362_cohesion.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +29 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +20 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +21 -2
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +10 -1
- gea_program-0.29.0/gea/catalog_map.py +310 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/doctor.py +3 -3
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/fixtures/README.md +5 -0
- gea_program-0.29.0/gea/fixtures/ne_110m_coastline.json +1 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/geodesy.py +12 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/backup.md +1 -1
- gea_program-0.29.0/gea/help/catalog.md +11 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/conformance.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/field-ports.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/historian.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/instruments.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/interval.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/month-end.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/osdu.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/ppdm.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/quakeml.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/seedlink.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/seismic.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/sites.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/slip.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/sra.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/structure.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/tools.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/vibration.md +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/helplib.py +1 -1
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/service.py +25 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/shapefile.py +3 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/web/app.html +50 -3
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/workspace.py +10 -1
- {gea_program-0.28.0 → gea_program-0.29.0/gea_program.egg-info}/PKG-INFO +31 -14
- {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/SOURCES.txt +2 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/pyproject.toml +1 -1
- gea_program-0.28.0/gea/help/catalog.md +0 -11
- {gea_program-0.28.0 → gea_program-0.29.0}/LICENSE +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/accuracy_statement.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/alarm_engine.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/bench.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/blind_harness.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/med_160_sapropels.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog_register.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/certificates.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/cli.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/client_reports.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/config_versioning.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/conformance.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/correlation.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/dashboard.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/deviation.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/dlis.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/dnp3.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/downhole_engine.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/drift_monitor.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/earth_model.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/elevation.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/etp.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/etp12_schemas.json +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/example_register_map.json +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/fat_sat.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/files.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/follower.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/forward_model.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/friction_priors.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/gamma.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/gauge_aging.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/gauge_specs.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/gravity_reference.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/hartip.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/TESTER_GUIDE.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/alarms.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/audit-update.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/data-in.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/dlis.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/doctor.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/drift.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/etp.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/files.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/notifications.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/patches.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/quality.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/site.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/soak.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/start.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/transients.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/upkeep.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/well-tests.md +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/housekeeping.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/interval.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/inverse_engine.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/jobs.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/live_ports.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/loadtest.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/matplotlib_demo.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/modbus.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/modbus_rtu.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/model_card.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/month_end.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/mqtt_port.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/notify.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/opcua_port.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/operator_app.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/osdu.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/patches.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/permits.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/piwebapi.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/ports.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/ppdm.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/profile_catalog.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/project.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/qt6_downhole_app.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/quakeml.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/reconciler.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/libmseed_steim.provenance.json +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/rock_inventory.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/sample_record.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/sample_well_profile.csv +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/sbom.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seedlink.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/segy.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_array.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_assoc.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_detect.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_film.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_harmonic.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_qc.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_response.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_signature.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_track.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_uncertainty.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_unlisted.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/sensor_swap.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/service_life.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/shell.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/shut_in.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/sla_report.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/slip.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/soak.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/sra.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/store_forward.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/strata_join.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/structure.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/supervisor.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/survey_cmd.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/survey_view.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/telemetry.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/tool_catalog.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/tool_library.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/transient.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/vibration.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/well_assembler.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/well_test_validation.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/wits0.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea/witsml.py +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/dependency_links.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/entry_points.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/requires.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/top_level.txt +0 -0
- {gea_program-0.28.0 → gea_program-0.29.0}/setup.cfg +0 -0
- {gea_program-0.28.0 → gea_program-0.29.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.29.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 (373 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]")
|
|
@@ -236,7 +236,7 @@ value in your units (field or SI - "Your preferences", with site defaults
|
|
|
236
236
|
under Administration); a first-run guide walks a new site through its
|
|
237
237
|
settings, first well, people and first refresh; every page prints cleanly.
|
|
238
238
|
|
|
239
|
-
Every action the page takes is a job: `python -m gea
|
|
239
|
+
Every action the page takes is a job: `python -m gea ...` run by the
|
|
240
240
|
service with its log kept under `jobs/`, so one code path serves the page, the
|
|
241
241
|
terminal and the acceptance gate, and a failed action shows its log instead of
|
|
242
242
|
disappearing. Every action is written to `records/audit.jsonl` with the
|
|
@@ -558,7 +558,7 @@ an aftershock: those are declarations, and the packet says so.
|
|
|
558
558
|
### The OSDU-shaped export
|
|
559
559
|
|
|
560
560
|
What a buyer's data team asks for on the first call. `gea workspace --action
|
|
561
|
-
osdu-export --site
|
|
561
|
+
osdu-export --site retama-block --partition opendes --acl-owner ... --acl-viewer ...
|
|
562
562
|
--legal-tag ...` writes the site as an `osdu:wks:Manifest:1.0.0` to the
|
|
563
563
|
published well-known schemas: each well as Well and Wellbore 1.0.0 with its
|
|
564
564
|
API and UIC as name aliases, its record as a WellLog 1.1.0 in the time
|
|
@@ -573,8 +573,8 @@ tag the manifest is NOT LOADABLE and says so. `gea help osdu`.
|
|
|
573
573
|
### The QuakeML catalogue export
|
|
574
574
|
|
|
575
575
|
The site's own events in the format the regulator's catalogue tools read.
|
|
576
|
-
After `associate`, `gea workspace --action quakeml-export --site
|
|
577
|
-
[--agency "
|
|
576
|
+
After `associate`, `gea workspace --action quakeml-export --site retama-block
|
|
577
|
+
[--agency "Acme Operating"]` writes `reports/sites/<site>/quakeml/<site>_events.xml`
|
|
578
578
|
as QuakeML 1.2 to the Basic Event Description schema: one event per
|
|
579
579
|
associated event with its origin (the misfit region as the uncertainties,
|
|
580
580
|
depth in metres and "operator assigned" because it was declared, the method
|
|
@@ -590,7 +590,7 @@ quakeml`; `gea quakeml` runs the labelled scene.
|
|
|
590
590
|
|
|
591
591
|
### The well as master data names it
|
|
592
592
|
|
|
593
|
-
`gea workspace --action well-identity --well
|
|
593
|
+
`gea workspace --action well-identity --well SWD-1` names a well the way the
|
|
594
594
|
operator's master data and a regulator's well file name it: the US Well
|
|
595
595
|
Number (the API number, whose standard PPDM has held since 2010) taken apart
|
|
596
596
|
- state and offshore code, county code, unique well and its range, sidetrack
|
|
@@ -609,7 +609,7 @@ number apart from the command line; `gea help ppdm`.
|
|
|
609
609
|
### Machine vibration
|
|
610
610
|
|
|
611
611
|
The pump's record read the way an operations engineer expects. `gea
|
|
612
|
-
workspace --action vibration-report --well
|
|
612
|
+
workspace --action vibration-report --well SWD-1 --record pump.csv --vib-unit
|
|
613
613
|
g --rpm 1780 --group 2 --support rigid --bearing 9,7.94,39.04` writes the
|
|
614
614
|
broadband r.m.s. vibration velocity over 10-1000 Hz (2-1000 Hz below 600
|
|
615
615
|
r/min), the quantity ISO 20816-1 defines, and the ISO 20816-3 zone for the
|
|
@@ -692,7 +692,7 @@ statement on declared inputs, not a probability and not a verdict.
|
|
|
692
692
|
`gea catalog --list` is the register of the 52 shipped public datasets: for
|
|
693
693
|
each, what in this program reads it, or CARRIED, NO BAND with the reason;
|
|
694
694
|
the gate holds the register to the code both ways and reads every entry.
|
|
695
|
-
`gea survey --catalog
|
|
695
|
+
`gea survey --catalog collingwood_1_28_ks_complete` runs the strata survey on any catalogue log
|
|
696
696
|
with its provenance; `gea catalog --friction` reads seven laboratory
|
|
697
697
|
datasets on natural fault and sediment samples as the measured friction
|
|
698
698
|
envelope (0.21-0.90 on 70 measurements, none from the Permian) against
|
|
@@ -700,6 +700,23 @@ Byerlee's 0.6; `gea catalog --core` checks the published sandstone range
|
|
|
700
700
|
against the Volve core (65 of 70 plugs inside), an evaluation on the rock
|
|
701
701
|
inventory model card. `gea help catalog`.
|
|
702
702
|
|
|
703
|
+
### The catalogue on a world map
|
|
704
|
+
|
|
705
|
+
The Catalogue tab is where each of the 52 entries was drilled: 49 wells and
|
|
706
|
+
sites from the KTB to Hikurangi, taken from each entry's own file - a
|
|
707
|
+
PANGAEA event line, a LAS header, a KTB Gauss-Krueger grid reference
|
|
708
|
+
unprojected on the Bessel ellipsoid and shifted to WGS84 with the shift
|
|
709
|
+
stated - or from the sidecar's source record, or NO POSITION. Nothing is
|
|
710
|
+
looked up: 44 of 52 are positioned (33 distinct marks; the entries of one
|
|
711
|
+
borehole share a mark) and the 8 that are not are listed with what their
|
|
712
|
+
files do say. The coastline is Natural Earth 1:110m (public domain, in
|
|
713
|
+
`gea/fixtures` with its provenance). Each position is written into the
|
|
714
|
+
entry's sidecar with the line it came from, and the gate holds the sidecars
|
|
715
|
+
equal to a fresh read of the files. `gea catalog --positions`, `gea catalog
|
|
716
|
+
--map catalogue.svg` (the same picture as a file, with the key),
|
|
717
|
+
`--check-positions`. A mark is the coordinate the record states, not a
|
|
718
|
+
position this program measured.
|
|
719
|
+
|
|
703
720
|
### The log as delivered, and the historian
|
|
704
721
|
|
|
705
722
|
A well log arrives as DLIS (API RP66 V1); `gea/dlis.py` reads the container
|
|
@@ -744,7 +761,7 @@ derrick floor) and where it came from: `gea workspace --action set-well --well
|
|
|
744
761
|
(`--elev-3dep` fetches the ground elevation from the USGS 3DEP point service
|
|
745
762
|
instead, stored with its raster and named as the ground). A contours layer is
|
|
746
763
|
told what it maps (`add-layer ... --formation-name Wolfcamp --role
|
|
747
|
-
top|isopach|base`). `--action interval --well
|
|
764
|
+
top|isopach|base`). `--action interval --well SWD-1` then converts the interval
|
|
748
765
|
to subsea with the arithmetic printed and sets it beside each formation-top
|
|
749
766
|
bracket at the well: ABOVE the mapped top, BELOW it, or NOT RESOLVED where
|
|
750
767
|
the bracket overlaps the interval; a formation with a top and an isopach gets
|
|
@@ -765,8 +782,8 @@ index, the .dbf attributes, the .prj coordinate system; geographic NAD83 or
|
|
|
765
782
|
WGS84 taken as is, the Texas State Plane NAD83 zones unprojected, anything
|
|
766
783
|
else refused by name) and kept in the workspace with every part hashed:
|
|
767
784
|
`gea workspace --action add-layer --name ... --layer structure.zip
|
|
768
|
-
--citation ...` (`--member
|
|
769
|
-
several; `gea structure --layer
|
|
785
|
+
--citation ...` (`--member Faults_Permian_201712` names one shapefile in a zip holding
|
|
786
|
+
several; `gea structure --layer PermianBasin_Boundary_Structural_Tectonic.zip --list` lists them). Each layer is
|
|
770
787
|
kept by kind and read for what it is: faults and folds (`--action structure
|
|
771
788
|
--well <id>` prints the nearest mapped fault and the nearest fold by
|
|
772
789
|
distance along the ellipsoid and bearing, and what else the map holds within
|
|
@@ -777,7 +794,7 @@ A position outside the layer's extent is OUTSIDE LAYER EXTENT, which is not
|
|
|
777
794
|
"no faults". Proven on the USGS PP 1708 Appalachian structure layer and the
|
|
778
795
|
EIA Permian Basin set. On the well page, in the SRA packet's
|
|
779
796
|
section 2b for every well inside the area, and from `gea structure --layer
|
|
780
|
-
|
|
797
|
+
structure.zip --lat 41.1 --lon -80.68` for any position. A distance to a mapped trace is a fact
|
|
781
798
|
of the map at the map's scale, not a hazard judgement. `gea help structure`.
|
|
782
799
|
|
|
783
800
|
### WITSML 2.x over ETP
|
|
@@ -898,7 +915,7 @@ without administrator rights, and keeps the site's data in a separate
|
|
|
898
915
|
workspace folder it never deletes.
|
|
899
916
|
|
|
900
917
|
```
|
|
901
|
-
python tools/build_installer.py # dist/gea-program
|
|
918
|
+
python tools/build_installer.py # dist/gea-program-0.29.0-win64/ and .zip (needs internet here, none there)
|
|
902
919
|
python tools/build_installer.py --extras live,plotting,xls # a smaller kit without the PyQt6 desktop window
|
|
903
920
|
python tools/build_installer.py --platform linux # a venv-based kit for a Linux site server
|
|
904
921
|
```
|
|
@@ -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 (373 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]")
|
|
@@ -197,7 +197,7 @@ value in your units (field or SI - "Your preferences", with site defaults
|
|
|
197
197
|
under Administration); a first-run guide walks a new site through its
|
|
198
198
|
settings, first well, people and first refresh; every page prints cleanly.
|
|
199
199
|
|
|
200
|
-
Every action the page takes is a job: `python -m gea
|
|
200
|
+
Every action the page takes is a job: `python -m gea ...` run by the
|
|
201
201
|
service with its log kept under `jobs/`, so one code path serves the page, the
|
|
202
202
|
terminal and the acceptance gate, and a failed action shows its log instead of
|
|
203
203
|
disappearing. Every action is written to `records/audit.jsonl` with the
|
|
@@ -519,7 +519,7 @@ an aftershock: those are declarations, and the packet says so.
|
|
|
519
519
|
### The OSDU-shaped export
|
|
520
520
|
|
|
521
521
|
What a buyer's data team asks for on the first call. `gea workspace --action
|
|
522
|
-
osdu-export --site
|
|
522
|
+
osdu-export --site retama-block --partition opendes --acl-owner ... --acl-viewer ...
|
|
523
523
|
--legal-tag ...` writes the site as an `osdu:wks:Manifest:1.0.0` to the
|
|
524
524
|
published well-known schemas: each well as Well and Wellbore 1.0.0 with its
|
|
525
525
|
API and UIC as name aliases, its record as a WellLog 1.1.0 in the time
|
|
@@ -534,8 +534,8 @@ tag the manifest is NOT LOADABLE and says so. `gea help osdu`.
|
|
|
534
534
|
### The QuakeML catalogue export
|
|
535
535
|
|
|
536
536
|
The site's own events in the format the regulator's catalogue tools read.
|
|
537
|
-
After `associate`, `gea workspace --action quakeml-export --site
|
|
538
|
-
[--agency "
|
|
537
|
+
After `associate`, `gea workspace --action quakeml-export --site retama-block
|
|
538
|
+
[--agency "Acme Operating"]` writes `reports/sites/<site>/quakeml/<site>_events.xml`
|
|
539
539
|
as QuakeML 1.2 to the Basic Event Description schema: one event per
|
|
540
540
|
associated event with its origin (the misfit region as the uncertainties,
|
|
541
541
|
depth in metres and "operator assigned" because it was declared, the method
|
|
@@ -551,7 +551,7 @@ quakeml`; `gea quakeml` runs the labelled scene.
|
|
|
551
551
|
|
|
552
552
|
### The well as master data names it
|
|
553
553
|
|
|
554
|
-
`gea workspace --action well-identity --well
|
|
554
|
+
`gea workspace --action well-identity --well SWD-1` names a well the way the
|
|
555
555
|
operator's master data and a regulator's well file name it: the US Well
|
|
556
556
|
Number (the API number, whose standard PPDM has held since 2010) taken apart
|
|
557
557
|
- state and offshore code, county code, unique well and its range, sidetrack
|
|
@@ -570,7 +570,7 @@ number apart from the command line; `gea help ppdm`.
|
|
|
570
570
|
### Machine vibration
|
|
571
571
|
|
|
572
572
|
The pump's record read the way an operations engineer expects. `gea
|
|
573
|
-
workspace --action vibration-report --well
|
|
573
|
+
workspace --action vibration-report --well SWD-1 --record pump.csv --vib-unit
|
|
574
574
|
g --rpm 1780 --group 2 --support rigid --bearing 9,7.94,39.04` writes the
|
|
575
575
|
broadband r.m.s. vibration velocity over 10-1000 Hz (2-1000 Hz below 600
|
|
576
576
|
r/min), the quantity ISO 20816-1 defines, and the ISO 20816-3 zone for the
|
|
@@ -653,7 +653,7 @@ statement on declared inputs, not a probability and not a verdict.
|
|
|
653
653
|
`gea catalog --list` is the register of the 52 shipped public datasets: for
|
|
654
654
|
each, what in this program reads it, or CARRIED, NO BAND with the reason;
|
|
655
655
|
the gate holds the register to the code both ways and reads every entry.
|
|
656
|
-
`gea survey --catalog
|
|
656
|
+
`gea survey --catalog collingwood_1_28_ks_complete` runs the strata survey on any catalogue log
|
|
657
657
|
with its provenance; `gea catalog --friction` reads seven laboratory
|
|
658
658
|
datasets on natural fault and sediment samples as the measured friction
|
|
659
659
|
envelope (0.21-0.90 on 70 measurements, none from the Permian) against
|
|
@@ -661,6 +661,23 @@ Byerlee's 0.6; `gea catalog --core` checks the published sandstone range
|
|
|
661
661
|
against the Volve core (65 of 70 plugs inside), an evaluation on the rock
|
|
662
662
|
inventory model card. `gea help catalog`.
|
|
663
663
|
|
|
664
|
+
### The catalogue on a world map
|
|
665
|
+
|
|
666
|
+
The Catalogue tab is where each of the 52 entries was drilled: 49 wells and
|
|
667
|
+
sites from the KTB to Hikurangi, taken from each entry's own file - a
|
|
668
|
+
PANGAEA event line, a LAS header, a KTB Gauss-Krueger grid reference
|
|
669
|
+
unprojected on the Bessel ellipsoid and shifted to WGS84 with the shift
|
|
670
|
+
stated - or from the sidecar's source record, or NO POSITION. Nothing is
|
|
671
|
+
looked up: 44 of 52 are positioned (33 distinct marks; the entries of one
|
|
672
|
+
borehole share a mark) and the 8 that are not are listed with what their
|
|
673
|
+
files do say. The coastline is Natural Earth 1:110m (public domain, in
|
|
674
|
+
`gea/fixtures` with its provenance). Each position is written into the
|
|
675
|
+
entry's sidecar with the line it came from, and the gate holds the sidecars
|
|
676
|
+
equal to a fresh read of the files. `gea catalog --positions`, `gea catalog
|
|
677
|
+
--map catalogue.svg` (the same picture as a file, with the key),
|
|
678
|
+
`--check-positions`. A mark is the coordinate the record states, not a
|
|
679
|
+
position this program measured.
|
|
680
|
+
|
|
664
681
|
### The log as delivered, and the historian
|
|
665
682
|
|
|
666
683
|
A well log arrives as DLIS (API RP66 V1); `gea/dlis.py` reads the container
|
|
@@ -705,7 +722,7 @@ derrick floor) and where it came from: `gea workspace --action set-well --well
|
|
|
705
722
|
(`--elev-3dep` fetches the ground elevation from the USGS 3DEP point service
|
|
706
723
|
instead, stored with its raster and named as the ground). A contours layer is
|
|
707
724
|
told what it maps (`add-layer ... --formation-name Wolfcamp --role
|
|
708
|
-
top|isopach|base`). `--action interval --well
|
|
725
|
+
top|isopach|base`). `--action interval --well SWD-1` then converts the interval
|
|
709
726
|
to subsea with the arithmetic printed and sets it beside each formation-top
|
|
710
727
|
bracket at the well: ABOVE the mapped top, BELOW it, or NOT RESOLVED where
|
|
711
728
|
the bracket overlaps the interval; a formation with a top and an isopach gets
|
|
@@ -726,8 +743,8 @@ index, the .dbf attributes, the .prj coordinate system; geographic NAD83 or
|
|
|
726
743
|
WGS84 taken as is, the Texas State Plane NAD83 zones unprojected, anything
|
|
727
744
|
else refused by name) and kept in the workspace with every part hashed:
|
|
728
745
|
`gea workspace --action add-layer --name ... --layer structure.zip
|
|
729
|
-
--citation ...` (`--member
|
|
730
|
-
several; `gea structure --layer
|
|
746
|
+
--citation ...` (`--member Faults_Permian_201712` names one shapefile in a zip holding
|
|
747
|
+
several; `gea structure --layer PermianBasin_Boundary_Structural_Tectonic.zip --list` lists them). Each layer is
|
|
731
748
|
kept by kind and read for what it is: faults and folds (`--action structure
|
|
732
749
|
--well <id>` prints the nearest mapped fault and the nearest fold by
|
|
733
750
|
distance along the ellipsoid and bearing, and what else the map holds within
|
|
@@ -738,7 +755,7 @@ A position outside the layer's extent is OUTSIDE LAYER EXTENT, which is not
|
|
|
738
755
|
"no faults". Proven on the USGS PP 1708 Appalachian structure layer and the
|
|
739
756
|
EIA Permian Basin set. On the well page, in the SRA packet's
|
|
740
757
|
section 2b for every well inside the area, and from `gea structure --layer
|
|
741
|
-
|
|
758
|
+
structure.zip --lat 41.1 --lon -80.68` for any position. A distance to a mapped trace is a fact
|
|
742
759
|
of the map at the map's scale, not a hazard judgement. `gea help structure`.
|
|
743
760
|
|
|
744
761
|
### WITSML 2.x over ETP
|
|
@@ -859,7 +876,7 @@ without administrator rights, and keeps the site's data in a separate
|
|
|
859
876
|
workspace folder it never deletes.
|
|
860
877
|
|
|
861
878
|
```
|
|
862
|
-
python tools/build_installer.py # dist/gea-program
|
|
879
|
+
python tools/build_installer.py # dist/gea-program-0.29.0-win64/ and .zip (needs internet here, none there)
|
|
863
880
|
python tools/build_installer.py --extras live,plotting,xls # a smaller kit without the PyQt6 desktop window
|
|
864
881
|
python tools/build_installer.py --platform linux # a venv-based kit for a Linux site server
|
|
865
882
|
```
|
|
@@ -281,8 +281,8 @@ def main(argv=None) -> int:
|
|
|
281
281
|
p_tl = sub.add_parser("tools", help="the tool library and the port registry: every tool with its citation, ratings and the interface it declares; every file format and live protocol; --rating checks a tool string")
|
|
282
282
|
p_tl.add_argument("--json", action="store_true")
|
|
283
283
|
p_tl.add_argument("--list", action="store_true", help="just the tool names")
|
|
284
|
-
p_tl.add_argument("--rating", action="store_true", help="check a tool string: --station
|
|
285
|
-
p_tl.add_argument("--station", type=str, action="append", default=None, help="a station as
|
|
284
|
+
p_tl.add_argument("--rating", action="store_true", help="check a tool string: --station 9850:quartz_pt_geoq177_16k (depth in ft, then the tool; repeatable)")
|
|
285
|
+
p_tl.add_argument("--station", type=str, action="append", default=None, help="a station as DEPTH_FT:TOOL, e.g. 9850:quartz_pt_geoq177_16k")
|
|
286
286
|
p_tl.add_argument("--surface-temp-f", type=float, default=75.0); p_tl.add_argument("--temp-gradient-f-ft", type=float, default=0.018)
|
|
287
287
|
p_tl.add_argument("--surface-pressure-psi", type=float, default=14.7); p_tl.add_argument("--pressure-gradient-psi-ft", type=float, default=0.465)
|
|
288
288
|
p_cc = sub.add_parser("comcat", help="USGS ComCat / any FDSN event service: --lat --lon --radius-km --start --end prints the text-format query to open; --file reads the export it returns")
|
|
@@ -303,6 +303,9 @@ def main(argv=None) -> int:
|
|
|
303
303
|
p_cat.add_argument("--friction", action="store_true"); p_cat.add_argument("--core", action="store_true")
|
|
304
304
|
p_cat.add_argument("--entry", type=str, default=None); p_cat.add_argument("--info", action="store_true"); p_cat.add_argument("--stream-csv", type=str, default=None)
|
|
305
305
|
p_cat.add_argument("--json", action="store_true")
|
|
306
|
+
p_cat.add_argument("--positions", action="store_true", help="where every entry was drilled, from its own file or sidecar, or NO POSITION")
|
|
307
|
+
p_cat.add_argument("--map", type=str, default=None, metavar="OUT.SVG", help="write the world map of the catalogue (coastline + one mark per positioned entry + the key) as an SVG file")
|
|
308
|
+
p_cat.add_argument("--check-positions", action="store_true", help="the sidecars' recorded positions against a fresh read of the files (the gate's check)")
|
|
306
309
|
p_dl = sub.add_parser("dlis", help="a DLIS (RP66 V1) well log: --info describes it (origin, channels, frames, what was skipped); --frame --out writes the frame as a historian-style CSV; --to-las writes LAS 2.0")
|
|
307
310
|
p_dl.add_argument("--file", type=str, required=True)
|
|
308
311
|
p_dl.add_argument("--info", action="store_true")
|
|
@@ -415,7 +418,7 @@ def main(argv=None) -> int:
|
|
|
415
418
|
p_ws.add_argument("--include-open", action="store_true", help="live-fold: fold the current day's files too (they are still being written)")
|
|
416
419
|
p_ws.add_argument("--seconds", type=float, default=None, help="live-run: how long to run (default: until Ctrl+C)")
|
|
417
420
|
p_ws.add_argument("--layer", type=str, default=None, help="add-layer: the shapefile (zip, folder or .shp); remove-layer: the layer id")
|
|
418
|
-
p_ws.add_argument("--member", type=str, default=None, help="add-layer: which shapefile inside a zip or folder that holds several (gea structure --layer
|
|
421
|
+
p_ws.add_argument("--member", type=str, default=None, help="add-layer: which shapefile inside a zip or folder that holds several (gea structure --layer layer.zip --list)")
|
|
419
422
|
p_ws.add_argument("--citation", type=str, default="", help="add-layer: where the map came from, in the site's words")
|
|
420
423
|
p_ws.add_argument("--formation-name", type=str, default=None, help="add-layer: the formation a contours layer maps (Wolfcamp)")
|
|
421
424
|
p_ws.add_argument("--role", type=str, choices=["top", "isopach", "base"], default=None, help="add-layer: what the contours are of that formation: its top elevation, its thickness, or its base")
|
|
@@ -475,7 +478,7 @@ def main(argv=None) -> int:
|
|
|
475
478
|
p_el.add_argument("--lat", type=float, required=True); p_el.add_argument("--lon", type=float, required=True)
|
|
476
479
|
p_el.add_argument("--url", type=str, default=None, help="the EPQS endpoint (default the USGS one)")
|
|
477
480
|
p_el.add_argument("--json", action="store_true")
|
|
478
|
-
p_st = sub.add_parser("structure", help="the nearest mapped fault and fold to a position, from a shapefile: --layer
|
|
481
|
+
p_st = sub.add_parser("structure", help="the nearest mapped fault and fold to a position, from a shapefile: --layer layer.zip (or a folder, or a .shp) --lat --lon; --info describes the layer")
|
|
479
482
|
p_st.add_argument("--layer", type=str, required=True)
|
|
480
483
|
p_st.add_argument("--lat", type=float, default=None); p_st.add_argument("--lon", type=float, default=None)
|
|
481
484
|
p_st.add_argument("--radius-km", type=float, default=50.0)
|
|
@@ -589,7 +592,7 @@ def main(argv=None) -> int:
|
|
|
589
592
|
p_pm = sub.add_parser("permits", help="a drilling-permit export (CSV/TSV) to the rigs CSV the seismic tests judge against, with an import note")
|
|
590
593
|
p_pm.add_argument("--file", type=str, required=True, help="the permit export (a regulator's query CSV, an operator's schedule)")
|
|
591
594
|
p_pm.add_argument("--out", type=str, required=True, help="the rigs CSV to write (an .import.json note is written beside it)")
|
|
592
|
-
p_pm.add_argument("--mapping", type=str, default=None, help='JSON {"lat": "
|
|
595
|
+
p_pm.add_argument("--mapping", type=str, default=None, help='JSON {"lat": "LAT_COLUMN", "lon": ..., "start": ..., "end": ..., "id": ..., "name": ...} when the guesses are wrong')
|
|
593
596
|
p_pm.add_argument("--default-days", type=float, default=30.0, help="a row without an end date works this many days from its start (default 30)")
|
|
594
597
|
p_pm.add_argument("--within", type=float, nargs=3, default=None, metavar=("LAT", "LON", "KM"), help="keep only rigs within KM of LAT, LON")
|
|
595
598
|
p_pm.add_argument("--datum", type=str, default=None, help="the datum the export's positions are on (WGS84, NAD83, NAD27) when no column says; every row is converted to WGS84 and the note records the shift")
|
|
@@ -863,7 +866,7 @@ def main(argv=None) -> int:
|
|
|
863
866
|
import json as _json
|
|
864
867
|
from .survey_cmd import run_survey
|
|
865
868
|
if not (a.file or a.demo or a.catalog):
|
|
866
|
-
raise SystemExit("survey needs --file
|
|
869
|
+
raise SystemExit("survey needs --file mywell.las (a LAS or DLIS), --catalog collingwood_1_28_ks_complete, or --demo")
|
|
867
870
|
txt, machine = run_survey(path=a.file, demo=a.demo, family=a.family, lat=a.lat, elev=a.elev, frame=a.frame, catalog=a.catalog)
|
|
868
871
|
print(txt)
|
|
869
872
|
if a.out:
|
|
@@ -1961,11 +1964,11 @@ def main(argv=None) -> int:
|
|
|
1961
1964
|
w = ws.add_well_live(a.name, a.port, a.file, actor=a.actor, station_md_ft=a.station_md)
|
|
1962
1965
|
elif a.action == "remove":
|
|
1963
1966
|
if not a.well:
|
|
1964
|
-
raise SystemExit("remove needs --well
|
|
1967
|
+
raise SystemExit("remove needs --well WELL_ID")
|
|
1965
1968
|
ws.remove_well(a.well, actor=a.actor); print("removed (folder kept):", a.well); return 0
|
|
1966
1969
|
elif a.action == "migrate":
|
|
1967
1970
|
if not a.from_dir:
|
|
1968
|
-
raise SystemExit("migrate needs --from
|
|
1971
|
+
raise SystemExit("migrate needs --from FOLDER (one written by gea dashboard --out)")
|
|
1969
1972
|
print(_json.dumps(ws.migrate_out_dir(a.from_dir, actor=a.actor), indent=1)); return 0
|
|
1970
1973
|
elif a.action == "refresh":
|
|
1971
1974
|
r = ws.refresh_dashboard(actor=a.actor, outages=a.outage, month=a.month, run_sat=a.sat)
|
|
@@ -2009,7 +2012,7 @@ def main(argv=None) -> int:
|
|
|
2009
2012
|
return 0
|
|
2010
2013
|
elif a.action == "remove-track":
|
|
2011
2014
|
if not a.track:
|
|
2012
|
-
raise SystemExit("remove-track needs --track
|
|
2015
|
+
raise SystemExit("remove-track needs --track TRACK_ID")
|
|
2013
2016
|
ws.remove_track(a.track, actor=a.actor); print("removed (folder kept):", a.track); return 0
|
|
2014
2017
|
elif a.action == "sar-film":
|
|
2015
2018
|
r = ws.sar_film(actor=a.actor, seed=a.seed, hours=a.hours, step_s=a.step, band=tuple(a.band) if a.band else (1.0, 20.0), method=a.method, scene=a.scene)
|
|
@@ -2023,14 +2026,14 @@ def main(argv=None) -> int:
|
|
|
2023
2026
|
elif a.action == "sites":
|
|
2024
2027
|
rows = ws.sites()
|
|
2025
2028
|
if not rows:
|
|
2026
|
-
print("no sites yet; `--action add-site --name
|
|
2029
|
+
print("no sites yet; `--action add-site --name \"Retama block\" --wells SWD-1 --seismic TX-PB01 --tracks pad-7-lateral`")
|
|
2027
2030
|
for st in rows:
|
|
2028
2031
|
print(f" {st['id']:<24} {st.get('client') or '-':<20} {len(st['wells'])} well(s), {len(st['seismic'])} station(s), "
|
|
2029
2032
|
f"{len(st['tracks'])} track(s)")
|
|
2030
2033
|
return 0
|
|
2031
2034
|
elif a.action == "site-report":
|
|
2032
2035
|
if not a.site:
|
|
2033
|
-
raise SystemExit("site-report needs --site
|
|
2036
|
+
raise SystemExit("site-report needs --site SITE_ID")
|
|
2034
2037
|
r = ws.write_site_report(a.site, actor=a.actor)
|
|
2035
2038
|
c = r["summary"]["counts"]
|
|
2036
2039
|
print(f"site-report: {a.site} - {c['wells']} well(s), {c['seismic']} seismic station(s), {c['tracks']} track(s)")
|
|
@@ -2040,11 +2043,11 @@ def main(argv=None) -> int:
|
|
|
2040
2043
|
return 0
|
|
2041
2044
|
elif a.action == "remove-site":
|
|
2042
2045
|
if not a.site:
|
|
2043
|
-
raise SystemExit("remove-site needs --site
|
|
2046
|
+
raise SystemExit("remove-site needs --site SITE_ID")
|
|
2044
2047
|
ws.remove_site(a.site, actor=a.actor); print("removed (folder kept):", a.site); return 0
|
|
2045
2048
|
elif a.action == "set-well":
|
|
2046
2049
|
if not a.well:
|
|
2047
|
-
raise SystemExit("set-well needs --well
|
|
2050
|
+
raise SystemExit("set-well needs --well WELL_ID")
|
|
2048
2051
|
surface = {"lat": a.lat, "lon": a.lon, "datum": a.datum} if (a.lat is not None or a.lon is not None) else {}
|
|
2049
2052
|
if a.elev_3dep:
|
|
2050
2053
|
from .elevation import EPQS_URL, as_reference, epqs
|
|
@@ -2081,14 +2084,14 @@ def main(argv=None) -> int:
|
|
|
2081
2084
|
elif a.action == "sra-report":
|
|
2082
2085
|
from .sra import report_text as _sra_text
|
|
2083
2086
|
if not a.site:
|
|
2084
|
-
raise SystemExit("sra-report needs --site
|
|
2087
|
+
raise SystemExit("sra-report needs --site SITE_ID")
|
|
2085
2088
|
r = ws.write_sra_packet(a.site, catalog_csv=a.catalog, aftershocks=a.aftershocks, start=a.start, end=a.end, actor=a.actor)
|
|
2086
2089
|
print(_sra_text(r["packet"]))
|
|
2087
2090
|
print(" report:", r["paths"]["html"]); print(" daily export:", r["paths"]["daily_csv"], f"({r['export_rows']} rows)"); return 0
|
|
2088
2091
|
elif a.action == "associate":
|
|
2089
2092
|
from .seismic_assoc import report_text as _assoc_text
|
|
2090
2093
|
if not a.site:
|
|
2091
|
-
raise SystemExit("associate needs --site
|
|
2094
|
+
raise SystemExit("associate needs --site SITE_ID")
|
|
2092
2095
|
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,
|
|
2093
2096
|
rms_tol_s=a.rms_tol, actor=a.actor)
|
|
2094
2097
|
for sid, x in r["stations"].items():
|
|
@@ -2098,7 +2101,7 @@ def main(argv=None) -> int:
|
|
|
2098
2101
|
elif a.action == "osdu-export":
|
|
2099
2102
|
from .osdu import report_text as _osdu_text
|
|
2100
2103
|
if not a.site:
|
|
2101
|
-
raise SystemExit("osdu-export needs --site
|
|
2104
|
+
raise SystemExit("osdu-export needs --site SITE_ID")
|
|
2102
2105
|
r = ws.osdu_export(a.site, partition=a.partition, acl_owners=a.acl_owner, acl_viewers=a.acl_viewer, legal_tags=a.legal_tag,
|
|
2103
2106
|
countries=a.country, operator_org_id=a.operator_org, out_dir=a.out, actor=a.actor)
|
|
2104
2107
|
print(_osdu_text(r)); v = r["validate"]
|
|
@@ -2106,7 +2109,7 @@ def main(argv=None) -> int:
|
|
|
2106
2109
|
elif a.action == "vibration-report":
|
|
2107
2110
|
from .vibration import report_text as _vib_text
|
|
2108
2111
|
if not a.well or not a.record:
|
|
2109
|
-
raise SystemExit("vibration-report needs --well
|
|
2112
|
+
raise SystemExit("vibration-report needs --well WELL_ID and --record pump.csv")
|
|
2110
2113
|
brg = None
|
|
2111
2114
|
if a.bearing:
|
|
2112
2115
|
parts = [float(x) for x in a.bearing.split(",")]
|
|
@@ -2122,12 +2125,12 @@ def main(argv=None) -> int:
|
|
|
2122
2125
|
elif a.action == "well-identity":
|
|
2123
2126
|
from .ppdm import report_text as _ppdm_text
|
|
2124
2127
|
if not a.well:
|
|
2125
|
-
raise SystemExit("well-identity needs --well
|
|
2128
|
+
raise SystemExit("well-identity needs --well WELL_ID")
|
|
2126
2129
|
r = ws.well_identity(a.well)
|
|
2127
2130
|
print(_ppdm_text(r)); return 0
|
|
2128
2131
|
elif a.action == "add-layer":
|
|
2129
2132
|
if not a.layer or not a.name:
|
|
2130
|
-
raise SystemExit("add-layer needs --name
|
|
2133
|
+
raise SystemExit("add-layer needs --name \"EIA Wolfcamp top\" and --layer C:\\site\\_incoming\\layer.zip (a shapefile zip, a folder, or a .shp)")
|
|
2131
2134
|
L = ws.add_layer(a.layer, a.name, actor=a.actor, citation=a.citation, member=a.member, formation=a.formation_name, role=a.role, feature_kind=a.feature_kind)
|
|
2132
2135
|
tc = ", ".join(f"{k} {v}" for k, v in list(L["type_counts"].items())[:6])
|
|
2133
2136
|
print(f"layer {L['id']} ({L['kind']}): {L['n_features']} {L['shape_type']} features, {L['crs']['kind']} {L['crs'].get('datum') or ''}, extent lon {L['bbox'][0]:.3f}..{L['bbox'][2]:.3f} lat {L['bbox'][1]:.3f}..{L['bbox'][3]:.3f}"
|
|
@@ -2141,15 +2144,15 @@ def main(argv=None) -> int:
|
|
|
2141
2144
|
for L in ws.layers():
|
|
2142
2145
|
print(f"{L['id']:28s} {L.get('kind', 'structure'):10s} {L['n_features']:7d} {L['shape_type']:9s} {L['crs']['kind']} {L['crs'].get('datum') or '':6s} {L['display']}")
|
|
2143
2146
|
if not ws.layers():
|
|
2144
|
-
print("no structure layer - add one with --action add-layer --name
|
|
2147
|
+
print("no structure layer - add one with --action add-layer --name \"EIA Wolfcamp top\" --layer C:\\site\\_incoming\\layer.zip")
|
|
2145
2148
|
return 0
|
|
2146
2149
|
elif a.action == "remove-layer":
|
|
2147
2150
|
if not a.layer:
|
|
2148
|
-
raise SystemExit("remove-layer needs --layer
|
|
2151
|
+
raise SystemExit("remove-layer needs --layer LAYER_ID (gea workspace --action layers lists them)")
|
|
2149
2152
|
ws.remove_layer(a.layer, actor=a.actor); print(f"removed layer {a.layer} (folder kept, renamed)"); return 0
|
|
2150
2153
|
elif a.action == "structure":
|
|
2151
2154
|
if not a.well:
|
|
2152
|
-
raise SystemExit("structure needs --well
|
|
2155
|
+
raise SystemExit("structure needs --well WELL_ID")
|
|
2153
2156
|
r = ws.well_structure(a.well, a.radius_km if a.radius_km is not None else 50.0, actor=a.actor)
|
|
2154
2157
|
print(f"structure {a.well}: {r['status']}" + (f" - {r['note']}" if r.get("note") else ""))
|
|
2155
2158
|
for L in r["layers"]:
|
|
@@ -2164,7 +2167,7 @@ def main(argv=None) -> int:
|
|
|
2164
2167
|
f"SHmax azimuth {st.get('shmax_azimuth_deg', 'from the stress map')} ({st.get('azimuth_source', '')}); dips {st['dips_deg']}; mu {st['mus']}; delta Pp {st['delta_pp_psi']} psi"); return 0
|
|
2165
2168
|
elif a.action == "add-stress-map":
|
|
2166
2169
|
if not a.file:
|
|
2167
|
-
raise SystemExit("add-stress-map needs --file
|
|
2170
|
+
raise SystemExit("add-stress-map needs --file C:\\site\\_incoming\\wsm2016.csv")
|
|
2168
2171
|
r = ws.add_stress_map(a.file, actor=a.actor, citation=a.citation)
|
|
2169
2172
|
print(f"stress map: {r['n_records']} records kept as {r['file']} (sha256 {r['sha256'][:16]})"); return 0
|
|
2170
2173
|
elif a.action == "wsm":
|
|
@@ -2177,7 +2180,7 @@ def main(argv=None) -> int:
|
|
|
2177
2180
|
return 0 if r.get("n") else 1
|
|
2178
2181
|
elif a.action == "slip":
|
|
2179
2182
|
if not a.well:
|
|
2180
|
-
raise SystemExit("slip needs --well
|
|
2183
|
+
raise SystemExit("slip needs --well WELL_ID")
|
|
2181
2184
|
r = ws.well_slip(a.well, a.radius_km if a.radius_km is not None else 25.0, delta_pp_psi=a.delta_pp, depth_ft=a.depth_ft, actor=a.actor)
|
|
2182
2185
|
print(f"slip {a.well}: {r['status']}")
|
|
2183
2186
|
for line in r["lines"]:
|
|
@@ -2185,7 +2188,7 @@ def main(argv=None) -> int:
|
|
|
2185
2188
|
return 0 if r["status"] == "OK" else 1
|
|
2186
2189
|
elif a.action == "interval":
|
|
2187
2190
|
if not a.well:
|
|
2188
|
-
raise SystemExit("interval needs --well
|
|
2191
|
+
raise SystemExit("interval needs --well WELL_ID")
|
|
2189
2192
|
r = ws.well_interval(a.well, a.radius_km if a.radius_km is not None else 50.0, actor=a.actor)
|
|
2190
2193
|
print(f"interval {a.well}: {r['status']}")
|
|
2191
2194
|
for line in r["lines"]:
|
|
@@ -2197,20 +2200,20 @@ def main(argv=None) -> int:
|
|
|
2197
2200
|
print(_me_text(r)); return 0 if not r["errors"] else 1
|
|
2198
2201
|
elif a.action == "add-live-station":
|
|
2199
2202
|
if not a.seedlink_config or not a.name:
|
|
2200
|
-
raise SystemExit("add-live-station needs --name
|
|
2203
|
+
raise SystemExit("add-live-station needs --name \"TX PB01 live\" and --seedlink-config seedlink.json")
|
|
2201
2204
|
st = ws.add_live_station(a.name, a.seedlink_config, a.lat, a.lon, actor=a.actor, band=a.band, stationxml=a.stationxml, sources_csv=a.sources)
|
|
2202
2205
|
print(f"live station {st['id']}: {st['live']['host']}:{st['live']['port']} {st['live']['stations']} - run `gea workspace --path ... --action live-run --station {st['id']}` or Start it on the page")
|
|
2203
2206
|
return 0
|
|
2204
2207
|
elif a.action == "live-fold":
|
|
2205
2208
|
if not a.station:
|
|
2206
|
-
raise SystemExit("live-fold needs --station
|
|
2209
|
+
raise SystemExit("live-fold needs --station STATION_ID")
|
|
2207
2210
|
r = ws.fold_live_station(a.station, actor=a.actor, include_open=a.include_open)
|
|
2208
2211
|
print(f"folded {len(r['folded'])} file(s) into {a.station}: {r['folded']}; still open: {r['kept_open']}")
|
|
2209
2212
|
return 0
|
|
2210
2213
|
elif a.action == "live-run":
|
|
2211
2214
|
from . import seedlink as _L
|
|
2212
2215
|
if not a.station:
|
|
2213
|
-
raise SystemExit("live-run needs --station
|
|
2216
|
+
raise SystemExit("live-run needs --station STATION_ID")
|
|
2214
2217
|
cfg = ws.live_station_config(a.station)
|
|
2215
2218
|
d = ws.live_dir(a.station)
|
|
2216
2219
|
tap = _L.SeedLinkTap(cfg, d, os.path.join(d, "seedlink_state.json"))
|
|
@@ -2223,7 +2226,7 @@ def main(argv=None) -> int:
|
|
|
2223
2226
|
elif a.action == "quakeml-export":
|
|
2224
2227
|
from .quakeml import report_text as _qml_text
|
|
2225
2228
|
if not a.site:
|
|
2226
|
-
raise SystemExit("quakeml-export needs --site
|
|
2229
|
+
raise SystemExit("quakeml-export needs --site SITE_ID")
|
|
2227
2230
|
r = ws.quakeml_export(a.site, agency=a.agency, out=a.out, actor=a.actor)
|
|
2228
2231
|
print(_qml_text(r)); return 0 if r["status"] == "WRITTEN" else 1
|
|
2229
2232
|
elif a.action == "seismic-dataset":
|
|
@@ -2253,7 +2256,7 @@ def main(argv=None) -> int:
|
|
|
2253
2256
|
return 0 if not r["errors"] else 1
|
|
2254
2257
|
elif a.action == "remove-seismic":
|
|
2255
2258
|
if not a.station:
|
|
2256
|
-
raise SystemExit("remove-seismic needs --station
|
|
2259
|
+
raise SystemExit("remove-seismic needs --station STATION_ID")
|
|
2257
2260
|
ws.remove_seismic_station(a.station, actor=a.actor); print("removed (folder kept):", a.station); return 0
|
|
2258
2261
|
else:
|
|
2259
2262
|
print(_json.dumps(ws.summary(), indent=1)); return 0
|
|
@@ -2285,14 +2288,14 @@ def main(argv=None) -> int:
|
|
|
2285
2288
|
r = _B.verify(a.verify); print(_B.report_text(r, "verify")); return 0 if r["status"] == "OK" else 1
|
|
2286
2289
|
if a.restore:
|
|
2287
2290
|
if not a.to:
|
|
2288
|
-
raise SystemExit("backup --restore needs --to
|
|
2291
|
+
raise SystemExit("backup --restore needs --to C:\\site-restored (an empty folder)")
|
|
2289
2292
|
print(_B.report_text(_B.restore(a.restore, a.to, a.actor), "restore")); return 0
|
|
2290
2293
|
if not a.workspace:
|
|
2291
|
-
raise SystemExit("backup needs --workspace
|
|
2294
|
+
raise SystemExit("backup needs --workspace C:\\site (with --out D:\\gea-backups, another disk), or --verify / --restore an archive")
|
|
2292
2295
|
if a.status:
|
|
2293
2296
|
r = _B.status(a.workspace); print(_B.report_text(r, "status")); return 0 if not (r["never"] or r["stale"]) else 1
|
|
2294
2297
|
if not a.out:
|
|
2295
|
-
raise SystemExit("backup needs --out
|
|
2298
|
+
raise SystemExit("backup needs --out D:\\gea-backups (a folder on another disk or a share)")
|
|
2296
2299
|
print(_B.report_text(_B.make(a.workspace, a.out, a.actor, keep=a.keep, label=a.label), "make")); return 0
|
|
2297
2300
|
except (ValueError, OSError) as e:
|
|
2298
2301
|
raise SystemExit(f"backup: {e}")
|
|
@@ -2370,7 +2373,7 @@ def main(argv=None) -> int:
|
|
|
2370
2373
|
stations = []
|
|
2371
2374
|
for spec in (a.station or []):
|
|
2372
2375
|
if ":" not in spec:
|
|
2373
|
-
raise SystemExit(f"--station takes
|
|
2376
|
+
raise SystemExit(f"--station takes DEPTH_FT:TOOL (9850:quartz_pt_geoq177_16k), got {spec!r}")
|
|
2374
2377
|
md, _, nm = spec.partition(":")
|
|
2375
2378
|
try:
|
|
2376
2379
|
stations.append((float(md), nm.strip()))
|
|
@@ -2419,9 +2422,9 @@ def main(argv=None) -> int:
|
|
|
2419
2422
|
print(f" {e['time'][:19]} M {e['magnitude']:>4.1f} {e['mag_type']:<6s} {e['lat']:9.4f} {e['lon']:10.4f} {str(e['depth_km']):>7s} km " + (f"{e['distance_km']:7.2f} km " if e.get("distance_km") is not None else "") + f"{e['place']}")
|
|
2420
2423
|
return 0
|
|
2421
2424
|
if a.lat is None or a.lon is None or not a.start or not a.end:
|
|
2422
|
-
raise SystemExit("comcat needs --lat --lon --start --end (--radius-km, --min-mag), or --file
|
|
2425
|
+
raise SystemExit("comcat needs --lat --lon --start --end (--radius-km, --min-mag), or --file comcat.txt")
|
|
2423
2426
|
print(_SR.comcat_url(a.lat, a.lon, a.radius_km, a.start, a.end, a.min_mag))
|
|
2424
|
-
print(" open it in a browser (this machine may not reach the service) and save the text it returns; `gea comcat --file
|
|
2427
|
+
print(" open it in a browser (this machine may not reach the service) and save the text it returns; `gea comcat --file comcat.txt` reads it, and sra-report --catalog takes it.")
|
|
2425
2428
|
return 0
|
|
2426
2429
|
elif a.cmd == "slip":
|
|
2427
2430
|
import json as _json
|
|
@@ -2439,7 +2442,7 @@ def main(argv=None) -> int:
|
|
|
2439
2442
|
raise SystemExit("slip: no World Stress Map record of quality A/B/C within 100 km; declare --shmax-azimuth with its source")
|
|
2440
2443
|
az, az_src = nb["azimuth_mean"], nb["statement"]
|
|
2441
2444
|
if az is None:
|
|
2442
|
-
raise SystemExit("slip: give --shmax-azimuth or --wsm
|
|
2445
|
+
raise SystemExit("slip: give --shmax-azimuth or --wsm wsm2016.csv")
|
|
2443
2446
|
faults = _SL.faults_in_radius(L, a.lat, a.lon, a.radius_km)
|
|
2444
2447
|
r = _SL.statement(faults, a.depth_ft, {"sv_psi_ft": a.sv, "shmin_psi_ft": a.shmin, "shmax_psi_ft": a.shmax, "pp_psi_ft": a.pp}, az, tuple(a.dips), tuple(a.mu), a.delta_pp,
|
|
2445
2448
|
sources={"shmax_azimuth": az_src, "gradients": "the command line"})
|
|
@@ -2453,6 +2456,22 @@ def main(argv=None) -> int:
|
|
|
2453
2456
|
elif a.cmd == "catalog":
|
|
2454
2457
|
import json as _json
|
|
2455
2458
|
from . import catalog_register as _CR
|
|
2459
|
+
if a.positions or a.map or a.check_positions:
|
|
2460
|
+
from . import catalog_map as _CM
|
|
2461
|
+
if a.check_positions:
|
|
2462
|
+
chk = _CM.check_sidecars()
|
|
2463
|
+
print(_json.dumps(chk, indent=1) if a.json else ("catalog positions: the sidecars match a fresh read of every file" if chk["ok"] else "catalog positions: DRIFT - " + _json.dumps(chk["bad"])))
|
|
2464
|
+
return 0 if chk["ok"] else 1
|
|
2465
|
+
rows = _CM.sidecar_positions()
|
|
2466
|
+
if a.map:
|
|
2467
|
+
reg = {r["entry"]: r["status"] for r in _CR.register()}
|
|
2468
|
+
with open(a.map, "w", encoding="utf-8") as f:
|
|
2469
|
+
f.write(_CM.svg(rows, register=reg))
|
|
2470
|
+
c = _CM.counts(rows)
|
|
2471
|
+
print(f"catalog map: {c['positioned']} of {c['entries']} entries on {c['distinct_positions']} marks, {c['no_position']} NO POSITION listed below the key -> {a.map}")
|
|
2472
|
+
if a.positions:
|
|
2473
|
+
print(_json.dumps({"positions": rows, "counts": _CM.counts(rows)}, indent=1, default=str) if a.json else _CM.text(rows))
|
|
2474
|
+
return 0
|
|
2456
2475
|
if a.friction:
|
|
2457
2476
|
from . import friction_priors as _FP
|
|
2458
2477
|
print(_json.dumps({"measured": _FP.measured(), "envelope": _FP.envelope()}, indent=1, default=str) if a.json else _FP.text()); return 0
|