pikobs 3.0.330__tar.gz → 3.0.332__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 (169) hide show
  1. {pikobs-3.0.330 → pikobs-3.0.332}/CHANGELOG.md +8 -0
  2. {pikobs-3.0.330/pikobs.egg-info → pikobs-3.0.332}/PKG-INFO +1 -1
  3. pikobs-3.0.332/VERSION +1 -0
  4. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obstimedb/obstimedb.py +55 -40
  5. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obstimedb/obstimedb_plot.py +17 -7
  6. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_obstimedb.sh +4 -4
  7. {pikobs-3.0.330 → pikobs-3.0.332/pikobs.egg-info}/PKG-INFO +1 -1
  8. pikobs-3.0.330/VERSION +0 -1
  9. {pikobs-3.0.330 → pikobs-3.0.332}/.gitignore +0 -0
  10. {pikobs-3.0.330 → pikobs-3.0.332}/MANIFEST.in +0 -0
  11. {pikobs-3.0.330 → pikobs-3.0.332}/README.md +0 -0
  12. {pikobs-3.0.330 → pikobs-3.0.332}/clear.sh +0 -0
  13. {pikobs-3.0.330 → pikobs-3.0.332}/conda_build/pikobs/activate.sh +0 -0
  14. {pikobs-3.0.330 → pikobs-3.0.332}/conda_build/pikobs/build.sh +0 -0
  15. {pikobs-3.0.330 → pikobs-3.0.332}/conda_build/pikobs/meta.yaml +0 -0
  16. {pikobs-3.0.330 → pikobs-3.0.332}/conda_build/pikobs/pikobs.yml +0 -0
  17. {pikobs-3.0.330 → pikobs-3.0.332}/docs/Makefile +0 -0
  18. {pikobs-3.0.330 → pikobs-3.0.332}/docs/make.bat +0 -0
  19. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/cardio.rst +0 -0
  20. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/conf.py +0 -0
  21. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/families.rst +0 -0
  22. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/flag.rst +0 -0
  23. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/flags_criteria.rst +0 -0
  24. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/histogram.rst +0 -0
  25. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/index.rst +0 -0
  26. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/mapobs.rst +0 -0
  27. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/obscountdb.rst +0 -0
  28. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/obstimedb.rst +0 -0
  29. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/pikobsburp2rdb.rst +0 -0
  30. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/profile.rst +0 -0
  31. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/profile_ft.rst +0 -0
  32. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/profile_ft2.rst +0 -0
  33. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/projection.rst +0 -0
  34. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/region.rst +0 -0
  35. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/scatter.rst +0 -0
  36. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/spatial.rst +0 -0
  37. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/timeserie.rst +0 -0
  38. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/unittest.rst +0 -0
  39. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/varno.rst +0 -0
  40. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/vdedr.rst +0 -0
  41. {pikobs-3.0.330 → pikobs-3.0.332}/docs/source/zone.rst +0 -0
  42. {pikobs-3.0.330 → pikobs-3.0.332}/env/.mambarc +0 -0
  43. {pikobs-3.0.330 → pikobs-3.0.332}/env/conda-meta/history +0 -0
  44. {pikobs-3.0.330 → pikobs-3.0.332}/env/etc/aau_token +0 -0
  45. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/__init__.py +0 -0
  46. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/__not_used/plot_proj.py +0 -0
  47. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/__not_used/vdedr2.py +0 -0
  48. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/__not_used/vdedr3.py +0 -0
  49. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/cardio/__init__.py +0 -0
  50. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/cardio/cardio.py +0 -0
  51. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/cardio/cardio_plot.py +0 -0
  52. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/cardio/cardio_plot_old.py +0 -0
  53. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/__init__.py +0 -0
  54. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/delete_folder.py +0 -0
  55. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/families.py +0 -0
  56. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/familyobs.py +0 -0
  57. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/flags_criteria.py +0 -0
  58. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/regionsobs.py +0 -0
  59. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/special_family.py +0 -0
  60. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/type_boxes.py +0 -0
  61. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/type_projection.py +0 -0
  62. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/configobs/type_varno.py +0 -0
  63. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/extension/color_mapping.json +0 -0
  64. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/extension/libudfsqlite-shared.so +0 -0
  65. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/__init__.py +0 -0
  66. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/flags.py +0 -0
  67. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/flags_count.py +0 -0
  68. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/flags_plot.py +0 -0
  69. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/flags_plot0.py +0 -0
  70. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/flags_plot3.py +0 -0
  71. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/flags_plotv2.py +0 -0
  72. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/plotpo.py +0 -0
  73. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/plotpo2.py +0 -0
  74. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/plotpo3.py +0 -0
  75. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/plotpo4.py +0 -0
  76. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/plotpo5.py +0 -0
  77. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/plotpo7.py +0 -0
  78. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/plotpo8.py +0 -0
  79. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/flags/plotpo9.py +0 -0
  80. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/histogram/__init__.py +0 -0
  81. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/histogram/histogram.py +0 -0
  82. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/histogram/histogram_plot.py +0 -0
  83. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/mapobs/__init__.py +0 -0
  84. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/mapobs/color.j +0 -0
  85. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/mapobs/mapobs.py +0 -0
  86. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obscountdb/__init__.py +0 -0
  87. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obscountdb/obscountdb.py +0 -0
  88. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obscountdb/obscountdb_old.py +0 -0
  89. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obscountdb/obscountdb_plot.py +0 -0
  90. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obscutoff/__init__.py +0 -0
  91. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obscutoff/obscutoff.py +0 -0
  92. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obscutoff/obscutoff_plot.py +0 -0
  93. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/obstimedb/__init__.py +0 -0
  94. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/pbs_submit/__init__.py +0 -0
  95. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/pbs_submit/pbs_submit.py +0 -0
  96. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/pikobsburp2rdb/__init__.py +0 -0
  97. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/pikobsburp2rdb/pikobsburp2rdb.py +0 -0
  98. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/profile/__init__.py +0 -0
  99. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/profile/profile.py +0 -0
  100. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/profile/profile_plot.py +0 -0
  101. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/progps/__init__.py +0 -0
  102. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/progps/progps.py +0 -0
  103. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/progps2/__init__.py +0 -0
  104. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/progps2/progps2.py +0 -0
  105. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/scatter/__init__.py +0 -0
  106. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/scatter/scatter.py +0 -0
  107. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/remove.sh +0 -0
  108. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/remove2.py +0 -0
  109. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_2exp.sh +0 -0
  110. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_cardio.sh +0 -0
  111. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_cardio_lco.sh +0 -0
  112. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_cardio_sky.sh +0 -0
  113. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_flag.sh +0 -0
  114. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_histogra.sh +0 -0
  115. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_mapobs.sh +0 -0
  116. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_obscountdb.sh +0 -0
  117. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_obscountdb_1.sh +0 -0
  118. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_pikobsburp2rdb.sh +0 -0
  119. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_profile.sh +0 -0
  120. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_profile_1.sh +0 -0
  121. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_profile_ra.sh +0 -0
  122. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_profile_radar.sh +0 -0
  123. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_profile_s.sh +0 -0
  124. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_progps.sh +0 -0
  125. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_progps2.sh +0 -0
  126. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_scatter.sh +0 -0
  127. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_scatter_diff.sh +0 -0
  128. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_scatter_one.sh +0 -0
  129. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_scatter_two_sw.sh +0 -0
  130. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_spatial.sh +0 -0
  131. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_timeserie.sh +0 -0
  132. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_timeserie_radar.sh +0 -0
  133. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_vdedr.sh +0 -0
  134. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/run_zone2.sh +0 -0
  135. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/setup_pikobs.sh +0 -0
  136. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/script/setup_pikobs.sh.1 +0 -0
  137. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/spatial/__init__.py +0 -0
  138. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/spatial/spatial.py +0 -0
  139. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/timeserie/__init__.py +0 -0
  140. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/timeserie/timeserie.py +0 -0
  141. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/timeserie/timeserie_plot.py +0 -0
  142. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/unittestpikobs/__init__.py +0 -0
  143. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/unittestpikobs/test_pikobs.py +0 -0
  144. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/unittestpikobs/unittest_timeserie.py +0 -0
  145. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/vdedr/__init__.py +0 -0
  146. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/vdedr/vdedr.py +0 -0
  147. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/vdedr/vdedr_plot.py +0 -0
  148. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/web/__init__.py +0 -0
  149. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/web/viewer.py +0 -0
  150. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/zone/__init__.py +0 -0
  151. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/zone/zone.py +0 -0
  152. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs/zone/zone_plot.py +0 -0
  153. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs.egg-info/SOURCES.txt +0 -0
  154. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs.egg-info/dependency_links.txt +0 -0
  155. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs.egg-info/requires.txt +0 -0
  156. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs.egg-info/top_level.txt +0 -0
  157. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs_env.yml +0 -0
  158. {pikobs-3.0.330 → pikobs-3.0.332}/pikobs_env2.yml +0 -0
  159. {pikobs-3.0.330 → pikobs-3.0.332}/publique.sh +0 -0
  160. {pikobs-3.0.330 → pikobs-3.0.332}/publique.txt +0 -0
  161. {pikobs-3.0.330 → pikobs-3.0.332}/readme/flag_criteria.md +0 -0
  162. {pikobs-3.0.330 → pikobs-3.0.332}/readme/geographic.md +0 -0
  163. {pikobs-3.0.330 → pikobs-3.0.332}/readme/read_projection.md +0 -0
  164. {pikobs-3.0.330 → pikobs-3.0.332}/readme/readme_cardiograme.md +0 -0
  165. {pikobs-3.0.330 → pikobs-3.0.332}/readme/readme_scatter.md +0 -0
  166. {pikobs-3.0.330 → pikobs-3.0.332}/setup.cfg +0 -0
  167. {pikobs-3.0.330 → pikobs-3.0.332}/setup.py +0 -0
  168. {pikobs-3.0.330 → pikobs-3.0.332}/setup_pikobs.sh +0 -0
  169. {pikobs-3.0.330 → pikobs-3.0.332}/setup_pikobs.sh.1 +0 -0
@@ -1147,3 +1147,11 @@ Please use the following tags when editing this file:
1147
1147
  ## [3.0.330] 2026-09-01
1148
1148
  ### Added
1149
1149
  - bugs
1150
+
1151
+ ## [3.0.331] 2026-09-01
1152
+ ### Added
1153
+ - bugs
1154
+
1155
+ ## [3.0.332] 2026-09-01
1156
+ ### Added
1157
+ - bugs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pikobs
3
- Version: 3.0.330
3
+ Version: 3.0.332
4
4
  Summary: pikobs
5
5
  Home-page: https://gitlab.science.gc.ca/dlo001/pikobs
6
6
  Author: David Lobon
pikobs-3.0.332/VERSION ADDED
@@ -0,0 +1 @@
1
+ 3.0.332
@@ -374,50 +374,65 @@ def create_and_populate_moyenne_table(
374
374
  # it into its own column. Every other family leaves `channel` as
375
375
  # a literal NULL and groups exactly as before -- this is a pure
376
376
  # addition, the non-radiance extraction path is unchanged.
377
+ #
378
+ # CRITICAL: the per-channel rows must NEVER be the only rows
379
+ # inserted for a radiance family. The SAME id_obs (profile)
380
+ # appears in MANY channel rows (one per channel it reports), so
381
+ # summing Nobsdata/Nobsprofile ACROSS channel rows -- exactly
382
+ # what every consumer of `moyenne` that isn't channel-aware does
383
+ # (the main Nobs/Nobsprofile series behind the mosaic, global
384
+ # time series, and profile summary table) -- silently multiplies
385
+ # the true profile count by roughly the number of channels
386
+ # reported (confirmed directly: a 10-profile/15-channel test
387
+ # case summed to 150, not 10). The fix is to ALSO insert a
388
+ # SEPARATE, non-channel-split row (channel=NULL) with the
389
+ # correct, ungrouped-by-channel counts, so every consumer that
390
+ # filters `WHERE channel IS NULL` (the main series) gets the
391
+ # right numbers, while `WHERE channel IS NOT NULL` (the
392
+ # per-channel breakdown) still works exactly as before.
377
393
  # ------------------------------------------------------------------
378
394
  is_radiance = (VCOTYP == 'CANAL')
379
395
  if is_radiance:
380
- channel_expr = "vcoord"
381
- group_by_clause = f"{group_col}, vcoord"
396
+ passes = [("NULL", group_col), ("vcoord", f"{group_col}, vcoord")]
382
397
  else:
383
- channel_expr = "NULL"
384
- group_by_clause = group_col
385
-
386
- insert_query = f"""
387
- INSERT INTO moyenne (Nobsdata, Nobsprofile, avg_omp, avg_oma, id_stn, channel, date)
388
- SELECT
389
- count(DISTINCT(id_data)),
390
- count(DISTINCT(id_obs)),
391
- {avg_omp_expr},
392
- {avg_oma_expr},
393
- {id_stn_expr},
394
- {channel_expr},
395
- {date_match.group(1)}
396
- FROM db.header
397
- NATURAL JOIN db.DATA
398
- WHERE obsvalue IS NOT NULL
399
- {flag_criteria}
400
- {LATLONCRIT}
401
- {VCOCRIT}
402
- {family_filter}
403
- GROUP BY {group_by_clause};
404
- """
405
-
406
- try:
407
- cursor.execute(insert_query)
408
- except sqlite3.OperationalError as err:
409
- msg = str(err).lower()
410
- fb_query = insert_query
411
- for metric in agr_list:
412
- if metric in msg:
413
- print(f"[WARNING] Column '{metric}' not found in "
414
- f"{os.path.basename(existing_db_filename)}; storing NULL.",
415
- flush=True)
416
- fb_query = fb_query.replace(f"AVG({metric})", "NULL")
417
- if fb_query != insert_query:
418
- cursor.execute(fb_query)
419
- else:
420
- raise
398
+ passes = [("NULL", group_col)]
399
+
400
+ for channel_expr, group_by_clause in passes:
401
+ insert_query = f"""
402
+ INSERT INTO moyenne (Nobsdata, Nobsprofile, avg_omp, avg_oma, id_stn, channel, date)
403
+ SELECT
404
+ count(DISTINCT(id_data)),
405
+ count(DISTINCT(id_obs)),
406
+ {avg_omp_expr},
407
+ {avg_oma_expr},
408
+ {id_stn_expr},
409
+ {channel_expr},
410
+ {date_match.group(1)}
411
+ FROM db.header
412
+ NATURAL JOIN db.DATA
413
+ WHERE obsvalue IS NOT NULL
414
+ {flag_criteria}
415
+ {LATLONCRIT}
416
+ {VCOCRIT}
417
+ {family_filter}
418
+ GROUP BY {group_by_clause};
419
+ """
420
+
421
+ try:
422
+ cursor.execute(insert_query)
423
+ except sqlite3.OperationalError as err:
424
+ msg = str(err).lower()
425
+ fb_query = insert_query
426
+ for metric in agr_list:
427
+ if metric in msg:
428
+ print(f"[WARNING] Column '{metric}' not found in "
429
+ f"{os.path.basename(existing_db_filename)}; storing NULL.",
430
+ flush=True)
431
+ fb_query = fb_query.replace(f"AVG({metric})", "NULL")
432
+ if fb_query != insert_query:
433
+ cursor.execute(fb_query)
434
+ else:
435
+ raise
421
436
  mem_conn.commit()
422
437
 
423
438
  try:
@@ -379,10 +379,20 @@ def _draw_profile_summary_table(df_all, run_time, name_in='experience'):
379
379
  row per (family, id_stn) PLUS one 'ALL' row per family, matching
380
380
  the reference report's per-family total row.
381
381
  """
382
+ # NOTE: "Yesterday" and "Last week" are NOT immediately adjacent to
383
+ # "Today"/"This week" -- confirmed against TWO independent reference
384
+ # tables given directly by the user (run_time 2026082600/00Z and
385
+ # 2026083112/12Z), both consistently showing a 1-DAY GAP: Yesterday
386
+ # ends a full 24h before Today starts, and Last week ends a full
387
+ # day before This week starts. This was a real bug in an earlier
388
+ # version of this function (computed both as immediately adjacent,
389
+ # no gap) -- fixed here to match the confirmed convention exactly.
382
390
  today_start = run_time - pd.Timedelta(hours=24)
383
- yesterday_start = run_time - pd.Timedelta(hours=48)
391
+ yesterday_end = run_time - pd.Timedelta(hours=48)
392
+ yesterday_start = run_time - pd.Timedelta(hours=72)
384
393
  week_start = run_time - pd.Timedelta(days=7)
385
- lastweek_start = run_time - pd.Timedelta(days=14)
394
+ lastweek_end = run_time - pd.Timedelta(days=8)
395
+ lastweek_start = run_time - pd.Timedelta(days=15)
386
396
  tenday_start = run_time - pd.Timedelta(days=10)
387
397
  run_hour = run_time.hour
388
398
 
@@ -400,9 +410,9 @@ def _draw_profile_summary_table(df_all, run_time, name_in='experience'):
400
410
  <b>PASS:</b> {run_hour:02d}Z<br><br>
401
411
  <b>Definitions of periods</b> (computed for this run):<br>
402
412
  Today: date &gt; {_fmtd(today_start)} and date &le; {_fmtd(run_time)}<br>
403
- Yesterday: date &gt; {_fmtd(yesterday_start)} and date &le; {_fmtd(today_start)}<br>
413
+ Yesterday: date &gt; {_fmtd(yesterday_start)} and date &le; {_fmtd(yesterday_end)}<br>
404
414
  This week: date &gt; {_fmtd(week_start)} and date &le; {_fmtd(run_time)}<br>
405
- Last week: date &gt; {_fmtd(lastweek_start)} and date &le; {_fmtd(week_start)}<br>
415
+ Last week: date &gt; {_fmtd(lastweek_start)} and date &le; {_fmtd(lastweek_end)}<br>
406
416
  Last 10 days (same PASS {run_hour:02d}Z): date &gt; {_fmtd(tenday_start)}
407
417
  and date &le; {_fmtd(run_time)}<br><br>
408
418
  <b>Percentage difference calculations:</b><br>
@@ -434,9 +444,9 @@ def _draw_profile_summary_table(df_all, run_time, name_in='experience'):
434
444
 
435
445
  def _build_row(family, id_stn, g):
436
446
  today = _period_sum(g, today_start, run_time)
437
- yesterday = _period_sum(g, yesterday_start, today_start)
447
+ yesterday = _period_sum(g, yesterday_start, yesterday_end)
438
448
  this_week = _period_sum(g, week_start, run_time)
439
- last_week = _period_sum(g, lastweek_start, week_start)
449
+ last_week = _period_sum(g, lastweek_start, lastweek_end)
440
450
  at_run = g.loc[g['date'] == run_time, 'Nprofile'].sum()
441
451
  tenday_avg = _period_mean(g, tenday_start, run_time, same_hour=True)
442
452
  return {
@@ -881,7 +891,7 @@ def obstimedb_plot(
881
891
  select_extra.append(
882
892
  f"SUM(CASE WHEN {col} IS NOT NULL THEN Nobsdata ELSE 0 END) as _wden_{metric}")
883
893
  query = ("SELECT date, id_stn, " + ", ".join(select_extra) +
884
- " FROM moyenne GROUP BY date, id_stn;")
894
+ " FROM moyenne WHERE channel IS NULL GROUP BY date, id_stn;")
885
895
  try:
886
896
  df = pd.read_sql_query(query, conn)
887
897
  except Exception as e:
@@ -8,18 +8,18 @@ set -eo pipefail
8
8
  # ============================================================================
9
9
  # Directory containing the SQLite observation databases for the (single)
10
10
  # experiment. obstimedb tracks ONE run over time — no control/reference.
11
- PATH_EXPERIENCE_FILES="/home/dlo001/data_maestro/ppp7/maestro_archives/NAT910E22S50/monitoring/banco/postalt/"
11
+ PATH_EXPERIENCE_FILES="/home/smco500/.suites/gdps/g2/hub/ppp7/monitoring/banco/postalt/"
12
12
  # Label for the experiment data.
13
13
  EXPERIENCE_NAME="GDPS-SN"
14
14
  # Output directory where the generated results will be saved.
15
15
  PATHWORK="/home/dlo001/sites8/pikobs_obstimedb"
16
16
  # Start and end dates for the processing window in YYYYMMDDHH format (UTC).
17
- DATESTART="2022060100"
18
- DATEEND="2022070100"
17
+ DATESTART="2026082106"
18
+ DATEEND="2026083112"
19
19
  # Region to process.
20
20
  REGION="Monde"
21
21
  # Observation families to process (space-separated list).
22
- FAMILY="ai atms cris csr gp iasi mwhs2 ro sc sf ssmis sw to_amsua to_amsub ua"
22
+ FAMILY="ai atms_allsky ch cris csr gp iasi mwhs2 ro sc sf ssmis sw to_amsua_allsky to_amsub_allsky ua"
23
23
  # Bitmask filter criteria.
24
24
  FLAGS_CRITERIA="assimilee"
25
25
  # Baseline look-back window, in calendar days, for the same synoptic hour
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pikobs
3
- Version: 3.0.330
3
+ Version: 3.0.332
4
4
  Summary: pikobs
5
5
  Home-page: https://gitlab.science.gc.ca/dlo001/pikobs
6
6
  Author: David Lobon
pikobs-3.0.330/VERSION DELETED
@@ -1 +0,0 @@
1
- 3.0.330
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes