gea-program 0.4.0__tar.gz → 0.6.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.
Files changed (219) hide show
  1. {gea_program-0.4.0 → gea_program-0.6.0}/PKG-INFO +141 -12
  2. {gea_program-0.4.0 → gea_program-0.6.0}/README.md +140 -11
  3. gea_program-0.6.0/gea/BENCH_TEST_PROTOCOL.md +91 -0
  4. {gea_program-0.4.0 → gea_program-0.6.0}/gea/__init__.py +25 -34
  5. {gea_program-0.4.0 → gea_program-0.6.0}/gea/__main__.py +338 -57
  6. {gea_program-0.4.0 → gea_program-0.6.0}/gea/acceptance_tests.py +676 -88
  7. gea_program-0.6.0/gea/bench.py +123 -0
  8. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +1 -1
  9. {gea_program-0.4.0 → gea_program-0.6.0}/gea/client_reports.py +111 -10
  10. {gea_program-0.4.0 → gea_program-0.6.0}/gea/downhole_engine.py +70 -163
  11. {gea_program-0.4.0 → gea_program-0.6.0}/gea/drift_monitor.py +1 -1
  12. {gea_program-0.4.0 → gea_program-0.6.0}/gea/fat_sat.py +1 -0
  13. {gea_program-0.4.0 → gea_program-0.6.0}/gea/files.py +15 -2
  14. gea_program-0.6.0/gea/gauge_aging.py +61 -0
  15. {gea_program-0.4.0 → gea_program-0.6.0}/gea/gauge_specs.py +31 -41
  16. gea_program-0.6.0/gea/help/drift.md +13 -0
  17. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/files.md +1 -1
  18. gea_program-0.6.0/gea/help/seismic.md +13 -0
  19. {gea_program-0.4.0 → gea_program-0.6.0}/gea/helplib.py +3 -2
  20. {gea_program-0.4.0 → gea_program-0.6.0}/gea/matplotlib_demo.py +6 -5
  21. {gea_program-0.4.0 → gea_program-0.6.0}/gea/model_card.py +14 -16
  22. {gea_program-0.4.0 → gea_program-0.6.0}/gea/operator_app.py +22 -50
  23. {gea_program-0.4.0 → gea_program-0.6.0}/gea/qt6_downhole_app.py +12 -32
  24. {gea_program-0.4.0 → gea_program-0.6.0}/gea/reconciler.py +31 -32
  25. gea_program-0.6.0/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +122 -0
  26. gea_program-0.6.0/gea/reference/IU_ANMO_10_BHZ_response.xml +188 -0
  27. gea_program-0.6.0/gea/reference/libmseed_steim.provenance.json +20 -0
  28. gea_program-0.6.0/gea/reference/libmseed_steim1_4096.mseed +0 -0
  29. gea_program-0.6.0/gea/reference/libmseed_steim2_4096.mseed +0 -0
  30. gea_program-0.6.0/gea/reference/libmseed_steim2_512.mseed +0 -0
  31. gea_program-0.6.0/gea/seismic.py +887 -0
  32. gea_program-0.6.0/gea/seismic_array.py +592 -0
  33. gea_program-0.6.0/gea/seismic_detect.py +298 -0
  34. gea_program-0.6.0/gea/seismic_response.py +358 -0
  35. {gea_program-0.4.0 → gea_program-0.6.0}/gea/service.py +75 -2
  36. gea_program-0.6.0/gea/service_life.py +116 -0
  37. {gea_program-0.4.0 → gea_program-0.6.0}/gea/tool_library.py +45 -79
  38. {gea_program-0.4.0 → gea_program-0.6.0}/gea/web/app.html +54 -1
  39. {gea_program-0.4.0 → gea_program-0.6.0}/gea/workspace.py +189 -1
  40. {gea_program-0.4.0 → gea_program-0.6.0}/gea_program.egg-info/PKG-INFO +141 -12
  41. {gea_program-0.4.0 → gea_program-0.6.0}/gea_program.egg-info/SOURCES.txt +12 -2
  42. {gea_program-0.4.0 → gea_program-0.6.0}/pyproject.toml +2 -2
  43. gea_program-0.4.0/gea/BENCH_TEST_PROTOCOL.md +0 -96
  44. gea_program-0.4.0/gea/bench.py +0 -144
  45. gea_program-0.4.0/gea/case_study.py +0 -228
  46. gea_program-0.4.0/gea/help/drift.md +0 -13
  47. gea_program-0.4.0/gea/quartz_hpht_extension.py +0 -152
  48. gea_program-0.4.0/gea/service_life.py +0 -173
  49. {gea_program-0.4.0 → gea_program-0.6.0}/LICENSE +0 -0
  50. {gea_program-0.4.0 → gea_program-0.6.0}/gea/accuracy_statement.py +0 -0
  51. {gea_program-0.4.0 → gea_program-0.6.0}/gea/alarm_engine.py +0 -0
  52. {gea_program-0.4.0 → gea_program-0.6.0}/gea/blind_harness.py +0 -0
  53. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  54. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  55. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  56. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  57. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  58. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  59. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  60. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  61. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  62. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  63. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  64. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  65. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  66. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  67. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  68. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  69. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  70. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  71. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  72. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  73. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  74. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  75. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  76. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  77. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  78. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  79. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  80. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  81. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  82. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  83. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  84. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  85. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  86. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  87. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  88. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  89. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  90. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  91. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  92. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  93. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  94. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  95. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  96. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  97. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  98. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  99. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  100. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  101. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  102. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  103. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  104. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  105. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  106. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  107. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  108. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  109. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  110. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  111. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  112. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  113. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  114. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  115. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  116. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  117. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  118. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  119. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/med_160_sapropels.txt +0 -0
  120. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  121. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  122. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  123. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  124. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  125. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  126. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  127. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  128. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  129. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  130. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  131. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  132. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  133. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  134. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  135. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  136. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  137. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  138. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  139. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  140. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  141. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  142. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  143. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  144. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  145. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  146. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  147. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  148. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  149. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  150. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  151. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  152. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  153. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  154. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  155. {gea_program-0.4.0 → gea_program-0.6.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  156. {gea_program-0.4.0 → gea_program-0.6.0}/gea/certificates.py +0 -0
  157. {gea_program-0.4.0 → gea_program-0.6.0}/gea/cli.py +0 -0
  158. {gea_program-0.4.0 → gea_program-0.6.0}/gea/config_versioning.py +0 -0
  159. {gea_program-0.4.0 → gea_program-0.6.0}/gea/correlation.py +0 -0
  160. {gea_program-0.4.0 → gea_program-0.6.0}/gea/dashboard.py +0 -0
  161. {gea_program-0.4.0 → gea_program-0.6.0}/gea/deviation.py +0 -0
  162. {gea_program-0.4.0 → gea_program-0.6.0}/gea/doctor.py +0 -0
  163. {gea_program-0.4.0 → gea_program-0.6.0}/gea/earth_model.py +0 -0
  164. {gea_program-0.4.0 → gea_program-0.6.0}/gea/example_register_map.json +0 -0
  165. {gea_program-0.4.0 → gea_program-0.6.0}/gea/follower.py +0 -0
  166. {gea_program-0.4.0 → gea_program-0.6.0}/gea/forward_model.py +0 -0
  167. {gea_program-0.4.0 → gea_program-0.6.0}/gea/gamma.py +0 -0
  168. {gea_program-0.4.0 → gea_program-0.6.0}/gea/gravity_reference.py +0 -0
  169. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/TESTER_GUIDE.md +0 -0
  170. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/alarms.md +0 -0
  171. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/data-in.md +0 -0
  172. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/doctor.md +0 -0
  173. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/instruments.md +0 -0
  174. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/notifications.md +0 -0
  175. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/patches.md +0 -0
  176. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/quality.md +0 -0
  177. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/site.md +0 -0
  178. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/start.md +0 -0
  179. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/transients.md +0 -0
  180. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/upkeep.md +0 -0
  181. {gea_program-0.4.0 → gea_program-0.6.0}/gea/help/well-tests.md +0 -0
  182. {gea_program-0.4.0 → gea_program-0.6.0}/gea/housekeeping.py +0 -0
  183. {gea_program-0.4.0 → gea_program-0.6.0}/gea/inverse_engine.py +0 -0
  184. {gea_program-0.4.0 → gea_program-0.6.0}/gea/jobs.py +0 -0
  185. {gea_program-0.4.0 → gea_program-0.6.0}/gea/live_ports.py +0 -0
  186. {gea_program-0.4.0 → gea_program-0.6.0}/gea/loadtest.py +0 -0
  187. {gea_program-0.4.0 → gea_program-0.6.0}/gea/modbus.py +0 -0
  188. {gea_program-0.4.0 → gea_program-0.6.0}/gea/mqtt_port.py +0 -0
  189. {gea_program-0.4.0 → gea_program-0.6.0}/gea/notify.py +0 -0
  190. {gea_program-0.4.0 → gea_program-0.6.0}/gea/opcua_port.py +0 -0
  191. {gea_program-0.4.0 → gea_program-0.6.0}/gea/patches.py +0 -0
  192. {gea_program-0.4.0 → gea_program-0.6.0}/gea/ports.py +0 -0
  193. {gea_program-0.4.0 → gea_program-0.6.0}/gea/profile_catalog.py +0 -0
  194. {gea_program-0.4.0 → gea_program-0.6.0}/gea/project.py +0 -0
  195. {gea_program-0.4.0 → gea_program-0.6.0}/gea/rock_inventory.py +0 -0
  196. {gea_program-0.4.0 → gea_program-0.6.0}/gea/sample_record.py +0 -0
  197. {gea_program-0.4.0 → gea_program-0.6.0}/gea/sample_well_profile.csv +0 -0
  198. {gea_program-0.4.0 → gea_program-0.6.0}/gea/sbom.py +0 -0
  199. {gea_program-0.4.0 → gea_program-0.6.0}/gea/segy.py +0 -0
  200. {gea_program-0.4.0 → gea_program-0.6.0}/gea/sensor_swap.py +0 -0
  201. {gea_program-0.4.0 → gea_program-0.6.0}/gea/shell.py +0 -0
  202. {gea_program-0.4.0 → gea_program-0.6.0}/gea/shut_in.py +0 -0
  203. {gea_program-0.4.0 → gea_program-0.6.0}/gea/sla_report.py +0 -0
  204. {gea_program-0.4.0 → gea_program-0.6.0}/gea/store_forward.py +0 -0
  205. {gea_program-0.4.0 → gea_program-0.6.0}/gea/strata_join.py +0 -0
  206. {gea_program-0.4.0 → gea_program-0.6.0}/gea/survey_cmd.py +0 -0
  207. {gea_program-0.4.0 → gea_program-0.6.0}/gea/survey_view.py +0 -0
  208. {gea_program-0.4.0 → gea_program-0.6.0}/gea/telemetry.py +0 -0
  209. {gea_program-0.4.0 → gea_program-0.6.0}/gea/transient.py +0 -0
  210. {gea_program-0.4.0 → gea_program-0.6.0}/gea/well_assembler.py +0 -0
  211. {gea_program-0.4.0 → gea_program-0.6.0}/gea/well_test_validation.py +0 -0
  212. {gea_program-0.4.0 → gea_program-0.6.0}/gea/wits0.py +0 -0
  213. {gea_program-0.4.0 → gea_program-0.6.0}/gea/witsml.py +0 -0
  214. {gea_program-0.4.0 → gea_program-0.6.0}/gea_program.egg-info/dependency_links.txt +0 -0
  215. {gea_program-0.4.0 → gea_program-0.6.0}/gea_program.egg-info/entry_points.txt +0 -0
  216. {gea_program-0.4.0 → gea_program-0.6.0}/gea_program.egg-info/requires.txt +0 -0
  217. {gea_program-0.4.0 → gea_program-0.6.0}/gea_program.egg-info/top_level.txt +0 -0
  218. {gea_program-0.4.0 → gea_program-0.6.0}/setup.cfg +0 -0
  219. {gea_program-0.4.0 → gea_program-0.6.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.4.0
3
+ Version: 0.6.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
@@ -92,6 +92,25 @@ reaches a client document. Nothing unmeasured is ever reported as met.
92
92
  - **Survey track** (`earth_model.py`, `strata_join.py`, `inverse_engine.py`,
93
93
  `blind_harness.py`, `rock_inventory.py`, `forward_model.py`, ...): strata
94
94
  property estimation over a public co-located library, blind-scored on every run.
95
+ - **The second leg - seismic** (`seismic.py`, `seismic_detect.py`): raw seismic
96
+ records in (miniSEED with Steim1/Steim2, SAC, or fetched from any FDSN
97
+ archive - TexNet, EarthScope), Welch spectra, spectrograms and the persistent
98
+ lines above the local floor out, and the detectability test: one station's
99
+ record against a list of known rigs with positions and working windows,
100
+ verdict per rig, the detection radius bracketed between the farthest rig
101
+ heard and the nearest not heard. The instrument response (`seismic_response.py`):
102
+ the station's StationXML read into its stages, evaluated as evalresp does,
103
+ removed with a water level - counts to m/s, m or m/s^2. The decoder is proven
104
+ against libmseed on a corpus of real-station files; the response against
105
+ evalresp on a real IRIS channel. The array step (`seismic_array.py`):
106
+ beamforming over a slowness grid with the array response function's width
107
+ beside every bearing, the crossing of bearings from several arrays with its
108
+ ellipse, location from lags with the velocity named as an input, and the
109
+ array's detectability test - did it point at each known rig. On a site the
110
+ leg lives on the dashboard: a Seismic page where a station or an array is
111
+ added by upload with its rigs list and station file, refreshed as a job,
112
+ and read - spectrum, lines, verdicts, bearing - with its Seismic Station
113
+ Report under Reports. See *The second leg*.
95
114
 
96
115
  ## Quick start
97
116
 
@@ -103,8 +122,8 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
103
122
  gea client-report --report accuracy --out client_report
104
123
  gea model-cards --out model_cards
105
124
  gea sbom --out sbom
106
- gea accept # the product gate (237 checks)
107
- gea help drift # the help library, by the job (14 pages; the same text is on every dashboard page)
125
+ gea accept # the product gate (258 checks)
126
+ gea help drift # the help library, by the job (15 pages; the same text is on every dashboard page)
108
127
  gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
109
128
  gea gui # the desktop window (pip install "gea-program[desktop]")
110
129
  gea workspace --path C:\site --action init --name "Pad 3" # a site folder
@@ -112,6 +131,7 @@ gea serve --workspace C:\site # the dashboard as
112
131
  gea doctor --workspace C:\site # which code runs, can it serve, with every fix
113
132
  gea files --workspace C:\site --action list --root historian # the import roots, detection by content, import, export, packs
114
133
  gea transient --file historian.csv --params params.json --out pta # shut-ins and build-up analysis with a band
134
+ gea seismic --action detect --file tx.mseed --station-lat 31.9 --station-lon -102.1 --sources rigs.csv # the second leg: is a known rig in this record?
115
135
  gea swaps / gea certificates / gea notify / gea housekeeping / gea loadtest # instruments, notification rules, site upkeep
116
136
  ```
117
137
 
@@ -231,10 +251,10 @@ text: JSON, JSON lines, CSV, Markdown, HTML.
231
251
 
232
252
  ### The help library
233
253
 
234
- `gea help` lists fourteen pages indexed by the job a reader arrives with -
254
+ `gea help` lists fifteen pages indexed by the job a reader arrives with -
235
255
  start, bring data in, quality rules, drift, well tests, alarms and the month,
236
- the site, instruments, shut-ins and build-ups, patches, files, notifications,
237
- which code is running, upkeep. Each page carries four lines and stops: the
256
+ the site, instruments, shut-ins and build-ups, seismic (the second leg),
257
+ patches, files, notifications, which code is running, upkeep. Each page carries four lines and stops: the
238
258
  command, what it writes, the one number to check, and what the page will not
239
259
  call a measurement. The pages ship inside the package (`gea/help/`), and the
240
260
  same text is what `/api/help` serves and what the dashboard shows under every
@@ -286,6 +306,94 @@ chose it; an analyst can move the region (`gea transient --mtr 2:40`) and the
286
306
  result follows. It is the first look every shut-in should get automatically,
287
307
  not a replacement for a full interpretation, and it says so.
288
308
 
309
+ ### The second leg
310
+
311
+ The second leg of the program is seismic: the client's site records ground
312
+ motion that conventional processing treats as noise, and in that noise are
313
+ the machinery lines of every rig working within range - mud pumps and their
314
+ harmonics, rotary tables, engines. The leg starts with ingest and one measured
315
+ number, not with a map. `gea seismic` reads the two formats the archives and
316
+ most field recorders write (miniSEED with Steim1/Steim2 and integer/float
317
+ encodings, decided by content; SAC), fetches records from any FDSN web service
318
+ (`--base texnet` for the Texas network TX, `--base iris` for EarthScope), and
319
+ produces the standard spectral products: the Welch PSD, a spectrogram, and
320
+ the lines that persist above a running-median floor in the band where rig
321
+ machinery sits (1-50 Hz by default). The decoder is proven in the acceptance
322
+ suite against records written by libmseed, the format's reference
323
+ implementation (`gea/reference/`), and `tools/seismic_reader_check.py` runs it
324
+ against libmseed on about ninety real-station files of every encoding and
325
+ byte order (the obspy test corpus, fetched with pip, never redistributed):
326
+ every time-series file sample-exact.
327
+
328
+ Physical units come from the station's own response file. `gea seismic
329
+ --action remove-response --stationxml station.xml` reads the FDSN StationXML
330
+ the archives serve beside the data (`fetch --with-response` fetches it),
331
+ builds the response from its stages - the poles and zeros of the sensor, the
332
+ gain of each stage, the FIR and IIR coefficients of the digitizer with their
333
+ delay corrections - the way evalresp builds it, and removes it in the
334
+ frequency domain with a water level and a pre-filter, giving velocity,
335
+ displacement or acceleration in SI units. The acceptance suite holds the
336
+ evaluation to evalresp's numbers on a real IRIS channel (IU.ANMO.10.BHZ,
337
+ `gea/reference/`) to one part in a hundred thousand. A station file whose
338
+ stages disagree with their own declared sensitivity, a polynomial stage, a
339
+ channel the file does not cover: refused with the reason, never patched, and
340
+ the record stays in counts, labelled.
341
+
342
+ One station detects; an array gives a direction. `gea seismic --action beam`
343
+ takes three or more sensors' records with their positions and returns the
344
+ back-azimuth and slowness the band's energy crossed the array with, by
345
+ frequency-domain beamforming over a slowness grid (the conventional Bartlett
346
+ beam, or Capon), refined around its maximum - and, beside the bearing, the
347
+ array response function's half-power width, which is the resolution the
348
+ geometry allows at that band, and whether the geometry has aliasing lobes
349
+ there, so a lone peak is not mistaken for a source. `--action array-detect`
350
+ is the array's form of the detectability test: for each rig on the
351
+ ground-truth list, in the windows it worked alone, did the array point at it
352
+ within its own tolerance (POINTED, NOT_POINTED, INCOHERENT). `--action
353
+ locate` crosses the bearings of two or more arrays, weighted by their
354
+ uncertainties, and returns the point with its 1-sigma ellipse, the crossing
355
+ angle and the residual of each bearing; a location from station-pair lags is
356
+ there too, with the medium velocity it needs named as the input it is. On
357
+ the labelled synthetic scene (`--action array-selftest`) a 1.2 km,
358
+ nine-sensor array points at rigs from 6 to 45 km within 0.3 degrees against
359
+ a 7-degree tolerance, and three arrays' bearings cross within a kilometre of
360
+ the rig. What none of it claims: a position from one array, a bearing to a
361
+ source nearer than five apertures, a direction finer than the array response
362
+ function, or a velocity that was not measured.
363
+
364
+ On a site the leg is a page. Seismic, beside Wells: a station (one record)
365
+ or an array (one record per sensor and a sensors CSV) is added by upload with
366
+ its position, its rigs list and, when there is one, its StationXML, and lives
367
+ under `seismic/<station>/` in the workspace with its files copied in verbatim
368
+ and hashed. Refresh - a button, or `gea workspace --action refresh-seismic`,
369
+ and like every other action a job with its log - reads the record, removes
370
+ the response when the station file is there, writes the spectrum, the
371
+ persistent lines, the detectability verdicts and, for an array, the beam and
372
+ the array verdicts under `reports/seismic/<station>/`, and the Seismic
373
+ Station Report beside them; the station page draws the spectrum and shows
374
+ the tables with the limits printed under each. The home page counts the
375
+ stations and the listed rigs heard. The sample report is in
376
+ `docs/report_samples/`.
377
+
378
+ The first number is the detectability test (`--action detect`): one station's
379
+ continuous record, the station's position, and a CSV of known rigs - position
380
+ and working window from a public permit register or the operator's own
381
+ schedule. For every rig that worked alone for enough windows the test
382
+ compares the band power in its windows with the quiet baseline (the windows
383
+ when no listed rig was working) and says DETECTED or NOT_DETECTED, with the
384
+ excess in dB and the lines that belong to those windows and not to the quiet
385
+ ones; a rig that never worked alone is AMBIGUOUS, and a record with no quiet
386
+ hour gets NO_QUIET_BASELINE and no verdict at all. The result is the radius
387
+ bracketed between the farthest rig heard and the nearest not heard - the
388
+ station's measured reach for rigs like those on the list. Everything the leg
389
+ can later claim sits inside that radius. What the test will not call a
390
+ measurement is printed with it: a well's position or track (one station
391
+ detects, it does not locate - locating is the array step that comes after
392
+ this number exists), a radius beyond the farthest listed rig, anything about
393
+ a rig not on the list, and any quantity in physical units until a station's
394
+ response has been applied and named. `--action selftest` runs the test on a
395
+ synthetic scene and labels its output SIMULATION_SELF_TEST.
396
+
289
397
  ### Before a site goes live
290
398
 
291
399
  `deploy/README.md` is the checklist: keep the service on the loopback
@@ -309,10 +417,15 @@ workspace folder it never deletes.
309
417
 
310
418
  ```
311
419
  python tools/build_installer.py # dist/gea-program-<version>-win64/ and .zip (needs internet here, none there)
312
- python tools/build_installer.py --extras live,plotting,xls,desktop # add the PyQt6 desktop window (~100 MB)
420
+ python tools/build_installer.py --extras live,plotting,xls # a smaller kit without the PyQt6 desktop window
313
421
  python tools/build_installer.py --platform linux # a venv-based kit for a Linux site server
314
422
  ```
315
423
 
424
+ The kit carries every optional dependency by default - the live ports
425
+ (asyncua, paho-mqtt, pymodbus, pyserial), matplotlib, xlrd and the PyQt6
426
+ desktop window - so `gea sbom` from an installed kit lists all of them as
427
+ installed; and `report-samples/`, one rendered example of every report.
428
+
316
429
  At the site: unzip, `install.cmd`, `start-dashboard.cmd`; the browser opens
317
430
  `http://127.0.0.1:8765/`. `verify.cmd` runs the acceptance gate from the
318
431
  installed kit (the client's own evidence), `register-service.cmd` starts the
@@ -328,6 +441,8 @@ attaches the zips to the GitHub release of that tag.
328
441
  gea/ the package: engines, record layer, reports, monitor, dashboard, cli, shell, acceptance suite,
329
442
  workspace, jobs, service, patches and web/app.html (the served dashboard)
330
443
  gea/catalog/ 52 public archive entries, each with a provenance file
444
+ gea/reference/ miniSEED records written by libmseed and an IRIS StationXML with evalresp's numbers, with provenance: the independent references
445
+ docs/report_samples/ one rendered example of every client report, from this build (tools/render_report_samples.py; SAMPLES.md names each command)
331
446
  docs/ TESTER_GUIDE.md, REQUIREMENTS_MATRIX.md (the scope-of-work mirror that shaped the reports), examples/ (port configs),
332
447
  SESSION_LOG.md (the working record, session by session),
333
448
  commercial/ (pilot proposal, bench readiness, commercial use), HISTORY.md (the ship-by-ship record)
@@ -348,10 +463,22 @@ density anchors and Vp ranges with their citations (Telford, Geldart and
348
463
  Sheriff; Schon). Every catalogue entry under `gea/catalog/` has a provenance
349
464
  file naming its public source.
350
465
 
351
- Two statements the product carries on its own model cards: the gauge aging
352
- envelope's lower bound is an engineering model with no field validation on
353
- record, and five of the fourteen back-tested strata quantities are NOT
354
- ACCEPTABLE at the 95 % target. Both are printed, never claimed otherwise.
466
+ The gauge aging rate the drift evaluation uses is the instrument's published
467
+ drift specification, read from a cited datasheet (`gea/gauge_specs.py`), with
468
+ nothing added for temperature or pressure - above the rating the rate is
469
+ flagged, not changed. The program carries no aging model of its own, no
470
+ engineering constant that is not a datasheet number, and no claim about a
471
+ gauge beyond what its datasheet says; `tools/standalone_check.py` fails the
472
+ build on the names, phrases and numbers of the model that once stood there.
473
+ The seismic leg is textbook signal processing - Welch's PSD estimate, a
474
+ running-median floor, band power, great-circle distance - and the decoder is
475
+ checked against libmseed; the synthetic scene behind its self-test states its
476
+ own assumptions (body-wave spreading, a Q) and is labelled as a scene, not a
477
+ ground. Two statements the product carries on its own model cards: the datasheet
478
+ rate has no field validation on record against a gauge with a known history
479
+ (`gea bench` is the instrument for it), and five of the fourteen back-tested
480
+ strata quantities are NOT ACCEPTABLE at the 95 % target. Both are printed,
481
+ never claimed otherwise.
355
482
 
356
483
  ## Shipping
357
484
 
@@ -361,7 +488,9 @@ not exist anywhere, every version in `SHIP_LOG.md` must have its tag, `python -m
361
488
  accept` must be green, `SHIP_MESSAGE.txt` must start with the tag; then commit, tag,
362
489
  push, and the remote tag must be seen before SHIPPED is printed. `CHANGELOG.md` must carry a
363
490
  section headed by the tag, and `tools/standalone_check.py` must report no findings. `-DryRun` runs every
364
- check and changes nothing; `-NoPush` stops after the local tag.
491
+ check and changes nothing; `-NoPush` stops after the local tag. Before the gate, after the bump:
492
+ `python tools/render_report_samples.py` re-renders `docs/report_samples/` from the new build
493
+ (section AM fails on a stale build number).
365
494
 
366
495
  ## Publishing to PyPI
367
496
 
@@ -53,6 +53,25 @@ reaches a client document. Nothing unmeasured is ever reported as met.
53
53
  - **Survey track** (`earth_model.py`, `strata_join.py`, `inverse_engine.py`,
54
54
  `blind_harness.py`, `rock_inventory.py`, `forward_model.py`, ...): strata
55
55
  property estimation over a public co-located library, blind-scored on every run.
56
+ - **The second leg - seismic** (`seismic.py`, `seismic_detect.py`): raw seismic
57
+ records in (miniSEED with Steim1/Steim2, SAC, or fetched from any FDSN
58
+ archive - TexNet, EarthScope), Welch spectra, spectrograms and the persistent
59
+ lines above the local floor out, and the detectability test: one station's
60
+ record against a list of known rigs with positions and working windows,
61
+ verdict per rig, the detection radius bracketed between the farthest rig
62
+ heard and the nearest not heard. The instrument response (`seismic_response.py`):
63
+ the station's StationXML read into its stages, evaluated as evalresp does,
64
+ removed with a water level - counts to m/s, m or m/s^2. The decoder is proven
65
+ against libmseed on a corpus of real-station files; the response against
66
+ evalresp on a real IRIS channel. The array step (`seismic_array.py`):
67
+ beamforming over a slowness grid with the array response function's width
68
+ beside every bearing, the crossing of bearings from several arrays with its
69
+ ellipse, location from lags with the velocity named as an input, and the
70
+ array's detectability test - did it point at each known rig. On a site the
71
+ leg lives on the dashboard: a Seismic page where a station or an array is
72
+ added by upload with its rigs list and station file, refreshed as a job,
73
+ and read - spectrum, lines, verdicts, bearing - with its Seismic Station
74
+ Report under Reports. See *The second leg*.
56
75
 
57
76
  ## Quick start
58
77
 
@@ -64,8 +83,8 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
64
83
  gea client-report --report accuracy --out client_report
65
84
  gea model-cards --out model_cards
66
85
  gea sbom --out sbom
67
- gea accept # the product gate (237 checks)
68
- gea help drift # the help library, by the job (14 pages; the same text is on every dashboard page)
86
+ gea accept # the product gate (258 checks)
87
+ gea help drift # the help library, by the job (15 pages; the same text is on every dashboard page)
69
88
  gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
70
89
  gea gui # the desktop window (pip install "gea-program[desktop]")
71
90
  gea workspace --path C:\site --action init --name "Pad 3" # a site folder
@@ -73,6 +92,7 @@ gea serve --workspace C:\site # the dashboard as
73
92
  gea doctor --workspace C:\site # which code runs, can it serve, with every fix
74
93
  gea files --workspace C:\site --action list --root historian # the import roots, detection by content, import, export, packs
75
94
  gea transient --file historian.csv --params params.json --out pta # shut-ins and build-up analysis with a band
95
+ gea seismic --action detect --file tx.mseed --station-lat 31.9 --station-lon -102.1 --sources rigs.csv # the second leg: is a known rig in this record?
76
96
  gea swaps / gea certificates / gea notify / gea housekeeping / gea loadtest # instruments, notification rules, site upkeep
77
97
  ```
78
98
 
@@ -192,10 +212,10 @@ text: JSON, JSON lines, CSV, Markdown, HTML.
192
212
 
193
213
  ### The help library
194
214
 
195
- `gea help` lists fourteen pages indexed by the job a reader arrives with -
215
+ `gea help` lists fifteen pages indexed by the job a reader arrives with -
196
216
  start, bring data in, quality rules, drift, well tests, alarms and the month,
197
- the site, instruments, shut-ins and build-ups, patches, files, notifications,
198
- which code is running, upkeep. Each page carries four lines and stops: the
217
+ the site, instruments, shut-ins and build-ups, seismic (the second leg),
218
+ patches, files, notifications, which code is running, upkeep. Each page carries four lines and stops: the
199
219
  command, what it writes, the one number to check, and what the page will not
200
220
  call a measurement. The pages ship inside the package (`gea/help/`), and the
201
221
  same text is what `/api/help` serves and what the dashboard shows under every
@@ -247,6 +267,94 @@ chose it; an analyst can move the region (`gea transient --mtr 2:40`) and the
247
267
  result follows. It is the first look every shut-in should get automatically,
248
268
  not a replacement for a full interpretation, and it says so.
249
269
 
270
+ ### The second leg
271
+
272
+ The second leg of the program is seismic: the client's site records ground
273
+ motion that conventional processing treats as noise, and in that noise are
274
+ the machinery lines of every rig working within range - mud pumps and their
275
+ harmonics, rotary tables, engines. The leg starts with ingest and one measured
276
+ number, not with a map. `gea seismic` reads the two formats the archives and
277
+ most field recorders write (miniSEED with Steim1/Steim2 and integer/float
278
+ encodings, decided by content; SAC), fetches records from any FDSN web service
279
+ (`--base texnet` for the Texas network TX, `--base iris` for EarthScope), and
280
+ produces the standard spectral products: the Welch PSD, a spectrogram, and
281
+ the lines that persist above a running-median floor in the band where rig
282
+ machinery sits (1-50 Hz by default). The decoder is proven in the acceptance
283
+ suite against records written by libmseed, the format's reference
284
+ implementation (`gea/reference/`), and `tools/seismic_reader_check.py` runs it
285
+ against libmseed on about ninety real-station files of every encoding and
286
+ byte order (the obspy test corpus, fetched with pip, never redistributed):
287
+ every time-series file sample-exact.
288
+
289
+ Physical units come from the station's own response file. `gea seismic
290
+ --action remove-response --stationxml station.xml` reads the FDSN StationXML
291
+ the archives serve beside the data (`fetch --with-response` fetches it),
292
+ builds the response from its stages - the poles and zeros of the sensor, the
293
+ gain of each stage, the FIR and IIR coefficients of the digitizer with their
294
+ delay corrections - the way evalresp builds it, and removes it in the
295
+ frequency domain with a water level and a pre-filter, giving velocity,
296
+ displacement or acceleration in SI units. The acceptance suite holds the
297
+ evaluation to evalresp's numbers on a real IRIS channel (IU.ANMO.10.BHZ,
298
+ `gea/reference/`) to one part in a hundred thousand. A station file whose
299
+ stages disagree with their own declared sensitivity, a polynomial stage, a
300
+ channel the file does not cover: refused with the reason, never patched, and
301
+ the record stays in counts, labelled.
302
+
303
+ One station detects; an array gives a direction. `gea seismic --action beam`
304
+ takes three or more sensors' records with their positions and returns the
305
+ back-azimuth and slowness the band's energy crossed the array with, by
306
+ frequency-domain beamforming over a slowness grid (the conventional Bartlett
307
+ beam, or Capon), refined around its maximum - and, beside the bearing, the
308
+ array response function's half-power width, which is the resolution the
309
+ geometry allows at that band, and whether the geometry has aliasing lobes
310
+ there, so a lone peak is not mistaken for a source. `--action array-detect`
311
+ is the array's form of the detectability test: for each rig on the
312
+ ground-truth list, in the windows it worked alone, did the array point at it
313
+ within its own tolerance (POINTED, NOT_POINTED, INCOHERENT). `--action
314
+ locate` crosses the bearings of two or more arrays, weighted by their
315
+ uncertainties, and returns the point with its 1-sigma ellipse, the crossing
316
+ angle and the residual of each bearing; a location from station-pair lags is
317
+ there too, with the medium velocity it needs named as the input it is. On
318
+ the labelled synthetic scene (`--action array-selftest`) a 1.2 km,
319
+ nine-sensor array points at rigs from 6 to 45 km within 0.3 degrees against
320
+ a 7-degree tolerance, and three arrays' bearings cross within a kilometre of
321
+ the rig. What none of it claims: a position from one array, a bearing to a
322
+ source nearer than five apertures, a direction finer than the array response
323
+ function, or a velocity that was not measured.
324
+
325
+ On a site the leg is a page. Seismic, beside Wells: a station (one record)
326
+ or an array (one record per sensor and a sensors CSV) is added by upload with
327
+ its position, its rigs list and, when there is one, its StationXML, and lives
328
+ under `seismic/<station>/` in the workspace with its files copied in verbatim
329
+ and hashed. Refresh - a button, or `gea workspace --action refresh-seismic`,
330
+ and like every other action a job with its log - reads the record, removes
331
+ the response when the station file is there, writes the spectrum, the
332
+ persistent lines, the detectability verdicts and, for an array, the beam and
333
+ the array verdicts under `reports/seismic/<station>/`, and the Seismic
334
+ Station Report beside them; the station page draws the spectrum and shows
335
+ the tables with the limits printed under each. The home page counts the
336
+ stations and the listed rigs heard. The sample report is in
337
+ `docs/report_samples/`.
338
+
339
+ The first number is the detectability test (`--action detect`): one station's
340
+ continuous record, the station's position, and a CSV of known rigs - position
341
+ and working window from a public permit register or the operator's own
342
+ schedule. For every rig that worked alone for enough windows the test
343
+ compares the band power in its windows with the quiet baseline (the windows
344
+ when no listed rig was working) and says DETECTED or NOT_DETECTED, with the
345
+ excess in dB and the lines that belong to those windows and not to the quiet
346
+ ones; a rig that never worked alone is AMBIGUOUS, and a record with no quiet
347
+ hour gets NO_QUIET_BASELINE and no verdict at all. The result is the radius
348
+ bracketed between the farthest rig heard and the nearest not heard - the
349
+ station's measured reach for rigs like those on the list. Everything the leg
350
+ can later claim sits inside that radius. What the test will not call a
351
+ measurement is printed with it: a well's position or track (one station
352
+ detects, it does not locate - locating is the array step that comes after
353
+ this number exists), a radius beyond the farthest listed rig, anything about
354
+ a rig not on the list, and any quantity in physical units until a station's
355
+ response has been applied and named. `--action selftest` runs the test on a
356
+ synthetic scene and labels its output SIMULATION_SELF_TEST.
357
+
250
358
  ### Before a site goes live
251
359
 
252
360
  `deploy/README.md` is the checklist: keep the service on the loopback
@@ -270,10 +378,15 @@ workspace folder it never deletes.
270
378
 
271
379
  ```
272
380
  python tools/build_installer.py # dist/gea-program-<version>-win64/ and .zip (needs internet here, none there)
273
- python tools/build_installer.py --extras live,plotting,xls,desktop # add the PyQt6 desktop window (~100 MB)
381
+ python tools/build_installer.py --extras live,plotting,xls # a smaller kit without the PyQt6 desktop window
274
382
  python tools/build_installer.py --platform linux # a venv-based kit for a Linux site server
275
383
  ```
276
384
 
385
+ The kit carries every optional dependency by default - the live ports
386
+ (asyncua, paho-mqtt, pymodbus, pyserial), matplotlib, xlrd and the PyQt6
387
+ desktop window - so `gea sbom` from an installed kit lists all of them as
388
+ installed; and `report-samples/`, one rendered example of every report.
389
+
277
390
  At the site: unzip, `install.cmd`, `start-dashboard.cmd`; the browser opens
278
391
  `http://127.0.0.1:8765/`. `verify.cmd` runs the acceptance gate from the
279
392
  installed kit (the client's own evidence), `register-service.cmd` starts the
@@ -289,6 +402,8 @@ attaches the zips to the GitHub release of that tag.
289
402
  gea/ the package: engines, record layer, reports, monitor, dashboard, cli, shell, acceptance suite,
290
403
  workspace, jobs, service, patches and web/app.html (the served dashboard)
291
404
  gea/catalog/ 52 public archive entries, each with a provenance file
405
+ gea/reference/ miniSEED records written by libmseed and an IRIS StationXML with evalresp's numbers, with provenance: the independent references
406
+ docs/report_samples/ one rendered example of every client report, from this build (tools/render_report_samples.py; SAMPLES.md names each command)
292
407
  docs/ TESTER_GUIDE.md, REQUIREMENTS_MATRIX.md (the scope-of-work mirror that shaped the reports), examples/ (port configs),
293
408
  SESSION_LOG.md (the working record, session by session),
294
409
  commercial/ (pilot proposal, bench readiness, commercial use), HISTORY.md (the ship-by-ship record)
@@ -309,10 +424,22 @@ density anchors and Vp ranges with their citations (Telford, Geldart and
309
424
  Sheriff; Schon). Every catalogue entry under `gea/catalog/` has a provenance
310
425
  file naming its public source.
311
426
 
312
- Two statements the product carries on its own model cards: the gauge aging
313
- envelope's lower bound is an engineering model with no field validation on
314
- record, and five of the fourteen back-tested strata quantities are NOT
315
- ACCEPTABLE at the 95 % target. Both are printed, never claimed otherwise.
427
+ The gauge aging rate the drift evaluation uses is the instrument's published
428
+ drift specification, read from a cited datasheet (`gea/gauge_specs.py`), with
429
+ nothing added for temperature or pressure - above the rating the rate is
430
+ flagged, not changed. The program carries no aging model of its own, no
431
+ engineering constant that is not a datasheet number, and no claim about a
432
+ gauge beyond what its datasheet says; `tools/standalone_check.py` fails the
433
+ build on the names, phrases and numbers of the model that once stood there.
434
+ The seismic leg is textbook signal processing - Welch's PSD estimate, a
435
+ running-median floor, band power, great-circle distance - and the decoder is
436
+ checked against libmseed; the synthetic scene behind its self-test states its
437
+ own assumptions (body-wave spreading, a Q) and is labelled as a scene, not a
438
+ ground. Two statements the product carries on its own model cards: the datasheet
439
+ rate has no field validation on record against a gauge with a known history
440
+ (`gea bench` is the instrument for it), and five of the fourteen back-tested
441
+ strata quantities are NOT ACCEPTABLE at the 95 % target. Both are printed,
442
+ never claimed otherwise.
316
443
 
317
444
  ## Shipping
318
445
 
@@ -322,7 +449,9 @@ not exist anywhere, every version in `SHIP_LOG.md` must have its tag, `python -m
322
449
  accept` must be green, `SHIP_MESSAGE.txt` must start with the tag; then commit, tag,
323
450
  push, and the remote tag must be seen before SHIPPED is printed. `CHANGELOG.md` must carry a
324
451
  section headed by the tag, and `tools/standalone_check.py` must report no findings. `-DryRun` runs every
325
- check and changes nothing; `-NoPush` stops after the local tag.
452
+ check and changes nothing; `-NoPush` stops after the local tag. Before the gate, after the bump:
453
+ `python tools/render_report_samples.py` re-renders `docs/report_samples/` from the new build
454
+ (section AM fails on a stale build number).
326
455
 
327
456
  ## Publishing to PyPI
328
457
 
@@ -0,0 +1,91 @@
1
+ # Bench-Test Protocol - Does this gauge drift within its datasheet?
2
+
3
+ The program judges a measured drift trend against one number: the
4
+ instrument's published drift specification (percent of full scale per year,
5
+ from its datasheet). That number is a specification, not a measurement of
6
+ the gauge in your hand. This protocol is the measurement: one gauge, one
7
+ held setpoint, one reference standard, enough weeks, and a verdict written
8
+ down - the bench record the drift report cites as `NONE ON RECORD` until it
9
+ exists.
10
+
11
+ ---
12
+
13
+ ## 1. What is being tested
14
+
15
+ For a gauge of serial number S with datasheet drift specification D (%FS/yr):
16
+
17
+ ```
18
+ measured drift rate (|slope| of the gauge's reading against the reference, at a held setpoint)
19
+ compared with D, with the slope's own standard error
20
+ ```
21
+
22
+ The outcome is one of four words (section 5). A gauge that drifts faster
23
+ than its datasheet is a finding, not an error.
24
+
25
+ ## 2. Apparatus
26
+
27
+ - The gauge under test, with its serial number and its calibration
28
+ certificate id (both go on the record; `gea certificates` files the
29
+ certificate).
30
+ - A temperature-controlled bath or pressure vessel holding a setpoint inside
31
+ the gauge's rating (the rating check applies on the bench too).
32
+ - A reference pressure standard of a class better than the specification
33
+ under test (deadweight tester or transfer standard), logged at the same
34
+ cadence, or at least checked weekly and logged.
35
+ - Logging at one reading per day or better into the program's historian CSV
36
+ format (a timestamp or `time_s` column and one pressure column per
37
+ instrument).
38
+
39
+ ## 3. Duration - the program's own rule applies
40
+
41
+ The reconciler refuses trend verdicts below its minimum span
42
+ (`ReconcilerConfig.min_trend_span_years`, the 18-day rule), and the bench
43
+ analysis reads that floor from the same configuration: a shorter record is
44
+ `INSUFFICIENT_SPAN`, no verdict. The protocol asks for **at least 90 days**
45
+ at setpoint; 180 days or more when the specification is tight (a 0.01 %FS/yr
46
+ gauge at 30,000 psi full scale drifts 3 psi in a year - 0.75 psi in 90
47
+ days - so the reference and the logging must resolve tenths of a psi).
48
+
49
+ ## 4. Procedure
50
+
51
+ 1. File the certificate (`gea certificates --action add ...`) and record the
52
+ serial number.
53
+ 2. Install the gauge and the reference at the setpoint; log continuously.
54
+ 3. Weekly: verify the setpoint against the reference; do not adjust the gauge
55
+ under test. Log every intervention.
56
+ 4. Export the gauge's series and the reference's series as historian CSVs.
57
+ 5. Run:
58
+
59
+ gea bench --gauge-csv gauge.csv --reference-csv reference.csv --spec geoq177_30k --serial SN --certificate CERT --out bench_register.jsonl
60
+
61
+ The reference series is subtracted first (the setpoint's own wander is
62
+ not the gauge's drift). `--spec` names the datasheet preset or a JSON
63
+ datasheet of your own.
64
+ 6. Keep the record: the JSON line appended to the register carries the fit,
65
+ the band, the datasheet source, the serial, the certificate and the verdict.
66
+
67
+ ## 5. Analysis and verdict vocabulary
68
+
69
+ - The slope of the (gauge - reference) series is fitted by least squares;
70
+ its standard error comes from the residuals.
71
+ - A band of k sigma (default 2) is placed around the measured rate.
72
+ - `WITHIN_DATASHEET` - the whole band is at or below the specification.
73
+ - `EXCEEDS_DATASHEET` - the whole band is above the specification: this
74
+ gauge, at these conditions, drifts faster than its datasheet says. A
75
+ first-class outcome.
76
+ - `INSUFFICIENT_SPAN` - shorter than the 18-day floor; no verdict.
77
+ - `INSUFFICIENT_SNR` - the band straddles the specification; a longer span
78
+ or a quieter setpoint is needed; no verdict.
79
+
80
+ `gea bench --selftest` runs the arithmetic on synthetic series and labels
81
+ its output `SIMULATION_SELF_TEST`; it proves nothing about a physical gauge.
82
+
83
+ ## 6. What the record changes
84
+
85
+ Nothing in the program's arithmetic changes with a bench result; the
86
+ datasheet rate stays the rate the reports use. What changes is the model
87
+ card's `field validation` line, which can cite the register once a gauge
88
+ with a known history has been run, and the reader's confidence in a
89
+ `DRIFT_CONSISTENT` label on that instrument. An `EXCEEDS_DATASHEET` record
90
+ is the reason to recalibrate, replace or re-rate that gauge, and to file
91
+ the result with its certificate.
@@ -1,17 +1,15 @@
1
1
  # This Source Code Form is subject to the terms of the Mozilla Public
2
2
  # License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  # file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
- """gea — the GEA Downhole HPHT Quartz-Gauge Simulator.
4
+ """gea - GEA-Program: the downhole gauge monitoring program.
5
5
 
6
- The gea-program's first packaged industry-application module: a
7
- deep-well (TD ~20,300 ft) six-gauge quartz P/T string with GEA-stabilized
8
- drift, transient events, live animation (matplotlib / optional PyQt6), and
9
- CSV export.
10
-
11
- The program aging model composes a fixed drift-suppression factor from three
12
- locked engineering constants (K_MEX = 25/12, PHI_RES = 0.84, F_TRZ = 0.1); the
13
- user-facing settings are the two instrument trims (k_structural_trim,
14
- phi_coupling_trim), never the constants. See README.md.
6
+ A described well (gradients or a real profile, a toolstring of cited
7
+ instruments), the data that comes back from it (files or live ports), and
8
+ the report family that judges the two against each other: data quality,
9
+ gauge drift against each instrument's datasheet aging rate, well tests,
10
+ alarms, shut-ins and build-ups, instruments and certificates, the monthly
11
+ service note. Every number on a report names the rule or the datasheet it
12
+ came from; the program adds no physics of its own.
15
13
 
16
14
  Quick use (headless):
17
15
  from gea import DownholeEngine, SimulatorConfig
@@ -19,18 +17,10 @@ Quick use (headless):
19
17
  for _ in range(100): e.step()
20
18
  print(e.summary()); e.export_csv("run.csv")
21
19
 
22
- Demos (need a display):
23
- python -m gea.matplotlib_demo
24
- python -m gea.qt6_downhole_app (pip install PyQt6)
20
+ The dashboard: gea workspace --path C:\\site --action init --name "Pad 3"; gea serve --workspace C:\\site
25
21
  """
26
22
 
27
- from .quartz_hpht_extension import (
28
- calculate_quartz_transducer_hpht_program,
29
- canonical_suppression,
30
- conventional_drift,
31
- drift_comparison,
32
- PROGRAM_MODEL_AVAILABLE,
33
- )
23
+ from .gauge_aging import aging_rate, rate_psi_yr, accuracy_psi
34
24
  from .downhole_engine import (
35
25
  Sensor,
36
26
  SimulatorConfig,
@@ -49,15 +39,11 @@ from .telemetry import (
49
39
  TelemetryConfig,
50
40
  TelemetryRecorder,
51
41
  )
52
- from .case_study import (
53
- CaseStudyConfig,
54
- case_study,
55
- depth_sweep,
56
- write_markdown,
57
- )
58
42
  from .gauge_specs import (
59
43
  GaugeSpec,
60
44
  GAUGE_SPECS,
45
+ DEFAULT_SPEC,
46
+ get_spec,
61
47
  load_gauge_spec_json,
62
48
  )
63
49
  from .deviation import (
@@ -70,7 +56,7 @@ from .tool_library import (
70
56
  TOOL_LIBRARY,
71
57
  ToolString,
72
58
  drift_model_for,
73
- piezoresistive_drift,
59
+ user_gauge_tool,
74
60
  rating_check,
75
61
  )
76
62
  from .ports import (
@@ -109,6 +95,13 @@ from .well_assembler import (
109
95
  from .gamma import (
110
96
  find_gr_channels, shale_volume, formation_flags, gamma_report, gamma_entries,
111
97
  )
98
+ from .seismic import (
99
+ Trace as SeismicTrace, read_mseed, write_mseed, read_sac, write_sac, read_any as read_seismic, fdsn_fetch, fdsn_stations,
100
+ welch_psd, spectrogram, persistent_lines, band_power,
101
+ )
102
+ from .seismic_detect import Source as SeismicSource, detectability_test, load_sources_csv, haversine_km, DRILLING_BAND_HZ
103
+ from .seismic_response import read_stationxml, remove_response, transfer as response_transfer, fdsn_stationxml
104
+ from .seismic_array import Sensor as SeismicSensor, load_sensors_csv, beam as array_beam, array_detectability, intersect_backazimuths, locate_from_lags
112
105
  from .bench import (
113
106
  bench_analysis, bench_selftest,
114
107
  )
@@ -129,19 +122,17 @@ from .profile_catalog import (
129
122
  read_pangaea_txt,
130
123
  )
131
124
 
132
- __version__ = "0.4.0"
125
+ __version__ = "0.6.0"
133
126
  __all__ = [
134
- "calculate_quartz_transducer_hpht_program", "canonical_suppression",
135
- "conventional_drift", "drift_comparison",
136
- "PROGRAM_MODEL_AVAILABLE", "Sensor", "SimulatorConfig", "DownholeEngine",
127
+ "aging_rate", "rate_psi_yr", "accuracy_psi",
128
+ "Sensor", "SimulatorConfig", "DownholeEngine",
137
129
  "WellProfile", "load_well_profile_csv", "make_sensor_string",
138
130
  "ServiceLifeConfig", "ServiceLifeSimulator",
139
131
  "TelemetryConfig", "TelemetryRecorder",
140
- "CaseStudyConfig", "case_study", "depth_sweep", "write_markdown",
141
- "GaugeSpec", "GAUGE_SPECS", "load_gauge_spec_json",
132
+ "GaugeSpec", "GAUGE_SPECS", "DEFAULT_SPEC", "get_spec", "load_gauge_spec_json",
142
133
  "DeviationSurvey", "load_deviation_csv", "run_batch",
143
134
  "ToolSpec", "TOOL_LIBRARY", "ToolString", "drift_model_for",
144
- "piezoresistive_drift", "rating_check",
135
+ "user_gauge_tool", "rating_check",
145
136
  "LiveStream", "StreamChannel", "PortSpec", "PORT_REGISTRY",
146
137
  "ingest", "read_historian_csv", "read_las", "register_port",
147
138
  "Reconciler", "ReconcilerConfig", "auto_station_map",