pikobs 3.0.415__tar.gz → 3.0.417__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 (171) hide show
  1. {pikobs-3.0.415 → pikobs-3.0.417}/CHANGELOG.md +8 -0
  2. {pikobs-3.0.415/pikobs.egg-info → pikobs-3.0.417}/PKG-INFO +1 -1
  3. pikobs-3.0.417/VERSION +1 -0
  4. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/scatter/scatter.py +208 -68
  5. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_scatter.sh +1 -1
  6. {pikobs-3.0.415 → pikobs-3.0.417/pikobs.egg-info}/PKG-INFO +1 -1
  7. pikobs-3.0.415/VERSION +0 -1
  8. {pikobs-3.0.415 → pikobs-3.0.417}/.gitignore +0 -0
  9. {pikobs-3.0.415 → pikobs-3.0.417}/MANIFEST.in +0 -0
  10. {pikobs-3.0.415 → pikobs-3.0.417}/README.md +0 -0
  11. {pikobs-3.0.415 → pikobs-3.0.417}/clear.sh +0 -0
  12. {pikobs-3.0.415 → pikobs-3.0.417}/conda_build/pikobs/activate.sh +0 -0
  13. {pikobs-3.0.415 → pikobs-3.0.417}/conda_build/pikobs/build.sh +0 -0
  14. {pikobs-3.0.415 → pikobs-3.0.417}/conda_build/pikobs/meta.yaml +0 -0
  15. {pikobs-3.0.415 → pikobs-3.0.417}/conda_build/pikobs/pikobs.yml +0 -0
  16. {pikobs-3.0.415 → pikobs-3.0.417}/docs/Makefile +0 -0
  17. {pikobs-3.0.415 → pikobs-3.0.417}/docs/make.bat +0 -0
  18. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/cardio.rst +0 -0
  19. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/conf.py +0 -0
  20. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/families.rst +0 -0
  21. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/flag.rst +0 -0
  22. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/flags_criteria.rst +0 -0
  23. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/histogram.rst +0 -0
  24. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/index.rst +0 -0
  25. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/mapobs.rst +0 -0
  26. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/obscountdb.rst +0 -0
  27. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/obstimedb.rst +0 -0
  28. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/pikobsburp2rdb.rst +0 -0
  29. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/profile.rst +0 -0
  30. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/profile_ft.rst +0 -0
  31. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/profile_ft2.rst +0 -0
  32. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/projection.rst +0 -0
  33. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/region.rst +0 -0
  34. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/scatter.rst +0 -0
  35. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/spatial.rst +0 -0
  36. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/timeserie.rst +0 -0
  37. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/unittest.rst +0 -0
  38. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/varno.rst +0 -0
  39. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/vdedr.rst +0 -0
  40. {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/zone.rst +0 -0
  41. {pikobs-3.0.415 → pikobs-3.0.417}/env/.mambarc +0 -0
  42. {pikobs-3.0.415 → pikobs-3.0.417}/env/conda-meta/history +0 -0
  43. {pikobs-3.0.415 → pikobs-3.0.417}/env/etc/aau_token +0 -0
  44. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/__init__.py +0 -0
  45. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/__not_used/plot_proj.py +0 -0
  46. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/__not_used/vdedr2.py +0 -0
  47. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/__not_used/vdedr3.py +0 -0
  48. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/cardio/__init__.py +0 -0
  49. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/cardio/cardio.py +0 -0
  50. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/cardio/cardio_plot.py +0 -0
  51. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/cardio/cardio_plot_old.py +0 -0
  52. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/__init__.py +0 -0
  53. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/delete_folder.py +0 -0
  54. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/families.py +0 -0
  55. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/familyobs.py +0 -0
  56. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/flags_criteria.py +0 -0
  57. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/regionsobs.py +0 -0
  58. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/special_family.py +0 -0
  59. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/type_boxes.py +0 -0
  60. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/type_projection.py +0 -0
  61. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/type_varno.py +0 -0
  62. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/extension/color_mapping.json +0 -0
  63. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/extension/libudfsqlite-shared.so +0 -0
  64. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/__init__.py +0 -0
  65. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags.py +0 -0
  66. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_count.py +0 -0
  67. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_plot.py +0 -0
  68. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_plot0.py +0 -0
  69. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_plot3.py +0 -0
  70. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_plotv2.py +0 -0
  71. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo.py +0 -0
  72. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo2.py +0 -0
  73. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo3.py +0 -0
  74. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo4.py +0 -0
  75. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo5.py +0 -0
  76. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo7.py +0 -0
  77. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo8.py +0 -0
  78. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo9.py +0 -0
  79. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/histogram/__init__.py +0 -0
  80. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/histogram/histogram.py +0 -0
  81. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/histogram/histogram_plot.py +0 -0
  82. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/mapobs/__init__.py +0 -0
  83. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/mapobs/color.j +0 -0
  84. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/mapobs/mapobs.py +0 -0
  85. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscountdb/__init__.py +0 -0
  86. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscountdb/obscountdb.py +0 -0
  87. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscountdb/obscountdb_old.py +0 -0
  88. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscountdb/obscountdb_plot.py +0 -0
  89. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscutoff/__init__.py +0 -0
  90. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscutoff/obscutoff.py +0 -0
  91. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscutoff/obscutoff_plot.py +0 -0
  92. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obstimedb/__init__.py +0 -0
  93. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obstimedb/obstimedb.py +0 -0
  94. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obstimedb/obstimedb_plot.py +0 -0
  95. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/pbs_submit/__init__.py +0 -0
  96. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/pbs_submit/pbs_submit.py +0 -0
  97. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/pikobsburp2rdb/__init__.py +0 -0
  98. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/pikobsburp2rdb/pikobsburp2rdb.py +0 -0
  99. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/profile/__init__.py +0 -0
  100. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/profile/profile.py +0 -0
  101. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/profile/profile_plot.py +0 -0
  102. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps/__init__.py +0 -0
  103. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps/progps.py +0 -0
  104. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps/progps_old.py +0 -0
  105. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps2/__init__.py +0 -0
  106. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps2/progps2.py +0 -0
  107. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/scatter/__init__.py +0 -0
  108. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/remove.sh +0 -0
  109. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/remove2.py +0 -0
  110. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_2exp.sh +0 -0
  111. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_cardio.sh +0 -0
  112. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_cardio_lco.sh +0 -0
  113. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_cardio_sky.sh +0 -0
  114. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_flag.sh +0 -0
  115. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_histogra.sh +0 -0
  116. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_mapobs.sh +0 -0
  117. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_obscountdb.sh +0 -0
  118. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_obscountdb_1.sh +0 -0
  119. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_obstimedb.sh +0 -0
  120. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_pikobsburp2rdb.sh +0 -0
  121. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile.sh +0 -0
  122. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile_1.sh +0 -0
  123. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile_ra.sh +0 -0
  124. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile_radar.sh +0 -0
  125. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile_s.sh +0 -0
  126. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_progps.sh +0 -0
  127. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_progps2.sh +0 -0
  128. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_scatter_diff.sh +0 -0
  129. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_scatter_one.sh +0 -0
  130. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_scatter_two_sw.sh +0 -0
  131. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_spatial.sh +0 -0
  132. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_timeserie.sh +0 -0
  133. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_timeserie_radar.sh +0 -0
  134. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_vdedr.sh +0 -0
  135. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_zone2.sh +0 -0
  136. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/setup_pikobs.sh +0 -0
  137. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/setup_pikobs.sh.1 +0 -0
  138. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/spatial/__init__.py +0 -0
  139. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/spatial/spatial.py +0 -0
  140. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/spatial/spatial_core.py +0 -0
  141. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/timeserie/__init__.py +0 -0
  142. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/timeserie/timeserie.py +0 -0
  143. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/timeserie/timeserie_plot.py +0 -0
  144. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/unittestpikobs/__init__.py +0 -0
  145. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/unittestpikobs/test_pikobs.py +0 -0
  146. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/unittestpikobs/unittest_timeserie.py +0 -0
  147. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/vdedr/__init__.py +0 -0
  148. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/vdedr/vdedr.py +0 -0
  149. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/vdedr/vdedr_plot.py +0 -0
  150. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/web/__init__.py +0 -0
  151. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/web/viewer.py +0 -0
  152. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/zone/__init__.py +0 -0
  153. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/zone/zone.py +0 -0
  154. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/zone/zone_plot.py +0 -0
  155. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs.egg-info/SOURCES.txt +0 -0
  156. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs.egg-info/dependency_links.txt +0 -0
  157. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs.egg-info/requires.txt +0 -0
  158. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs.egg-info/top_level.txt +0 -0
  159. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs_env.yml +0 -0
  160. {pikobs-3.0.415 → pikobs-3.0.417}/pikobs_env2.yml +0 -0
  161. {pikobs-3.0.415 → pikobs-3.0.417}/publique.sh +0 -0
  162. {pikobs-3.0.415 → pikobs-3.0.417}/publique.txt +0 -0
  163. {pikobs-3.0.415 → pikobs-3.0.417}/readme/flag_criteria.md +0 -0
  164. {pikobs-3.0.415 → pikobs-3.0.417}/readme/geographic.md +0 -0
  165. {pikobs-3.0.415 → pikobs-3.0.417}/readme/read_projection.md +0 -0
  166. {pikobs-3.0.415 → pikobs-3.0.417}/readme/readme_cardiograme.md +0 -0
  167. {pikobs-3.0.415 → pikobs-3.0.417}/readme/readme_scatter.md +0 -0
  168. {pikobs-3.0.415 → pikobs-3.0.417}/setup.cfg +0 -0
  169. {pikobs-3.0.415 → pikobs-3.0.417}/setup.py +0 -0
  170. {pikobs-3.0.415 → pikobs-3.0.417}/setup_pikobs.sh +0 -0
  171. {pikobs-3.0.415 → pikobs-3.0.417}/setup_pikobs.sh.1 +0 -0
@@ -1487,3 +1487,11 @@ Please use the following tags when editing this file:
1487
1487
  ## [3.0.415] 2026-09-17
1488
1488
  ### Added
1489
1489
  - bugs
1490
+
1491
+ ## [3.0.416] 2026-09-17
1492
+ ### Added
1493
+ - bugs
1494
+
1495
+ ## [3.0.417] 2026-09-17
1496
+ ### Added
1497
+ - bugs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pikobs
3
- Version: 3.0.415
3
+ Version: 3.0.417
4
4
  Summary: pikobs
5
5
  Home-page: https://gitlab.science.gc.ca/dlo001/pikobs
6
6
  Author: David Lobon
pikobs-3.0.417/VERSION ADDED
@@ -0,0 +1 @@
1
+ 3.0.417
@@ -143,7 +143,7 @@ tokens need it, and the list of stations that contributed is saved
143
143
  separately so the titles can name them.
144
144
 
145
145
  **Matching** (comparison runs only). For ``omp``, ``oma``, ``stdomp``,
146
- ``stdoma`` and ``bcorr`` the two runs are compared on the *same*
146
+ and ``stdoma`` the two runs are compared on the *same*
147
147
  observations. Each 6-h file of the control is joined with the same file of
148
148
  the experience on
149
149
 
@@ -307,11 +307,11 @@ comment on ``FONCTION`` gives the test used for each function:
307
307
  FLAGS_CRITERIA=(all assimilee) # all, assimilee, rejets, bgckalt, ...
308
308
 
309
309
  # Functions. Values are experience minus control; the test is in brackets.
310
- # omp oma stdomp stdoma bcorr use the observations common to both runs.
310
+ # omp oma stdomp stdoma use the observations common to both runs.
311
311
  # omp oma |bias exp| - |bias ctl|, units [paired t + F-test]
312
312
  # stdomp stdoma 100 (σ exp - σ ctl) / σ ctl [F-test]
313
313
  # for these four, negative (red) = experience better
314
- # bcorr exp - control, units [paired t]
314
+ # bcorr change of |bias corr.|, % [no test]
315
315
  # (radiance families only, skipped when the files have
316
316
  # no BIAS_CORR column)
317
317
  # obs exp - control, units [no test]
@@ -578,19 +578,19 @@ F-test are the ones of ``saska40_v0_hs.py``, the channel statistics used in
578
578
  the IR studies, so a map and a channel plot of the same experiment tell the
579
579
  same story.
580
580
 
581
- +------------------------+------------------------------------+----------------------+--------------+----------------+
582
- | Function | Box value (experience - control) | Red means | Observations | Test |
583
- +========================+====================================+======================+==============+================+
584
- | ``omp``, ``oma`` | ``|bias_exp| - |bias_ctl|``, units | negative: exp better | common | paired t and F |
585
- +------------------------+------------------------------------+----------------------+--------------+----------------+
586
- | ``stdomp``, ``stdoma`` | ``100 (σ_exp - σ_ctl) / σ_ctl`` | negative: exp better | common | F |
587
- +------------------------+------------------------------------+----------------------+--------------+----------------+
588
- | ``bcorr`` | ``bcorr_exp - bcorr_ctl``, units | positive: larger | common | paired t |
589
- +------------------------+------------------------------------+----------------------+--------------+----------------+
590
- | ``obs`` | ``obs_exp - obs_ctl``, units | positive: higher | all | none |
591
- +------------------------+------------------------------------+----------------------+--------------+----------------+
592
- | ``nobs``, ``dens`` | ``100 (N_exp - N_ctl) / N_ctl`` | positive: more obs | all | none |
593
- +------------------------+------------------------------------+----------------------+--------------+----------------+
581
+ +------------------------+------------------------------------------+----------------------+--------------+----------------+
582
+ | Function | Box value (experience - control) | Red means | Observations | Test |
583
+ +========================+==========================================+======================+==============+================+
584
+ | ``omp``, ``oma`` | ``|bias_exp| - |bias_ctl|``, units | negative: exp better | common | paired t and F |
585
+ +------------------------+------------------------------------------+----------------------+--------------+----------------+
586
+ | ``stdomp``, ``stdoma`` | ``100 (σ_exp - σ_ctl) / σ_ctl`` | negative: exp better | common | F |
587
+ +------------------------+------------------------------------------+----------------------+--------------+----------------+
588
+ | ``bcorr`` | ``100 (|bc_exp| - |bc_ctl|) / |bc_ctl|`` | positive: larger | all | none |
589
+ +------------------------+------------------------------------------+----------------------+--------------+----------------+
590
+ | ``obs`` | ``obs_exp - obs_ctl``, units | positive: higher | all | none |
591
+ +------------------------+------------------------------------------+----------------------+--------------+----------------+
592
+ | ``nobs``, ``dens`` | ``100 (N_exp - N_ctl) / N_ctl`` | positive: more obs | all | none |
593
+ +------------------------+------------------------------------------+----------------------+--------------+----------------+
594
594
 
595
595
  For the departures the question is whether the experience gets closer to
596
596
  zero, so the bias is compared in absolute value:
@@ -614,6 +614,15 @@ observations, a higher observed value or a larger correction are red.
614
614
  .. math::
615
615
 
616
616
  \Delta_{N} = 100\,\frac{N_{\mathrm{exp}} - N_{\mathrm{ctl}}}{N_{\mathrm{ctl}}}
617
+ \qquad
618
+ \Delta_{\mathrm{bcorr}} = 100\,\frac{\left|b_{\mathrm{exp}}\right|
619
+ - \left|b_{\mathrm{ctl}}\right|}
620
+ {\left|b_{\mathrm{ctl}}\right|}
621
+
622
+ The bias correction :math:`b` can be negative, so its size is compared. In
623
+ regions where the control barely corrects anything the percentage gets
624
+ large and saturates at ±100 %; read those boxes with the single-run
625
+ ``bcorr`` map at hand.
617
626
 
618
627
  Why not a percentage for the bias? It would divide by a control bias that
619
628
  is often close to zero: a box going from 0.01 K to 0.03 K is +200 % and
@@ -627,7 +636,7 @@ the last step a box takes the darkest colour.
627
636
  Three maps per comparison
628
637
  -------------------------
629
638
 
630
- For ``omp``, ``oma``, ``stdomp``, ``stdoma`` and ``bcorr`` every comparison
639
+ For ``omp``, ``oma``, ``stdomp`` and ``stdoma`` every comparison
631
640
  produces three maps, switched with the *Difference / Significance*
632
641
  selector of the viewer:
633
642
 
@@ -641,7 +650,8 @@ selector of the viewer:
641
650
  | ``significant only`` | ``..._sigonly.png`` | difference map, boxes above 95 % only |
642
651
  +----------------------+-------------------------+---------------------------------------+
643
652
 
644
- ``obs``, ``nobs`` and ``dens`` only have the difference map.
653
+ ``obs``, ``bcorr``, ``nobs`` and ``dens`` only have the difference map,
654
+ computed on all the observations of each run.
645
655
 
646
656
  **difference** shows every box:
647
657
 
@@ -652,7 +662,10 @@ selector of the viewer:
652
662
 
653
663
  **significance** shows how sure the test is, from 0 to 100 %. Grey boxes
654
664
  stay at or below 95 % (darker when closer), orange ones are above 95 % and
655
- red ones above 99 %; the thick line on the colour bar marks 95 %. The box at
665
+ red ones above 99 %; the thick line on the colour bar marks 95 %. For
666
+ ``omp`` and ``oma``, a crossed box (``xxx``) passed both tests but its bias
667
+ and spread moved in opposite directions, so it is not counted (see *Why omp
668
+ and oma need both tests*). The box at
656
669
  the top right recalls which test was run and counts the significant boxes:
657
670
 
658
671
  .. image:: _static/scatter_cmp_omp_significance.png
@@ -661,7 +674,8 @@ the top right recalls which test was run and counts the significant boxes:
661
674
  :width: 100%
662
675
 
663
676
  **significant only** is the difference map with the same colours and the
664
- same scale, where only the boxes above 95 % are drawn. It is usually the
677
+ same scale, where only the boxes that pass are drawn (for ``omp`` / ``oma``:
678
+ both tests, same direction). It is usually the
665
679
  one to show in a meeting:
666
680
 
667
681
  .. image:: _static/scatter_cmp_omp_sigonly.png
@@ -775,18 +789,108 @@ with :math:`p` two-sided and the confidence :math:`(1 - p) \times 100` as
775
789
  above. Because the same observation appears in both runs, O is the same and
776
790
  the difference only carries the change of the background; that is why the
777
791
  paired test sees small bias changes that an independent test would miss.
778
- ``bcorr`` uses the same test on the bias correction.
779
792
 
780
- An ``omp`` or ``oma`` box is significant only when **both** tests are
781
- above 95 %, and the significance map shows the lower of the two. On boxes of
782
- 10° or more the confidences are written in the box, e.g. ``t99 F97``. An
783
- experience that moves the bias without touching the spread therefore stays
784
- mostly non-significant on the ``omp`` map; its ``t`` value in the box shows
785
- it.
793
+ An ``omp`` or ``oma`` box counts only when **both** tests are above 95 %
794
+ **and** the bias and the spread moved in the same direction. The
795
+ significance map shows the lower of the two confidences, and on boxes of
796
+ 10° or more both are written in the box, e.g. ``t99 F97``. The next section
797
+ explains why both are needed.
798
+
799
+ Why omp and oma need both tests
800
+ -------------------------------
801
+
802
+ Think of the observation as the centre of a target, ``[O]``, and of each
803
+ O-B as a shot. The **t-test** looks at the aim: did the average shot move
804
+ closer to the centre, or further? The **F-test** looks at the hand: are the
805
+ shots more grouped, or more scattered?
806
+
807
+ Both tests are two-sided. Passing one means *this changed more than chance
808
+ allows*, in either direction; the sign of the change says which way. So a
809
+ box needs both tests above 95 %, and both changes pointing the same way.
810
+
811
+ **Case 1: better aim, shakier hand.** The experience brings the average
812
+ onto the centre, but its shots are all over the place.
813
+
814
+ .. code-block:: text
815
+
816
+ CONTROL EXPERIENCE
817
+ off-centre, grouped centred, scattered
818
+
819
+ E
820
+ CCC E
821
+ [O] CCC [O]
822
+ CCC E E
823
+ E
824
+
825
+ t-test: passes, the bias is smaller (better)
826
+ F-test: passes, the spread is larger (worse)
827
+
828
+ The average looks perfect, but the model lost its consistency. The two
829
+ changes disagree, so the box is **not drawn** on the significant-only map
830
+ and is crossed (``xxx``) on the significance map.
831
+
832
+ **Case 2: steady hand, wrong aim.** The experience groups its shots
833
+ beautifully, but the whole group has drifted away from the centre.
834
+
835
+ .. code-block:: text
836
+
837
+ CONTROL EXPERIENCE
838
+ centred, scattered grouped, off-centre
839
+
840
+ C
841
+ C C EEE
842
+ [O] [O] EEE
843
+ C C EEE
844
+ C
845
+
846
+ t-test: passes, the bias is larger (worse)
847
+ F-test: passes, the spread is smaller (better)
848
+
849
+ The spread went down, but a systematic error came in. Again the changes
850
+ disagree: **not drawn**, crossed on the significance map.
851
+
852
+ **Case 3: better on both.** The experience corrects the bias and tightens
853
+ the spread. This is the result you are looking for.
854
+
855
+ .. code-block:: text
856
+
857
+ CONTROL EXPERIENCE
858
+ off-centre and scattered centred and grouped
859
+
860
+ C
861
+ EEE
862
+ [O] E[O]E
863
+ C EEE
864
+ C
865
+
866
+ t-test: passes, the bias is smaller (better)
867
+ F-test: passes, the spread is smaller (better)
868
+
869
+ The box is drawn in **red** on the significant-only map and counted as
870
+ *better*.
871
+
872
+ **Case 4: worse on both.** The mirror image of case 3: the experience moves
873
+ away from the centre and scatters more. The box is drawn in **blue** and
874
+ counted as *worse*, which is just as useful to know.
875
+
876
+ A last case is the quiet one: the bias improves but the spread does not
877
+ change at all. The t-test passes, the F-test does not, and the box stays
878
+ out of the significant-only map. Its ``t`` value, written in the box on the
879
+ significance map, still shows that something moved.
880
+
881
+ In one line, for ``omp`` and ``oma``:
882
+
883
+ .. code-block:: text
884
+
885
+ drawn in red = bias better AND spread better, both above 95 %
886
+ drawn in blue = bias worse AND spread worse, both above 95 %
887
+ not drawn = anything else (crossed when both pass in opposite directions)
786
888
 
787
889
  Reading the tests
788
890
  -----------------
789
891
 
892
+ * ``stdomp`` and ``stdoma`` only look at the spread, so the F-test alone
893
+ decides there. Only ``omp`` and ``oma`` combine both.
790
894
  * The F-test treats the two runs as independent samples. With common
791
895
  observations they are strongly correlated, which makes the F-test
792
896
  cautious: a real change of the spread needs more observations to pass.
@@ -863,8 +967,8 @@ Live examples:
863
967
  The ``scatter_*.db`` files hold the per-box sums of each run (tables
864
968
  ``moyenne`` and ``stations``), the ``scatter_pair_*.db`` files the sums of
865
969
  the common observations (table ``pairs``, columns ``n_omp``, ``sx_omp``,
866
- ``sy_omp``, ``sxx_omp``, ``syy_omp``, ``sxy_omp`` and the same for ``oma``
867
- and ``bc``). Both can be queried with ``sqlite3``. ``PATHWORK/<family>``
970
+ ``sy_omp``, ``sxx_omp``, ``syy_omp``, ``sxy_omp`` and the same with
971
+ ``oma``). Both can be queried with ``sqlite3``. ``PATHWORK/<family>``
868
972
  is wiped at the start of every run that passes the input check.
869
973
 
870
974
  ----
@@ -889,7 +993,7 @@ is wiped at the start of every run that passes the input check.
889
993
  +-------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
890
994
  | ``WARNING: n/N ... tasks lost, KilledWorker`` | A worker ran out of memory. The other maps are still produced. Use fewer workers (``N_CPUS``) or explicit channels instead of ``join`` / ``all``. |
891
995
  +-------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
892
- | No *Difference / Significance* selector | Only with a control, and only for omp, oma, stdomp, stdoma, bcorr: pick one of them in *Function* (the page opens on the first function alphabetically). |
996
+ | No *Difference / Significance* selector | Only with a control, and only for omp, oma, stdomp, stdoma: pick one of them in *Function* (the page opens on the first function alphabetically). |
893
997
  +-------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
894
998
  | No bcorr maps | The family has no ``BIAS_CORR`` column (non-radiance); the log says so once. |
895
999
  +-------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -1002,7 +1106,7 @@ _NICE_PERCENTILE = 95 # the scale covers this percentile of |value|
1002
1106
 
1003
1107
  # Significance of a box difference: test confidence (1 - p) * 100 >= this.
1004
1108
  # omp/oma need both the t-test (bias) and the F-test (spread),
1005
- # stdomp/stdoma the F-test, bcorr the t-test; obs, nobs, dens: no test.
1109
+ # stdomp/stdoma the F-test; obs, bcorr, nobs, dens: no test.
1006
1110
  _MIN_CONFIDENCE = 95.0
1007
1111
 
1008
1112
  _WHITE_RGBA = (1.0, 1.0, 1.0, 1.0)
@@ -1012,20 +1116,20 @@ _WHITE_RGBA = (1.0, 1.0, 1.0, 1.0)
1012
1116
  PANEL_VALUE = 'difference'
1013
1117
  PANEL_CONF = 'significance'
1014
1118
  PANEL_SIGONLY = 'significant only'
1015
- _TESTED_FUNCS = ('omp', 'oma', 'stdomp', 'stdoma', 'bcorr')
1119
+ _TESTED_FUNCS = ('omp', 'oma', 'stdomp', 'stdoma')
1016
1120
  # Tested functions are compared on the observations common to both runs,
1017
1121
  # matched one by one; quantity of the pair table used by each function.
1018
1122
  _PAIR_Q = {'omp': 'omp', 'stdomp': 'omp',
1019
- 'oma': 'oma', 'stdoma': 'oma',
1020
- 'bcorr': 'bc'}
1021
- _PAIR_QUANTITIES = ('omp', 'oma', 'bc')
1123
+ 'oma': 'oma', 'stdoma': 'oma'}
1124
+ _PAIR_QUANTITIES = ('omp', 'oma')
1022
1125
  # Observation key used to match control and experience: same station,
1023
1126
  # date, time, position (1e-4 degree), vertical coordinate / channel and
1024
1127
  # variable (varno separates the variables of one report).
1025
1128
  _PAIR_KEY = ('k_stn', 'k_date', 'k_time', 'k_lat', 'k_lon',
1026
1129
  'k_vcoord', 'k_varno')
1027
1130
  # difference maps expressed in percent
1028
- _PERCENT_FUNCS = ('stdomp', 'stdoma', 'nobs', 'NOBSHDR', 'dens', 'dens%')
1131
+ _PERCENT_FUNCS = ('stdomp', 'stdoma', 'nobs', 'NOBSHDR', 'dens', 'dens%',
1132
+ 'bcorr')
1029
1133
 
1030
1134
  # Significance map: greys below the threshold, colours at/above it.
1031
1135
  _CONF_BOUNDS = (0, 50, 80, 90, 95, 99, 100)
@@ -2636,6 +2740,21 @@ def _paired_t_confidence(mx, my, vx, vy, cxy, N) -> np.ndarray:
2636
2740
  return conf
2637
2741
 
2638
2742
 
2743
+ def _both_tests(d_bias, d_spread, t_conf, f_conf):
2744
+ """omp / oma: a box counts only when the bias and the spread both changed
2745
+ significantly AND in the same direction (both better or both worse).
2746
+
2747
+ Returns (values, significant, confidences, kind); confidences also
2748
+ carries 'mixed', the boxes where both tests pass but the bias and the
2749
+ spread moved in opposite directions.
2750
+ """
2751
+ both = _is_significant(t_conf) & _is_significant(f_conf)
2752
+ same = np.sign(d_bias) == np.sign(d_spread)
2753
+ mixed = both & ~same
2754
+ return (d_bias, both & same,
2755
+ {'t': t_conf, 'F': f_conf, 'mixed': mixed}, 'improve')
2756
+
2757
+
2639
2758
  def _paired_metric(fonction: str, N, SX, SY, SXX, SYY, SXY
2640
2759
  ) -> Tuple[np.ndarray, np.ndarray,
2641
2760
  Dict[str, np.ndarray], str]:
@@ -2645,14 +2764,10 @@ def _paired_metric(fonction: str, N, SX, SY, SXX, SYY, SXY
2645
2764
  reference, as in saska40_v0_hs.py:
2646
2765
  omp/oma |bias_exp| - |bias_ref| (negative = better)
2647
2766
  stdomp/stdoma 100 (s_exp - s_ref) / s_ref (negative = better)
2648
- bcorr bias_corr_exp - bias_corr_ref
2649
2767
  Tests: F-test (saska) on the spread, paired t-test on the mean.
2650
2768
  """
2651
2769
  mx, my, vx, vy, cxy = _paired_moments(N, SX, SY, SXX, SYY, SXY)
2652
2770
  with np.errstate(divide='ignore', invalid='ignore'):
2653
- if fonction == 'bcorr':
2654
- t_conf = _paired_t_confidence(mx, my, vx, vy, cxy, N)
2655
- return my - mx, _is_significant(t_conf), {'t': t_conf}, 'change'
2656
2771
 
2657
2772
  s_ref = _sample_std(np.sqrt(vx), N)
2658
2773
  s_exp = _sample_std(np.sqrt(vy), N)
@@ -2664,8 +2779,7 @@ def _paired_metric(fonction: str, N, SX, SY, SXX, SYY, SXY
2664
2779
 
2665
2780
  t_conf = _paired_t_confidence(mx, my, vx, vy, cxy, N)
2666
2781
  values = np.abs(my) - np.abs(mx)
2667
- return (values, _is_significant(t_conf) & _is_significant(f_conf),
2668
- {'t': t_conf, 'F': f_conf}, 'improve')
2782
+ return _both_tests(values, s_exp - s_ref, t_conf, f_conf)
2669
2783
 
2670
2784
 
2671
2785
  def _diff_metric(fonction: str, avg1, avg2, std1, std2, bc1, bc2, n1, n2,
@@ -2687,10 +2801,11 @@ def _diff_metric(fonction: str, avg1, avg2, std1, std2, bc1, bc2, n1, n2,
2687
2801
  return avg2 - avg1, None, {}, 'change'
2688
2802
 
2689
2803
  if fonction == 'bcorr':
2690
- if bcs1 is None or bcs2 is None:
2691
- return bc2 - bc1, None, {}, 'change'
2692
- t_conf = _ttest_confidence(bc1, bcs1, n1, bc2, bcs2, n2)
2693
- return bc2 - bc1, _is_significant(t_conf), {'t': t_conf}, 'change'
2804
+ # like nobs: change in percent over all observations, no test;
2805
+ # magnitudes, since a correction can be negative
2806
+ b1, b2 = np.abs(bc1), np.abs(bc2)
2807
+ values = np.where(b1 > 0, (b2 - b1) / b1 * 100.0, np.nan)
2808
+ return values, None, {}, 'change'
2694
2809
 
2695
2810
  s_ref = _sample_std(std1, n1)
2696
2811
  s_exp = _sample_std(std2, n2)
@@ -2703,8 +2818,7 @@ def _diff_metric(fonction: str, avg1, avg2, std1, std2, bc1, bc2, n1, n2,
2703
2818
 
2704
2819
  t_conf = _ttest_confidence(avg1, std1, n1, avg2, std2, n2)
2705
2820
  values = np.abs(avg2) - np.abs(avg1)
2706
- return (values, _is_significant(t_conf) & _is_significant(f_conf),
2707
- {'t': t_conf, 'F': f_conf}, 'improve')
2821
+ return _both_tests(values, s_exp - s_ref, t_conf, f_conf)
2708
2822
 
2709
2823
 
2710
2824
  _CBAR_DIFF: Dict[str, str] = {
@@ -2717,7 +2831,8 @@ _CBAR_DIFF: Dict[str, str] = {
2717
2831
  'nobs': 'Nobs change [%], {exp} vs {ref}\nred = more observations',
2718
2832
  'dens': 'Density change [%], {exp} vs {ref}\nred = more observations',
2719
2833
  'obs': '{var} {exp} - {ref} {units}\nred = higher value',
2720
- 'bcorr': 'Bias corr. {exp} - {ref} {units}\nred = larger correction',
2834
+ 'bcorr': '|Bias corr.| change [%], ({exp} - {ref}) / {ref}\n'
2835
+ 'red = larger correction',
2721
2836
  }
2722
2837
  _CBAR_SINGLE: Dict[str, str] = {
2723
2838
  'dens': 'Density [obs/km²/day]',
@@ -2732,28 +2847,27 @@ _CBAR_SINGLE: Dict[str, str] = {
2732
2847
 
2733
2848
 
2734
2849
  _TEST_TEXT = {
2735
- 'omp': "t-test (bias O-B) + F-test (σ O-B)\nshown: the lower confidence",
2736
- 'oma': "t-test (bias O-A) + F-test (σ O-A)\nshown: the lower confidence",
2850
+ 'omp': "t-test (bias O-B) + F-test (σ O-B)\nboth > 95 %, same direction",
2851
+ 'oma': "t-test (bias O-A) + F-test (σ O-A)\nboth > 95 %, same direction",
2737
2852
  'stdomp': "F-test on σ(O-B), F = σ²big / σ²small",
2738
2853
  'stdoma': "F-test on σ(O-A), F = σ²big / σ²small",
2739
- 'bcorr': "Welch t-test on the mean bias corr.",
2740
2854
  }
2741
2855
 
2742
2856
 
2743
2857
  _TEST_TEXT_PAIRED = {
2744
- 'omp': "paired t-test (bias) + F-test (σ), O-B\n"
2745
- "of common obs, lower confidence shown",
2746
- 'oma': "paired t-test (bias) + F-test (σ), O-A\n"
2747
- "of common obs, lower confidence shown",
2858
+ 'omp': "paired t-test (bias) + F-test (σ)\n"
2859
+ "on O-B of common obs, both > 95 %, same direction",
2860
+ 'oma': "paired t-test (bias) + F-test (σ)\n"
2861
+ "on O-A of common obs, both > 95 %, same direction",
2748
2862
  'stdomp': "F-test on σ(O-B) of common obs,\nF = σ²big / σ²small",
2749
2863
  'stdoma': "F-test on σ(O-A) of common obs,\nF = σ²big / σ²small",
2750
- 'bcorr': "paired t-test on the bias corr., common obs",
2751
2864
  }
2752
2865
 
2753
2866
 
2754
2867
  def _info_text(panel, fonction, is_diff, kind, confs, values, diff_values,
2755
2868
  signif, in_axes, boundaries, on_map_obs, on_map_ref, n_days,
2756
- avg=None, std=None, n_black=0, n_pairs=None) -> str:
2869
+ avg=None, std=None, n_black=0, n_pairs=None,
2870
+ n_mixed=0) -> str:
2757
2871
  """Text of the box at the top right of a map."""
2758
2872
  if not is_diff:
2759
2873
  if fonction in ('dens', 'nobs'):
@@ -2786,6 +2900,9 @@ def _info_text(panel, fonction, is_diff, kind, confs, values, diff_values,
2786
2900
  n_wor = int((box & signif & (diff_values > 0)).sum())
2787
2901
  counts += f'\n{n_bet} better (red), {n_wor} worse (blue)'
2788
2902
 
2903
+ mixed_line = (f'\nmixed: {n_mixed} boxes, bias and σ changed\n'
2904
+ f'in opposite directions (not counted)'
2905
+ if n_mixed else '')
2789
2906
  black_line = (f'\nblack: {n_black} boxes not compared, no\n'
2790
2907
  + ('common observation in control and experience'
2791
2908
  if n_pairs is not None else
@@ -2795,17 +2912,19 @@ def _info_text(panel, fonction, is_diff, kind, confs, values, diff_values,
2795
2912
  if panel == PANEL_SIGONLY:
2796
2913
  return (f'Only boxes with confidence > {_MIN_CONFIDENCE:.0f} %\n'
2797
2914
  f'({tests.get(fonction, "").splitlines()[0]})\n'
2798
- f'{counts}\n{nobs_line}{black_line}')
2915
+ f'{counts}\n{nobs_line}{mixed_line}{black_line}')
2799
2916
 
2800
2917
  if panel == PANEL_CONF:
2801
2918
  return (f'{tests.get(fonction, "")}\n'
2802
2919
  f'(1 - p) x 100, > {_MIN_CONFIDENCE:.0f} % = significant\n'
2803
- f'{counts}\n{nobs_line}{black_line}')
2920
+ f'{counts}\n{nobs_line}'
2921
+ + (mixed_line.replace('boxes,', 'boxes (xxx),')
2922
+ if n_mixed else '') + black_line)
2804
2923
 
2805
2924
  text = nobs_line
2806
2925
  if confs:
2807
2926
  text += f'\n{counts.replace("boxes", f"boxes at {_MIN_CONFIDENCE:.0f} %")}'
2808
- return text + black_line
2927
+ return text + mixed_line + black_line
2809
2928
 
2810
2929
 
2811
2930
  def _render_tile_map(task: Dict[str, Any],
@@ -2957,6 +3076,10 @@ def _render_tile_map_impl(task: Dict[str, Any],
2957
3076
  if signif is None:
2958
3077
  signif = np.ones(len(values), dtype=bool)
2959
3078
 
3079
+ mixed = confs.pop('mixed', None) if confs else None
3080
+ if mixed is None:
3081
+ mixed = np.zeros(len(values), dtype=bool)
3082
+
2960
3083
  # combined confidence: the weakest test decides (omp/oma need both)
2961
3084
  conf = None
2962
3085
  if confs:
@@ -3038,6 +3161,7 @@ def _render_tile_map_impl(task: Dict[str, Any],
3038
3161
  on_map_ref = float(n1[in_axes].sum()) if is_diff else 0.0
3039
3162
 
3040
3163
  patches, patch_colors = [], []
3164
+ patches_mixed = []
3041
3165
  for i in np.flatnonzero(in_axes):
3042
3166
  if panel == PANEL_SIGONLY and not signif[i]:
3043
3167
  continue
@@ -3058,12 +3182,21 @@ def _render_tile_map_impl(task: Dict[str, Any],
3058
3182
  patches.append(plt.Polygon(
3059
3183
  _project_polygon(proj_obj, lat[i], lon[i], deltax, deltay, pc)))
3060
3184
  patch_colors.append(facecolors[i])
3185
+ if panel == PANEL_CONF and mixed[i]:
3186
+ patches_mixed.append(plt.Polygon(
3187
+ _project_polygon(proj_obj, lat[i], lon[i], deltax, deltay, pc)))
3061
3188
 
3062
3189
  if patches:
3063
3190
  ax.add_collection(PatchCollection(
3064
3191
  patches, facecolors=patch_colors,
3065
3192
  edgecolors='black', linewidths=0.2, alpha=ALPHA_TILES, zorder=4))
3066
3193
 
3194
+ if patches_mixed:
3195
+ # both tests pass, but bias and spread moved in opposite directions
3196
+ ax.add_collection(PatchCollection(
3197
+ patches_mixed, facecolors='none', edgecolors='#3a3a3a',
3198
+ linewidths=0.3, hatch='xxx', zorder=5))
3199
+
3067
3200
  if exclusive:
3068
3201
  ax.add_collection(PatchCollection(
3069
3202
  [plt.Polygon(_project_polygon(proj_obj, lt, ln, deltax, deltay, pc))
@@ -3132,7 +3265,8 @@ def _render_tile_map_impl(task: Dict[str, Any],
3132
3265
  avg if not is_diff else None,
3133
3266
  std if not is_diff else None,
3134
3267
  n_black=len(exclusive),
3135
- n_pairs=n_pairs_on_map)
3268
+ n_pairs=n_pairs_on_map,
3269
+ n_mixed=int((mixed & in_axes).sum()))
3136
3270
  # top right, next to the title block
3137
3271
  info_txt = ax.text(1.0, 1.02, textstr, transform=ax.transAxes,
3138
3272
  fontsize=11, ha='right', va='bottom',
@@ -3246,7 +3380,7 @@ _INTRO_DIFF = [
3246
3380
  "Each map compares one experience with the control, box by box, over "
3247
3381
  "{ds} to {de} ({bx}° x {by}° boxes). <b>These are not the same maps as "
3248
3382
  "the single-experience ones</b>: every value is experience minus control, "
3249
- "and for omp, oma, stdomp, stdoma and bcorr it is computed on the "
3383
+ "and for omp, oma, stdomp and stdoma it is computed on the "
3250
3384
  "observations common to both runs (same station, date, time, position, "
3251
3385
  "channel and variable).",
3252
3386
 
@@ -3255,18 +3389,24 @@ _INTRO_DIFF = [
3255
3389
  "σ control. For these four a <b>negative value is an improvement and is "
3256
3390
  "drawn in red</b>; positive values (experience worse) are blue. "
3257
3391
  "<b>nobs, dens</b>: change of the number of observations in percent, "
3258
- "red = more observations. <b>obs, bcorr</b>: experience - control, "
3392
+ "red = more observations. <b>bcorr</b>: change of the size of the bias "
3393
+ "correction in percent, red = larger correction. <b>obs</b>: experience "
3394
+ "- control, "
3259
3395
  "red = higher value.",
3260
3396
 
3261
3397
  "The <b>Difference / Significance</b> selector offers three maps for "
3262
- "omp, oma, stdomp, stdoma and bcorr. <b>difference</b> shows every box. "
3398
+ "omp, oma, stdomp and stdoma. <b>difference</b> shows every box. "
3263
3399
  "<b>significance</b> shows the confidence (1 - p) x 100 of the test in "
3264
3400
  "each box: grey up to 95 %, orange above 95 % and red above 99 %. "
3265
3401
  "<b>significant only</b> is the difference map where only the boxes "
3266
3402
  "above 95 % are drawn. The spread is tested with the F-test "
3267
- "F = σ²larger / σ²smaller, two-sided; the bias and bcorr with a paired "
3268
- "t-test; omp and oma need both, and the map shows the lower confidence. "
3269
- "obs, nobs and dens have no test; bcorr exists for radiances only.",
3403
+ "F = σ²larger / σ²smaller, two-sided; the bias with a paired "
3404
+ "t-test. omp and oma need both tests above 95 % and the bias and the "
3405
+ "spread moving the same way (both better: red, both worse: blue); when "
3406
+ "they move in opposite directions the box is crossed on the significance "
3407
+ "map and left out. The map shows the lower confidence. "
3408
+ "obs, bcorr, nobs and dens have no test; bcorr exists for radiances "
3409
+ "only.",
3270
3410
 
3271
3411
  "The scale is symmetric and adapts to each map (steps like 0.1, 0.2, 0.3, "
3272
3412
  "0.5, 1, 2); the step around zero is white. With thousands of boxes, "
@@ -46,7 +46,7 @@ CONTROL_NAME="Control"
46
46
  # Output directory. WARNING: wiped on each run to prevent ghost files.
47
47
  # Will contain one subdir per family with the .db files and .png maps,
48
48
  # plus an interactive HTML viewer at pikobs_scatter_viewer.html.
49
- PATHWORK="/home/dlo001/sites8/pikobs_scatter_exp"
49
+ PATHWORK="/home/dlo001/sites8/pikobs_scatter_exp2"
50
50
 
51
51
  # ---- Time window ---------------------------------------------------------
52
52
  # Processing window in YYYYMMDDHH format (UTC). Inclusive on both ends,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pikobs
3
- Version: 3.0.415
3
+ Version: 3.0.417
4
4
  Summary: pikobs
5
5
  Home-page: https://gitlab.science.gc.ca/dlo001/pikobs
6
6
  Author: David Lobon
pikobs-3.0.415/VERSION DELETED
@@ -1 +0,0 @@
1
- 3.0.415
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