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.
- {pikobs-3.0.415 → pikobs-3.0.417}/CHANGELOG.md +8 -0
- {pikobs-3.0.415/pikobs.egg-info → pikobs-3.0.417}/PKG-INFO +1 -1
- pikobs-3.0.417/VERSION +1 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/scatter/scatter.py +208 -68
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_scatter.sh +1 -1
- {pikobs-3.0.415 → pikobs-3.0.417/pikobs.egg-info}/PKG-INFO +1 -1
- pikobs-3.0.415/VERSION +0 -1
- {pikobs-3.0.415 → pikobs-3.0.417}/.gitignore +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/MANIFEST.in +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/README.md +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/clear.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/conda_build/pikobs/activate.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/conda_build/pikobs/build.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/conda_build/pikobs/meta.yaml +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/conda_build/pikobs/pikobs.yml +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/Makefile +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/make.bat +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/cardio.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/conf.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/families.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/flag.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/flags_criteria.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/histogram.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/index.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/mapobs.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/obscountdb.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/obstimedb.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/pikobsburp2rdb.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/profile.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/profile_ft.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/profile_ft2.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/projection.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/region.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/scatter.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/spatial.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/timeserie.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/unittest.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/varno.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/vdedr.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/docs/source/zone.rst +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/env/.mambarc +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/env/conda-meta/history +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/env/etc/aau_token +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/__not_used/plot_proj.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/__not_used/vdedr2.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/__not_used/vdedr3.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/cardio/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/cardio/cardio.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/cardio/cardio_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/cardio/cardio_plot_old.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/delete_folder.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/families.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/familyobs.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/flags_criteria.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/regionsobs.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/special_family.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/type_boxes.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/type_projection.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/configobs/type_varno.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/extension/color_mapping.json +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/extension/libudfsqlite-shared.so +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_count.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_plot0.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_plot3.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/flags_plotv2.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo2.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo3.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo4.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo5.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo7.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo8.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/flags/plotpo9.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/histogram/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/histogram/histogram.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/histogram/histogram_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/mapobs/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/mapobs/color.j +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/mapobs/mapobs.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscountdb/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscountdb/obscountdb.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscountdb/obscountdb_old.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscountdb/obscountdb_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscutoff/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscutoff/obscutoff.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obscutoff/obscutoff_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obstimedb/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obstimedb/obstimedb.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/obstimedb/obstimedb_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/pbs_submit/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/pbs_submit/pbs_submit.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/pikobsburp2rdb/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/pikobsburp2rdb/pikobsburp2rdb.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/profile/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/profile/profile.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/profile/profile_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps/progps.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps/progps_old.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps2/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/progps2/progps2.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/scatter/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/remove.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/remove2.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_2exp.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_cardio.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_cardio_lco.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_cardio_sky.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_flag.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_histogra.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_mapobs.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_obscountdb.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_obscountdb_1.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_obstimedb.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_pikobsburp2rdb.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile_1.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile_ra.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile_radar.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_profile_s.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_progps.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_progps2.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_scatter_diff.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_scatter_one.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_scatter_two_sw.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_spatial.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_timeserie.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_timeserie_radar.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_vdedr.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/run_zone2.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/setup_pikobs.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/script/setup_pikobs.sh.1 +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/spatial/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/spatial/spatial.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/spatial/spatial_core.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/timeserie/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/timeserie/timeserie.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/timeserie/timeserie_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/unittestpikobs/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/unittestpikobs/test_pikobs.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/unittestpikobs/unittest_timeserie.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/vdedr/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/vdedr/vdedr.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/vdedr/vdedr_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/web/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/web/viewer.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/zone/__init__.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/zone/zone.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs/zone/zone_plot.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs.egg-info/SOURCES.txt +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs.egg-info/dependency_links.txt +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs.egg-info/requires.txt +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs.egg-info/top_level.txt +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs_env.yml +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/pikobs_env2.yml +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/publique.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/publique.txt +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/readme/flag_criteria.md +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/readme/geographic.md +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/readme/read_projection.md +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/readme/readme_cardiograme.md +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/readme/readme_scatter.md +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/setup.cfg +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/setup.py +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/setup_pikobs.sh +0 -0
- {pikobs-3.0.415 → pikobs-3.0.417}/setup_pikobs.sh.1 +0 -0
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
|
-
|
|
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
|
|
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
|
|
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)
|
|
583
|
-
|
|
584
|
-
| ``omp``, ``oma`` | ``|bias_exp| - |bias_ctl|``, units
|
|
585
|
-
|
|
586
|
-
| ``stdomp``, ``stdoma`` | ``100 (σ_exp - σ_ctl) / σ_ctl``
|
|
587
|
-
|
|
588
|
-
| ``bcorr`` | ``
|
|
589
|
-
|
|
590
|
-
| ``obs`` | ``obs_exp - obs_ctl``, units
|
|
591
|
-
|
|
592
|
-
| ``nobs``, ``dens`` | ``100 (N_exp - N_ctl) / N_ctl``
|
|
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
|
|
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 %.
|
|
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
|
|
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
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
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
|
|
867
|
-
|
|
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
|
|
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
|
|
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'
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
2691
|
-
|
|
2692
|
-
|
|
2693
|
-
|
|
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,
|
|
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
|
|
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)\
|
|
2736
|
-
'oma': "t-test (bias O-A) + F-test (σ O-A)\
|
|
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 (σ)
|
|
2745
|
-
"of common obs,
|
|
2746
|
-
'oma': "paired t-test (bias) + F-test (σ)
|
|
2747
|
-
"of common obs,
|
|
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
|
|
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}
|
|
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
|
|
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>
|
|
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
|
|
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
|
|
3268
|
-
"t-test
|
|
3269
|
-
"
|
|
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/
|
|
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,
|
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
|
|
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
|