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.
Files changed (276) hide show
  1. {gea_program-0.28.0/gea_program.egg-info → gea_program-0.29.0}/PKG-INFO +31 -14
  2. {gea_program-0.28.0 → gea_program-0.29.0}/README.md +30 -13
  3. {gea_program-0.28.0 → gea_program-0.29.0}/gea/__init__.py +1 -1
  4. {gea_program-0.28.0 → gea_program-0.29.0}/gea/__main__.py +56 -37
  5. {gea_program-0.28.0 → gea_program-0.29.0}/gea/acceptance_tests.py +225 -3
  6. {gea_program-0.28.0 → gea_program-0.29.0}/gea/backup.py +2 -2
  7. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +10 -1
  8. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +15 -2
  9. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/barbados_110_consolidation.provenance.json +10 -1
  10. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +10 -1
  11. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +10 -1
  12. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +10 -1
  13. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +14 -2
  14. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +10 -1
  15. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +10 -1
  16. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +10 -1
  17. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +10 -1
  18. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +10 -1
  19. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +10 -1
  20. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/fram_909_organic_petrography.provenance.json +10 -1
  21. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +10 -1
  22. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +14 -2
  23. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +10 -1
  24. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +10 -1
  25. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +10 -1
  26. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +10 -1
  27. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +10 -1
  28. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +10 -1
  29. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +26 -2
  30. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +10 -1
  31. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +11 -1
  32. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +18 -1
  33. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +11 -1
  34. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +11 -1
  35. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +11 -1
  36. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +18 -1
  37. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/l06_06_nl_survey.provenance.json +18 -2
  38. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +17 -2
  39. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +10 -1
  40. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/med_160_sapropels.provenance.json +10 -1
  41. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +10 -1
  42. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +10 -1
  43. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +10 -1
  44. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +10 -1
  45. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +10 -1
  46. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +10 -1
  47. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +10 -1
  48. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +10 -1
  49. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +10 -1
  50. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +21 -2
  51. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/sumatra_362_cohesion.provenance.json +10 -1
  52. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +29 -2
  53. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +10 -1
  54. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +20 -2
  55. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +21 -2
  56. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +10 -1
  57. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +10 -1
  58. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +10 -1
  59. gea_program-0.29.0/gea/catalog_map.py +310 -0
  60. {gea_program-0.28.0 → gea_program-0.29.0}/gea/doctor.py +3 -3
  61. {gea_program-0.28.0 → gea_program-0.29.0}/gea/fixtures/README.md +5 -0
  62. gea_program-0.29.0/gea/fixtures/ne_110m_coastline.json +1 -0
  63. {gea_program-0.28.0 → gea_program-0.29.0}/gea/geodesy.py +12 -0
  64. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/backup.md +1 -1
  65. gea_program-0.29.0/gea/help/catalog.md +11 -0
  66. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/conformance.md +1 -1
  67. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/field-ports.md +1 -1
  68. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/historian.md +1 -1
  69. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/instruments.md +1 -1
  70. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/interval.md +1 -1
  71. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/month-end.md +1 -1
  72. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/osdu.md +1 -1
  73. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/ppdm.md +1 -1
  74. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/quakeml.md +1 -1
  75. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/seedlink.md +1 -1
  76. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/seismic.md +1 -1
  77. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/sites.md +1 -1
  78. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/slip.md +1 -1
  79. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/sra.md +1 -1
  80. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/structure.md +1 -1
  81. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/tools.md +1 -1
  82. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/vibration.md +1 -1
  83. {gea_program-0.28.0 → gea_program-0.29.0}/gea/helplib.py +1 -1
  84. {gea_program-0.28.0 → gea_program-0.29.0}/gea/service.py +25 -0
  85. {gea_program-0.28.0 → gea_program-0.29.0}/gea/shapefile.py +3 -0
  86. {gea_program-0.28.0 → gea_program-0.29.0}/gea/web/app.html +50 -3
  87. {gea_program-0.28.0 → gea_program-0.29.0}/gea/workspace.py +10 -1
  88. {gea_program-0.28.0 → gea_program-0.29.0/gea_program.egg-info}/PKG-INFO +31 -14
  89. {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/SOURCES.txt +2 -0
  90. {gea_program-0.28.0 → gea_program-0.29.0}/pyproject.toml +1 -1
  91. gea_program-0.28.0/gea/help/catalog.md +0 -11
  92. {gea_program-0.28.0 → gea_program-0.29.0}/LICENSE +0 -0
  93. {gea_program-0.28.0 → gea_program-0.29.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
  94. {gea_program-0.28.0 → gea_program-0.29.0}/gea/accuracy_statement.py +0 -0
  95. {gea_program-0.28.0 → gea_program-0.29.0}/gea/alarm_engine.py +0 -0
  96. {gea_program-0.28.0 → gea_program-0.29.0}/gea/bench.py +0 -0
  97. {gea_program-0.28.0 → gea_program-0.29.0}/gea/blind_harness.py +0 -0
  98. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  99. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  100. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  101. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  102. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  103. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  104. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  105. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  106. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  107. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  108. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  109. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  110. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  111. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  112. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  113. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  114. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  115. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  116. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  117. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  118. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  119. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  120. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  121. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  122. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  123. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  124. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  125. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  126. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  127. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  128. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  129. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  130. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  131. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/med_160_sapropels.txt +0 -0
  132. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  133. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  134. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  135. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  136. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  137. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  138. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  139. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  140. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  141. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  142. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  143. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  144. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  145. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  146. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  147. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  148. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  149. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  150. {gea_program-0.28.0 → gea_program-0.29.0}/gea/catalog_register.py +0 -0
  151. {gea_program-0.28.0 → gea_program-0.29.0}/gea/certificates.py +0 -0
  152. {gea_program-0.28.0 → gea_program-0.29.0}/gea/cli.py +0 -0
  153. {gea_program-0.28.0 → gea_program-0.29.0}/gea/client_reports.py +0 -0
  154. {gea_program-0.28.0 → gea_program-0.29.0}/gea/config_versioning.py +0 -0
  155. {gea_program-0.28.0 → gea_program-0.29.0}/gea/conformance.py +0 -0
  156. {gea_program-0.28.0 → gea_program-0.29.0}/gea/correlation.py +0 -0
  157. {gea_program-0.28.0 → gea_program-0.29.0}/gea/dashboard.py +0 -0
  158. {gea_program-0.28.0 → gea_program-0.29.0}/gea/deviation.py +0 -0
  159. {gea_program-0.28.0 → gea_program-0.29.0}/gea/dlis.py +0 -0
  160. {gea_program-0.28.0 → gea_program-0.29.0}/gea/dnp3.py +0 -0
  161. {gea_program-0.28.0 → gea_program-0.29.0}/gea/downhole_engine.py +0 -0
  162. {gea_program-0.28.0 → gea_program-0.29.0}/gea/drift_monitor.py +0 -0
  163. {gea_program-0.28.0 → gea_program-0.29.0}/gea/earth_model.py +0 -0
  164. {gea_program-0.28.0 → gea_program-0.29.0}/gea/elevation.py +0 -0
  165. {gea_program-0.28.0 → gea_program-0.29.0}/gea/etp.py +0 -0
  166. {gea_program-0.28.0 → gea_program-0.29.0}/gea/etp12_schemas.json +0 -0
  167. {gea_program-0.28.0 → gea_program-0.29.0}/gea/example_register_map.json +0 -0
  168. {gea_program-0.28.0 → gea_program-0.29.0}/gea/fat_sat.py +0 -0
  169. {gea_program-0.28.0 → gea_program-0.29.0}/gea/files.py +0 -0
  170. {gea_program-0.28.0 → gea_program-0.29.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
  171. {gea_program-0.28.0 → gea_program-0.29.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
  172. {gea_program-0.28.0 → gea_program-0.29.0}/gea/follower.py +0 -0
  173. {gea_program-0.28.0 → gea_program-0.29.0}/gea/forward_model.py +0 -0
  174. {gea_program-0.28.0 → gea_program-0.29.0}/gea/friction_priors.py +0 -0
  175. {gea_program-0.28.0 → gea_program-0.29.0}/gea/gamma.py +0 -0
  176. {gea_program-0.28.0 → gea_program-0.29.0}/gea/gauge_aging.py +0 -0
  177. {gea_program-0.28.0 → gea_program-0.29.0}/gea/gauge_specs.py +0 -0
  178. {gea_program-0.28.0 → gea_program-0.29.0}/gea/gravity_reference.py +0 -0
  179. {gea_program-0.28.0 → gea_program-0.29.0}/gea/hartip.py +0 -0
  180. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/TESTER_GUIDE.md +0 -0
  181. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/alarms.md +0 -0
  182. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/audit-update.md +0 -0
  183. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/data-in.md +0 -0
  184. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/dlis.md +0 -0
  185. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/doctor.md +0 -0
  186. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/drift.md +0 -0
  187. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/etp.md +0 -0
  188. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/files.md +0 -0
  189. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/notifications.md +0 -0
  190. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/patches.md +0 -0
  191. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/quality.md +0 -0
  192. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/site.md +0 -0
  193. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/soak.md +0 -0
  194. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/start.md +0 -0
  195. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/transients.md +0 -0
  196. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/upkeep.md +0 -0
  197. {gea_program-0.28.0 → gea_program-0.29.0}/gea/help/well-tests.md +0 -0
  198. {gea_program-0.28.0 → gea_program-0.29.0}/gea/housekeeping.py +0 -0
  199. {gea_program-0.28.0 → gea_program-0.29.0}/gea/interval.py +0 -0
  200. {gea_program-0.28.0 → gea_program-0.29.0}/gea/inverse_engine.py +0 -0
  201. {gea_program-0.28.0 → gea_program-0.29.0}/gea/jobs.py +0 -0
  202. {gea_program-0.28.0 → gea_program-0.29.0}/gea/live_ports.py +0 -0
  203. {gea_program-0.28.0 → gea_program-0.29.0}/gea/loadtest.py +0 -0
  204. {gea_program-0.28.0 → gea_program-0.29.0}/gea/matplotlib_demo.py +0 -0
  205. {gea_program-0.28.0 → gea_program-0.29.0}/gea/modbus.py +0 -0
  206. {gea_program-0.28.0 → gea_program-0.29.0}/gea/modbus_rtu.py +0 -0
  207. {gea_program-0.28.0 → gea_program-0.29.0}/gea/model_card.py +0 -0
  208. {gea_program-0.28.0 → gea_program-0.29.0}/gea/month_end.py +0 -0
  209. {gea_program-0.28.0 → gea_program-0.29.0}/gea/mqtt_port.py +0 -0
  210. {gea_program-0.28.0 → gea_program-0.29.0}/gea/notify.py +0 -0
  211. {gea_program-0.28.0 → gea_program-0.29.0}/gea/opcua_port.py +0 -0
  212. {gea_program-0.28.0 → gea_program-0.29.0}/gea/operator_app.py +0 -0
  213. {gea_program-0.28.0 → gea_program-0.29.0}/gea/osdu.py +0 -0
  214. {gea_program-0.28.0 → gea_program-0.29.0}/gea/patches.py +0 -0
  215. {gea_program-0.28.0 → gea_program-0.29.0}/gea/permits.py +0 -0
  216. {gea_program-0.28.0 → gea_program-0.29.0}/gea/piwebapi.py +0 -0
  217. {gea_program-0.28.0 → gea_program-0.29.0}/gea/ports.py +0 -0
  218. {gea_program-0.28.0 → gea_program-0.29.0}/gea/ppdm.py +0 -0
  219. {gea_program-0.28.0 → gea_program-0.29.0}/gea/profile_catalog.py +0 -0
  220. {gea_program-0.28.0 → gea_program-0.29.0}/gea/project.py +0 -0
  221. {gea_program-0.28.0 → gea_program-0.29.0}/gea/qt6_downhole_app.py +0 -0
  222. {gea_program-0.28.0 → gea_program-0.29.0}/gea/quakeml.py +0 -0
  223. {gea_program-0.28.0 → gea_program-0.29.0}/gea/reconciler.py +0 -0
  224. {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
  225. {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
  226. {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/libmseed_steim.provenance.json +0 -0
  227. {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
  228. {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
  229. {gea_program-0.28.0 → gea_program-0.29.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
  230. {gea_program-0.28.0 → gea_program-0.29.0}/gea/rock_inventory.py +0 -0
  231. {gea_program-0.28.0 → gea_program-0.29.0}/gea/sample_record.py +0 -0
  232. {gea_program-0.28.0 → gea_program-0.29.0}/gea/sample_well_profile.csv +0 -0
  233. {gea_program-0.28.0 → gea_program-0.29.0}/gea/sbom.py +0 -0
  234. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seedlink.py +0 -0
  235. {gea_program-0.28.0 → gea_program-0.29.0}/gea/segy.py +0 -0
  236. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic.py +0 -0
  237. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_array.py +0 -0
  238. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_assoc.py +0 -0
  239. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_detect.py +0 -0
  240. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_film.py +0 -0
  241. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_harmonic.py +0 -0
  242. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_qc.py +0 -0
  243. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_response.py +0 -0
  244. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_signature.py +0 -0
  245. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_track.py +0 -0
  246. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_uncertainty.py +0 -0
  247. {gea_program-0.28.0 → gea_program-0.29.0}/gea/seismic_unlisted.py +0 -0
  248. {gea_program-0.28.0 → gea_program-0.29.0}/gea/sensor_swap.py +0 -0
  249. {gea_program-0.28.0 → gea_program-0.29.0}/gea/service_life.py +0 -0
  250. {gea_program-0.28.0 → gea_program-0.29.0}/gea/shell.py +0 -0
  251. {gea_program-0.28.0 → gea_program-0.29.0}/gea/shut_in.py +0 -0
  252. {gea_program-0.28.0 → gea_program-0.29.0}/gea/sla_report.py +0 -0
  253. {gea_program-0.28.0 → gea_program-0.29.0}/gea/slip.py +0 -0
  254. {gea_program-0.28.0 → gea_program-0.29.0}/gea/soak.py +0 -0
  255. {gea_program-0.28.0 → gea_program-0.29.0}/gea/sra.py +0 -0
  256. {gea_program-0.28.0 → gea_program-0.29.0}/gea/store_forward.py +0 -0
  257. {gea_program-0.28.0 → gea_program-0.29.0}/gea/strata_join.py +0 -0
  258. {gea_program-0.28.0 → gea_program-0.29.0}/gea/structure.py +0 -0
  259. {gea_program-0.28.0 → gea_program-0.29.0}/gea/supervisor.py +0 -0
  260. {gea_program-0.28.0 → gea_program-0.29.0}/gea/survey_cmd.py +0 -0
  261. {gea_program-0.28.0 → gea_program-0.29.0}/gea/survey_view.py +0 -0
  262. {gea_program-0.28.0 → gea_program-0.29.0}/gea/telemetry.py +0 -0
  263. {gea_program-0.28.0 → gea_program-0.29.0}/gea/tool_catalog.py +0 -0
  264. {gea_program-0.28.0 → gea_program-0.29.0}/gea/tool_library.py +0 -0
  265. {gea_program-0.28.0 → gea_program-0.29.0}/gea/transient.py +0 -0
  266. {gea_program-0.28.0 → gea_program-0.29.0}/gea/vibration.py +0 -0
  267. {gea_program-0.28.0 → gea_program-0.29.0}/gea/well_assembler.py +0 -0
  268. {gea_program-0.28.0 → gea_program-0.29.0}/gea/well_test_validation.py +0 -0
  269. {gea_program-0.28.0 → gea_program-0.29.0}/gea/wits0.py +0 -0
  270. {gea_program-0.28.0 → gea_program-0.29.0}/gea/witsml.py +0 -0
  271. {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/dependency_links.txt +0 -0
  272. {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/entry_points.txt +0 -0
  273. {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/requires.txt +0 -0
  274. {gea_program-0.28.0 → gea_program-0.29.0}/gea_program.egg-info/top_level.txt +0 -0
  275. {gea_program-0.28.0 → gea_program-0.29.0}/setup.cfg +0 -0
  276. {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.28.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 (368 checks)
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 <command>` run by the
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 <id> --partition ... --acl-owner ... --acl-viewer ...
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 <id>
577
- [--agency "<name>"]` writes `reports/sites/<site>/quakeml/<site>_events.xml`
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 <id>` names a well the way the
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 <id> --record pump.csv --vib-unit
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 <entry>` runs the strata survey on any catalogue log
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 <id>` then converts the interval
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 <name>` names one shapefile in a zip holding
769
- several; `gea structure --layer <zip> --list` lists them). Each layer is
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
- <file> --lat --lon` for any position. A distance to a mapped trace is a fact
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-<version>-win64/ and .zip (needs internet here, none there)
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 (368 checks)
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 <command>` run by the
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 <id> --partition ... --acl-owner ... --acl-viewer ...
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 <id>
538
- [--agency "<name>"]` writes `reports/sites/<site>/quakeml/<site>_events.xml`
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 <id>` names a well the way the
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 <id> --record pump.csv --vib-unit
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 <entry>` runs the strata survey on any catalogue log
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 <id>` then converts the interval
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 <name>` names one shapefile in a zip holding
730
- several; `gea structure --layer <zip> --list` lists them). Each layer is
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
- <file> --lat --lon` for any position. A distance to a mapped trace is a fact
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-<version>-win64/ and .zip (needs internet here, none there)
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
  ```
@@ -123,7 +123,7 @@ from .profile_catalog import (
123
123
  read_pangaea_txt,
124
124
  )
125
125
 
126
- __version__ = "0.28.0"
126
+ __version__ = "0.29.0"
127
127
  __all__ = [
128
128
  "aging_rate", "rate_psi_yr", "accuracy_psi",
129
129
  "Sensor", "SimulatorConfig", "DownholeEngine",
@@ -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 <md_ft>:<tool> (repeatable)")
285
- p_tl.add_argument("--station", type=str, action="append", default=None, help="a station as <measured depth in feet>:<tool name>")
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 <zip> --list)")
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 <zip|folder|.shp> --lat --lon; --info describes the 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": "<column>", "lon": ..., "start": ..., "end": ..., "id": ..., "name": ...} when the guesses are wrong')
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 <LAS or DLIS>, --catalog <entry> or --demo")
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 <id>")
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 <folder written by gea dashboard --out>")
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 <id>")
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 <name> --wells ... --seismic ... --tracks ...`")
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 <id>")
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 <id>")
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 <id>")
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 <id>")
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 <id>")
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 <id>")
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 <id> and --record <file>")
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 <id>")
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 <display> and --layer <shapefile zip | folder | .shp>")
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 ... --layer <shapefile zip>")
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 <id>")
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 <id>")
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 <wsm.csv>")
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 <id>")
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 <id>")
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 <display> and --seedlink-config <json>")
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 <id>")
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 <id>")
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 <id>")
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 <id>")
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 <empty folder>")
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 <site folder> (with --out <another disk>), or --verify / --restore an archive")
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 <a folder on another disk or a share>")
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 <measured depth in feet>:<tool name>, got {spec!r}")
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 <export>")
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 <saved>` reads it, and sra-report --catalog takes it.")
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 <wsm.csv>")
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