Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CDAT Migration Phase 2: Regression testing for lat_lon, lat_lon_land, and lat_lon_river #744

Merged

Conversation

tomvothecoder
Copy link
Collaborator

@tomvothecoder tomvothecoder commented Oct 16, 2023

Todo List

  • Add Makefile that simplifies common development commands (building and installing, testing, etc.)
  • Write unit tests to cover all new code for utility functions
    • dataset_xr.py, metrics.py, climo_xr.py, io.py, regrid.py
  • Metrics comparison for cdat-migration-fy24 lat_lon and main branch of lat_lon -- NET_FLUX_SRF and RESTOM have the highest spatial average diffs
  • Test run with 3D variables (_run_3d_diags())
    • Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with from __future__ import annotations still
    • Fix subsetting syntax bug using ilev
    • Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
    • Fix accidentally calling save plots and metrics twice in _get_metrics_by_region()
  • Fix failing integration tests pass in CI/CD
    • Refactor test_diags.py -- replace unittest with pytest
    • Refactor test_all_sets.py -- replace unittest with pytest
    • Test climatology datasets -- tested with 3d variables using test_all_sets.py

Later Items

  • Fix failing integration tests locally -- some diff tests break locally but not in CI/CD.
(cdat-migration-fy24-nompi) vo13@login38:/global/u2/v/vo13/E3SM-Project/e3sm_diags> pytest tests/integration/test_diags.py
=================================================================== test session starts ====================================================================
platform linux -- Python 3.10.12, pytest-7.4.2, pluggy-1.3.0
rootdir: /global/u2/v/vo13/E3SM-Project/e3sm_diags
configfile: pyproject.toml
plugins: cov-4.1.0
collected 18 items

tests/integration/test_diags.py
Running tests, please wait for log output.
2023-10-23 10:50:34,858 [INFO]: run.py(_add_parent_attrs_to_children:156) >> []
2023-10-23 10:50:34,859 [INFO]: run.py(_add_parent_attrs_to_children:156) >> []
2023-10-23 10:50:34,859 [INFO]: run.py(_add_parent_attrs_to_children:156) >> []
2023-10-23 10:50:35,865 [INFO]: area_mean_time_series_parameter.py(check_values:33) >> You have no value for ref_names. Calculate test data only
2023-10-23 10:50:39,572 [INFO]: e3sm_diags_driver.py(_save_env_yml:57) >> Saved environment yml file to: tests/integration/all_sets_results_test/prov/environment.yml
2023-10-23 10:50:39,572 [INFO]: e3sm_diags_driver.py(_save_parameter_files:68) >> Saved command used to: tests/integration/all_sets_results_test/prov/cmd_used.txt
2023-10-23 10:50:39,574 [INFO]: e3sm_diags_driver.py(_save_parameter_files:98) >> Saved cfg file to: tests/integration/all_sets_results_test/prov/all_sets.cfg
2023-10-23 10:50:39,575 [INFO]: e3sm_diags_driver.py(_save_python_script:132) >> Saved Python script to: tests/integration/all_sets_results_test/prov/all_sets.py
2023-10-23 10:50:39,599 [INFO]: zonal_mean_xy_driver.py(run_diag:117) >> Variable: T
2023-10-23 10:50:39,894 [INFO]: zonal_mean_xy_driver.py(run_diag:163) >> Selected pressure level: [200.0]
2023-10-23 10:50:41,827 [INFO]: zonal_mean_xy_driver.py(run_diag:178) >> Selected region: global
2023-10-23 10:50:42,222 [INFO]: zonal_mean_xy_plot.py(plot:108) >> Plot saved in: tests/integration/all_sets_results_test/zonal_mean_xy/ERA-Interim/ERA-Interim-T-200-ANN-global.png
2023-10-23 10:50:42,222 [INFO]: zonal_mean_xy_plot.py(plot:108) >> Plot saved in: tests/integration/all_sets_results_test/zonal_mean_xy/ERA-Interim/ERA-Interim-T-200-ANN-global.png
2023-10-23 10:50:42,250 [INFO]: zonal_mean_2d_driver.py(run_diag:101) >> Variable: T
2023-10-23 10:50:42,446 [INFO]: zonal_mean_2d_driver.py(run_diag:153) >> Selected pressure level: [200.0, 300.0]
2023-10-23 10:50:48,149 [INFO]: zonal_mean_2d_plot.py(plot:263) >> Plot saved in: tests/integration/all_sets_results_test/zonal_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png
2023-10-23 10:50:48,149 [INFO]: zonal_mean_2d_plot.py(plot:263) >> Plot saved in: tests/integration/all_sets_results_test/zonal_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png
2023-10-23 10:50:48,167 [INFO]: meridional_mean_2d_driver.py(run_diag:94) >> Variable: T
2023-10-23 10:50:51,416 [INFO]: meridional_mean_2d_plot.py(plot:241) >> Plot saved in: tests/integration/all_sets_results_test/meridional_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png
2023-10-23 10:50:51,416 [INFO]: meridional_mean_2d_plot.py(plot:241) >> Plot saved in: tests/integration/all_sets_results_test/meridional_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png
2023-10-23 10:50:52,791 [INFO]: lat_lon_driver.py(run_diag:71) >> Variable: T
2023-10-23 10:50:52,897 [WARNING]: dataset_xr.py(_get_land_sea_mask:976) >> Variable 'LANDFRAC' was not in the file 'tests/integration/integration_test_data/T_20161118.beta0.FC5COSP.ne30_ne30.edison_ANN_climo.nc', nor was it defined in the derived variables dictionary.. Using default land sea mask located at `/global/homes/v/vo13/mambaforge/envs/cdat-migration-fy24-nompi/share/e3sm_diags/acme_ne30_ocean_land_mask.nc`.
2023-10-23 10:50:53,021 [INFO]: lat_lon_driver.py(_run_diags_3d:239) >> Selected pressure level(s): [850.0]
2023-10-23 10:50:54,177 [INFO]: lat_lon_driver.py(_get_metrics_by_region:355) >> Selected region: CONUS_RRM
2023-10-23 10:50:56,022 [INFO]: lat_lon_driver.py(_save_data_metrics_and_plots:564) >> Metrics saved in tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-CONUS_RRM.json
2023-10-23 10:50:57,763 [INFO]: utils.py(_save_plot:63) >> Plot saved in: tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-CONUS_RRM.png
2023-10-23 10:50:57,763 [INFO]: utils.py(_save_plot:63) >> Plot saved in: tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-CONUS_RRM.png
2023-10-23 10:50:57,764 [INFO]: lat_lon_driver.py(run_diag:71) >> Variable: T
2023-10-23 10:50:57,797 [WARNING]: dataset_xr.py(_get_land_sea_mask:976) >> Variable 'LANDFRAC' was not in the file 'tests/integration/integration_test_data/T_20161118.beta0.FC5COSP.ne30_ne30.edison_ANN_climo.nc', nor was it defined in the derived variables dictionary.. Using default land sea mask located at `/global/homes/v/vo13/mambaforge/envs/cdat-migration-fy24-nompi/share/e3sm_diags/acme_ne30_ocean_land_mask.nc`.
2023-10-23 10:50:57,895 [INFO]: lat_lon_driver.py(_run_diags_3d:239) >> Selected pressure level(s): [850.0]
2023-10-23 10:50:59,044 [INFO]: lat_lon_driver.py(_get_metrics_by_region:355) >> Selected region: global
2023-10-23 10:51:03,679 [INFO]: lat_lon_driver.py(_save_data_metrics_and_plots:564) >> Metrics saved in tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-global.json
2023-10-23 10:51:06,035 [INFO]: utils.py(_save_plot:63) >> Plot saved in: tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-global.png
2023-10-23 10:51:06,035 [INFO]: utils.py(_save_plot:63) >> Plot saved in: tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-global.png
2023-10-23 10:51:06,063 [INFO]: polar_driver.py(run_diag:79) >> Variable: T
2023-10-23 10:51:06,166 [INFO]: polar_driver.py(run_diag:125) >> Selected pressure level: [850.0]
2023-10-23 10:51:07,611 [INFO]: polar_driver.py(run_diag:140) >> Selected region: polar_S
2023-10-23 10:51:10,519 [INFO]: polar_plot.py(plot:248) >> Plot saved in: tests/integration/all_sets_results_test/polar/ERA-Interim/ERA-Interim-T-850-ANN-polar_S.png
2023-10-23 10:51:10,519 [INFO]: polar_plot.py(plot:248) >> Plot saved in: tests/integration/all_sets_results_test/polar/ERA-Interim/ERA-Interim-T-850-ANN-polar_S.png
2023-10-23 10:51:10,522 [INFO]: area_mean_time_series_driver.py(run_diag:62) >> Variable: TREFHT
2023-10-23 10:51:10,531 [INFO]: area_mean_time_series_driver.py(run_diag:77) >> Selected region: global
2023-10-23 10:51:10,562 [INFO]: area_mean_time_series_driver.py(run_diag:80) >> Start and end time for selected time slices for test data: 2012-1-16 12:0:0.0 2013-12-16 12:0:0.0
2023-10-23 10:51:10,828 [INFO]: area_mean_time_series_plot.py(plot:114) >> Plot saved in: tests/integration/all_sets_results_test/area_mean_time_series/TREFHT.png
2023-10-23 10:51:10,828 [INFO]: area_mean_time_series_plot.py(plot:114) >> Plot saved in: tests/integration/all_sets_results_test/area_mean_time_series/TREFHT.png
2023-10-23 10:51:10,859 [INFO]: cosp_histogram_driver.py(run_diag:78) >> Variable: COSP_HISTOGRAM_MISR
2023-10-23 10:51:11,112 [INFO]: cosp_histogram_driver.py(run_diag:91) >> Selected region: global
2023-10-23 10:51:12,353 [INFO]: cosp_histogram_plot.py(plot:237) >> Plot saved in: tests/integration/all_sets_results_test/cosp_histogram/MISR-COSP/MISRCOSP-COSP_HISTOGRAM_MISR-ANN-global.png
2023-10-23 10:51:12,353 [INFO]: cosp_histogram_plot.py(plot:237) >> Plot saved in: tests/integration/all_sets_results_test/cosp_histogram/MISR-COSP/MISRCOSP-COSP_HISTOGRAM_MISR-ANN-global.png
2023-10-23 10:51:12,362 [INFO]: enso_diags_driver.py(run_diag_map:201) >> run_type: model_vs_obs
2023-10-23 10:51:12,365 [INFO]: enso_diags_driver.py(calculate_nino_index_model:82) >> Handling the following exception by looking for surface temperature: Neither does SST nor the variables in [('sst',), ('TS', 'OCNFRAC'), ('SST',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:12,366 [INFO]: enso_diags_driver.py(calculate_nino_index_model:101) >> Handling the following exception by trying built-in HadISST nino index time series: Neither does TS nor the variables in [('ts',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:12,367 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.255 -0.105 -0.17  -0.105  0.05   0.23   0.36   0.475  0.265  0.235
  0.17  -0.025  0.255  0.105  0.17   0.105 -0.05  -0.23  -0.36  -0.475
 -0.265 -0.235 -0.17   0.025]
2023-10-23 10:51:12,367 [INFO]: enso_diags_driver.py(calculate_nino_index_model:110) >> Simulated surface temperature not found, using built-in HadISST nino index time series instead.
2023-10-23 10:51:12,367 [INFO]: enso_diags_driver.py(calculate_nino_index_model:115) >> nino_index_model [-0.255 -0.105 -0.17  -0.105  0.05   0.23   0.36   0.475  0.265  0.235
  0.17  -0.025  0.255  0.105  0.17   0.105 -0.05  -0.23  -0.36  -0.475
 -0.265 -0.235 -0.17   0.025]
2023-10-23 10:51:12,368 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.255 -0.105 -0.17  -0.105  0.05   0.23   0.36   0.475  0.265  0.235
  0.17  -0.025  0.255  0.105  0.17   0.105 -0.05  -0.23  -0.36  -0.475
 -0.265 -0.235 -0.17   0.025]
2023-10-23 10:51:12,368 [INFO]: enso_diags_driver.py(run_diag_map:221) >> Season: ANN
2023-10-23 10:51:12,378 [INFO]: enso_diags_driver.py(run_diag_map:244) >> Variable: TREFHT
2023-10-23 10:51:12,378 [INFO]: enso_diags_driver.py(run_diag_map:249) >> Selected region: 20S20N
2023-10-23 10:51:12,410 [INFO]: enso_diags_driver.py(perform_regression:130) >> domain.shape: (24, 29, 256)
2023-10-23 10:51:12,591 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 0
2023-10-23 10:51:12,750 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 1
2023-10-23 10:51:12,900 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 2
2023-10-23 10:51:13,058 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 3
2023-10-23 10:51:13,218 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 4
2023-10-23 10:51:13,378 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 5
2023-10-23 10:51:13,536 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 6
2023-10-23 10:51:13,695 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 7
2023-10-23 10:51:13,855 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 8
2023-10-23 10:51:14,015 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 9
2023-10-23 10:51:14,174 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 10
2023-10-23 10:51:14,335 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 11
2023-10-23 10:51:14,501 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 12
2023-10-23 10:51:14,660 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 13
2023-10-23 10:51:14,820 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 14
2023-10-23 10:51:14,980 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 15
2023-10-23 10:51:15,140 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 16
2023-10-23 10:51:15,300 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 17
2023-10-23 10:51:15,460 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 18
2023-10-23 10:51:15,620 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 19
2023-10-23 10:51:15,781 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 20
2023-10-23 10:51:15,940 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 21
2023-10-23 10:51:16,101 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 22
2023-10-23 10:51:16,260 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 23
2023-10-23 10:51:16,419 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 24
2023-10-23 10:51:16,579 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 25
2023-10-23 10:51:16,739 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 26
2023-10-23 10:51:16,898 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 27
2023-10-23 10:51:17,058 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 28
2023-10-23 10:51:17,217 [INFO]: enso_diags_driver.py(perform_regression:161) >> confidence in fn: (29, 256)
2023-10-23 10:51:17,217 [INFO]: enso_diags_driver.py(perform_regression:165) >> reg_coe.shape: (29, 256)
2023-10-23 10:51:17,251 [INFO]: enso_diags_driver.py(perform_regression:130) >> domain.shape: (24, 29, 256)
2023-10-23 10:51:17,431 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 0
2023-10-23 10:51:17,589 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 1
2023-10-23 10:51:17,746 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 2
2023-10-23 10:51:17,904 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 3
2023-10-23 10:51:18,063 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 4
2023-10-23 10:51:18,222 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 5
2023-10-23 10:51:18,380 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 6
2023-10-23 10:51:18,540 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 7
2023-10-23 10:51:18,699 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 8
2023-10-23 10:51:18,858 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 9
2023-10-23 10:51:19,017 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 10
2023-10-23 10:51:19,176 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 11
2023-10-23 10:51:19,335 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 12
2023-10-23 10:51:19,494 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 13
2023-10-23 10:51:19,652 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 14
2023-10-23 10:51:19,811 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 15
2023-10-23 10:51:19,970 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 16
2023-10-23 10:51:20,128 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 17
2023-10-23 10:51:20,287 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 18
2023-10-23 10:51:20,445 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 19
2023-10-23 10:51:20,604 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 20
2023-10-23 10:51:20,763 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 21
2023-10-23 10:51:20,922 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 22
2023-10-23 10:51:21,082 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 23
2023-10-23 10:51:21,240 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 24
2023-10-23 10:51:21,400 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 25
2023-10-23 10:51:21,558 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 26
2023-10-23 10:51:21,717 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 27
2023-10-23 10:51:21,875 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 28
2023-10-23 10:51:22,033 [INFO]: enso_diags_driver.py(perform_regression:161) >> confidence in fn: (29, 256)
2023-10-23 10:51:22,034 [INFO]: enso_diags_driver.py(perform_regression:165) >> reg_coe.shape: (29, 256)
2023-10-23 10:51:22,296 [INFO]: enso_diags_driver.py(run_diag_map:366) >> Metrics saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map/regression-coefficient-trefht-over-nino34.json
2023-10-23 10:51:23,493 [INFO]: enso_diags_plot.py(plot_map:301) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map
2023-10-23 10:51:23,493 [INFO]: enso_diags_plot.py(plot_map:301) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map
2023-10-23 10:51:23,493 [INFO]: enso_diags_plot.py(plot_map:306) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map
2023-10-23 10:51:23,493 [INFO]: enso_diags_plot.py(plot_map:306) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map
2023-10-23 10:51:24,692 [INFO]: enso_diags_plot.py(plot_map:321) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:51:24,692 [INFO]: enso_diags_plot.py(plot_map:321) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:51:24,692 [INFO]: enso_diags_driver.py(run_diag_map:201) >> run_type: model_vs_obs
2023-10-23 10:51:24,694 [INFO]: enso_diags_driver.py(calculate_nino_index_model:82) >> Handling the following exception by looking for surface temperature: Neither does SST nor the variables in [('sst',), ('TS', 'OCNFRAC'), ('SST',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:24,695 [INFO]: enso_diags_driver.py(calculate_nino_index_model:101) >> Handling the following exception by trying built-in HadISST nino index time series: Neither does TS nor the variables in [('ts',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:24,696 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.255 -0.105 -0.17  -0.105  0.05   0.23   0.36   0.475  0.265  0.235
  0.17  -0.025  0.255  0.105  0.17   0.105 -0.05  -0.23  -0.36  -0.475
 -0.265 -0.235 -0.17   0.025]
2023-10-23 10:51:24,696 [INFO]: enso_diags_driver.py(calculate_nino_index_model:110) >> Simulated surface temperature not found, using built-in HadISST nino index time series instead.
2023-10-23 10:51:24,696 [INFO]: enso_diags_driver.py(calculate_nino_index_model:115) >> nino_index_model [-0.255 -0.105 -0.17  -0.105  0.05   0.23   0.36   0.475  0.265  0.235
  0.17  -0.025  0.255  0.105  0.17   0.105 -0.05  -0.23  -0.36  -0.475
 -0.265 -0.235 -0.17   0.025]
2023-10-23 10:51:24,697 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.255 -0.105 -0.17  -0.105  0.05   0.23   0.36   0.475  0.265  0.235
  0.17  -0.025  0.255  0.105  0.17   0.105 -0.05  -0.23  -0.36  -0.475
 -0.265 -0.235 -0.17   0.025]
2023-10-23 10:51:24,697 [INFO]: enso_diags_driver.py(run_diag_map:221) >> Season: ANN
2023-10-23 10:51:24,706 [INFO]: enso_diags_driver.py(run_diag_map:244) >> Variable: TREFHT
2023-10-23 10:51:24,707 [INFO]: enso_diags_driver.py(run_diag_map:249) >> Selected region: 20S20N
2023-10-23 10:51:24,738 [INFO]: enso_diags_driver.py(perform_regression:130) >> domain.shape: (24, 29, 256)
2023-10-23 10:51:24,919 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 0
2023-10-23 10:51:25,078 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 1
2023-10-23 10:51:25,237 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 2
2023-10-23 10:51:25,396 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 3
2023-10-23 10:51:25,555 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 4
2023-10-23 10:51:25,715 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 5
2023-10-23 10:51:25,875 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 6
2023-10-23 10:51:26,035 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 7
2023-10-23 10:51:26,194 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 8
2023-10-23 10:51:26,354 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 9
2023-10-23 10:51:26,514 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 10
2023-10-23 10:51:26,674 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 11
2023-10-23 10:51:26,833 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 12
2023-10-23 10:51:26,992 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 13
2023-10-23 10:51:27,151 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 14
2023-10-23 10:51:27,310 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 15
2023-10-23 10:51:27,469 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 16
2023-10-23 10:51:27,628 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 17
2023-10-23 10:51:27,787 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 18
2023-10-23 10:51:27,947 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 19
2023-10-23 10:51:28,104 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 20
2023-10-23 10:51:28,263 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 21
2023-10-23 10:51:28,422 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 22
2023-10-23 10:51:28,581 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 23
2023-10-23 10:51:28,739 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 24
2023-10-23 10:51:28,898 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 25
2023-10-23 10:51:29,055 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 26
2023-10-23 10:51:29,213 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 27
2023-10-23 10:51:29,372 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 28
2023-10-23 10:51:29,531 [INFO]: enso_diags_driver.py(perform_regression:161) >> confidence in fn: (29, 256)
2023-10-23 10:51:29,531 [INFO]: enso_diags_driver.py(perform_regression:165) >> reg_coe.shape: (29, 256)
2023-10-23 10:51:29,563 [INFO]: enso_diags_driver.py(perform_regression:130) >> domain.shape: (24, 29, 256)
2023-10-23 10:51:29,743 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 0
2023-10-23 10:51:29,901 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 1
2023-10-23 10:51:30,058 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 2
2023-10-23 10:51:30,216 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 3
2023-10-23 10:51:30,374 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 4
2023-10-23 10:51:30,532 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 5
2023-10-23 10:51:30,689 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 6
2023-10-23 10:51:30,847 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 7
2023-10-23 10:51:31,004 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 8
2023-10-23 10:51:31,163 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 9
2023-10-23 10:51:31,322 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 10
2023-10-23 10:51:31,481 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 11
2023-10-23 10:51:31,639 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 12
2023-10-23 10:51:31,797 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 13
2023-10-23 10:51:31,955 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 14
2023-10-23 10:51:32,113 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 15
2023-10-23 10:51:32,270 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 16
2023-10-23 10:51:32,428 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 17
2023-10-23 10:51:32,588 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 18
2023-10-23 10:51:32,747 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 19
2023-10-23 10:51:32,906 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 20
2023-10-23 10:51:33,066 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 21
2023-10-23 10:51:33,225 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 22
2023-10-23 10:51:33,385 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 23
2023-10-23 10:51:33,543 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 24
2023-10-23 10:51:33,702 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 25
2023-10-23 10:51:33,862 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 26
2023-10-23 10:51:34,015 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 27
2023-10-23 10:51:34,174 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 28
2023-10-23 10:51:34,334 [INFO]: enso_diags_driver.py(perform_regression:161) >> confidence in fn: (29, 256)
2023-10-23 10:51:34,334 [INFO]: enso_diags_driver.py(perform_regression:165) >> reg_coe.shape: (29, 256)
2023-10-23 10:51:34,596 [INFO]: enso_diags_driver.py(run_diag_map:366) >> Metrics saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-start-yrs/regression-coefficient-trefht-over-nino34.json
2023-10-23 10:51:35,610 [INFO]: enso_diags_plot.py(plot_map:301) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-start-yrs
2023-10-23 10:51:35,610 [INFO]: enso_diags_plot.py(plot_map:301) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-start-yrs
2023-10-23 10:51:35,610 [INFO]: enso_diags_plot.py(plot_map:306) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-start-yrs
2023-10-23 10:51:35,610 [INFO]: enso_diags_plot.py(plot_map:306) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-start-yrs
2023-10-23 10:51:36,361 [INFO]: enso_diags_plot.py(plot_map:321) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-start-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:51:36,361 [INFO]: enso_diags_plot.py(plot_map:321) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-start-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:51:36,361 [INFO]: enso_diags_driver.py(run_diag_map:201) >> run_type: model_vs_obs
2023-10-23 10:51:36,363 [INFO]: enso_diags_driver.py(calculate_nino_index_model:82) >> Handling the following exception by looking for surface temperature: Neither does SST nor the variables in [('sst',), ('TS', 'OCNFRAC'), ('SST',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:36,364 [INFO]: enso_diags_driver.py(calculate_nino_index_model:101) >> Handling the following exception by trying built-in HadISST nino index time series: Neither does TS nor the variables in [('ts',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:36,365 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.255 -0.105 -0.17  -0.105  0.05   0.23   0.36   0.475  0.265  0.235
  0.17  -0.025  0.255  0.105  0.17   0.105 -0.05  -0.23  -0.36  -0.475
 -0.265 -0.235 -0.17   0.025]
2023-10-23 10:51:36,365 [INFO]: enso_diags_driver.py(calculate_nino_index_model:110) >> Simulated surface temperature not found, using built-in HadISST nino index time series instead.
2023-10-23 10:51:36,366 [INFO]: enso_diags_driver.py(calculate_nino_index_model:115) >> nino_index_model [-0.255 -0.105 -0.17  -0.105  0.05   0.23   0.36   0.475  0.265  0.235
  0.17  -0.025  0.255  0.105  0.17   0.105 -0.05  -0.23  -0.36  -0.475
 -0.265 -0.235 -0.17   0.025]
2023-10-23 10:51:36,367 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.255 -0.105 -0.17  -0.105  0.05   0.23   0.36   0.475  0.265  0.235
  0.17  -0.025  0.255  0.105  0.17   0.105 -0.05  -0.23  -0.36  -0.475
 -0.265 -0.235 -0.17   0.025]
2023-10-23 10:51:36,367 [INFO]: enso_diags_driver.py(run_diag_map:221) >> Season: ANN
2023-10-23 10:51:36,376 [INFO]: enso_diags_driver.py(run_diag_map:244) >> Variable: TREFHT
2023-10-23 10:51:36,376 [INFO]: enso_diags_driver.py(run_diag_map:249) >> Selected region: 20S20N
2023-10-23 10:51:36,408 [INFO]: enso_diags_driver.py(perform_regression:130) >> domain.shape: (24, 29, 256)
2023-10-23 10:51:36,587 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 0
2023-10-23 10:51:36,743 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 1
2023-10-23 10:51:36,902 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 2
2023-10-23 10:51:37,060 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 3
2023-10-23 10:51:37,219 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 4
2023-10-23 10:51:37,378 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 5
2023-10-23 10:51:37,537 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 6
2023-10-23 10:51:37,696 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 7
2023-10-23 10:51:37,855 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 8
2023-10-23 10:51:38,013 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 9
2023-10-23 10:51:38,170 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 10
2023-10-23 10:51:38,329 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 11
2023-10-23 10:51:38,490 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 12
2023-10-23 10:51:38,650 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 13
2023-10-23 10:51:38,810 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 14
2023-10-23 10:51:38,971 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 15
2023-10-23 10:51:39,131 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 16
2023-10-23 10:51:39,291 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 17
2023-10-23 10:51:39,450 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 18
2023-10-23 10:51:39,609 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 19
2023-10-23 10:51:39,769 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 20
2023-10-23 10:51:39,929 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 21
2023-10-23 10:51:40,087 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 22
2023-10-23 10:51:40,246 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 23
2023-10-23 10:51:40,406 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 24
2023-10-23 10:51:40,567 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 25
2023-10-23 10:51:40,727 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 26
2023-10-23 10:51:40,888 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 27
2023-10-23 10:51:41,048 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 28
2023-10-23 10:51:41,209 [INFO]: enso_diags_driver.py(perform_regression:161) >> confidence in fn: (29, 256)
2023-10-23 10:51:41,209 [INFO]: enso_diags_driver.py(perform_regression:165) >> reg_coe.shape: (29, 256)
2023-10-23 10:51:41,241 [INFO]: enso_diags_driver.py(perform_regression:130) >> domain.shape: (24, 29, 256)
2023-10-23 10:51:41,423 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 0
2023-10-23 10:51:41,582 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 1
2023-10-23 10:51:41,742 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 2
2023-10-23 10:51:41,902 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 3
2023-10-23 10:51:42,059 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 4
2023-10-23 10:51:42,220 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 5
2023-10-23 10:51:42,380 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 6
2023-10-23 10:51:42,540 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 7
2023-10-23 10:51:42,701 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 8
2023-10-23 10:51:42,861 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 9
2023-10-23 10:51:43,022 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 10
2023-10-23 10:51:43,182 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 11
2023-10-23 10:51:43,343 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 12
2023-10-23 10:51:43,503 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 13
2023-10-23 10:51:43,663 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 14
2023-10-23 10:51:43,823 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 15
2023-10-23 10:51:43,980 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 16
2023-10-23 10:51:44,141 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 17
2023-10-23 10:51:44,302 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 18
2023-10-23 10:51:44,462 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 19
2023-10-23 10:51:44,622 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 20
2023-10-23 10:51:44,782 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 21
2023-10-23 10:51:44,943 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 22
2023-10-23 10:51:45,103 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 23
2023-10-23 10:51:45,263 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 24
2023-10-23 10:51:45,424 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 25
2023-10-23 10:51:45,584 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 26
2023-10-23 10:51:45,744 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 27
2023-10-23 10:51:45,904 [INFO]: enso_diags_driver.py(perform_regression:142) >> ilat: 28
2023-10-23 10:51:46,064 [INFO]: enso_diags_driver.py(perform_regression:161) >> confidence in fn: (29, 256)
2023-10-23 10:51:46,064 [INFO]: enso_diags_driver.py(perform_regression:165) >> reg_coe.shape: (29, 256)
2023-10-23 10:51:46,327 [INFO]: enso_diags_driver.py(run_diag_map:366) >> Metrics saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-test-ref-yrs/regression-coefficient-trefht-over-nino34.json
2023-10-23 10:51:47,363 [INFO]: enso_diags_plot.py(plot_map:301) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-test-ref-yrs
2023-10-23 10:51:47,363 [INFO]: enso_diags_plot.py(plot_map:301) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-test-ref-yrs
2023-10-23 10:51:47,363 [INFO]: enso_diags_plot.py(plot_map:306) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-test-ref-yrs
2023-10-23 10:51:47,363 [INFO]: enso_diags_plot.py(plot_map:306) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-test-ref-yrs
2023-10-23 10:51:48,125 [INFO]: enso_diags_plot.py(plot_map:321) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-test-ref-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:51:48,125 [INFO]: enso_diags_plot.py(plot_map:321) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-test-ref-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:51:48,125 [INFO]: enso_diags_driver.py(run_diag_scatter:400) >> run_type: model_vs_obs
2023-10-23 10:51:48,127 [INFO]: enso_diags_driver.py(calculate_nino_index_model:82) >> Handling the following exception by looking for surface temperature: Neither does SST nor the variables in [('sst',), ('TS', 'OCNFRAC'), ('SST',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:48,128 [INFO]: enso_diags_driver.py(calculate_nino_index_model:101) >> Handling the following exception by trying built-in HadISST nino index time series: Neither does TS nor the variables in [('ts',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:48,129 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.075  0.155 -0.09   0.05   0.34   0.605  0.7    0.615  0.305  0.07
  0.135 -0.13   0.075 -0.155  0.09  -0.05  -0.34  -0.605 -0.7   -0.615
 -0.305 -0.07  -0.135  0.13 ]
2023-10-23 10:51:48,129 [INFO]: enso_diags_driver.py(calculate_nino_index_model:110) >> Simulated surface temperature not found, using built-in HadISST nino index time series instead.
2023-10-23 10:51:48,130 [INFO]: enso_diags_driver.py(calculate_nino_index_model:115) >> nino_index_model [-0.075  0.155 -0.09   0.05   0.34   0.605  0.7    0.615  0.305  0.07
  0.135 -0.13   0.075 -0.155  0.09  -0.05  -0.34  -0.605 -0.7   -0.615
 -0.305 -0.07  -0.135  0.13 ]
2023-10-23 10:51:48,131 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.075  0.155 -0.09   0.05   0.34   0.605  0.7    0.615  0.305  0.07
  0.135 -0.13   0.075 -0.155  0.09  -0.05  -0.34  -0.605 -0.7   -0.615
 -0.305 -0.07  -0.135  0.13 ]
2023-10-23 10:51:48,335 [INFO]: enso_diags_plot.py(plot_scatter:437) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter
2023-10-23 10:51:48,335 [INFO]: enso_diags_plot.py(plot_scatter:437) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter
2023-10-23 10:51:48,335 [INFO]: enso_diags_plot.py(plot_scatter:442) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter
2023-10-23 10:51:48,335 [INFO]: enso_diags_plot.py(plot_scatter:442) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter
2023-10-23 10:51:48,586 [INFO]: enso_diags_plot.py(plot_scatter:461) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter/feedback-TREFHT-NINO3-TS-NINO3.png
2023-10-23 10:51:48,586 [INFO]: enso_diags_plot.py(plot_scatter:461) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter/feedback-TREFHT-NINO3-TS-NINO3.png
2023-10-23 10:51:48,586 [INFO]: enso_diags_driver.py(run_diag_scatter:400) >> run_type: model_vs_obs
2023-10-23 10:51:48,588 [INFO]: enso_diags_driver.py(calculate_nino_index_model:82) >> Handling the following exception by looking for surface temperature: Neither does SST nor the variables in [('sst',), ('TS', 'OCNFRAC'), ('SST',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:48,589 [INFO]: enso_diags_driver.py(calculate_nino_index_model:101) >> Handling the following exception by trying built-in HadISST nino index time series: Neither does TS nor the variables in [('ts',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:48,590 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.075  0.155 -0.09   0.05   0.34   0.605  0.7    0.615  0.305  0.07
  0.135 -0.13   0.075 -0.155  0.09  -0.05  -0.34  -0.605 -0.7   -0.615
 -0.305 -0.07  -0.135  0.13 ]
2023-10-23 10:51:48,590 [INFO]: enso_diags_driver.py(calculate_nino_index_model:110) >> Simulated surface temperature not found, using built-in HadISST nino index time series instead.
2023-10-23 10:51:48,591 [INFO]: enso_diags_driver.py(calculate_nino_index_model:115) >> nino_index_model [-0.075  0.155 -0.09   0.05   0.34   0.605  0.7    0.615  0.305  0.07
  0.135 -0.13   0.075 -0.155  0.09  -0.05  -0.34  -0.605 -0.7   -0.615
 -0.305 -0.07  -0.135  0.13 ]
2023-10-23 10:51:48,592 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.075  0.155 -0.09   0.05   0.34   0.605  0.7    0.615  0.305  0.07
  0.135 -0.13   0.075 -0.155  0.09  -0.05  -0.34  -0.605 -0.7   -0.615
 -0.305 -0.07  -0.135  0.13 ]
2023-10-23 10:51:48,796 [INFO]: enso_diags_plot.py(plot_scatter:437) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-start-yrs
2023-10-23 10:51:48,796 [INFO]: enso_diags_plot.py(plot_scatter:437) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-start-yrs
2023-10-23 10:51:48,796 [INFO]: enso_diags_plot.py(plot_scatter:442) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-start-yrs
2023-10-23 10:51:48,796 [INFO]: enso_diags_plot.py(plot_scatter:442) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-start-yrs
2023-10-23 10:51:49,048 [INFO]: enso_diags_plot.py(plot_scatter:461) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-start-yrs/feedback-TREFHT-NINO3-TS-NINO3.png
2023-10-23 10:51:49,048 [INFO]: enso_diags_plot.py(plot_scatter:461) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-start-yrs/feedback-TREFHT-NINO3-TS-NINO3.png
2023-10-23 10:51:49,048 [INFO]: enso_diags_driver.py(run_diag_scatter:400) >> run_type: model_vs_obs
2023-10-23 10:51:49,050 [INFO]: enso_diags_driver.py(calculate_nino_index_model:82) >> Handling the following exception by looking for surface temperature: Neither does SST nor the variables in [('sst',), ('TS', 'OCNFRAC'), ('SST',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:49,051 [INFO]: enso_diags_driver.py(calculate_nino_index_model:101) >> Handling the following exception by trying built-in HadISST nino index time series: Neither does TS nor the variables in [('ts',)] have valid files in tests/integration/integration_test_data.
2023-10-23 10:51:49,052 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.075  0.155 -0.09   0.05   0.34   0.605  0.7    0.615  0.305  0.07
  0.135 -0.13   0.075 -0.155  0.09  -0.05  -0.34  -0.605 -0.7   -0.615
 -0.305 -0.07  -0.135  0.13 ]
2023-10-23 10:51:49,052 [INFO]: enso_diags_driver.py(calculate_nino_index_model:110) >> Simulated surface temperature not found, using built-in HadISST nino index time series instead.
2023-10-23 10:51:49,052 [INFO]: enso_diags_driver.py(calculate_nino_index_model:115) >> nino_index_model [-0.075  0.155 -0.09   0.05   0.34   0.605  0.7    0.615  0.305  0.07
  0.135 -0.13   0.075 -0.155  0.09  -0.05  -0.34  -0.605 -0.7   -0.615
 -0.305 -0.07  -0.135  0.13 ]
2023-10-23 10:51:49,053 [INFO]: enso_diags_driver.py(calculate_nino_index:66) >> nino_index_obs [-0.075  0.155 -0.09   0.05   0.34   0.605  0.7    0.615  0.305  0.07
  0.135 -0.13   0.075 -0.155  0.09  -0.05  -0.34  -0.605 -0.7   -0.615
 -0.305 -0.07  -0.135  0.13 ]
2023-10-23 10:51:49,259 [INFO]: enso_diags_plot.py(plot_scatter:437) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-test-ref-yrs
2023-10-23 10:51:49,259 [INFO]: enso_diags_plot.py(plot_scatter:437) >> Output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-test-ref-yrs
2023-10-23 10:51:49,259 [INFO]: enso_diags_plot.py(plot_scatter:442) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-test-ref-yrs
2023-10-23 10:51:49,259 [INFO]: enso_diags_plot.py(plot_scatter:442) >> Original output dir: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-test-ref-yrs
2023-10-23 10:51:49,509 [INFO]: enso_diags_plot.py(plot_scatter:461) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-test-ref-yrs/feedback-TREFHT-NINO3-TS-NINO3.png
2023-10-23 10:51:49,509 [INFO]: enso_diags_plot.py(plot_scatter:461) >> Plot saved in: tests/integration/all_sets_results_test/enso_diags/TREFHT-response-scatter-test-ref-yrs/feedback-TREFHT-NINO3-TS-NINO3.png
2023-10-23 10:51:51,850 [INFO]: qbo_driver.py(run_diag:272) >> Metrics saved in: tests/integration/all_sets_results_test/qbo/qbo-test/qbo_diags_test.json
2023-10-23 10:51:51,852 [INFO]: qbo_driver.py(run_diag:272) >> Metrics saved in: tests/integration/all_sets_results_test/qbo/qbo-test/qbo_diags_ref.json
2023-10-23 10:51:53,123 [INFO]: qbo_plot.py(plot:208) >> Plot saved in: tests/integration/all_sets_results_test/qbo/qbo-test/qbo_diags.png
2023-10-23 10:51:53,123 [INFO]: qbo_plot.py(plot:208) >> Plot saved in: tests/integration/all_sets_results_test/qbo/qbo-test/qbo_diags.png
2023-10-23 10:51:53,930 [INFO]: streamflow_driver.py(run_diag:132) >> gauges.shape=(25765, 94)
2023-10-23 10:51:55,031 [INFO]: streamflow_driver.py(setup_ref:258) >> ref_array.shape=(1380, 30961)
2023-10-23 10:51:55,260 [INFO]: streamflow_driver.py(setup_test:272) >> test var original dimensions=(36, 360, 720)
2023-10-23 10:51:55,261 [INFO]: streamflow_driver.py(setup_test:275) >> test var transposed dimensions=(720, 360, 36)
2023-10-23 10:51:55,412 [INFO]: streamflow_driver.py(setup_test:282) >> area_upstream dimensions=(720, 360)
2023-10-23 10:51:55,412 [INFO]: streamflow_driver.py(setup_test:287) >> test_array.shape=(720, 360, 36)
2023-10-23 10:51:55,435 [INFO]: streamflow_driver.py(run_diag:147) >> lat_lon.shape=(25765, 2)
2023-10-23 10:51:55,435 [INFO]: streamflow_driver.py(generate_export:389) >> export.shape=(25765, 9)
2023-10-23 10:51:55,435 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #0
2023-10-23 10:51:57,936 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #1000
2023-10-23 10:52:00,101 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #2000
2023-10-23 10:52:02,777 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #3000
2023-10-23 10:52:05,640 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #4000
2023-10-23 10:52:08,391 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #5000
2023-10-23 10:52:11,065 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #6000
2023-10-23 10:52:13,635 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #7000
2023-10-23 10:52:15,695 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #8000
2023-10-23 10:52:17,270 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #9000
2023-10-23 10:52:19,370 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #10000
2023-10-23 10:52:21,296 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #11000
2023-10-23 10:52:23,819 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #12000
2023-10-23 10:52:27,066 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #13000
2023-10-23 10:52:30,682 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #14000
2023-10-23 10:52:33,549 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #15000
2023-10-23 10:52:36,334 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #16000
2023-10-23 10:52:39,196 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #17000
2023-10-23 10:52:42,075 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #18000
2023-10-23 10:52:44,972 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #19000
2023-10-23 10:52:47,919 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #20000
2023-10-23 10:52:50,797 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #21000
2023-10-23 10:52:53,714 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #22000
2023-10-23 10:52:56,655 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #23000
2023-10-23 10:52:59,569 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #24000
2023-10-23 10:53:02,489 [INFO]: streamflow_driver.py(generate_export:392) >> On gauge #25000
2023-10-23 10:53:04,745 [INFO]: streamflow_driver.py(run_diag:168) >> export.shape before removing ref nan means=(25765, 9)
2023-10-23 10:53:04,746 [INFO]: streamflow_driver.py(run_diag:173) >> export.shape before removing test nan means=(22959, 9)
2023-10-23 10:53:04,747 [INFO]: streamflow_driver.py(run_diag:178) >> export.shape after both nan removals=(20740, 9)
2023-10-23 10:53:04,747 [INFO]: streamflow_driver.py(run_diag:189) >> export.shape after max_area_error cut=(1940, 9)
2023-10-23 10:53:04,747 [INFO]: streamflow_driver.py(run_diag:194) >> Variable: RIVER_DISCHARGE_OVER_LAND_LIQ
2023-10-23 10:53:07,470 [INFO]: streamflow_plot.py(plot_panel_seasonality_map:219) >> num_colors=12
2023-10-23 10:53:07,470 [INFO]: streamflow_plot.py(plot_panel_seasonality_map:219) >> num_colors=12
2023-10-23 10:53:07,471 [INFO]: streamflow_plot.py(plot_panel_seasonality_map:230) >> bounds=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
2023-10-23 10:53:07,471 [INFO]: streamflow_plot.py(plot_panel_seasonality_map:230) >> bounds=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
2023-10-23 10:53:10,214 [INFO]: streamflow_plot.py(plot_panel_seasonality_map:219) >> num_colors=12
2023-10-23 10:53:10,214 [INFO]: streamflow_plot.py(plot_panel_seasonality_map:219) >> num_colors=12
2023-10-23 10:53:10,214 [INFO]: streamflow_plot.py(plot_panel_seasonality_map:230) >> bounds=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
2023-10-23 10:53:10,214 [INFO]: streamflow_plot.py(plot_panel_seasonality_map:230) >> bounds=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
2023-10-23 10:53:10,234 [INFO]: streamflow_plot.py(plot_seasonality_map:310) >> Output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:10,234 [INFO]: streamflow_plot.py(plot_seasonality_map:310) >> Output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:10,234 [INFO]: streamflow_plot.py(plot_seasonality_map:315) >> Original output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:10,234 [INFO]: streamflow_plot.py(plot_seasonality_map:315) >> Original output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:15,175 [INFO]: streamflow_plot.py(plot_seasonality_map:333) >> Plot saved in: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/seasonality_map.png
2023-10-23 10:53:15,175 [INFO]: streamflow_plot.py(plot_seasonality_map:333) >> Plot saved in: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/seasonality_map.png
2023-10-23 10:53:20,875 [INFO]: streamflow_plot.py(setup_annual_map:494) >> Bias of mean annual discharge bias min=-100.0, max=4715418.0
2023-10-23 10:53:20,875 [INFO]: streamflow_plot.py(setup_annual_map:494) >> Bias of mean annual discharge bias min=-100.0, max=4715418.0
2023-10-23 10:53:23,612 [INFO]: streamflow_plot.py(plot_annual_map:592) >> Output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:23,612 [INFO]: streamflow_plot.py(plot_annual_map:592) >> Output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:23,612 [INFO]: streamflow_plot.py(plot_annual_map:597) >> Original output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:23,612 [INFO]: streamflow_plot.py(plot_annual_map:597) >> Original output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:26,987 [INFO]: streamflow_plot.py(plot_annual_map:615) >> Plot saved in: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/annual_map.png
2023-10-23 10:53:26,987 [INFO]: streamflow_plot.py(plot_annual_map:615) >> Plot saved in: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/annual_map.png
2023-10-23 10:53:27,032 [INFO]: streamflow_plot.py(plot_annual_scatter:707) >> Output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:27,032 [INFO]: streamflow_plot.py(plot_annual_scatter:707) >> Output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:27,032 [INFO]: streamflow_plot.py(plot_annual_scatter:712) >> Original output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:27,032 [INFO]: streamflow_plot.py(plot_annual_scatter:712) >> Original output dir: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM
2023-10-23 10:53:27,699 [INFO]: streamflow_plot.py(plot_annual_scatter:729) >> Plot saved in: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/annual_scatter.png
2023-10-23 10:53:27,699 [INFO]: streamflow_plot.py(plot_annual_scatter:729) >> Plot saved in: tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/annual_scatter.png
2023-10-23 10:53:27,729 [INFO]: diurnal_cycle_driver.py(run_diag:50) >> Variable: PRECT
2023-10-23 10:53:27,907 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 2000-6-1 1:30:0.0 1.5
2023-10-23 10:53:27,907 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=8
2023-10-23 10:53:27,909 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:27,909 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(8, 25, 60)
2023-10-23 10:53:27,910 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 1998-6-1 1:30:0.0 1.5
2023-10-23 10:53:27,910 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=8
2023-10-23 10:53:27,914 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:27,915 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(8, 100, 240)
2023-10-23 10:53:27,923 [INFO]: diurnal_cycle_plot.py(plot_panel:93) >> Scale test diurnal cycle amplitude to specified 4 mm/day
2023-10-23 10:53:27,923 [INFO]: diurnal_cycle_plot.py(plot_panel:93) >> Scale test diurnal cycle amplitude to specified 4 mm/day
2023-10-23 10:53:29,054 [INFO]: diurnal_cycle_plot.py(plot_panel:93) >> Scale test diurnal cycle amplitude to specified 11 mm/day
2023-10-23 10:53:29,054 [INFO]: diurnal_cycle_plot.py(plot_panel:93) >> Scale test diurnal cycle amplitude to specified 11 mm/day
2023-10-23 10:53:31,488 [INFO]: diurnal_cycle_plot.py(plot:300) >> Plot saved in: tests/integration/all_sets_results_test/diurnal_cycle/TRMM-3B43v-7_3hr/TRMM-3B43v-7_3hr-PRECT-JJA-CONUS.png
2023-10-23 10:53:31,488 [INFO]: diurnal_cycle_plot.py(plot:300) >> Plot saved in: tests/integration/all_sets_results_test/diurnal_cycle/TRMM-3B43v-7_3hr/TRMM-3B43v-7_3hr-PRECT-JJA-CONUS.png
2023-10-23 10:53:31,518 [INFO]: diurnal_cycle_driver.py(run_diag:50) >> Variable: PRECT
2023-10-23 10:53:31,674 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 2000-6-1 1:30:0.0 1.5
2023-10-23 10:53:31,674 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=8
2023-10-23 10:53:31,679 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:31,680 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(8, 40, 360)
2023-10-23 10:53:31,683 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 1998-6-1 1:30:0.0 1.5
2023-10-23 10:53:31,683 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=8
2023-10-23 10:53:31,708 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:31,722 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(8, 160, 1440)
2023-10-23 10:53:31,768 [INFO]: diurnal_cycle_plot.py(plot_panel:93) >> Scale test diurnal cycle amplitude to specified 13 mm/day
2023-10-23 10:53:31,768 [INFO]: diurnal_cycle_plot.py(plot_panel:93) >> Scale test diurnal cycle amplitude to specified 13 mm/day
2023-10-23 10:53:32,433 [INFO]: diurnal_cycle_plot.py(plot_panel:93) >> Scale test diurnal cycle amplitude to specified 32 mm/day
2023-10-23 10:53:32,433 [INFO]: diurnal_cycle_plot.py(plot_panel:93) >> Scale test diurnal cycle amplitude to specified 32 mm/day
2023-10-23 10:53:33,520 [INFO]: diurnal_cycle_plot.py(plot:300) >> Plot saved in: tests/integration/all_sets_results_test/diurnal_cycle/TRMM-3B43v-7_3hr/TRMM-3B43v-7_3hr-PRECT-JJA-20S20N.png
2023-10-23 10:53:33,520 [INFO]: diurnal_cycle_plot.py(plot:300) >> Plot saved in: tests/integration/all_sets_results_test/diurnal_cycle/TRMM-3B43v-7_3hr/TRMM-3B43v-7_3hr-PRECT-JJA-20S20N.png
2023-10-23 10:53:33,528 [INFO]: arm_diags_driver.py(run_diag_annual_cycle:275) >> Selected region: sgpc1
2023-10-23 10:53:33,528 [INFO]: arm_diags_driver.py(run_diag_annual_cycle:279) >> Season: ANNUALCYCLE
2023-10-23 10:53:33,528 [INFO]: arm_diags_driver.py(run_diag_annual_cycle:281) >> Variable: PRECT
2023-10-23 10:53:33,608 [INFO]: arm_diags_driver.py(run_diag_annual_cycle:358) >> Metrics saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-ANNUALCYCLE-sgpc1.json
2023-10-23 10:53:33,824 [INFO]: arm_diags_plot.py(plot_annual_cycle:496) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-ANNUALCYCLE-sgpc1.png
2023-10-23 10:53:33,824 [INFO]: arm_diags_plot.py(plot_annual_cycle:496) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-ANNUALCYCLE-sgpc1.png
2023-10-23 10:53:33,825 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:68) >> Selected region: sgpc1
2023-10-23 10:53:33,825 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:72) >> Season: DJF
2023-10-23 10:53:33,825 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:74) >> Variable: PRECT
2023-10-23 10:53:33,876 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 1-1-1 0:0:0.0 0.0
2023-10-23 10:53:33,876 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=8
2023-10-23 10:53:33,899 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 2004-1-16 0:30:0.0 0.5
2023-10-23 10:53:33,899 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=24
2023-10-23 10:53:33,901 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:153) >> Metrics saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-DJF-sgpc1.json
2023-10-23 10:53:33,912 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:33,912 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(8,)
2023-10-23 10:53:33,924 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:33,925 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(24,)
2023-10-23 10:53:34,048 [INFO]: arm_diags_plot.py(plot_diurnal_cycle:555) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-DJF-sgpc1-diurnal-cycle.png
2023-10-23 10:53:34,048 [INFO]: arm_diags_plot.py(plot_diurnal_cycle:555) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-DJF-sgpc1-diurnal-cycle.png
2023-10-23 10:53:34,048 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:72) >> Season: MAM
2023-10-23 10:53:34,048 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:74) >> Variable: PRECT
2023-10-23 10:53:34,098 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 1-1-1 0:0:0.0 0.0
2023-10-23 10:53:34,098 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=8
2023-10-23 10:53:34,119 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 2004-1-16 0:30:0.0 0.5
2023-10-23 10:53:34,120 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=24
2023-10-23 10:53:34,122 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:153) >> Metrics saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-MAM-sgpc1.json
2023-10-23 10:53:34,133 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:34,133 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(8,)
2023-10-23 10:53:34,145 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:34,145 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(24,)
2023-10-23 10:53:34,273 [INFO]: arm_diags_plot.py(plot_diurnal_cycle:555) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-MAM-sgpc1-diurnal-cycle.png
2023-10-23 10:53:34,273 [INFO]: arm_diags_plot.py(plot_diurnal_cycle:555) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-MAM-sgpc1-diurnal-cycle.png
2023-10-23 10:53:34,273 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:72) >> Season: JJA
2023-10-23 10:53:34,273 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:74) >> Variable: PRECT
2023-10-23 10:53:34,325 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 1-1-1 0:0:0.0 0.0
2023-10-23 10:53:34,325 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=8
2023-10-23 10:53:34,347 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 2004-1-16 0:30:0.0 0.5
2023-10-23 10:53:34,347 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=24
2023-10-23 10:53:34,349 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:153) >> Metrics saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-JJA-sgpc1.json
2023-10-23 10:53:34,360 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:34,360 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(8,)
2023-10-23 10:53:34,372 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:34,372 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(24,)
2023-10-23 10:53:34,499 [INFO]: arm_diags_plot.py(plot_diurnal_cycle:555) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-JJA-sgpc1-diurnal-cycle.png
2023-10-23 10:53:34,499 [INFO]: arm_diags_plot.py(plot_diurnal_cycle:555) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-JJA-sgpc1-diurnal-cycle.png
2023-10-23 10:53:34,499 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:72) >> Season: SON
2023-10-23 10:53:34,499 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:74) >> Variable: PRECT
2023-10-23 10:53:34,548 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 1-1-1 0:0:0.0 0.0
2023-10-23 10:53:34,548 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=8
2023-10-23 10:53:34,570 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 2004-1-16 0:30:0.0 0.5
2023-10-23 10:53:34,570 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=24
2023-10-23 10:53:34,572 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle:153) >> Metrics saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-SON-sgpc1.json
2023-10-23 10:53:34,583 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:34,583 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(8,)
2023-10-23 10:53:34,596 [INFO]: diurnal_cycle.py(fastAllGridFT:199) >> Calling numpy FFT function and converting from complex-valued FFT to real-valued amplitude and phase
2023-10-23 10:53:34,596 [INFO]: diurnal_cycle.py(fastAllGridFT:203) >> FFT output shape=(24,)
2023-10-23 10:53:34,722 [INFO]: arm_diags_plot.py(plot_diurnal_cycle:555) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-SON-sgpc1-diurnal-cycle.png
2023-10-23 10:53:34,722 [INFO]: arm_diags_plot.py(plot_diurnal_cycle:555) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-PRECT-SON-sgpc1-diurnal-cycle.png
2023-10-23 10:53:34,723 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle_zt:170) >> Selected region: sgpc1
2023-10-23 10:53:34,723 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle_zt:174) >> Season: ANNUALCYCLE
2023-10-23 10:53:34,723 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle_zt:176) >> Variable: CLOUD
2023-10-23 10:53:51,803 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:62) >> start_time 1-1-1 0:0:0.0 0.0
2023-10-23 10:53:51,804 [INFO]: diurnal_cycle.py(composite_diurnal_cycle:63) >> var_time_freq=8
2023-10-23 10:53:51,824 [INFO]: arm_diags_driver.py(run_diag_diurnal_cycle_zt:253) >> Metrics saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-CLOUD-ANNUALCYCLE-sgpc1.json
2023-10-23 10:53:53,175 [INFO]: arm_diags_plot.py(plot_diurnal_cycle_zt:646) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-CLOUD-ANNUALCYCLE-sgpc1-ref.png
2023-10-23 10:53:53,175 [INFO]: arm_diags_plot.py(plot_diurnal_cycle_zt:646) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-CLOUD-ANNUALCYCLE-sgpc1-ref.png
2023-10-23 10:53:54,616 [INFO]: arm_diags_plot.py(plot_diurnal_cycle_zt:646) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-CLOUD-ANNUALCYCLE-sgpc1-test.png
2023-10-23 10:53:54,616 [INFO]: arm_diags_plot.py(plot_diurnal_cycle_zt:646) >> Plot saved in: tests/integration/all_sets_results_test/arm_diags/armdiags-CLOUD-ANNUALCYCLE-sgpc1-test.png
2023-10-23 10:53:54,616 [INFO]: arm_diags_driver.py(run_diag_convection_onset:375) >> Selected region: sgpc1
2023-10-23 10:53:54,744 [ERROR]: core_parameter.py(_run_diag:268) >> Error in e3sm_diags.driver.arm_diags_driver
Traceback (most recent call last):
  File "/global/homes/v/vo13/mambaforge/envs/cdat-migration-fy24-nompi/lib/python3.10/site-packages/e3sm_diags/parameter/core_parameter.py", line 265, in _run_diag
    single_result = module.run_diag(self)
  File "/global/homes/v/vo13/mambaforge/envs/cdat-migration-fy24-nompi/lib/python3.10/site-packages/e3sm_diags/driver/arm_diags_driver.py", line 578, in run_diag
    return run_diag_convection_onset(parameter)
  File "/global/homes/v/vo13/mambaforge/envs/cdat-migration-fy24-nompi/lib/python3.10/site-packages/e3sm_diags/driver/arm_diags_driver.py", line 406, in run_diag_convection_onset
    arm_diags_plot.plot_convection_onset_statistics(
  File "/global/homes/v/vo13/mambaforge/envs/cdat-migration-fy24-nompi/lib/python3.10/site-packages/e3sm_diags/plot/cartopy/arm_diags_plot.py", line 178, in plot_convection_onset_statistics
    number_of_bins = int(np.ceil((cwv_max - cwv_min) / bin_width))
UnboundLocalError: local variable 'cwv_max' referenced before assignment
2023-10-23 10:53:54,746 [INFO]: main.py(create_viewer:130) >> zonal_mean_xy tests/integration/all_sets_results_test/viewer
2023-10-23 10:53:54,788 [INFO]: main.py(create_viewer:133) >> ('Zonal mean line plots', 'zonal_mean_xy/index.html')
2023-10-23 10:53:54,788 [INFO]: main.py(create_viewer:130) >> zonal_mean_2d tests/integration/all_sets_results_test/viewer
2023-10-23 10:53:54,823 [INFO]: main.py(create_viewer:133) >> ('Pressure-Latitude zonal mean contour plots', 'zonal_mean_2d/index.html')
2023-10-23 10:53:54,823 [INFO]: main.py(create_viewer:130) >> meridional_mean_2d tests/integration/all_sets_results_test/viewer
2023-10-23 10:53:54,859 [INFO]: main.py(create_viewer:133) >> ('Pressure-Longitude meridional mean contour plots', 'meridional_mean_2d/index.html')
2023-10-23 10:53:54,860 [INFO]: main.py(create_viewer:130) >> lat_lon tests/integration/all_sets_results_test/viewer
2023-10-23 10:54:01,328 [INFO]: main.py(create_viewer:133) >> [('Latitude-Longitude contour maps', 'lat_lon/index.html'), ('Table', 'table/index.html'), ('Taylor Diagram', 'taylor/index.html'), ('CMIP6 Comparison', 'cmip6/index.html')]
2023-10-23 10:54:01,328 [INFO]: main.py(create_viewer:130) >> polar tests/integration/all_sets_results_test/viewer
2023-10-23 10:54:01,367 [INFO]: main.py(create_viewer:133) >> ('Polar contour maps', 'polar/index.html')
2023-10-23 10:54:01,368 [INFO]: main.py(create_viewer:130) >> area_mean_time_series tests/integration/all_sets_results_test/viewer
2023-10-23 10:54:01,407 [INFO]: main.py(create_viewer:133) >> ('Area Mean Time Series', 'area_mean_time_series/index.html')
2023-10-23 10:54:01,407 [INFO]: main.py(create_viewer:130) >> cosp_histogram tests/integration/all_sets_results_test/viewer
2023-10-23 10:54:01,447 [INFO]: main.py(create_viewer:133) >> ('CloudTopHeight-Tau joint histograms', 'cosp_histogram/index.html')
2023-10-23 10:54:01,447 [INFO]: main.py(create_viewer:130) >> enso_diags tests/integration/all_sets_results_test/viewer
2023-10-23 10:54:01,447 [INFO]: enso_diags_viewer.py(create_viewer:56) >> image_relative_path: ../enso_diags/TREFHT-response-map/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:54:01,451 [INFO]: enso_diags_viewer.py(create_viewer:56) >> image_relative_path: ../enso_diags/TREFHT-response-map-start-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:54:01,455 [INFO]: enso_diags_viewer.py(create_viewer:56) >> image_relative_path: ../enso_diags/TREFHT-response-map-test-ref-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:54:01,458 [INFO]: enso_diags_viewer.py(create_viewer:56) >> image_relative_path: ../enso_diags/TREFHT-response-scatter/feedback-TREFHT-NINO3-TS-NINO3.png
2023-10-23 10:54:01,461 [INFO]: enso_diags_viewer.py(create_viewer:56) >> image_relative_path: ../enso_diags/TREFHT-response-scatter-start-yrs/feedback-TREFHT-NINO3-TS-NINO3.png
2023-10-23 10:54:01,465 [INFO]: enso_diags_viewer.py(create_viewer:56) >> image_relative_path: ../enso_diags/TREFHT-response-scatter-test-ref-yrs/feedback-TREFHT-NINO3-TS-NINO3.png
2023-10-23 10:54:01,517 [INFO]: main.py(create_viewer:133) >> ('ENSO Diagnostics', 'enso_diags/index.html')
2023-10-23 10:54:01,517 [INFO]: main.py(create_viewer:130) >> qbo tests/integration/all_sets_results_test/viewer
2023-10-23 10:54:01,557 [INFO]: main.py(create_viewer:133) >> ('Quasi-biennial Oscillation', 'qbo/index.html')
2023-10-23 10:54:01,557 [INFO]: main.py(create_viewer:130) >> streamflow tests/integration/all_sets_results_test/viewer
2023-10-23 10:54:01,609 [INFO]: main.py(create_viewer:133) >> ('Streamflow', 'streamflow/index.html')
2023-10-23 10:54:01,609 [INFO]: main.py(create_viewer:130) >> diurnal_cycle tests/integration/all_sets_results_test/viewer
2023-10-23 10:54:01,658 [INFO]: main.py(create_viewer:133) >> ('Diurnal cycle phase maps', 'diurnal_cycle/index.html')
2023-10-23 10:54:01,658 [INFO]: main.py(create_viewer:130) >> arm_diags tests/integration/all_sets_results_test/viewer
2023-10-23 10:54:01,722 [INFO]: main.py(create_viewer:133) >> ('Diagnostics at ARM stations', 'arm_diags/index.html')
2023-10-23 10:54:01,732 [INFO]: e3sm_diags_driver.py(main:390) >> Viewer HTML generated at tests/integration/all_sets_results_test/viewer/index.html
2023-10-23 10:54:01,736 [INFO]: logger.py(move_log_to_prov_dir:106) >> Log file saved in tests/integration/all_sets_results_test/prov/e3sm_diags_run.log
2023-10-23 10:54:02,352 [INFO]: test_diags.py(get_results_dir:36) >> results_dir=tests/integration/all_sets_results_test/
....2023-10-23 10:54:02,980 [INFO]: test_diags.py(_compare_images:116) >>
path_to_actual_png=tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:54:02,980 [INFO]: test_diags.py(_compare_images:117) >> path_to_expected_png=tests/integration//integration_test_images//enso_diags/TREFHT-response-map/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:54:02,980 [INFO]: test_diags.py(_compare_images:118) >> diff has 12 nonzero pixels.
2023-10-23 10:54:02,980 [INFO]: test_diags.py(_compare_images:121) >> total number of pixels=2103750
2023-10-23 10:54:02,980 [INFO]: test_diags.py(_compare_images:123) >> num_nonzero_pixels/num_pixels fraction=5.704099821746881e-06
.2023-10-23 10:54:03,132 [INFO]: test_diags.py(_compare_images:116) >>
path_to_actual_png=tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-start-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:54:03,133 [INFO]: test_diags.py(_compare_images:117) >> path_to_expected_png=tests/integration//integration_test_images//enso_diags/TREFHT-response-map-start-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:54:03,133 [INFO]: test_diags.py(_compare_images:118) >> diff has 12 nonzero pixels.
2023-10-23 10:54:03,133 [INFO]: test_diags.py(_compare_images:121) >> total number of pixels=2103750
2023-10-23 10:54:03,133 [INFO]: test_diags.py(_compare_images:123) >> num_nonzero_pixels/num_pixels fraction=5.704099821746881e-06
.2023-10-23 10:54:03,276 [INFO]: test_diags.py(_compare_images:116) >>
path_to_actual_png=tests/integration/all_sets_results_test/enso_diags/TREFHT-response-map-test-ref-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:54:03,276 [INFO]: test_diags.py(_compare_images:117) >> path_to_expected_png=tests/integration//integration_test_images//enso_diags/TREFHT-response-map-test-ref-yrs/regression-coefficient-trefht-over-nino34.png
2023-10-23 10:54:03,276 [INFO]: test_diags.py(_compare_images:118) >> diff has 12 nonzero pixels.
2023-10-23 10:54:03,277 [INFO]: test_diags.py(_compare_images:121) >> total number of pixels=2103750
2023-10-23 10:54:03,277 [INFO]: test_diags.py(_compare_images:123) >> num_nonzero_pixels/num_pixels fraction=5.704099821746881e-06
....2023-10-23 10:54:03,861 [INFO]: test_diags.py(_compare_images:116) >>
path_to_actual_png=tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-global.png
2023-10-23 10:54:03,861 [INFO]: test_diags.py(_compare_images:117) >> path_to_expected_png=tests/integration//integration_test_images//lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-global.png
2023-10-23 10:54:03,862 [INFO]: test_diags.py(_compare_images:118) >> diff has 9455 nonzero pixels.
2023-10-23 10:54:03,862 [INFO]: test_diags.py(_compare_images:121) >> total number of pixels=2103750
2023-10-23 10:54:03,862 [INFO]: test_diags.py(_compare_images:123) >> num_nonzero_pixels/num_pixels fraction=0.00449435531788473
F2023-10-23 10:54:04,316 [INFO]: test_diags.py(_compare_images:116) >>
path_to_actual_png=tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-CONUS_RRM.png
2023-10-23 10:54:04,317 [INFO]: test_diags.py(_compare_images:117) >> path_to_expected_png=tests/integration//integration_test_images//lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-CONUS_RRM.png
2023-10-23 10:54:04,317 [INFO]: test_diags.py(_compare_images:118) >> diff has 49777 nonzero pixels.
2023-10-23 10:54:04,317 [INFO]: test_diags.py(_compare_images:121) >> total number of pixels=2103750
2023-10-23 10:54:04,317 [INFO]: test_diags.py(_compare_images:123) >> num_nonzero_pixels/num_pixels fraction=0.023661081402257873
F.2023-10-23 10:54:04,793 [INFO]: test_diags.py(_compare_images:116) >>
path_to_actual_png=tests/integration/all_sets_results_test/polar/ERA-Interim/ERA-Interim-T-850-ANN-polar_S.png
2023-10-23 10:54:04,794 [INFO]: test_diags.py(_compare_images:117) >> path_to_expected_png=tests/integration//integration_test_images//polar/ERA-Interim/ERA-Interim-T-850-ANN-polar_S.png
2023-10-23 10:54:04,794 [INFO]: test_diags.py(_compare_images:118) >> diff has 1211 nonzero pixels.
2023-10-23 10:54:04,794 [INFO]: test_diags.py(_compare_images:121) >> total number of pixels=2103750
2023-10-23 10:54:04,794 [INFO]: test_diags.py(_compare_images:123) >> num_nonzero_pixels/num_pixels fraction=0.0005756387403446227
F2023-10-23 10:54:05,059 [INFO]: test_diags.py(_compare_images:116) >>
path_to_actual_png=tests/integration/all_sets_results_test/qbo/qbo-test/qbo_diags.png
2023-10-23 10:54:05,060 [INFO]: test_diags.py(_compare_images:117) >> path_to_expected_png=tests/integration//integration_test_images//qbo/qbo-test/qbo_diags.png
2023-10-23 10:54:05,060 [INFO]: test_diags.py(_compare_images:118) >> diff has 10335 nonzero pixels.
2023-10-23 10:54:05,060 [INFO]: test_diags.py(_compare_images:121) >> total number of pixels=1960000
2023-10-23 10:54:05,060 [INFO]: test_diags.py(_compare_images:123) >> num_nonzero_pixels/num_pixels fraction=0.0052729591836734695
F2023-10-23 10:54:05,264 [INFO]: test_diags.py(_compare_images:116) >>
path_to_actual_png=tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/seasonality_map.png
2023-10-23 10:54:05,264 [INFO]: test_diags.py(_compare_images:117) >> path_to_expected_png=tests/integration//integration_test_images//streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/seasonality_map.png
2023-10-23 10:54:05,264 [INFO]: test_diags.py(_compare_images:118) >> diff has 3331 nonzero pixels.
2023-10-23 10:54:05,264 [INFO]: test_diags.py(_compare_images:121) >> total number of pixels=2103750
2023-10-23 10:54:05,265 [INFO]: test_diags.py(_compare_images:123) >> num_nonzero_pixels/num_pixels fraction=0.0015833630421865717
F2023-10-23 10:54:05,433 [INFO]: test_diags.py(_compare_images:116) >>
path_to_actual_png=tests/integration/all_sets_results_test/zonal_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png
2023-10-23 10:54:05,434 [INFO]: test_diags.py(_compare_images:117) >> path_to_expected_png=tests/integration//integration_test_images//zonal_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png
2023-10-23 10:54:05,434 [INFO]: test_diags.py(_compare_images:118) >> diff has 880 nonzero pixels.
2023-10-23 10:54:05,434 [INFO]: test_diags.py(_compare_images:121) >> total number of pixels=2103750
2023-10-23 10:54:05,434 [INFO]: test_diags.py(_compare_images:123) >> num_nonzero_pixels/num_pixels fraction=0.0004183006535947712
F.

=============================================================== FAILURES ===============================================================
_________________________________________________ TestAllSets.test_lat_lon_plot_diffs __________________________________________________

self = <tests.integration.test_diags.TestAllSets object at 0x7f1506628ee0>

    def test_lat_lon_plot_diffs(self):
>       self._check_plots_plevs("lat_lon", "global", [850.0])

tests/integration/test_diags.py:222:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/integration/test_diags.py:385: in _check_plots_plevs
    self._check_plots_generic(
tests/integration/test_diags.py:372: in _check_plots_generic
    self._check_html_image(html_path, png_path, full_png_path)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <tests.integration.test_diags.TestAllSets object at 0x7f1506628ee0>
html_path = 'tests/integration/all_sets_results_test/viewer/lat_lon/era-interim/t-850mb-global-era-interim/ann.html'
png_path = 'lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-global.png'
full_png_path = 'tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-global.png'

    def _check_html_image(self, html_path, png_path, full_png_path):
        # Check HTML image tags exist.
        img_src = None
        option_value = None
        href = None
        with open(html_path, "r") as html:
            for line in html:
                # If `img_src` is not defined yet:
                if not img_src:
                    re_str = '<img src="../../../../{}">'.format(png_path)
                    img_src = re.search(re_str, line)
                # If `option_value` is not defined yet:
                if not option_value:
                    re_str = '<option value="../../../../{}">'.format(png_path)
                    option_value = re.search(re_str, line)
                # If `href` is not defined yet:
                if not href:
                    re_str = 'href="../../../../{}">'.format(png_path)
                    href = re.search(re_str, line)

        assert img_src is not None
        assert option_value is not None
        assert href is not None

        image_name = os.path.split(png_path)[-1]
        path_to_actual_png = full_png_path
        path_to_expected_png = f"{TEST_IMAGES_PATH}/{png_path}"

        if "CHECK_IMAGES" in os.environ:
            # Set `export CHECK_IMAGES=True` to do a pixel-by-pixel image comparison check.
            check_images = os.environ["CHECK_IMAGES"].lower() in [
                "true",
                "yes",
                "t",
                "y",
                "1",
            ]
        else:
            check_images = True

        if check_images:
            mismatched_images: List[str] = []
            _compare_images(
                mismatched_images,
                image_name,
                path_to_actual_png,
                path_to_expected_png,
            )
>           assert len(mismatched_images) == 0
E           AssertionError: assert 1 == 0
E            +  where 1 = len(['ERA-Interim-T-850-ANN-global.png'])

tests/integration/test_diags.py:322: AssertionError
---------------------------------------------------------- Captured log call -----------------------------------------------------------
INFO     tests.integration.test_diags:test_diags.py:116
path_to_actual_png=tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-global.png
INFO     tests.integration.test_diags:test_diags.py:117 path_to_expected_png=tests/integration//integration_test_images//lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-global.png
INFO     tests.integration.test_diags:test_diags.py:118 diff has 9455 nonzero pixels.
INFO     tests.integration.test_diags:test_diags.py:121 total number of pixels=2103750
INFO     tests.integration.test_diags:test_diags.py:123 num_nonzero_pixels/num_pixels fraction=0.00449435531788473
_____________________________________________ TestAllSets.test_lat_lon_regional_plot_diffs _____________________________________________

self = <tests.integration.test_diags.TestAllSets object at 0x7f1506629060>

    def test_lat_lon_regional_plot_diffs(self):
>       self._check_plots_plevs("lat_lon", "CONUS_RRM", [850.0])

tests/integration/test_diags.py:225:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/integration/test_diags.py:385: in _check_plots_plevs
    self._check_plots_generic(
tests/integration/test_diags.py:372: in _check_plots_generic
    self._check_html_image(html_path, png_path, full_png_path)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <tests.integration.test_diags.TestAllSets object at 0x7f1506629060>
html_path = 'tests/integration/all_sets_results_test/viewer/lat_lon/era-interim/t-850mb-conus_rrm-era-interim/ann.html'
png_path = 'lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-CONUS_RRM.png'
full_png_path = 'tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-CONUS_RRM.png'

    def _check_html_image(self, html_path, png_path, full_png_path):
        # Check HTML image tags exist.
        img_src = None
        option_value = None
        href = None
        with open(html_path, "r") as html:
            for line in html:
                # If `img_src` is not defined yet:
                if not img_src:
                    re_str = '<img src="../../../../{}">'.format(png_path)
                    img_src = re.search(re_str, line)
                # If `option_value` is not defined yet:
                if not option_value:
                    re_str = '<option value="../../../../{}">'.format(png_path)
                    option_value = re.search(re_str, line)
                # If `href` is not defined yet:
                if not href:
                    re_str = 'href="../../../../{}">'.format(png_path)
                    href = re.search(re_str, line)

        assert img_src is not None
        assert option_value is not None
        assert href is not None

        image_name = os.path.split(png_path)[-1]
        path_to_actual_png = full_png_path
        path_to_expected_png = f"{TEST_IMAGES_PATH}/{png_path}"

        if "CHECK_IMAGES" in os.environ:
            # Set `export CHECK_IMAGES=True` to do a pixel-by-pixel image comparison check.
            check_images = os.environ["CHECK_IMAGES"].lower() in [
                "true",
                "yes",
                "t",
                "y",
                "1",
            ]
        else:
            check_images = True

        if check_images:
            mismatched_images: List[str] = []
            _compare_images(
                mismatched_images,
                image_name,
                path_to_actual_png,
                path_to_expected_png,
            )
>           assert len(mismatched_images) == 0
E           AssertionError: assert 1 == 0
E            +  where 1 = len(['ERA-Interim-T-850-ANN-CONUS_RRM.png'])

tests/integration/test_diags.py:322: AssertionError
---------------------------------------------------------- Captured log call -----------------------------------------------------------
INFO     tests.integration.test_diags:test_diags.py:116
path_to_actual_png=tests/integration/all_sets_results_test/lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-CONUS_RRM.png
INFO     tests.integration.test_diags:test_diags.py:117 path_to_expected_png=tests/integration//integration_test_images//lat_lon/ERA-Interim/ERA-Interim-T-850-ANN-CONUS_RRM.png
INFO     tests.integration.test_diags:test_diags.py:118 diff has 49777 nonzero pixels.
INFO     tests.integration.test_diags:test_diags.py:121 total number of pixels=2103750
INFO     tests.integration.test_diags:test_diags.py:123 num_nonzero_pixels/num_pixels fraction=0.023661081402257873
__________________________________________________ TestAllSets.test_polar_plot_diffs ___________________________________________________

self = <tests.integration.test_diags.TestAllSets object at 0x7f1506629360>

    def test_polar_plot_diffs(self):
>       self._check_plots_plevs("polar", "polar_S", [850.0])

tests/integration/test_diags.py:231:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/integration/test_diags.py:385: in _check_plots_plevs
    self._check_plots_generic(
tests/integration/test_diags.py:372: in _check_plots_generic
    self._check_html_image(html_path, png_path, full_png_path)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <tests.integration.test_diags.TestAllSets object at 0x7f1506629360>
html_path = 'tests/integration/all_sets_results_test/viewer/polar/era-interim/t-850mb-polar_s-era-interim/ann.html'
png_path = 'polar/ERA-Interim/ERA-Interim-T-850-ANN-polar_S.png'
full_png_path = 'tests/integration/all_sets_results_test/polar/ERA-Interim/ERA-Interim-T-850-ANN-polar_S.png'

    def _check_html_image(self, html_path, png_path, full_png_path):
        # Check HTML image tags exist.
        img_src = None
        option_value = None
        href = None
        with open(html_path, "r") as html:
            for line in html:
                # If `img_src` is not defined yet:
                if not img_src:
                    re_str = '<img src="../../../../{}">'.format(png_path)
                    img_src = re.search(re_str, line)
                # If `option_value` is not defined yet:
                if not option_value:
                    re_str = '<option value="../../../../{}">'.format(png_path)
                    option_value = re.search(re_str, line)
                # If `href` is not defined yet:
                if not href:
                    re_str = 'href="../../../../{}">'.format(png_path)
                    href = re.search(re_str, line)

        assert img_src is not None
        assert option_value is not None
        assert href is not None

        image_name = os.path.split(png_path)[-1]
        path_to_actual_png = full_png_path
        path_to_expected_png = f"{TEST_IMAGES_PATH}/{png_path}"

        if "CHECK_IMAGES" in os.environ:
            # Set `export CHECK_IMAGES=True` to do a pixel-by-pixel image comparison check.
            check_images = os.environ["CHECK_IMAGES"].lower() in [
                "true",
                "yes",
                "t",
                "y",
                "1",
            ]
        else:
            check_images = True

        if check_images:
            mismatched_images: List[str] = []
            _compare_images(
                mismatched_images,
                image_name,
                path_to_actual_png,
                path_to_expected_png,
            )
>           assert len(mismatched_images) == 0
E           AssertionError: assert 1 == 0
E            +  where 1 = len(['ERA-Interim-T-850-ANN-polar_S.png'])

tests/integration/test_diags.py:322: AssertionError
---------------------------------------------------------- Captured log call -----------------------------------------------------------
INFO     tests.integration.test_diags:test_diags.py:116
path_to_actual_png=tests/integration/all_sets_results_test/polar/ERA-Interim/ERA-Interim-T-850-ANN-polar_S.png
INFO     tests.integration.test_diags:test_diags.py:117 path_to_expected_png=tests/integration//integration_test_images//polar/ERA-Interim/ERA-Interim-T-850-ANN-polar_S.png
INFO     tests.integration.test_diags:test_diags.py:118 diff has 1211 nonzero pixels.
INFO     tests.integration.test_diags:test_diags.py:121 total number of pixels=2103750
INFO     tests.integration.test_diags:test_diags.py:123 num_nonzero_pixels/num_pixels fraction=0.0005756387403446227
___________________________________________________ TestAllSets.test_qbo_plot_diffs ____________________________________________________

self = <tests.integration.test_diags.TestAllSets object at 0x7f15066294e0>

    def test_qbo_plot_diffs(self):
        case_id = "qbo-test"
        case_id_lower = case_id.lower()
        set_name = "qbo"

        # Check PNG path is the same as the expected.
        png_path = "{}/{}/qbo_diags.png".format(set_name, case_id)
        full_png_path = "{}{}".format(self.results_dir, png_path)
        path_exists = os.path.exists(full_png_path)

        assert path_exists

        # Check full HTML path is the same as the expected.
        # viewer/qbo/variable/era-interim/plot.html
        html_path = "{}viewer/{}/variable/{}/plot.html".format(
            self.results_dir, set_name, case_id_lower
        )
>       self._check_html_image(html_path, png_path, full_png_path)

tests/integration/test_diags.py:250:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <tests.integration.test_diags.TestAllSets object at 0x7f15066294e0>
html_path = 'tests/integration/all_sets_results_test/viewer/qbo/variable/qbo-test/plot.html', png_path = 'qbo/qbo-test/qbo_diags.png'
full_png_path = 'tests/integration/all_sets_results_test/qbo/qbo-test/qbo_diags.png'

    def _check_html_image(self, html_path, png_path, full_png_path):
        # Check HTML image tags exist.
        img_src = None
        option_value = None
        href = None
        with open(html_path, "r") as html:
            for line in html:
                # If `img_src` is not defined yet:
                if not img_src:
                    re_str = '<img src="../../../../{}">'.format(png_path)
                    img_src = re.search(re_str, line)
                # If `option_value` is not defined yet:
                if not option_value:
                    re_str = '<option value="../../../../{}">'.format(png_path)
                    option_value = re.search(re_str, line)
                # If `href` is not defined yet:
                if not href:
                    re_str = 'href="../../../../{}">'.format(png_path)
                    href = re.search(re_str, line)

        assert img_src is not None
        assert option_value is not None
        assert href is not None

        image_name = os.path.split(png_path)[-1]
        path_to_actual_png = full_png_path
        path_to_expected_png = f"{TEST_IMAGES_PATH}/{png_path}"

        if "CHECK_IMAGES" in os.environ:
            # Set `export CHECK_IMAGES=True` to do a pixel-by-pixel image comparison check.
            check_images = os.environ["CHECK_IMAGES"].lower() in [
                "true",
                "yes",
                "t",
                "y",
                "1",
            ]
        else:
            check_images = True

        if check_images:
            mismatched_images: List[str] = []
            _compare_images(
                mismatched_images,
                image_name,
                path_to_actual_png,
                path_to_expected_png,
            )
>           assert len(mismatched_images) == 0
E           AssertionError: assert 1 == 0
E            +  where 1 = len(['qbo_diags.png'])

tests/integration/test_diags.py:322: AssertionError
---------------------------------------------------------- Captured log call -----------------------------------------------------------
INFO     tests.integration.test_diags:test_diags.py:116
path_to_actual_png=tests/integration/all_sets_results_test/qbo/qbo-test/qbo_diags.png
INFO     tests.integration.test_diags:test_diags.py:117 path_to_expected_png=tests/integration//integration_test_images//qbo/qbo-test/qbo_diags.png
INFO     tests.integration.test_diags:test_diags.py:118 diff has 10335 nonzero pixels.
INFO     tests.integration.test_diags:test_diags.py:121 total number of pixels=1960000
INFO     tests.integration.test_diags:test_diags.py:123 num_nonzero_pixels/num_pixels fraction=0.0052729591836734695
________________________________________________ TestAllSets.test_streamflow_plot_diffs ________________________________________________

self = <tests.integration.test_diags.TestAllSets object at 0x7f1506629660>

    def test_streamflow_plot_diffs(self):
>       self._check_streamflow_plots()

tests/integration/test_diags.py:253:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/integration/test_diags.py:486: in _check_streamflow_plots
    self._check_html_image(full_html_path, png_path, full_png_path)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <tests.integration.test_diags.TestAllSets object at 0x7f1506629660>
html_path = 'tests/integration/all_sets_results_test/viewer/streamflow/seasonality-map/river_discharge_over_land_liq_gsim-seasonality_map/plot.html'
png_path = 'streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/seasonality_map.png'
full_png_path = 'tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/seasonality_map.png'

    def _check_html_image(self, html_path, png_path, full_png_path):
        # Check HTML image tags exist.
        img_src = None
        option_value = None
        href = None
        with open(html_path, "r") as html:
            for line in html:
                # If `img_src` is not defined yet:
                if not img_src:
                    re_str = '<img src="../../../../{}">'.format(png_path)
                    img_src = re.search(re_str, line)
                # If `option_value` is not defined yet:
                if not option_value:
                    re_str = '<option value="../../../../{}">'.format(png_path)
                    option_value = re.search(re_str, line)
                # If `href` is not defined yet:
                if not href:
                    re_str = 'href="../../../../{}">'.format(png_path)
                    href = re.search(re_str, line)

        assert img_src is not None
        assert option_value is not None
        assert href is not None

        image_name = os.path.split(png_path)[-1]
        path_to_actual_png = full_png_path
        path_to_expected_png = f"{TEST_IMAGES_PATH}/{png_path}"

        if "CHECK_IMAGES" in os.environ:
            # Set `export CHECK_IMAGES=True` to do a pixel-by-pixel image comparison check.
            check_images = os.environ["CHECK_IMAGES"].lower() in [
                "true",
                "yes",
                "t",
                "y",
                "1",
            ]
        else:
            check_images = True

        if check_images:
            mismatched_images: List[str] = []
            _compare_images(
                mismatched_images,
                image_name,
                path_to_actual_png,
                path_to_expected_png,
            )
>           assert len(mismatched_images) == 0
E           AssertionError: assert 1 == 0
E            +  where 1 = len(['seasonality_map.png'])

tests/integration/test_diags.py:322: AssertionError
---------------------------------------------------------- Captured log call -----------------------------------------------------------
INFO     tests.integration.test_diags:test_diags.py:116
path_to_actual_png=tests/integration/all_sets_results_test/streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/seasonality_map.png
INFO     tests.integration.test_diags:test_diags.py:117 path_to_expected_png=tests/integration//integration_test_images//streamflow/RIVER_DISCHARGE_OVER_LAND_LIQ_GSIM/seasonality_map.png
INFO     tests.integration.test_diags:test_diags.py:118 diff has 3331 nonzero pixels.
INFO     tests.integration.test_diags:test_diags.py:121 total number of pixels=2103750
INFO     tests.integration.test_diags:test_diags.py:123 num_nonzero_pixels/num_pixels fraction=0.0015833630421865717
______________________________________________ TestAllSets.test_zonal_mean_2d_plot_diffs _______________________________________________

self = <tests.integration.test_diags.TestAllSets object at 0x7f15066297e0>

    def test_zonal_mean_2d_plot_diffs(self):
>       self._check_plots_2d("zonal_mean_2d")

tests/integration/test_diags.py:256:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/integration/test_diags.py:375: in _check_plots_2d
    self._check_plots_generic(
tests/integration/test_diags.py:372: in _check_plots_generic
    self._check_html_image(html_path, png_path, full_png_path)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <tests.integration.test_diags.TestAllSets object at 0x7f15066297e0>
html_path = 'tests/integration/all_sets_results_test/viewer/zonal_mean_2d/era-interim/t-global-era-interim/ann.html'
png_path = 'zonal_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png'
full_png_path = 'tests/integration/all_sets_results_test/zonal_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png'

    def _check_html_image(self, html_path, png_path, full_png_path):
        # Check HTML image tags exist.
        img_src = None
        option_value = None
        href = None
        with open(html_path, "r") as html:
            for line in html:
                # If `img_src` is not defined yet:
                if not img_src:
                    re_str = '<img src="../../../../{}">'.format(png_path)
                    img_src = re.search(re_str, line)
                # If `option_value` is not defined yet:
                if not option_value:
                    re_str = '<option value="../../../../{}">'.format(png_path)
                    option_value = re.search(re_str, line)
                # If `href` is not defined yet:
                if not href:
                    re_str = 'href="../../../../{}">'.format(png_path)
                    href = re.search(re_str, line)

        assert img_src is not None
        assert option_value is not None
        assert href is not None

        image_name = os.path.split(png_path)[-1]
        path_to_actual_png = full_png_path
        path_to_expected_png = f"{TEST_IMAGES_PATH}/{png_path}"

        if "CHECK_IMAGES" in os.environ:
            # Set `export CHECK_IMAGES=True` to do a pixel-by-pixel image comparison check.
            check_images = os.environ["CHECK_IMAGES"].lower() in [
                "true",
                "yes",
                "t",
                "y",
                "1",
            ]
        else:
            check_images = True

        if check_images:
            mismatched_images: List[str] = []
            _compare_images(
                mismatched_images,
                image_name,
                path_to_actual_png,
                path_to_expected_png,
            )
>           assert len(mismatched_images) == 0
E           AssertionError: assert 1 == 0
E            +  where 1 = len(['ERA-Interim-T-ANN-global.png'])

tests/integration/test_diags.py:322: AssertionError
---------------------------------------------------------- Captured log call -----------------------------------------------------------
INFO     tests.integration.test_diags:test_diags.py:116
path_to_actual_png=tests/integration/all_sets_results_test/zonal_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png
INFO     tests.integration.test_diags:test_diags.py:117 path_to_expected_png=tests/integration//integration_test_images//zonal_mean_2d/ERA-Interim/ERA-Interim-T-ANN-global.png
INFO     tests.integration.test_diags:test_diags.py:118 diff has 880 nonzero pixels.
INFO     tests.integration.test_diags:test_diags.py:121 total number of pixels=2103750
INFO     tests.integration.test_diags:test_diags.py:123 num_nonzero_pixels/num_pixels fraction=0.0004183006535947712

---------- coverage: platform linux, python 3.10.12-final-0 ----------
Name                                                           Stmts   Miss  Cover
----------------------------------------------------------------------------------
e3sm_diags/__init__.py                                            12      0   100%
e3sm_diags/derivations/__init__.py                                 0      0   100%
e3sm_diags/derivations/acme.py                                   366    366     0%
e3sm_diags/derivations/default_regions.py                          3      3     0%
e3sm_diags/derivations/default_regions_xr.py                       2      2     0%
e3sm_diags/derivations/derivations.py                              7      7     0%
e3sm_diags/derivations/formulas.py                               206    206     0%
e3sm_diags/derivations/utils.py                                  176    176     0%
e3sm_diags/driver/__init__.py                                      6      6     0%
e3sm_diags/driver/aerosol_aeronet_driver.py                       60     60     0%
e3sm_diags/driver/aerosol_budget_driver.py                       102    102     0%
e3sm_diags/driver/annual_cycle_zonal_mean_driver.py               65     65     0%
e3sm_diags/driver/area_mean_time_series_driver.py                 68     68     0%
e3sm_diags/driver/arm_diags_driver.py                            315    315     0%
e3sm_diags/driver/cosp_histogram_driver.py                        59     59     0%
e3sm_diags/driver/diurnal_cycle_driver.py                         48     48     0%
e3sm_diags/driver/enso_diags_driver.py                           241    241     0%
e3sm_diags/driver/lat_lon_driver.py                              123    123     0%
e3sm_diags/driver/lat_lon_land_driver.py                           8      8     0%
e3sm_diags/driver/lat_lon_river_driver.py                          8      8     0%
e3sm_diags/driver/meridional_mean_2d_driver.py                   107    107     0%
e3sm_diags/driver/mp_partition_driver.py                          60     60     0%
e3sm_diags/driver/polar_driver.py                                 95     95     0%
e3sm_diags/driver/qbo_driver.py                                  147    147     0%
e3sm_diags/driver/streamflow_driver.py                           266    266     0%
e3sm_diags/driver/tc_analysis_driver.py                          233    233     0%
e3sm_diags/driver/utils/__init__.py                                1      1     0%
e3sm_diags/driver/utils/climo.py                                  35     35     0%
e3sm_diags/driver/utils/climo_xr.py                               32     32     0%
e3sm_diags/driver/utils/dataset.py                               312    312     0%
e3sm_diags/driver/utils/dataset_xr.py                            274    274     0%
e3sm_diags/driver/utils/diurnal_cycle.py                          95     95     0%
e3sm_diags/driver/utils/general.py                               191    191     0%
e3sm_diags/driver/utils/io.py                                     29     29     0%
e3sm_diags/driver/utils/regrid.py                                143    143     0%
e3sm_diags/driver/zonal_mean_2d_driver.py                        121    121     0%
e3sm_diags/driver/zonal_mean_2d_stratosphere_driver.py             8      8     0%
e3sm_diags/driver/zonal_mean_xy_driver.py                        102    102     0%
e3sm_diags/e3sm_diags_driver.py                                  178    178     0%
e3sm_diags/e3sm_diags_vars.py                                     59     59     0%
e3sm_diags/logger.py                                              23      4    83%
e3sm_diags/metrics/__init__.py                                    32     32     0%
e3sm_diags/metrics/metrics.py                                     42     42     0%
e3sm_diags/parameter/__init__.py                                  16     16     0%
e3sm_diags/parameter/annual_cycle_zonal_mean_parameter.py          5      5     0%
e3sm_diags/parameter/area_mean_time_series_parameter.py           21     21     0%
e3sm_diags/parameter/arm_diags_parameter.py                       15     15     0%
e3sm_diags/parameter/core_parameter.py                           110    110     0%
e3sm_diags/parameter/diurnal_cycle_parameter.py                    7      7     0%
e3sm_diags/parameter/enso_diags_parameter.py                      20     20     0%
e3sm_diags/parameter/lat_lon_land_parameter.py                     4      4     0%
e3sm_diags/parameter/lat_lon_river_parameter.py                    4      4     0%
e3sm_diags/parameter/meridional_mean_2d_parameter.py              24     24     0%
e3sm_diags/parameter/mp_partition_parameter.py                    11     11     0%
e3sm_diags/parameter/qbo_parameter.py                             11     11     0%
e3sm_diags/parameter/streamflow_parameter.py                      16     16     0%
e3sm_diags/parameter/tc_analysis_parameter.py                     12     12     0%
e3sm_diags/parameter/time_series_parameter.py                     31     31     0%
e3sm_diags/parameter/zonal_mean_2d_parameter.py                   24     24     0%
e3sm_diags/parameter/zonal_mean_2d_stratosphere_parameter.py       7      7     0%
e3sm_diags/parser/__init__.py                                     13     13     0%
e3sm_diags/parser/area_mean_time_series_parser.py                 12     12     0%
e3sm_diags/parser/arm_diags_parser.py                              8      8     0%
e3sm_diags/parser/core_parser.py                                 343    343     0%
e3sm_diags/parser/diurnal_cycle_parser.py                         13     13     0%
e3sm_diags/parser/enso_diags_parser.py                            12     12     0%
e3sm_diags/parser/meridional_mean_2d_parser.py                     9      9     0%
e3sm_diags/parser/mp_partition_parser.py                          11     11     0%
e3sm_diags/parser/qbo_parser.py                                   11     11     0%
e3sm_diags/parser/streamflow_parser.py                            14     14     0%
e3sm_diags/parser/tc_analysis_parser.py                            5      5     0%
e3sm_diags/parser/zonal_mean_2d_parser.py                         10     10     0%
e3sm_diags/parser/zonal_mean_2d_stratosphere_parser.py            10     10     0%
e3sm_diags/plot/__init__.py                                       53     53     0%
e3sm_diags/plot/cartopy/__init__.py                                0      0   100%
e3sm_diags/plot/cartopy/aerosol_aeronet_plot.py                   68     68     0%
e3sm_diags/plot/cartopy/annual_cycle_zonal_mean_plot.py           97     97     0%
e3sm_diags/plot/cartopy/area_mean_time_series_plot.py             64     64     0%
e3sm_diags/plot/cartopy/arm_diags_plot.py                        353    353     0%
e3sm_diags/plot/cartopy/cosp_histogram_plot.py                   114    114     0%
e3sm_diags/plot/cartopy/deprecated_lat_lon_plot.py               186    186     0%
e3sm_diags/plot/cartopy/diurnal_cycle_plot.py                    175    175     0%
e3sm_diags/plot/cartopy/enso_diags_plot.py                       237    237     0%
e3sm_diags/plot/cartopy/meridional_mean_2d_plot.py               121    121     0%
e3sm_diags/plot/cartopy/mp_partition_plot.py                      34     34     0%
e3sm_diags/plot/cartopy/polar_plot.py                            131    131     0%
e3sm_diags/plot/cartopy/qbo_plot.py                               97     97     0%
e3sm_diags/plot/cartopy/streamflow_plot.py                       385    385     0%
e3sm_diags/plot/cartopy/taylor_diagram.py                         59     59     0%
e3sm_diags/plot/cartopy/tc_analysis_plot.py                      169    169     0%
e3sm_diags/plot/cartopy/zonal_mean_2d_plot.py                    137    137     0%
e3sm_diags/plot/cartopy/zonal_mean_2d_stratosphere_plot.py         4      4     0%
e3sm_diags/plot/cartopy/zonal_mean_xy_plot.py                     69     69     0%
e3sm_diags/plot/lat_lon_land_plot.py                               4      4     0%
e3sm_diags/plot/lat_lon_plot.py                                   33     33     0%
e3sm_diags/plot/lat_lon_river_plot.py                              4      4     0%
e3sm_diags/plot/utils.py                                         169    169     0%
e3sm_diags/run.py                                                111    111     0%
e3sm_diags/utils.py                                                8      8     0%
e3sm_diags/viewer/__init__.py                                      0      0   100%
e3sm_diags/viewer/aerosol_budget_viewer.py                        36     36     0%
e3sm_diags/viewer/annual_cycle_zonal_mean_viewer.py               22     22     0%
e3sm_diags/viewer/area_mean_time_series_viewer.py                 22     22     0%
e3sm_diags/viewer/arm_diags_viewer.py                             86     86     0%
e3sm_diags/viewer/default_viewer.py                              145    145     0%
e3sm_diags/viewer/enso_diags_viewer.py                            40     40     0%
e3sm_diags/viewer/lat_lon_viewer.py                              318    318     0%
e3sm_diags/viewer/main.py                                         54     54     0%
e3sm_diags/viewer/mean_2d_viewer.py                               41     41     0%
e3sm_diags/viewer/mp_partition_viewer.py                          27     27     0%
e3sm_diags/viewer/qbo_viewer.py                                   36     36     0%
e3sm_diags/viewer/streamflow_viewer.py                            45     45     0%
e3sm_diags/viewer/tc_analysis_viewer.py                           47     47     0%
e3sm_diags/viewer/utils.py                                        75     75     0%
----------------------------------------------------------------------------------
TOTAL                                                           9145   9114     1%
Coverage HTML written to dir tests_coverage_reports/htmlcov
Coverage XML written to file tests_coverage_reports/coverage.xml

======================================================= short test summary info ========================================================
FAILED tests/integration/test_diags.py::TestAllSets::test_lat_lon_plot_diffs - AssertionError: assert 1 == 0
FAILED tests/integration/test_diags.py::TestAllSets::test_lat_lon_regional_plot_diffs - AssertionError: assert 1 == 0
FAILED tests/integration/test_diags.py::TestAllSets::test_polar_plot_diffs - AssertionError: assert 1 == 0
FAILED tests/integration/test_diags.py::TestAllSets::test_qbo_plot_diffs - AssertionError: assert 1 == 0
FAILED tests/integration/test_diags.py::TestAllSets::test_streamflow_plot_diffs - AssertionError: assert 1 == 0
FAILED tests/integration/test_diags.py::TestAllSets::test_zonal_mean_2d_plot_diffs - AssertionError: assert 1 == 0
=============================================== 6 failed, 12 passed in 226.74s (0:03:46) ===============================================
  • Investigate specific variable regressions with ex1.py
    • NET_FLUX_SRF
    • RESTOM
  • Write unit tests to cover core components
    • lat_lon_driver.py
    • lat_lon_plot.py
    • plot/utils.py

@tomvothecoder tomvothecoder self-assigned this Oct 16, 2023
- Ignore adding bounds if user defined plevs is <= 1 element
- Fix setting time series attributes in `dataset_xr.py` for climatology datasets
- Update `_convert_units_to_mb()` to handle hPa units
- Fix subsetting on `ilev` in `_run_3d_diags()`
- Refactor `test_all_sets.py` for readability and use pytest
- Update workspace debugger settings to function work with testing api
@tomvothecoder tomvothecoder added the cdat-migration-fy24 CDAT Migration FY24 Task label Oct 18, 2023
@tomvothecoder tomvothecoder force-pushed the refactor/671-regression-test-lat-lon branch from a1aee86 to 21f3bfc Compare October 19, 2023 23:41
@tomvothecoder tomvothecoder marked this pull request as ready for review October 23, 2023 16:16
@tomvothecoder tomvothecoder merged commit bb16036 into cdat-migration-fy24 Oct 23, 2023
@tomvothecoder tomvothecoder deleted the refactor/671-regression-test-lat-lon branch October 23, 2023 18:20
tomvothecoder added a commit that referenced this pull request Oct 23, 2023
…nd`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`
tomvothecoder added a commit that referenced this pull request Nov 28, 2023
…nd`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`
tomvothecoder added a commit that referenced this pull request Nov 29, 2023
…nd`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`
tomvothecoder added a commit that referenced this pull request Nov 29, 2023
…nd`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`
tomvothecoder added a commit that referenced this pull request Nov 29, 2023
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Nov 29, 2023
…nd`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`
tomvothecoder added a commit that referenced this pull request Nov 29, 2023
…nd`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`
tomvothecoder added a commit that referenced this pull request Dec 13, 2023
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Dec 13, 2023
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Dec 18, 2023
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit to forsyth2/e3sm_diags that referenced this pull request Dec 18, 2023
…SM-Project#677)

Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (E3SM-Project#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (E3SM-Project#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (E3SM-Project#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Jan 3, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Jan 3, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Jan 8, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request May 1, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Jul 15, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Jul 15, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Aug 21, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Oct 1, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Oct 25, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Oct 29, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Oct 29, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Nov 4, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Nov 11, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Dec 4, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class
tomvothecoder added a commit that referenced this pull request Dec 5, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class

Regression testing for lat_lon variables `NET_FLUX_SRF` and `RESTOM` (#754)

Update regression test notebook to show validation of all vars

Add `subset_and_align_datasets()` to regrid.py (#776)

Add template run scripts

CDAT Migration Phase: Refactor `cosp_histogram` set (#748)

- Refactor `cosp_histogram_driver.py` and `cosp_histogram_plot.py`
- `formulas_cosp.py` (new file)
  - Includes refactored, Xarray-based `cosp_histogram_standard()` and `cosp_bin_sum()` functions
  - I wrote a lot of new code in `formulas_cosp.py` to clean up `derivations.py` and the old equivalent functions in `utils.py`
- `derivations.py`
  - Cleaned up portions of `DERIVED_VARIABLES` dictionary
  - Removed unnecessary `OrderedDict` usage for `cosp_histogram` related variables (we should do this for the rest of the variables in in #716)
  - Remove unnecessary `convert_units()` function calls
  - Move cloud levels passed to derived variable formulas to `formulas_cosp.CLOUD_BIN_SUM_MAP`
- `utils.py`
  - Delete deprecated, CDAT-based `cosp_histogram` functions
- `dataset_xr.py`
  - Add `dataset_xr.Dataset._open_climo_dataset()` method with a catch for dataset quality issues where "time" is a scalar variable that does not match the "time" dimension array length, drops this variable and replaces it with the correct coordinate
  -  Update `_get_dataset_with_derivation_func()` to handle derivation functions that require the `xr.Dataset` and `target_var_key` args (e.g., `cosp_histogram_standardize()` and `cosp_bin_sum()`)
- `io.py`
  - Update `_write_vars_to_netcdf()` to write test, ref, and diff variables to individual netCDF (required for easy comparison to CDAT-based code that does the same thing)
- Add `cdat_migration_regression_test_netcdf.ipynb` validation notebook template for comparing `.nc` files

CDAT Migration Phase 2: Refactor `zonal_mean_2d()` and `zonal_mean_2d_stratosphere()` sets (#774)

Refactor 654 zonal mean xy (#752)

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

CDAT Migration - Update run script output directory to NERSC public webserver (#793)

[PR]: CDAT Migration: Refactor `aerosol_aeronet` set (#788)

CDAT Migration: Test `lat_lon` set with run script and debug any issues (#794)

CDAT Migration: Refactor `polar` set (#749)

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

Align order of calls to `_set_param_output_attrs`

CDAT Migration: Refactor `meridional_mean_2d` set (#795)

CDAT Migration: Refactor `aerosol_budget` (#800)

Add `acme.py` changes from PR #712 (#814)

* Add `acme.py` changes from PR #712

* Replace unnecessary lambda call

Refactor area_mean_time_series and add ccb slice flag feature (#750)

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

[Refactor]: Validate fix in PR #750 for #759 (#815)

CDAT Migration Phase 2: Refactor `diurnal_cycle` set (#819)

CDAT Migration: Refactor annual_cycle_zonal_mean set (#798)

* Refactor `annual_cycle_zonal_mean` set

* Address PR review comments

* Add lat lon regression testing

* Add debugging scripts

* Update `_open_climo_dataset()` to decode times as workaround to misaligned time coords
- Update `annual_cycle_zonal_mean_plot.py` to convert time coordinates to month integers

* Fix unit tests

* Remove old plotter

* Add script to debug decode_times=True and ncclimo file

* Update plotter time values to month integers

* Fix slow `.load()` and multiprocessing issue
- Due to incorrectly updating `keep_bnds` logic
- Add `_encode_time_coords()` to workaround cftime issue `ValueError: "months since" units only allowed for "360_day" calendar`

* Update `_encode_time_coords()` docstring

* Add AODVIS debug script

* update AODVIS obs datasets; regression test results

---------

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

CDAT Migration Phase 2: Refactor `qbo` set (#826)

CDAT Migration Phase 2: Refactor tc_analysis set  (#829)

* start tc_analysis_refactor

* update driver

* update plotting

* Clean up plotter
- Remove unused variables
- Make `plot_info` a constant called `PLOT_INFO`, which is now a dict of dicts
- Reorder functions for top-down readability

* Remove unused notebook

---------

Co-authored-by: tomvothecoder <tomvothecoder@gmail.com>

CDAT Migration Phase 2: Refactor `enso_diags` set (#832)

CDAT Migration Phase 2: Refactor `streamflow` set (#837)

[Bug]: CDAT Migration Phase 2: enso_diags plot fixes (#841)

[Refactor]: CDAT Migration Phase 3: testing and documentation update (#846)

CDAT Migration Phase 3 - Port QBO Wavelet feature to Xarray/xCDAT codebase (#860)

CDAT Migration Phase 2: Refactor arm_diags set (#842)

Add performance benchmark material (#864)

Add function to add CF axis attr to Z axis if missing for downstream xCDAT operations (#865)

CDAT Migration Phase 3: Add Convective Precipitation Fraction in lat-lon (#875)

CDAT Migration Phase 3: Fix LHFLX name and add catch for non-existent or empty TE stitch file (#876)

Add support for time series datasets via glob and fix `enso_diags` set (#866)

Add fix for checking `is_time_series()` property based on `data_type` attr (#881)

CDAT migration: Fix African easterly wave density plots in TC analysis and convert H20LNZ units to ppm/volume (#882)

CDAT Migration: Update `mp_partition_driver.py` to use Dataset from `dataset_xr.py` (#883)

CDAT Migration - Port JJB tropical subseasonal diags to Xarray/xCDAT (#887)

CDAT Migration: Prepare branch for merge to `main` (#885)

[Refactor]: CDAT Migration - Update dependencies and remove Dataset._add_cf_attrs_to_z_axes() (#891)

CDAT Migration Phase 2: Refactor core utilities and  `lat_lon` set (#677)

Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class

CDAT Migration Phase 2: Refactor `zonal_mean_2d()` and `zonal_mean_2d_stratosphere()` sets (#774)

CDAT Migration Phase 2: Refactor `qbo` set (#826)
tomvothecoder added a commit that referenced this pull request Dec 5, 2024
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class

Regression testing for lat_lon variables `NET_FLUX_SRF` and `RESTOM` (#754)

Update regression test notebook to show validation of all vars

Add `subset_and_align_datasets()` to regrid.py (#776)

Add template run scripts

CDAT Migration Phase: Refactor `cosp_histogram` set (#748)

- Refactor `cosp_histogram_driver.py` and `cosp_histogram_plot.py`
- `formulas_cosp.py` (new file)
  - Includes refactored, Xarray-based `cosp_histogram_standard()` and `cosp_bin_sum()` functions
  - I wrote a lot of new code in `formulas_cosp.py` to clean up `derivations.py` and the old equivalent functions in `utils.py`
- `derivations.py`
  - Cleaned up portions of `DERIVED_VARIABLES` dictionary
  - Removed unnecessary `OrderedDict` usage for `cosp_histogram` related variables (we should do this for the rest of the variables in in #716)
  - Remove unnecessary `convert_units()` function calls
  - Move cloud levels passed to derived variable formulas to `formulas_cosp.CLOUD_BIN_SUM_MAP`
- `utils.py`
  - Delete deprecated, CDAT-based `cosp_histogram` functions
- `dataset_xr.py`
  - Add `dataset_xr.Dataset._open_climo_dataset()` method with a catch for dataset quality issues where "time" is a scalar variable that does not match the "time" dimension array length, drops this variable and replaces it with the correct coordinate
  -  Update `_get_dataset_with_derivation_func()` to handle derivation functions that require the `xr.Dataset` and `target_var_key` args (e.g., `cosp_histogram_standardize()` and `cosp_bin_sum()`)
- `io.py`
  - Update `_write_vars_to_netcdf()` to write test, ref, and diff variables to individual netCDF (required for easy comparison to CDAT-based code that does the same thing)
- Add `cdat_migration_regression_test_netcdf.ipynb` validation notebook template for comparing `.nc` files

CDAT Migration Phase 2: Refactor `zonal_mean_2d()` and `zonal_mean_2d_stratosphere()` sets (#774)

Refactor 654 zonal mean xy (#752)

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

CDAT Migration - Update run script output directory to NERSC public webserver (#793)

[PR]: CDAT Migration: Refactor `aerosol_aeronet` set (#788)

CDAT Migration: Test `lat_lon` set with run script and debug any issues (#794)

CDAT Migration: Refactor `polar` set (#749)

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

Align order of calls to `_set_param_output_attrs`

CDAT Migration: Refactor `meridional_mean_2d` set (#795)

CDAT Migration: Refactor `aerosol_budget` (#800)

Add `acme.py` changes from PR #712 (#814)

* Add `acme.py` changes from PR #712

* Replace unnecessary lambda call

Refactor area_mean_time_series and add ccb slice flag feature (#750)

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

[Refactor]: Validate fix in PR #750 for #759 (#815)

CDAT Migration Phase 2: Refactor `diurnal_cycle` set (#819)

CDAT Migration: Refactor annual_cycle_zonal_mean set (#798)

* Refactor `annual_cycle_zonal_mean` set

* Address PR review comments

* Add lat lon regression testing

* Add debugging scripts

* Update `_open_climo_dataset()` to decode times as workaround to misaligned time coords
- Update `annual_cycle_zonal_mean_plot.py` to convert time coordinates to month integers

* Fix unit tests

* Remove old plotter

* Add script to debug decode_times=True and ncclimo file

* Update plotter time values to month integers

* Fix slow `.load()` and multiprocessing issue
- Due to incorrectly updating `keep_bnds` logic
- Add `_encode_time_coords()` to workaround cftime issue `ValueError: "months since" units only allowed for "360_day" calendar`

* Update `_encode_time_coords()` docstring

* Add AODVIS debug script

* update AODVIS obs datasets; regression test results

---------

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

CDAT Migration Phase 2: Refactor `qbo` set (#826)

CDAT Migration Phase 2: Refactor tc_analysis set  (#829)

* start tc_analysis_refactor

* update driver

* update plotting

* Clean up plotter
- Remove unused variables
- Make `plot_info` a constant called `PLOT_INFO`, which is now a dict of dicts
- Reorder functions for top-down readability

* Remove unused notebook

---------

Co-authored-by: tomvothecoder <tomvothecoder@gmail.com>

CDAT Migration Phase 2: Refactor `enso_diags` set (#832)

CDAT Migration Phase 2: Refactor `streamflow` set (#837)

[Bug]: CDAT Migration Phase 2: enso_diags plot fixes (#841)

[Refactor]: CDAT Migration Phase 3: testing and documentation update (#846)

CDAT Migration Phase 3 - Port QBO Wavelet feature to Xarray/xCDAT codebase (#860)

CDAT Migration Phase 2: Refactor arm_diags set (#842)

Add performance benchmark material (#864)

Add function to add CF axis attr to Z axis if missing for downstream xCDAT operations (#865)

CDAT Migration Phase 3: Add Convective Precipitation Fraction in lat-lon (#875)

CDAT Migration Phase 3: Fix LHFLX name and add catch for non-existent or empty TE stitch file (#876)

Add support for time series datasets via glob and fix `enso_diags` set (#866)

Add fix for checking `is_time_series()` property based on `data_type` attr (#881)

CDAT migration: Fix African easterly wave density plots in TC analysis and convert H20LNZ units to ppm/volume (#882)

CDAT Migration: Update `mp_partition_driver.py` to use Dataset from `dataset_xr.py` (#883)

CDAT Migration - Port JJB tropical subseasonal diags to Xarray/xCDAT (#887)

CDAT Migration: Prepare branch for merge to `main` (#885)

[Refactor]: CDAT Migration - Update dependencies and remove Dataset._add_cf_attrs_to_z_axes() (#891)

CDAT Migration Phase 2: Refactor core utilities and  `lat_lon` set (#677)

Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class

CDAT Migration Phase 2: Refactor `zonal_mean_2d()` and `zonal_mean_2d_stratosphere()` sets (#774)

CDAT Migration Phase 2: Refactor `qbo` set (#826)
tomvothecoder added a commit that referenced this pull request Jan 15, 2025
Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class

Regression testing for lat_lon variables `NET_FLUX_SRF` and `RESTOM` (#754)

Update regression test notebook to show validation of all vars

Add `subset_and_align_datasets()` to regrid.py (#776)

Add template run scripts

CDAT Migration Phase: Refactor `cosp_histogram` set (#748)

- Refactor `cosp_histogram_driver.py` and `cosp_histogram_plot.py`
- `formulas_cosp.py` (new file)
  - Includes refactored, Xarray-based `cosp_histogram_standard()` and `cosp_bin_sum()` functions
  - I wrote a lot of new code in `formulas_cosp.py` to clean up `derivations.py` and the old equivalent functions in `utils.py`
- `derivations.py`
  - Cleaned up portions of `DERIVED_VARIABLES` dictionary
  - Removed unnecessary `OrderedDict` usage for `cosp_histogram` related variables (we should do this for the rest of the variables in in #716)
  - Remove unnecessary `convert_units()` function calls
  - Move cloud levels passed to derived variable formulas to `formulas_cosp.CLOUD_BIN_SUM_MAP`
- `utils.py`
  - Delete deprecated, CDAT-based `cosp_histogram` functions
- `dataset_xr.py`
  - Add `dataset_xr.Dataset._open_climo_dataset()` method with a catch for dataset quality issues where "time" is a scalar variable that does not match the "time" dimension array length, drops this variable and replaces it with the correct coordinate
  -  Update `_get_dataset_with_derivation_func()` to handle derivation functions that require the `xr.Dataset` and `target_var_key` args (e.g., `cosp_histogram_standardize()` and `cosp_bin_sum()`)
- `io.py`
  - Update `_write_vars_to_netcdf()` to write test, ref, and diff variables to individual netCDF (required for easy comparison to CDAT-based code that does the same thing)
- Add `cdat_migration_regression_test_netcdf.ipynb` validation notebook template for comparing `.nc` files

CDAT Migration Phase 2: Refactor `zonal_mean_2d()` and `zonal_mean_2d_stratosphere()` sets (#774)

Refactor 654 zonal mean xy (#752)

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

CDAT Migration - Update run script output directory to NERSC public webserver (#793)

[PR]: CDAT Migration: Refactor `aerosol_aeronet` set (#788)

CDAT Migration: Test `lat_lon` set with run script and debug any issues (#794)

CDAT Migration: Refactor `polar` set (#749)

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

Align order of calls to `_set_param_output_attrs`

CDAT Migration: Refactor `meridional_mean_2d` set (#795)

CDAT Migration: Refactor `aerosol_budget` (#800)

Add `acme.py` changes from PR #712 (#814)

* Add `acme.py` changes from PR #712

* Replace unnecessary lambda call

Refactor area_mean_time_series and add ccb slice flag feature (#750)

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

[Refactor]: Validate fix in PR #750 for #759 (#815)

CDAT Migration Phase 2: Refactor `diurnal_cycle` set (#819)

CDAT Migration: Refactor annual_cycle_zonal_mean set (#798)

* Refactor `annual_cycle_zonal_mean` set

* Address PR review comments

* Add lat lon regression testing

* Add debugging scripts

* Update `_open_climo_dataset()` to decode times as workaround to misaligned time coords
- Update `annual_cycle_zonal_mean_plot.py` to convert time coordinates to month integers

* Fix unit tests

* Remove old plotter

* Add script to debug decode_times=True and ncclimo file

* Update plotter time values to month integers

* Fix slow `.load()` and multiprocessing issue
- Due to incorrectly updating `keep_bnds` logic
- Add `_encode_time_coords()` to workaround cftime issue `ValueError: "months since" units only allowed for "360_day" calendar`

* Update `_encode_time_coords()` docstring

* Add AODVIS debug script

* update AODVIS obs datasets; regression test results

---------

Co-authored-by: Tom Vo <tomvothecoder@gmail.com>

CDAT Migration Phase 2: Refactor `qbo` set (#826)

CDAT Migration Phase 2: Refactor tc_analysis set  (#829)

* start tc_analysis_refactor

* update driver

* update plotting

* Clean up plotter
- Remove unused variables
- Make `plot_info` a constant called `PLOT_INFO`, which is now a dict of dicts
- Reorder functions for top-down readability

* Remove unused notebook

---------

Co-authored-by: tomvothecoder <tomvothecoder@gmail.com>

CDAT Migration Phase 2: Refactor `enso_diags` set (#832)

CDAT Migration Phase 2: Refactor `streamflow` set (#837)

[Bug]: CDAT Migration Phase 2: enso_diags plot fixes (#841)

[Refactor]: CDAT Migration Phase 3: testing and documentation update (#846)

CDAT Migration Phase 3 - Port QBO Wavelet feature to Xarray/xCDAT codebase (#860)

CDAT Migration Phase 2: Refactor arm_diags set (#842)

Add performance benchmark material (#864)

Add function to add CF axis attr to Z axis if missing for downstream xCDAT operations (#865)

CDAT Migration Phase 3: Add Convective Precipitation Fraction in lat-lon (#875)

CDAT Migration Phase 3: Fix LHFLX name and add catch for non-existent or empty TE stitch file (#876)

Add support for time series datasets via glob and fix `enso_diags` set (#866)

Add fix for checking `is_time_series()` property based on `data_type` attr (#881)

CDAT migration: Fix African easterly wave density plots in TC analysis and convert H20LNZ units to ppm/volume (#882)

CDAT Migration: Update `mp_partition_driver.py` to use Dataset from `dataset_xr.py` (#883)

CDAT Migration - Port JJB tropical subseasonal diags to Xarray/xCDAT (#887)

CDAT Migration: Prepare branch for merge to `main` (#885)

[Refactor]: CDAT Migration - Update dependencies and remove Dataset._add_cf_attrs_to_z_axes() (#891)

CDAT Migration Phase 2: Refactor core utilities and  `lat_lon` set (#677)

Refer to the PR for more information because the changelog is massive.

Update build workflow to run on `cdat-migration-fy24` branch

CDAT Migration Phase 2: Add CDAT regression test notebook template and fix GH Actions build (#743)

- Add Makefile for quick access to multiple Python-based commands such as linting, testing, cleaning up cache and build files
- Fix some lingering unit tests failure
- Update `xcdat=0.6.0rc1` to `xcdat >=0.6.0` in `ci.yml`, `dev.yml` and `dev-nompi.yml`
- Add `xskillscore` to `ci.yml`
- Fix `pre-commit` issues

CDAT Migration Phase 2: Regression testing for `lat_lon`, `lat_lon_land`, and `lat_lon_river` (#744)

- Add Makefile that simplifies common development commands (building and installing, testing, etc.)
- Write unit tests to cover all new code for utility functions
  - `dataset_xr.py`, `metrics.py`, `climo_xr.py`, `io.py`, `regrid.py`
- Metrics comparison for  `cdat-migration-fy24` `lat_lon` and `main` branch of `lat_lon` -- `NET_FLUX_SRF` and `RESTOM` have the highest spatial average diffs
- Test run with 3D variables (`_run_3d_diags()`)
  - Fix Python 3.9 bug with using pipe command to represent Union -- doesn't work with `from __future__ import annotations` still
  - Fix subsetting syntax bug using ilev
  - Fix regridding bug where a single plev is passed and xCDAT does not allow generating bounds for coordinates of len <= 1 -- add conditional that just ignores adding new bounds for regridded output datasets, fix related tests
  - Fix accidentally calling save plots and metrics twice in `_get_metrics_by_region()`
- Fix failing integration tests pass in CI/CD
  - Refactor `test_diags.py` -- replace unittest with pytest
  - Refactor `test_all_sets.py` -- replace unittest with pytest
  - Test climatology datasets -- tested with 3d variables using `test_all_sets.py`

CDAT Migration Phase 2: Refactor utilities and CoreParameter methods for reusability across diagnostic sets (#746)

- Move driver type annotations to `type_annotations.py`
- Move `lat_lon_driver._save_data_metrics_and_plots()` to `io.py`
- Update `_save_data_metrics_and_plots` args to accept `plot_func` callable
- Update `metrics.spatial_avg` to return an optionally `xr.DataArray` with `as_list=False`
- Move `parameter` arg to the top in `lat_lon_plot.plot`
- Move `_set_param_output_attrs` and `_set_name_yr_attrs` from `lat_lon_driver` to `CoreParameter` class

CDAT Migration Phase 2: Refactor `zonal_mean_2d()` and `zonal_mean_2d_stratosphere()` sets (#774)

CDAT Migration Phase 2: Refactor `qbo` set (#826)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cdat-migration-fy24 CDAT Migration FY24 Task
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant