From 4f31e06ab741bfa4f47f59b8944041eb03056c65 Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Sun, 7 Nov 2021 17:36:55 -0800 Subject: [PATCH 01/14] Added a environment.yml and requirements.txt file for the minimum environment needed to run the diagnostics code. This will also be used by the CI/CD. --- environment.yml | 16 ++++++++++++++++ requirements.txt | 10 ++++++++++ 2 files changed, 26 insertions(+) create mode 100644 environment.yml create mode 100644 requirements.txt diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..a3e7271 --- /dev/null +++ b/environment.yml @@ -0,0 +1,16 @@ +name: esmac_diags +channels: + - conda-forge + - anaconda + - defaults +dependencies: + - pip + - matplotlib + - numpy + - sphinx + - lxml + - conda-build + - pytest + - pytest-shutil + - ipython + - black \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0ea395b --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +pip +matplotlib +numpy +sphinx +lxml +conda-build +pytest +pytest-shutil +ipython +black \ No newline at end of file From f9decc6da41745135a3a4709f3a52b57eda018d3 Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Sun, 7 Nov 2021 17:37:44 -0800 Subject: [PATCH 02/14] Removed old python_dependency.txt --- Python_Dependency.txt | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 Python_Dependency.txt diff --git a/Python_Dependency.txt b/Python_Dependency.txt deleted file mode 100644 index a1f4fb3..0000000 --- a/Python_Dependency.txt +++ /dev/null @@ -1,8 +0,0 @@ -os -sys -glob -time -numpy -scipy -matplotlib -netCDF4 From 9012e2411c807dceb5ebdb7fdd75f7d63554da0c Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Sun, 7 Nov 2021 17:53:25 -0800 Subject: [PATCH 03/14] Moved source files into src/esmac_diags so we can actually install it --- {python => src/esmac_diags}/plotting/calc_statistic_flight_CN.py | 0 {python => src/esmac_diags}/plotting/calc_statistic_sfc_CN.py | 0 {python => src/esmac_diags}/plotting/calc_statistic_ship_CN.py | 0 .../plotting/contour_flight_timeseries_AerosolSize.py | 0 .../esmac_diags}/plotting/contour_sfc_diurnalcycle_AerosolSize.py | 0 .../esmac_diags}/plotting/contour_sfc_timeseries_AerosolSize.py | 0 .../esmac_diags}/plotting/contour_ship_timeseries_AerosolSize.py | 0 .../esmac_diags}/plotting/plot_flight_pdf_AerosolSize.py | 0 .../plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py | 0 .../plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py | 0 .../esmac_diags}/plotting/plot_flight_percentile_lat_CCN.py | 0 .../esmac_diags}/plotting/plot_flight_percentile_lat_CN.py | 0 .../esmac_diags}/plotting/plot_flight_percentile_lat_cldfreq.py | 0 .../plotting/plot_flight_percentile_z_AerosolComposition.py | 0 .../esmac_diags}/plotting/plot_flight_percentile_z_CCN.py | 0 .../esmac_diags}/plotting/plot_flight_percentile_z_CN.py | 0 .../esmac_diags}/plotting/plot_flight_profile_z_CldFreq.py | 0 {python => src/esmac_diags}/plotting/plot_flight_profile_z_LWC.py | 0 .../plotting/plot_flight_timeseries_AerosolComposition.py | 0 .../esmac_diags}/plotting/plot_flight_timeseries_CCN.py | 0 {python => src/esmac_diags}/plotting/plot_flight_timeseries_CN.py | 0 {python => src/esmac_diags}/plotting/plot_flight_track_height.py | 0 {python => src/esmac_diags}/plotting/plot_profile_cloud.py | 0 .../plotting/plot_sfc_diurnalcycle_AerosolComposition.py | 0 {python => src/esmac_diags}/plotting/plot_sfc_diurnalcycle_CCN.py | 0 {python => src/esmac_diags}/plotting/plot_sfc_diurnalcycle_CN.py | 0 {python => src/esmac_diags}/plotting/plot_sfc_pdf_AerosolSize.py | 0 .../esmac_diags}/plotting/plot_sfc_pie_AerosolComposition.py | 0 .../plotting/plot_sfc_timeseries_AerosolComposition.py | 0 {python => src/esmac_diags}/plotting/plot_sfc_timeseries_CCN.py | 0 {python => src/esmac_diags}/plotting/plot_sfc_timeseries_CN.py | 0 .../esmac_diags}/plotting/plot_ship_latitude_rainLWP.py | 0 {python => src/esmac_diags}/plotting/plot_ship_pdf_AerosolSize.py | 0 .../esmac_diags}/plotting/plot_ship_percentile_lat_CCN.py | 0 .../esmac_diags}/plotting/plot_ship_percentile_lat_CN.py | 0 .../esmac_diags}/plotting/plot_ship_percentile_lat_LWP.py | 0 .../esmac_diags}/plotting/plot_ship_percentile_lat_met.py | 0 {python => src/esmac_diags}/plotting/plot_ship_timeseries_CCN.py | 0 {python => src/esmac_diags}/plotting/plot_ship_timeseries_CN.py | 0 {python => src/esmac_diags}/plotting/plot_ship_timeseries_met.py | 0 {python => src/esmac_diags}/plotting/settings.py | 0 .../esmac_diags}/preprocessing/extract_E3SM_AOD_globalmean.py | 0 .../esmac_diags}/preprocessing/extract_E3SM_AOD_regionmean.py | 0 .../esmac_diags}/preprocessing/prep_E3SM_flighttrack_allvars.py | 0 .../esmac_diags}/preprocessing/prep_E3SM_flighttrack_bins.py | 0 .../esmac_diags}/preprocessing/prep_E3SM_profile_allvars.py | 0 .../esmac_diags}/preprocessing/prep_E3SM_sfc_allvars.py | 0 {python => src/esmac_diags}/preprocessing/prep_E3SM_sfc_bins.py | 0 .../esmac_diags}/preprocessing/prep_E3SM_shiptrack_allvars.py | 0 .../esmac_diags}/preprocessing/prep_E3SM_shiptrack_bins.py | 0 .../esmac_diags}/preprocessing/prep_E3SM_shiptrack_profiles.py | 0 .../esmac_diags}/preprocessing/prep_obs_mergesize_ACEENA.py | 0 .../esmac_diags}/preprocessing/prep_obs_mergesize_HISCALE.py | 0 .../esmac_diags}/preprocessing/prep_obs_mergesize_HiScale.py | 0 {python => src/esmac_diags}/preprocessing/settings.py | 0 {python => src/esmac_diags}/subroutines/CN_mode_to_size.py | 0 {python => src/esmac_diags}/subroutines/quality_control.py | 0 {python => src/esmac_diags}/subroutines/read_ARMdata.py | 0 {python => src/esmac_diags}/subroutines/read_aircraft.py | 0 {python => src/esmac_diags}/subroutines/read_netcdf.py | 0 {python => src/esmac_diags}/subroutines/read_ship.py | 0 {python => src/esmac_diags}/subroutines/read_surface.py | 0 .../esmac_diags}/subroutines/specific_data_treatment.py | 0 {python => src/esmac_diags}/subroutines/time_format_change.py | 0 64 files changed, 0 insertions(+), 0 deletions(-) rename {python => src/esmac_diags}/plotting/calc_statistic_flight_CN.py (100%) rename {python => src/esmac_diags}/plotting/calc_statistic_sfc_CN.py (100%) rename {python => src/esmac_diags}/plotting/calc_statistic_ship_CN.py (100%) rename {python => src/esmac_diags}/plotting/contour_flight_timeseries_AerosolSize.py (100%) rename {python => src/esmac_diags}/plotting/contour_sfc_diurnalcycle_AerosolSize.py (100%) rename {python => src/esmac_diags}/plotting/contour_sfc_timeseries_AerosolSize.py (100%) rename {python => src/esmac_diags}/plotting/contour_ship_timeseries_AerosolSize.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_pdf_AerosolSize.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_percentile_lat_CCN.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_percentile_lat_CN.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_percentile_lat_cldfreq.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_percentile_z_AerosolComposition.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_percentile_z_CCN.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_percentile_z_CN.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_profile_z_CldFreq.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_profile_z_LWC.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_timeseries_AerosolComposition.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_timeseries_CCN.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_timeseries_CN.py (100%) rename {python => src/esmac_diags}/plotting/plot_flight_track_height.py (100%) rename {python => src/esmac_diags}/plotting/plot_profile_cloud.py (100%) rename {python => src/esmac_diags}/plotting/plot_sfc_diurnalcycle_AerosolComposition.py (100%) rename {python => src/esmac_diags}/plotting/plot_sfc_diurnalcycle_CCN.py (100%) rename {python => src/esmac_diags}/plotting/plot_sfc_diurnalcycle_CN.py (100%) rename {python => src/esmac_diags}/plotting/plot_sfc_pdf_AerosolSize.py (100%) rename {python => src/esmac_diags}/plotting/plot_sfc_pie_AerosolComposition.py (100%) rename {python => src/esmac_diags}/plotting/plot_sfc_timeseries_AerosolComposition.py (100%) rename {python => src/esmac_diags}/plotting/plot_sfc_timeseries_CCN.py (100%) rename {python => src/esmac_diags}/plotting/plot_sfc_timeseries_CN.py (100%) rename {python => src/esmac_diags}/plotting/plot_ship_latitude_rainLWP.py (100%) rename {python => src/esmac_diags}/plotting/plot_ship_pdf_AerosolSize.py (100%) rename {python => src/esmac_diags}/plotting/plot_ship_percentile_lat_CCN.py (100%) rename {python => src/esmac_diags}/plotting/plot_ship_percentile_lat_CN.py (100%) rename {python => src/esmac_diags}/plotting/plot_ship_percentile_lat_LWP.py (100%) rename {python => src/esmac_diags}/plotting/plot_ship_percentile_lat_met.py (100%) rename {python => src/esmac_diags}/plotting/plot_ship_timeseries_CCN.py (100%) rename {python => src/esmac_diags}/plotting/plot_ship_timeseries_CN.py (100%) rename {python => src/esmac_diags}/plotting/plot_ship_timeseries_met.py (100%) rename {python => src/esmac_diags}/plotting/settings.py (100%) rename {python => src/esmac_diags}/preprocessing/extract_E3SM_AOD_globalmean.py (100%) rename {python => src/esmac_diags}/preprocessing/extract_E3SM_AOD_regionmean.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_E3SM_flighttrack_allvars.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_E3SM_flighttrack_bins.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_E3SM_profile_allvars.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_E3SM_sfc_allvars.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_E3SM_sfc_bins.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_E3SM_shiptrack_allvars.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_E3SM_shiptrack_bins.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_E3SM_shiptrack_profiles.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_obs_mergesize_ACEENA.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_obs_mergesize_HISCALE.py (100%) rename {python => src/esmac_diags}/preprocessing/prep_obs_mergesize_HiScale.py (100%) rename {python => src/esmac_diags}/preprocessing/settings.py (100%) rename {python => src/esmac_diags}/subroutines/CN_mode_to_size.py (100%) rename {python => src/esmac_diags}/subroutines/quality_control.py (100%) rename {python => src/esmac_diags}/subroutines/read_ARMdata.py (100%) rename {python => src/esmac_diags}/subroutines/read_aircraft.py (100%) rename {python => src/esmac_diags}/subroutines/read_netcdf.py (100%) rename {python => src/esmac_diags}/subroutines/read_ship.py (100%) rename {python => src/esmac_diags}/subroutines/read_surface.py (100%) rename {python => src/esmac_diags}/subroutines/specific_data_treatment.py (100%) rename {python => src/esmac_diags}/subroutines/time_format_change.py (100%) diff --git a/python/plotting/calc_statistic_flight_CN.py b/src/esmac_diags/plotting/calc_statistic_flight_CN.py similarity index 100% rename from python/plotting/calc_statistic_flight_CN.py rename to src/esmac_diags/plotting/calc_statistic_flight_CN.py diff --git a/python/plotting/calc_statistic_sfc_CN.py b/src/esmac_diags/plotting/calc_statistic_sfc_CN.py similarity index 100% rename from python/plotting/calc_statistic_sfc_CN.py rename to src/esmac_diags/plotting/calc_statistic_sfc_CN.py diff --git a/python/plotting/calc_statistic_ship_CN.py b/src/esmac_diags/plotting/calc_statistic_ship_CN.py similarity index 100% rename from python/plotting/calc_statistic_ship_CN.py rename to src/esmac_diags/plotting/calc_statistic_ship_CN.py diff --git a/python/plotting/contour_flight_timeseries_AerosolSize.py b/src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py similarity index 100% rename from python/plotting/contour_flight_timeseries_AerosolSize.py rename to src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py diff --git a/python/plotting/contour_sfc_diurnalcycle_AerosolSize.py b/src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py similarity index 100% rename from python/plotting/contour_sfc_diurnalcycle_AerosolSize.py rename to src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py diff --git a/python/plotting/contour_sfc_timeseries_AerosolSize.py b/src/esmac_diags/plotting/contour_sfc_timeseries_AerosolSize.py similarity index 100% rename from python/plotting/contour_sfc_timeseries_AerosolSize.py rename to src/esmac_diags/plotting/contour_sfc_timeseries_AerosolSize.py diff --git a/python/plotting/contour_ship_timeseries_AerosolSize.py b/src/esmac_diags/plotting/contour_ship_timeseries_AerosolSize.py similarity index 100% rename from python/plotting/contour_ship_timeseries_AerosolSize.py rename to src/esmac_diags/plotting/contour_ship_timeseries_AerosolSize.py diff --git a/python/plotting/plot_flight_pdf_AerosolSize.py b/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py similarity index 100% rename from python/plotting/plot_flight_pdf_AerosolSize.py rename to src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py diff --git a/python/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py similarity index 100% rename from python/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py rename to src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py diff --git a/python/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py similarity index 100% rename from python/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py rename to src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py diff --git a/python/plotting/plot_flight_percentile_lat_CCN.py b/src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py similarity index 100% rename from python/plotting/plot_flight_percentile_lat_CCN.py rename to src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py diff --git a/python/plotting/plot_flight_percentile_lat_CN.py b/src/esmac_diags/plotting/plot_flight_percentile_lat_CN.py similarity index 100% rename from python/plotting/plot_flight_percentile_lat_CN.py rename to src/esmac_diags/plotting/plot_flight_percentile_lat_CN.py diff --git a/python/plotting/plot_flight_percentile_lat_cldfreq.py b/src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py similarity index 100% rename from python/plotting/plot_flight_percentile_lat_cldfreq.py rename to src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py diff --git a/python/plotting/plot_flight_percentile_z_AerosolComposition.py b/src/esmac_diags/plotting/plot_flight_percentile_z_AerosolComposition.py similarity index 100% rename from python/plotting/plot_flight_percentile_z_AerosolComposition.py rename to src/esmac_diags/plotting/plot_flight_percentile_z_AerosolComposition.py diff --git a/python/plotting/plot_flight_percentile_z_CCN.py b/src/esmac_diags/plotting/plot_flight_percentile_z_CCN.py similarity index 100% rename from python/plotting/plot_flight_percentile_z_CCN.py rename to src/esmac_diags/plotting/plot_flight_percentile_z_CCN.py diff --git a/python/plotting/plot_flight_percentile_z_CN.py b/src/esmac_diags/plotting/plot_flight_percentile_z_CN.py similarity index 100% rename from python/plotting/plot_flight_percentile_z_CN.py rename to src/esmac_diags/plotting/plot_flight_percentile_z_CN.py diff --git a/python/plotting/plot_flight_profile_z_CldFreq.py b/src/esmac_diags/plotting/plot_flight_profile_z_CldFreq.py similarity index 100% rename from python/plotting/plot_flight_profile_z_CldFreq.py rename to src/esmac_diags/plotting/plot_flight_profile_z_CldFreq.py diff --git a/python/plotting/plot_flight_profile_z_LWC.py b/src/esmac_diags/plotting/plot_flight_profile_z_LWC.py similarity index 100% rename from python/plotting/plot_flight_profile_z_LWC.py rename to src/esmac_diags/plotting/plot_flight_profile_z_LWC.py diff --git a/python/plotting/plot_flight_timeseries_AerosolComposition.py b/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py similarity index 100% rename from python/plotting/plot_flight_timeseries_AerosolComposition.py rename to src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py diff --git a/python/plotting/plot_flight_timeseries_CCN.py b/src/esmac_diags/plotting/plot_flight_timeseries_CCN.py similarity index 100% rename from python/plotting/plot_flight_timeseries_CCN.py rename to src/esmac_diags/plotting/plot_flight_timeseries_CCN.py diff --git a/python/plotting/plot_flight_timeseries_CN.py b/src/esmac_diags/plotting/plot_flight_timeseries_CN.py similarity index 100% rename from python/plotting/plot_flight_timeseries_CN.py rename to src/esmac_diags/plotting/plot_flight_timeseries_CN.py diff --git a/python/plotting/plot_flight_track_height.py b/src/esmac_diags/plotting/plot_flight_track_height.py similarity index 100% rename from python/plotting/plot_flight_track_height.py rename to src/esmac_diags/plotting/plot_flight_track_height.py diff --git a/python/plotting/plot_profile_cloud.py b/src/esmac_diags/plotting/plot_profile_cloud.py similarity index 100% rename from python/plotting/plot_profile_cloud.py rename to src/esmac_diags/plotting/plot_profile_cloud.py diff --git a/python/plotting/plot_sfc_diurnalcycle_AerosolComposition.py b/src/esmac_diags/plotting/plot_sfc_diurnalcycle_AerosolComposition.py similarity index 100% rename from python/plotting/plot_sfc_diurnalcycle_AerosolComposition.py rename to src/esmac_diags/plotting/plot_sfc_diurnalcycle_AerosolComposition.py diff --git a/python/plotting/plot_sfc_diurnalcycle_CCN.py b/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CCN.py similarity index 100% rename from python/plotting/plot_sfc_diurnalcycle_CCN.py rename to src/esmac_diags/plotting/plot_sfc_diurnalcycle_CCN.py diff --git a/python/plotting/plot_sfc_diurnalcycle_CN.py b/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CN.py similarity index 100% rename from python/plotting/plot_sfc_diurnalcycle_CN.py rename to src/esmac_diags/plotting/plot_sfc_diurnalcycle_CN.py diff --git a/python/plotting/plot_sfc_pdf_AerosolSize.py b/src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py similarity index 100% rename from python/plotting/plot_sfc_pdf_AerosolSize.py rename to src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py diff --git a/python/plotting/plot_sfc_pie_AerosolComposition.py b/src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py similarity index 100% rename from python/plotting/plot_sfc_pie_AerosolComposition.py rename to src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py diff --git a/python/plotting/plot_sfc_timeseries_AerosolComposition.py b/src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py similarity index 100% rename from python/plotting/plot_sfc_timeseries_AerosolComposition.py rename to src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py diff --git a/python/plotting/plot_sfc_timeseries_CCN.py b/src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py similarity index 100% rename from python/plotting/plot_sfc_timeseries_CCN.py rename to src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py diff --git a/python/plotting/plot_sfc_timeseries_CN.py b/src/esmac_diags/plotting/plot_sfc_timeseries_CN.py similarity index 100% rename from python/plotting/plot_sfc_timeseries_CN.py rename to src/esmac_diags/plotting/plot_sfc_timeseries_CN.py diff --git a/python/plotting/plot_ship_latitude_rainLWP.py b/src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py similarity index 100% rename from python/plotting/plot_ship_latitude_rainLWP.py rename to src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py diff --git a/python/plotting/plot_ship_pdf_AerosolSize.py b/src/esmac_diags/plotting/plot_ship_pdf_AerosolSize.py similarity index 100% rename from python/plotting/plot_ship_pdf_AerosolSize.py rename to src/esmac_diags/plotting/plot_ship_pdf_AerosolSize.py diff --git a/python/plotting/plot_ship_percentile_lat_CCN.py b/src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py similarity index 100% rename from python/plotting/plot_ship_percentile_lat_CCN.py rename to src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py diff --git a/python/plotting/plot_ship_percentile_lat_CN.py b/src/esmac_diags/plotting/plot_ship_percentile_lat_CN.py similarity index 100% rename from python/plotting/plot_ship_percentile_lat_CN.py rename to src/esmac_diags/plotting/plot_ship_percentile_lat_CN.py diff --git a/python/plotting/plot_ship_percentile_lat_LWP.py b/src/esmac_diags/plotting/plot_ship_percentile_lat_LWP.py similarity index 100% rename from python/plotting/plot_ship_percentile_lat_LWP.py rename to src/esmac_diags/plotting/plot_ship_percentile_lat_LWP.py diff --git a/python/plotting/plot_ship_percentile_lat_met.py b/src/esmac_diags/plotting/plot_ship_percentile_lat_met.py similarity index 100% rename from python/plotting/plot_ship_percentile_lat_met.py rename to src/esmac_diags/plotting/plot_ship_percentile_lat_met.py diff --git a/python/plotting/plot_ship_timeseries_CCN.py b/src/esmac_diags/plotting/plot_ship_timeseries_CCN.py similarity index 100% rename from python/plotting/plot_ship_timeseries_CCN.py rename to src/esmac_diags/plotting/plot_ship_timeseries_CCN.py diff --git a/python/plotting/plot_ship_timeseries_CN.py b/src/esmac_diags/plotting/plot_ship_timeseries_CN.py similarity index 100% rename from python/plotting/plot_ship_timeseries_CN.py rename to src/esmac_diags/plotting/plot_ship_timeseries_CN.py diff --git a/python/plotting/plot_ship_timeseries_met.py b/src/esmac_diags/plotting/plot_ship_timeseries_met.py similarity index 100% rename from python/plotting/plot_ship_timeseries_met.py rename to src/esmac_diags/plotting/plot_ship_timeseries_met.py diff --git a/python/plotting/settings.py b/src/esmac_diags/plotting/settings.py similarity index 100% rename from python/plotting/settings.py rename to src/esmac_diags/plotting/settings.py diff --git a/python/preprocessing/extract_E3SM_AOD_globalmean.py b/src/esmac_diags/preprocessing/extract_E3SM_AOD_globalmean.py similarity index 100% rename from python/preprocessing/extract_E3SM_AOD_globalmean.py rename to src/esmac_diags/preprocessing/extract_E3SM_AOD_globalmean.py diff --git a/python/preprocessing/extract_E3SM_AOD_regionmean.py b/src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py similarity index 100% rename from python/preprocessing/extract_E3SM_AOD_regionmean.py rename to src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py diff --git a/python/preprocessing/prep_E3SM_flighttrack_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py similarity index 100% rename from python/preprocessing/prep_E3SM_flighttrack_allvars.py rename to src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py diff --git a/python/preprocessing/prep_E3SM_flighttrack_bins.py b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py similarity index 100% rename from python/preprocessing/prep_E3SM_flighttrack_bins.py rename to src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py diff --git a/python/preprocessing/prep_E3SM_profile_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py similarity index 100% rename from python/preprocessing/prep_E3SM_profile_allvars.py rename to src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py diff --git a/python/preprocessing/prep_E3SM_sfc_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py similarity index 100% rename from python/preprocessing/prep_E3SM_sfc_allvars.py rename to src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py diff --git a/python/preprocessing/prep_E3SM_sfc_bins.py b/src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py similarity index 100% rename from python/preprocessing/prep_E3SM_sfc_bins.py rename to src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py diff --git a/python/preprocessing/prep_E3SM_shiptrack_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py similarity index 100% rename from python/preprocessing/prep_E3SM_shiptrack_allvars.py rename to src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py diff --git a/python/preprocessing/prep_E3SM_shiptrack_bins.py b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_bins.py similarity index 100% rename from python/preprocessing/prep_E3SM_shiptrack_bins.py rename to src/esmac_diags/preprocessing/prep_E3SM_shiptrack_bins.py diff --git a/python/preprocessing/prep_E3SM_shiptrack_profiles.py b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py similarity index 100% rename from python/preprocessing/prep_E3SM_shiptrack_profiles.py rename to src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py diff --git a/python/preprocessing/prep_obs_mergesize_ACEENA.py b/src/esmac_diags/preprocessing/prep_obs_mergesize_ACEENA.py similarity index 100% rename from python/preprocessing/prep_obs_mergesize_ACEENA.py rename to src/esmac_diags/preprocessing/prep_obs_mergesize_ACEENA.py diff --git a/python/preprocessing/prep_obs_mergesize_HISCALE.py b/src/esmac_diags/preprocessing/prep_obs_mergesize_HISCALE.py similarity index 100% rename from python/preprocessing/prep_obs_mergesize_HISCALE.py rename to src/esmac_diags/preprocessing/prep_obs_mergesize_HISCALE.py diff --git a/python/preprocessing/prep_obs_mergesize_HiScale.py b/src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py similarity index 100% rename from python/preprocessing/prep_obs_mergesize_HiScale.py rename to src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py diff --git a/python/preprocessing/settings.py b/src/esmac_diags/preprocessing/settings.py similarity index 100% rename from python/preprocessing/settings.py rename to src/esmac_diags/preprocessing/settings.py diff --git a/python/subroutines/CN_mode_to_size.py b/src/esmac_diags/subroutines/CN_mode_to_size.py similarity index 100% rename from python/subroutines/CN_mode_to_size.py rename to src/esmac_diags/subroutines/CN_mode_to_size.py diff --git a/python/subroutines/quality_control.py b/src/esmac_diags/subroutines/quality_control.py similarity index 100% rename from python/subroutines/quality_control.py rename to src/esmac_diags/subroutines/quality_control.py diff --git a/python/subroutines/read_ARMdata.py b/src/esmac_diags/subroutines/read_ARMdata.py similarity index 100% rename from python/subroutines/read_ARMdata.py rename to src/esmac_diags/subroutines/read_ARMdata.py diff --git a/python/subroutines/read_aircraft.py b/src/esmac_diags/subroutines/read_aircraft.py similarity index 100% rename from python/subroutines/read_aircraft.py rename to src/esmac_diags/subroutines/read_aircraft.py diff --git a/python/subroutines/read_netcdf.py b/src/esmac_diags/subroutines/read_netcdf.py similarity index 100% rename from python/subroutines/read_netcdf.py rename to src/esmac_diags/subroutines/read_netcdf.py diff --git a/python/subroutines/read_ship.py b/src/esmac_diags/subroutines/read_ship.py similarity index 100% rename from python/subroutines/read_ship.py rename to src/esmac_diags/subroutines/read_ship.py diff --git a/python/subroutines/read_surface.py b/src/esmac_diags/subroutines/read_surface.py similarity index 100% rename from python/subroutines/read_surface.py rename to src/esmac_diags/subroutines/read_surface.py diff --git a/python/subroutines/specific_data_treatment.py b/src/esmac_diags/subroutines/specific_data_treatment.py similarity index 100% rename from python/subroutines/specific_data_treatment.py rename to src/esmac_diags/subroutines/specific_data_treatment.py diff --git a/python/subroutines/time_format_change.py b/src/esmac_diags/subroutines/time_format_change.py similarity index 100% rename from python/subroutines/time_format_change.py rename to src/esmac_diags/subroutines/time_format_change.py From 43f2457300c28212d34c1b84e598ad92e485f8cd Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Sun, 7 Nov 2021 17:55:04 -0800 Subject: [PATCH 04/14] Added init files to turn subdirectories into submodules --- src/esmac_diags/__init__.py | 0 src/esmac_diags/plotting/__init__.py | 0 src/esmac_diags/preprocessing/__init__.py | 0 src/esmac_diags/subroutines/__init.py__ | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/esmac_diags/__init__.py create mode 100644 src/esmac_diags/plotting/__init__.py create mode 100644 src/esmac_diags/preprocessing/__init__.py create mode 100644 src/esmac_diags/subroutines/__init.py__ diff --git a/src/esmac_diags/__init__.py b/src/esmac_diags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/esmac_diags/plotting/__init__.py b/src/esmac_diags/plotting/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/esmac_diags/preprocessing/__init__.py b/src/esmac_diags/preprocessing/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/esmac_diags/subroutines/__init.py__ b/src/esmac_diags/subroutines/__init.py__ new file mode 100644 index 0000000..e69de29 From d2d0002c4d42b341f844936fe17fcef36071027a Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Sun, 7 Nov 2021 18:00:22 -0800 Subject: [PATCH 05/14] Added required installable files, and a .gitignore. Technically it is now installable, albeit likely in a very broken state --- .gitignore | 138 ++++++++++++++++++++++++++++++++++++++++++++++++ environment.yml | 1 - pyproject.toml | 11 ++++ setup.cfg | 26 +++++++++ setup.py | 2 + 5 files changed, 177 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 pyproject.toml create mode 100644 setup.cfg create mode 100644 setup.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a81c8ee --- /dev/null +++ b/.gitignore @@ -0,0 +1,138 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ diff --git a/environment.yml b/environment.yml index a3e7271..5d214d3 100644 --- a/environment.yml +++ b/environment.yml @@ -8,7 +8,6 @@ dependencies: - matplotlib - numpy - sphinx - - lxml - conda-build - pytest - pytest-shutil diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..ec06f16 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,11 @@ +[build-system] +requires = ["setuptools", "wheel"] +build-backend = "setuptools.build_meta" + +[tool.pytest.ini_options] +minversion = "6.0" +addopts = "-ra -q" +testpaths = [ + "tests" +] +norecursedirs = "src/esmac_diags/*" \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..06c6e1c --- /dev/null +++ b/setup.cfg @@ -0,0 +1,26 @@ +[metadata] +name = esmac_diags +version = 0.1 +description = ESMAC_Diags diagnostics package +long_description = file: README.md +license = bsd +classifiers = + Programming Language :: Python :: 3 + +[options] +packages = find: +package_dir = + =src +install_requires = + numpy + pytest + matplotlib + netCDF4 + pip + + +include_package_data = True + +[options.packages.find] +where = src +include = esmac_diags \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..864b617 --- /dev/null +++ b/setup.py @@ -0,0 +1,2 @@ +import setuptools +setuptools.setup() \ No newline at end of file From 5a47e47b52521e29efaa771339351c9551485809 Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Sun, 7 Nov 2021 18:02:27 -0800 Subject: [PATCH 06/14] Caught a missed requirement in environment.yml --- environment.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/environment.yml b/environment.yml index 5d214d3..2ddb644 100644 --- a/environment.yml +++ b/environment.yml @@ -12,4 +12,5 @@ dependencies: - pytest - pytest-shutil - ipython - - black \ No newline at end of file + - black + - netCDF4 \ No newline at end of file From 829cf3477c8ef83508eafcbcdfbaa6032ce43349 Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Sun, 7 Nov 2021 18:11:37 -0800 Subject: [PATCH 07/14] Updated readme.md with install instructions --- README.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index ddb676d..d767845 100644 --- a/README.md +++ b/README.md @@ -5,17 +5,18 @@ This Earth System Model (ESM) aerosol-cloud diagnostics package (ESMAC Diags) is More information can be found in README_ESMAC_Diags_v1.0.pdf -# Package dependencies -This code is dependent on the following python packages: - -os -sys -glob -time -numpy -scipy -matplotlib -netCDF4 +## To install +This code is best run using a conda virtual environment. To install the required environment one can do +```bash +conda env create -f environment.yml +``` +to set up a esmac_diags environment. Note if running this on a HPC system, you may need to load the appropriate module for anaconda. + +Once the environment has been created you can activate it with ```conda activate esmac_diags``` and then this code can be installed with +```bash +pip install -e . +``` +Which will install the code as editable allowing you to make changes to the codebase and it be reflected in the installed package. # Test run From 781a213b1ae983157b2cac10b4e387e7173bb199 Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Sun, 7 Nov 2021 18:25:05 -0800 Subject: [PATCH 08/14] Changed all scripts to use relative imports --- .../plotting/calc_statistic_flight_CN.py | 7 +- .../plotting/calc_statistic_sfc_CN.py | 11 +- .../plotting/calc_statistic_ship_CN.py | 11 +- .../contour_flight_timeseries_AerosolSize.py | 7 +- .../contour_sfc_diurnalcycle_AerosolSize.py | 13 +- .../contour_sfc_timeseries_AerosolSize.py | 13 +- .../contour_ship_timeseries_AerosolSize.py | 11 +- .../plotting/plot_flight_pdf_AerosolSize.py | 11 +- ...ght_pdf_percentile_SeparateCloud_aceena.py | 7 +- ...ght_pdf_percentile_SeparatePBLH_hiscale.py | 13 +- .../plot_flight_percentile_lat_CCN.py | 7 +- .../plotting/plot_flight_percentile_lat_CN.py | 9 +- .../plot_flight_percentile_lat_cldfreq.py | 9 +- ..._flight_percentile_z_AerosolComposition.py | 9 +- .../plotting/plot_flight_percentile_z_CCN.py | 9 +- .../plotting/plot_flight_percentile_z_CN.py | 7 +- .../plotting/plot_flight_profile_z_CldFreq.py | 7 +- .../plotting/plot_flight_profile_z_LWC.py | 7 +- ...ot_flight_timeseries_AerosolComposition.py | 9 +- .../plotting/plot_flight_timeseries_CCN.py | 9 +- .../plotting/plot_flight_timeseries_CN.py | 7 +- .../plotting/plot_flight_track_height.py | 9 +- .../plotting/plot_profile_cloud.py | 7 +- ...lot_sfc_diurnalcycle_AerosolComposition.py | 11 +- .../plotting/plot_sfc_diurnalcycle_CCN.py | 11 +- .../plotting/plot_sfc_diurnalcycle_CN.py | 11 +- .../plotting/plot_sfc_pdf_AerosolSize.py | 13 +- .../plot_sfc_pie_AerosolComposition.py | 9 +- .../plot_sfc_timeseries_AerosolComposition.py | 11 +- .../plotting/plot_sfc_timeseries_CCN.py | 11 +- .../plotting/plot_sfc_timeseries_CN.py | 11 +- .../plotting/plot_ship_latitude_rainLWP.py | 9 +- .../plotting/plot_ship_pdf_AerosolSize.py | 9 +- .../plotting/plot_ship_percentile_lat_CCN.py | 9 +- .../plotting/plot_ship_percentile_lat_CN.py | 9 +- .../plotting/plot_ship_percentile_lat_LWP.py | 7 +- .../plotting/plot_ship_percentile_lat_met.py | 9 +- .../plotting/plot_ship_timeseries_CCN.py | 11 +- .../plotting/plot_ship_timeseries_CN.py | 11 +- .../plotting/plot_ship_timeseries_met.py | 11 +- .../extract_E3SM_AOD_globalmean.py | 3 +- .../extract_E3SM_AOD_regionmean.py | 3 +- .../prep_E3SM_flighttrack_allvars.py | 7 +- .../prep_E3SM_flighttrack_bins.py | 9 +- .../prep_E3SM_profile_allvars.py | 5 +- .../preprocessing/prep_E3SM_sfc_allvars.py | 5 +- .../preprocessing/prep_E3SM_sfc_bins.py | 7 +- .../prep_E3SM_shiptrack_allvars.py | 11 +- .../preprocessing/prep_E3SM_shiptrack_bins.py | 11 +- .../prep_E3SM_shiptrack_profiles.py | 9 +- .../prep_obs_mergesize_ACEENA.py | 7 +- .../prep_obs_mergesize_HiScale.py | 471 +++++++++--------- 52 files changed, 435 insertions(+), 495 deletions(-) diff --git a/src/esmac_diags/plotting/calc_statistic_flight_CN.py b/src/esmac_diags/plotting/calc_statistic_flight_CN.py index 6806383..886ffbe 100644 --- a/src/esmac_diags/plotting/calc_statistic_flight_CN.py +++ b/src/esmac_diags/plotting/calc_statistic_flight_CN.py @@ -5,16 +5,15 @@ """ import sys -sys.path.insert(1,'../subroutines/') # import matplotlib.pyplot as plt import os import glob import numpy as np import scipy.stats -from read_aircraft import read_cpc, read_RF_NCAR -from read_netcdf import read_merged_size,read_extractflight -from quality_control import qc_cpc_air, qc_remove_neg, qc_mask_takeoff_landing +from ..subroutines.read_aircraft import read_cpc, read_RF_NCAR +from ..subroutines.read_netcdf import read_merged_size,read_extractflight +from ..subroutines.quality_control import qc_cpc_air, qc_remove_neg, qc_mask_takeoff_landing #%% settings diff --git a/src/esmac_diags/plotting/calc_statistic_sfc_CN.py b/src/esmac_diags/plotting/calc_statistic_sfc_CN.py index ea1930a..215532a 100644 --- a/src/esmac_diags/plotting/calc_statistic_sfc_CN.py +++ b/src/esmac_diags/plotting/calc_statistic_sfc_CN.py @@ -5,18 +5,17 @@ """ import sys -sys.path.insert(1,'../subroutines/') # import matplotlib.pyplot as plt import os import glob import numpy as np import scipy.stats -from time_format_change import yyyymmdd2cday, cday2mmdd, timeunit2cday -from read_ARMdata import read_cpc,read_uhsas -from read_netcdf import read_E3SM -from quality_control import qc_remove_neg, qc_mask_qcflag_cpc,qc_mask_qcflag -from specific_data_treatment import avg_time_1d +from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd, timeunit2cday +from ..subroutines.read_ARMdata import read_cpc,read_uhsas +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.quality_control import qc_remove_neg, qc_mask_qcflag_cpc,qc_mask_qcflag +from ..subroutines.specific_data_treatment import avg_time_1d #%% settings diff --git a/src/esmac_diags/plotting/calc_statistic_ship_CN.py b/src/esmac_diags/plotting/calc_statistic_ship_CN.py index 3b64284..0865812 100644 --- a/src/esmac_diags/plotting/calc_statistic_ship_CN.py +++ b/src/esmac_diags/plotting/calc_statistic_ship_CN.py @@ -4,17 +4,16 @@ # compare models and CPC/UHSAS measurements """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import numpy as np import scipy.stats -from read_ARMdata import read_cpc, read_uhsas -from read_netcdf import read_E3SM -from time_format_change import cday2mmdd -from specific_data_treatment import mask_model_ps, avg_time_1d -from quality_control import qc_mask_qcflag, qc_remove_neg +from ..subroutines.read_ARMdata import read_cpc, read_uhsas +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import cday2mmdd +from ..subroutines.specific_data_treatment import mask_model_ps, avg_time_1d +from ..subroutines.quality_control import qc_mask_qcflag, qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py b/src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py index c289691..3fc33b6 100644 --- a/src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py +++ b/src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py @@ -5,16 +5,15 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_RF_NCAR -from specific_data_treatment import lwc2cflag, avg_time_2d +from ..subroutines.read_aircraft import read_RF_NCAR +from ..subroutines.specific_data_treatment import lwc2cflag, avg_time_2d # from time_format_change import yyyymmdd2cday, hhmmss2sec -from read_netcdf import read_merged_size,read_extractflight +from ..subroutines.read_netcdf import read_merged_size,read_extractflight #%% settings diff --git a/src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py b/src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py index 3aacb10..43d894c 100644 --- a/src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py +++ b/src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py @@ -4,18 +4,17 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday, cday2mmdd -from read_surface import read_smpsb_pnnl,read_smps_bin -from read_ARMdata import read_uhsas, read_smps_bnl -from read_netcdf import read_E3SM -from specific_data_treatment import avg_time_2d -from quality_control import qc_mask_qcflag, qc_remove_neg,qc_correction_nanosmps +from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd +from ..subroutines.read_surface import read_smpsb_pnnl,read_smps_bin +from ..subroutines.read_ARMdata import read_uhsas, read_smps_bnl +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.specific_data_treatment import avg_time_2d +from ..subroutines.quality_control import qc_mask_qcflag, qc_remove_neg,qc_correction_nanosmps #%% settings diff --git a/src/esmac_diags/plotting/contour_sfc_timeseries_AerosolSize.py b/src/esmac_diags/plotting/contour_sfc_timeseries_AerosolSize.py index 3afeb79..d004ad1 100644 --- a/src/esmac_diags/plotting/contour_sfc_timeseries_AerosolSize.py +++ b/src/esmac_diags/plotting/contour_sfc_timeseries_AerosolSize.py @@ -4,18 +4,17 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday, cday2mmdd -from read_surface import read_smpsb_pnnl,read_smps_bin -from read_ARMdata import read_uhsas, read_smps_bnl -from read_netcdf import read_E3SM -from specific_data_treatment import avg_time_2d -from quality_control import qc_mask_qcflag, qc_remove_neg,qc_correction_nanosmps +from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd +from ..subroutines.read_surface import read_smpsb_pnnl,read_smps_bin +from ..subroutines.read_ARMdata import read_uhsas, read_smps_bnl +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.specific_data_treatment import avg_time_2d +from ..subroutines.quality_control import qc_mask_qcflag, qc_remove_neg,qc_correction_nanosmps #%% settings diff --git a/src/esmac_diags/plotting/contour_ship_timeseries_AerosolSize.py b/src/esmac_diags/plotting/contour_ship_timeseries_AerosolSize.py index 5af3720..79124af 100644 --- a/src/esmac_diags/plotting/contour_ship_timeseries_AerosolSize.py +++ b/src/esmac_diags/plotting/contour_ship_timeseries_AerosolSize.py @@ -1,17 +1,16 @@ # plot timeseries of surface aerosol size distribution along each ship leg import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ARMdata import read_uhsas -from read_netcdf import read_E3SM -from time_format_change import cday2mmdd -from specific_data_treatment import avg_time_2d -from quality_control import qc_remove_neg +from ..subroutines.read_ARMdata import read_uhsas +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import cday2mmdd +from ..subroutines.specific_data_treatment import avg_time_2d +from ..subroutines.quality_control import qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py b/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py index 3089688..e4374ab 100644 --- a/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py +++ b/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py @@ -5,19 +5,18 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_RF_NCAR -from specific_data_treatment import lwc2cflag +from ..subroutines.read_aircraft import read_RF_NCAR +from ..subroutines.specific_data_treatment import lwc2cflag # from time_format_change import yyyymmdd2cday, hhmmss2sec -from read_netcdf import read_merged_size,read_extractflight +from ..subroutines.read_netcdf import read_merged_size,read_extractflight -from specific_data_treatment import avg_time_2d -from quality_control import qc_mask_cloudflag, qc_uhsas_RF_NCAR,qc_remove_neg,qc_mask_takeoff_landing +from ..subroutines.specific_data_treatment import avg_time_2d +from ..subroutines.quality_control import qc_mask_cloudflag, qc_uhsas_RF_NCAR,qc_remove_neg,qc_mask_takeoff_landing #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py index 4641a12..bc6e87b 100644 --- a/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py +++ b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py @@ -4,16 +4,15 @@ # separated by observed PBLH """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np # from time_format_change import hhmmss2sec,yyyymmdd2cday -from read_aircraft import read_cpc -from read_netcdf import read_merged_size,read_extractflight -from quality_control import qc_remove_neg +from ..subroutines.read_aircraft import read_cpc +from ..subroutines.read_netcdf import read_merged_size,read_extractflight +from ..subroutines.quality_control import qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py index 3639357..0f1f2d5 100644 --- a/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py +++ b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py @@ -4,18 +4,17 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import hhmmss2sec,yyyymmdd2cday -from read_ARMdata import read_pblhtmpl1 -from read_surface import read_dl_pblh -from read_aircraft import read_cpc -from read_netcdf import read_merged_size,read_extractflight -from quality_control import qc_remove_neg +from ..subroutines.time_format_change import hhmmss2sec,yyyymmdd2cday +from ..subroutines.read_ARMdata import read_pblhtmpl1 +from ..subroutines.read_surface import read_dl_pblh +from ..subroutines.read_aircraft import read_cpc +from ..subroutines.read_netcdf import read_merged_size,read_extractflight +from ..subroutines.quality_control import qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py b/src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py index 738da39..0843e3a 100644 --- a/src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py +++ b/src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py @@ -5,15 +5,14 @@ """ import sys -sys.path.insert(1,'../subroutines/') import glob import os import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_ccn_socrates, read_RF_NCAR -from read_netcdf import read_extractflight -from quality_control import qc_remove_neg +from ..subroutines.read_aircraft import read_ccn_socrates, read_RF_NCAR +from ..subroutines.read_netcdf import read_extractflight +from ..subroutines.quality_control import qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_percentile_lat_CN.py b/src/esmac_diags/plotting/plot_flight_percentile_lat_CN.py index e2a8e5e..1a979c5 100644 --- a/src/esmac_diags/plotting/plot_flight_percentile_lat_CN.py +++ b/src/esmac_diags/plotting/plot_flight_percentile_lat_CN.py @@ -5,16 +5,15 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_RF_NCAR -from read_netcdf import read_extractflight -from specific_data_treatment import lwc2cflag -from quality_control import qc_mask_takeoff_landing,qc_remove_neg,qc_mask_cloudflag +from ..subroutines.read_aircraft import read_RF_NCAR +from ..subroutines.read_netcdf import read_extractflight +from ..subroutines.specific_data_treatment import lwc2cflag +from ..subroutines.quality_control import qc_mask_takeoff_landing,qc_remove_neg,qc_mask_cloudflag #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py b/src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py index 01d0051..9940228 100644 --- a/src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py +++ b/src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py @@ -3,16 +3,15 @@ # only select a certain height ranges for warm clouds (the height range needs to be further tuned) """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_RF_NCAR -from read_netcdf import read_extractflight -from specific_data_treatment import lwc2cflag -from quality_control import qc_mask_takeoff_landing +from ..subroutines.read_aircraft import read_RF_NCAR +from ..subroutines.read_netcdf import read_extractflight +from ..subroutines.specific_data_treatment import lwc2cflag +from ..subroutines.quality_control import qc_mask_takeoff_landing #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_percentile_z_AerosolComposition.py b/src/esmac_diags/plotting/plot_flight_percentile_z_AerosolComposition.py index c00e8cf..1ab55f4 100644 --- a/src/esmac_diags/plotting/plot_flight_percentile_z_AerosolComposition.py +++ b/src/esmac_diags/plotting/plot_flight_percentile_z_AerosolComposition.py @@ -5,16 +5,15 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import hhmmss2sec -from read_aircraft import read_ams,read_iwg1 -from read_netcdf import read_merged_size,read_extractflight -from quality_control import qc_mask_qcflag,qc_mask_cloudflag,qc_remove_neg +from ..subroutines.time_format_change import hhmmss2sec +from ..subroutines.read_aircraft import read_ams,read_iwg1 +from ..subroutines.read_netcdf import read_merged_size,read_extractflight +from ..subroutines.quality_control import qc_mask_qcflag,qc_mask_cloudflag,qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_percentile_z_CCN.py b/src/esmac_diags/plotting/plot_flight_percentile_z_CCN.py index 18756b0..7e42801 100644 --- a/src/esmac_diags/plotting/plot_flight_percentile_z_CCN.py +++ b/src/esmac_diags/plotting/plot_flight_percentile_z_CCN.py @@ -5,16 +5,15 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_ccn_hiscale, read_ccn_socrates -from read_ARMdata import read_ccn -from read_netcdf import read_extractflight,read_merged_size -from quality_control import qc_mask_qcflag,qc_mask_cloudflag,qc_remove_neg +from ..subroutines.read_aircraft import read_ccn_hiscale, read_ccn_socrates +from ..subroutines.read_ARMdata import read_ccn +from ..subroutines.read_netcdf import read_extractflight,read_merged_size +from ..subroutines.quality_control import qc_mask_qcflag,qc_mask_cloudflag,qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_percentile_z_CN.py b/src/esmac_diags/plotting/plot_flight_percentile_z_CN.py index 601dab7..c9fe17d 100644 --- a/src/esmac_diags/plotting/plot_flight_percentile_z_CN.py +++ b/src/esmac_diags/plotting/plot_flight_percentile_z_CN.py @@ -5,15 +5,14 @@ """ import sys -sys.path.insert(1,'../subroutines/') import glob import os import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_cpc, read_RF_NCAR -from read_netcdf import read_merged_size,read_extractflight -from quality_control import qc_mask_cloudflag,qc_remove_neg,qc_cpc_air +from ..subroutines.read_aircraft import read_cpc, read_RF_NCAR +from ..subroutines.read_netcdf import read_merged_size,read_extractflight +from ..subroutines.quality_control import qc_mask_cloudflag,qc_remove_neg,qc_cpc_air #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_profile_z_CldFreq.py b/src/esmac_diags/plotting/plot_flight_profile_z_CldFreq.py index c0f5199..463cadd 100644 --- a/src/esmac_diags/plotting/plot_flight_profile_z_CldFreq.py +++ b/src/esmac_diags/plotting/plot_flight_profile_z_CldFreq.py @@ -4,15 +4,14 @@ """ import sys -sys.path.insert(1,'../subroutines/') import glob import os import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_RF_NCAR -from specific_data_treatment import lwc2cflag -from read_netcdf import read_extractflight,read_merged_size +from ..subroutines.read_aircraft import read_RF_NCAR +from ..subroutines.specific_data_treatment import lwc2cflag +from ..subroutines.read_netcdf import read_extractflight,read_merged_size #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_profile_z_LWC.py b/src/esmac_diags/plotting/plot_flight_profile_z_LWC.py index 4cef45d..705b575 100644 --- a/src/esmac_diags/plotting/plot_flight_profile_z_LWC.py +++ b/src/esmac_diags/plotting/plot_flight_profile_z_LWC.py @@ -4,15 +4,14 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_wcm, read_RF_NCAR -from read_netcdf import read_extractflight -from quality_control import qc_mask_qcflag,qc_remove_neg +from ..subroutines.read_aircraft import read_wcm, read_RF_NCAR +from ..subroutines.read_netcdf import read_extractflight +from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py b/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py index 5b6c72e..155ce06 100644 --- a/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py +++ b/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py @@ -5,16 +5,15 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import hhmmss2sec -from read_aircraft import read_ams,read_iwg1 -from read_netcdf import read_merged_size,read_extractflight -from quality_control import qc_mask_qcflag,qc_remove_neg +from ..subroutines.time_format_change import hhmmss2sec +from ..subroutines.read_aircraft import read_ams,read_iwg1 +from ..subroutines.read_netcdf import read_merged_size,read_extractflight +from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_timeseries_CCN.py b/src/esmac_diags/plotting/plot_flight_timeseries_CCN.py index 0c89dd8..9728a12 100644 --- a/src/esmac_diags/plotting/plot_flight_timeseries_CCN.py +++ b/src/esmac_diags/plotting/plot_flight_timeseries_CCN.py @@ -5,16 +5,15 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_ccn_hiscale,read_ccn_socrates -from read_ARMdata import read_ccn -from read_netcdf import read_extractflight -from quality_control import qc_mask_qcflag,qc_remove_neg +from ..subroutines.read_aircraft import read_ccn_hiscale,read_ccn_socrates +from ..subroutines.read_ARMdata import read_ccn +from ..subroutines.read_netcdf import read_extractflight +from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_timeseries_CN.py b/src/esmac_diags/plotting/plot_flight_timeseries_CN.py index 490902f..4135d90 100644 --- a/src/esmac_diags/plotting/plot_flight_timeseries_CN.py +++ b/src/esmac_diags/plotting/plot_flight_timeseries_CN.py @@ -5,15 +5,14 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_aircraft import read_cpc, read_RF_NCAR -from read_netcdf import read_merged_size,read_extractflight -from quality_control import qc_cpc_air +from ..subroutines.read_aircraft import read_cpc, read_RF_NCAR +from ..subroutines.read_netcdf import read_merged_size,read_extractflight +from ..subroutines.quality_control import qc_cpc_air #%% settings diff --git a/src/esmac_diags/plotting/plot_flight_track_height.py b/src/esmac_diags/plotting/plot_flight_track_height.py index 24eb9b0..6f8186a 100644 --- a/src/esmac_diags/plotting/plot_flight_track_height.py +++ b/src/esmac_diags/plotting/plot_flight_track_height.py @@ -5,16 +5,15 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ARMdata import read_cvi_aceena -from specific_data_treatment import lwc2cflag -from time_format_change import hhmmss2sec -from read_aircraft import read_iwg1, read_cvi_hiscale, read_RF_NCAR +from ..subroutines.read_ARMdata import read_cvi_aceena +from ..subroutines.specific_data_treatment import lwc2cflag +from ..subroutines.time_format_change import hhmmss2sec +from ..subroutines.read_aircraft import read_iwg1, read_cvi_hiscale, read_RF_NCAR #%% settings diff --git a/src/esmac_diags/plotting/plot_profile_cloud.py b/src/esmac_diags/plotting/plot_profile_cloud.py index 44d99e4..3ecf432 100644 --- a/src/esmac_diags/plotting/plot_profile_cloud.py +++ b/src/esmac_diags/plotting/plot_profile_cloud.py @@ -5,14 +5,13 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import matplotlib.pyplot as plt import numpy as np -from time_format_change import timeunit2cday,yyyymmdd2cday,cday2mmdd -from read_ARMdata import read_armbe -from read_netcdf import read_E3SM_z +from ..subroutines.time_format_change import timeunit2cday,yyyymmdd2cday,cday2mmdd +from ..subroutines.read_ARMdata import read_armbe +from ..subroutines.read_netcdf import read_E3SM_z #%% settings diff --git a/src/esmac_diags/plotting/plot_sfc_diurnalcycle_AerosolComposition.py b/src/esmac_diags/plotting/plot_sfc_diurnalcycle_AerosolComposition.py index d9c0336..94dbe7b 100644 --- a/src/esmac_diags/plotting/plot_sfc_diurnalcycle_AerosolComposition.py +++ b/src/esmac_diags/plotting/plot_sfc_diurnalcycle_AerosolComposition.py @@ -4,17 +4,16 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday,cday2mmdd -from read_ARMdata import read_acsm -from read_netcdf import read_E3SM -from specific_data_treatment import avg_time_1d -from quality_control import qc_remove_neg,qc_acsm_org_max +from ..subroutines.time_format_change import yyyymmdd2cday,cday2mmdd +from ..subroutines.read_ARMdata import read_acsm +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.specific_data_treatment import avg_time_1d +from ..subroutines.quality_control import qc_remove_neg,qc_acsm_org_max #%% settings diff --git a/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CCN.py b/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CCN.py index 761517b..b389da1 100644 --- a/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CCN.py +++ b/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CCN.py @@ -4,17 +4,16 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday,cday2mmdd -from read_ARMdata import read_ccn -from read_surface import read_CCN_hiscale_IOP1, read_CCN_hiscale_IOP2 -from read_netcdf import read_E3SM -from quality_control import qc_remove_neg,qc_mask_qcflag,qc_ccn_max +from ..subroutines.time_format_change import yyyymmdd2cday,cday2mmdd +from ..subroutines.read_ARMdata import read_ccn +from ..subroutines.read_surface import read_CCN_hiscale_IOP1, read_CCN_hiscale_IOP2 +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.quality_control import qc_remove_neg,qc_mask_qcflag,qc_ccn_max #%% settings diff --git a/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CN.py b/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CN.py index 0f1def5..bb456ee 100644 --- a/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CN.py +++ b/src/esmac_diags/plotting/plot_sfc_diurnalcycle_CN.py @@ -4,17 +4,16 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday,cday2mmdd -from read_ARMdata import read_cpc -from read_netcdf import read_E3SM -from specific_data_treatment import avg_time_1d -from quality_control import qc_mask_qcflag_cpc +from ..subroutines.time_format_change import yyyymmdd2cday,cday2mmdd +from ..subroutines.read_ARMdata import read_cpc +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.specific_data_treatment import avg_time_1d +from ..subroutines.quality_control import qc_mask_qcflag_cpc #%% settings diff --git a/src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py b/src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py index 398681b..319b337 100644 --- a/src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py +++ b/src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py @@ -4,18 +4,17 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday, cday2mmdd -from read_surface import read_smpsb_pnnl,read_smps_bin -from read_ARMdata import read_uhsas, read_smps_bnl -from read_netcdf import read_E3SM -from specific_data_treatment import avg_time_2d -from quality_control import qc_mask_qcflag,qc_correction_nanosmps +from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd +from ..subroutines.read_surface import read_smpsb_pnnl,read_smps_bin +from ..subroutines.read_ARMdata import read_uhsas, read_smps_bnl +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.specific_data_treatment import avg_time_2d +from ..subroutines.quality_control import qc_mask_qcflag,qc_correction_nanosmps #%% settings diff --git a/src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py b/src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py index c738928..3893018 100644 --- a/src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py +++ b/src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py @@ -4,15 +4,14 @@ """ import sys -sys.path.insert(1,'../subroutines/') import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday,cday2mmdd -from read_ARMdata import read_acsm -from read_netcdf import read_E3SM -from quality_control import qc_remove_neg,qc_acsm_org_max +from ..subroutines.time_format_change import yyyymmdd2cday,cday2mmdd +from ..subroutines.read_ARMdata import read_acsm +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.quality_control import qc_remove_neg,qc_acsm_org_max #%% settings diff --git a/src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py b/src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py index 87fa173..0e4eff4 100644 --- a/src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py +++ b/src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py @@ -4,17 +4,16 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday,cday2mmdd -from read_ARMdata import read_acsm -from read_netcdf import read_E3SM -from specific_data_treatment import avg_time_1d -from quality_control import qc_remove_neg,qc_acsm_org_max +from ..subroutines.time_format_change import yyyymmdd2cday,cday2mmdd +from ..subroutines.read_ARMdata import read_acsm +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.specific_data_treatment import avg_time_1d +from ..subroutines.quality_control import qc_remove_neg,qc_acsm_org_max #%% settings diff --git a/src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py b/src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py index 7afbec6..8efd9be 100644 --- a/src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py +++ b/src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py @@ -4,17 +4,16 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday,cday2mmdd -from read_ARMdata import read_ccn -from read_surface import read_CCN_hiscale_IOP1, read_CCN_hiscale_IOP2 -from read_netcdf import read_E3SM -from quality_control import qc_remove_neg,qc_mask_qcflag,qc_ccn_max +from ..subroutines.time_format_change import yyyymmdd2cday,cday2mmdd +from ..subroutines.read_ARMdata import read_ccn +from ..subroutines.read_surface import read_CCN_hiscale_IOP1, read_CCN_hiscale_IOP2 +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.quality_control import qc_remove_neg,qc_mask_qcflag,qc_ccn_max #%% settings diff --git a/src/esmac_diags/plotting/plot_sfc_timeseries_CN.py b/src/esmac_diags/plotting/plot_sfc_timeseries_CN.py index 003df2e..59d7eb7 100644 --- a/src/esmac_diags/plotting/plot_sfc_timeseries_CN.py +++ b/src/esmac_diags/plotting/plot_sfc_timeseries_CN.py @@ -4,17 +4,16 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from time_format_change import yyyymmdd2cday,cday2mmdd -from read_ARMdata import read_cpc -from read_netcdf import read_E3SM -from specific_data_treatment import avg_time_1d -from quality_control import qc_remove_neg,qc_mask_qcflag_cpc +from ..subroutines.time_format_change import yyyymmdd2cday,cday2mmdd +from ..subroutines.read_ARMdata import read_cpc +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.specific_data_treatment import avg_time_1d +from ..subroutines.quality_control import qc_remove_neg,qc_mask_qcflag_cpc #%% settings diff --git a/src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py b/src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py index 46f78eb..8caf715 100644 --- a/src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py +++ b/src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py @@ -3,17 +3,16 @@ """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np import scipy.stats -from read_ship import read_marmet -from read_ARMdata import read_mwr, read_met -from read_netcdf import read_E3SM -from time_format_change import yyyymmdd2cday, cday2mmdd +from ..subroutines.read_ship import read_marmet +from ..subroutines.read_ARMdata import read_mwr, read_met +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd #%% settings diff --git a/src/esmac_diags/plotting/plot_ship_pdf_AerosolSize.py b/src/esmac_diags/plotting/plot_ship_pdf_AerosolSize.py index 0c6a0d3..8be71ae 100644 --- a/src/esmac_diags/plotting/plot_ship_pdf_AerosolSize.py +++ b/src/esmac_diags/plotting/plot_ship_pdf_AerosolSize.py @@ -4,16 +4,15 @@ # compare models and aircraft measurements """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ARMdata import read_uhsas -from read_netcdf import read_E3SM -from time_format_change import cday2mmdd,yyyymmdd2cday -from specific_data_treatment import avg_time_2d +from ..subroutines.read_ARMdata import read_uhsas +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import cday2mmdd,yyyymmdd2cday +from ..subroutines.specific_data_treatment import avg_time_2d #%% settings diff --git a/src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py b/src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py index 578f7f8..3ec8326 100644 --- a/src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py +++ b/src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py @@ -2,16 +2,15 @@ # plot ship-track CCN number concentration binned by different latitudes """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ARMdata import read_ccn_magic, read_ccn -from read_netcdf import read_E3SM -from time_format_change import cday2mmdd -from quality_control import qc_mask_qcflag,qc_ccn_max +from ..subroutines.read_ARMdata import read_ccn_magic, read_ccn +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import cday2mmdd +from ..subroutines.quality_control import qc_mask_qcflag,qc_ccn_max #%% settings diff --git a/src/esmac_diags/plotting/plot_ship_percentile_lat_CN.py b/src/esmac_diags/plotting/plot_ship_percentile_lat_CN.py index c60f56b..05534d0 100644 --- a/src/esmac_diags/plotting/plot_ship_percentile_lat_CN.py +++ b/src/esmac_diags/plotting/plot_ship_percentile_lat_CN.py @@ -2,16 +2,15 @@ # plot ship-track aerosol number concentration binned by different latitudes """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ARMdata import read_cpc, read_uhsas -from read_netcdf import read_E3SM -from time_format_change import cday2mmdd -from quality_control import qc_mask_qcflag,qc_remove_neg,qc_cn_max +from ..subroutines.read_ARMdata import read_cpc, read_uhsas +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import cday2mmdd +from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg,qc_cn_max #%% settings diff --git a/src/esmac_diags/plotting/plot_ship_percentile_lat_LWP.py b/src/esmac_diags/plotting/plot_ship_percentile_lat_LWP.py index 72e76da..6613a77 100644 --- a/src/esmac_diags/plotting/plot_ship_percentile_lat_LWP.py +++ b/src/esmac_diags/plotting/plot_ship_percentile_lat_LWP.py @@ -2,15 +2,14 @@ # plot ship-track liquid water path binned by different latitudes """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ARMdata import read_mwr -from read_netcdf import read_E3SM -from time_format_change import yyyymmdd2cday, cday2mmdd +from ..subroutines.read_ARMdata import read_mwr +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd #%% settings diff --git a/src/esmac_diags/plotting/plot_ship_percentile_lat_met.py b/src/esmac_diags/plotting/plot_ship_percentile_lat_met.py index 7fb08da..919bfa4 100644 --- a/src/esmac_diags/plotting/plot_ship_percentile_lat_met.py +++ b/src/esmac_diags/plotting/plot_ship_percentile_lat_met.py @@ -2,16 +2,15 @@ # plot ship-track meteorological variables binned by different latitudes """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ship import read_marmet -from read_ARMdata import read_met -from read_netcdf import read_E3SM -from time_format_change import yyyymmdd2cday, cday2mmdd +from ..subroutines.read_ship import read_marmet +from ..subroutines.read_ARMdata import read_met +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd #%% settings diff --git a/src/esmac_diags/plotting/plot_ship_timeseries_CCN.py b/src/esmac_diags/plotting/plot_ship_timeseries_CCN.py index 0500513..ec9ba7d 100644 --- a/src/esmac_diags/plotting/plot_ship_timeseries_CCN.py +++ b/src/esmac_diags/plotting/plot_ship_timeseries_CCN.py @@ -2,17 +2,16 @@ # plot timeseries of surface CCN number concentration along each ship leg """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ARMdata import read_ccn_magic, read_ccn -from read_netcdf import read_E3SM -from time_format_change import cday2mmdd -from specific_data_treatment import mask_model_ps -from quality_control import qc_mask_qcflag,qc_ccn_max +from ..subroutines.read_ARMdata import read_ccn_magic, read_ccn +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import cday2mmdd +from ..subroutines.specific_data_treatment import mask_model_ps +from ..subroutines.quality_control import qc_mask_qcflag,qc_ccn_max #%% settings diff --git a/src/esmac_diags/plotting/plot_ship_timeseries_CN.py b/src/esmac_diags/plotting/plot_ship_timeseries_CN.py index 30034f1..9c35411 100644 --- a/src/esmac_diags/plotting/plot_ship_timeseries_CN.py +++ b/src/esmac_diags/plotting/plot_ship_timeseries_CN.py @@ -2,17 +2,16 @@ # plot timeseries of surface aerosol number concentration along each ship leg """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ARMdata import read_cpc, read_uhsas -from read_netcdf import read_E3SM -from time_format_change import cday2mmdd -from specific_data_treatment import mask_model_ps -from quality_control import qc_mask_qcflag,qc_remove_neg,qc_cn_max +from ..subroutines.read_ARMdata import read_cpc, read_uhsas +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import cday2mmdd +from ..subroutines.specific_data_treatment import mask_model_ps +from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg,qc_cn_max #%% settings diff --git a/src/esmac_diags/plotting/plot_ship_timeseries_met.py b/src/esmac_diags/plotting/plot_ship_timeseries_met.py index 9c9e9d1..e03adb8 100644 --- a/src/esmac_diags/plotting/plot_ship_timeseries_met.py +++ b/src/esmac_diags/plotting/plot_ship_timeseries_met.py @@ -2,17 +2,16 @@ # plot timeseries of basic meteorological variables along ship track """ import sys -sys.path.insert(1,'../subroutines/') import os import glob import matplotlib.pyplot as plt import numpy as np -from read_ship import read_marmet -from read_ARMdata import read_met -from read_netcdf import read_E3SM -from time_format_change import yyyymmdd2cday, cday2mmdd -from specific_data_treatment import avg_time_1d +from ..subroutines.read_ship import read_marmet +from ..subroutines.read_ARMdata import read_met +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd +from ..subroutines.specific_data_treatment import avg_time_1d #%% settings diff --git a/src/esmac_diags/preprocessing/extract_E3SM_AOD_globalmean.py b/src/esmac_diags/preprocessing/extract_E3SM_AOD_globalmean.py index d16ad96..4daede0 100644 --- a/src/esmac_diags/preprocessing/extract_E3SM_AOD_globalmean.py +++ b/src/esmac_diags/preprocessing/extract_E3SM_AOD_globalmean.py @@ -1,10 +1,9 @@ import sys -sys.path.insert(1,'../subroutines/') import numpy as np from time_format_change import yyyymmdd2cday, cday2mmdd -from read_netcdf import read_E3SM +from ..subroutines.read_netcdf import read_E3SM from netCDF4 import Dataset diff --git a/src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py b/src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py index 2f0fe06..913bd1d 100644 --- a/src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py +++ b/src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py @@ -1,9 +1,8 @@ import sys -sys.path.insert(1,'../subroutines/') import numpy as np -from time_format_change import yyyymmdd2cday, cday2mmdd +from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd from read_netcdf import read_E3SM from netCDF4 import Dataset diff --git a/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py index 2f3ce81..cb590d3 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py @@ -4,14 +4,13 @@ # output is aerosol variables for each flight """ import sys -sys.path.insert(1, '../subroutines/') import glob import os import numpy as np -from time_format_change import hhmmss2sec, timeunit2cday -from read_aircraft import read_iwg1, read_RF_NCAR -from read_netcdf import read_E3SM +from ..subroutines.time_format_change import hhmmss2sec, timeunit2cday +from ..subroutines.read_aircraft import read_iwg1, read_RF_NCAR +from ..subroutines.read_netcdf import read_E3SM from netCDF4 import Dataset def find_nearest(xall, yall, x, y): diff --git a/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py index 90167f5..48133ba 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py @@ -4,15 +4,14 @@ # output is aerosol size distribution for each flight """ import sys -sys.path.insert(1,'../subroutines/') import glob import os import numpy as np -from time_format_change import hhmmss2sec, timeunit2cday -from read_aircraft import read_iwg1, read_RF_NCAR -from read_netcdf import read_E3SM -from CN_mode_to_size import calc_CNsize_cutoff_0_3000nm +from ..subroutines.time_format_change import hhmmss2sec, timeunit2cday +from ..subroutines.read_aircraft import read_iwg1, read_RF_NCAR +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.CN_mode_to_size import calc_CNsize_cutoff_0_3000nm from netCDF4 import Dataset diff --git a/src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py index 989d835..37b2bfd 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py @@ -4,12 +4,11 @@ # output is variables at the nearest column """ import sys -sys.path.insert(1, '../subroutines/') import os import numpy as np -from time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd -from read_netcdf import read_E3SM +from ..subroutines.time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd +from ..subroutines.read_netcdf import read_E3SM from netCDF4 import Dataset def find_nearest(xall, yall, x, y): diff --git a/src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py index 5501169..c73b4f4 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py @@ -4,12 +4,11 @@ # output is surface variables at the nearest grid """ import sys -sys.path.insert(1, '../subroutines/') import os import numpy as np -from time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd -from read_netcdf import read_E3SM +from ..subroutines.time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd +from ..subroutines.read_netcdf import read_E3SM from netCDF4 import Dataset def find_nearest(xall, yall, x, y): diff --git a/src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py b/src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py index 2d5fc30..26e57a8 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py @@ -4,13 +4,12 @@ # output is surface aerosol distribution at the nearest grid """ import sys -sys.path.insert(1, '../subroutines/') import os import numpy as np -from time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd -from read_netcdf import read_E3SM -from CN_mode_to_size import calc_CNsize_cutoff_0_3000nm +from ..subroutines.time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.CN_mode_to_size import calc_CNsize_cutoff_0_3000nm from netCDF4 import Dataset def find_nearest(xall, yall, x, y): diff --git a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py index 6a4a3cf..b204fff 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py @@ -4,16 +4,15 @@ # output is surface variables at the nearest grid of the ship track """ import sys -sys.path.insert(1, '../subroutines/') import os import glob import numpy as np -from time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd -from read_netcdf import read_E3SM -from read_ship import read_marmet -from read_ARMdata import read_met -from netCDF4 import Dataset +from ..subroutines.time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.read_ship import read_marmet +from ..subroutines.read_ARMdata import read_met +from ..subroutines.netCDF4 import Dataset def find_nearest(xall, yall, x, y): distance = np.square(xall-x) + np.square(yall-y) diff --git a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_bins.py b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_bins.py index c7b8ecb..30bb7e9 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_bins.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_bins.py @@ -4,16 +4,15 @@ # output is surface variables at the nearest grid of the ship track """ import sys -sys.path.insert(1, '../subroutines/') import os import glob import numpy as np -from time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd -from read_netcdf import read_E3SM -from read_ship import read_marmet -from read_ARMdata import read_met -from CN_mode_to_size import calc_CNsize_cutoff_0_3000nm +from ..subroutines.time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.read_ship import read_marmet +from ..subroutines.read_ARMdata import read_met +from ..subroutines.CN_mode_to_size import calc_CNsize_cutoff_0_3000nm from netCDF4 import Dataset def find_nearest(xall, yall, x, y): diff --git a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py index ed2cb74..365b137 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py @@ -4,15 +4,14 @@ # output is vertical profiles at the nearest grid of the ship track """ import sys -sys.path.insert(1, '../subroutines/') import os import glob import numpy as np -from time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd -from read_netcdf import read_E3SM -from read_ship import read_marmet -from read_ARMdata import read_met +from ..subroutines.time_format_change import timeunit2cday, yyyymmdd2cday, cday2mmdd +from ..subroutines.read_netcdf import read_E3SM +from ..subroutines.read_ship import read_marmet +from ..subroutines.read_ARMdata import read_met from netCDF4 import Dataset def find_nearest(xall, yall, x, y): diff --git a/src/esmac_diags/preprocessing/prep_obs_mergesize_ACEENA.py b/src/esmac_diags/preprocessing/prep_obs_mergesize_ACEENA.py index 0962249..01e4442 100644 --- a/src/esmac_diags/preprocessing/prep_obs_mergesize_ACEENA.py +++ b/src/esmac_diags/preprocessing/prep_obs_mergesize_ACEENA.py @@ -5,15 +5,14 @@ # 2020.10.1 """ import sys -sys.path.insert(1, '../subroutines/') import os import glob import re import numpy as np -from read_aircraft import read_fims, read_fims_bin, read_iwg1, read_pcasp, read_opc -from read_ARMdata import read_cvi_aceena as read_cvi -from time_format_change import hhmmss2sec +from ..subroutines.read_aircraft import read_fims, read_fims_bin, read_iwg1, read_pcasp, read_opc +from ..subroutines.read_ARMdata import read_cvi_aceena as read_cvi +from ..subroutines.time_format_change import hhmmss2sec from netCDF4 import Dataset #%% set data paths diff --git a/src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py b/src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py index d522900..86341b3 100644 --- a/src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py +++ b/src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py @@ -1,331 +1,322 @@ +""" # merge size distribution from FIMS and PCASP for Hi-Scale # revised from size_bin_merge.pro by Jerome Fast # Shuaiqi Tang # 2020.10.1 - +""" import sys -sys.path.insert(1,'../subroutines/') -import numpy as np +import os import glob import re -from read_aircraft import read_fims,read_fims_bin,read_iwg1,read_pcasp, read_cvi_hiscale as read_cvi -from time_format_change import hhmmss2sec +import numpy as np +from ..subroutines.read_aircraft import read_fims, read_fims_bin, read_iwg1, read_pcasp, read_cvi_hiscale as read_cvi +from ..subroutines.time_format_change import hhmmss2sec from netCDF4 import Dataset #%% set data paths from settings import iwgpath, fimspath, pcasppath, cvipath, merged_size_path -import os if not os.path.exists(merged_size_path): os.makedirs(merged_size_path) # %% find all data -# lst = glob.glob(iwgpath+'aaf.iwg1001s.g1.hiscale.20160830*.a2.txt') -lst = glob.glob(iwgpath+'*.a2.txt') +# lst = glob.glob(iwgpath + 'aaf.iwg1001s.g1.hiscale.20160830*.a2.txt') +lst = glob.glob(iwgpath + '*.a2.txt') lst.sort() # read in fims bin -(d_fims,dmin_f,dmax_f)=read_fims_bin(fimspath+'HISCALE_FIMS_bins_R1.dat') +(d_fims, dmin_f, dmax_f) = read_fims_bin(fimspath + 'HISCALE_FIMS_bins_R1.dat') # change unit to um d_fims = [x/1000 for x in d_fims] dmin_f = [x/1000 for x in dmin_f] dmax_f = [x/1000 for x in dmax_f] -dlnDp_f=np.empty(len(d_fims)) +dlnDp_f = np.empty(len(d_fims)) for bb in range(len(d_fims)): - dlnDp_f[bb]=np.log(dmax_f[bb]/dmin_f[bb]) -dlnDp_f=np.mean(dlnDp_f) + dlnDp_f[bb] = np.log(dmax_f[bb]/dmin_f[bb]) +dlnDp_f = np.mean(dlnDp_f) for filename in lst[:]: # get date - fname=re.split('hiscale.|.a2',filename) - date=fname[-2] + fname = re.split('hiscale.|.a2', filename) + date = fname[-2] print(date) - if date[-1]=='a': - flightidx=1 + if date[-1] == 'a': + flightidx = 1 else: - flightidx=2 + flightidx = 2 #%% read in data # IWG - (iwg,iwgvars)=read_iwg1(filename) + (iwg, iwgvars) = read_iwg1(filename) timelen = len(iwg) # get lat, lon, height, time - lon=np.empty(timelen) - lat=np.empty(timelen) - height=np.empty(timelen) - time=np.empty(timelen) - cldflag=np.empty(timelen) - legnum=np.empty(timelen) - T_amb=np.empty(timelen) - p_amb=np.empty(timelen) + lon = np.empty(timelen) + lat = np.empty(timelen) + height = np.empty(timelen) + time = np.empty(timelen) + cldflag = np.empty(timelen) + legnum = np.empty(timelen) + T_amb = np.empty(timelen) + p_amb = np.empty(timelen) for t in range(timelen): - lat[t]=float(iwg[t][2]) - lon[t]=float(iwg[t][3]) - height[t]=float(iwg[t][4]) - T_amb[t]=float(iwg[t][20]) - p_amb[t]=float(iwg[t][23]) - cldflag[t]=int(iwg[t][35]) - legnum[t]=int(iwg[t][-1]) - timestr=iwg[t][1].split(' ') - time[t]=hhmmss2sec(timestr[1]) - datestr=timestr[0] + lat[t] = float(iwg[t][2]) + lon[t] = float(iwg[t][3]) + height[t] = float(iwg[t][4]) + T_amb[t] = float(iwg[t][20]) + p_amb[t] = float(iwg[t][23]) + cldflag[t] = int(iwg[t][35]) + legnum[t] = int(iwg[t][-1]) + timestr = iwg[t][1].split(' ') + time[t] = hhmmss2sec(timestr[1]) + datestr = timestr[0] # FIMS - filename_f=glob.glob(fimspath+'FIMS_G1_'+date[0:8]+'*'+str(flightidx)+'_HISCALE_001s.ict') + filename_f = glob.glob(fimspath + 'FIMS_G1_' + date[0:8] + '*' + str(flightidx) + '_HISCALE_001s.ict') # read in data - if len(filename_f)==1: - (data0,fimslist)=read_fims(filename_f[0]) + if len(filename_f) == 1: + (data0, fimslist) = read_fims(filename_f[0]) # remove some unrealistic data - fims2=data0[1:-2,:] - data2=data0[1:-2,:] - data2[np.isnan(data2)]=1e8 - data2[:,data2[0,:]>1e4]=1e8 - data2[np.logical_or(data2<0,data2>1e4)]=np.nan - data0[1:-2,:]=data2 - time_fims = data0[0,:] + fims2 = data0[1:-2, :] + data2 = data0[1:-2, :] + data2[np.isnan(data2)] = 1e8 + data2[:, data2[0, :] > 1e4] = 1e8 + data2[np.logical_or(data2 < 0, data2 > 1e4)] = np.nan + data0[1:-2, :] = data2 + time_fims = data0[0, :] # change data from #/dlnDp to number - data2=data0[1:-2,:]*dlnDp_f - fims = np.empty([30,len(time)]) + data2 = data0[1:-2, :]*dlnDp_f + fims = np.empty([30, len(time)]) for ii in range(30): - fims[ii,:] = np.interp(time,time_fims,data2[ii,:]) - idx=np.logical_or(time>time_fims[-1],time time_fims[-1], time < time_fims[0]) + fims[:, idx] = np.nan + elif len(filename_f) == 0: + time_fims = time + fims = np.nan*np.empty([len(d_fims), len(time)]) else: - print('find too many files, check: ') - print(filename_f) - error - fims_total = np.nansum(fims,0) - fims_total[fims_total<=0]=np.nan + raise ValueError('find more than one file: ' + filename_f) + fims_total = np.nansum(fims, 0) + fims_total[fims_total <= 0] = np.nan # PCASP - filename_p=glob.glob(pcasppath+'pcasp_g1_'+date[0:8]+'*'+str(flightidx)+'_hiscale001s.ict.txt') - if date[4:6]=='04' or date[4:6]=='05': - binlen=27 - dmax_p=[130,140,150,160,170,180,200,220,240,260,280,300,400,500,\ - 600,800,1000,1200,1400,1600,1800,2000,2200,2400,2600,2800,3000] - dmin_p=[120,130,140,150,160,170,180,200,220,240,260,280,300,400,500,\ - 600,800,1000,1200,1400,1600,1800,2000,2200,2400,2600,2800] - elif date[4:6]=='08' or date[4:6]=='09': - binlen=30 - dmax_p=[100,110,120,130,140,150,160,170,180,200,220,240,260,280,300,\ - 400,500,600,800,1000,1200,1400,1600,1800,2000,2200,2400,2600,2800,3000] - dmin_p=[90,100,110,120,130,140,150,160,170,180,200,220,240,260,280,300,\ - 400,500,600,800,1000,1200,1400,1600,1800,2000,2200,2400,2600,2800] + filename_p = glob.glob(pcasppath + 'pcasp_g1_' + date[0:8] + '*' + str(flightidx) + '_hiscale001s.ict.txt') + if date[4:6] == '04' or date[4:6] == '05': + binlen = 27 + dmax_p = [130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, 400, 500, \ + 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800, 3000] + dmin_p = [120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, 400, 500, \ + 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800] + elif date[4:6] == '08' or date[4:6] == '09': + binlen = 30 + dmax_p = [100, 110, 120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, \ + 400, 500, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800, 3000] + dmin_p = [90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, \ + 400, 500, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800] dmin_p = [x/1000 for x in dmin_p] dmax_p = [x/1000 for x in dmax_p] # read in data - if len(filename_p)==1: - (data0,pcasplist)=read_pcasp(filename_p[0]) - pcasp2=data0[1:-5,:] - time_pcasp=data0[0,:] - d_pcasp=[float(i) for i in pcasplist[1:-5]] - pcasp=data0[1:-5,:] - flag=data0[-2,:] - pcasp_total = data0[-5,:] + if len(filename_p) == 1: + (data0, pcasplist) = read_pcasp(filename_p[0]) + pcasp2 = data0[1:-5, :] + time_pcasp = data0[0, :] + d_pcasp = [float(i) for i in pcasplist[1:-5]] + pcasp = data0[1:-5, :] + flag = data0[-2, :] + pcasp_total = data0[-5, :] # remove some questionable data - # pcasp[np.isnan(pcasp)]=-9999 - # pcasp[np.logical_or(pcasp<=0,pcasp>1e6)]=np.nan - pcasp[:,flag!=0]=np.nan - pcasp[:,cldflag==1]=np.nan - if all(time_pcasp==time)==False: - print('time is not consistent for PCASP') - error - elif len(filename_p)==0: - time_pcasp=time - d_pcasp=[(dmin_p[x]+dmax_p[x])/2 for x in range(len(dmin_p))] - pcasp=np.nan*np.empty([len(d_pcasp),len(time)]) + # pcasp[np.isnan(pcasp)] = -9999 + # pcasp[np.logical_or(pcasp <= 0, pcasp > 1e6)] = np.nan + pcasp[:, flag != 0] = np.nan + pcasp[:, cldflag == 1] = np.nan + if not all(time_pcasp == time): + raise ValueError('PCASP time is inconsistent with FIMS') + elif len(filename_p) == 0: + time_pcasp = time + d_pcasp = [(dmin_p[x] + dmax_p[x])/2 for x in range(len(dmin_p))] + pcasp = np.nan*np.empty([len(d_pcasp), len(time)]) else: - print('find too many files, check: ') - print(filename_p) - error - # !! PCASP data is for standard T and p (Conc=Conc_orig*[(1013.25/Pamb)*(Tamb/293.15)]), change to ambient T/p - pcasp2=np.array(pcasp) + raise ValueError('find more than one file: ' + filename_p) + # !! PCASP data is for standard T and p (Conc = Conc_orig*[(1013.25/Pamb)*(Tamb/293.15)]), change to ambient T/p + pcasp2 = np.array(pcasp) for tt in range(len(time)): - pcasp[:,tt] = pcasp[:,tt]/((1013.25/p_amb[tt])*((T_amb[tt]+273.15)/293.15)) + pcasp[:, tt] = pcasp[:, tt]/((1013.25/p_amb[tt])*((T_amb[tt] + 273.15)/293.15)) # CVI - filename_c=glob.glob(cvipath+'CVI_G1_'+date[0:8]+'*R4_HISCALE_001s.ict.txt') + filename_c = glob.glob(cvipath + 'CVI_G1_' + date[0:8] + '*R4_HISCALE_001s.ict.txt') filename_c.sort() # read in data - if len(filename_c)==1 or len(filename_c)==2: - (cvi,cvilist)=read_cvi(filename_c[flightidx-1]) - time_cvi = cvi[0,:] - cvi_inlet=cvi[-1,:] - enhance_factor=cvi[2,:] - enhance_factor[enhance_factor<-9000]=np.nan - dilution_factor=cvi[3,:] - dilution_factor[dilution_factor<-9000]=np.nan - cvi_mode=cvi[4,:] - cvi_qc=cvi[5,:] - if all(time_cvi==time)==False: - print('time is not consistent for CVI') - error - elif len(filename_c)==0: - time_cvi=time - cvi_inlet=np.nan*np.empty([len(time)]) - cvi_mode=np.nan*np.empty([len(time)]) - dilution_factor=np.nan*np.empty([len(time)]) - enhance_factor=np.nan*np.empty([len(time)]) - cvi_qc=np.nan*np.empty([len(time)]) + if len(filename_c) == 1 or len(filename_c) == 2: + (cvi, cvilist) = read_cvi(filename_c[flightidx-1]) + time_cvi = cvi[0, :] + cvi_inlet = cvi[-1, :] + enhance_factor = cvi[2, :] + enhance_factor[enhance_factor < -9000] = np.nan + dilution_factor = cvi[3, :] + dilution_factor[dilution_factor < -9000] = np.nan + cvi_mode = cvi[4, :] + cvi_qc = cvi[5, :] + if not all(time_cvi == time): + raise ValueError('CVI time is inconsistent with FIMS') + elif len(filename_c) == 0: + time_cvi = time + cvi_inlet = np.nan*np.empty([len(time)]) + cvi_mode = np.nan*np.empty([len(time)]) + dilution_factor = np.nan*np.empty([len(time)]) + enhance_factor = np.nan*np.empty([len(time)]) + cvi_qc = np.nan*np.empty([len(time)]) else: - print('find too many files, check: ') - print(filename_c) - error - cvi_mode[cvi_qc!=0]=-9999 + raise ValueError('find more than one file: ' + filename_c) + cvi_mode[cvi_qc != 0] = -9999 #%% now merge fims and pcasp timelen = len(time) - nbin_merge=44 - nbin_fims=len(d_fims) - nbin_pcasp=len(d_pcasp) + nbin_merge = 44 + nbin_fims = len(d_fims) + nbin_pcasp = len(d_pcasp) # low and high range of each bin - dia_merge_l=np.empty(nbin_merge) - dia_merge_h=np.empty(nbin_merge) + dia_merge_l = np.empty(nbin_merge) + dia_merge_h = np.empty(nbin_merge) for n in range(nbin_fims): dia_merge_l[n] = dmin_f[n] dia_merge_h[n] = dmax_f[n] - idx=dmax_p.index(0.5) + idx = dmax_p.index(0.5) # use upper range (0.425) of FIMS as low bound and 0.5 of PCASP as high bound dia_merge_l[nbin_fims] = dmax_f[-1] dia_merge_h[nbin_fims] = dmax_p[idx] - for n in range(idx+1,nbin_pcasp): - dia_merge_l[nbin_fims+n-idx] = dmin_p[n] - dia_merge_h[nbin_fims+n-idx] = dmax_p[n] + for n in range(idx + 1, nbin_pcasp): + dia_merge_l[nbin_fims + n-idx] = dmin_p[n] + dia_merge_h[nbin_fims + n-idx] = dmax_p[n] d_merge = (dia_merge_h + dia_merge_l)/2 # merged concentration - conc_merge = np.empty([timelen,nbin_merge]) - fims[np.isnan(fims)]=-9999. # do not treat missing as NaN. treat -9999 + conc_merge = np.empty([timelen, nbin_merge]) + fims[np.isnan(fims)] = -9999. # do not treat missing as NaN. treat -9999 for k in range(timelen): # use fims data up to d_fims[23] (~0.19 um) - for n in range(23+1): - if cvi_inlet[k]==0: # in Jerome's code it is 0. looks like it should be 1 (CVI in cloud) - fims[n,k]=-9999 - conc_merge[k,n]=fims[n,k] + for n in range(23 + 1): + if cvi_inlet[k] == 0: # in Jerome's code it is 0. looks like it should be 1 (CVI in cloud) + fims[n, k] = -9999 + conc_merge[k, n] = fims[n, k] # overlapping bins - idx=dmin_p.index(0.2) # start merging size. corresponding to 10 in IOP2 - if fims[24,k]>0: - if cvi_inlet[k]==1: - ffac=0.95 - pfac=0.05 - elif cvi_inlet[k]==0: - ffac=0.0 - pfac=1.0 + idx = dmin_p.index(0.2) # start merging size. corresponding to 10 in IOP2 + if fims[24, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.95 + pfac = 0.05 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 else: - error + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - ffac=0.0 - pfac=1.0 - conc_merge[k,24] = (fims[24,k]*ffac + (pcasp[idx,k]*1.0 + pcasp[idx+1,k]*0.25)*pfac) - if fims[25,k]>0: - if cvi_inlet[k]==1: - ffac=0.8 - pfac=0.2 - elif cvi_inlet[k]==0: - ffac=0.0 - pfac=1.0 + ffac = 0.0 + pfac = 1.0 + conc_merge[k, 24] = (fims[24, k]*ffac + (pcasp[idx, k]*1.0 + pcasp[idx + 1, k]*0.25)*pfac) + if fims[25, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.8 + pfac = 0.2 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 else: - error + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - ffac=0.0 - pfac=1.0 - conc_merge[k,25] = (fims[25,k]*ffac + (pcasp[idx+1,k]*0.75 + pcasp[idx+2,k]*0.8)*pfac) - if fims[26,k]>0: - if cvi_inlet[k]==1: - ffac=0.65 - pfac=0.35 - elif cvi_inlet[k]==0: - ffac=0.0 - pfac=1.0 + ffac = 0.0 + pfac = 1.0 + conc_merge[k, 25] = (fims[25, k]*ffac + (pcasp[idx + 1, k]*0.75 + pcasp[idx + 2, k]*0.8)*pfac) + if fims[26, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.65 + pfac = 0.35 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 else: - error + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - ffac=0.0 - pfac=1.0 - conc_merge[k,26] = (fims[26,k]*ffac + (pcasp[idx+2,k]*0.2 + pcasp[idx+3,k]*1.0 + pcasp[idx+4,k]*0.5)*pfac) - if fims[27,k]>0: - if cvi_inlet[k]==1: - ffac=0.35 - pfac=0.65 - elif cvi_inlet[k]==0: - ffac=0.0 - pfac=1.0 + ffac = 0.0 + pfac = 1.0 + conc_merge[k, 26] = (fims[26, k]*ffac + (pcasp[idx + 2, k]*0.2 + pcasp[idx + 3, k]*1.0 + pcasp[idx + 4, k]*0.5)*pfac) + if fims[27, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.35 + pfac = 0.65 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 else: - error + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - ffac=0.0 - pfac=1.0 - conc_merge[k,27] = (fims[27,k]*ffac + (pcasp[idx+4,k]*0.5 + pcasp[idx+5,k]*0.25)*pfac) - if fims[28,k]>0: - if cvi_inlet[k]==1: - ffac=0.2 - pfac=0.8 - elif cvi_inlet[k]==0: - ffac=0.0 - pfac=1.0 + ffac = 0.0 + pfac = 1.0 + conc_merge[k, 27] = (fims[27, k]*ffac + (pcasp[idx + 4, k]*0.5 + pcasp[idx + 5, k]*0.25)*pfac) + if fims[28, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.2 + pfac = 0.8 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 else: - error + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - ffac=0.0 - pfac=1.0 - conc_merge[k,28] = (fims[28,k]*ffac + (pcasp[idx+5,k]*0.5)*pfac) - if fims[29,k]>0: - if cvi_inlet[k]==1: - ffac=0.05 - pfac=0.95 - elif cvi_inlet[k]==0: - ffac=0.0 - pfac=1.0 + ffac = 0.0 + pfac = 1.0 + conc_merge[k, 28] = (fims[28, k]*ffac + (pcasp[idx + 5, k]*0.5)*pfac) + if fims[29, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.05 + pfac = 0.95 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 else: - error + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - ffac=0.0 - pfac=1.0 - conc_merge[k,29] = (fims[29,k]*ffac + (pcasp[idx+5,k]*0.25 + pcasp[idx+6,k]*0.25)*pfac) - conc_merge[k,30] = pcasp[idx+6,k]*0.75 + ffac = 0.0 + pfac = 1.0 + conc_merge[k, 29] = (fims[29, k]*ffac + (pcasp[idx + 5, k]*0.25 + pcasp[idx + 6, k]*0.25)*pfac) + conc_merge[k, 30] = pcasp[idx + 6, k]*0.75 # using PCASP for upper bins - nn=31 - for n in range(idx+7,nbin_pcasp): - conc_merge[k,nn] = pcasp[n,k] - nn=nn+1 + nn = 31 + for n in range(idx + 7, nbin_pcasp): + conc_merge[k, nn] = pcasp[n, k] + nn = nn + 1 #%% output data - import os if not os.path.exists(merged_size_path): os.mkdir(merged_size_path) - outfile=merged_size_path+'merged_bin_fims_pcasp_HiScale_'+date+'.nc' + outfile = merged_size_path + 'merged_bin_fims_pcasp_HISCALE_' + date + '.nc' # define filename - f = Dataset(outfile, 'w', format='NETCDF4') + f = Dataset(outfile, 'w', format = 'NETCDF4') # define dimensions t = f.createDimension('time', None) # unlimited s = f.createDimension('size', nbin_merge) # unlimited # create variable list - time_o = f.createVariable("time","f8",("time",)) - size_o = f.createVariable("size","f8",("size",)) - sizeh_o = f.createVariable("size_high","f8",("size",)) - sizel_o = f.createVariable("size_low","f8",("size",)) - lon_o = f.createVariable("lon",'f8',("time",)) - lat_o = f.createVariable("lat",'f8',("time",)) - height_o = f.createVariable("height",'f8',("time",)) - cflag_o = f.createVariable('cld_flag','i8',("time",)) - legnum_o = f.createVariable('leg_number','i8',("time",)) - cvi_o = f.createVariable('CVI_inlet','i8',("time",)) - cvim_o = f.createVariable('CVI_mode','i8',("time",)) - df_o = f.createVariable('CVI_Dilution_Factor','f8',("time",)) - ef_o = f.createVariable('CVI_Enhancement_Factor','f8',("time",)) - merge_o = f.createVariable('size_distribution_merged','f8',("time","size")) - fims_o = f.createVariable('totalnum_fims','f8',("time",)) - pcasp_o = f.createVariable('totalnum_pcasp','f8',("time",)) + time_o = f.createVariable("time", "f8", ("time", )) + size_o = f.createVariable("size", "f8", ("size", )) + sizeh_o = f.createVariable("size_high", "f8", ("size", )) + sizel_o = f.createVariable("size_low", "f8", ("size", )) + lon_o = f.createVariable("lon", 'f8', ("time", )) + lat_o = f.createVariable("lat", 'f8', ("time", )) + height_o = f.createVariable("height", 'f8', ("time", )) + cflag_o = f.createVariable('cld_flag', 'i8', ("time", )) + legnum_o = f.createVariable('leg_number', 'i8', ("time", )) + cvi_o = f.createVariable('CVI_inlet', 'i8', ("time", )) + cvim_o = f.createVariable('CVI_mode', 'i8', ("time", )) + df_o = f.createVariable('CVI_Dilution_Factor', 'f8', ("time", )) + ef_o = f.createVariable('CVI_Enhancement_Factor', 'f8', ("time", )) + merge_o = f.createVariable('size_distribution_merged', 'f8', ("time", "size")) + fims_o = f.createVariable('totalnum_fims', 'f8', ("time", )) + pcasp_o = f.createVariable('totalnum_pcasp', 'f8', ("time", )) # write data time_o[:] = time @@ -339,22 +330,22 @@ legnum_o[:] = legnum cvi_o[:] = cvi_inlet cvim_o[:] = np.array(cvi_mode) - dilution_factor[np.isnan(dilution_factor)]=-9999. + dilution_factor[np.isnan(dilution_factor)] = -9999. df_o[:] = dilution_factor - enhance_factor[np.isnan(enhance_factor)]=-9999. + enhance_factor[np.isnan(enhance_factor)] = -9999. ef_o[:] = enhance_factor - conc_merge[np.isnan(conc_merge)]=-9999. - conc_merge[conc_merge<0]=-9999. - merge_o[:,:] = conc_merge - fims_total[np.isnan(fims_total)]=-9999. - fims_total[fims_total<0]=-9999. + conc_merge[np.isnan(conc_merge)] = -9999. + conc_merge[conc_merge < 0] = -9999. + merge_o[:, :] = conc_merge + fims_total[np.isnan(fims_total)] = -9999. + fims_total[fims_total < 0] = -9999. fims_o[:] = fims_total - pcasp_total[np.isnan(pcasp_total)]=-9999. - pcasp_total[pcasp_total<0]=-9999. + pcasp_total[np.isnan(pcasp_total)] = -9999. + pcasp_total[pcasp_total < 0] = -9999. pcasp_o[:] = pcasp_total # attributes - time_o.units = "seconds since "+date[0:4]+'-'+date[4:6]+'-'+date[6:8]+" 00:00:00" + time_o.units = "seconds since " + date[0:4] + '-' + date[4:6] + '-' + date[6:8] + " 00:00:00" size_o.units = 'um' size_o.long_name = 'center of size bin' sizeh_o.units = 'um' @@ -394,7 +385,7 @@ # global attributes import time as ttt f.description = "Merged size distribution from FIMS and PCASP" - f.history = "Created by Shuaiqi at " + ttt.ctime(ttt.time()) + f.create_time = ttt.ctime(ttt.time()) f.close() - \ No newline at end of file + From f8257b664370e4c32a371691013a01475dd0d0f7 Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Sun, 7 Nov 2021 19:35:57 -0800 Subject: [PATCH 09/14] Add a really simple test and github actions workflow just to test --- .github/workflows/run_esmac_diags_tests.yml | 25 +++++++++++++++++++++ tests/test_package_imports.py | 5 +++++ 2 files changed, 30 insertions(+) create mode 100644 .github/workflows/run_esmac_diags_tests.yml create mode 100644 tests/test_package_imports.py diff --git a/.github/workflows/run_esmac_diags_tests.yml b/.github/workflows/run_esmac_diags_tests.yml new file mode 100644 index 0000000..a6db113 --- /dev/null +++ b/.github/workflows/run_esmac_diags_tests.yml @@ -0,0 +1,25 @@ +name: run_esmac_diags_ci.yml +on: [push,pull_request ] +jobs: + build_and_publish: + name: Setup Environment, and run test suite + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Setup Environment + uses: conda-incubator/setup-miniconda@v2 + with: + python-version: 3.7 + mamba-version: "*" + channels: conda-forge,defaults + channel-priority: true + activate-environment: esmac_diags + environment-file: environment.yml + - name: Install esmac_diags + shell: bash -l {0} + run: | + pip install -e . + - name: Run Pytest + shell: bash -l {0} + run: | + pytest \ No newline at end of file diff --git a/tests/test_package_imports.py b/tests/test_package_imports.py new file mode 100644 index 0000000..7d55e8c --- /dev/null +++ b/tests/test_package_imports.py @@ -0,0 +1,5 @@ +import pytest + +def test_package_imports(): + """ Test whether the package imports""" + import esmac_diags From b206263d53f699aa55fecac2bf9ec2500706ef9d Mon Sep 17 00:00:00 2001 From: "Joseph C. Hardin" Date: Tue, 9 Nov 2021 08:13:20 -0800 Subject: [PATCH 10/14] Updated test case to use new functional form. I'm missing some test files still though --- scripts/run_testcase.py | 94 ++++ scripts/settings_testcase.py | 5 +- .../plotting/plot_flight_pdf_AerosolSize.py | 418 +++++++++-------- .../plotting/plot_flight_track_height.py | 444 +++++++++--------- src/esmac_diags/subroutines/read_aircraft.py | 3 +- tests/test_package_imports.py | 2 + 6 files changed, 544 insertions(+), 422 deletions(-) create mode 100644 scripts/run_testcase.py diff --git a/scripts/run_testcase.py b/scripts/run_testcase.py new file mode 100644 index 0000000..fa9357c --- /dev/null +++ b/scripts/run_testcase.py @@ -0,0 +1,94 @@ +# settings of the aerosol diagnostic package + +from matplotlib.pyplot import plot +import numpy as np +import esmac_diags + +from esmac_diags.plotting import plot_flight_pdf_AerosolSize, plot_flight_track_height + + +settings = {} +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# global settings +############ these settings will be replaced by the settings in scripts_*.csh ############# +# set field campaign name. More settings on specific field campaigns are in next section +settings['campaign'] = 'ACEENA' +# set model names. up to three +settings['Model_List'] = ['E3SMv1'] +# set line colors for each model. corresponding to the Model_List +settings['color_model'] = ['r','b','g'] +# set IOP that the statistics, pdf and percentiles are averaged for. Only available for HISCALE and ACEENA +# IOP1/IOP2 +settings['IOP'] = 'IOP1' +############ these settings will be replaced by the settings in scripts_*.csh ############# + + +# path of the diagnostic package +package_path = '../../' + +# # path of E3SM model data (h3) for preprocessing. list with the same length of Model_List +# settings['E3SM_h3_path']=[] +# settings['E3SM_h3_filehead']=[] # filename before .cam.h3.yyyy-mm-dd.00000.nc +# for mm in settings['Model_List']: +# E3SM_h3_path.append('/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_h3/') +# if campaign=='MAGIC': +# E3SM_h3_filehead.append(mm+'_2012-2013') +# else: +# # E3SM_h3_filehead.append(mm+'_2014-2018') +# E3SM_h3_filehead.append(mm) +# #E3SM_h3_path.append('/qfs/projects/eagles/zhan524/simulations/compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm+'/h3/') +# #E3SM_h3_filehead.append('compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm) + +# path of output figures +settings['figpath_aircraft_timeseries'] = package_path+'testcase/figures/' +settings['figpath_aircraft_statistics'] = package_path+'testcase/figures/' +settings['figpath_ship_timeseries'] = package_path+'testcase/figures/' +settings['figpath_ship_statistics'] = package_path+'testcase/figures/' +settings['figpath_sfc_timeseries'] = package_path+'testcase/figures/' +settings['figpath_sfc_statistics'] = package_path+'testcase/figures/' +settings['figpath_profile_timeseries'] = package_path+'testcase/figures/' +settings['RFpath']=package_path+'data/'+settings['campaign']+'/obs/aircraft/aircraft_lowrate/' + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# settings for different field campaigns + +# set location and time information +if settings['campaign']=='ACEENA': + settings['site']='ENA' + # lat/lon for ENA + settings['lat0'] = 39.09527 + settings['lon0'] = 360-28.0339 + # bin of flight heights to calculate percentiles + settings['height_bin'] = np.arange(100,4300,300) + + # time periods for IOPs. needed in preprocessing of surface data + if settings['IOP']=='IOP1': + settings['start_date']='2017-06-30' + settings['end_date']='2017-06-31' + elif settings['IOP']=='IOP2': + settings['start_date']='2018-01-21' + settings['end_date']='2018-02-19' + + # observational data path. + # aircraf measurements merged_bin data are used for all plot_flight_*.py to provide flight/cloud/CVI info + settings['merged_size_path']=package_path+'testcase/data/obs/' + settings['iwgpath'] = package_path+'testcase/data/obs/' + settings['cvipath'] = package_path+'testcase/data/obs/' + settings['amspath'] = package_path+'testcase/data/obs/AMS/' + + # model path + # pre-processed model path + settings['E3SM_aircraft_path'] = package_path+'testcase/data/model/' + + +else: + raise ValueError("Test case should only for ACEENA. Current campaign is: "+campaign) + +# Long list of blah.run_plot() + +### Create our actual plots +plot_flight_pdf_AerosolSize.run_plot(settings) +plot_flight_track_height.run_plot(settings) + + diff --git a/scripts/settings_testcase.py b/scripts/settings_testcase.py index cecb7f6..0fbd259 100644 --- a/scripts/settings_testcase.py +++ b/scripts/settings_testcase.py @@ -4,7 +4,6 @@ #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # global settings - ############ these settings will be replaced by the settings in scripts_*.csh ############# # set field campaign name. More settings on specific field campaigns are in next section campaign = 'ACEENA' @@ -78,3 +77,7 @@ else: raise ValueError("Test case should only for ACEENA. Current campaign is: "+campaign) + +# Long list of blah.run_plot() + + diff --git a/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py b/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py index e4374ab..64e8609 100644 --- a/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py +++ b/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py @@ -20,221 +20,231 @@ #%% settings -from settings import campaign, Model_List, color_model, \ - E3SM_aircraft_path, figpath_aircraft_statistics - -if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, merged_size_path -elif campaign in ['CSET', 'SOCRATES']: - from settings import RFpath -else: - raise ValueError('campaign name is not recognized: '+campaign) - -if not os.path.exists(figpath_aircraft_statistics): - os.makedirs(figpath_aircraft_statistics) - +def run_plot(settings): + + # from settings import campaign, Model_List, color_model, \ + # E3SM_aircraft_path, figpath_aircraft_statistics -#%% find files for flight information - -lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') -lst.sort() -if len(lst)==0: - raise ValueError('cannot find any file') -# choose files for specific IOP -if campaign=='HISCALE': - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() -elif campaign=='ACEENA': - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() + # if campaign in ['HISCALE', 'ACEENA']: + # from settings import IOP, merged_size_path + # elif campaign in ['CSET', 'SOCRATES']: + # from settings import RFpath + # else: + # raise ValueError('campaign name is not recognized: '+campaign) + + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_statistics = settings['figpath_aircraft_statistics'] + IOP = settings.get('IOP', None) + merged_size_path = settings.get('merged_size_path', None) + + + if not os.path.exists(figpath_aircraft_statistics): + os.makedirs(figpath_aircraft_statistics) + + + #%% find files for flight information + + lst = sorted(glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc')) + if len(lst)==0: + raise ValueError('cannot find any file') + # choose files for specific IOP + if campaign=='HISCALE': + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + elif campaign=='ACEENA': + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + + alldates = [x.split('_')[-1].split('.')[0] for x in lst] + + print('reading '+format(len(alldates))+' files to calculate mean aerosol pdf: ') + + nmodels=len(Model_List) + pdfall_m = [np.empty((3000,0)) for mm in range(nmodels)] + size_m = np.zeros(3000) + pdf_model = [size_m for mm in range(nmodels)] + if 'pdf_obs' in locals(): + del pdf_obs + + # number of valid timesteps + n_o = 0 + n_m = [0 for mm in range(nmodels)] -alldates = [x.split('_')[-1].split('.')[0] for x in lst] - -print('reading '+format(len(alldates))+' files to calculate mean aerosol pdf: ') - -nmodels=len(Model_List) -pdfall_m = [np.empty((3000,0)) for mm in range(nmodels)] -size_m = np.zeros(3000) -pdf_model = [size_m for mm in range(nmodels)] -if 'pdf_obs' in locals(): - del pdf_obs - -# number of valid timesteps -n_o = 0 -n_m = [0 for mm in range(nmodels)] - -# dN/dlnDp for model -dlnDp_m = np.empty((3000)) -for bb in range(3000): - dlnDp_m[bb]=np.log((bb+2)/(bb+1)) + # dN/dlnDp for model + dlnDp_m = np.empty((3000)) + for bb in range(3000): + dlnDp_m[bb]=np.log((bb+2)/(bb+1)) -for date in alldates[:]: - print(date) - - #%% read in Models - for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - (timem,heightm,datam,timeunitm,datamunit,datamlongname)=read_extractflight(filename_m,'NCNall') - datam=datam*1e-6 # #/m3 to #/cm3 - - # average in time for quicker plot - time2=np.arange(300,86400,600) - data2 = avg_time_2d(timem,datam.T,time2) - datam=data2.T - timem=time2 + for date in alldates[:]: + print(date) - for tt in range(len(timem)): - datam[:,tt]=datam[:,tt]/dlnDp_m + #%% read in Models + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + (timem,heightm,datam,timeunitm,datamunit,datamlongname)=read_extractflight(filename_m,'NCNall') + datam=datam*1e-6 # #/m3 to #/cm3 - pdfall_m[mm] = np.column_stack((pdfall_m[mm],datam)) - for tt in range(len(timem)): - if ~np.isnan(datam[0,tt]): - pdf_model[mm] = pdf_model[mm]+datam[:,tt] - n_m[mm]=n_m[mm]+1 + # average in time for quicker plot + time2=np.arange(300,86400,600) + data2 = avg_time_2d(timem,datam.T,time2) + datam=data2.T + timem=time2 + + for tt in range(len(timem)): + datam[:,tt]=datam[:,tt]/dlnDp_m + + pdfall_m[mm] = np.column_stack((pdfall_m[mm],datam)) + for tt in range(len(timem)): + if ~np.isnan(datam[0,tt]): + pdf_model[mm] = pdf_model[mm]+datam[:,tt] + n_m[mm]=n_m[mm]+1 + + #%% read observation + if campaign in ['HISCALE', 'ACEENA']: + if date[-1]=='a': + flightidx=1 + else: + flightidx=2 + + if campaign=='HISCALE': + filename = merged_size_path+'merged_bin_fims_pcasp_'+campaign+'_'+date+'.nc' + elif campaign=='ACEENA': + filename = merged_size_path+'merged_bin_fims_pcasp_opc_'+campaign+'_'+date+'.nc' - #%% read observation - if campaign in ['HISCALE', 'ACEENA']: - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 + (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') + (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') + (time,size,legnum,timeunit,zunit,long_name)=read_merged_size(filename,'leg_number') + (time,size,sizeh,timeunit,dataunit,long_name)=read_merged_size(filename,'size_high') + (time,size,sizel,timeunit,dataunit,long_name)=read_merged_size(filename,'size_low') + (time,size,merge,timeunit,dataunit,long_name)=read_merged_size(filename,'size_distribution_merged') + time=np.ma.compressed(time) + size=size*1000. + merge = qc_mask_cloudflag(merge,cflag) - if campaign=='HISCALE': - filename = merged_size_path+'merged_bin_fims_pcasp_'+campaign+'_'+date+'.nc' - elif campaign=='ACEENA': - filename = merged_size_path+'merged_bin_fims_pcasp_opc_'+campaign+'_'+date+'.nc' - - (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') - (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') - (time,size,legnum,timeunit,zunit,long_name)=read_merged_size(filename,'leg_number') - (time,size,sizeh,timeunit,dataunit,long_name)=read_merged_size(filename,'size_high') - (time,size,sizel,timeunit,dataunit,long_name)=read_merged_size(filename,'size_low') - (time,size,merge,timeunit,dataunit,long_name)=read_merged_size(filename,'size_distribution_merged') - time=np.ma.compressed(time) - size=size*1000. - merge = qc_mask_cloudflag(merge,cflag) + # average in time for quicker plot + time2=np.arange(300,86400,600) + data2 = avg_time_2d(time,merge,time2) + merge = data2.T + time=time2/3600. + + + elif campaign in ['CSET', 'SOCRATES']: + filename = glob.glob(settings['RFpath']+'RF*'+date+'*.PNI.nc') + # cloud flag + (time,lwc,timeunit,lwcunit,lwclongname,size,cellunit)=read_RF_NCAR(filename[-1],'PLWCC') + if campaign=='CSET': + (time,uhsas,timeunit,dataunit,long_name,size,cellunit)=read_RF_NCAR(filename[-1],'CUHSAS_RWOOU') + elif campaign=='SOCRATES': + # there are two variables: CUHSAS_CVIU and CUHSAS_LWII + (time,uhsas,timeunit,dataunit,long_name,size,cellunit)=read_RF_NCAR(filename[-1],'CUHSAS_LWII') + uhsas=uhsas[:,0,:] + # calculate cloud flag based on LWC + cflag=lwc2cflag(lwc,lwcunit) + uhsas = qc_mask_cloudflag(uhsas,cflag) + uhsas= qc_uhsas_RF_NCAR(uhsas) + + # average in time for quicker plot + time2=np.arange(300,86400,600) + data2 = avg_time_2d(time,uhsas,time2) + merge = data2.T + time0 = np.array(time) + time=time2/3600. + + size=size*1000. + sizeh = size + sizel = np.hstack((2*size[0]-size[1], size[0:-1])) - # average in time for quicker plot - time2=np.arange(300,86400,600) - data2 = avg_time_2d(time,merge,time2) - merge = data2.T - time=time2/3600. + # change to dN/dlnDp + for bb in range(len(size)): + dlnDp=np.log(sizeh[bb]/sizel[bb]) + merge[bb,:]=merge[bb,:]/dlnDp - - elif campaign in ['CSET', 'SOCRATES']: - filename = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') - # cloud flag - (time,lwc,timeunit,lwcunit,lwclongname,size,cellunit)=read_RF_NCAR(filename[-1],'PLWCC') - if campaign=='CSET': - (time,uhsas,timeunit,dataunit,long_name,size,cellunit)=read_RF_NCAR(filename[-1],'CUHSAS_RWOOU') - elif campaign=='SOCRATES': - # there are two variables: CUHSAS_CVIU and CUHSAS_LWII - (time,uhsas,timeunit,dataunit,long_name,size,cellunit)=read_RF_NCAR(filename[-1],'CUHSAS_LWII') - uhsas=uhsas[:,0,:] - # calculate cloud flag based on LWC - cflag=lwc2cflag(lwc,lwcunit) - uhsas = qc_mask_cloudflag(uhsas,cflag) - uhsas= qc_uhsas_RF_NCAR(uhsas) + merge=qc_remove_neg(merge) - # average in time for quicker plot - time2=np.arange(300,86400,600) - data2 = avg_time_2d(time,uhsas,time2) - merge = data2.T - time0 = np.array(time) - time=time2/3600. + # exclude 30min after takeoff and before landing + merge = qc_mask_takeoff_landing(time2,merge) - size=size*1000. - sizeh = size - sizel = np.hstack((2*size[0]-size[1], size[0:-1])) - - # change to dN/dlnDp - for bb in range(len(size)): - dlnDp=np.log(sizeh[bb]/sizel[bb]) - merge[bb,:]=merge[bb,:]/dlnDp - - merge=qc_remove_neg(merge) - - # exclude 30min after takeoff and before landing - merge = qc_mask_takeoff_landing(time2,merge) - - # fig,ax=plt.subplots() - # ax.plot(merge[9,:]) - # ax.set_title(date) - # error - - if ('pdf_obs' in locals()) == False: - pdf_obs = np.zeros(len(size)) - pdfall_o = np.empty((len(size),0)) - idx_valid = ~np.isnan(np.mean(merge,0)) - pdf_obs = pdf_obs + np.sum(merge[:,idx_valid],1) - pdfall_o = np.hstack((pdfall_o,np.array(merge[:,idx_valid]))) - n_o = n_o + np.sum(idx_valid) - + # fig,ax=plt.subplots() + # ax.plot(merge[9,:]) + # ax.set_title(date) + # error + + if ('pdf_obs' in locals()) == False: + pdf_obs = np.zeros(len(size)) + pdfall_o = np.empty((len(size),0)) + idx_valid = ~np.isnan(np.mean(merge,0)) + pdf_obs = pdf_obs + np.sum(merge[:,idx_valid],1) + pdfall_o = np.hstack((pdfall_o,np.array(merge[:,idx_valid]))) + n_o = n_o + np.sum(idx_valid) + + + #%% calculate mean pdf + + pdf_obs[pdf_obs<1e-3]=np.nan + pdf_obs=pdf_obs/n_o + for mm in range(nmodels): + pdf_model[mm]=pdf_model[mm]/n_m[mm] + + #%% + pdfall_o[pdfall_o<0]=np.nan + pct1_o = [np.nanpercentile(pdfall_o[i,:],10) for i in range(len(size))] + pct2_o = [np.nanpercentile(pdfall_o[i,:],90) for i in range(len(size))] + pct1_m = [[] for mm in range(nmodels)] + pct2_m = [[] for mm in range(nmodels)] + for mm in range(nmodels): + pct1_m[mm] = [np.nanpercentile(pdfall_m[mm][i,:],10) for i in range(3000)] + pct2_m[mm] = [np.nanpercentile(pdfall_m[mm][i,:],90) for i in range(3000)] + + #%% make plot + + if campaign in ['HISCALE', 'ACEENA']: + figname = figpath_aircraft_statistics+'pdf_AerosolSize_'+campaign+'_'+IOP+'.png' + else: + figname = figpath_aircraft_statistics+'pdf_AerosolSize_'+campaign+'.png' + + print('plotting figures to '+figname) + + #fig = plt.figure() + fig,ax = plt.subplots(figsize=(4,2.5)) # figsize in inches + + ax.plot(size,pdf_obs,color='k',label='Obs') + for mm in range(nmodels): + ax.plot(np.arange(1,3001),pdf_model[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + + ax.fill_between(size,pct1_o,pct2_o, alpha=0.5, facecolor='gray') + for mm in range(nmodels): + ax.fill_between(np.arange(1,3001),pct1_m[mm],pct2_m[mm], alpha=0.2, facecolor=color_model[mm]) + + ax.legend(loc='upper right', shadow=False, fontsize='medium') + ax.tick_params(color='k',labelsize=12) + ax.set_xscale('log') + ax.set_yscale('log') + ax.set_ylim(0.01,1e4) + ax.set_xlim(0.67,4500) + ax.set_xlabel('Diameter (nm)',fontsize=13) + ax.set_ylabel('#/dlnDp (cm$^{-3}$)',fontsize=13) + + if campaign in ['HISCALE', 'ACEENA']: + ax.set_title(campaign+' '+IOP,fontsize=14) + else: + ax.set_title(campaign,fontsize=14) -#%% calculate mean pdf - -pdf_obs[pdf_obs<1e-3]=np.nan -pdf_obs=pdf_obs/n_o -for mm in range(nmodels): - pdf_model[mm]=pdf_model[mm]/n_m[mm] - -#%% -pdfall_o[pdfall_o<0]=np.nan -pct1_o = [np.nanpercentile(pdfall_o[i,:],10) for i in range(len(size))] -pct2_o = [np.nanpercentile(pdfall_o[i,:],90) for i in range(len(size))] -pct1_m = [[] for mm in range(nmodels)] -pct2_m = [[] for mm in range(nmodels)] -for mm in range(nmodels): - pct1_m[mm] = [np.nanpercentile(pdfall_m[mm][i,:],10) for i in range(3000)] - pct2_m[mm] = [np.nanpercentile(pdfall_m[mm][i,:],90) for i in range(3000)] - -#%% make plot - -if campaign in ['HISCALE', 'ACEENA']: - figname = figpath_aircraft_statistics+'pdf_AerosolSize_'+campaign+'_'+IOP+'.png' -else: - figname = figpath_aircraft_statistics+'pdf_AerosolSize_'+campaign+'.png' - -print('plotting figures to '+figname) - -#fig = plt.figure() -fig,ax = plt.subplots(figsize=(4,2.5)) # figsize in inches - -ax.plot(size,pdf_obs,color='k',label='Obs') -for mm in range(nmodels): - ax.plot(np.arange(1,3001),pdf_model[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - -ax.fill_between(size,pct1_o,pct2_o, alpha=0.5, facecolor='gray') -for mm in range(nmodels): - ax.fill_between(np.arange(1,3001),pct1_m[mm],pct2_m[mm], alpha=0.2, facecolor=color_model[mm]) - -ax.legend(loc='upper right', shadow=False, fontsize='medium') -ax.tick_params(color='k',labelsize=12) -ax.set_xscale('log') -ax.set_yscale('log') -ax.set_ylim(0.01,1e4) -ax.set_xlim(0.67,4500) -ax.set_xlabel('Diameter (nm)',fontsize=13) -ax.set_ylabel('#/dlnDp (cm$^{-3}$)',fontsize=13) - -if campaign in ['HISCALE', 'ACEENA']: - ax.set_title(campaign+' '+IOP,fontsize=14) -else: - ax.set_title(campaign,fontsize=14) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -# plt.close() + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + # plt.close() diff --git a/src/esmac_diags/plotting/plot_flight_track_height.py b/src/esmac_diags/plotting/plot_flight_track_height.py index 6f8186a..2362fe1 100644 --- a/src/esmac_diags/plotting/plot_flight_track_height.py +++ b/src/esmac_diags/plotting/plot_flight_track_height.py @@ -17,233 +17,245 @@ #%% settings +def run_plot(): + from settings import campaign, lat0, lon0, figpath_aircraft_timeseries -from settings import campaign, lat0, lon0, figpath_aircraft_timeseries + if campaign in ['HISCALE', 'ACEENA']: + from settings import IOP, iwgpath, cvipath + elif campaign in ['CSET', 'SOCRATES']: + from settings import RFpath + else: + raise ValueError('campaign name is not recognized: '+campaign) -if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, iwgpath, cvipath -elif campaign in ['CSET', 'SOCRATES']: - from settings import RFpath -else: - raise ValueError('campaign name is not recognized: '+campaign) - -if not os.path.exists(figpath_aircraft_timeseries): - os.makedirs(figpath_aircraft_timeseries) - + campaign = settings['campaign'] + lat0 = settings['lat0'] + lon0 = settings['lon0'] + figpath_aircraft_timeseries = settings['figpath_aircraft_timeseries'] -#%% find all flight data + IOP = settings['IOP'] + iwgpath = settings['iwgpath'] + cvipath = settings['cvipath'] + RFpath = settings['RFpath'] -if campaign=='HISCALE': - lst = glob.glob(iwgpath+'*a2.txt') - lst.sort() - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+campaign+'_') - lst = glob.glob(a[0]+'*'+IOP+'*') -elif campaign=='ACEENA': - lst = glob.glob(iwgpath+'*a2.txt') + + + if not os.path.exists(figpath_aircraft_timeseries): + os.makedirs(figpath_aircraft_timeseries) + + + #%% find all flight data + + if campaign=='HISCALE': + lst = glob.glob(iwgpath+'*a2.txt') + lst.sort() + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+campaign+'_') + lst = glob.glob(a[0]+'*'+IOP+'*') + elif campaign=='ACEENA': + lst = glob.glob(iwgpath+'*a2.txt') + lst.sort() + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+campaign+'_') + lst = glob.glob(a[0]+'*'+IOP+'*') + elif campaign in ['CSET', 'SOCRATES']: + lst = glob.glob(RFpath+'RF*.PNI.nc') + else: + raise ValueError('campaign name is not recognized: '+campaign) lst.sort() - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+campaign+'_') - lst = glob.glob(a[0]+'*'+IOP+'*') -elif campaign in ['CSET', 'SOCRATES']: - lst = glob.glob(RFpath+'RF*.PNI.nc') -else: - raise ValueError('campaign name is not recognized: '+campaign) -lst.sort() -#%% read in data and make plot -for filename in lst: - - # get date info: - fname=filename.split('.') - - #%% read in flight data (for HISCALE and ACEENA) - if campaign in ['HISCALE', 'ACEENA']: - date=fname[-3] - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 + #%% read in data and make plot + for filename in lst: - # read in IWG data - (iwg,iwgvars)=read_iwg1(filename) - timelen = len(iwg) - if np.logical_and(campaign=='ACEENA', date=='20180216a'): - iwg.insert(1403,list(iwg[1403])) - tstr=iwg[1403][1] - tstr=tstr[0:-1]+str(int(tstr[-1])-1) - iwg[1403][1]=tstr - del iwg[-1] - # get lat, lon, height, time - lon=np.empty(timelen) - lat=np.empty(timelen) - height=np.empty(timelen) - time=np.empty(timelen) - cldflag=np.empty(timelen) - legnum=np.full(timelen,0) - for t in range(timelen): - lat[t]=float(iwg[t][2]) - lon[t]=float(iwg[t][3]) - height[t]=float(iwg[t][4]) - cldflag[t]=int(iwg[t][35]) - legnum[t]=int(iwg[t][-1]) - timestr=iwg[t][1].split(' ') - time[t]=hhmmss2sec(timestr[1]) - datestr=timestr[0] + # get date info: + fname=filename.split('.') - # read in CVI - if campaign=='HISCALE': - filename_c=glob.glob(cvipath+'CVI_G1_'+date[0:8]+'*R4_HISCALE_001s.ict.txt') - filename_c.sort() - # read in data - if len(filename_c)==1 or len(filename_c)==2: - (cvi,cvilist)=read_cvi_hiscale(filename_c[flightidx-1]) - time_cvi = cvi[0,:] - cvi_inlet=cvi[-1,:] - if all(time_cvi==time)==False: - raise ValueError('time dimension is incosistent') - elif len(filename_c)==0: - time_cvi=time - cvi_inlet=np.nan*np.empty([len(time)]) + #%% read in flight data (for HISCALE and ACEENA) + if campaign in ['HISCALE', 'ACEENA']: + date=fname[-3] + if date[-1]=='a': + flightidx=1 else: - raise ValueError('find too many files: '+filename_c) - - elif campaign=='ACEENA': - filename_c=glob.glob(cvipath+'enaaafinletcviF1.c1.'+date[0:8]+'*.nc') - filename_c.sort() - # read in data - if len(filename_c)==1: - (time_c,lon_c,lat_c,alt_c,timeunit_c,cvimode,cvi_inlet,enhance_factor,dilution_factor)=read_cvi_aceena(filename_c[0]) - if date=='20180216a': - time_c=np.insert(time_c,1403,(time_c[1402]+time_c[1403])/2) - cvi_inlet=np.insert(cvi_inlet,1403,cvi_inlet[1403]) - if all(time_c==time)==False: - raise ValueError('time dimension is incosistent') - elif len(filename_c)==0: - time_cvi=time - cvi_inlet=np.nan*np.empty([len(time)]) + flightidx=2 + + # read in IWG data + (iwg,iwgvars)=read_iwg1(filename) + timelen = len(iwg) + if np.logical_and(campaign=='ACEENA', date=='20180216a'): + iwg.insert(1403,list(iwg[1403])) + tstr=iwg[1403][1] + tstr=tstr[0:-1]+str(int(tstr[-1])-1) + iwg[1403][1]=tstr + del iwg[-1] + # get lat, lon, height, time + lon=np.empty(timelen) + lat=np.empty(timelen) + height=np.empty(timelen) + time=np.empty(timelen) + cldflag=np.empty(timelen) + legnum=np.full(timelen,0) + for t in range(timelen): + lat[t]=float(iwg[t][2]) + lon[t]=float(iwg[t][3]) + height[t]=float(iwg[t][4]) + cldflag[t]=int(iwg[t][35]) + legnum[t]=int(iwg[t][-1]) + timestr=iwg[t][1].split(' ') + time[t]=hhmmss2sec(timestr[1]) + datestr=timestr[0] + + # read in CVI + if campaign=='HISCALE': + filename_c=glob.glob(cvipath+'CVI_G1_'+date[0:8]+'*R4_HISCALE_001s.ict.txt') + filename_c.sort() + # read in data + if len(filename_c)==1 or len(filename_c)==2: + (cvi,cvilist)=read_cvi_hiscale(filename_c[flightidx-1]) + time_cvi = cvi[0,:] + cvi_inlet=cvi[-1,:] + if all(time_cvi==time)==False: + raise ValueError('time dimension is incosistent') + elif len(filename_c)==0: + time_cvi=time + cvi_inlet=np.nan*np.empty([len(time)]) + else: + raise ValueError('find too many files: '+filename_c) + + elif campaign=='ACEENA': + filename_c=glob.glob(cvipath+'enaaafinletcviF1.c1.'+date[0:8]+'*.nc') + filename_c.sort() + # read in data + if len(filename_c)==1: + (time_c,lon_c,lat_c,alt_c,timeunit_c,cvimode,cvi_inlet,enhance_factor,dilution_factor)=read_cvi_aceena(filename_c[0]) + if date=='20180216a': + time_c=np.insert(time_c,1403,(time_c[1402]+time_c[1403])/2) + cvi_inlet=np.insert(cvi_inlet,1403,cvi_inlet[1403]) + if all(time_c==time)==False: + raise ValueError('time dimension is incosistent') + elif len(filename_c)==0: + time_cvi=time + cvi_inlet=np.nan*np.empty([len(time)]) + else: + raise ValueError('find too many files: '+filename_c) + # cvi_inlet[cvi_inlet==-9]=1 # if cvi_inlet is unfunctional, use fims as good data + else: - raise ValueError('find too many files: '+filename_c) - # cvi_inlet[cvi_inlet==-9]=1 # if cvi_inlet is unfunctional, use fims as good data + raise ValueError('do not recognize this campaign: '+campaign) - else: - raise ValueError('do not recognize this campaign: '+campaign) - - #%% read in flight data (for CSET and SOCRATES) - elif campaign in ['CSET', 'SOCRATES']: - date=fname[-4] - print('input data for '+date) - (time,height,timeunit,hunit,hlongname,cellsize,cellunit)=read_RF_NCAR(filename,'ALT') - (time,lat,timeunit,latunit,latlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LAT') - (time,lon,timeunit,lonunit,lonlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LON') - (time,lwc,timeunit,lwcunit,lwclongname,cellsize,cellunit)=read_RF_NCAR(filename,'PLWCC') - # lon[lon<0]=lon[lon<0]+360 - # calculate cloud flag based on LWC - cldflag=lwc2cflag(lwc,lwcunit) - if campaign=='SOCRATES': - (time,cvi_inlet,timeunit,cviunit,cvilongname,cellsize,cellunit)=read_RF_NCAR(filename,'CVINLET') - else: - cvi_inlet=np.nan*np.empty([len(time)]) - - - #%% plot flight tracks: - lat[lat<-9000]=np.nan - lon[lon<-9000]=np.nan - height[height<-9000]=np.nan - - # change longitude to [-180, 180] - if lon0>180: - lon0=lon0-360 + #%% read in flight data (for CSET and SOCRATES) + elif campaign in ['CSET', 'SOCRATES']: + date=fname[-4] + print('input data for '+date) + (time,height,timeunit,hunit,hlongname,cellsize,cellunit)=read_RF_NCAR(filename,'ALT') + (time,lat,timeunit,latunit,latlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LAT') + (time,lon,timeunit,lonunit,lonlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LON') + (time,lwc,timeunit,lwcunit,lwclongname,cellsize,cellunit)=read_RF_NCAR(filename,'PLWCC') + # lon[lon<0]=lon[lon<0]+360 + # calculate cloud flag based on LWC + cldflag=lwc2cflag(lwc,lwcunit) + if campaign=='SOCRATES': + (time,cvi_inlet,timeunit,cviunit,cvilongname,cellsize,cellunit)=read_RF_NCAR(filename,'CVINLET') + else: + cvi_inlet=np.nan*np.empty([len(time)]) - try: - # os.environ['PROJ_LIB'] = r'c:\Users\tang357\Anaconda3\pkgs\basemap-1.3.0-py38ha7665c8_0\Library\share' - # from mpl_toolkits.basemap import Basemap - # figname = figpath_aircraft_timeseries + 'flighttrack_'+campaign+'_'+date+'.png' - # print('plot flight track to '+figname) - # fig,ax = plt.subplots(figsize=(8,5)) # figsize in inches - # plt.tight_layout(pad=0.1, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - # if campaign in ['CSET', 'SOCRATES']: - # m = Basemap(llcrnrlon=min(np.floor(min(lon)),np.floor(lon0))-2,llcrnrlat=min(np.floor(min(lat)),np.floor(lat0))-2,\ - # urcrnrlon=max(np.ceil(max(lon)),np.ceil(lon0))+2,urcrnrlat=max(np.ceil(max(lat)),np.ceil(lat0))+2,\ - # resolution='l',rsphere=(6378137.00,6356752.3142),projection='lcc',lat_0=np.min(lat),lon_0=np.min(lon)) #,lat_ts=5.) - # m.drawparallels(np.arange(-90,90,5),labels=[1,0,0,0]) - # m.drawmeridians(np.arange(-180,180,5),labels=[0,0,0,1]) - # m.drawcoastlines() - # m.fillcontinents() - # elif campaign=='HISCALE': - # m = Basemap(llcrnrlon=-99,llcrnrlat=35,urcrnrlon=-95,urcrnrlat=38,\ - # resolution='l',rsphere=(6378137.00,6356752.3142),projection='lcc',lat_0=lat0,lon_0=lon0) #,lat_ts=5.) - # m.drawparallels(np.arange(30,40,1),labels=[1,0,0,0]) - # m.drawmeridians(np.arange(-110,-90,1),labels=[0,0,0,1]) - # m.drawstates() - # x2,y2=m(lon0,lat0) - # m.scatter(x2,y2,s=100,marker='*',color='k') - # elif campaign=='ACEENA': - # m = Basemap(llcrnrlon=-30,llcrnrlat=37,urcrnrlon=-25,urcrnrlat=41,\ - # resolution='l',rsphere=(6378137.00,6356752.3142),projection='lcc',lat_0=lat0,lon_0=lon0) #,lat_ts=5.) - # m.drawparallels(np.arange(30,42,1),labels=[1,0,0,0]) - # m.drawmeridians(np.arange(-30,-20,1),labels=[0,0,0,1]) - # m.drawcoastlines() - # m.fillcontinents() - # x2,y2=m(lon0,lat0) - # m.scatter(x2,y2,s=100,marker='*',color='k') - # x, y = m(lon,lat) - # h=m.scatter(x,y,s=1,c=height,cmap='jet') - # ax.set_title('Flight track '+date,fontsize=15) - # cbar=fig.colorbar(h) - # except: - figname = figpath_aircraft_timeseries + 'flighttrack_'+campaign+'_'+date+'.png' - print('plot flight track to '+figname) - fig,ax = plt.subplots(figsize=(8,5)) # figsize in inches - # plot the location of the campaign site: - ax.plot([lon0,lon0],[lat0-50, lat0+50],':',color=[.8,.8,.8]) - ax.plot([lon0-50, lon0+50],[lat0,lat0],':',color=[.8,.8,.8]) - # plot flight track - h=ax.scatter(lon,lat,s=1,c=height,cmap='jet',vmin=0,vmax=max(height)) #vmin/vmax: color range - ax.set_xlim(min(np.floor(min(lon)),np.floor(lon0)), max(np.ceil(max(lon)),np.ceil(lon0))) - ax.set_ylim(min(np.floor(min(lat)),np.floor(lat0)), max(np.ceil(max(lat)),np.ceil(lat0))) - ax.tick_params(color='k',labelsize=14) - ax.set_xlabel('longitude',fontsize=14) - ax.set_ylabel('latitude',fontsize=14) - ax.set_title('Flight track '+date,fontsize=15) - cbar=fig.colorbar(h) - fig.text(0.81,0.91, 'm MSL') - except: - raise ValueError("cannot make flight track plot") - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - plt.close() - #%% plot flight height and flag/leg timeseries - figname = figpath_aircraft_timeseries + 'flightheight_'+campaign+'_'+date+'.png' - print('plot flight height timeseries to '+figname) - - fig,ax1 = plt.subplots(figsize=(8,2)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - h11=ax1.plot(time/3600,height/1000,color='k',linewidth=1) - if campaign in ['HISCALE', 'ACEENA']: - for ll in range(1,max(legnum)+1): - idx=legnum==ll - ax1.plot(time[idx]/3600,height[idx]/1000,color='b',linewidth=2) - h12=ax1.plot(time/3600,time*0+max(height)*0.00105,color='k',linewidth=.2) - cvi2=0.0*cvi_inlet - cvi2[cvi_inlet==1]=np.nan - cvi2=cvi2+max(height)*0.00105 - h13=ax1.plot(time/3600,cvi2,color='k',linewidth=2) - h14=ax1.vlines(time[cldflag==1]/3600,0,max(height)*0.0011,color='silver',linewidth=0.1) - # ax1.set_xlim(time[0]/3600-0.3, time[-1]/3600+0.3) - ax1.set_ylim(0,max(height)*0.0011) - ax1.set_ylabel('height (km)',fontsize=12) - ax1.set_xlabel('time (hour UTC) '+date,fontsize=12) - ax1.set_title('thin black: flight track. blue: flight legs. gray vertical lines: cloud flag. thick black: CVI mode', fontsize=10) - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - plt.close() + #%% plot flight tracks: + lat[lat<-9000]=np.nan + lon[lon<-9000]=np.nan + height[height<-9000]=np.nan + + # change longitude to [-180, 180] + if lon0>180: + lon0=lon0-360 + + try: + # os.environ['PROJ_LIB'] = r'c:\Users\tang357\Anaconda3\pkgs\basemap-1.3.0-py38ha7665c8_0\Library\share' + # from mpl_toolkits.basemap import Basemap + # figname = figpath_aircraft_timeseries + 'flighttrack_'+campaign+'_'+date+'.png' + # print('plot flight track to '+figname) + # fig,ax = plt.subplots(figsize=(8,5)) # figsize in inches + # plt.tight_layout(pad=0.1, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + # if campaign in ['CSET', 'SOCRATES']: + # m = Basemap(llcrnrlon=min(np.floor(min(lon)),np.floor(lon0))-2,llcrnrlat=min(np.floor(min(lat)),np.floor(lat0))-2,\ + # urcrnrlon=max(np.ceil(max(lon)),np.ceil(lon0))+2,urcrnrlat=max(np.ceil(max(lat)),np.ceil(lat0))+2,\ + # resolution='l',rsphere=(6378137.00,6356752.3142),projection='lcc',lat_0=np.min(lat),lon_0=np.min(lon)) #,lat_ts=5.) + # m.drawparallels(np.arange(-90,90,5),labels=[1,0,0,0]) + # m.drawmeridians(np.arange(-180,180,5),labels=[0,0,0,1]) + # m.drawcoastlines() + # m.fillcontinents() + # elif campaign=='HISCALE': + # m = Basemap(llcrnrlon=-99,llcrnrlat=35,urcrnrlon=-95,urcrnrlat=38,\ + # resolution='l',rsphere=(6378137.00,6356752.3142),projection='lcc',lat_0=lat0,lon_0=lon0) #,lat_ts=5.) + # m.drawparallels(np.arange(30,40,1),labels=[1,0,0,0]) + # m.drawmeridians(np.arange(-110,-90,1),labels=[0,0,0,1]) + # m.drawstates() + # x2,y2=m(lon0,lat0) + # m.scatter(x2,y2,s=100,marker='*',color='k') + # elif campaign=='ACEENA': + # m = Basemap(llcrnrlon=-30,llcrnrlat=37,urcrnrlon=-25,urcrnrlat=41,\ + # resolution='l',rsphere=(6378137.00,6356752.3142),projection='lcc',lat_0=lat0,lon_0=lon0) #,lat_ts=5.) + # m.drawparallels(np.arange(30,42,1),labels=[1,0,0,0]) + # m.drawmeridians(np.arange(-30,-20,1),labels=[0,0,0,1]) + # m.drawcoastlines() + # m.fillcontinents() + # x2,y2=m(lon0,lat0) + # m.scatter(x2,y2,s=100,marker='*',color='k') + # x, y = m(lon,lat) + # h=m.scatter(x,y,s=1,c=height,cmap='jet') + # ax.set_title('Flight track '+date,fontsize=15) + # cbar=fig.colorbar(h) + # except: + figname = figpath_aircraft_timeseries + 'flighttrack_'+campaign+'_'+date+'.png' + print('plot flight track to '+figname) + fig,ax = plt.subplots(figsize=(8,5)) # figsize in inches + # plot the location of the campaign site: + ax.plot([lon0,lon0],[lat0-50, lat0+50],':',color=[.8,.8,.8]) + ax.plot([lon0-50, lon0+50],[lat0,lat0],':',color=[.8,.8,.8]) + # plot flight track + h=ax.scatter(lon,lat,s=1,c=height,cmap='jet',vmin=0,vmax=max(height)) #vmin/vmax: color range + ax.set_xlim(min(np.floor(min(lon)),np.floor(lon0)), max(np.ceil(max(lon)),np.ceil(lon0))) + ax.set_ylim(min(np.floor(min(lat)),np.floor(lat0)), max(np.ceil(max(lat)),np.ceil(lat0))) + ax.tick_params(color='k',labelsize=14) + ax.set_xlabel('longitude',fontsize=14) + ax.set_ylabel('latitude',fontsize=14) + ax.set_title('Flight track '+date,fontsize=15) + cbar=fig.colorbar(h) + fig.text(0.81,0.91, 'm MSL') + except: + raise ValueError("cannot make flight track plot") + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + plt.close() + + #%% plot flight height and flag/leg timeseries + figname = figpath_aircraft_timeseries + 'flightheight_'+campaign+'_'+date+'.png' + print('plot flight height timeseries to '+figname) + + fig,ax1 = plt.subplots(figsize=(8,2)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + h11=ax1.plot(time/3600,height/1000,color='k',linewidth=1) + if campaign in ['HISCALE', 'ACEENA']: + for ll in range(1,max(legnum)+1): + idx=legnum==ll + ax1.plot(time[idx]/3600,height[idx]/1000,color='b',linewidth=2) + h12=ax1.plot(time/3600,time*0+max(height)*0.00105,color='k',linewidth=.2) + cvi2=0.0*cvi_inlet + cvi2[cvi_inlet==1]=np.nan + cvi2=cvi2+max(height)*0.00105 + h13=ax1.plot(time/3600,cvi2,color='k',linewidth=2) + h14=ax1.vlines(time[cldflag==1]/3600,0,max(height)*0.0011,color='silver',linewidth=0.1) + # ax1.set_xlim(time[0]/3600-0.3, time[-1]/3600+0.3) + ax1.set_ylim(0,max(height)*0.0011) + ax1.set_ylabel('height (km)',fontsize=12) + ax1.set_xlabel('time (hour UTC) '+date,fontsize=12) + ax1.set_title('thin black: flight track. blue: flight legs. gray vertical lines: cloud flag. thick black: CVI mode', fontsize=10) + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + plt.close() \ No newline at end of file diff --git a/src/esmac_diags/subroutines/read_aircraft.py b/src/esmac_diags/subroutines/read_aircraft.py index da1cdd0..170437d 100644 --- a/src/esmac_diags/subroutines/read_aircraft.py +++ b/src/esmac_diags/subroutines/read_aircraft.py @@ -11,7 +11,8 @@ def read_ams(filename): Parameters ---------- - filename : input filename + filename : str + input filename Returns ------- diff --git a/tests/test_package_imports.py b/tests/test_package_imports.py index 7d55e8c..92981a5 100644 --- a/tests/test_package_imports.py +++ b/tests/test_package_imports.py @@ -3,3 +3,5 @@ def test_package_imports(): """ Test whether the package imports""" import esmac_diags + + From 65c2f8ff5a60d5bc4b48af0d1b505387cf27d779 Mon Sep 17 00:00:00 2001 From: Shuaiqi Tang Date: Tue, 9 Nov 2021 09:03:10 -0800 Subject: [PATCH 11/14] update the test case to make it work --- scripts/run_testcase.py | 5 ++-- .../plotting/plot_flight_track_height.py | 26 +++++++++---------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/scripts/run_testcase.py b/scripts/run_testcase.py index fa9357c..ccb64cb 100644 --- a/scripts/run_testcase.py +++ b/scripts/run_testcase.py @@ -24,7 +24,7 @@ # path of the diagnostic package -package_path = '../../' +package_path = '/global/homes/s/sqtang/EAGLES/ESMAC_diags/' # # path of E3SM model data (h3) for preprocessing. list with the same length of Model_List # settings['E3SM_h3_path']=[] @@ -88,7 +88,6 @@ # Long list of blah.run_plot() ### Create our actual plots -plot_flight_pdf_AerosolSize.run_plot(settings) plot_flight_track_height.run_plot(settings) - +#plot_flight_timeseries_AerosolComposition.run_plot(settings) diff --git a/src/esmac_diags/plotting/plot_flight_track_height.py b/src/esmac_diags/plotting/plot_flight_track_height.py index 2362fe1..e91f610 100644 --- a/src/esmac_diags/plotting/plot_flight_track_height.py +++ b/src/esmac_diags/plotting/plot_flight_track_height.py @@ -17,25 +17,25 @@ #%% settings -def run_plot(): - from settings import campaign, lat0, lon0, figpath_aircraft_timeseries +def run_plot(settings): + #from settings import campaign, lat0, lon0, figpath_aircraft_timeseries - if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, iwgpath, cvipath - elif campaign in ['CSET', 'SOCRATES']: - from settings import RFpath - else: - raise ValueError('campaign name is not recognized: '+campaign) + #if campaign in ['HISCALE', 'ACEENA']: + # from settings import IOP, iwgpath, cvipath + #elif campaign in ['CSET', 'SOCRATES']: + # from settings import RFpath + #else: + # raise ValueError('campaign name is not recognized: '+campaign) campaign = settings['campaign'] lat0 = settings['lat0'] lon0 = settings['lon0'] figpath_aircraft_timeseries = settings['figpath_aircraft_timeseries'] - IOP = settings['IOP'] - iwgpath = settings['iwgpath'] - cvipath = settings['cvipath'] - RFpath = settings['RFpath'] + IOP = settings.get('IOP', None) + iwgpath = settings.get('iwgpath', None) + cvipath = settings.get('cvipath', None) + RFpath = settings.get('RFpath', None) @@ -258,4 +258,4 @@ def run_plot(): ax1.set_title('thin black: flight track. blue: flight legs. gray vertical lines: cloud flag. thick black: CVI mode', fontsize=10) fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) plt.close() - \ No newline at end of file + From 288b9b4796d9aed6dd9285f393af20be11a71e5e Mon Sep 17 00:00:00 2001 From: Shuaiqi Tang Date: Tue, 9 Nov 2021 09:49:17 -0800 Subject: [PATCH 12/14] update the testcase. now both plot_flight_track_height and plot_flight_timeseries_AerosolComposition should work --- scripts/run_testcase.py | 71 +--- ...ot_flight_timeseries_AerosolComposition.py | 392 +++++++++--------- .../plotting/plot_flight_track_height.py | 4 +- 3 files changed, 225 insertions(+), 242 deletions(-) diff --git a/scripts/run_testcase.py b/scripts/run_testcase.py index ccb64cb..03b25df 100644 --- a/scripts/run_testcase.py +++ b/scripts/run_testcase.py @@ -1,57 +1,37 @@ -# settings of the aerosol diagnostic package +""" +script to run a test case +compare the figures generated at testcase/figures/ with testcase/figures_verify +to makesure testcase works as expected +""" -from matplotlib.pyplot import plot -import numpy as np -import esmac_diags +from esmac_diags.plotting import plot_flight_timeseries_AerosolComposition, plot_flight_track_height -from esmac_diags.plotting import plot_flight_pdf_AerosolSize, plot_flight_track_height - -settings = {} #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -# global settings -############ these settings will be replaced by the settings in scripts_*.csh ############# -# set field campaign name. More settings on specific field campaigns are in next section +# user-specified settings +settings = {} + +# Please change the path of the diagnostic package to your own +package_path = '/global/homes/s/sqtang/EAGLES/ESMAC_diags/' + +# set field campaign name. use ACEENA for the test case settings['campaign'] = 'ACEENA' -# set model names. up to three +# set model names. settings['Model_List'] = ['E3SMv1'] # set line colors for each model. corresponding to the Model_List settings['color_model'] = ['r','b','g'] -# set IOP that the statistics, pdf and percentiles are averaged for. Only available for HISCALE and ACEENA +# set field campaign IOPs. Only used for HISCALE and ACEENA. # IOP1/IOP2 settings['IOP'] = 'IOP1' -############ these settings will be replaced by the settings in scripts_*.csh ############# -# path of the diagnostic package -package_path = '/global/homes/s/sqtang/EAGLES/ESMAC_diags/' - -# # path of E3SM model data (h3) for preprocessing. list with the same length of Model_List -# settings['E3SM_h3_path']=[] -# settings['E3SM_h3_filehead']=[] # filename before .cam.h3.yyyy-mm-dd.00000.nc -# for mm in settings['Model_List']: -# E3SM_h3_path.append('/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_h3/') -# if campaign=='MAGIC': -# E3SM_h3_filehead.append(mm+'_2012-2013') -# else: -# # E3SM_h3_filehead.append(mm+'_2014-2018') -# E3SM_h3_filehead.append(mm) -# #E3SM_h3_path.append('/qfs/projects/eagles/zhan524/simulations/compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm+'/h3/') -# #E3SM_h3_filehead.append('compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm) - # path of output figures settings['figpath_aircraft_timeseries'] = package_path+'testcase/figures/' settings['figpath_aircraft_statistics'] = package_path+'testcase/figures/' -settings['figpath_ship_timeseries'] = package_path+'testcase/figures/' -settings['figpath_ship_statistics'] = package_path+'testcase/figures/' -settings['figpath_sfc_timeseries'] = package_path+'testcase/figures/' -settings['figpath_sfc_statistics'] = package_path+'testcase/figures/' -settings['figpath_profile_timeseries'] = package_path+'testcase/figures/' -settings['RFpath']=package_path+'data/'+settings['campaign']+'/obs/aircraft/aircraft_lowrate/' #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -# settings for different field campaigns +# other settings for different field campaigns # set location and time information if settings['campaign']=='ACEENA': @@ -59,19 +39,8 @@ # lat/lon for ENA settings['lat0'] = 39.09527 settings['lon0'] = 360-28.0339 - # bin of flight heights to calculate percentiles - settings['height_bin'] = np.arange(100,4300,300) - - # time periods for IOPs. needed in preprocessing of surface data - if settings['IOP']=='IOP1': - settings['start_date']='2017-06-30' - settings['end_date']='2017-06-31' - elif settings['IOP']=='IOP2': - settings['start_date']='2018-01-21' - settings['end_date']='2018-02-19' # observational data path. - # aircraf measurements merged_bin data are used for all plot_flight_*.py to provide flight/cloud/CVI info settings['merged_size_path']=package_path+'testcase/data/obs/' settings['iwgpath'] = package_path+'testcase/data/obs/' settings['cvipath'] = package_path+'testcase/data/obs/' @@ -80,14 +49,14 @@ # model path # pre-processed model path settings['E3SM_aircraft_path'] = package_path+'testcase/data/model/' - - + else: - raise ValueError("Test case should only for ACEENA. Current campaign is: "+campaign) + raise ValueError("Test case should only for ACEENA. Current campaign is: "+settings['campaign']) +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # Long list of blah.run_plot() ### Create our actual plots plot_flight_track_height.run_plot(settings) -#plot_flight_timeseries_AerosolComposition.run_plot(settings) +plot_flight_timeseries_AerosolComposition.run_plot(settings) diff --git a/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py b/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py index 155ce06..9d12fe7 100644 --- a/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py +++ b/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py @@ -4,8 +4,6 @@ # compare models and aircraft measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -15,195 +13,213 @@ from ..subroutines.read_netcdf import read_merged_size,read_extractflight from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg -#%% settings - -from settings import campaign, Model_List, color_model, \ - E3SM_aircraft_path, figpath_aircraft_timeseries -if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, merged_size_path, amspath, iwgpath -elif campaign in ['CSET', 'SOCRATES']: - raise ValueError('CSET and SOCRATES do not have composition data') -else: - raise ValueError('campaign name is not recognized: '+campaign) - -if not os.path.exists(figpath_aircraft_timeseries): - os.makedirs(figpath_aircraft_timeseries) - -#%% find files for flight information -lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') -lst.sort() -if len(lst)==0: - raise ValueError('cannot find any file') -# choose files for specific IOP -if campaign=='HISCALE': - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() -elif campaign=='ACEENA': - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() - -alldates = [x.split('_')[-1].split('.')[0] for x in lst] - -# for each flight -for date in alldates: - - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 +def run_plot(settings): + #%% settings + + # from settings import campaign, Model_List, color_model, \ + # E3SM_aircraft_path, figpath_aircraft_timeseries + + # if campaign in ['HISCALE', 'ACEENA']: + # from settings import IOP, merged_size_path, amspath, iwgpath + # elif campaign in ['CSET', 'SOCRATES']: + # raise ValueError('CSET and SOCRATES do not have composition data') + # else: + # raise ValueError('campaign name is not recognized: '+campaign) + + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_timeseries = settings['figpath_aircraft_timeseries'] - #% read in flight information + IOP = settings.get('IOP', None) + merged_size_path = settings.get('merged_size_path', None) + amspath = settings.get('amspath', None) + iwgpath = settings.get('iwgpath', None) + + if campaign in ['CSET', 'SOCRATES']: + raise ValueError('CSET and SOCRATES do not have composition data') + elif campaign not in ['HISCALE', 'ACEENA']: + raise ValueError('campaign name is not recognized: '+campaign) + + if not os.path.exists(figpath_aircraft_timeseries): + os.makedirs(figpath_aircraft_timeseries) + + #%% find files for flight information + lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') + lst.sort() + if len(lst)==0: + raise ValueError('cannot find any file') + # choose files for specific IOP if campaign=='HISCALE': - filename = merged_size_path+'merged_bin_fims_pcasp_'+campaign+'_'+date+'.nc' + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() elif campaign=='ACEENA': - filename = merged_size_path+'merged_bin_fims_pcasp_opc_'+campaign+'_'+date+'.nc' - (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') - (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') - (time,size,height,timeunit,zunit,long_name)=read_merged_size(filename,'height') - time=np.ma.compressed(time) - - #%% read T and P from iwg - filename_i=glob.glob(iwgpath+'aaf.iwg*.'+date+'*txt') - filename_i.sort() - # read in data - if len(filename_i)==1: - (iwg,iwgvars)=read_iwg1(filename_i[0]) - timelen = len(iwg) - if np.logical_and(campaign=='ACEENA', date=='20180216a'): - iwg.insert(1403,list(iwg[1403])) - tstr=iwg[1403][1] - tstr=tstr[0:-1]+str(int(tstr[-1])-1) - iwg[1403][1]=tstr - del iwg[-1] - # get variables - time_iwg=np.empty(timelen) - T_iwg=np.empty(timelen) - P_iwg=np.empty(timelen) - for t in range(timelen): - T_iwg[t]=float(iwg[t][20])+273.15 - P_iwg[t]=float(iwg[t][23])*100 - timestr=iwg[t][1].split(' ') - time_iwg[t]=hhmmss2sec(timestr[1]) - else: - raise ValueError('find no file or multiple files: ' + filename_i) - - #%% read aerosol composition in AMS - - filename_ams=glob.glob(amspath+'*'+date[0:8]+'*') - filename_ams.sort() - - if len(filename_ams)==1 or len(filename_ams)==2: - (ams,amslist)=read_ams(filename_ams[flightidx-1]) - time_ams=ams[0,:] - flag=ams[-1,:] - orgaaf=ams[1,:] - so4aaf=ams[5,:] - # flag=1 is also good data but behind CVI inlet. currently only use good data behind isokinetic inlet (flag=0) - orgaaf=qc_mask_qcflag(orgaaf,flag) - so4aaf=qc_mask_qcflag(so4aaf,flag) - elif len(filename_ams)==0: - time_ams = time_iwg - orgaaf = np.full(len(time_ams),np.nan) - so4aaf = np.full(len(time_ams),np.nan) - else: - raise ValueError('find too many files') - - # change values from standardize condition to ambient condition - T_ams = np.interp(time_ams,time,T_iwg) - P_ams = np.interp(time_ams,time,P_iwg) - so4aaf = so4aaf * (296.15/T_ams) * (P_ams/101325.) - orgaaf = orgaaf * (296.15/T_ams) * (P_ams/101325.) - - # some quality check: - orgaaf=qc_remove_neg(orgaaf) - so4aaf=qc_remove_neg(so4aaf) - - - #%% read in Models - nmodels=len(Model_List) - so4_m = [] - org_m = [] - for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - - (timem,heightm,soa_a1,timeunitm,soaunit,soaname)=read_extractflight(filename_m,'soa_a1') - (timem,heightm,soa_a2,timeunitm,soaunit,soaname)=read_extractflight(filename_m,'soa_a2') - (timem,heightm,soa_a3,timeunitm,soaunit,soaname)=read_extractflight(filename_m,'soa_a3') - (timem,heightm,so4_a1,timeunitm,so4unit,so4name)=read_extractflight(filename_m,'so4_a1') - (timem,heightm,so4_a2,timeunitm,so4unit,so4name)=read_extractflight(filename_m,'so4_a2') - (timem,heightm,so4_a3,timeunitm,so4unit,so4name)=read_extractflight(filename_m,'so4_a3') - (timem,heightm,pom_a1,timeunitm,pomunit,pomname)=read_extractflight(filename_m,'pom_a1') - (timem,heightm,pom_a3,timeunitm,pomunit,pomname)=read_extractflight(filename_m,'pom_a3') - (timem,heightm,pom_a4,timeunitm,pomunit,pomname)=read_extractflight(filename_m,'pom_a4') - (timem,heightm,mom_a1,timeunitm,momunit,momname)=read_extractflight(filename_m,'mom_a1') - (timem,heightm,mom_a2,timeunitm,momunit,momname)=read_extractflight(filename_m,'mom_a2') - (timem,heightm,mom_a3,timeunitm,momunit,momname)=read_extractflight(filename_m,'mom_a3') - (timem,heightm,mom_a4,timeunitm,momunit,momname)=read_extractflight(filename_m,'mom_a4') - - # add nucleation mode if available - try: - (timem,heightm,soa_a5,timeunitm,soaunit,soaname)=read_extractflight(filename_m,'soa_a5') - model_org = soa_a1+soa_a2+soa_a3+soa_a5 + pom_a1+pom_a3+pom_a4 + mom_a1+mom_a2+mom_a3+mom_a4 - except: - model_org = soa_a1+soa_a2+soa_a3 + pom_a1+pom_a3+pom_a4 + mom_a1+mom_a2+mom_a3+mom_a4 - try: - (timem,heightm,so4_a5,timeunitm,so4unit,so4name)=read_extractflight(filename_m,'so4_a5') - model_so4 = so4_a1+so4_a2+so4_a3+so4_a5 - except: - model_so4 = so4_a1+so4_a2+so4_a3 - - # change E3SM unit from kg/kg to ug/m3 - rho = P_iwg/T_iwg/287.06 - model_so4=model_so4*1e9*rho - model_org=model_org*1e9*rho - - so4_m.append(model_so4) - org_m.append(model_org) - - timem2 = timem/3600 - - #%% make plot + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + + alldates = [x.split('_')[-1].split('.')[0] for x in lst] - figname = figpath_aircraft_timeseries+'AerosolComposition_'+campaign+'_'+date+'.png' - print('plotting figures to '+figname) - - fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=2.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.plot(time_ams/3600,so4aaf,color='k',linewidth=1,label='OBS') - for mm in range(nmodels): - ax1.plot(timem2, so4_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - # ax1.set_yscale('log') - ax1.tick_params(color='k',labelsize=12) - ylim1 = ax1.get_ylim() - - ax2.plot(time_ams/3600,orgaaf,color='k',linewidth=1,label='OBS') - for mm in range(nmodels): - ax2.plot(timem2, org_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - # ax2.set_yscale('log') - ax2.tick_params(color='k',labelsize=12) - ylim2 = ax2.get_ylim() - - ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) - ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) - - ax2.set_xlabel('time (hour UTC) '+date,fontsize=14) - - ax1.set_title('Aerosol Sulfate Concentration ($\mu$g/m$^3$)',fontsize=13) - ax2.set_title('Aerosol Organic Concentration ($\mu$g/m$^3$)',fontsize=13) + # for each flight + for date in alldates: + + if date[-1]=='a': + flightidx=1 + else: + flightidx=2 + + #% read in flight information + if campaign=='HISCALE': + filename = merged_size_path+'merged_bin_fims_pcasp_'+campaign+'_'+date+'.nc' + elif campaign=='ACEENA': + filename = merged_size_path+'merged_bin_fims_pcasp_opc_'+campaign+'_'+date+'.nc' + (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') + (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') + (time,size,height,timeunit,zunit,long_name)=read_merged_size(filename,'height') + time=np.ma.compressed(time) + + #%% read T and P from iwg + filename_i=glob.glob(iwgpath+'aaf.iwg*.'+date+'*txt') + filename_i.sort() + # read in data + if len(filename_i)==1: + (iwg,iwgvars)=read_iwg1(filename_i[0]) + timelen = len(iwg) + if np.logical_and(campaign=='ACEENA', date=='20180216a'): + iwg.insert(1403,list(iwg[1403])) + tstr=iwg[1403][1] + tstr=tstr[0:-1]+str(int(tstr[-1])-1) + iwg[1403][1]=tstr + del iwg[-1] + # get variables + time_iwg=np.empty(timelen) + T_iwg=np.empty(timelen) + P_iwg=np.empty(timelen) + for t in range(timelen): + T_iwg[t]=float(iwg[t][20])+273.15 + P_iwg[t]=float(iwg[t][23])*100 + timestr=iwg[t][1].split(' ') + time_iwg[t]=hhmmss2sec(timestr[1]) + else: + raise ValueError('find no file or multiple files: ' + filename_i) + + #%% read aerosol composition in AMS + + filename_ams=glob.glob(amspath+'*'+date[0:8]+'*') + filename_ams.sort() + + if len(filename_ams)==1 or len(filename_ams)==2: + (ams,amslist)=read_ams(filename_ams[flightidx-1]) + time_ams=ams[0,:] + flag=ams[-1,:] + orgaaf=ams[1,:] + so4aaf=ams[5,:] + # flag=1 is also good data but behind CVI inlet. currently only use good data behind isokinetic inlet (flag=0) + orgaaf=qc_mask_qcflag(orgaaf,flag) + so4aaf=qc_mask_qcflag(so4aaf,flag) + elif len(filename_ams)==0: + time_ams = time_iwg + orgaaf = np.full(len(time_ams),np.nan) + so4aaf = np.full(len(time_ams),np.nan) + else: + raise ValueError('find too many files') + + # change values from standardize condition to ambient condition + T_ams = np.interp(time_ams,time,T_iwg) + P_ams = np.interp(time_ams,time,P_iwg) + so4aaf = so4aaf * (296.15/T_ams) * (P_ams/101325.) + orgaaf = orgaaf * (296.15/T_ams) * (P_ams/101325.) + + # some quality check: + orgaaf=qc_remove_neg(orgaaf) + so4aaf=qc_remove_neg(so4aaf) + + + #%% read in Models + nmodels=len(Model_List) + so4_m = [] + org_m = [] + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + + (timem,heightm,soa_a1,timeunitm,soaunit,soaname)=read_extractflight(filename_m,'soa_a1') + (timem,heightm,soa_a2,timeunitm,soaunit,soaname)=read_extractflight(filename_m,'soa_a2') + (timem,heightm,soa_a3,timeunitm,soaunit,soaname)=read_extractflight(filename_m,'soa_a3') + (timem,heightm,so4_a1,timeunitm,so4unit,so4name)=read_extractflight(filename_m,'so4_a1') + (timem,heightm,so4_a2,timeunitm,so4unit,so4name)=read_extractflight(filename_m,'so4_a2') + (timem,heightm,so4_a3,timeunitm,so4unit,so4name)=read_extractflight(filename_m,'so4_a3') + (timem,heightm,pom_a1,timeunitm,pomunit,pomname)=read_extractflight(filename_m,'pom_a1') + (timem,heightm,pom_a3,timeunitm,pomunit,pomname)=read_extractflight(filename_m,'pom_a3') + (timem,heightm,pom_a4,timeunitm,pomunit,pomname)=read_extractflight(filename_m,'pom_a4') + (timem,heightm,mom_a1,timeunitm,momunit,momname)=read_extractflight(filename_m,'mom_a1') + (timem,heightm,mom_a2,timeunitm,momunit,momname)=read_extractflight(filename_m,'mom_a2') + (timem,heightm,mom_a3,timeunitm,momunit,momname)=read_extractflight(filename_m,'mom_a3') + (timem,heightm,mom_a4,timeunitm,momunit,momname)=read_extractflight(filename_m,'mom_a4') + + # add nucleation mode if available + try: + (timem,heightm,soa_a5,timeunitm,soaunit,soaname)=read_extractflight(filename_m,'soa_a5') + model_org = soa_a1+soa_a2+soa_a3+soa_a5 + pom_a1+pom_a3+pom_a4 + mom_a1+mom_a2+mom_a3+mom_a4 + except: + model_org = soa_a1+soa_a2+soa_a3 + pom_a1+pom_a3+pom_a4 + mom_a1+mom_a2+mom_a3+mom_a4 + try: + (timem,heightm,so4_a5,timeunitm,so4unit,so4name)=read_extractflight(filename_m,'so4_a5') + model_so4 = so4_a1+so4_a2+so4_a3+so4_a5 + except: + model_so4 = so4_a1+so4_a2+so4_a3 + + # change E3SM unit from kg/kg to ug/m3 + rho = P_iwg/T_iwg/287.06 + model_so4=model_so4*1e9*rho + model_org=model_org*1e9*rho + + so4_m.append(model_so4) + org_m.append(model_org) + + timem2 = timem/3600 + + #%% make plot + + figname = figpath_aircraft_timeseries+'AerosolComposition_'+campaign+'_'+date+'.png' + print('plotting figures to '+figname) + + fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=2.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.plot(time_ams/3600,so4aaf,color='k',linewidth=1,label='OBS') + for mm in range(nmodels): + ax1.plot(timem2, so4_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax1.set_yscale('log') + ax1.tick_params(color='k',labelsize=12) + ylim1 = ax1.get_ylim() + + ax2.plot(time_ams/3600,orgaaf,color='k',linewidth=1,label='OBS') + for mm in range(nmodels): + ax2.plot(timem2, org_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax2.set_yscale('log') + ax2.tick_params(color='k',labelsize=12) + ylim2 = ax2.get_ylim() + + ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + + ax2.set_xlabel('time (hour UTC) '+date,fontsize=14) - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - plt.close() \ No newline at end of file + ax1.set_title('Aerosol Sulfate Concentration ($\mu$g/m$^3$)',fontsize=13) + ax2.set_title('Aerosol Organic Concentration ($\mu$g/m$^3$)',fontsize=13) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + plt.close() \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_flight_track_height.py b/src/esmac_diags/plotting/plot_flight_track_height.py index e91f610..2af3632 100644 --- a/src/esmac_diags/plotting/plot_flight_track_height.py +++ b/src/esmac_diags/plotting/plot_flight_track_height.py @@ -4,8 +4,6 @@ # plot 2: plot timeseries of flight height with cloud and CVI flags """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -16,8 +14,8 @@ from ..subroutines.read_aircraft import read_iwg1, read_cvi_hiscale, read_RF_NCAR -#%% settings def run_plot(settings): + #%% settings #from settings import campaign, lat0, lon0, figpath_aircraft_timeseries #if campaign in ['HISCALE', 'ACEENA']: From 628214b76cee700fd155db88d549a654c32634d6 Mon Sep 17 00:00:00 2001 From: Shuaiqi Tang Date: Wed, 10 Nov 2021 19:42:21 -0800 Subject: [PATCH 13/14] clean up the running script and make sure all code are running correctly update README file --- README_ESMAC_Diags_v1.0-alpha.pdf | Bin 2442478 -> 1604127 bytes data | 1 - environment.yml | 3 +- figures | 1 - requirements.txt | 3 +- scripts/run_plot.py | 220 ++++ scripts/run_plot_all.py | 329 +++++ scripts/run_preprocess.py | 161 +++ scripts/run_preprocess_all.py | 224 ++++ scripts/scripts_jobsubmit.csh | 16 + scripts/scripts_plotting.csh | 213 ---- scripts/scripts_plotting_jobsubmit.csh | 220 ---- scripts/scripts_preprocess.csh | 111 -- scripts/scripts_testcase.csh | 75 -- scripts/settings.py | 235 ---- scripts/settings_testcase.py | 83 -- src/esmac_diags/plotting/__init__.py | 4 + .../plotting/calc_statistic_flight_CN.py | 872 ++++++------- .../plotting/calc_statistic_sfc_CN.py | 995 +++++++-------- .../plotting/calc_statistic_ship_CN.py | 703 +++++----- .../contour_flight_timeseries_AerosolSize.py | 312 +++-- .../contour_sfc_diurnalcycle_AerosolSize.py | 399 +++--- .../contour_sfc_timeseries_AerosolSize.py | 360 +++--- .../contour_ship_timeseries_AerosolSize.py | 279 ++-- .../plotting/plot_flight_pdf_AerosolSize.py | 17 +- ...ght_pdf_percentile_SeparateCloud_aceena.py | 765 +++++------ ...ght_pdf_percentile_SeparatePBLH_hiscale.py | 682 +++++----- .../plot_flight_percentile_lat_CCN.py | 773 +++++------ .../plotting/plot_flight_percentile_lat_CN.py | 1135 +++++++++-------- .../plot_flight_percentile_lat_cldfreq.py | 272 ++-- ..._flight_percentile_z_AerosolComposition.py | 561 ++++---- .../plotting/plot_flight_percentile_z_CCN.py | 649 +++++----- .../plotting/plot_flight_percentile_z_CN.py | 582 ++++----- .../plotting/plot_flight_profile_z_CldFreq.py | 303 ++--- .../plotting/plot_flight_profile_z_LWC.py | 330 ++--- ...ot_flight_timeseries_AerosolComposition.py | 21 +- .../plotting/plot_flight_timeseries_CCN.py | 373 +++--- .../plotting/plot_flight_timeseries_CN.py | 299 ++--- .../plotting/plot_flight_track_height.py | 13 +- .../plotting/plot_profile_cloud.py | 198 +-- ...lot_sfc_diurnalcycle_AerosolComposition.py | 342 ++--- .../plotting/plot_sfc_diurnalcycle_CCN.py | 342 ++--- .../plotting/plot_sfc_diurnalcycle_CN.py | 353 ++--- .../plotting/plot_sfc_pdf_AerosolSize.py | 364 +++--- .../plot_sfc_pie_AerosolComposition.py | 305 ++--- .../plot_sfc_timeseries_AerosolComposition.py | 240 ++-- .../plotting/plot_sfc_timeseries_CCN.py | 278 ++-- .../plotting/plot_sfc_timeseries_CN.py | 283 ++-- .../plotting/plot_ship_latitude_rainLWP.py | 422 +++--- .../plotting/plot_ship_pdf_AerosolSize.py | 275 ++-- .../plotting/plot_ship_percentile_lat_CCN.py | 390 +++--- .../plotting/plot_ship_percentile_lat_CN.py | 438 +++---- .../plotting/plot_ship_percentile_lat_LWP.py | 316 ++--- .../plotting/plot_ship_percentile_lat_met.py | 516 ++++---- .../plotting/plot_ship_timeseries_CCN.py | 270 ++-- .../plotting/plot_ship_timeseries_CN.py | 314 ++--- .../plotting/plot_ship_timeseries_met.py | 359 +++--- src/esmac_diags/plotting/settings.py | 80 -- src/esmac_diags/preprocessing/__init__.py | 4 + .../extract_E3SM_AOD_globalmean.py | 76 -- .../extract_E3SM_AOD_regionmean.py | 117 -- .../prep_E3SM_flighttrack_allvars.py | 356 +++--- .../prep_E3SM_flighttrack_bins.py | 398 +++--- .../prep_E3SM_profile_allvars.py | 226 ++-- .../preprocessing/prep_E3SM_sfc_allvars.py | 233 ++-- .../preprocessing/prep_E3SM_sfc_bins.py | 249 ++-- .../prep_E3SM_shiptrack_allvars.py | 402 +++--- .../preprocessing/prep_E3SM_shiptrack_bins.py | 460 +++---- .../prep_E3SM_shiptrack_profiles.py | 392 +++--- .../prep_obs_mergesize_ACEENA.py | 964 +++++++------- .../prep_obs_mergesize_HISCALE.py | 709 +++++----- .../prep_obs_mergesize_HiScale.py | 391 ------ src/esmac_diags/preprocessing/settings.py | 236 ---- .../subroutines/specific_data_treatment.py | 13 +- 74 files changed, 11627 insertions(+), 12278 deletions(-) delete mode 120000 data delete mode 120000 figures create mode 100644 scripts/run_plot.py create mode 100644 scripts/run_plot_all.py create mode 100644 scripts/run_preprocess.py create mode 100644 scripts/run_preprocess_all.py create mode 100644 scripts/scripts_jobsubmit.csh delete mode 100755 scripts/scripts_plotting.csh delete mode 100755 scripts/scripts_plotting_jobsubmit.csh delete mode 100755 scripts/scripts_preprocess.csh delete mode 100755 scripts/scripts_testcase.csh delete mode 100644 scripts/settings.py delete mode 100644 scripts/settings_testcase.py delete mode 100644 src/esmac_diags/plotting/settings.py delete mode 100644 src/esmac_diags/preprocessing/extract_E3SM_AOD_globalmean.py delete mode 100644 src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py delete mode 100644 src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py delete mode 100644 src/esmac_diags/preprocessing/settings.py diff --git a/README_ESMAC_Diags_v1.0-alpha.pdf b/README_ESMAC_Diags_v1.0-alpha.pdf index 1a09fb0053c102ed669b0f539dc5e110eaa760f5..17735c0e2e04d1cf43a3e28d0efc43d259c05e9f 100644 GIT binary patch delta 445147 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 z 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 delta 1289606 zcmce8byQVd_pY>bcXvyifI~M(BM6exASECmeFT(7kRu@74bmVfprmw3hag>2q6l2{ z?Du=U-*1e2?_bx!V8xzmK6A}ApE=jwI?Oz=*pEm+siZ&iqC!?+7z_%vvZyJ=7^FZEsqvvB z!G<$|gg{J!O!sbDFwjDP77DZ?Kr0HgFk~w%2(&^#D-5)NK4CzgFrZHu&?o#ypQ(U0 z(~TlTJi7>77^zu^2_%fvEzAT00oreRNd4fO9ufg^(?eoFZ+b`+k((Y8NA#wLM1tM) zkhTj6-gE(w8x#-{Md$_wd;M&!_Qk0bt4 z``e$t&6SW4P&0LiV8y8Us6aCpb9t#yBMGzOECoGKs3lSk+3R~RFV;d=sQVfg!X(6sRyE zM4KQL&Y$2!8g?K|iwZ+-Ko3Iv2g?>{y&-rAV-W7m(ovzCrGH$H3KK;nf*28HEJS!N zo=#3oe|~{rHyGroV8I&@asjX)@>u_UE)39D7@+UJPr!nI&iVIJ6uv(is)Wf^z=B9d z{3|C65dA-4`-fD2w(zeISP;pc|I8qESeRk|kWLt2yfBjQ|3=OqQvO!;CvspwDBM_d z&BKfjtoj`bH#2;^obW%y{evtF1pC&-9;K-){lYjxB14wOP zAg_Ueq;^vY{$L=5fs_UekRV_nqk(~R1_p8&7)WG*@NW}&{xKZLW?&$dfq^^*29g*U zB8*^U6+nct5+XEMMa+;YfK>Kp0L&m0=-)H{9W`LczX9>rdH)te9w0;zk;$qLMKA+U({A@h7?$U^{*L4eB%1RxdUrXv4l5CmY- zAE!W&bh?>DZVPf#ivI`!Hx$TC5&k_!3IkMwAX&x)0rDIK$aAz12a;VCJu=1ZMs{e!zQwv6Be`;Y4}? z5dPorfFnQ>2tguP|V*Fd$w5QvDHz3JRkCj#fmi6tfU8gIo>;m;(h!14WXC3HnzR zL!d}gJz#Pe_FTsi45!ABwyZFhPMEKNPs{Ly@=re+~UpUjRdqo)tzOFT$7&+ZL%CcrW-f z0A`S)f6x4PkVF5j|G=uhf*kr6JrNIOD9|7=KT2@22?DGhKG z3eXb@&=U&K6AI815C&8OH4h4uJ19`@pa5f$!lEDqjXXUO6ksbbDT>gNCufBM#DpS= z`IirW$H*TaBJ$Ye5c_Nt5adFDxqk-0%zx)Y=-=hgN`V~?1sDv-BeT_?fe26_MS$8U z0@Owkpf-vCwGj|TI$i`|_`kx)L?Hq&9S}yshzJQHs1(T=M37|vYlpv28W|-w!Ar>Q z|NrkDA8Fv<7vSGBwoD>GV)^qN5JFPu@0q`f2_W-VMG*mtI`RpSgn$7u2O}7inb3dF zAS9J(EP>1-0(?h6N&+cE1SrxXK#>;t=Oe;DudK){@Rv(}N5UVMg8u!Afe;d=Ogg`h z&4daPN%}T_n-x`9B#D^}oAYLjs8VE2+HFV0Mm#vfM+J!{=|o{uBxQtQlOrgV*ib>R zB(phU2m#Y*$wnB2DRzb~)6pb>5)=_|C8@4Q1JcKq#*>xO5sX0+X%{ zZ=8p}-IV3yd>-TD(@!%Z%CkKNY=$YHv#!M@zmk~W+Owh?!^g34Nt(>WCPH8;Q;PwY z4-w$~@1idqeNBPi`Ch-b=V zm-#5hJZ zs<__cYtYQ@^Gp1iWnhr^@jkea-imJ$8tC+;Pw^Nc{OP{?o|fb0HUH{^^!aD z$J3r+zf3vEWd^D4!&Hx*SWlXl3&uS9HNOnQCLOQJq9!2MrVmA9(}zwER<+A`<|R_U zR?I&+qobc8E_YHCpBshao}so{3yco$+MOh}DjrOWpWt3#T=oww-_PUhB;ATQ{1|DP z{V1wZ(E>MR=(ZiWKKs#2LFE+IfmiFdpX9+h=|pz%Q;=Og51cf)!glWehbFDYd`PaQ zoevEEWWAn-@kIY8d0_s-6@&jhVJ`T8YKBGxx_XQZ!$BSiJ3|f0p36_Y-G2NpV!j*E(AMKGvBNDM`8#2i z#kPFy+;Ayb3S+Lwe?+c%aXYnWZ)~G}w<4go@X+8Fx%n-qEi5N#G!vUNY0L`s<_m(5 zC`eF1-Nwbv!(NCaq}TjDDWAGU)ZvTeOeZ#GxTeCfnEqV{0QUQOS3 zefS&hB3cPUxPJg2%krg5FP}NW@Z2J?rSnG=BO@cnFJhVfj(PYD^_JNY#Y3V?u3t}& z#x{&|OE$wg&0 zJeu=d@z*>Ct5#d!tvgH00!G+(E}6OqAn|fpDrRqQWjn8LDO%R8G2A_0GT71VR;uRT z6&2@tKTuyiSoS=j8s`T&^d)&^1YgpE75=W2UpqrJqao`BrK6>E6}D3g9Vg-IuuAWG zG-13$MP+nmI#c2Zv&~qlmPk>&4lea}HgzQ)VT%qEGD{Q+c+TqtAztIol4&^yrU-u( zt#t0^O*$+Z1;wxB8^Nhp>WZ~*^v4{G#$Ks&blWGo zT9bi~QyBM?1>z%jL<5SIV8){Pi?Z+sKYK;pa{jGQcNMnfU^iO!M&~LS>>xIS!i~zqLgrgV={XSf}kjP z;n-S7S$74WEj3C@EEpW+spZ)V*o*cW?~MuUmdUjRQ-6rj>9)5D78-mv@NUq1ge{p2 z5!?5f%zWGFp2mWPr1}Sqt%5RbZaqc^yj0pL>rg}C2GGvn)%wfz)^+)HtwGAcrKkKc z12MHqiD%&NyR$WRddpX(7wK4D4Aag#PM}%+X&xu|!R%rUj4+?Rzxvaej31+4^yU2v z8Nakk*5(>mZey{HjGC32u38l9gwE!JFZN!d>H8JxMfn!7uUY9WaA$V%X+>^B6;Rbcl?fTVs=%(RIEsN(?c+L7*l-WWk~^n0qNX?s_v%= zt8LD0IQeP8Y?0Jh){myi$dR17K%;1F-upEUFO2f*mBmL3^uz2XB1Jf8lW2J1x}TUP zwykj<={lxxkC!J>K>5q027ZXwEkYl+9-O z=ZNQ4;4_o$qx{j+^hlDowBkeZ!+wKH@y)NgIyjx5@ zS<_+4?D$wD+VfOeuW8n=+41GX8Ja`CqpG9d1ZIH9{%6VWMYei_y(yxvo)(JxRium< zd%>6Woi9KB)HxM8y)YSVD)!{|wAvxrR+{`VDTy^-+jqyBgg{?7^=Z0o(ndd6c5!x05JO&~Q-K-zmR8XGB5e4+5dp_%EL9>_pZ{ zFBusq@;CEO@QlcE^3)AI{Jd1NXVw~ut9Ash4)<#QOu1Jw3-Nt=wtuEf-g4afDd6RK z+Qg@yXXV5JSOM`@c~_BF*;f(FAI*goXyZ-X6eAm>r{q|84GA?d6I_{<$X|;gxvfkL!Yr8B74{F3>VUW*9na` zk!9NIXWG}^SMJa021(F4$#fbd=gE$V>2N97bTQC;8-%i=mS^onu)3La7@m=>y?YcF zW~rW69_&@UoX!%y!ER5+VVV^<{fe+%A@9%i$7ABfyoX}> zhyYWU8FSPGFW-ks7FQ^GeVipa&oVkcUnR#zrQowESr?g6RB@ur5I5QQ^}#1*#|nuwQdTnw{4BOleUHfm~pWc|PhkW{- zPpBd`gm47R!Db(s%sTtMVQVjVACOn*tKjfe#L+wmn>?h^@7Z~P_SjsbC8F+-0zTC} z_W#&kYT*!ybSfAZH!sqaM5i@o||`GsrN8$6moHFh?$#m-l%_S zwLsvKHaEJr=Cv+)?$^S3(B*e5)dCkd=(+eLI`azNj&&I1PsBK|`h!U7HQ_3@zxQ%j zyOuw?id1~;m)svz8NCQ^VXc*7iI~D;yo|n@tBP_CW}o{TGyZ&xJx{#vFb*GkO9?EK zdNT`_&J&Cb6kE2i|6ER;Y0}vdEq3ZLGQ5^(F4)3Y9oW-x9x9{ z-^af#SKdBc65~*4c|UDCuc_#52`zfsz9!-6+wHf$y$dCU+xfnwQY97Jg+EL6w*yWc z@8i?R>z)SDWMP)bI#fm)$WLfP)Y*$x9G)XK*~E)An`rWtN`-iI*o(Ric+r><&>I)PFJ|0eQ%; z7d1&zr_OJ{JLyoTUv5A<$x)~1tSdfor=s4Vr*vmBWU#WU^Z=6O{ffQ1>%sIIvk|#i2EDt8guACkdGiEMJMV5^r#iq2PnK2 z5>t;w-$jXq=HBBt&;Mr12l~tyCO^% zl9Sf|nM8>q>m5gZv$i$TG)# zu(&Jben)`!Ey5LIiJ-#hH`Xiapv?Q0qkO$QH9Tb;rGwkmzGWzmA5-9!1!XYDKBF3F z8NcJOr6CqYk65*48OSfy)8-XlWa|fssTUBd$p@bLA(IxTh9de=_if4_h{H7QJfqw- zaBni*1MBv<9>5hRr{*ms6G_W*x@rp^tOfyW_%}!v7g-ir3v>&|9$ri6aI}) zkm?7m_m)ZyCL9e}3h$x9o%2>sgkrKZDx;`r?xsE>bIu;EP3Rths^;yzRuJb(_PU3& zm!mhU@u)Uz?2&-Yh*W>x4n@LL3i$9o8}aIBo~a5r)U~H!Zgjj2XE4}@d)YP;uy>` z21mJ!J2lBOj+v&&f49H0Q0Q~=Y<*nbNG8^vS+YR!d>zBjK;?d)3=TLx~He0iv(3R_49A*c6J$>KPR;vU6cHb zc<;NqM}IL(cue|>1z!KY=lwo>^?J~|o66Cj)Pg5jh14cTV?+;nU;V!Bpq>asUE}6f zNKjn!HfiIlAI2gay<&tHr_VcHWQLcZ@7>4LZ4Hp_uC#_E!a`Uhv0=peLgZKK6|b&k zLCPcBreq6Mjbv^S!a>&KX$c{%LD2EM(kvIPb4Y!4xn=3BLw%F8)!eLCeQQh|y;Itr zz4%PF*BgyW&>mm&;(pE3JxRYMsY=2<){E}IgRqNlZD*$N%!|(0L*5^+0$(%kVO_3V z36OpMZhYT>qTB5o-{+~i{WiPI0O+eI(_NLiXGKg8v~|$^x-#D0-Q|xkB_r|^>5hP) zo`q(~avo1N-;M5*03k$EEO$*2uw%-y%*Bmk(-8GUYNzT!|C;u-HzvAS?;-33BXlC1 z1Kdw$(}e5>;jkx*CW4fM3(KxghE0UO4~8s z%6s zFqVb%DJ65Ck0^D@p<$JYXm#7l$XLVtOMuwsN z(I8PnOzN)f*1;+M)5_Ew_{dG{9gj!|#}3*&VHf2P)xX{(a0{cEY82DD9>2Ktwn=MH z8`O1k9t-vB4z5i#)A&znVuU`=d+jr<;=V>#MN>xOL|a1F#2Ui7gO!1ifn|nnhG~Xj zhINJa3r@a`;b8wmo0m+E_j%|h`og`2v2xEG%`xZSq3-M{zF_urq_`<}KTmuIyrB4W za;qtIXe7C*c|Y54+pMVp9`?RcE*V}3PlCt7Gq0ar$Gx9^_(kB9@q=i~i*Mev#>)b4 zp1rqJ`-N}3axhJEV9s(Cbl015Zdp>j`{GS7A-s}b>Z8~B?YUK}-Dg^Y3RM%l>#>Mr!-JX$ydPWl7`l4Mbhvkesp)!+c zSAYuZHX{KU2^O}rEjBF{?hEsH%33CCyqRb zTq0MGe87+$?m3k=>#i3d=n#B+|q>EJh#0AB-x1$p?3pyxy74x!|oX zKNe(Ydxl+!&CzN52Hn_P*y#m#C4NDt*Bi`-@Xnq}G^rreb21zYF|rQ4X>5=M2b1Ay#7_PV7mj&14gw{HUAKYe-Bh0V7{j!tf94AqZnlEIv zl1{T7=Ulw(d4&b}FSM!lyAN;+&FRxZPhBykLTbJiV5UFEcO`&!Vw}?r%@KR$(c37` z3BkSilI*OPBb}<2aZDoCbqEFvCHf0YjAU>daSS#bOc15+__OMB_PhaijqSz5+ydTy z!fzxHS@xX|$9W{Om)EMN;Ac;{w~DU0ravEQ>`v0KZY`#`aZ~5B#yv8I#uWDlOdD~Z zu7WiS9Z%>3)Rx9YJktH#AMOucHd20Hm4Zt=yBcIYcMe1>eSP(d;C?vum@q~x*3Eb%%J6~ooRwkN%7H*)NIi-xGx4YI&!6XF=VBMWt`f@bbjq%{JX!P}&(6kWA5uO{so;J3 z<>h>$u4uyC==~K%ILST1=9i`h_iJ|MPSa3=EO(yO$(~U}5D|_)W5uGg$YmrJGym zEwOgBntik7g&mz`Iuc;`Nebz zrAHHT2^AE@T@DdOC5gpfZ$5JrzbqoTU-Gi#zC)c+?o`RCL&$7Vo3`4fZ#VDbe=lhJqCX~bsv9s@{r<-&~})U>sCe39}u` zPVU%#dZ1dpi~Y;tXX-J)}EJL+oWlW$Hj8}gT27aglr1vP{y4EASAL$KbB%tJG`9a@Eo74-GwJ)Mun|z(o!EZ6 zHLD}qqq{$BPNEt6;jaa9p49dke0AJp42d)-mZyXjdGMlbvWxJ<^2FxmN@VS7XDFU& zadW=b@kpY49XmnYZ*w26+dcWnA@!$5o#|!bY&MNUp#ur|9y`s_-5&%^gtJp%lB&_&W_cCA4R$B1|8)?3@+Cv8EV9u}axCv*l zHSdgY#MSa%ek0pm{g(ddvvNHJ-RxeB$%sUP>+FYy8>cUJsrqrAomEAM3FO6rar z;Qk7$O**p}be*}wbb;QLFEDO=!a`q2dJ^AjLuXhc96zX**}KBzUdcf0GH^WIzqD;q z&mg}mQLn%;25HairLE#YD8FqaPDvy$C7ACIwIj(VM1*gVJ z`Xu{kx~8Q>n#C?^NOuza5?YifO%uB{n{$RO#<-L^z94WO;t@`eOQDSMdn?2v%3D6W zdzoXyn^gPQVwu%#JzE$$Fr~XR**anos%;8|TuAk!>aw_pBZg_< zij^T2X{<9Mgm7MZ@SIJ37o*u-2JVz7)$#L( zMfm!a`}>#VPDRG0<+5j8!?BEOG&KfF&8wHcXm>O=v*QvP2tqLAm{6?7UQ-bP)&o{WQBz7)%=o$grnrO>LumO|9!=uHlZmO7zrN zaL|<0k{0c-qOD~#*ZNndfymv!T@!QY8)Bjg%NN~6il7s-g^8+ARDR6Zm<^+ehDOuJ zE_=cXb)eEbD-yfD#|@%NQsFhx{NWI);xpS%Jm(m}!&Nc5A2kfChAvgveB-UZALs9C zs0O>DH@w+>>!545FxeD)VQ7rtD-eFD3I^%xu?`>Ai8Ahboh4liC>YS!@m79ZdwSN=gnV|2s1f590+%tD9jcRSbgM} z2_D4+!AOOz)LC(EPju@LxGSyVHB4X@JlOQ>K~<2KGh({c(W6U(T_zfJmrQGhZvbwi zp~uaE6NevKS)0}-2-z^pt(!=OwBZisLQ84s6E5T5GAa zk~&mNzHO`@3Orv#y;49CFqi*E^*uxkU#h-$iAI>6i zep~g}atd4*{iRs&2qy4uB^q_zs|tS4TQ51Of8driRu0ELZr}&kgwnSD!PjWoMo0S7~E$MDQy=*wYECq}8Tw1_@NPND27ag_%T(AKnS z*giVTJ##tHSDGn!n?+Ga%gCpwXEf=V%HzD5>NvF!Uy+w(kLp-!s1VNxuL7{a4U-L1sh8%L!fSfmdwyASb?^X1;Ip z1n=Zki^{I={dDmdXIvw=cX|6d?i>Z3CxuUer9V&o%_TRUu2HG5F%y~cNU?gPA_dNP z)lBX^G9Hyz)=cyPM={aFP!&G1JUN}HITUToW8vouOv%gNH55}MRgE^S@&gT7IQqe49<}Jsrg#tH)^i?c`S;x zr5WTF7)*HalWbIDYbTc@U*k!CmZLUN=Yd&gc+fe6HnX=ZRHi?j#W_ybW5S(Mq5Z z^=ylBpOsXuPWOb9gENOXO4$DPp0YGw;KSr|e6nETHD&Q{WATrN8C=9Km>2O+S%Q1A z;w@UlH!Qh&zM2d2nrfzQJPND~ZV<4Y@rjh1**@J?E%6N)MBFW3nW&@v{P>-;@d~K; zC2gt5tXDYf@raw@i`++B)$o*p!DF65yS^W3ii7K1US=4qL1iQ+I{NqeBT;Q%(>o*H z#2(GAdfwyPfv8pK^Q6Z$i;2x%6nPZ#b)~(o|2#9fp!~E}tv?60s zN^w%&u6J0m(B_fY00$4*q0 z_C_#POnwQtNjy=l%2{m;9w#cQPxe0Sy{Hf9q(6Thg+vQ*i3{CuLy` zA_vKDGmc+`$HWa6&Xo|Lq>cSFU1vv7cEv?sX}VtDayEV6X#aGTGcS_4H{oMgK%(_AS<}SQ7pj z_GV6rFFs=@Z2h)18R{Gf{Tn~{sTma7KD15^J+0kqS2Y{GipvRaR1$m?yQCvBH}Ax$ zEmCWtgu?6UvMEoJ*g>Q;K46oI+vf_W_eVy zUFToGOl;}!Bf3@8M*7mauiM}I4G4%)r_>p{KHmFI5%xj|rYNmj4}+zwo7DfLM|*=Jl!rMZTRt9zD*XM7z9kJxc)VAOPlla6A*Q0K5Ad z0sQ*mSVEr-KP^>bVr@j*e}n?IXlq>-whe<`V>Q(?@3qDZycXX$FWxJOsm36EIy*aE zPVU6r945{?t#8?*?ZscJsE%29Bm(Z8Gaxr*BF?h*NJfu?Oeem}4aOF!sw!##*Gn3wDuZJD3@ zlA|eh!DWcowXh=vmsq%XFeCfJ^swA>ZfRz7#k*DWMGG6a;;QD-zpJyR4qK~fQesFO zTXDa(p(f&0L?cf#(#{Pw>F86uPo)7OpRdj;;1}n4S69|~_m+zxGhue==SPdLVFOaE zh&Z~{W9U6}emT=_&1BKX`&;870+%blMmA~Tf$+wS^NDA@$@ZZ&ZbN5ioP^QCj9Z$+ ztzPz<6Rw3(btzk)_Mi1^EhG~41YXS;OE<$G%~C!hPL~^5#m7!m;2DMQuYwBU7e}k^ zs?g(@ktIhHDMFL8ERK_c?lo6vBu1xJ(4p=j>b+nra}v~NuUuaol45u&gka{#h9uqm zz-7@!m&qfQDP$(hya=Mm`I6MdD0gnZo$^VdRMUJm+EyeMrlC+%mV(!|rI*W)L(?4b zV54WL@iJNg*QAwutimmOUkb5HZe2m5C-p?Pq3l>^OERm zHY-D@$TLQp9#_G!j^MV4v%Nf4*v4`qd)cvhaSlZ-^>MOJAcpk(u+WVhsymhJ~Ki&_>#7B*+T3WSC5 zkdHnJ70PRkvu;u1Y~H~x^;6y7SR%^4e?AzqdS-yyTC&oGgJ~8Vlw`ilPUVe_X@>+4bjJJRN+1_8Ect2xG9C)@@|r0!zQW1;=N1G9div1sy9*S(Sqjz z_LmgL!Q8>sn<)&8*>SuwUs!+t96fD!;3PSxVVZZ%iX{<^?`5|o@#wV4S`*fGr=IDt zv1UvPiZ7L`6DSaK<9r_EDMaxp@8?@{UJo7pmhv>}Q#lvz{BG=2CbVy2_DXl)4+l4r zMB-tx0!mK5RN0l(1DNg<6-3tsH}IDvkCIjC>FchFl_!!1f^rDIX1{gG7>Qov#<$C` z{)LqsWnpG6D(-mTvprdCC*aRHcm2gr`Dwc5XMLZHDjAH+h{1y@UoTBYsj;)}!pE^2 zOU8cAOV?Z#_0yt5JQ6iYGcz-W@PmP&fuTj)gBjDMsk65UF^)arsqZvW&YK9l?(T4O z$TcpDCF$c3YqO9QDH!FD@YV*M9Lb>PYm>}X-Aysq)+WBE&5lYgp_fpkZ5EA_kfmXn z`o#8np>9Fqby70?>H0NfLwpIganW}AHS99&>)pGEX={#|>jm1d_ie5v%JA_`(kgVe zXErag{0xsc>)s?W`W@#MA3udR4l`DK@41b}AChHnR0KEYu*GrqNaH*_LO08Zi{oTl z!)}q_;3(ptdjrF=9STZ*V!lo{Jwqode_z$W{BWDZ4E@!9zK6GF@i8y%_~ESsgXQE| z?ckN^yk-jTpQah>pB?DAPP^c!_`0Xig6DBf`bSnlTcIQm7o}ytX`lWQi?Jf}&AzvV zS!gicEWto_UQu0(SM5Hr6WhBx1}^hganpb46QGj}Ii=1EOJI!0m|r*4{XX`X*YVR5 zPicNLM?p1*{dg?O?9IRC9L?Y@LfbYjNoIMbi|!hEOOv>r8&%Yk+*i5*UM-0A&P}fG z7M4sg|ibBR~` z_5{gA%%?+*_!u$$ z2$F(-s1I1wqznkQ8a|XDg};De_jY<)+TWfYt^P6 zY@bki{q^PK0TI5LnxSxV4x@}lP8)f0)o5*x)zwFi9@K9fvCgonj7<0mBb98-&r9OI zbq@i;aX6W?ES-LIdvb=cn9g1gB;%@EuksigMSkV_b22|6|2QyW;5hwR%=>}Q4|PPs?eVGHXx)?@lkvXtw^?G7awR&LxJB7)l1s_y z1};-C&N4gVh->CT&=5*JpQ9b%AM!_UzD%L8jraCj zWYQ!&7mDcjMqO5hG+AO2ro=RGWBVG z5=c!NOV7c?rcSmAFTP913uZ2S&+U8rRlV+3kTA6F@MFYiko=yfT4q5*46Qo1Q6^eJ zUXkXulA*;D9r#lkD-El%M{H^|eep`wdCX?%xhx%1%Y9j}H|#{V*v}0+6ZtIE5@l|C zzDadchS`BgWa$^p`&ez#RFdZ!h)Q14JT7r)LK{g5(%{)2+as;iY7kBL36a+fk?(ZA z=KolZW?nN;TWSE0%~_(Q4`G0(h4N5=v7E)7QYwty!1`HNDlmzO_% z%$GbnrJ~TL8(wW^zoq30dmjD94kbk*CryMZL3!f%_7jG~l+w>Db^)>qP8RGW(TZ}q zuSWFPsG?-xFk0gP_T+(k+j?TP~ zO|Vnfx}A27)uhVZWYGGs>qKtofX%zXlC^ImdwqJscexzh1l?KIV*3d`x#c(d8ElM` zpG}q4PUxQ;_%}(DFC8f;=e5H4rFDDm2%O^m#A&32!^c2v?0Bmf9&hMr{ERQ`ncGf2 z^OSaQ8x0O=u!c2Id?%D(`wa0qZQ#F_%uas4;HO}pNcIhAPM>0Mwf$Im%fm2} z%wT`u9ePuP$}%6xn<(pkGVHQ0A6>-an@RTM{lV=l1JW6VL_%-3$G5`#Wrz+@jZxn; zwcppJg=_xYddB>evLImXPSSyaiM`YL07OjjYlj(!XBbuAxX(hzcx&7zjPwup%?6?} z-uk3u@?(~reqboNHD%BGX4<~dx+y0^*3!9B;Z&U|BYk+cMBC~4j#bx(-1HJOHjr@=twfX6 z`1F)Qy@%_O4EJZB!!Fa9+yGM&E1_iSu))zW(Ah|LhZo%Id}J+qh3+z;=e4QbJCeDu zbSF{cFTF_~;R%p1mVKPy7Oig-&wPIgt+@Y=*8MfnG8qr!6-%kEVC%a1*TF1)2MIi% z-hYggy*oC~w==~wBx2r{d8=+gWiZk2Y|&N>9=yOByucP*8=Z9)&BV%j%ppt3O<%^8 zujY+Hq04~!B1~q5S=;+I*-dw&shO;L&5#%;asUsI`iyy!TG917j;l#ZE1dFm#;Yb-QGaF}X4(T@BrT< zwNx6v##lf}iKoyLg7>|>r)<2FPcI=@ONUM_xmx&{r3@FNlOmz*zL?AfZZqXQP!}<1 z_I6PhQ~l-6dDsRfmga(lEW3k>_t%18p$oF-G3A*P4nP?A?;ZxMj@`+#6r% zNO^x(XpHXvT5Y8N^~dCAwo6IAye8(tswh6PZ71)rVLOXHA0s?2i-+p&*nD->2zmH^ zfj8HB{n+Mhxe9GMl}Buk3g0Q2t#P40ir&~X%;Xy*vulvN3cs^*5zTdRxOl<5A@QvB zJF)b*q*oK6tksp0aqJ5YjOXizS=?dwG%q!Ay4WRpKfWUC3Q6>u7z;IuFJcdB;!Ncv zb(Z)_pfz<5*Q=Xd)cKsL&g23C>8Uw@PdS~;Ub!)4JLKBE@}?nON8Q7-p<#7U$unqU zd!PT&oP*|5DBVOqBY$tgOQm>*LD5mG`*ha|CU^v315^b6Sq&;QCo7 zsa&q!eG4tPUL&+zR=E0xy6{0fYt)tC>f6IDGumisp-n8jIT^z?RJEQjf zIknHn0`tzbNrQwD*o)*D9+TSK6ewf^x6XTM9$r5X&a|R4e@tO@?W=@F)TBdCR(hd4 zvEkL79-)jd%P{k)bk8Ji>Fa(l+c7=5m>`W?MtUN=S7R7Qc=Mk{Xi3oNnABFfd$v=0 z2$J;}-*xbzK0@gd4VH4}H9YDgNU?;=hRJO{85-L5H*AZc9xrPCikXxA2HM1K5sqOI z`R`AVr|zw)!(2C%C=9axcX27N`SFRS&M8o2Rui5rs1Z%DZ!%KnxchdaCO=_99|6=i0{1iRzeE=_UyE;@7Y z{xWm!retCVOlMDU?cw*kRo+dwj)5X2y6{Yc29?`N6YTbAQ#N8$`A#n4jm|z(9G04q z(4)6>+0J*|e&G0weT6fe_PX3jQJDz{3QuYpXtWl28TzW|3m!TxZN~1)kRE?xI?afm z;-h!%KN^TB=f3RdHFt^oQhwEPtMGMC0CTLd++su>-$TWRjx5<+1gO~P`*aGiTYIrk4-!;cZ%cFrk0PEIF5!SW-i_!#~A7AO3s=D&)6xCRB zWt#{n#D!}e-1&_9CAg{CWPrM{2n}!3rHEMkK-uSd564X4t-xj}k=t6X#o*MTWxl8S z=6i#V9aUHwHN(*wBB7%{>V+!$Mw7iN&S7d4-cWz>DXO^RtN7g1 zDrwWKgx6N+iqTA46)`u{WAcb|a}kEum~p*F!$J6qwLq$_Azzl~jd^K25ptF>mBDj? z)#FCj2DJUfy4J0D|G$SDqRpCkvo4=c538Sb?tizeZX6j=IJfKt=2}=!R0>4hT+^n} z(WZSr-`;e^o1fC61KNMEGIVDBz>e+!dU)*CTO+P?Pv*x^y-=|N$2_Np0Qg$|cjmc- zbIXOR$A-@z=yx{{cC5^7-QKtVb*x>x0OKfihv*{yrq^&tci)D1JupSfTi0}msb%|04QRuOr_Ge&*Uj-7v{)jryuts=`cD*(Ox zsk)?pp({`z3oy6Ksn>cmi&WVMiPyF=;Q)^p-)Oe^;lr%I~8 z+F0s$u7JxPNQHmh+UwVk{q&>Lz0P1<5^H;WC*r6uX1m_6@bN2wM?=!Cw zX`)E{MOT+dsTc8b5o<~jd(9%wK}F2QA|_|?7J5VwM9#oGXF{Dbq0X5)lQW^tVFKGc zu@Szg$h6pusV9wrK+)I5ab`0%-a36twe)JT*x;{bt4)8D@XQ+(X-vd(Z&dWj*pln? zE!73sr!)eR>ne*Wh^$7U(UI+@-e+B*1~2IChMDj0e`kAB$G-Po`rZYNZHQnFTQ9Hw z$xsOx3k+Tt>(@q|8f*ONSJ$6d(IE)N4&_npy(&L0Hsu5Sl) z%Yg0-Xt#e#=< zD){tkHRf{1_8VucW$BI%&Skae*VGB}OpTG#Ee zkuWWZSRI4CPxGAgDh2&4SZYQIEYCKM9G=h)Y|IHPZ=pzvl2l@wPENIYgI-n)xa}T?zy~DH!0GDgqaVIGJaptYJ3QwvwQfGx zjTL_*_1(ARMdl><x~{qMam}nK+watH@j?D>4VUlVbi3AH@$b7`gJ0oRGf00y4It9> z6^DeKaynIij6|D3q@6C8k6$rNOoR|pvc2@E$`7PLl8vl{lDy8IjYOmCcy`C1wOdaG zTYIK|u(j`?*XAnq-W#5OE|vYpJFmQaZnjejbo;y0J>m9H_Jvc`*jPJ}WVv2HG~G3p zb{*Q+y(R71zJKbjKjt=`IWd2JDDUNu2irrt(_6p2y|c|}OZkE+ou~^8?cJE4-`O25 z?#%}B{TYv^+BtL}5}w{P@!F20(GaNr>xHlR`^z1BUuy5$@?d75pfh-qu@0p)+}4%H zN;(I9!`qN=dbr;pHp3%rvmCX|PKFb`x6?B%6DO-FCj-`bRrd{w~7Y40#IHO+lw%>{W8ffd89JM@T2<)rt8d8siH4>aM1fTbre8%J@Ghh z3?@595#%zEnB-SuWAEHJkief6boeuZiiJSB2I8?C{BXL5x9Wdyk~zR4#C35O5Q~eG zJtWNH7o5MqFA8hs6-EF|_&_)RUc$_=aShF=`o$|8Lcx>aX=K7U`|Jh0s#~BI0F)~TKU&;3SgpFF==9zjMe%Sc&2>CxiNpz zZEPaEU=*5zu0Vg>dwoa3AX;Rb#nvJTdPj0gng88d*jT-tgnG+z z7pWGT3%w-PO}dLVG6AXbCWWD!g@JCw$xP2Q40K=BMY;8ynW1H77Z6?6> z1VWrn{-nXazQr4KTbt`=R@02^FxWin-JbP|(PFJ%AxA8x7A!eluo%e~b<5g9{OWJy zglIAH5F(6bw^YAU56cQel;if$*DP6NjnwN|)BzFZQeQHlp65)~r) z2tN9W)w6%LVmxdAR`sva--LX)jriz3duc->zb7ZtZT~}lmRm09y z!_KOOs;YatPn6pqIYBVD$_ds!;m<%&<9VaW@U5MbE$LE6_ek6h7E#sQ6n4Fb zyG(y~-Ky?79+ z%hF^HE*UhK>@c!_*pTdcXtY~ar$v8o9>hC!rXHuR0E97*MRDdZPoSMz?iy}_>{NsH zt<1q+%yf*DilGMnITWu=h*c-1lCwYF-SMuH*;VxCi=)wz*M{?Z`&!7|6MsHECauo~ z>v>JJo9+S)c^(M)op?T`RL@-a=H^p#gZ9{Pcm3Df_YBUR1auDox^FRbmsNjd2YA~} z2`tluNMS?3s2nG*lK;ZUj7r1|BWQ-{d4>@;!!{s;Ad5=4Y#K_mH%TePr=`*l3Fe|S zfvJZ!NUoe_RxJIg7#BrtUJFiKsyMbWlK4VkoFw>`Tl>7(amFVgRNC@w93Le!`~e#?CJ9;*?wQ)r|CLSPW4OMxTGgqwZrdK?jPp zMx;6|1SF2&TG>~hv1VU}*CZ6!KPM>Tv8V!zA zweP_n*XrTv-jS%4H;AHfofj~fdU#*=0bo)llA0USaU(V&y>1pY{M1?cKVgs~v z@VKFODTez}pVnmYUX7C_*)Q|!)D>fcpVa7@dgmQYDqwDcF1vq!23CBuJ53sUX`auf zn%RA`(y)8L=w{sqnVE&HUAs4TIsZ?2wZ*t`mEk#azuBIP?U}LHo*Cc9Uf;5ptdq?) zJ5`gctz?@LNC80-K%feg6rm`j(uM|!Ad-g&9%y)=5-+HT2ZY)v2~esE5y1$HXnq~9Q{}r zG>)ttsq_~c8G(UlQ|6`8!k{}HHZt|_$kC670ZQ&a30`73>56MYxS#j(MtPxHo3Fd2 z=H6$Qc7A@)QjLtJrm~vuXhPP>n&ll+!Opr@nqK+@_Hcjy!9VF!?9Zr0>Jstr2BnwV zF>CFZ&34RYJC=!d?D=i%=&F@yub2CU#Jbg=!C8?IT~9;o+H(=Iv%{OSGduDjyn6j4 z%(X%*v3}C(3o|4s65^{Vrwzv!KO6Zq$$tR5xrrWR;=sOK*3(3EahpCRYF?vb9r$8c zcrj&gVnToX#yBW`UsNU5NWI@%u_{w(k&`&~Gli0tl=$kw(@)b$uVUtO;f?^aSV@J7 zo--@nNIrH#k|i!_14iG6DBxx0*OOSvg$POsu)hY_Ujq@xv_xhDjfA)8{`KhOyD@@p zj3AUB5Us!!452#~4>vv$F3vY4vponD&KW@1%3Xg=u98@axbZ}BCk`BGt`t9ztPsg1 zj}WEB&uopQcJllq$r4f4h2Ertd08+D8LOc4t5-|NV0q+JjbLz=`= zXOBL;^xUN{(510pZ2bH1iKnWcI!d1z_h3&eK}5O+D7H`nqxegz`~YrwoO-w-{;#^I z7*&6YC>x`ZiOck6LPAO-E_E0Wdr;{?Jf@>SLv;?7>d^5-2~|qS$JJ#YRea=;UJq3~ z6r|ACedI%q8%lbn?|Yym(E3Lxfphy_Dr#ZAeEfbD9`x%2U&#%WNVb6mf<4tdMq;jJ z^hG%Gir9fR1i05IA88y}NP&eW@35m77i51U77YPK_g{dv+<~UmGowI*Swl2KkA`d_ zS1%UpPLdtnVmTz5u2m?T5<6m<4{6!-^Hxz8m>;o{tP21Asge{KR!qvwCsjjYL{*^S zPuj?-D*bm!6&YGoFfThHKfD0E>_;;ZFDoFfPXGvzM55KkF4V(iwS#Its(Gm9qFR3u z)e0z>LUk537__(t?O8;7+GweTG%tfzH5~V9Q5nkM{+b7G&{A zurF(ewXbUDHC79aY+sujR0oUSYoQh%YhlgT%xwR;*4Y-lA9}4r5~kyAjQO#f%gaN+ zJYuFBsX2xDK$Do5P!blN9HcZ?!%Kg$YP3#B7J8bWus+)vA2P) zW6cwIrQEQ2{8$vf@Du8oKw!o!)@s|ZxTVTnV7bvfCSlc!?zE#aZ_xD5nMAHpbOUIO z?sF_8j@DGk5Sc&I^zUiOfHUVBB7K)ecWBASMJkysYY2)-J>#2XVASpn) zkO0yp2}n=CJtC;$hCOc4q6{9;fRlL;JfKVcIP!oQKtTtu?_y=^U`^Z8K{lL)>rkDy zkrk^~cHEUk5KFL_fHogZD(bWTkt(Qej|na^hI zB*%!U#72j{V=5fnf(Cz9icdpQcbBFzOQ_^{qZ^KAwP}-d=df> z!NgViE-xmz2r)^vjv^+&4`N4nCU%2B`hH6k%lCg5t{Hk^Uh zRaZaU?Kks^l5c};6=awLgL?V#+&Ag}ayyiis*&qEC zU1naQOi+kjc-2=c>DTGQR1N%L?V9X1cW^1HI|MTzI=O%S-tWMeYq&E^QFb?n`?mrW zo1$-T;AM=ASI5ZIJ&X*Wu=I;u!f*^?@V8W};@Ds?<9RKNPRlE`aoOHjC0qD|C<`pk z=a4?x0_@@S2lwJV1k^0q1C{;-y>>$`mYqXfs!uHsmxnlD#ewQ|+!sQp4N|}SIO`uG z`6G5e+Wvp2y>&n80D9q0&b5KvAApt51G@^$x94KCK%ZK4W?QOnM1@l z!Zc69WH|a+^n7>kQV0J|t#mv4;YU#nb>+c5_FvSy@K%c|Q~U6n-=u8%995)LdX0j! zO`p5L`xz;p!mG^94QJt~zK1`s*bNv6$%qX@IT(L?WKr%hb@b)#(qaey&~H1qwg+N_ zo8!Kd2fCeo+x)PPGiT6g?gjAieC*>Zu=m)-SH}BB|EGs@HFvJtwr>e4xdkO;p3iv( z&l|))E;47C4q3BDl}RSVm$I|4E`WjknJ38Rz}>&+GYT5D|Y3@*tT484xD;OoEpyMX#Ft*cn?kHEdAC)dr$&v zZgUSx5aQ6{PjL< zKijdNKVv&K*v5{X1PC_y01}dtgocnn0$qOx2x?l=@lo1|uBFg+Y!%Y}*=V8Kipo}L zm4K}Cy0wE9RqCdyV@jcuR?+-3wn>4}^`G+L?A+()Hbd*P?0et2_a2{n&bhzyyG~2> z#DW3X6s?coJuxvq*y#GO!GcdDcw7RHODrn|Jl`|`(MQ$ml$m)KFj&>kfXEQ(G?;&n zJFavZ>{boikm2>8(>A-$;SS0)OHR->MRUN#k7jP!ga(?kDK_>gn_vPb*=-m>d(bqQ zB0C6y22-M*7P&9OxEQDD!lPYB{ffS#R`sHH5e>iDElWiBk1SIG}|?p#b*Ek?I-rALba~gN}|R2Zd=LB?|Zl7kA3xw;UmgX~2I-om@Ab z!|$#l4hUjNhh0{IbJciRiqiAH79MnS%fyyV4B~xm*`rvg!f>0{-#(l}CeiCuy&}nc z>x1gpm8;e9KUpOUL$VFb_RF7qIyLpTzy4(h&9XqcL~P-cVBvMJFi3RO*oR!Z8_M{O zDAd|tVM}EKgC?e;9&^p&WY&K$84C=Pagx{BV?oZhkTIixt4ElYn`T?h7_B443K znHQjDw(1_`wYWc)Ryjdr&6cnQl3G^Vap>+JaOor1M&Ph48;dDU461*v3dcrc(P(RH z44Yg~RVs>MmZMq=PVha)QN28=sy^$-UMi4E1t{-~RZ~^O-@3&kRn@FBb@|6upQ@7l zE$R##j>Tou%hlV02%%BAn#D`(Ypa- z9>Dv8YXg)lf>6+-C98ion+<->C%#~uPB^u>v^Y02mrd)e0Pj@DX8GXfWu9RYUzG6_ z7tBeDmy%gMB>J(2t@4mfdLrcw@L_Y=6{KEN;IvbJAQ!LNoXM;zG&hAJiN;V`vxNe7 zx4=ZZx3r~K7ZQuH`v8Gz^@kDb^@k~m|5JZz%+Ekb4uv?uCChG}Q_YT`>Vm?F zsH1gahd#nR%7n3+B8Yh#`vj9B_7I1O=ZFgapYv0PT}>6VyR;-_buDfqo^p-2Mu=4p z@16C>{Ywtrkj8&+3=Xd4tcO!m5k~UEXR_l)`MIIBHzxsOiZgR?KhjetE48QR#JQ}L z69FDBUc%yw;^iw+d;2VWaU_!dy|ZP|Djm8}9vp}7eTvJV8B|ZMy;+{ba8#?IDUbKFOS_?+7SSQ2|u`^v+!hb-#4g*N$Kv~?vsj@p9W=@vFI85UE$^S!ExtjOMy7!yNbxmEH^7+wH zB-%BeZ`oLi9FhZzJnm#bmVu1Al76|Grgtydurd-{{$MUQx*`%<_F!vcI;1F}l*g9| zDfWMG>H_8*k@?%yRmKi?!wKS`j&r`j;SC+V*T(bgcni1bnwF5Xari{Kh9e{D2%+Cy zA(NyWWM?*OG)24{KVCWBd#$W5)izx#-?!GaU~y7k3%|wsj>DL3IcmK+dkKEk3maF+ zoMI5voKmY#4k~E$IIMtySJ;us#vP9D6%>EA!Nwg)AQr%1)c{Kp)qf>OM)0aG{MM|` zur?fRJ}4-P@Io`90_W_NM)dF?eKtj(Ud)5G}+S;{94}?3;hT zP*MeQU~3;r?kl40MbuS9EkzV5qGE;YD%q`Gul311+LcFZ^Jr-vCG#i`18?mi5GG-j z`Ok1oh4vr61~o*+ima9S+a)u+SeMRcGEB6Bh;zzVcLh1lGFyO%6ajxQ)k#jwB$E>p zvlI9Mkyz^i1D!}VmQ0zY^JQ4B;PrpgWo3-P8qSqLg{zn>0?MQpq;MTj*gCJqY0MeX zGP0U8vYL9QrTqHT(04a?G>LL*-GSF1ZR#&A;yIc`oW*2`76x(?M@O0|&&q)fOLiU~ zi@vEA#ygw(dWxQ4ak5yNT;W5njl6oWH{MtN{^`l}Z=5=|W4TF?EjB^nWsiT@z)O7p z_kOWi&|E_MwimZ9-O?GcsebvHH+L@13~hrGJPdJon+d}CZ6#Kt)3rzx=Knn{NT|O6 z^kf>-lYGUHEp$ze_-p@E#iZF(`I!Qt#hnfe^PBZx-FkbH(2QKmw=OKy8y z=WTHj&oTM|7>!p*SIMIZVGVyaf(GpRk7n1*ZTg(H%KV>84j&q5(-#^-ys+(UvJ2|g z%z2y;Unj_g^LC>Zjn-Ccr!fWV1mj9(tfMmnN;~UDch-&WG>q=VX(^dY&^6~fn8o+p zV?Fo2O00IstJx%eX8y}|)y6h)pYi+O`Ofy8eZKQs>|E@e-_9@RII(|2Y#it1fKUi; zC76UjV`ylB0UiNVwhp$Hs_Qg$o6u;fw5eKIHBoh%2I1ABlg0(ya?z2c!#k%{9Z@ z+0}DP8m;=2R8~yeYR!Kp+8$*X(qd$4wUx`hWn|8g`BY}E4;(pn@Wo#q>d&k{w0dC5 zh!tP>`QF{98u^&f7+5p2K7Bi~yx!NGQL5Vp_B3byQ8P8{b9m%8m4dcaMLkR}EAB? z4*^Vm?CbqO0Lst1;D+J#hw!ft=`JvH>f<{YP1R~Yh<7on5I?`4P7AFAtm@rZO`srs|GW~4KN8R7N@apmR_v$^(3nx!N zydWz2z{Z~O1B1cnial$Wj}K--PWp{ApU+Nj`{0YSZ+(A3;%}#a@vZSnc=Jzw-~8F1 zPxdEQ?L7KA_QSt}$^9X!ufMOIB(j`z*H=04NR5-9p`F)%9EYO}+QO3va4lx-v8DjP5O3IqMGQKnKa=hCcFDfpwR79!Q_ z^edELmQa9_8iEHGeR)+?tI&motGz+4P?xGLlv$`FXv;lt$);?9RNcaDO&Xb0vVkk9 zTr+=D6mSm1*)+3oIL%@yA%kuvdb*+&@GO?AUg&o2iE`OvxU%oCPLFf0PYihM4DWG0 z+_t~!?daRQY;bzC=)yjNW*wp0_Jg&ZKW!9(YkoL$i|%!J1a_Ub!{@Y1(V!o;M>pc9 zPQScc*EjaZV*60I?3-wr5r z2QKsuRCGWoi&%Dwq}oMX?P81WGx$w)ZPTWZ4{Zcs?id<;qN#8*;H_pbqJmE<_@qKk zD)^*g(Ln*cu22rav?`aex`BWo75!F&8h_Es0?kYczzH6$=3_b5s3 zZr0WOXHAlx#rdDe7dAf_a7eUkXJb*zIP6zTrp+OsKhd`*Z@#V#0x-c&554r8gDZ|q z_In&0Bf6b^^_h{CFOJ0Z`gb;-0JMMYoFF=ntlU4EZeKRm*FU|X#A6#ua}Hns_>8gR zN6&SsLpy4#W;S=BquWpItpp;SqUetVk{xPFjSr2NDw9SWSQ+qzJ@&Ya*cx)6nkmB2{!{^JT_~ML$uxgTYADr# zGzBGye5OJu)rPbn(gH~HBTYikBuN$}ZAe!T(NeFerCq@g{0L%+4O(r0<267(*ik4* zt;dgy2z()7+Do{nBnd=T!b4D!po^prX&L;R%~Vnw3@}W48>T%E|F+qBy394?8isYaosa&Mp#MGBkJ-Hk*!_PtD}tszGBq__ zLFqE~85%=0^{OeU6-zfO*x?C4tIBn#X$C;bz}pPwU`BklG*fz|#FQc!hzJHELdYG# zLPNR)pkndD}?|3Q~+N>-Ww_ z5~Dpc=Vq$t>^I(<>6gPH(IvNgWkq&`Bkk(QzI8*phC5yDDcXM%Q=OpI$;|v2mhPK= zgL?dUVHc!1=3@$@_5v{NJfPM|-8VH^294$A7}_99rboDAi6F5XE|c`Z zXym*dxYE|P2bKN{RGKEw=V1EvP%Ei_5r+7(1(ah^)`oww49aOpm^Yl1D5}(9iZ)j*bLF~>nNY*C502KbpY!75$7-ltd#1Lx z#w2T~)}nPo>`tMSabH#KerKQ{eb{HPj zxDP|ho-2PpXy)p6oa18CKC!Spbz5E=ymi60lnfP)TVlU$c56DB_PflS^Y@IM_~5WU zwj%F`x(W^&$n{RGUmk#{;=-BtBjI?|{zViA1GhQx0Ra|Er|Mr}- zdoNtzUS5}{AQvh4NKh0)#So(SAOxY}6BPs$Ur2w|C^FUuiK4+^CUHN3@+uA11A1D%KAMoHe#&!-1|@ z%{_nh6EjO!X6MxuradP2CRhKOtzt*;TPdCLjlGG8qNHF~oD$dL+?|}Nr1q#U;PY(4 zKPB_xm5Y-mO5u*{sdw&HQ+w)h@&Ek17_z>6##VV|t)El0W_of;;rgP|^#$>5u9Td# z)F~;h$kc34#^mHsWp>G~C0UOz+F4e#qhfzb&eH8gxr?TbO3W?KEnJ!%os?Hjie9XL z#v9aZil$ui+(zmb&KcPc5hM>#q+Mo4oG80XrOZqmk4(9P31`ub&6JtS<_~57Hl9MyWcs$-k z8A(YQX&#T%DXQe>MG7)rihQTvL?nN@G|Ieu6(pD~%)wd)cZWLdOa!?cJSsSp<%cIkIk_JcYBa!H$)RCek=$}YL1$B!;s(vJW zxYkEUg-!_)ev`VvOv}!)s0CHvdCT9;PgA!VLQ4Y?1DFq}1vHuo>SjWJ1~voshhP#Y z1Et_6@F#(EaR}oMl8qhIPlQCj$}bG!b(p4dZ>vvxqnB zx8xcr>N5Rvi4fGqKc)?jLad@Luug2FED3MM*k-(oX-8X30As;)%in*+%W&TdR6mR+ z_?xIrbW(xRM_o#vz8E$Rb`D4f3&1?E3I1>pD-x)SuvlGm>aNv80=>^toB!U zw_fVfG|d01pAOJuwClhdRQJ8SV}g0=_;2wnAkLzF8*P)BhApKc6a6mu&fi}`iF}Ff zH7(-tARPxkv+Pl@)oOnagAY=QmQPOvf~q2i@4=o0vX%-h?1t^7WdS5T!e^jmnusaX zf%8*gF&8ZI^=&_<3hl2zF~Qgsq7AGAQ>dEXr{yDoZK5>oHA=JhQkr-Z?PFGZS^%X1 zSbnWBfYtyk|3l-0@QfKl=HBz*nz(JEMpBwBgVOjV$_~U>>u`TM#1#Fsn4$M8SE)t0 zsyDzoVJpCBuo)}{tKkm^9sB~dh$MPZ`M2I{QOkb;zl9tF#<4`h7AyBDkquIZwo*Rp zA?6zPq~2-RTQKJM z_%oEkE&*xZqaS~W8jY~R9sSq9N$@MfzY472V=&)c_-29ChW`ZE#naI* z0_*&9?BpTnJ3+YN>jtOTtGNHC;Dq7(5`4~3W3UgvTNry0Tu04eR38KLz$E2U)FD^F zrzTiSi3ERZ+Y7s$?KW(q@?YA^Ci&_Wy;asAyd3(vm!_IEg!gw+)69Co`*W$yX1(D3 zHEM%-MjddN#`yFe-?-e=aNTX(1Ks9tqBb#g7<%b#kXDPtGohy%(JN{hRjOs)exD{v zEoAo%jY;)u8FH(oTV3KD)tS15we{)q4L!O};XZ%e;rpr5uO&^Ue(NAzhJFh66~#F#7mP^lbizUtXPqCm#>cKM9g-g=FY@Ag3Wjl zFXNuI7Uuu6d_B)n0U~LwN)z>BLm=es6(fbnq7PWv%gTEoR zSI}*6manAk(1I$&@i-aN;9VKt>OMLGUz_y%EcWO{Fy3b^-+1;mZ2=d2R>Yy^i^F-a zERP|D{T-Unqa5G^${F+>=s(7ugN6V;fO-;FhE_u#6kD-N%F9`^=@0WAp?B2*|4Ku2f{k@5;?cn3(JAv_|afrKD}0_9QL zQeJ9#j*&nCCz2qe76U@9#g15%f&&C8BgU5U2NgPk$U_D@(h+j{t$of(E)hm%{NtN_ z&OT?q*4}%q^|SinSNl;vRCa&D)Z6_>UoXLYSOD{!oig3&Lq2d_9)~`W{j$>TE-PJP zl1prgeGSBoSZ}|KZkIO{^yeaXt7N!UGMx1aZ8MxVWeD|Mc+R8L+-WS&e}SRAkEWb~ zE$-(z&Av*k-pu{|EBbLW|7|8uYb!$%9>P~#$G@N9jNdJ-oidqZRpWn`FGwNea6a1E z|Da5lh4vrG+0yX`>74DRG8lHiY?uo7K@m)c$uP?BD7INGE$zkl!8!QDD(PsKFpu5X zV2E_(Yz(va$SCHM4XdFD3ZW-VHFMs~`Ps~Q<)3fOuhSjRuiLHW$Nd-_xke7LQ-)dF zrN4DjI#{o8Mo!5D;&Okg^(pnI$WzWs4rPvYO!6XoqyWZ#pSD)H^oaadeqxQ1-qsM# z-G>os~yl!|D4@|J&savztq%I|+!T?hk|VK^P5(WQ1X=403nF7Whz7 z+~3Fmo(B-yHJ=-tFhT}XmmfRCeqAT7UzaQ>fcs%$@H`Hyn`PhUNhpGowZL;-AR`r-cmV&TWGAaLCY9-iS4g^bE_!BV<#w z2imPzIz?8H5B$r--S0`{n4b^T(GrrNb?|;~9HuUasmjClIqw{N9+c;_j+mMR6=BT0 zC1tmvooq9FaBF}3yegnhUwZGrE_mAqObte5tP;CgWJ$G+ZeCDEOsv3hSi)aaFc)P*c6m=we<5y?~0apbnf1l zVz)hclM*GzS&L6qe$D*JnN-th&Y`*$&DbF%IPkyBgc9*QFCO}6q*&WzNx%jLO|mSm&gZwx8H`>km1W$+ z8`LL4bECKFU`*9ns-H|ehE2Zq67kS%wONe$jZbZc&y9UbFm59KFQrU^wTitdlI6Ge z*X_?+wU(B(yMuWo>R4(AT|+o#L!5{tI+4gA?ahDMrvGA#qdvaPwBC$+P_eJb!SH*i z*Ql?scj;XH_OX2F9n04;9?6Iv^E`!TJD^|Wlyozkl~hHpNv2}OhzUv~$x(H`|-s4 zly%OuoLbdlS+whAwANT}FYB1eI9+utov-RK^(oAGxP4iAh4H9ie9`zo|0kSG@2vfp zB-@`61IlEIGacIwz;5fLJ>$M)RZ0x4GZ~H33O}A~)`N}=*r+;>J*sL5V=fC=0%?D+ z7<-#F>KxK>OA)m`A& zZ<_d6fc|^Tn&n-JK5FVW+ApI4`%8a{{U>}#7J93%j5GD*oyoZ*qg$ql{BT9&l0HSckni)?vBJNy7)E$#dpxrjdJp$U1*Dm(F6& zLCz73GqP?xasX?&Y;e9{{j4#%RtlmoFm@qvT{Wt%m$ORS-c~>FYens6dD!YSdBkj^ zb!O|ok*nyt&iIetbH>n{I%Z&ZDaNCbxC^LEjg#X7Q_B3l@(%d~WR34+U~j`=V`Sz)bp`;S_)I?6Wv1*D;qa&=LBB zz)(AzZ)%$bls=o_K7D4rT_9KYF<>F{tptHi&^{Vvj|0?hH_>q22aIhh&HnrJg;LJK zkT}GYoQZ&Ypk=V9zYNN`#^!1#i1w9-75fNhSXpY$kZaD-G=DAh(b)VG*xuNEBKqP0 zC3A89%s-bw+vtB;&&Gdjq(02s2L*)hBX5z;0dJ1>h!2k@`g#=5&W%_`d$Wk2U1*tz3R&A0vl&$mlxXPvIZ%aaXy+W!6-D z(OK_R>wj9u_h<2WlcmgHe4n?^v>OfhI+qy89iQT+OD=zY?#FTX{%;L^t|6D%AkP@o zx1aZFtVg_Srd;9e$N%+LABbN`apn;Na^?BZ-x)ua!<^N}9fv*mk9TB@i6dn)(Uh#& zjmaeJw2?KBCl?yezHQXL@#QJ%+l-xpHqj@EOCL)?tR*(NihcJ>TlZ;f-Gn{c!N1e6 z@nv}co??H!HO_Fa#{LAK(#$(UtSxkYK%dp}IC;TFXB@di2LC@Px!CI&OZ7}C`shpP z=1!AI#!kP$?$zWrf8b8MhEMDyiP0mhp(HL=|DX1<0j{dJ0`R%_?!6BK5~@*@AVLiC z*D(|sY(=X?Kr|Er1SI?z5=e>&B1i!V6`BC$uTy_ZLnRigaZoS=wJ;82D=^T4q>NM0 zDI*RY+o~|o(h3xq5t4iR?cV#+mzQ6s`ewd4`*U{R*}c1G&)LQtM|od04-kXQ;!YMz zj(b>gycy&*A4_+yBl|I0vYjmA5&een9qo&Zqfg}`nZwPJa^6r&=a|IdqVr7q8urHX z%x!!c%!|5xR-cB*+tAPB4`K&9n zpN;h5I?RJkuGaA?INR?8Th(5^c}lR=+Z=zKQg0Cl?&I!{g)ZAyy%lAWog8h|#R`@}#%Sw8!83SxzZ$`c=*g=NBK- z$GMN#Zz-|MiG=thx}*Be>N8{B;Jdk#C#1qzC^@XFStRwJj&98*3871T?4?=yLGCxm%G_5^Imq%1!P`rOvG{=bYU906q%r6&P!``GxyH+=J9)wNZJlK%EKQUihzC z>F@ZCDIfU?H_>Kurig{-BxWEpir}6!f#kw&_(qgwOR{Xz<+y{pM&0`2$_Kv0*eBrJ z%6Nk>A=c`55B|TwbUyCjfd_3l0`m+z)Gi9j-KjN-owC(G(I<1^ycMPAj?Y+1P<2B~Vr=^}vFmrM3bWHYoOuM;tx-I@gUjrGuf${iply_2p1 z?U<>>ODhWR@T;NmLw?Z@v6wSj?CWgo#a{iY-2#U-Pn>L>VpGyfo68eiAWR)XePT`1{jGbC`SVt`f0 zXZdz(Q)dVzEB74GOH1n*7+bXve9urnt?`>$YbOqY|FO~V!0k#_{<)}k9P|!(@%@w9P7~+D z>#*5y+kG$&@BMIY%%9^vTns459-QFVmFYfxA8;r&)HnPL>t(NI)2!`XpGY0josBIW z*==b46@C67YkK(_ZK~>~t0r{8H1F1u23q2z^n+c8+Ra&vFc*`Qaw z@9i&14E!*1UhHn12@zom`uheS#a^day&Kl$6Uxr-#iMMPCi3-j;z|d~hCd3+gs+^9 zhS-`{j3tAc&@DQ4! zIc!On5B)*`gux74);@Z6?BDA8l_gkF4byd|d@~PYc6%Kn7n)RFei&R4^X#j&4|U34 zXzK5MXjO4HY>c}l%enj1hmo<4bR%`bmCQWbW>~HmerGx~uXKGJ^N`Q;jOf5+AjPLkJAvN87;Odm7ygIpL`{T$40Mzo-@#>H zn!q1N|DYd+``g}XmN>hxoc1HB0q67NE(_8zQ!O^fS^KM`&m3 zUfA!p{Pyj`0!px`pO8RcPZe4FHz%Qd51U}7YT*SwG;gvi9^ zd(B#$IZA5G4<9icWG>RjXHcYWix2;EID0Y;FAw`@mG_<8Hd7dOYPAFRiP?jvR` z${lR2oq2tyB=G?ob+Z?;E-RG-n_7*~+9iWJL{$xqim>g8T0UYs`&%++yp3lyf1~t1Q^%##0d@kmw+n4>sXmgN*f*Xu;jwe`0#s+%}>ZX1^wvIc0{_-HC;&Ph$ z@wB;JE#3Qxb0PlR&>_oef>qKlpPISh2yjOq@nvtWE-D6zZFA1cMnvf@i2M4(@2`XR^qNm^`6@9;A zkP}3NOEfAAIE;?uRz>KkoB1KW=88sRVpKG{O8$ydZzc<~>lLtc{0aM&5lGm`bbL75 z@O$t4{D_Z^pYgw$dAiwmGUUh$m!-&y0qiN8q@1L~kF>g0--A@d-xddbEF{Wve zYg+@0!YF1%b4Y~AIn*{2AZ+y44O8V+OZi5)$p!6JIKNJ zRq>B*^O3X5Hn)1dd<8j+fPN3j*3NcS$`tcem}VjsK0<;;A@ZIyTC^I8tV$oUv<)fe z&1Yn%5~tDT>K|$=r1ft8oi$x@iX^J@-1ZqH6@7!YS7f1$YAFQ%(4UrFtFpE&3IOg0 zbA-KsZ$_H|Tn>1W@eaq^n4;Lgi{s>CKV~+C?sTJv}!*x2bBC&}4)3Fe%#%9>5RMM{Ikj0^Ju*!1tuSTk=$F zVUgDJw*4*k5h$5V8jat4p zh@YD}_7v&EBzeao^b#M&AF4iDOkqq!@2il91gE>TyVY%^0MX;t7Hov-*f7^Z$76Ca z{cQdVOJh4x`s*t0*K)8cj3ZIO7VOW2X}-8Rj8 zX+B$5(A28}07%zP|6NqR`2E~M4vJ^k4#IJKxESkH48!*HKn_7hLDL>ze|f}961{Kl zI-@VXbk-VKX2W`xH*^fVL(H9)%Cy8_v4du-6Y_}cDTw-8Odu>huDDSc-Z62fbni5P zMVsEKm^APYnoD=*xKkSGoo^FaeejOg%ddletx4tx2wqxXg5uI%|LB)$mMWAEuS;5* z@Zwp^f5w+4j>z{(uZ9|z z4W<_X6cJw3GQ7%`S&kn*rA3Hte=wg5Fvb70d3p9(@eX}h-$MhR_-LSc`r^R??4gtk zO6gXX(wt7XPma>EjS^6@t!1)``BCWS)RoY1mPdB#rFHZslorN&>XKFV4lhrpWnT2L z&Ne3k9Lh|6uX{DOe~&k>J}>@NCz}<50ZJJoHtgZXF?AU(OCA|0!_CK}GxZPT z8q=-PQgq;=VwHPPZPg4nC!y8wbfbmJ<|>RB%<;`Ua!dGjxPh&kQ{ye|u&0lMxk1rK zYV7svHT~|f_3HER>=fzka((H$U8xPN+p-6apo_G5H?+GgO$I+^Czf^CKbJfzThrJ3 z$NaDf!+2ytg0q1qVfC0vND#S?eFliUqh5}5@ZslfVXR`0Ph3w~e#5-<+{EXSL+|Am zA;oj^H~vRW3%j<4RRhZ&_&0A({{n=t&L0iePm;SH8I~BkT(~|%*)0CVp&Ub*8Gi!u zQhw8$eolNWZ&C(dTc4Hxx;6u1MQV_UBW^{o;OB8&4;*mLBFQD#DArdQtZfoY=IyDE z-LfMaq&I)AUkwEaeRE7cL(WfsKVf1W$Q)cfCIcr6O*)9%&8rA+W>o*zJcJ2Tq&wzn zh`jM{)?OMB8;!Z_0_PJhER^s+^jnyR!6}EYG8N5}iYoUlNPzGIPQ_p25CA zdWOX}{x}xNb_GS`(A*lQ*+;)?+Ku6~`mW~}_t1yx$8B43dk$`a-a@U%Yd9Urgv>X7sb2_=f_4s7A4AndDQ6;V?+qB zJF@Iq7f8aqH9Fv{z!Orx=J198Y~I|n?m*f%In9rCB(NFdYzFd6?GSQ}VM@TBGbn)> z#9vRArna2RE?=6%VtzfIq`K$eZ2of!#h>8YXhx0 zvb-`hzVkxvzOxS0n(oAJE_3hJR&8RGZxn z(Vrb&ovdA5z5po39@t(x5lJV-`mJsU;29FtJn7jDiNfMVW$z%V=IbtlgA37KYW_Mq zM{>YzHT-pc_uwA%=&1Qbc?gLnFK>nQE0(QGo?krK-80}~GWenRg#KD%z6RdXZ*Zo@ zu+>scux5W&iTNumuG{#7%!_MWD>1uhDGkpt$q>@KBpTQwkHXqULN(Xf5!YY_g2bWc z<$j`ER#0A4Wgf-jXo7EJCgH^Upyx&(`l|oQyo>Hz5AxTCbW6%Ovf&50MVx|aB|QNX zZX#13RN;L}$vyWAs;_H~OjOfu-ORjNxhzTAXo(ut9^e&i+NY9B&XBG1jN1qobx@=p z8`#sPIl%mnwM|1e>s;QWOY(~n>Nx3inC@_7e#{}Cbf=`+n9j^=&43&SJq!n_Nzc5R zsBF1fG)2K%y0`4S&hc8j>+6t2KqMxV(#asz`0=6iSE)_d(X5);dC z5=g-FnRk|;jN%6N5+0p1DyPx7+JD*qdFo1NWenSWsqd`9m7}!EUNL>J| z66ziuB-mFKR8dNHsG#RBgb7B7L=EWm)?w61q$bjYBv%1{*b7mVjl?raRT^qWo2^>p z@BsE225xZm21E=T!N%3k^={;cP((4X^~}v2(3HU8TBncDgF%^6W~df8qT1kYrCfHj zuhf^1Szd*s8fkyXm$3wCPw4WVZ+>74Jb0F_f-C%xS^os?Wq(VX7$Ni;?bej4DbkmQ zm0TLK&+*0OU5yv}zC$E3!J}s!`a-6$`vPL}Xor5zX@@66cW7TPAh>6X8Js@^_q9H; zro+G)1n|cm8qfGH-1(O&oAaAc$J_ag%TsJG6Rw(!RJ647rX6+*O8iH~zP7&PWAU;@B8*H~^}X@GU7 z7uXryYglEvTZ$2v+!9nfa1pFenMzIG3YQ}VAx)h#@D}1PNoMT|q;IW(1-;$P(AS zW2#}h0V?sD@pSSrH&hnK|M(hUrJ(+wnS9fAzI~By)T2W2Ulsm4Ae2%(Ba$lS@zOp! zYOv_=VT<%LySeqSHM`T-@Tc`!1?=PQ&?teF4;|#EoURAldr@El4oXbWa z`*e8zxp)3u9}P_K=d+yBogOvN-4OMlgBE?sy(oNpY?F-c;4lUbODIQ?3cZwih4TWh zYIl51bLE+a*=S3292U@U!hcCP;rKGTt(nOY?KLHALV6K{k3$6;eWKo==yLTknd4_5 zUqBxxfj0``+(GsIhNB`zCx)a?;%qkUVp?TL;YW@# zy9gxK8Ku5Tu)749cLc%n15~M}Aob013(6p!TkCiT?!cmzdnoU}HokADJUH!1r}*#i zxnf<8#LtLcxrK!18FjNzO3$h0elfAC%#w_TD5~R+Qz79R&avHp?H{?k!9Id-4S+Rb z!-l5a?}YKI#*hAO#H96wIc<>Z2Cr<`kyY;ikEB#Fh}RTokIi%xdtA=gS?z`MNAQQS z2s9C9c%gr_#RuJa{4B0(%$F=aD<95AbRTuhW!%m2n{dATam7|E%9#8PNAhx?!m%k8 z%wtrf2TtYq-5$cZE_^t;ZVwOE#o6#r?)d76-5n!~(7ik}o?qxexi{QJ4BBssGv}uI z%lFWkuInw}Tj_JsFXt6Mbp!o#~7ey5yF|KlvLq3?#?px6x#TD825SD1|JaZ@R8!gD* zTA=N%kFo5J@!*UO!+*o}m;50NY<&?ignaq)q4*>Om>tf$5DWdBj>DiDZkmP)rieIo zBwIoGM7#tN9{E>ji5os1Bb@gLQrEl4-cihgEq}ROfv#}BV|DN*#u*{&jkt}Pa%?%K zjB);D=S)Cd#`?MW?5wCKY8Zg<7a9R#U6}Wq8*&iO30Mc1%2Oay=zQ^dEe6Dkt6q6 z#3R4u>kH~Hx&k=%0CVCmjWpAb7<)2T4fOEc`1s(fD4(+7`u$T)e)Cup7|qk)HQaHI zY1wA9Elr{5SO|A{BuPKpSR`~!Viq~EGkwEYfHWqy!OAJz;8f6{nvUgD%9v!8%8GA} z0{f?kSHm-!xhaUuo(mOHrtG?cbsf8=T5_W;7X6+`63&#^@Py9Hi+rV;rR=nvW*YI5 z=WZR+XUc&SNY`&xpVoD;-T%-j?>#cB!5^Uk5JKP``6RI#-0)=}BoBm2nfmf( z8skT-IJnQV^RlevObTTgXe-aKLpt&SaMh)M4vKUs9}}{K>_F%suk_V{CBMC)2Gk;! z=lYTm?8!GvEt;(}@(vr#HXRilNWD8(9W+%$V+P;Han}eT&h&&YDKzI9vMSy-soCt? z7ogfx?UPxyRJ7SyCS3kA=X$VYB0hwrT_F7RAqdTy?Sh`X5G*pvccAT7W=#zMgB$g6 zq*wmCZvQ4Eh?PH!N?+>&*>8e_-f?-iM(PARTX`w?1`2i3@yLDpGl7<>-1GASX4{t}M=2l|tf zj}q+G9PS00fCcA_I&rv9s2HXd`;rx^VYVV9mK9m|Esph$*cbV)*&g*iS)wUzk2+h8 z(j#e4R9NAsMA4=%?}j-vK>oK))Zx!hO{Kt#QpUUuwOVVnN!5mO0x`o4k@r=#8qHPC z56Ts7VY+%lHQRC;snht6OL0SkB7Onz=gpu`+u`)k`zs0)gV4Olmm2g~=bAyGcB)Ic zr~@&+=ckS2X(kcN(cjvo5xvn*ZCg|?ZTWB#+E3QAe=QuVe(S*p0JtneA^mGr+hP;y z-d`c-nhx50sUhiCC9^0_!Mngtkzt7F1UFhwcbW4j4ru5MgQ}bEaRp*;YWSz!Go>;Q z@7fa@)cX9*YLdSY#o*s2l4YrAL&#H}D*NNct^9R=Qq_8Hxj5qcbM5Qo${2lZ1Tv3TDg#PXen=3>y^j%j|%%-GY^EQZ#~;R;RkPrKU8y zrN;g^sI)n5K_%MC`p3eG28zeI4OdIVRuJCP)cYZP89gFDKQObuc$j-BaJb=f(eCm6 zpZ+7x-781afmP$trX1N#{BJ=KBS{C|f2dbA8&~;9?4}mF-Nw$Lr?5}EMzVF&KQ&Ur z%ib<>zS}U#Wk5i9{KTHVjQqKq@6DJ(oOO04j;pPv@frC<$_<4xsSdKT=MrXaoQh;VPt;n~3XZZhnp7JH>QuA{8 zWfAACtI}O6zuF{qC{zZ{O7)g_55`xiwZsZ0!|daJ`*iIp*AXK-k4e4QU&**4PX)4E zP5&g1I7)lMJ=?=xR>CE>&SvtqbJg%L9}E9!8U22o=#(xakCS;to|T_+Wp)z^t4QLg zzIZ_o+t+PB@EJ|DOM?5*|uO6)ScgS2tu8Acx|5RD2sFe5*uBy0$ zEOmGScs{b|nWCn}zvbzZXLX|^xYod+%DJl~Lyg5WE@D+5OL3LeK9UaC$=bBk!r58> zx39eA!L6To%H8y;3!S`A1BI2Y9OYfNow*6hn@Djla^D&s^0inqJw3$n zOTBr9xEs%=8hgW2OwKM%CNJeqZM(Z;e13FK3hZ_|xaHMVj`_!b%+8+06uUa+5PWj3 zSmA$K*jakC>yD>%jX;*IJOCkJ+rp~-|D-E_3l9@CfPd(z?%ihccD7TXa=K|O!PPW$ zwZD(m3?|Gw*aWBb7Lr+I(t1b{dyS(IVsSk(Qp6y zr@fRT)%<=QO=eB7lf^9GDkb8{VT}^i#ixeTqhcN+%M&`6sgVag0%~_QPgwWwd0UOs zMfe@rrj-BDr>*~ytU7?$UC64g=#hWL)C;z=Y0q{(cX;+9Zkcz|z;;6y{^_l8;*_;g z5qG_L-kltEqL18hQBIVEQVWgx+(qjoP@MKNugo{;rczu``(i!8VBR(Zg7h?=|6+c9gGfNcO(dZS+6kEn zV8aN*uEXr#15>OK8 zzf+QfCn4b=;Xp|TBZMLZB7`9X<$&YB@Zhn2als_Vm>~jYkY})Fpl9%A;Aha1z>dF4 zhmniueM3}+oen1nC%zQf2<-y*!n?uTBi@rA#!FZvsS`mGeh@PVJqzvvTZVt8+A|-P zO~4}g40t2B;Tkq10Rp?eJhSa7CJ2dse0dhw^GG-(nG(qh`os0(^-Y5pM*BHHJM%+C*A~d%&ML_jD5+MLETK zzCQEr*(T_c7>4>n-k1+FBru6Mg!!V}Kn@?0MqH z&7R)&0_J4Aq53yEo~NrDy)EW|I)6u!sUQ6hq5%wkogrtQA#;3!hH=uUmWFWvHOf7X z17BGXb6YustUoz@kTsen2>&aRQ2xx|_O4Z|`FQ!ykiG+}ZL0&TDDxB*E&dx9Pi|bE zHT)ku8qU>wr;G>FaBNuriKp zT|vbbb$qF&3jG#!bSYCw29YdKS46!}y-j^!D&f2SjDP#o(T)$|wz$m<#cz7L$;5}m zXX7pd$?Xo@@RZ%qs&Z3;_O4Bmxm}(+BJp|f(f*0`P3~e(vBaeljYvI$-!&(Z zPqY*?&&Hl-@b0~q4)}m=L$h}jIRDDjHSLg~-~(LzLyw}pUpSXKhZBA;)z|(qYg9QM zncvZ*)R^cw%4&b$tjvK&QQd-S8646iPU2#vGVY~|NN{B`Y{rTJQtB;@9B!rG6X9`hfK5|4T6oVGVO`_|^kjmpafsfyNjB{w0B z2HJ-Q?&P)Ed=b^^Go!nsxaKW48A&RHZlLGa75*Z9LJf`M4Y5&~eUbgI`~Lfa=AkZi zoSjmgYc*@7J{|zA2Xz}=+i{>SM~6hacDwXrnr*uIsLHx-5xoW`4SXtI%MDa)t!Aw% zCiNoi?fS42>r`wEF({SC!3;gKX557gsnU(?&D_qSBk^_^p;R(naS=3|Qt40rO^C0%7l-su8DIt2RhunhLOZJ2b0QDssxi8y2cr?SD59 zVb#MaLr@>RFAYCRM$~{hmQA-lRq0laWK|;a2-p~&W*m?KO7mwH5r@7Lapic0Z#Zz@ z4t1vE<%xNBY`5;YFwm$lg8JS%f9X{zBmXnv+;#ATIz9-iqtIW!lA9SoTuhpDDCRyc z=}(Cpr2rhrK0X~77mi4|)MR+6u{sLJiDKbXD)3GeCOyO`_V~HfBq!&)K`Bk^N_Z}5 z8m%5;nM@0lh~|?AnWH$~T{Rnpu__f43Yt2$O|vPgsTwk}Tq)0Wu2D0hK6%vwiZd1y zEzvbO6^B_g@~L2@kx7?O;R%Bd^*MX(zYEDVBLQmTeTdRTLYU*g0!nb1xE;;LmYMQY z?JRx+>k9mG_P?VqI@*fK1_Q;|15xvkl1n%MwB!l^NqZ*L{sG>*%XQ#yeu4EClYd2a zE41Zv;WzX|9k->6Z}IUB$>s9P?)y@>AU)*)vK&;;M6q^$mf{QH%bv3kn`9j z1AHTp-*(R)-_OtW?*u+mA38rY9{4=7Put!?AF`Jsxqg1~g6f`!R_k2e;TD-d?@2)Q zdl3-x9t1RZ_ZeC{9xmITJ@V&?RXfnt>0Z%uS}Hc@k0>lDT52w5H~u(}T?#1A08ka3 z90eX1SPo4XW<1xp1`KwyZR#H6+lX#~`6Zf7gjZ$$pzsDbWaHAhns;KqFORq5ey*X8 zIetuwk4}DE7dtNs4;{hX4wiMR8J!qyTNY~}`&xq_*=0v*4JIFF4M!hkjnZyr+fqN% z1zMlHwo-vbyq3d^3W3#1H;Yo6+)Ra7HZt|yC!3hMvVyV-3my3?3lI5f<=|@Icv8($ z$EJ#HAoENwIqS^sX1q<(>tKMaE5C17j9m1RvA$E zv@$F=tg4&kTNyhZ@SU@TGHz&E@#%%p0*G3T!IH&F4T+sIJZ zHgB>H2DK=^cOhywZHS-!^k7p>Q{QB@h*a0pYA!6CucKbCpDJk9PH?Lx zw&yVqmRZ1Us&K8jcBKIn!lPf(toa?cMSo}?7P&TkP}F)1L|Np@M$fclo@$*fx#=IQ zm`Gb2d#N{8{X-o#V65Qr;@(KMLU=$41O~uDoPgzN1t1d*H-Pvv(>w4T>C4}ruLCw8 zd{~*>{2d*}r{oS^bFpLyLQhkWf<2R?yapV~2B#cq(X8xPaI z`h4h+KN~H_$ap<7TlTZQ`ULkaotK>*#>Z}aT4JI4o7$&O<4b=2i{U5B=Q;A#=V#Nx zPDF}p)$Mo-EkB4EuSqF7Gb0dJZiroO09`M5BqM~pN;x$0CoY;3#^A0@OrKWFZ!0wu z^jcv^NfU@LQ*0ot2w#jDJ6I`9CB=vs>X!)1OEJ+)5wdqNmiLYe`ZlXx6yZ@EcSj*z zM*$lzNm$%Z2&`RF*I%JOzbNO#-#Rf){$A#WKc7aj+(BrTz(e10Z637d#;Ey=T3!ID zFeq(>ghy3`lU4LZJ|TW^Sd5VrW*3586h;Ih0bHnYTMQG3lM=%ZhpLG8&OPzG{{s#_ zR>eG?*?W!k(NFY5(7Ubq7L8{mnXU5|oyg`U@srWNnz)PQNtAIG5;JCyLJ*b@TT6oc@O41WZ)lh8#U+*-7c z6W7I`+@IiWyPRuLx=w5ke_ZJMROo-3(Ekx#i@}nz|?<)&2RDS^WH*gbSgoyvQ&G*k^ zq4)Cl=KP0Q{}shoYoYUho8Hy!zQ;4ctt)*~`uOFw_imWpFW_G~Q)a-^r}JUa($QzW zdZ){pf_;M$(^OTLP;4ui`I-xs&TI}w3CYIB!NHYoH~*Cln9HbUVH|wz4<6IyfpBFH zfT7Z27#* zesO!eTpYT4eK_5OhWLdiVHA=1ZS%)e9u@dFsf(1Bi;acM!zCAH9war~kxEKdemNq) zK|zHj>!v7Tn-9~sHLpD22giYCJ18%s{>NYput6E)&dF?~?p&=b@clciYSNXK znv`kaY-ing<@mLuuJQ2jfTt6JrT~^o?|qr)czFsM(4WNkkT2*HVD^e}#l$D<3hE`< zAT4RJ&~(-bf+i=*?KjJmzVW+rH3;yk)EZF59vra6W&gFUw)I7S?mX=ed&2De5aZQD zEfCyGP4V+C*osY47A}y~s~s$)H7^}GayqG#VjB?p$J@f|6Evb)5_z_7&9yg$tWHQB z1z!>e()!Bk5f*+CHVmCXKZLvob2I{tln-RtQAA+GG{p>X7bBjYa}6lpy5@5z3MNh~zl*o1!l> z-zmsKRZuBZSSN}G)V@Qii4QafDg1Tjl`dbVY>oHpM{1g|qgfSQ)uvdTcu*-WN&e@| z1$(3A6~eDVI1o4Ne8bHn5|_R(wtGzLM>3SeRb#TN-OR6(S74VEKFTsadeB(8lhVHk z1i)s9+iDSxSw_-F%A3yai`1ULAUMP>$a~D9zJ*t!t#mqQ2b!hE)raoj zFE$|B)pbQZ?j(Dn8cuLsv%R6#9m>l92|IHb-uU<2hud~SN}rJ*NgtqYwjGNMWvmEva5w0*-IEkDEl_65iZLF{8x$P89wgtDF%7*gkY=T!BucKM`8Bs(lGTw7cxOmv zs>mG|s#FNhSxs_qX&WWdpVNCs_m&o$*X<|lvyEYldFaEFv642D!I3c}>XVWAKwb2< zYo%db ze$Dmn0cGdGs*~xHi}oGmFnrq#|e0Fh)y8qghiu$bLw)H-4xQjV2VZf`V^tvCDk0R z8IcW&7|4w8hJeDMW%#*Rmf63F!;4#?b>ZXw!|en4OI;1)l&1w0Z)S}eOFYpMR%B5!ukuqHA8H6uYZ|pPim#I zrz)WAkc8fY+Jm5XYRh}o{2I9M%Pa6$km#j*KdPm7E=yB_v6E?TbXtUpwPn(9akI(3 z&Y(DCz)M@Az3+6)eg7P{o6pDNwFPcNdt*RQU9kMVvB%F=d{cy|T&SkE5GVqSVOTN{ z{1BXLf0D>9k@f+s9zL0c!YS%ut2H154kk_ZHO@5_cAUJAv)7J^wpdiCAv&`B7w>l$ zu9|MB@H&HW*w-nxTg1;)BGU0QzRHR0ox@SntJkZ2nBH}NsrA@T#}8)A^Rgj-_mBz8 zYzl%^dCg39LI!t38n0+O)}Z(PJk?_Sq1JkH6>c9%!+N0IB?O=G(Rde<3O%t+U=95i z1s@)hTon@ByN#tFdTT|C3!0Kxk}v{d+-;T^ZHzgz6@FzT$Rmn4FTFrHU@P~4(xAvF zFWU2WkQZc-w?vTVzzwkuMTN(o0f85`8Z`PFQsgelJS)ZXEh(s{WG3DOA+TZOf2M4_ zs^8?yB&h*yqcUc#3OaVyLcD<@z5$Y)o#|lIZ_=~V$rf9PGQSC^4r|r7r zL07uoSm4yjjm!y+EEz7$5tv5Q`^GT)CJ+q$Rysk6%@JuP2n=HMsl;&_q1l2~6}V zk3I<)^x38|jB1qTY#wgXUfy2rP26~W2rmzwrXW8(b{Q;B647o_V|0lu|0Wv2xG4o1 z^x6{EzoPR4dPc?EliVNY<7at(f~%HSr@jx*k@np6h=ZK?jMy>3L;(|h{5c_yV*y@E z5O5G^v?eHOV$$eA5DerrFmvLCG)fRQxZk`u?P(!JL`%Mtgouk*&Xjz+zS93>>-4}6 zr=VB=M~rWK{g+_PpKbGz$X?P@Cg9_pP+iPl{}dZAf_fmek%8kMfc-XFc-8U4q~_Ul z)IF!E|QfQ>_x$@<_e08uU`}`EkepjK~@2H=`l&&m( zbhySkx1O>!Uu@A772np6p?6s3A&v?6LtMX7jF3MAC70WK^57rK12fIrmrW|pa9OFs zKCc(>kk8`a+1wpf zaDSMZ0wLzLI`33a$dm1Os%g)f%%$?@+|?dOvcq^?Z!TOYG-FtE)>)L;a+X^}&&Fsm zNR|#^wM;Ke3b%g_bS!lawtb1Hk%&HO}Ok+avgUPkok(qFv344Y8bOHj|rpUv+^Bfw+0!?qmn&K6sK$XhJ! z$PIt@(u*&ic3oe|_iiss7f4W{Q(zk!`C}Z~x5GMF4=>YF$(`{!?V*ErRi1+{;5)+P z4Z2D>nq3JJdQ?>3q~x$GeDq}UubTr@8ro+Wb#@r+;_r#nY7wjcR%cecJqva1|Mv9) z@G>PnKWdf3(;!Zj63C}uU=Os@iRyeF?0oh|aWG(&dC{ihs9%4bc+K~;@80mM%bxgx zpv`}>f|gA1ckfEXKd;uZ-WD`9Uz<1E2n}>`@{>?Er&9CN3=(V8 zMCD&$7zeyFU3sG}pB_PoxvTPl!b;v3)V`s@vj ze(fsr{Y7dXtB;Nv+KQwpm$d~`@LP#~JyD0xzCyZyyjS1HTCn)qJKwn}=`~L29fqmr z7FwidR)+)y$3qyQ*m@K~R620wSb-M<+mvdAY6YdJ{o(L|`|`8mf&~9cwrXU=r6PMD zLdWRVcqmwh8HXP!FHi{Dvme^Z17fI|ERd_8e;nfqGRnPYp~FB?x+u8=QE0ICIMnX1 zjC_2_I>at}q_Zd1-?lApyjuA**|E(bN3Icw_QF@)Js2q>>D~*v9eRLbwQ3kIQcH5V zC?O~DO0i<@4_Qry@Iz10C6Zoh1j^jNrzAr+$%7Ks5@noHPspX@>UxUhGJQ0H64;>D z2csbTJJR23gCmuk;_Y#1{c)TO=xkU%f*8ozUncc9A8HBo8pZl_aSSzq>7j8w0qd&# zW2O_f7X`mbBRgVr_yM2}%K%KX;yF=|jU}o+&4-!so8d36FAF6SIz3rc4D3cB7hK7B z;@S%g2F2%oWie}m3OABLjTuv)3M|MC*^;{CbgyXg5d}q9`G2T6P!Q)vELCd;D(X*l zRx!Uxv`FT_u5dAovZm!qE3R(*`|~)xRM( z=ZCz#m@F-ET?ox4GuRB9XNxgbgFMJj+63jwtzhucZ^7GI@~uN3KwIhc*7firkXpzq z!q9KZ1*%RuB)-j20}z63R=erf6AWf}%rS1%d|{=kr1^@ugLQkIghqvp9$-GHxgnnX zQJ84E3>ckT+=#%L>IpmS8w_7Eaw%`J@Rzip#}^5-hOpK~h-M&NWvNYgMRso?w}Qm+ z4zW8*#g0$Jc=H!Omn3sJR(=p5Jo3UY8XM9Zw{}PJAW1HvX8JodS3$O3GyB=t#snyJ zaZlD+^2GgmYI>Qd_)1mU1U@X`;jFME9=r1J%ks=#uMUu6)QW6v`z?=K`7$C1aat^M zj`UK9%oo#gSVr%Tfd9MgmgJE^LU0ucX{5?;3c1H*jPOQ(e?J1+g=n+R_w`p1%%(xT zR%iID{+3t0=Cfvixi8$st_a>z;oDRoXI|thtWoMsHv;Fi_*!`||2`iaQe$w&)Q_!- z8+}MaW-9=}oiImywXT3GNjTQq0CI<;`Hv2zd7TWP*b>q*jk@GjExT+nXhnmEKSvkn zUMa#{?%*QJj_7MFi;JU(LqjZbRoHx(_w5NX-Ww0W`!9R1|g3LiWE9-{^jJH2l!`1;jHVL;{TvqCGqiGKyP2;p^5 zdX|DV@4Q)d;FcyjHewpAG2D7Ea**Zbddj-lAkY#sjWCD4#X!mNSlO%%k+d_4ZN~-= zziju+BBxXV(T0g7zX;usjLFw(5Lc&37icS7XUsCg3t~y56F6nY{Idv!du@+fIlT~Z z>Zca^vh{aY1ovgkEm47QZe_Ujie#f)4H4;t1lfcK-KWj~e~1lUc2_R>MS^=Pd7P?t zVeG4HvK|zZwynfTZ9&{maT?TqKEzwiQ^?a|**7SJVj3vd#0JgS41pMwQ831!~1|i!Vtz_OVtRZw~NfQ?Wgzym_IBCNe{WYmO`))@0;4H{>`Xbfa`;&0Qn*XE5L6@7R6mQZ^eS zrb%TFX>6a@&hQ8Mq=tepPi;7#n2yZ}*VNqxu5W!FdmiDpz;IiPz7v?K0|?Y$k!QxR zsN%v!l@b~ffhd`x_61-V=s499Do~*;l#|@5>043UszX(!nAPgMKZ7uA$JFQ{=`OH; zzURDd$ofZ4I}Zv8f-XBRFUEK_L7G`vp{NAF5+UHhpNjFgNctEC8`#McB zPZQlRmZ-D^QIA_GJ#540b}XqEnRuh0v09F#?w$dpE)UllBUXq{J<3$$A!0x6su}aX zWnyoJYhz8y^&U}(vahW_=i?6hP40w`OJ3!`r~e3EZ7R(-$@fxnz!A5#NCd92@8=kJ zDcYlpXgzYbdx-aEa^ljb=q(A04b8_Z^2`uYy6kZJv?Z)vfJ{Yz0yB8oFLG?K(zWeT zBX}P}s^syS{<^yBxW!S|+bXrJ?tA*H?hyL zFB`X~D=TkuL>J=JKyGjiE4wFxfXnwuq`ZX0-~Q}+vFO(V8E*kw3>OodT^ck~X9=VA&smBx4qj7sm2-ipka7Hp&BElFF$PC%>%Us$& zX@eyLytq*GlJgE$h+L9Bk#SmMW83q>NK#=(o}r^6*SwT!Gi~Px8UyX?g4@acXu|hh@ipU z3GVJ5Y~${38+Uhj`OZD}y>st)Kl;b&>aOY@U1O}OUaRK3vZE3B$HZcYGlOm1+Vyvj z+Mk`C%7e9gyq;;G>!v~Xj`6s$I}4v61fW+Vo57xGrm7|q3BTq@!q3;5ULV9yOf`eNxXdOx(l_Zm(pBJh)aq}i z$Qe^+WG5#Qeb%PWTg&r9b8*V|D(9MIc4N?!)+6B*nD&h0zDz^O`dZ}47%D-%mc&HO^9IUf=doZ3=>r*{#q>mnCh z703qR$(Y$9m_hfC|MIi-H70PW)#3iJGLCa91r^C@>lgluNDAJf)$Xr7Ym^*w1GkGu z6-3e=I`C?RxlzHJWNj@0V<@xspwP@53CeukeT1TqNXF3)GmR*L<_=S2cDrcsMxO=c zzy{pxLrot00H~iBBqa|XD|*+;FZv$vdx=;w(+ttU)uw#lYb$zdusblCv={+dQ7Tjd zDXttgE9?aH?+W5v*PJN57hMwWdhEHh&^TmgGW-0gTf=N_D<-z(axH2Q7fIS0mjFfuF(Z{K~3~E$__^4cA&%nHA{0uFl{l~gZ zzvbSvF(bdsO|@gdA^^y=%C_Q}(A*oDC2!P5ze4<;(P~t!_*41hMi5L?f$;YwqI&BY*NNofKZ{LXXkS zM(pEQjC4t+70M8Z{Y?Me;`;DF1UymE)yD*Amh|0@5q2C<%~l5;~v)5-IFmA zdds9D(a}JDLZ?FSwp7KD+eBKIgR!wob{j>$X9GRq0jmqe7!sC!2EtxnUs^AkT@|k5 z0RH}QOH~3^bJV-4h-U&T_LP*0Ec|21;nIR+u%Tz`Gq7xb{Z^Cl;ABt@_9tMza9MJ_ z#%+fXo!< z!uy3VbVnIn|D=Oo#bkuvYF1=NL9}Mcg#qhAp&R!5dv;w<6BAol_kQIBt6ioJ&VG11 zOcDsh^8kH0Q+p_XQCgn5D)mkd)Q{&&9n^9Fde zI8P6pwYz@LURvoz@APixeujdGvnCoppi8`kvY-geT@@0gwbt2lfXw6lF^whL4+of{ z?|CCZuj@_u^2ppjvQJVfMYr_yqt+-VmY?ZHfqz6IDbeq51QrW)qv2m>Xd&ahGp1zI zu6OFXuynOmvah6ECR}rEpLXu(haOqvrWs!e+JANaxNxf%N@4E%8GckrIrQMqEa7yJ z0(hc72s}j#BMYzvub-;sYhEO_jZ~UA?$>}R>L0O*IMY-1s&Ck^nv2q#1+(2~;cCHI zz;70iZt#lHXpXi(aPrd?#zBp)Cod0(YPn##1H4k2?--y)Q}z@7#OQNbo}fj+TDPdX z?kpVY9g0I+PPF62zUX&1R4uBddozE_P6?o5hopR$rM%!=-$E)YcFyP6J4AJQgJ3br zuvP#>a*p1CU+-mcmqY8Y5FrH$)?5<>PK8I65&7e#1gE?5{g1ms-yBFz0y*wY%ViBw zuUn|Cffq!uo?IJGr$28~s>f)Xe?F7ue~xPLa< zIx`W;b^G{ykg9pEvh2LDl#B>8GFvcC5)5a@am`((ZQx@GCtg^_6+RhVx0PHo*msYM zKCPL9#3s&zo7zTK8ZZ0AY@faBER{{)Eq&8@ zy>87geG}KUH%{_NXE$C3frsKYjqEMZ>wRl72)`Z)oj9z=!Jee8Y@Grt9?tCS+sGG! z1UT!=1&b}?S;8Wbr^Y1y^CrLFdfRdAjrOXa&Dg*scQzFu*k>J-wbLEzbY_mFsF?ne zj%!c*vWz~zS)C|tz?>9{3q9hNzLQ)i`uUZ>jW857y=UE^fAPLewq_U3vbtF0QS@{d z+G557e)B!6Zi3%Ti2xYoxD1WDB;0mrCx|d%DJTjL8L1ZPIO|I|fI#w)bwqs>i#l}uYdYr|auY}jC)4_zCGtCi^ z+=c$S!AFhiC@c9T?CIzHSo4FDIl6HUFR69Iviqe~3+sb1GGK!I;P>Fl*dl}dC6~L> zTcbEzFk^(jJcz~fv8JATqnGSF$@0yw=iye2HPb^cJ1-@8YUR;%@B3m(L)Ozrw@QBNZ5!_jMIj0_36l3y> zY~wxpSOhU*^wg}&#DdJ@)k5LZ&4ocB*a zx*F*8&ub}!pyQ(Eaf_3eXy=-cDn5)TqoXD9Q6R>+Um-&sPM@Uj)s|%~VuEJj0mZZC z9W5@LOpg1myK2zCthVrYixXY=lw@X~tW^RPAVkpjRz;QPFiPs1Bz1i|Ta;~A`XQB4 zd@LSW6JDoJLp4ei2W7@zl|-0FHUaMC`x99ayy9Cf+(NdRW)?4mBhBoMTN-RxEz(gH zSuWj0XQVBa2fv19wibJztIKs@r^`wRE~7dRymW`Gg&GZX+)OL#4y=KXsm?dw4Q1(p z>v{2Yar)yCiS@|Z${nM913Vvug7Q4pE63GFv=iF|u)Snwb(&vv#;-R{sPl*R&t?rB zX>G;*Diq1ziYhEfCaAv^$avgVS}RFv+Y;TE5Y4+VjF?28>ojdiHbl>Q8Zc!_4phHl z;v+lCc1;wSV0*xv;ol2oE7mJwPQCL0)E6wQFCtyWalbz2?y>)a$m>oc=P!*nFZ=$` z5^66KIX!w>Qt(Lh?`LRE`R(#d$UojXdA*!ul{R#rQCHJ#*TY}u<>gTd{vg(xmY)${ zY}UKn+wa}}RNLFW#-%i(WLNE2vtRpt7Y#_xpom{CYWFhmUwCeKLP-}^Sfx_E1Kc{Q zPn0@!6#H8%>Tj;Mh09C2>g%6oSP~i`S^;QfQ9dJc>`kn*A=fv?Vrbv@oTCEJE+YK4 zao+%V1cCjZZx!#0$3y({ppnztvv1aD|9WEn0OLZ(jymt|$P`^tAk0%2w$*UArWKqu zi4=RBHiW#V=fmg_A;zfdw zYY4ot3e$8O|GK~PtvU7t^(S2g;u)PM(fSlv8GU(%;^*Bpn?ylf5w=%C!z}YJ?s<(W zH2?2u3_*UM%AqG}XI2Z?W}k+IO>vref4s3Br-4%5$V`&7$U9)x_+xs3I>`v*d|}oD zGIx&rruZ#g_RBNkL6^I>kPMW2%2OZl_dm-j>vw?^(PJnF>bd^N+}K1cM7{3_hQ`@K zUF}l?j6WV@R7H6X>}bU#{>n9fsLQdqu=k_3>Y%gX09(~#uZQ4&#^b)j_cLy~L|#Hi zGDH{oc*0k#Coo$i%?8^FtQ81rEmUq$dy?U62taIaBfOn3u>aaW%_-g#iNh6thxAoPz~b`J;OL|LS`knQPq@mBMW=+@DCc=D~ zXh_(-ll`md>owW<>H+`KAi4HR$vVQG?xBfCGI8V^x*fe!0E>;b{@V;sMwOJ>5(I0b z7m)rYV%yq(ckoRV=#R?>D>`uNYMj7L58>JrFUv{N8JT9n?v+mPR#Lj`NfUgt*c3Dx z;1xXiE-+nBv+gIow`?=s~dQ+XiiGC@n27fN{ z(^#3RsKI|vFX_uIKl7ND(0e*PA_Mv(^dGa#nDD3a(JF{O5M$Fs3C}-G_+)eQJ{q>J zY^q6hmD?ghh-LjC_eRBl#k71VjjhrmTlP4CG3k${+EnHe5JKPS*#`} z9pnR4It!h^-+Khfg3d(cw+B9u4WiFMb__LYXZhfhoL+I|i&uO~=Y$Z1W*@)NJ)WLf-?u>!l>lMNc*YW}hs##Vyp8w}CjFhS>-E=RKxo4BL-fA+qx%^BI zm@ISSu;~F6oSCe>{hXg#7@)7>LI&VgDQbAi=?7teToMMqEN~U7OpH?W+|0VKu9fgQ zrJTd?oZ&fha47=OArZT-Ex)*%>EUrz_fJBm|0i4#~{H@HQfPZ;AT(3n||8jJ3C z%1k8K(>jOQI}Gx_slBcS-Hf>(I&_V7boF=zL_Nxy;k8WnVA$^zEiTJ)NGr!5vDZ!7 zh}ruHMmR0>2N?Q>UgP7wfgQUhDekzXjF51yU#%|Jw%f}WJ!+*%VlBWJsZ}{01pI(< z^agq?QAZDtJ14uTa_5AxVXjI!2(*F!l@hHTN5qPeu0BN1*-tD`{%@t?g=PhgiuDQG5E)&w*`R4js6jIHC~SUU1!&MO`N^` z2hM74H5SbS+z#UbG|h7|dV9rtcd~llFQNQoPG`>OO55`?M&&=*P=>s;dh46knZ!3q z)2Uar#$eA@s_`z=ttL6?&f2`*e|S+l^~=>>|0}{8Oo>mVMzVv_JUo}-1l(r-xIeOH zE`jlWL7C%*;!bS0f}N#?l}Z-pe}AVT_noXIyIXoh?O^U;`pJyU1Y=@Kq6Byfx1#Z{ zjNf-!5ZR;eU8KUaoj$d8mj|ZBiUU9fk@GqSfx?!9qRgKV-QS`~Cc*te6G7tLSu#~U z7HyWH+Isj+mUNrad2`*XfQV1hmEJWGPtTyhH}$D=y={lC?G+8hnq9+@k0ZQHjNg1J z?hc`*7@@dX_2+eE^ucga#ubtT=DHF|Rk~*lTs0_&#g7D6O4WE%(J_+Dmz?LgpM)L4 z&d*Iov_YMs^|OxeXeaeTUqif~9qm9rfBNKsj;bfJ76KGAT_P$TfV5qOvih1*sH5rhBrD#mXkaXfDNXEKdUo}~5S4?~vzaIz+@YkqaO{HB|Od|XVfDEpP z%1t*~hd1HZVpNAW2RCAR2PuqA-ZGmMuYLqT%3s&Q`i^*YpQYTr10Iw?li6h=LTn<g$I_$-{G+{NkgLcGVhQ6+LBctjh zQj1RjsLpk1cFiR(ZCIYTNjj0&6sx7RFb+LV#ENFdIF^P8oxEykjOm(j_O6-R$i92h zc3l^84)9%_(8M{oin}v@i*}8OOijx%5omnM6#<-V;R_08BM+_%=Pw)*-2Tp|3F_QN zXYLQ)Do*B2x<;Enqr^{Ns9#b2=GTAsiy!i;940L4sZt-F3phN`7T3SKMduK5S0*#d zkUmqTo+=;N%rdPId|58aVO>aRmGtslI2b<~T2$`hv0;hNv?VwmwJ`M0=l2nB1>Thn z-hf{($HiPljiq8qAp?qz-sJbJj+!k(W}GhRktu0c%r=g;Gu7KlSNvr(gKVzwwXq_{ zQ44gKwbVJ?ni*3}M@1U0V8541uDyR);Sh>GJmt};HHz2_meNk9Afcx3cY(lcB5ihv z{ey^qR&N(cV@rT%V8)-MNeoO)qodu6HsT9qPQ12mEF_KH}`GxEt%Jz)O4 zAzi@y=#{2V9l2(3Qi@WjX6&yIF7Ay;C0AbSAHA+mNWE;wij&VwIy8!X?vOhA!WkX( zR1#FeJl0(P8f?S4WUNO%0;4~f=+*WZe_`h6==gV~ zjFlBlXLQZ$ZFWCdPL<8|ZAC@h9H8HkKR_5U-gLw5o10fvHpN~^*7_)*C+t5tbD$Wt zGECAVd>ZZFMIp~13BMXgYjhI>y-$Dk`big}9EaJYf$J-KQH4z10rkc+ox;zr+f*i( z-@t`rrO;lm4(^vlhX=V(YONq@N`sW&zi73n{R0E&2C{361s z`^0BaE$O6Qr-WV=ktnx?E_7iwE=z2Yj|8GG#Q={RC7y*rzFJmvO0$Q|AW#4i#X7dM z*LV#SID&EMFtzy=P;!vzaN`(5|4OxVrI!C21(`SYth_CDA<-i;#~A$uwNs;D%QzDK zD~sD~+nqnImAd@u;-`m4;NvCpOG?7P&R4%z+j?r}d8$#p#V(`<?=RlcF=*{zmG}+I2-nF176Smb@?A#)A^z|D%m<$9vn=?;4X`LGD_^W zM-)!3Eo_Ef<#}8}TnaDzgD$7Bt#V(nKe`9JHBJ9uLN z`^|_SjhKv9U-@T-Pv7vvR_Wb8_Aho3rxqib=Mwd-?+wDb0?CvOs=lRmNsrSzjRD*@ zZE{_ii|Q2t4{?;-Nw4WtRlVvdA1h2EXwWs7gJRJ9|75>9QQrir#~{OOmNix#CR@Cp z?9er)JCXfLYxl<$rw=#W6KCvZpzaAFgmc=Y z{?bk8cJu6#62Nrfdvk%{--VpN3Rp95#CLB5K*diOC!!{NK`)cUFiuB z^g5pq87O`?9e^n*G4wDi%hufq7NDMqURJ(`#VaN-(*a^J1dEn_<7$Hk*zLUk-i_33 zgw^32x2qVVS4^LWXb;I{q4&zKtD5BP`Qx3SY8~oGTHOYz;jnjw-_<=Oi)h8!Z}9fs zUDzJ#Y~a6Ni(cITr**Y&Vfk`hPv8zCQEz4siw-pn(dJ}b9pOJoBYD|)O+)*#iD7;e zjb9&!@c@W9IhDoYh~akRKFV2A@4I>D>d!KUGrqUB{gbR`HTqdDSgFu<%zw1$l#-<1 z0)NS>L3it5OKf2xBTYd&aP&BU$?+u))IQdS;dUd56X=to#RzCKOZz02s5xjQn2*-i z@2V5yAEng2p7Dc*T6pQU;x?7uA67Tafam5m5a0R=)ft+0dSK z>rPRTS7{Dr7a$-Ft3h%>i`g$~2nvAWSJ!_jbXYvKE<%lw1pl(!J_&>Bpyp{uH}N+O z9B87R5Ab2w&hvq@gZ%KKeX>J%+BXHY@y#GPnVj%q?6{O?Bd;Hx_IjbYd3>FHN-4fY z2fE)-O~@)-KiPua;Ous6WR^|pMJjqd^8y$*nG*|>08CCImNAoBs@V&*Tw;22JG93vq$XfpUqSIp@L@ZoCCam*;wx| zm?KQSF`oaj%m2YAt%sdw;J08co8@VC3^cKVZ!5rrxPi96VWpQN1KU`$a8j}#t}Yy) zgprm0L{yUq8|hlQFz)IOI&D(!*2sR2CIdJ9VFnAj>`(ux}& ztNO|wa$sNbK*!hXETYF1hfeJh9Vv=n)x)EJJR*i$@C2TOJ~!}P{H+rX&|C#k0h9yA zP$aBqqDESS_g)kORSU0NlH0n>ZoW4`b-e;~v-cDGIp}l)xiOtswkHL}nwGu1z34Zt zCoNIVUx!-JFjJA&NleO!nS%wrh*F4MHX7PhwTGW!tn9Lc5NfQn2l-8RFjkBse&;6B z(ETx@W-OQ;?r;8>h12o3x!B1X9vGa&90lk>4U`!6&~}E~SczGSNaM|YpVtVm3JDXw zf3aBj94>}a>>S3b;T!u?BIGQ>jqZxL7~X!8o5+E9D-T z-pQ)NDH`Do-RB8@hw6O>B__wC-^*mB3@7Yc{0Q-=nni;`>sEwf#B?UR2~a9dAgARS zDRGw0ptglcwyr6ShD6fJIi5M_Q}X|BM8{yfHOeIfAEasHv*#I+{$gb9ayKwsceZ-+ z$hkhSwurX;yv`ma+p{P2!*5UdLddl+j9lcXvqXdA-~x`sGqJa_xo{u`)F=;WG6V|D zC%2FVP8dQAU6ju^35MH@L%yx>T~p7O5I{y6{FbV-<1al2Q&Kxd4!sM&_mAn~_mIL<+UY z(=EDKaumZRfAfMV@ocl?hG161M*y(b3FxmWPGV@Vb=VYavJGo6t0m@ELG|~4)?J(@ zleUZg=7A~S2bMo?pYmhcZ1P;7oOG=OlnFm}wK4dl+sblC^bfT(!{MJe_(Er(Crrmb z<$X;~oz+DC5sN*mJ^2N3+tG@E3)hu`yjpCGz#U6;+i}+zzV#^j45k2rqdXYl7 zq0P-3%1bn-7omQ=u3Di9=RaqpAu#T{*WtDy1 zF{-B2B~5mYuizZ2+DQIHoSno3^ zInmyG#WsiYiBFu^OfZ7q?%_7-Xrh~Fo*7M#9Tq`63nyw2l8*F_l;v*W3$tms-w|S

y{0MkTRsvo(X)#WZh85-Rt9UUMlKE95m49Wte$ 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�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 h>i^ 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

+wiV>pnhbAk!QX>Dmk#!T*1}y?0y_X}><~uDiO5 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�$;Is-206rc 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 XPv6In{iIO)Y!fEM?QL`Qyqy$(E=7e) diff --git a/data b/data deleted file mode 120000 index 87a636a..0000000 --- a/data +++ /dev/null @@ -1 +0,0 @@ -/global/cscratch1/sd/sqtang/EAGLES/Aerosol_diag_pkg/data \ No newline at end of file diff --git a/environment.yml b/environment.yml index 2ddb644..759388c 100644 --- a/environment.yml +++ b/environment.yml @@ -7,10 +7,11 @@ dependencies: - pip - matplotlib - numpy + - scipy - sphinx - conda-build - pytest - pytest-shutil - ipython - black - - netCDF4 \ No newline at end of file + - netCDF4 diff --git a/figures b/figures deleted file mode 120000 index bb5f731..0000000 --- a/figures +++ /dev/null @@ -1 +0,0 @@ -/global/cscratch1/sd/sqtang/EAGLES/Aerosol_diag_pkg/figures \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 0ea395b..3483feb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,11 @@ pip matplotlib numpy +scipy sphinx lxml conda-build pytest pytest-shutil ipython -black \ No newline at end of file +black diff --git a/scripts/run_plot.py b/scripts/run_plot.py new file mode 100644 index 0000000..e33c75e --- /dev/null +++ b/scripts/run_plot.py @@ -0,0 +1,220 @@ +""" +script to generate all plots + +Instruction: + edit the first section "user-specified settings" for +""" +import numpy as np +from esmac_diags.plotting import * + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# user-specified settings +settings = {} + +# set field campaign name. More settings on specific field campaigns are in next section +# HISCALE, ACEENA, CSET, SOCRATES, MAGIC, MARCUS +settings['campaign'] = 'HISCALE' + +# set model names. +settings['Model_List'] = ['E3SMv1'] +#settings['Model_List'] = ['E3SMv1','EAMv1_CONUS_RRM'] + +# set line colors for each model. corresponding to the Model_List +settings['color_model'] = ['r','b','g'] + +# set field campaign IOPs. Only used for HISCALE and ACEENA. +# IOP1/IOP2 +settings['IOP'] = 'IOP2' + +# Please specify the path of your data and for figure output +settings['figpath'] = '/global/cscratch1/sd/sqtang/EAGLES/Aerosol_diag_pkg/figures/' +settings['datapath'] = '/global/cscratch1/sd/sqtang/EAGLES/Aerosol_diag_pkg/data/' + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +def add_other_setting(settings): + """ + add other settings for different field campaigns + + Parameters + ---------- + settings : dictionary + all setting variables + + Returns + ------- + settings + + """ + figpath = settings['figpath']+settings['campaign'] + datapath = settings['datapath']+settings['campaign'] + + # path of output figures + settings['figpath_aircraft_timeseries'] = figpath+'/aircraft/timeseries/' + settings['figpath_aircraft_statistics'] = figpath+'/aircraft/statistics/' + settings['figpath_ship_timeseries'] = figpath+'/ship/timeseries/' + settings['figpath_ship_statistics'] = figpath+'/ship/statistics/' + settings['figpath_sfc_timeseries'] = figpath+'/surface/timeseries/' + settings['figpath_sfc_statistics'] = figpath+'/surface/statistics/' + settings['figpath_profile_timeseries'] = figpath+'/profile/timeseries/' + + # other settings for different field campaigns + if settings['campaign']=='HISCALE': + settings['site']='SGP' + # lat/lon at SGP + settings['lat0'] = 36.6059 + settings['lon0'] = 360-97.48792 # 0-360 + # bin of flight heights to calculate percentiles + settings['height_bin'] = np.arange(300,4300,300) + # time periods for IOPs. needed in preprocessing of surface data + if settings['IOP']=='IOP1': + settings['start_date']='2016-04-25' + settings['end_date']='2016-05-29' + elif settings['IOP']=='IOP2': + settings['start_date']='2016-08-27' + settings['end_date']='2016-09-22' + #### observational data path. ###### + settings['merged_size_path'] = datapath+'/obs/aircraft/merged_bin/' + settings['iwgpath'] = datapath+'/obs/aircraft/mei-iwg1/' + settings['fimspath'] = datapath+'/obs/aircraft/wang-fims/' + settings['pcasppath'] = datapath+'/obs/aircraft/tomlinson-pcasp/' + settings['cvipath'] = datapath+'/obs/aircraft/pekour-cvi/' + settings['cpcpath'] = datapath+'/obs/aircraft/mei-cpc/' + settings['ccnpath'] = datapath+'/obs/aircraft/mei-ccn/' + settings['amspath'] = datapath+'/obs/aircraft/shilling-ams/' + settings['wcmpath'] = datapath+'/obs/aircraft/matthews-wcm/' + # surface measurements + settings['smps_pnnl_path'] = datapath+'/obs/surface/pnnl-smps/' + settings['smps_bnl_path'] = datapath+'/obs/surface/bnl-smps/' + settings['nanosmps_bnl_path'] = datapath+'/obs/surface/bnl-nanosmps/' + settings['uhsassfcpath'] = datapath+'/obs/surface/arm-uhsas/' + settings['cpcsfcpath'] = datapath+'/obs/surface/arm-cpc/' + settings['cpcusfcpath'] = datapath+'/obs/surface/arm-cpcu/' + settings['ccnsfcpath'] = datapath+'/obs/surface/arm-ccn/' + settings['metpath'] = datapath+'/obs/surface/arm-met/' + settings['acsmpath'] = datapath+'/obs/surface/arm_acsm/' + # vertical profile measurements + settings['armbepath'] = datapath+'/obs/profile/sgparmbecldrad/' + # PBLH data needed for plot_flight_pdf_percentile_SeparatePBLH_hiscale.py only + settings['pblhpath'] = datapath+'/obs/profile/arm-pblh/' + settings['dlpath'] = datapath+'/obs/profile/dl-pblh/' + #### pre-processed model data path ###### + settings['E3SM_sfc_path'] = datapath+'/model/surface/' + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ######################## + + elif settings['campaign']=='ACEENA': + settings['site']='ENA' + # lat/lon for ENA + settings['lat0'] = 39.09527 + settings['lon0'] = 360-28.0339 + # bin of flight heights to calculate percentiles + settings['height_bin'] = np.arange(100,4300,300) + # time periods for IOPs. needed in preprocessing of surface data + if settings['IOP']=='IOP1': + settings['start_date']='2017-06-20' + settings['end_date']='2017-07-20' + elif settings['IOP']=='IOP2': + settings['start_date']='2018-01-21' + settings['end_date']='2018-02-19' + #### observational data path. ###### + settings['merged_size_path']=datapath+'/obs/aircraft/merged_bin/' + settings['iwgpath'] = datapath+'/obs/aircraft/IWG/' + settings['cvipath'] = datapath+'/obs/aircraft/inletcvi/' + settings['amspath'] = datapath+'/obs/aircraft/shilling-hrfams/' + settings['fimspath'] = datapath+'/obs/aircraft/FIMS/' + settings['pcasppath'] = datapath+'/obs/aircraft/pcasp_g1/' + settings['opcpath'] = datapath+'/obs/aircraft/opciso/' + settings['cpcpath'] = datapath+'/obs/aircraft/cpc_aaf/' + settings['ccnpath'] = datapath+'/obs/aircraft/ccn_aaf/' + settings['amspath'] = datapath+'/obs/aircraft/shilling-hrfams/' + settings['wcmpath'] = datapath+'/obs/aircraft/wcm_ACEENA/' + # surface measurements + settings['uhsassfcpath'] = datapath+'/obs/surface/arm_uhsas/' + settings['cpcsfcpath'] = datapath+'/obs/surface/arm_cpcf/' + settings['cpcusfcpath'] = 'N/A' + settings['ccnsfcpath'] = datapath+'/obs/surface/arm_aosccn1/' + settings['metpath'] = datapath+'/obs/surface/arm_met/' + settings['acsmpath'] = datapath+'/obs/surface/arm_acsm/' + # vertical profile measurements + settings['armbepath'] = datapath+'/obs/profile/enaarmbecldrad/' + #### pre-processed model data path ###### + settings['E3SM_sfc_path'] = datapath+'/model/surface/' + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ######### + elif settings['campaign']=='MAGIC': + settings['site']='MAG' + # bin of latitude to calculate ship track composite + settings['latbin'] = np.arange(21.5,34,1) + # reference lat/lon + settings['lat0']=30. + settings['lon0']=230. + #### observational data path. ###### + settings['shipmetpath'] = datapath+'/obs/ship/raynolds-marmet/' + settings['shipccnpath'] = datapath+'/obs/ship/magaosccn100M1.a1/' + settings['shipcpcpath'] = datapath+'/obs/ship/magaoscpcfM1.a1/' + settings['shipmwrpath'] = datapath+'/obs/ship/magmwrret1liljclouM1.s2/' + settings['shipuhsaspath'] = datapath+'/obs/ship/magaosuhsasM1.a1/' + #### pre-processed model data path ###### + settings['E3SM_ship_path'] = datapath+'/model/shiptrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ################ + elif settings['campaign']=='MARCUS': + settings['site'] = 'MAR' + # bin of latitude to calculate ship track composite + settings['latbin'] = np.arange(-68.5,-42,1) + # reference lat/lon + settings['lat0'] = -40. + settings['lon0'] = 120. + #### observational data path. ###### + settings['shipmetpath'] = datapath+'/obs/ship/maraadmetX1.b1/' + settings['shipccnpath'] = datapath+'/obs/ship/maraosccn1colavgM1.b1/' + settings['shipcpcpath'] = datapath+'/obs/ship/maraoscpcf1mM1.b1/' + settings['shipmwrpath'] = datapath+'/obs/ship/marmwrret1liljclouM1.s2/' + settings['shipuhsaspath'] = datapath+'/obs/ship/maraosuhsasM1.a1/' + #### pre-processed model data path ###### + settings['E3SM_ship_path'] = datapath+'/model/shiptrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ############ + elif settings['campaign']=='CSET': + # bin of flight heights to calculate percentiles + settings['height_bin'] = np.arange(200,8000,400) + # bin of latitude to calculate composite percentiles, same as MAGIC + settings['latbin'] = np.arange(22.5,39,1) + # lat/lon at the airport + settings['lat0'] = 38.5564 + settings['lon0'] = 360-121.3120 + #### observational data path. ###### + settings['RFpath'] = datapath+'/obs/aircraft/aircraft_lowrate/' + settings['ccnpath'] = 'N/A' + #### pre-processed model data path ###### + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ############### + elif settings['campaign']=='SOCRATES': + # bin of flight heights to calculate percentiles + settings['height_bin'] = np.arange(200,8000,400) + # bin of latitude to calculate composite percentiles + settings['latbin'] = np.arange(-63.5,-42,1) + # lat/lon at the airport + settings['lat0'] = -42.8371 + settings['lon0'] = 147.5054 + #### observational data path. ###### + settings['RFpath'] = datapath+'/obs/aircraft/aircraft_lowrate/' + settings['ccnpath'] = datapath+'/obs/aircraft/CCN/' + #### pre-processed model data path ###### + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ################ + else: + raise ValueError("does not recognize this campaign: "+settings['campaign']) + return(settings) + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# running command +all_settings = add_other_setting(settings) +plot_flight_track_height.run_plot(all_settings) +plot_sfc_pdf_AerosolSize.run_plot(all_settings) diff --git a/scripts/run_plot_all.py b/scripts/run_plot_all.py new file mode 100644 index 0000000..f6e4cc3 --- /dev/null +++ b/scripts/run_plot_all.py @@ -0,0 +1,329 @@ +""" +script to generate all plots + +Instruction: + edit the first section "user-specified settings" for +""" +import numpy as np +from esmac_diags.plotting import * + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# user-specified settings +settings = {} + +# set field campaign name. More settings on specific field campaigns are in next section +# HISCALE, ACEENA, CSET, SOCRATES, MAGIC, MARCUS +settings['campaign'] = 'MAGIC' + +# set model names. +settings['Model_List'] = ['E3SMv1'] +# settings['Model_List'] = ['E3SMv1','EAMv1_CONUS_RRM'] + +# set line colors for each model. corresponding to the Model_List +settings['color_model'] = ['r','b','g'] + +# set field campaign IOPs. Only used for HISCALE and ACEENA. +# IOP1/IOP2 +settings['IOP'] = 'IOP1' + +########## set filepath for preprocessing. If you don't run preprocessing, ignore this part +# path of E3SM model data (h3) for preprocessing. same length of Model_List +# settings['E3SM_hourly_path'] = ['/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_hourly/'] +#settings['E3SM_hourly_path'] = \ +# ['/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_hourly/', \ +# '/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_hourly/'] +#settings['E3SM_hourly_filehead'] = ['E3SMv1','EAMv1_CONUS_RRM'] +############# + +# Please specify the path of your data and for figure output +settings['figpath'] = '/global/cscratch1/sd/sqtang/EAGLES/Aerosol_diag_pkg/figures/' +settings['datapath'] = '/global/cscratch1/sd/sqtang/EAGLES/Aerosol_diag_pkg/data/' + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +def add_other_setting(settings): + """ + add other settings for different field campaigns + + Parameters + ---------- + settings : dictionary + all setting variables + + Returns + ------- + settings + + """ + figpath = settings['figpath']+settings['campaign'] + datapath = settings['datapath']+settings['campaign'] + + # path of output figures + settings['figpath_aircraft_timeseries'] = figpath+'/aircraft/timeseries/' + settings['figpath_aircraft_statistics'] = figpath+'/aircraft/statistics/' + settings['figpath_ship_timeseries'] = figpath+'/ship/timeseries/' + settings['figpath_ship_statistics'] = figpath+'/ship/statistics/' + settings['figpath_sfc_timeseries'] = figpath+'/surface/timeseries/' + settings['figpath_sfc_statistics'] = figpath+'/surface/statistics/' + settings['figpath_profile_timeseries'] = figpath+'/profile/timeseries/' + + # other settings for different field campaigns + if settings['campaign']=='HISCALE': + settings['site']='SGP' + # lat/lon at SGP + settings['lat0'] = 36.6059 + settings['lon0'] = 360-97.48792 # 0-360 + # bin of flight heights to calculate percentiles + settings['height_bin'] = np.arange(300,4300,300) + # time periods for IOPs. needed in preprocessing of surface data + if settings['IOP']=='IOP1': + settings['start_date']='2016-04-25' + settings['end_date']='2016-05-29' + elif settings['IOP']=='IOP2': + settings['start_date']='2016-08-27' + settings['end_date']='2016-09-22' + #### observational data path. ###### + settings['merged_size_path'] = datapath+'/obs/aircraft/merged_bin/' + settings['iwgpath'] = datapath+'/obs/aircraft/mei-iwg1/' + settings['fimspath'] = datapath+'/obs/aircraft/wang-fims/' + settings['pcasppath'] = datapath+'/obs/aircraft/tomlinson-pcasp/' + settings['cvipath'] = datapath+'/obs/aircraft/pekour-cvi/' + settings['cpcpath'] = datapath+'/obs/aircraft/mei-cpc/' + settings['ccnpath'] = datapath+'/obs/aircraft/mei-ccn/' + settings['amspath'] = datapath+'/obs/aircraft/shilling-ams/' + settings['wcmpath'] = datapath+'/obs/aircraft/matthews-wcm/' + # surface measurements + settings['smps_pnnl_path'] = datapath+'/obs/surface/pnnl-smps/' + settings['smps_bnl_path'] = datapath+'/obs/surface/bnl-smps/' + settings['nanosmps_bnl_path'] = datapath+'/obs/surface/bnl-nanosmps/' + settings['uhsassfcpath'] = datapath+'/obs/surface/arm-uhsas/' + settings['cpcsfcpath'] = datapath+'/obs/surface/arm-cpc/' + settings['cpcusfcpath'] = datapath+'/obs/surface/arm-cpcu/' + settings['ccnsfcpath'] = datapath+'/obs/surface/arm-ccn/' + settings['metpath'] = datapath+'/obs/surface/arm-met/' + settings['acsmpath'] = datapath+'/obs/surface/arm_acsm/' + # vertical profile measurements + settings['armbepath'] = datapath+'/obs/profile/sgparmbecldrad/' + # PBLH data needed for plot_flight_pdf_percentile_SeparatePBLH_hiscale.py only + settings['pblhpath'] = datapath+'/obs/profile/arm-pblh/' + settings['dlpath'] = datapath+'/obs/profile/dl-pblh/' + #### pre-processed model data path ###### + settings['E3SM_sfc_path'] = datapath+'/model/surface/' + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ######################## + + elif settings['campaign']=='ACEENA': + settings['site']='ENA' + # lat/lon for ENA + settings['lat0'] = 39.09527 + settings['lon0'] = 360-28.0339 + # bin of flight heights to calculate percentiles + settings['height_bin'] = np.arange(100,4300,300) + # time periods for IOPs. needed in preprocessing of surface data + if settings['IOP']=='IOP1': + settings['start_date']='2017-06-20' + settings['end_date']='2017-07-20' + elif settings['IOP']=='IOP2': + settings['start_date']='2018-01-21' + settings['end_date']='2018-02-19' + #### observational data path. ###### + settings['merged_size_path']=datapath+'/obs/aircraft/merged_bin/' + settings['iwgpath'] = datapath+'/obs/aircraft/IWG/' + settings['cvipath'] = datapath+'/obs/aircraft/inletcvi/' + settings['amspath'] = datapath+'/obs/aircraft/shilling-hrfams/' + settings['fimspath'] = datapath+'/obs/aircraft/FIMS/' + settings['pcasppath'] = datapath+'/obs/aircraft/pcasp_g1/' + settings['opcpath'] = datapath+'/obs/aircraft/opciso/' + settings['cpcpath'] = datapath+'/obs/aircraft/cpc_aaf/' + settings['ccnpath'] = datapath+'/obs/aircraft/ccn_aaf/' + settings['amspath'] = datapath+'/obs/aircraft/shilling-hrfams/' + settings['wcmpath'] = datapath+'/obs/aircraft/wcm_ACEENA/' + # surface measurements + settings['uhsassfcpath'] = datapath+'/obs/surface/arm_uhsas/' + settings['cpcsfcpath'] = datapath+'/obs/surface/arm_cpcf/' + settings['cpcusfcpath'] = 'N/A' + settings['ccnsfcpath'] = datapath+'/obs/surface/arm_aosccn1/' + settings['metpath'] = datapath+'/obs/surface/arm_met/' + settings['acsmpath'] = datapath+'/obs/surface/arm_acsm/' + # vertical profile measurements + settings['armbepath'] = datapath+'/obs/profile/enaarmbecldrad/' + #### pre-processed model data path ###### + settings['E3SM_sfc_path'] = datapath+'/model/surface/' + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ######### + elif settings['campaign']=='MAGIC': + settings['site']='MAG' + # bin of latitude to calculate ship track composite + settings['latbin'] = np.arange(21.5,34,1) + # reference lat/lon + settings['lat0']=30. + settings['lon0']=230. + #### observational data path. ###### + settings['shipmetpath'] = datapath+'/obs/ship/raynolds-marmet/' + settings['shipccnpath'] = datapath+'/obs/ship/magaosccn100M1.a1/' + settings['shipcpcpath'] = datapath+'/obs/ship/magaoscpcfM1.a1/' + settings['shipmwrpath'] = datapath+'/obs/ship/magmwrret1liljclouM1.s2/' + settings['shipuhsaspath'] = datapath+'/obs/ship/magaosuhsasM1.a1/' + #### pre-processed model data path ###### + settings['E3SM_ship_path'] = datapath+'/model/shiptrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ################ + elif settings['campaign']=='MARCUS': + settings['site'] = 'MAR' + # bin of latitude to calculate ship track composite + settings['latbin'] = np.arange(-68.5,-42,1) + # reference lat/lon + settings['lat0'] = -40. + settings['lon0'] = 120. + #### observational data path. ###### + settings['shipmetpath'] = datapath+'/obs/ship/maraadmetX1.b1/' + settings['shipccnpath'] = datapath+'/obs/ship/maraosccn1colavgM1.b1/' + settings['shipcpcpath'] = datapath+'/obs/ship/maraoscpcf1mM1.b1/' + settings['shipmwrpath'] = datapath+'/obs/ship/marmwrret1liljclouM1.s2/' + settings['shipuhsaspath'] = datapath+'/obs/ship/maraosuhsasM1.a1/' + #### pre-processed model data path ###### + settings['E3SM_ship_path'] = datapath+'/model/shiptrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ############ + elif settings['campaign']=='CSET': + # bin of flight heights to calculate percentiles + settings['height_bin'] = np.arange(200,8000,400) + # bin of latitude to calculate composite percentiles, same as MAGIC + settings['latbin'] = np.arange(22.5,39,1) + # lat/lon at the airport + settings['lat0'] = 38.5564 + settings['lon0'] = 360-121.3120 + #### observational data path. ###### + settings['RFpath'] = datapath+'/obs/aircraft/aircraft_lowrate/' + settings['ccnpath'] = 'N/A' + #### pre-processed model data path ###### + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ############### + elif settings['campaign']=='SOCRATES': + # bin of flight heights to calculate percentiles + settings['height_bin'] = np.arange(200,8000,400) + # bin of latitude to calculate composite percentiles + settings['latbin'] = np.arange(-63.5,-42,1) + # lat/lon at the airport + settings['lat0'] = -42.8371 + settings['lon0'] = 147.5054 + #### observational data path. ###### + settings['RFpath'] = datapath+'/obs/aircraft/aircraft_lowrate/' + settings['ccnpath'] = datapath+'/obs/aircraft/CCN/' + #### pre-processed model data path ###### + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ################ + else: + raise ValueError("does not recognize this campaign: "+settings['campaign']) + return(settings) + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +def plot_all(settings): + """ + include all plotting code. select for different field campaigns + + Parameters + ---------- + settings : dictionary + all setting variables for plotting. + + Returns + ------- + None. + + """ + print('***** start plotting ********') + if settings['campaign'] in ['HISCALE','ACEENA','CSET','SOCRATES']: + print('********** plot flight data *****************') + # flight information and timeseries + plot_flight_track_height.run_plot(settings) + plot_flight_timeseries_CN.run_plot(settings) + contour_flight_timeseries_AerosolSize.run_plot(settings) + plot_flight_timeseries_CCN.run_plot(settings) + # vertical distribution + plot_flight_percentile_z_CN.run_plot(settings) + plot_flight_percentile_z_CCN.run_plot(settings) + plot_flight_profile_z_CldFreq.run_plot(settings) + plot_flight_profile_z_LWC.run_plot(settings) + # mean statistics + plot_flight_pdf_AerosolSize.run_plot(settings) + calc_statistic_flight_CN.run_plot(settings) + if settings['campaign'] in ['HISCALE','ACEENA']: + plot_profile_cloud.run_plot(settings) + plot_flight_timeseries_AerosolComposition.run_plot(settings) + plot_flight_percentile_z_AerosolComposition.run_plot(settings) + elif settings['campaign'] in ['CSET','SOCRATES']: + plot_flight_percentile_lat_cldfreq.run_plot(settings) + plot_flight_percentile_lat_CN.run_plot(settings) + plot_flight_percentile_lat_CCN.run_plot(settings) + if settings['campaign'] == 'HISCALE': + plot_flight_pdf_percentile_SeparatePBLH_hiscale.run_plot(settings) + if settings['campaign'] == 'ACEENA': + plot_flight_pdf_percentile_SeparateCloud_aceena.run_plot(settings) + + if settings['campaign'] in ['HISCALE','ACEENA']: + print('*********** plot surface data ***************') + # time series + plot_sfc_timeseries_CN.run_plot(settings) + plot_sfc_timeseries_CCN.run_plot(settings) + plot_sfc_timeseries_AerosolComposition.run_plot(settings) + contour_sfc_timeseries_AerosolSize.run_plot(settings) + # diurnal cycle + plot_sfc_diurnalcycle_CN.run_plot(settings) + plot_sfc_diurnalcycle_CCN.run_plot(settings) + plot_sfc_diurnalcycle_AerosolComposition.run_plot(settings) + contour_sfc_diurnalcycle_AerosolSize.run_plot(settings) + # mean statistics + plot_sfc_pdf_AerosolSize.run_plot(settings) + plot_sfc_pie_AerosolComposition.run_plot(settings) + calc_statistic_sfc_CN.run_plot(settings) + + if settings['campaign'] in ['MAGIC','MARCUS']: + print('*********** plot ship data ***************') + # time series + plot_ship_timeseries_met.run_plot(settings) + plot_ship_timeseries_CN.run_plot(settings) + plot_ship_timeseries_CCN.run_plot(settings) + # statistics + plot_ship_percentile_lat_met.run_plot(settings) + plot_ship_percentile_lat_CN.run_plot(settings) + plot_ship_percentile_lat_CCN.run_plot(settings) + plot_ship_percentile_lat_LWP.run_plot(settings) + plot_ship_pdf_AerosolSize.run_plot(settings) + contour_ship_timeseries_AerosolSize.run_plot(settings) + calc_statistic_ship_CN.run_plot(settings) + + print('*********** end plotting **************') + +#%% main +settings['campaign'] = 'MAGIC' +print('---------- plot for ' + settings['campaign'] + ' -----------') +plot_all(add_other_setting(settings)) +settings['campaign'] = 'MARCUS' +print('---------- plot for ' + settings['campaign'] + ' -----------') +plot_all(add_other_setting(settings)) +settings['campaign'] = 'CSET' +print('---------- plot for ' + settings['campaign'] + ' -----------') +plot_all(add_other_setting(settings)) +settings['campaign'] = 'SOCRATES' +print('---------- plot for ' + settings['campaign'] + ' -----------') +plot_all(add_other_setting(settings)) +settings['campaign'] = 'ACEENA' +settings['IOP'] = 'IOP1' +print('---------- plot for ' + settings['campaign'] + ' IOP1 -----------') +plot_all(add_other_setting(settings)) +settings['IOP'] = 'IOP2' +print('---------- plot for ' + settings['campaign'] + ' IOP2 -----------') +plot_all(add_other_setting(settings)) +settings['campaign'] = 'HISCALE' +settings['Model_List'] = ['E3SMv1','EAMv1_CONUS_RRM'] +print('---------- plot for ' + settings['campaign'] + ' IOP2 -----------') +plot_all(add_other_setting(settings)) +settings['IOP'] = 'IOP1' +print('---------- plot for ' + settings['campaign'] + ' IOP1 -----------') +plot_all(add_other_setting(settings)) diff --git a/scripts/run_preprocess.py b/scripts/run_preprocess.py new file mode 100644 index 0000000..102953b --- /dev/null +++ b/scripts/run_preprocess.py @@ -0,0 +1,161 @@ +""" +script to generate all plots + +Instruction: + edit the first section "user-specified settings" for +""" +import numpy as np +from esmac_diags.preprocessing import * + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# user-specified settings +settings = {} + +# set field campaign name. More settings on specific field campaigns are in next section +# HISCALE, ACEENA, CSET, SOCRATES, MAGIC, MARCUS +settings['campaign'] = 'MAGIC' + +# set model names. +settings['Model_List'] = ['E3SMv1'] +# settings['Model_List'] = ['E3SMv1','EAMv1_CONUS_RRM'] + +# set line colors for each model. corresponding to the Model_List +settings['color_model'] = ['r','b','g'] + +# set field campaign IOPs. Only used for HISCALE and ACEENA. +# IOP1/IOP2 +settings['IOP'] = 'IOP1' + +########## set filepath for preprocessing. If you don't run preprocessing, ignore this part +# path of E3SM model data (h3) for preprocessing. same length of Model_List +# settings['E3SM_hourly_path'] = ['/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_hourly/'] +settings['E3SM_hourly_path'] = \ + ['/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_hourly/', \ + '/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_hourly/'] +settings['E3SM_hourly_filehead'] = ['E3SMv1','EAMv1_CONUS_RRM'] +############# + +# Please specify the path of your data and for figure output +settings['datapath'] = '/global/homes/s/sqtang/EAGLES/ESMAC_diags/data/' + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +def add_other_setting(settings): + """ + add other settings for different field campaigns + + Parameters + ---------- + settings : dictionary + all setting variables + + Returns + ------- + settings + + """ + datapath = settings['datapath']+settings['campaign'] + + + # other settings for different field campaigns + if settings['campaign']=='HISCALE': + settings['site']='SGP' + # lat/lon at SGP + settings['lat0'] = 36.6059 + settings['lon0'] = 360-97.48792 # 0-360 + # time periods for IOPs. needed in preprocessing of surface data + if settings['IOP']=='IOP1': + settings['start_date']='2016-04-25' + settings['end_date']='2016-05-29' + elif settings['IOP']=='IOP2': + settings['start_date']='2016-08-27' + settings['end_date']='2016-09-22' + #### observational data path. ###### + settings['merged_size_path'] = datapath+'/obs/aircraft/merged_bin/' + settings['iwgpath'] = datapath+'/obs/aircraft/mei-iwg1/' + settings['fimspath'] = datapath+'/obs/aircraft/wang-fims/' + settings['pcasppath'] = datapath+'/obs/aircraft/tomlinson-pcasp/' + settings['cvipath'] = datapath+'/obs/aircraft/pekour-cvi/' + #### pre-processed model data path ###### + settings['E3SM_sfc_path'] = datapath+'/model/surface/' + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ######################## + + elif settings['campaign']=='ACEENA': + settings['site']='ENA' + # lat/lon for ENA + settings['lat0'] = 39.09527 + settings['lon0'] = 360-28.0339 + # time periods for IOPs. needed in preprocessing of surface data + if settings['IOP']=='IOP1': + settings['start_date']='2017-06-20' + settings['end_date']='2017-07-20' + elif settings['IOP']=='IOP2': + settings['start_date']='2018-01-21' + settings['end_date']='2018-02-19' + #### observational data path. ###### + settings['merged_size_path']=datapath+'/obs/aircraft/merged_bin/' + settings['iwgpath'] = datapath+'/obs/aircraft/IWG/' + settings['cvipath'] = datapath+'/obs/aircraft/inletcvi/' + settings['fimspath'] = datapath+'/obs/aircraft/FIMS/' + settings['pcasppath'] = datapath+'/obs/aircraft/pcasp_g1/' + settings['opcpath'] = datapath+'/obs/aircraft/opciso/' + #### pre-processed model data path ###### + settings['E3SM_sfc_path'] = datapath+'/model/surface/' + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ######### + elif settings['campaign']=='MAGIC': + settings['site']='MAG' + # reference lat/lon + settings['lat0']=30. + settings['lon0']=230. + #### observational data path. ###### + settings['shipmetpath'] = datapath+'/obs/ship/raynolds-marmet/' + #### pre-processed model data path ###### + settings['E3SM_ship_path'] = datapath+'/model/shiptrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ################ + elif settings['campaign']=='MARCUS': + settings['site'] = 'MAR' + # reference lat/lon + settings['lat0'] = -40. + settings['lon0'] = 120. + #### observational data path. ###### + settings['shipmetpath'] = datapath+'/obs/ship/maraadmetX1.b1/' + #### pre-processed model data path ###### + settings['E3SM_ship_path'] = datapath+'/model/shiptrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ############ + elif settings['campaign']=='CSET': + # lat/lon at the airport + settings['lat0'] = 38.5564 + settings['lon0'] = 360-121.3120 + #### observational data path. ###### + settings['RFpath'] = datapath+'/obs/aircraft/aircraft_lowrate/' + #### pre-processed model data path ###### + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ############### + elif settings['campaign']=='SOCRATES': + # lat/lon at the airport + settings['lat0'] = -42.8371 + settings['lon0'] = 147.5054 + #### observational data path. ###### + settings['RFpath'] = datapath+'/obs/aircraft/aircraft_lowrate/' + #### pre-processed model data path ###### + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ################ + else: + raise ValueError("does not recognize this campaign: "+settings['campaign']) + return(settings) + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# running command +all_settings = add_other_setting(settings) +prep_obs_mergesize_HISCALE.run_prep(all_settings) +prep_E3SM_flighttrack_bins.run_prep(all_settings) + \ No newline at end of file diff --git a/scripts/run_preprocess_all.py b/scripts/run_preprocess_all.py new file mode 100644 index 0000000..79c81b6 --- /dev/null +++ b/scripts/run_preprocess_all.py @@ -0,0 +1,224 @@ +""" +script to generate all plots + +Instruction: + edit the first section "user-specified settings" for +""" +import numpy as np +from esmac_diags.preprocessing import * + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +# user-specified settings +settings = {} + +# set field campaign name. More settings on specific field campaigns are in next section +# HISCALE, ACEENA, CSET, SOCRATES, MAGIC, MARCUS +settings['campaign'] = 'MAGIC' + +# set model names. +settings['Model_List'] = ['E3SMv1'] +# settings['Model_List'] = ['E3SMv1','EAMv1_CONUS_RRM'] + +# set line colors for each model. corresponding to the Model_List +settings['color_model'] = ['r','b','g'] + +# set field campaign IOPs. Only used for HISCALE and ACEENA. +# IOP1/IOP2 +settings['IOP'] = 'IOP1' + +########## set filepath for preprocessing. If you don't run preprocessing, ignore this part +# path of E3SM model data (h3) for preprocessing. same length of Model_List +# settings['E3SM_hourly_path'] = ['/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_hourly/'] +settings['E3SM_hourly_path'] = \ + ['/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_hourly/', \ + '/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_hourly/'] +settings['E3SM_hourly_filehead'] = ['E3SMv1','EAMv1_CONUS_RRM'] +############# + +# Please specify the path of your data and for figure output +settings['datapath'] = '/global/homes/s/sqtang/EAGLES/ESMAC_diags/data/' + + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +def add_other_setting(settings): + """ + add other settings for different field campaigns + + Parameters + ---------- + settings : dictionary + all setting variables + + Returns + ------- + settings + + """ + datapath = settings['datapath']+settings['campaign'] + + + # other settings for different field campaigns + if settings['campaign']=='HISCALE': + settings['site']='SGP' + # lat/lon at SGP + settings['lat0'] = 36.6059 + settings['lon0'] = 360-97.48792 # 0-360 + # time periods for IOPs. needed in preprocessing of surface data + if settings['IOP']=='IOP1': + settings['start_date']='2016-04-25' + settings['end_date']='2016-05-29' + elif settings['IOP']=='IOP2': + settings['start_date']='2016-08-27' + settings['end_date']='2016-09-22' + #### observational data path. ###### + settings['merged_size_path'] = datapath+'/obs/aircraft/merged_bin/' + settings['iwgpath'] = datapath+'/obs/aircraft/mei-iwg1/' + settings['fimspath'] = datapath+'/obs/aircraft/wang-fims/' + settings['pcasppath'] = datapath+'/obs/aircraft/tomlinson-pcasp/' + settings['cvipath'] = datapath+'/obs/aircraft/pekour-cvi/' + #### pre-processed model data path ###### + settings['E3SM_sfc_path'] = datapath+'/model/surface/' + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ######################## + + elif settings['campaign']=='ACEENA': + settings['site']='ENA' + # lat/lon for ENA + settings['lat0'] = 39.09527 + settings['lon0'] = 360-28.0339 + # time periods for IOPs. needed in preprocessing of surface data + if settings['IOP']=='IOP1': + settings['start_date']='2017-06-20' + settings['end_date']='2017-07-20' + elif settings['IOP']=='IOP2': + settings['start_date']='2018-01-21' + settings['end_date']='2018-02-19' + #### observational data path. ###### + settings['merged_size_path']=datapath+'/obs/aircraft/merged_bin/' + settings['iwgpath'] = datapath+'/obs/aircraft/IWG/' + settings['cvipath'] = datapath+'/obs/aircraft/inletcvi/' + settings['fimspath'] = datapath+'/obs/aircraft/FIMS/' + settings['pcasppath'] = datapath+'/obs/aircraft/pcasp_g1/' + settings['opcpath'] = datapath+'/obs/aircraft/opciso/' + #### pre-processed model data path ###### + settings['E3SM_sfc_path'] = datapath+'/model/surface/' + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ######### + elif settings['campaign']=='MAGIC': + settings['site']='MAG' + # reference lat/lon + settings['lat0']=30. + settings['lon0']=230. + #### observational data path. ###### + settings['shipmetpath'] = datapath+'/obs/ship/raynolds-marmet/' + #### pre-processed model data path ###### + settings['E3SM_ship_path'] = datapath+'/model/shiptrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ################ + elif settings['campaign']=='MARCUS': + settings['site'] = 'MAR' + # reference lat/lon + settings['lat0'] = -40. + settings['lon0'] = 120. + #### observational data path. ###### + settings['shipmetpath'] = datapath+'/obs/ship/maraadmetX1.b1/' + #### pre-processed model data path ###### + settings['E3SM_ship_path'] = datapath+'/model/shiptrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ############ + elif settings['campaign']=='CSET': + # lat/lon at the airport + settings['lat0'] = 38.5564 + settings['lon0'] = 360-121.3120 + #### observational data path. ###### + settings['RFpath'] = datapath+'/obs/aircraft/aircraft_lowrate/' + #### pre-processed model data path ###### + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ############### + elif settings['campaign']=='SOCRATES': + # lat/lon at the airport + settings['lat0'] = -42.8371 + settings['lon0'] = 147.5054 + #### observational data path. ###### + settings['RFpath'] = datapath+'/obs/aircraft/aircraft_lowrate/' + #### pre-processed model data path ###### + settings['E3SM_aircraft_path'] = datapath+'/model/flighttrack/' + settings['E3SM_profile_path'] = datapath+'/model/profile/' + ################ + else: + raise ValueError("does not recognize this campaign: "+settings['campaign']) + return(settings) + +#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +def prep_all(settings): + """ + include all plotting code. select for different field campaigns + + Parameters + ---------- + settings : dictionary + all setting variables for plotting. + + Returns + ------- + None. + + """ + print('***** start preprocessing ********') + # prepare merged observed aerosol size distribution + if settings['campaign'] == 'HISCALE': + prep_obs_mergesize_HISCALE.run_prep(settings) + if settings['campaign'] == 'ACEENA': + prep_obs_mergesize_ACEENA.run_prep(settings) + + # prepare model data + if settings['campaign'] in ['HISCALE','ACEENA','CSET','SOCRATES']: + print('********** preprocess flight data *****************') + # flight information and timeseries + prep_E3SM_flighttrack_bins.run_prep(settings) + prep_E3SM_flighttrack_allvars.run_prep(settings) + if settings['campaign'] in ['HISCALE','ACEENA']: + print('*********** preprocess surface and profile data ***************') + # time series + prep_E3SM_sfc_bins.run_prep(settings) + prep_E3SM_sfc_allvars.run_prep(settings) + prep_E3SM_profile_allvars.run_prep(settings) + if settings['campaign'] in ['MAGIC','MARCUS']: + print('*********** preprocess ship data ***************') + # time series + prep_E3SM_shiptrack_allvars.run_prep(settings) + prep_E3SM_shiptrack_bins.run_prep(settings) + prep_E3SM_shiptrack_profiles.run_prep(settings) + print('*********** end preprocessing **************') + +#%% main +settings['campaign'] = 'MAGIC' +print('---------- prepare for ' + settings['campaign'] + ' -----------') +prep_all(add_other_setting(settings)) +settings['campaign'] = 'MARCUS' +print('---------- plot for ' + settings['campaign'] + ' -----------') +prep_all(add_other_setting(settings)) +settings['campaign'] = 'CSET' +print('---------- plot for ' + settings['campaign'] + ' -----------') +prep_all(add_other_setting(settings)) +settings['campaign'] = 'SOCRATES' +print('---------- plot for ' + settings['campaign'] + ' -----------') +prep_all(add_other_setting(settings)) +settings['campaign'] = 'ACEENA' +settings['IOP'] = 'IOP1' +print('---------- plot for ' + settings['campaign'] + ' IOP1 -----------') +prep_all(add_other_setting(settings)) +settings['IOP'] = 'IOP2' +print('---------- plot for ' + settings['campaign'] + ' IOP2 -----------') +prep_all(add_other_setting(settings)) +settings['campaign'] = 'HISCALE' +settings['Model_List'] = ['E3SMv1','EAMv1_CONUS_RRM'] +print('---------- plot for ' + settings['campaign'] + ' IOP2 -----------') +prep_all(add_other_setting(settings)) +settings['IOP'] = 'IOP1' +print('---------- plot for ' + settings['campaign'] + ' IOP1 -----------') +prep_all(add_other_setting(settings)) diff --git a/scripts/scripts_jobsubmit.csh b/scripts/scripts_jobsubmit.csh new file mode 100644 index 0000000..fa4caac --- /dev/null +++ b/scripts/scripts_jobsubmit.csh @@ -0,0 +1,16 @@ +#!/bin/csh + +#SBATCH --nodes=1 +#SBATCH --time=05:00:00 +#SBATCH --qos=regular +#SBATCH --constraint=knl +#SBATCH --account=m3525 +#SBATCH --output=a.out +#SBATCH --error=a.err + +#module load python +#conda activate esmac_diags + +python run_plotting.py + +exit diff --git a/scripts/scripts_plotting.csh b/scripts/scripts_plotting.csh deleted file mode 100755 index 71238d0..0000000 --- a/scripts/scripts_plotting.csh +++ /dev/null @@ -1,213 +0,0 @@ -#!/bin/csh - - -# This script makes user-specified plots comparing model simulations with ARM measurements. -# -# -# ############################################################ -# # Step 1: change settings in settings.py # -# # such as campaign name and model names # -# ############################################################ -# -# # load modules. Tested version is Python 3.6.7 (Constance) and Python 3.8.5 (NERSC) - module load python - -# # this should be consistent with settings.py -# set field campaign name. More settings on specific field campaigns are in next section -set campaign = 'HISCALE' # HISCALE, ACEENA, CSET, SOCRATES, MAGIC, MARCUS -#foreach campaign ('MAGIC' 'MARCUS' 'CSET' 'SOCRATES') - -# set model names. up to three -# set Model_List = "['CTRL','Nuc','NucSoaCond']" -set Model_List = "['E3SMv1','EAMv1_CONUS_RRM']" - -# set plotting line colors for each model. corresponding to the Model_List -# set color_model = "['b','r','g']" -set color_model = "['r','b','g']" - -# set IOP (or flight date) that the statistics, pdf and percentiles are averaged for. -# options: IOP1, IOP2, ALL, 20160830b -#set IOP = 'IOP1' -foreach IOP ('IOP1' 'IOP2') - -# ############################################################ -# # Step 2: update settings.py with the above settings # -# ############################################################ - -sed -i "s/^campaign = .*/campaign = '$campaign'/" settings.py -sed -i "s/^Model_List = .*/Model_List = $Model_List/" settings.py -sed -i "s/^color_model = .*/color_model = $color_model/" settings.py -sed -i "s/^IOP = .*/IOP = '$IOP'/" settings.py - -# remove ^M in the file -sed -i "s/\r//g" settings.py -# - -# ############################################################ -# # Step 3: start plotting # -# ############################################################ - -cp settings.py ../python/plotting/settings.py -echo '***** start plotting ********' -echo 'enter the plotting directory: ../python/plotting/' -cd ../python/plotting/ - -############# evaluate with flight measurements ################ -if (($campaign == 'HISCALE') || ($campaign == 'ACEENA') || ($campaign == 'CSET') ||($campaign == 'SOCRATES')) then -echo '**********************************************' -echo 'plotting flight infomation' -python plot_flight_track_height.py -# timeseries comparison for each flight -echo '**********************************************' -echo 'plotting CN number timeseries for flight' -python plot_flight_timeseries_CN.py -echo '**********************************************' -echo 'plotting timeseries of aerosol PDF' -python contour_flight_timeseries_AerosolSize.py -echo '**********************************************' -echo 'plotting CCN number timeseries for flight' -python plot_flight_timeseries_CCN.py -# mean statistics for the entire IOP -echo '**********************************************' -echo 'calculate statistics of CN number for flight' -python calc_statistic_flight_CN.py -echo '**********************************************' -echo 'plotting mean aerosol PDF' -python plot_flight_pdf_AerosolSize.py -# vertical profiles or percentiles -echo '**********************************************' -echo 'plotting percentiles of CN number with height' -python plot_flight_percentile_z_CN.py -echo '**********************************************' -echo 'plotting percentiles of CCN number with height' -python plot_flight_percentile_z_CCN.py -# vertical profiles or percentiles of cloud -echo '**********************************************' -echo 'plotting vertical profile of cloud frequency' -python plot_flight_profile_z_CldFreq.py -echo '**********************************************' -echo 'plotting vertical profile of cloud LWC' -python plot_flight_profile_z_LWC.py -if (($campaign == 'CSET') ||($campaign == 'SOCRATES')) then - echo '**********************************************' - echo 'plotting flight height percentile in latitude bins' - python plot_flight_percentile_lat_cldfreq.py - echo '**********************************************' - echo 'plotting flight CN percentile in latitude bins' - python plot_flight_percentile_lat_CN.py - echo '**********************************************' - echo 'plotting flight CCN percentile in latitude bins' - python plot_flight_percentile_lat_CCN.py -endif -if (($campaign == 'HISCALE') ||($campaign == 'ACEENA')) then - echo '**********************************************' - echo 'plotting vertical profile of cloud' - python plot_profile_cloud.py - echo '**********************************************' - echo 'plotting aerosol composition timeseries for flight' - python plot_flight_timeseries_AerosolComposition.py - echo '**********************************************' - echo 'plotting percentiles of Aerosol COmposition with height' - python plot_flight_percentile_z_AerosolComposition.py -endif -# specific plotting separated by PBLH or clouds -if ($campaign == 'ACEENA') then - echo '**********************************************' - echo 'plotting aerosol PDF and percentile separated by near surface, near cloud, above cloud' - python plot_flight_pdf_percentile_SeparateCloud_aceena.py -endif -if ($campaign == 'HISCALE') then - echo '**********************************************' - echo 'plotting aerosol PDF and percentile separated by below/above PBLH' - python plot_flight_pdf_percentile_SeparatePBLH_hiscale.py -endif -endif # end evaluate with flight measurements - - -############# evaluate with surface measurements ################ -if (($campaign == 'HISCALE') || ($campaign == 'ACEENA')) then -# timeseries -echo '**********************************************' -echo 'plotting CN number timeseries at surface' -python plot_sfc_timeseries_CN.py -echo '**********************************************' -echo 'plotting CCN number timeseries at surface' -python plot_sfc_timeseries_CCN.py -echo '**********************************************' -echo 'plotting aerosol composition timeseries at surface' -python plot_sfc_timeseries_AerosolComposition.py -echo '**********************************************' -echo 'plotting timeseries of aerosol PDF' -python contour_sfc_timeseries_AerosolSize.py -# diurnal cycle -echo '**********************************************' -echo 'plotting diurnalcycle of CN number at surface' -python plot_sfc_diurnalcycle_CN.py -echo '**********************************************' -echo 'plotting diurnalcycle of CCN number at surface' -python plot_sfc_diurnalcycle_CCN.py -echo '**********************************************' -echo 'plotting diurnalcycle of Aerosol COmposition at surface' -python plot_sfc_diurnalcycle_AerosolComposition.py -echo '**********************************************' -echo 'plotting diurnal cycle of aerosol PDF' -python contour_sfc_diurnalcycle_AerosolSize.py -# mean statistics -echo '**********************************************' -echo 'calculate statistics of CN number at surface' -python calc_statistic_sfc_CN.py -echo '**********************************************' -echo 'plotting mean aerosol PDF' -python plot_sfc_pdf_AerosolSize.py -echo '**********************************************' -echo 'plotting fraction of surface aerosol composition' -python plot_sfc_pie_AerosolComposition.py -endif # end evaluate with surface measurements - - -############# evaluate with ship measurements ################ -if (($campaign == 'MAGIC') ||($campaign == 'MARCUS')) then -# timeseries -echo '**********************************************' -echo 'plotting meterological fields timeseries for ship measurements' -python plot_ship_timeseries_met.py -echo '**********************************************' -echo 'plotting CN number timeseries for ship measurements' -python plot_ship_timeseries_CN.py -echo '**********************************************' -echo 'plotting CCN number timeseries for ship measurements' -python plot_ship_timeseries_CCN.py -# statistics -echo '**********************************************' -echo 'plotting meterological fields percentiles in latitude for ship measurements' -python plot_ship_percentile_lat_met.py -echo '**********************************************' -echo 'plotting CN number percentiles in latitude for ship measurements' -python plot_ship_percentile_lat_CN.py -echo '**********************************************' -echo 'plotting CCN number percentiles in latitude for ship measurements' -python plot_ship_percentile_lat_CCN.py -echo '**********************************************' -echo 'plotting LWP composition in latitude for ship measurements' -python plot_ship_percentile_lat_LWP.py -echo '**********************************************' -echo 'plotting mean aerosol size distribution for ship measurements' -python plot_ship_pdf_AerosolSize.py -echo '**********************************************' -echo 'calculate mean statistics of CN for ship measurements' -python calc_statistic_ship_CN.py -echo '**********************************************' -echo 'plotting timeseries of aerosol size distribution for ship measurements' -python contour_ship_timeseries_AerosolSize.py -endif # end evaluate with ship measurements - -########################################################### -# end -########################################################### -echo '*********** end plotting **************' -cd ../../scripts/ - -end - -exit - diff --git a/scripts/scripts_plotting_jobsubmit.csh b/scripts/scripts_plotting_jobsubmit.csh deleted file mode 100755 index 7922ebf..0000000 --- a/scripts/scripts_plotting_jobsubmit.csh +++ /dev/null @@ -1,220 +0,0 @@ -#!/bin/csh - -#SBATCH --nodes=1 -#SBATCH --time=03:00:00 -#SBATCH --qos=regular -#SBATCH --constraint=knl -#SBATCH --account=m3525 -#SBATCH --output=a.out -#SBATCH --error=a.err - -# This script makes user-specified plots comparing model simulations with ARM measurements. -# -# -# ############################################################ -# # Step 1: change settings in settings.py # -# # such as campaign name and model names # -# ############################################################ -# -# # load modules. Tested version is Python 3.6.7 (Constance) and Python 3.8.5 (NERSC) - module load python - -# # this should be consistent with settings.py -# set field campaign name. More settings on specific field campaigns are in next section -#set campaign = 'ACEENA' # HISCALE, ACEENA, CSET, SOCRATES, MAGIC, MARCUS -foreach campaign ('MAGIC' 'MARCUS' 'CSET' 'SOCRATES' 'HISCALE' 'ACEENA') - -# set model names. up to three -# set Model_List = "['CTRL','Nuc','NucSoaCond']" -set Model_List = "['E3SMv1']" - -# set plotting line colors for each model. corresponding to the Model_List -# set color_model = "['b','r','g']" -set color_model = "['r','b','g']" - -# set IOP (or flight date) that the statistics, pdf and percentiles are averaged for. -# options: IOP1, IOP2, ALL, 20160830b -set IOP = 'IOP1' -#foreach IOP ('IOP1' 'IOP2') - -# ############################################################ -# # Step 2: update settings.py with the above settings # -# ############################################################ - -sed -i "s/^campaign = .*/campaign = '$campaign'/" settings.py -sed -i "s/^Model_List = .*/Model_List = $Model_List/" settings.py -sed -i "s/^color_model = .*/color_model = $color_model/" settings.py -sed -i "s/^IOP = .*/IOP = '$IOP'/" settings.py - -# remove ^M in the file -sed -i "s/\r//g" settings.py -# - -# ############################################################ -# # Step 3: start plotting # -# ############################################################ - -cp settings.py ../python/plotting/settings.py -echo '***** start plotting ********' -echo 'enter the plotting directory: ../python/plotting/' -cd ../python/plotting/ - -############# evaluate with flight measurements ################ -if (($campaign == 'HISCALE') || ($campaign == 'ACEENA') || ($campaign == 'CSET') ||($campaign == 'SOCRATES')) then -echo '**********************************************' -echo 'plotting flight infomation' -python plot_flight_track_height.py -# timeseries comparison for each flight -echo '**********************************************' -echo 'plotting CN number timeseries for flight' -python plot_flight_timeseries_CN.py -echo '**********************************************' -echo 'plotting timeseries of aerosol PDF' -python contour_flight_timeseries_AerosolSize.py -echo '**********************************************' -echo 'plotting CCN number timeseries for flight' -python plot_flight_timeseries_CCN.py -# mean statistics for the entire IOP -echo '**********************************************' -echo 'calculate statistics of CN number for flight' -python calc_statistic_flight_CN.py -echo '**********************************************' -echo 'plotting mean aerosol PDF' -python plot_flight_pdf_AerosolSize.py -# vertical profiles or percentiles -echo '**********************************************' -echo 'plotting percentiles of CN number with height' -python plot_flight_percentile_z_CN.py -echo '**********************************************' -echo 'plotting percentiles of CCN number with height' -python plot_flight_percentile_z_CCN.py -# vertical profiles or percentiles of cloud -echo '**********************************************' -echo 'plotting vertical profile of cloud frequency' -python plot_flight_profile_z_CldFreq.py -echo '**********************************************' -echo 'plotting vertical profile of cloud LWC' -python plot_flight_profile_z_LWC.py -if (($campaign == 'CSET') ||($campaign == 'SOCRATES')) then - echo '**********************************************' - echo 'plotting flight height percentile in latitude bins' - python plot_flight_percentile_lat_cldfreq.py - echo '**********************************************' - echo 'plotting flight CN percentile in latitude bins' - python plot_flight_percentile_lat_CN.py - echo '**********************************************' - echo 'plotting flight CCN percentile in latitude bins' - python plot_flight_percentile_lat_CCN.py -endif -if (($campaign == 'HISCALE') ||($campaign == 'ACEENA')) then - echo '**********************************************' - echo 'plotting vertical profile of cloud' - python plot_profile_cloud.py - echo '**********************************************' - echo 'plotting aerosol composition timeseries for flight' - python plot_flight_timeseries_AerosolComposition.py - echo '**********************************************' - echo 'plotting percentiles of Aerosol COmposition with height' - python plot_flight_percentile_z_AerosolComposition.py -endif -# specific plotting separated by PBLH or clouds -if ($campaign == 'ACEENA') then - echo '**********************************************' - echo 'plotting aerosol PDF and percentile separated by near surface, near cloud, above cloud' - python plot_flight_pdf_percentile_SeparateCloud_aceena.py -endif -if ($campaign == 'HISCALE') then - echo '**********************************************' - echo 'plotting aerosol PDF and percentile separated by below/above PBLH' - python plot_flight_pdf_percentile_SeparatePBLH_hiscale.py -endif -endif # end evaluate with flight measurements - - -############# evaluate with surface measurements ################ -if (($campaign == 'HISCALE') || ($campaign == 'ACEENA')) then -# timeseries -echo '**********************************************' -echo 'plotting CN number timeseries at surface' -python plot_sfc_timeseries_CN.py -echo '**********************************************' -echo 'plotting CCN number timeseries at surface' -python plot_sfc_timeseries_CCN.py -echo '**********************************************' -echo 'plotting aerosol composition timeseries at surface' -python plot_sfc_timeseries_AerosolComposition.py -echo '**********************************************' -echo 'plotting timeseries of aerosol PDF' -python contour_sfc_timeseries_AerosolSize.py -# diurnal cycle -echo '**********************************************' -echo 'plotting diurnalcycle of CN number at surface' -python plot_sfc_diurnalcycle_CN.py -echo '**********************************************' -echo 'plotting diurnalcycle of CCN number at surface' -python plot_sfc_diurnalcycle_CCN.py -echo '**********************************************' -echo 'plotting diurnalcycle of Aerosol COmposition at surface' -python plot_sfc_diurnalcycle_AerosolComposition.py -echo '**********************************************' -echo 'plotting diurnal cycle of aerosol PDF' -python contour_sfc_diurnalcycle_AerosolSize.py -# mean statistics -echo '**********************************************' -echo 'calculate statistics of CN number at surface' -python calc_statistic_sfc_CN.py -echo '**********************************************' -echo 'plotting mean aerosol PDF' -python plot_sfc_pdf_AerosolSize.py -echo '**********************************************' -echo 'plotting fraction of surface aerosol composition' -python plot_sfc_pie_AerosolComposition.py -endif # end evaluate with surface measurements - - -############# evaluate with ship measurements ################ -if (($campaign == 'MAGIC') ||($campaign == 'MARCUS')) then -# timeseries -echo '**********************************************' -echo 'plotting meterological fields timeseries for ship measurements' -python plot_ship_timeseries_met.py -echo '**********************************************' -echo 'plotting CN number timeseries for ship measurements' -python plot_ship_timeseries_CN.py -echo '**********************************************' -echo 'plotting CCN number timeseries for ship measurements' -python plot_ship_timeseries_CCN.py -# statistics -echo '**********************************************' -echo 'plotting meterological fields percentiles in latitude for ship measurements' -python plot_ship_percentile_lat_met.py -echo '**********************************************' -echo 'plotting CN number percentiles in latitude for ship measurements' -python plot_ship_percentile_lat_CN.py -echo '**********************************************' -echo 'plotting CCN number percentiles in latitude for ship measurements' -python plot_ship_percentile_lat_CCN.py -echo '**********************************************' -echo 'plotting LWP composition in latitude for ship measurements' -python plot_ship_percentile_lat_LWP.py -echo '**********************************************' -echo 'plotting mean aerosol size distribution for ship measurements' -python plot_ship_pdf_AerosolSize.py -echo '**********************************************' -echo 'calculate mean statistics of CN for ship measurements' -python calc_statistic_ship_CN.py -echo '**********************************************' -echo 'plotting timeseries of aerosol size distribution for ship measurements' -python contour_ship_timeseries_AerosolSize.py -endif # end evaluate with ship measurements - -########################################################### -# end -########################################################### -echo '*********** end plotting **************' -cd ../../scripts/ - -end - -exit - diff --git a/scripts/scripts_preprocess.csh b/scripts/scripts_preprocess.csh deleted file mode 100755 index 3c19b1d..0000000 --- a/scripts/scripts_preprocess.csh +++ /dev/null @@ -1,111 +0,0 @@ -#!/bin/csh - - -# Kai Zhang provides aerosol data from E3SM simulations that are extracted for aircraft tracks and for selected ARM sites. However, those data are column variables and cover ~3 degrees around the ARM sites. This script extract the variables along the flight track, or the surface variables at the ARM site for direct comparison with ARM measurements. -# -# -# ############################################################ -# # Step 1: change settings in settings.py # -# # such as campaign name and model names # -# # campaign name also needs to be set here # -# ############################################################ -# -# # load modules. Tested version is Python 3.6.7 (Constance) and Python 3.8.5 (NERSC) - module load python - -# # this should be consistent with settings.py -# set field campaign name. More settings on specific field campaigns are in next section -set campaign = 'HISCALE' # HISCALE, ACEENA, CSET, SOCRATES, MAGIC, MARCUS - -# set model names. up to three -# set Model_List = "['CTRL','Nuc','NucSoaCond']" -set Model_List = "['EAMv1_CONUS_RRM']" - -# set plotting line colors for each model. corresponding to the Model_List -# set color_model = "['b','r','g']" -set color_model = "['b','g']" - -# set IOP (or flight date) that the statistics, pdf and percentiles are averaged for. -# options: IOP1, IOP2, ALL, 20160830b -# set IOP = 'IOP1' -foreach IOP ('IOP1' 'IOP2') - - -# ############################################################ -# # Step 2: update settings.py with the above settings # -# ############################################################ - -sed -i "s/^campaign = .*/campaign = '$campaign'/" settings.py -sed -i "s/^Model_List = .*/Model_List = $Model_List/" settings.py -sed -i "s/^color_model = .*/color_model = $color_model/" settings.py -sed -i "s/^IOP = .*/IOP = '$IOP'/" settings.py - -# remove ^M in the file -sed -i "s/\r//g" settings.py - -# ############################################################ -# # Step 3: preprocessing obs and/or model data # -# ############################################################ - -cp settings.py ../python/preprocessing/settings.py -echo '***** start preprocessing ********' -echo 'enter the preprocess directory: ../python/preprocessing/' -cd ../python/preprocessing/ - -# # for observation -# merge observed aerosol sizes from several aircraft instruments -#echo '**** merge aerosol size distribution: ****' -#if ($campaign == 'HiScale') then -# python prep_obs_mergesize_HiScale.py -#else if ($campaign == 'ACEENA') -# python prep_obs_mergesize_ACEENA.py -#else -# echo 'ERROR: not recognize campaign name' -#endif - -# for models -if (($campaign == 'HISCALE') || ($campaign == 'ACEENA')) then -echo '**********************************************' -echo '**** extract aerosol size distribution at Surface ****' -python prep_E3SM_sfc_bins.py -echo '**********************************************' -echo '**** extract all other variables at Surface ****' -python prep_E3SM_sfc_allvars.py -echo '**********************************************' -echo '**** extract vertical profiles at ARM site ****' -python prep_E3SM_profile_allvars.py -endif - -if (($campaign == 'HISCALE') || ($campaign == 'ACEENA') || ($campaign == 'CSET') ||($campaign == 'SOCRATES')) then -echo '**********************************************' -echo '**** extract aerosol size distribution for aircraft tracks ****' -python prep_E3SM_flighttrack_bins.py -echo '**********************************************' -echo '**** extract all other variables for aircraft tracks ****' -python prep_E3SM_flighttrack_allvars.py -endif - -if (($campaign == 'MAGIC') ||($campaign == 'MARCUS')) then -echo '**********************************************' -echo '**** extract all other variables along ship tracks ****' -python prep_E3SM_shiptrack_allvars.py -echo '**********************************************' -echo '**** extract aerosol size distribution along ship tracks ****' -python prep_E3SM_shiptrack_bins.py -echo '**********************************************' -echo '**** extract vertical profiles along ship tracks ****' -python prep_E3SM_shiptrack_profiles.py -endif - -# ############################################################ -# # Step 4: end of preprocessing # -# ############################################################ - -echo '***** finished ******' - -cd ../../scripts/ - -end - -exit - diff --git a/scripts/scripts_testcase.csh b/scripts/scripts_testcase.csh deleted file mode 100755 index a8ec211..0000000 --- a/scripts/scripts_testcase.csh +++ /dev/null @@ -1,75 +0,0 @@ -#!/bin/csh - - -# This script makes user-specified plots comparing model simulations with ARM measurements. -# -# -# ############################################################ -# # Step 1: change settings in settings.py # -# # such as campaign name and model names # -# ############################################################ -# -# # load modules. Tested version is Python 3.6.7 (Constance) and Python 3.8.5 (NERSC) - module load python - -# # this should be consistent with settings.py -# set field campaign name. More settings on specific field campaigns are in next section -set campaign = 'ACEENA' # HISCALE, ACEENA, CSET, SOCRATES, MAGIC, MARCUS -#foreach campaign ('MAGIC' 'MARCUS' 'CSET' 'SOCRATES') - -# set model names. up to three -# set Model_List = "['CTRL','Nuc','NucSoaCond']" -set Model_List = "['E3SMv1']" - -# set plotting line colors for each model. corresponding to the Model_List -# set color_model = "['b','r','g']" -set color_model = "['r','b','g']" - -# set IOP (or flight date) that the statistics, pdf and percentiles are averaged for. -# options: IOP1, IOP2, ALL, 20160830b -set IOP = 'IOP1' -# foreach IOP ('IOP1' 'IOP2') - -# ############################################################ -# # Step 2: update settings.py with the above settings # -# ############################################################ - -sed -i "s/^campaign = .*/campaign = '$campaign'/" settings_testcase.py -sed -i "s/^Model_List = .*/Model_List = $Model_List/" settings_testcase.py -sed -i "s/^color_model = .*/color_model = $color_model/" settings_testcase.py -sed -i "s/^IOP = .*/IOP = '$IOP'/" settings_testcase.py - -# remove ^M in the file -sed -i "s/\r//g" settings_testcase.py -# - -# ############################################################ -# # Step 3: start plotting # -# ############################################################ - -cp settings_testcase.py ../python/plotting/settings.py - -echo '***** start testcase ********' -echo 'enter the plotting directory: ../python/plotting/' -cd ../python/plotting/ - -############# evaluate with flight measurements ################ -echo '**********************************************' -echo 'plotting flight infomation' -python plot_flight_track_height.py -# timeseries comparison for each flight -echo '**********************************************' -echo 'plotting aerosol composition timeseries for flight' -python plot_flight_timeseries_AerosolComposition.py - - -########################################################### -# end -########################################################### -echo '*********** finishing testcase **************' -cd ../../scripts/ - -# end - -exit - diff --git a/scripts/settings.py b/scripts/settings.py deleted file mode 100644 index 21d9d9e..0000000 --- a/scripts/settings.py +++ /dev/null @@ -1,235 +0,0 @@ -# settings of the aerosol diagnostic package - -import numpy as np - -#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -# global settings - -############ these settings will be replaced by the settings in scripts_*.csh ############# -# set field campaign name. More settings on specific field campaigns are in next section -campaign = 'MAGIC' -# set model names. up to three -Model_List = ['E3SMv1'] -# set line colors for each model. corresponding to the Model_List -color_model = ['r','b','g'] -# set IOP that the statistics, pdf and percentiles are averaged for. Only available for HISCALE and ACEENA -# IOP1/IOP2 -IOP = 'IOP1' -############ these settings will be replaced by the settings in scripts_*.csh ############# - - -# path of the diagnostic package -package_path = '../../' - -# path of E3SM model data (h3) for preprocessing. list with the same length of Model_List -E3SM_h3_path=[] -E3SM_h3_filehead=[] # filename before .cam.h3.yyyy-mm-dd.00000.nc -for mm in Model_List: - E3SM_h3_path.append('/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_h3/') - if campaign=='MAGIC': - E3SM_h3_filehead.append(mm+'_2012-2013') - else: -# E3SM_h3_filehead.append(mm+'_2014-2018') - E3SM_h3_filehead.append(mm) - #E3SM_h3_path.append('/qfs/projects/eagles/zhan524/simulations/compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm+'/h3/') - #E3SM_h3_filehead.append('compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm) - -# path of output figures -figpath_aircraft_timeseries = package_path+'figures/'+campaign+'/aircraft/timeseries/' -figpath_aircraft_statistics = package_path+'figures/'+campaign+'/aircraft/statistics/' -figpath_ship_timeseries = package_path+'figures/'+campaign+'/ship/timeseries/' -figpath_ship_statistics = package_path+'figures/'+campaign+'/ship/statistics/' -figpath_sfc_timeseries = package_path+'figures/'+campaign+'/surface/timeseries/' -figpath_sfc_statistics = package_path+'figures/'+campaign+'/surface/statistics/' -figpath_profile_timeseries = package_path+'figures/'+campaign+'/profile/timeseries/' - - -#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -# settings for different field campaigns - -# set location and time information -if campaign=='HISCALE': - site='SGP' - # lat/lon at SGP - lat0 = 36.6059 - lon0 = 360-97.48792 # 0-360 - # bin of flight heights to calculate percentiles - height_bin = np.arange(300,4300,300) - # height_bin = np.arange(400,4300,200) - - # time periods for IOPs. needed in preprocessing of surface data - if IOP=='IOP1': - start_date='2016-04-25' - end_date='2016-05-29' - elif IOP=='IOP2': - start_date='2016-08-27' - end_date='2016-09-22' - - # observational data path. - # aircraf measurements merged_bin data are used for all plot_flight_*.py to provide flight/cloud/CVI info - merged_size_path=package_path+'data/'+campaign+'/obs/aircraft/merged_bin/' - iwgpath = package_path+'data/'+campaign+'/obs/aircraft/mei-iwg1/' - fimspath = package_path+'data/'+campaign+'/obs/aircraft/wang-fims/' - pcasppath = package_path+'data/'+campaign+'/obs/aircraft/tomlinson-pcasp/' - cvipath = package_path+'data/'+campaign+'/obs/aircraft/pekour-cvi/' - cpcpath = package_path+'data/'+campaign+'/obs/aircraft/mei-cpc/' - ccnpath = package_path+'data/'+campaign+'/obs/aircraft/mei-ccn/' - amspath = package_path+'data/'+campaign+'/obs/aircraft/shilling-ams/' - wcmpath = package_path+'data/'+campaign+'/obs/aircraft/matthews-wcm/' - # surface measurements - smps_pnnl_path = package_path+'data/'+campaign+'/obs/surface/pnnl-smps/' - smps_bnl_path = package_path+'data/'+campaign+'/obs/surface/bnl-smps/' - nanosmps_bnl_path = package_path+'data/'+campaign+'/obs/surface/bnl-nanosmps/' - uhsassfcpath = package_path+'data/'+campaign+'/obs/surface/arm-uhsas/' - cpcsfcpath = package_path+'data/'+campaign+'/obs/surface/arm-cpc/' - cpcusfcpath = package_path+'data/'+campaign+'/obs/surface/arm-cpcu/' - ccnsfcpath = package_path+'data/'+campaign+'/obs/surface/arm-ccn/' - metpath = package_path+'data/'+campaign+'/obs/surface/arm-met/' - acsmpath = package_path+'data/'+campaign+'/obs/surface/arm_acsm/' - # vertical profile measurements - armbepath = package_path+'data/'+campaign+'/obs/profile/sgparmbecldrad/' - - # PBLH data needed for plot_flight_pdf_percentile_SeparatePBLH_hiscale.py only - pblhpath = package_path+'data/'+campaign+'/obs/profile/arm-pblh/' - dlpath = package_path+'data/'+campaign+'/obs/profile/dl-pblh/' - - # model path - # pre-processed model path - E3SM_sfc_path = package_path+'data/'+campaign+'/model/surface/' - E3SM_aircraft_path = package_path+'data/'+campaign+'/model/flighttrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - - -elif campaign=='ACEENA': - site='ENA' - # lat/lon for ENA - lat0 = 39.09527 - lon0 = 360-28.0339 - # bin of flight heights to calculate percentiles - height_bin = np.arange(100,4300,300) - - # time periods for IOPs. needed in preprocessing of surface data - if IOP=='IOP1': - start_date='2017-06-20' - end_date='2017-07-20' - elif IOP=='IOP2': - start_date='2018-01-21' - end_date='2018-02-19' - - # observational data path. - # aircraf measurements merged_bin data are used for all plot_flight_*.py to provide flight/cloud/CVI info - merged_size_path=package_path+'data/'+campaign+'/obs/aircraft/merged_bin/' - iwgpath = package_path+'data/'+campaign+'/obs/aircraft/IWG/' - fimspath = package_path+'data/'+campaign+'/obs/aircraft/FIMS/' - pcasppath = package_path+'data/'+campaign+'/obs/aircraft/pcasp_g1/' - cvipath = package_path+'data/'+campaign+'/obs/aircraft/inletcvi/' - opcpath = package_path+'data/'+campaign+'/obs/aircraft/opciso/' - cpcpath = package_path+'data/'+campaign+'/obs/aircraft/cpc_aaf/' - ccnpath = package_path+'data/'+campaign+'/obs/aircraft/ccn_aaf/' - amspath = package_path+'data/'+campaign+'/obs/aircraft/shilling-hrfams/' - wcmpath = package_path+'data/'+campaign+'/obs/aircraft/wcm_ACEENA/' - # surface measurements - uhsassfcpath = package_path+'data/'+campaign+'/obs/surface/arm_uhsas/' - cpcsfcpath = package_path+'data/'+campaign+'/obs/surface/arm_cpcf/' - cpcusfcpath = 'N/A' - ccnsfcpath = package_path+'data/'+campaign+'/obs/surface/arm_aosccn1/' - metpath = package_path+'data/'+campaign+'/obs/surface/arm_met/' - acsmpath = package_path+'data/'+campaign+'/obs/surface/arm_acsm/' - # vertical profile measurements - armbepath = package_path+'data/'+campaign+'/obs/profile/enaarmbecldrad/' - - # model path - # pre-processed model path - E3SM_sfc_path = package_path+'data/'+campaign+'/model/surface/' - E3SM_aircraft_path = package_path+'data/'+campaign+'/model/flighttrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -elif campaign=='MAGIC': - site='MAG' - - # bin of latitude to calculate ship track composite - latbin = np.arange(21.5,34,1) - - # reference lat/lon - lat0=30. - lon0=230. - - # observational data path. - # ship measurements - shipmetpath=package_path+'data/'+campaign+'/obs/ship/raynolds-marmet/' - shipccnpath=package_path+'data/'+campaign+'/obs/ship/magaosccn100M1.a1/' - shipcpcpath=package_path+'data/'+campaign+'/obs/ship/magaoscpcfM1.a1/' - shipmwrpath=package_path+'data/'+campaign+'/obs/ship/magmwrret1liljclouM1.s2/' - shipuhsaspath=package_path+'data/'+campaign+'/obs/ship/magaosuhsasM1.a1/' - - # model path - # pre-processed model path - E3SM_ship_path = package_path+'data/'+campaign+'/model/shiptrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -elif campaign=='MARCUS': - site='MAR' - - # bin of latitude to calculate ship track composite - latbin = np.arange(-68.5,-42,1) - - # reference lat/lon - lat0=-40. - lon0=120. - - - # observational data path. - # ship measurements - shipmetpath=package_path+'data/'+campaign+'/obs/ship/maraadmetX1.b1/' - shipccnpath=package_path+'data/'+campaign+'/obs/ship/maraosccn1colavgM1.b1/' - shipcpcpath=package_path+'data/'+campaign+'/obs/ship/maraoscpcf1mM1.b1/' - shipmwrpath=package_path+'data/'+campaign+'/obs/ship/marmwrret1liljclouM1.s2/' - shipuhsaspath=package_path+'data/'+campaign+'/obs/ship/maraosuhsasM1.a1/' - - # model path - # pre-processed model path - E3SM_ship_path = package_path+'data/'+campaign+'/model/shiptrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -elif campaign=='CSET': - # bin of flight heights to calculate percentiles - height_bin = np.arange(200,8000,400) - # bin of latitude to calculate composite percentiles, same as MAGIC - latbin = np.arange(22.5,39,1) - - # lat/lon at the airport - lat0 = 38.5564 - lon0 = 360-121.3120 - - # observational data path. - # aircraft measurements - RFpath=package_path+'data/'+campaign+'/obs/aircraft/aircraft_lowrate/' - ccnpath='N/A' - - # model path - # pre-processed model path - E3SM_aircraft_path = package_path+'data/'+campaign+'/model/flighttrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -elif campaign=='SOCRATES': - # bin of flight heights to calculate percentiles - height_bin = np.arange(200,8000,400) - # bin of latitude to calculate composite percentiles - latbin = np.arange(-63.5,-42,1) - # height_bin = np.arange(200,7000,400) - # lat/lon at the airport - lat0 = -42.8371 - lon0 = 147.5054 - - # observational data path. - # aircraft measurements - RFpath=package_path+'data/'+campaign+'/obs/aircraft/aircraft_lowrate/' - ccnpath=package_path+'data/'+campaign+'/obs/aircraft/CCN/' - - # model path - # pre-processed model path - E3SM_aircraft_path = package_path+'data/'+campaign+'/model/flighttrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -else: - raise ValueError("does not recognize this campaign: "+campaign) diff --git a/scripts/settings_testcase.py b/scripts/settings_testcase.py deleted file mode 100644 index 0fbd259..0000000 --- a/scripts/settings_testcase.py +++ /dev/null @@ -1,83 +0,0 @@ -# settings of the aerosol diagnostic package - -import numpy as np - -#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -# global settings -############ these settings will be replaced by the settings in scripts_*.csh ############# -# set field campaign name. More settings on specific field campaigns are in next section -campaign = 'ACEENA' -# set model names. up to three -Model_List = ['E3SMv1'] -# set line colors for each model. corresponding to the Model_List -color_model = ['r','b','g'] -# set IOP that the statistics, pdf and percentiles are averaged for. Only available for HISCALE and ACEENA -# IOP1/IOP2 -IOP = 'IOP1' -############ these settings will be replaced by the settings in scripts_*.csh ############# - - -# path of the diagnostic package -package_path = '../../' - -# path of E3SM model data (h3) for preprocessing. list with the same length of Model_List -E3SM_h3_path=[] -E3SM_h3_filehead=[] # filename before .cam.h3.yyyy-mm-dd.00000.nc -for mm in Model_List: - E3SM_h3_path.append('/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_h3/') - if campaign=='MAGIC': - E3SM_h3_filehead.append(mm+'_2012-2013') - else: -# E3SM_h3_filehead.append(mm+'_2014-2018') - E3SM_h3_filehead.append(mm) - #E3SM_h3_path.append('/qfs/projects/eagles/zhan524/simulations/compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm+'/h3/') - #E3SM_h3_filehead.append('compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm) - -# path of output figures -figpath_aircraft_timeseries = package_path+'testcase/figures/' -figpath_aircraft_statistics = package_path+'testcase/figures/' -figpath_ship_timeseries = package_path+'testcase/figures/' -figpath_ship_statistics = package_path+'testcase/figures/' -figpath_sfc_timeseries = package_path+'testcase/figures/' -figpath_sfc_statistics = package_path+'testcase/figures/' -figpath_profile_timeseries = package_path+'testcase/figures/' - - -#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -# settings for different field campaigns - -# set location and time information -if campaign=='ACEENA': - site='ENA' - # lat/lon for ENA - lat0 = 39.09527 - lon0 = 360-28.0339 - # bin of flight heights to calculate percentiles - height_bin = np.arange(100,4300,300) - - # time periods for IOPs. needed in preprocessing of surface data - if IOP=='IOP1': - start_date='2017-06-30' - end_date='2017-06-31' - elif IOP=='IOP2': - start_date='2018-01-21' - end_date='2018-02-19' - - # observational data path. - # aircraf measurements merged_bin data are used for all plot_flight_*.py to provide flight/cloud/CVI info - merged_size_path=package_path+'testcase/data/obs/' - iwgpath = package_path+'testcase/data/obs/' - cvipath = package_path+'testcase/data/obs/' - amspath = package_path+'testcase/data/obs/AMS/' - - # model path - # pre-processed model path - E3SM_aircraft_path = package_path+'testcase/data/model/' - - -else: - raise ValueError("Test case should only for ACEENA. Current campaign is: "+campaign) - -# Long list of blah.run_plot() - - diff --git a/src/esmac_diags/plotting/__init__.py b/src/esmac_diags/plotting/__init__.py index e69de29..2d659f2 100644 --- a/src/esmac_diags/plotting/__init__.py +++ b/src/esmac_diags/plotting/__init__.py @@ -0,0 +1,4 @@ +import glob +from os.path import basename, dirname, join +all_files = glob.glob(join(dirname(__file__), '*.py')) +__all__ = [basename(fname)[:-3] for fname in all_files if not fname.endswith('__.py')] diff --git a/src/esmac_diags/plotting/calc_statistic_flight_CN.py b/src/esmac_diags/plotting/calc_statistic_flight_CN.py index 886ffbe..f1d6d6f 100644 --- a/src/esmac_diags/plotting/calc_statistic_flight_CN.py +++ b/src/esmac_diags/plotting/calc_statistic_flight_CN.py @@ -4,9 +4,6 @@ # compare models and CPC measurements """ -import sys - -# import matplotlib.pyplot as plt import os import glob import numpy as np @@ -15,379 +12,333 @@ from ..subroutines.read_netcdf import read_merged_size,read_extractflight from ..subroutines.quality_control import qc_cpc_air, qc_remove_neg, qc_mask_takeoff_landing -#%% settings - -from settings import campaign, Model_List, E3SM_aircraft_path, figpath_aircraft_statistics +def run_plot(settings): + #%% variables from settings -if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, cpcpath,merged_size_path -elif campaign in ['CSET', 'SOCRATES']: - from settings import RFpath -else: - raise ValueError('please check campaign name: '+campaign) - -if not os.path.exists(figpath_aircraft_statistics): - os.makedirs(figpath_aircraft_statistics) - -missing_value = -999999. + campaign = settings['campaign'] + Model_List = settings['Model_List'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_statistics = settings['figpath_aircraft_statistics'] -#%% find files for flight information + IOP = settings.get('IOP', None) + cpcpath = settings.get('cpcpath', None) + merged_size_path = settings.get('merged_size_path', None) + RFpath = settings.get('RFpath', None) -lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') -lst.sort() -if len(lst)==0: - raise ValueError('cannot find any file') -# choose files for specific IOP -if campaign=='HISCALE': - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() -elif campaign=='ACEENA': - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() - -alldates = [x.split('_')[-1].split('.')[0] for x in lst] + #%% other settings + if not os.path.exists(figpath_aircraft_statistics): + os.makedirs(figpath_aircraft_statistics) + + missing_value = np.nan -#%% read all data - -uhsas100_o = np.empty(0) # large particles. UHSAS for CSET and SOCRATES, PCASP for ACEENA and HISCALE -cpc10_o = np.empty(0) -cpc3_o = np.empty(0) -ncn100_m = [] -ncn10_m = [] -ncn3_m = [] -nmodels=len(Model_List) -for mm in range(nmodels): - ncn100_m.append(np.empty(0)) - ncn10_m.append(np.empty(0)) - ncn3_m.append(np.empty(0)) + #%% find files for flight information -print('reading '+format(len(alldates))+' files to calculate the statistics: ') - -for date in alldates: - print(date) + lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') + lst.sort() + if len(lst)==0: + raise ValueError('cannot find any file') + # choose files for specific IOP + if campaign=='HISCALE': + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + elif campaign=='ACEENA': + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + + alldates = [x.split('_')[-1].split('.')[0] for x in lst] + + #%% read all data - #%% read in Models + uhsas100_o = np.empty(0) # large particles. UHSAS for CSET and SOCRATES, PCASP for ACEENA and HISCALE + cpc10_o = np.empty(0) + cpc3_o = np.empty(0) + ncn100_m = [] + ncn10_m = [] + ncn3_m = [] + nmodels=len(Model_List) for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - - (timem,heightm,cpc_m,timeunitm,ncn_unit,ncn_longname)=read_extractflight(filename_m,'NCN') - (timem,heightm,cpcu_m,timeunitm,ncnu_unit,ncnu_longname)=read_extractflight(filename_m,'NUCN') - (timem,heightm,ncnall,timeunitm,ncnall_unit,ncnall_longname)=read_extractflight(filename_m,'NCNall') - - if campaign=='HISCALE': - if IOP=='IOP1': # PCASP for HISCALE IOP1 size from 0.12 to 3 um - ncn100_m[mm] = np.hstack((ncn100_m[mm], np.sum(ncnall[120:,:],0)*1e-6)) - elif IOP=='IOP2': # PCASP for HISCALE IOP1 size from 0.09 to 3 um - ncn100_m[mm] = np.hstack((ncn100_m[mm], np.sum(ncnall[90:,:],0)*1e-6)) - else: - ncn100_m[mm] = np.hstack((ncn100_m[mm], np.sum(ncnall[100:,:],0)*1e-6)) - ncn10_m[mm] = np.hstack((ncn10_m[mm], cpc_m*1e-6)) # #/m3 to #/cm3 - ncn3_m[mm] = np.hstack((ncn3_m[mm], cpcu_m*1e-6)) # #/m3 to #/cm3 + ncn100_m.append(np.empty(0)) + ncn10_m.append(np.empty(0)) + ncn3_m.append(np.empty(0)) + print('reading '+format(len(alldates))+' files to calculate the statistics: ') + + for date in alldates: + print(date) - #%% read in flight measurements (CPC and PCASP) for HISCALE and ACEENA - if campaign in ['HISCALE', 'ACEENA']: - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 - if campaign=='HISCALE': - filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_HiScale001s.ict.txt') - filename_merge = merged_size_path+'merged_bin_fims_pcasp_HISCALE_'+date+'.nc' - elif campaign=='ACEENA': - filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_ACEENA001s.ict') - filename_merge = merged_size_path+'merged_bin_fims_pcasp_opc_ACEENA_'+date+'.nc' - filename_c.sort() - - # read in CPC - if len(filename_c)==1 or len(filename_c)==2: # some days have two flights - (cpc,cpclist)=read_cpc(filename_c[flightidx-1]) - # fill missing timestep - if np.logical_and(campaign=='ACEENA', date=='20180216a'): - cpc=np.insert(cpc,1404,(cpc[:,1403]+cpc[:,1404])/2,axis=1) - elif np.logical_and(campaign=='HISCALE', date=='20160425a'): - cpc=np.insert(cpc,0,cpc[:,0],axis=1) - cpc[0,0]=cpc[0,0]-1 - time_cpc = cpc[0,:] - cpc10 = cpc[1,:] - cpc3 = cpc[2,:] - elif len(filename_c)==0: - time_cpc=timem - cpc10=np.nan*np.empty([len(timem)]) - cpc3=np.nan*np.empty([len(timem)]) - else: - raise ValueError('find too many files: '+filename_c) - - # some quality checks - (cpc3,cpc10) = qc_cpc_air(cpc3, cpc10) + #%% read in Models + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - # read in PCASP - (time_merge,size,pcasp,timeunit,pcaspunit,pcasplongname)=read_merged_size(filename_merge,'totalnum_pcasp') - pcasp=qc_remove_neg(pcasp) - if len(time_merge)!=len(time_cpc): - raise ValueError('time dimension is inconsistent ') + (timem,heightm,cpc_m,timeunitm,ncn_unit,ncn_longname)=read_extractflight(filename_m,'NCN') + (timem,heightm,cpcu_m,timeunitm,ncnu_unit,ncnu_longname)=read_extractflight(filename_m,'NUCN') + (timem,heightm,ncnall,timeunitm,ncnall_unit,ncnall_longname)=read_extractflight(filename_m,'NCNall') + + if campaign=='HISCALE': + if IOP=='IOP1': # PCASP for HISCALE IOP1 size from 0.12 to 3 um + ncn100_m[mm] = np.hstack((ncn100_m[mm], np.sum(ncnall[120:,:],0)*1e-6)) + elif IOP=='IOP2': # PCASP for HISCALE IOP1 size from 0.09 to 3 um + ncn100_m[mm] = np.hstack((ncn100_m[mm], np.sum(ncnall[90:,:],0)*1e-6)) + else: + ncn100_m[mm] = np.hstack((ncn100_m[mm], np.sum(ncnall[100:,:],0)*1e-6)) + ncn10_m[mm] = np.hstack((ncn10_m[mm], cpc_m*1e-6)) # #/m3 to #/cm3 + ncn3_m[mm] = np.hstack((ncn3_m[mm], cpcu_m*1e-6)) # #/m3 to #/cm3 + + + #%% read in flight measurements (CPC and PCASP) for HISCALE and ACEENA + if campaign in ['HISCALE', 'ACEENA']: + if date[-1]=='a': + flightidx=1 + else: + flightidx=2 + if campaign=='HISCALE': + filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_HiScale001s.ict.txt') + filename_merge = merged_size_path+'merged_bin_fims_pcasp_HISCALE_'+date+'.nc' + elif campaign=='ACEENA': + filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_ACEENA001s.ict') + filename_merge = merged_size_path+'merged_bin_fims_pcasp_opc_ACEENA_'+date+'.nc' + filename_c.sort() + + # read in CPC + if len(filename_c)==1 or len(filename_c)==2: # some days have two flights + (cpc,cpclist)=read_cpc(filename_c[flightidx-1]) + # fill missing timestep + if np.logical_and(campaign=='ACEENA', date=='20180216a'): + cpc=np.insert(cpc,1404,(cpc[:,1403]+cpc[:,1404])/2,axis=1) + elif np.logical_and(campaign=='HISCALE', date=='20160425a'): + cpc=np.insert(cpc,0,cpc[:,0],axis=1) + cpc[0,0]=cpc[0,0]-1 + time_cpc = cpc[0,:] + cpc10 = cpc[1,:] + cpc3 = cpc[2,:] + elif len(filename_c)==0: + time_cpc=timem + cpc10=np.nan*np.empty([len(timem)]) + cpc3=np.nan*np.empty([len(timem)]) + else: + raise ValueError('find too many files: '+filename_c) + + # some quality checks + (cpc3,cpc10) = qc_cpc_air(cpc3, cpc10) + + # read in PCASP + (time_merge,size,pcasp,timeunit,pcaspunit,pcasplongname)=read_merged_size(filename_merge,'totalnum_pcasp') + pcasp=qc_remove_neg(pcasp) + if len(time_merge)!=len(time_cpc): + raise ValueError('time dimension is inconsistent ') + + # exclude 30min after takeoff and before landing + cpc3 = qc_mask_takeoff_landing(time_cpc,cpc3) + cpc10 = qc_mask_takeoff_landing(time_cpc,cpc10) + pcasp = qc_mask_takeoff_landing(time_cpc,pcasp) + + cpc10_o=np.hstack((cpc10_o, cpc10)) + cpc3_o=np.hstack((cpc3_o, cpc3)) + uhsas100_o=np.hstack((uhsas100_o, pcasp)) - # exclude 30min after takeoff and before landing - cpc3 = qc_mask_takeoff_landing(time_cpc,cpc3) - cpc10 = qc_mask_takeoff_landing(time_cpc,cpc10) - pcasp = qc_mask_takeoff_landing(time_cpc,pcasp) + #%% read in flight data (for CSET and SOCRATES) + elif campaign in ['CSET', 'SOCRATES']: + filename = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') + if len(filename)==1 or len(filename)==2: # SOCRATES has two flights in 20180217, choose the later one + (time_cpc,cpc10,timeunit,cpc10unit,cpc10longname,cellsize,cellunit)=read_RF_NCAR(filename[-1],'CONCN') + if campaign=='CSET': + (time_cpc,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename[-1],'CONCU100_RWOOU') + elif campaign=='SOCRATES': + # there are two variables: CONCU100_CVIU and CONCU100_LWII + (time_cpc,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename[-1],'CONCU100_LWII') + else: + raise ValueError('find too many files: '+filename) + + # some quality checks + uhsas100=qc_remove_neg(uhsas100) + + # exclude 30min after takeoff and before landing + cpc10 = qc_mask_takeoff_landing(time_cpc,cpc10) + uhsas100 = qc_mask_takeoff_landing(time_cpc,uhsas100) + + cpc10_o=np.hstack((cpc10_o, cpc10)) + uhsas100_o=np.hstack((uhsas100_o, uhsas100)) + + + #%% calculate statistics + + # select only valid data in obs and the corresponding data in models + idx100 = ~np.isnan(uhsas100_o) + idx10 = ~np.isnan(cpc10_o) + idx3 = ~np.isnan(cpc3_o) + + mean100 = [None]*(nmodels+1) + mean10 = [None]*(nmodels+1) + mean3 = [None]*(nmodels+1) + std100 = [None]*(nmodels+1) + std10 = [None]*(nmodels+1) + std3 = [None]*(nmodels+1) + bias100 = [None]*(nmodels) + bias10 = [None]*(nmodels) + bias3 = [None]*(nmodels) + corr100 = [None]*(nmodels) + corr10 = [None]*(nmodels) + corr3 = [None]*(nmodels) + rmse100 = [None]*(nmodels) + rmse10 = [None]*(nmodels) + rmse3 = [None]*(nmodels) + p10_100 = [None]*(nmodels+1) + p10_10 = [None]*(nmodels+1) + p10_3 = [None]*(nmodels+1) + p25_100 = [None]*(nmodels+1) + p25_10 = [None]*(nmodels+1) + p25_3 = [None]*(nmodels+1) + p75_100 = [None]*(nmodels+1) + p75_10 = [None]*(nmodels+1) + p75_3 = [None]*(nmodels+1) + p90_100 = [None]*(nmodels+1) + p90_10 = [None]*(nmodels+1) + p90_3 = [None]*(nmodels+1) - cpc10_o=np.hstack((cpc10_o, cpc10)) - cpc3_o=np.hstack((cpc3_o, cpc3)) - uhsas100_o=np.hstack((uhsas100_o, pcasp)) + if sum(idx10)/len(idx10)<0.1: # two few observation available + # for obs + mean10[nmodels] = missing_value + std10[nmodels] = missing_value + p10_10[nmodels] = missing_value + p25_10[nmodels] = missing_value + p75_10[nmodels] = missing_value + p90_10[nmodels] = missing_value + # for models + for mm in range(nmodels): + mean10[mm] = np.nanmean(ncn10_m[mm][idx10]) + std10[mm] = np.nanstd(ncn10_m[mm][idx10]) + p10_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],10) + p25_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],25) + p75_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],75) + p90_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],90) + bias10[mm] = missing_value + corr10[mm] = [missing_value, missing_value] + rmse10[mm] = missing_value + else: + # for obs + mean10[nmodels] = np.nanmean(cpc10_o[idx10]) + std10[nmodels] = np.nanstd(cpc10_o[idx10]) + p10_10[nmodels] = np.nanpercentile(cpc10_o[idx10],10) + p25_10[nmodels] = np.nanpercentile(cpc10_o[idx10],25) + p75_10[nmodels] = np.nanpercentile(cpc10_o[idx10],75) + p90_10[nmodels] = np.nanpercentile(cpc10_o[idx10],90) + # for models + for mm in range(nmodels): + mean10[mm] = np.nanmean(ncn10_m[mm][idx10]) + std10[mm] = np.nanstd(ncn10_m[mm][idx10]) + p10_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],10) + p25_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],25) + p75_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],75) + p90_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],90) + bias10[mm] = mean10[mm] - mean10[nmodels] + c10 = scipy.stats.pearsonr(ncn10_m[mm][idx10],cpc10_o[idx10]) + corr10[mm] = [c10[0],c10[1]] + rmse10[mm] = np.sqrt(((ncn10_m[mm][idx10]-cpc10_o[idx10])**2).mean()) + + if sum(idx100)/len(idx100)<0.1: # two few observation available + # for obs + mean100[nmodels] = missing_value + std100[nmodels] = missing_value + p10_100[nmodels] = missing_value + p25_100[nmodels] = missing_value + p75_100[nmodels] = missing_value + p90_100[nmodels] = missing_value + # for models + for mm in range(nmodels): + mean100[mm] = np.nanmean(ncn100_m[mm][idx100]) + std100[mm] = np.nanstd(ncn100_m[mm][idx100]) + p10_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],10) + p25_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],25) + p75_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],75) + p90_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],90) + bias100[mm] = missing_value + corr100[mm] = [missing_value, missing_value] + rmse100[mm] = missing_value + else: + # for obs + mean100[nmodels] = np.nanmean(uhsas100_o[idx100]) + std100[nmodels] = np.nanstd(uhsas100_o[idx100]) + p10_100[nmodels] = np.nanpercentile(uhsas100_o[idx100],10) + p25_100[nmodels] = np.nanpercentile(uhsas100_o[idx100],25) + p75_100[nmodels] = np.nanpercentile(uhsas100_o[idx100],75) + p90_100[nmodels] = np.nanpercentile(uhsas100_o[idx100],90) + # for models + for mm in range(nmodels): + mean100[mm] = np.nanmean(ncn100_m[mm][idx100]) + std100[mm] = np.nanstd(ncn100_m[mm][idx100]) + p10_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],10) + p25_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],25) + p75_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],75) + p90_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],90) + bias100[mm] = mean100[mm] - mean100[nmodels] + c100 = scipy.stats.pearsonr(ncn100_m[mm][idx100],uhsas100_o[idx100]) + corr100[mm] = [c100[0],c100[1]] + rmse100[mm] = np.sqrt(((ncn100_m[mm][idx100]-uhsas100_o[idx100])**2).mean()) + + if len(idx3)==0 or sum(idx3)/len(idx3)<0.1: # two few observation available + # for obs + mean3[nmodels] = missing_value + std3[nmodels] = missing_value + p10_3[nmodels] = missing_value + p25_3[nmodels] = missing_value + p75_3[nmodels] = missing_value + p90_3[nmodels] = missing_value + # for models + for mm in range(nmodels): + mean3[mm] = np.nanmean(ncn3_m[mm][idx3]) + std3[mm] = np.nanstd(ncn3_m[mm][idx3]) + p10_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],10) + p25_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],25) + p75_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],75) + p90_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],90) + bias3[mm] = missing_value + corr3[mm] = [missing_value, missing_value] + rmse3[mm] = missing_value + else: + # for obs + mean3[nmodels] = np.nanmean(cpc3_o[idx3]) + std3[nmodels] = np.nanstd(cpc3_o[idx3]) + p10_3[nmodels] = np.nanpercentile(cpc3_o[idx3],10) + p25_3[nmodels] = np.nanpercentile(cpc3_o[idx3],25) + p75_3[nmodels] = np.nanpercentile(cpc3_o[idx3],75) + p90_3[nmodels] = np.nanpercentile(cpc3_o[idx3],90) + # for models + for mm in range(nmodels): + mean3[mm] = np.nanmean(ncn3_m[mm][idx3]) + std3[mm] = np.nanstd(ncn3_m[mm][idx3]) + p10_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],10) + p25_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],25) + p75_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],75) + p90_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],90) + bias3[mm] = mean3[mm] - mean3[nmodels] + c3 = scipy.stats.pearsonr(ncn3_m[mm][idx3],cpc3_o[idx3]) + corr3[mm] = [c3[0],c3[1]] + rmse3[mm] = np.sqrt(((ncn3_m[mm][idx3]-cpc3_o[idx3])**2).mean()) + + + #%% write out files - #%% read in flight data (for CSET and SOCRATES) + if campaign in ['HISCALE', 'ACEENA']: + outfile = figpath_aircraft_statistics+'statistics_CN10nm_'+campaign+'_'+IOP+'.txt' elif campaign in ['CSET', 'SOCRATES']: - filename = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') - if len(filename)==1 or len(filename)==2: # SOCRATES has two flights in 20180217, choose the later one - (time_cpc,cpc10,timeunit,cpc10unit,cpc10longname,cellsize,cellunit)=read_RF_NCAR(filename[-1],'CONCN') - if campaign=='CSET': - (time_cpc,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename[-1],'CONCU100_RWOOU') - elif campaign=='SOCRATES': - # there are two variables: CONCU100_CVIU and CONCU100_LWII - (time_cpc,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename[-1],'CONCU100_LWII') - else: - raise ValueError('find too many files: '+filename) - - # some quality checks - uhsas100=qc_remove_neg(uhsas100) - - # exclude 30min after takeoff and before landing - cpc10 = qc_mask_takeoff_landing(time_cpc,cpc10) - uhsas100 = qc_mask_takeoff_landing(time_cpc,uhsas100) - - cpc10_o=np.hstack((cpc10_o, cpc10)) - uhsas100_o=np.hstack((uhsas100_o, uhsas100)) - - -#%% calculate statistics - -# select only valid data in obs and the corresponding data in models -idx100 = ~np.isnan(uhsas100_o) -idx10 = ~np.isnan(cpc10_o) -idx3 = ~np.isnan(cpc3_o) - -mean100 = [None]*(nmodels+1) -mean10 = [None]*(nmodels+1) -mean3 = [None]*(nmodels+1) -std100 = [None]*(nmodels+1) -std10 = [None]*(nmodels+1) -std3 = [None]*(nmodels+1) -bias100 = [None]*(nmodels) -bias10 = [None]*(nmodels) -bias3 = [None]*(nmodels) -corr100 = [None]*(nmodels) -corr10 = [None]*(nmodels) -corr3 = [None]*(nmodels) -rmse100 = [None]*(nmodels) -rmse10 = [None]*(nmodels) -rmse3 = [None]*(nmodels) -p10_100 = [None]*(nmodels+1) -p10_10 = [None]*(nmodels+1) -p10_3 = [None]*(nmodels+1) -p25_100 = [None]*(nmodels+1) -p25_10 = [None]*(nmodels+1) -p25_3 = [None]*(nmodels+1) -p75_100 = [None]*(nmodels+1) -p75_10 = [None]*(nmodels+1) -p75_3 = [None]*(nmodels+1) -p90_100 = [None]*(nmodels+1) -p90_10 = [None]*(nmodels+1) -p90_3 = [None]*(nmodels+1) + outfile = figpath_aircraft_statistics+'statistics_CN10nm_'+campaign+'.txt' -if sum(idx10)/len(idx10)<0.1: # two few observation available - # for obs - mean10[nmodels] = missing_value - std10[nmodels] = missing_value - p10_10[nmodels] = missing_value - p25_10[nmodels] = missing_value - p75_10[nmodels] = missing_value - p90_10[nmodels] = missing_value - # for models - for mm in range(nmodels): - mean10[mm] = np.nanmean(ncn10_m[mm][idx10]) - std10[mm] = np.nanstd(ncn10_m[mm][idx10]) - p10_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],10) - p25_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],25) - p75_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],75) - p90_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],90) - bias10[mm] = missing_value - corr10[mm] = [missing_value, missing_value] - rmse10[mm] = missing_value -else: - # for obs - mean10[nmodels] = np.nanmean(cpc10_o[idx10]) - std10[nmodels] = np.nanstd(cpc10_o[idx10]) - p10_10[nmodels] = np.nanpercentile(cpc10_o[idx10],10) - p25_10[nmodels] = np.nanpercentile(cpc10_o[idx10],25) - p75_10[nmodels] = np.nanpercentile(cpc10_o[idx10],75) - p90_10[nmodels] = np.nanpercentile(cpc10_o[idx10],90) - # for models - for mm in range(nmodels): - mean10[mm] = np.nanmean(ncn10_m[mm][idx10]) - std10[mm] = np.nanstd(ncn10_m[mm][idx10]) - p10_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],10) - p25_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],25) - p75_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],75) - p90_10[mm] = np.nanpercentile(ncn10_m[mm][idx10],90) - bias10[mm] = mean10[mm] - mean10[nmodels] - c10 = scipy.stats.pearsonr(ncn10_m[mm][idx10],cpc10_o[idx10]) - corr10[mm] = [c10[0],c10[1]] - rmse10[mm] = np.sqrt(((ncn10_m[mm][idx10]-cpc10_o[idx10])**2).mean()) - -if sum(idx100)/len(idx100)<0.1: # two few observation available - # for obs - mean100[nmodels] = missing_value - std100[nmodels] = missing_value - p10_100[nmodels] = missing_value - p25_100[nmodels] = missing_value - p75_100[nmodels] = missing_value - p90_100[nmodels] = missing_value - # for models - for mm in range(nmodels): - mean100[mm] = np.nanmean(ncn100_m[mm][idx100]) - std100[mm] = np.nanstd(ncn100_m[mm][idx100]) - p10_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],10) - p25_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],25) - p75_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],75) - p90_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],90) - bias100[mm] = missing_value - corr100[mm] = [missing_value, missing_value] - rmse100[mm] = missing_value -else: - # for obs - mean100[nmodels] = np.nanmean(uhsas100_o[idx100]) - std100[nmodels] = np.nanstd(uhsas100_o[idx100]) - p10_100[nmodels] = np.nanpercentile(uhsas100_o[idx100],10) - p25_100[nmodels] = np.nanpercentile(uhsas100_o[idx100],25) - p75_100[nmodels] = np.nanpercentile(uhsas100_o[idx100],75) - p90_100[nmodels] = np.nanpercentile(uhsas100_o[idx100],90) - # for models - for mm in range(nmodels): - mean100[mm] = np.nanmean(ncn100_m[mm][idx100]) - std100[mm] = np.nanstd(ncn100_m[mm][idx100]) - p10_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],10) - p25_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],25) - p75_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],75) - p90_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],90) - bias100[mm] = mean100[mm] - mean100[nmodels] - c100 = scipy.stats.pearsonr(ncn100_m[mm][idx100],uhsas100_o[idx100]) - corr100[mm] = [c100[0],c100[1]] - rmse100[mm] = np.sqrt(((ncn100_m[mm][idx100]-uhsas100_o[idx100])**2).mean()) - -if len(idx3)==0 or sum(idx3)/len(idx3)<0.1: # two few observation available - # for obs - mean3[nmodels] = missing_value - std3[nmodels] = missing_value - p10_3[nmodels] = missing_value - p25_3[nmodels] = missing_value - p75_3[nmodels] = missing_value - p90_3[nmodels] = missing_value - # for models - for mm in range(nmodels): - mean3[mm] = np.nanmean(ncn3_m[mm][idx3]) - std3[mm] = np.nanstd(ncn3_m[mm][idx3]) - p10_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],10) - p25_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],25) - p75_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],75) - p90_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],90) - bias3[mm] = missing_value - corr3[mm] = [missing_value, missing_value] - rmse3[mm] = missing_value -else: - # for obs - mean3[nmodels] = np.nanmean(cpc3_o[idx3]) - std3[nmodels] = np.nanstd(cpc3_o[idx3]) - p10_3[nmodels] = np.nanpercentile(cpc3_o[idx3],10) - p25_3[nmodels] = np.nanpercentile(cpc3_o[idx3],25) - p75_3[nmodels] = np.nanpercentile(cpc3_o[idx3],75) - p90_3[nmodels] = np.nanpercentile(cpc3_o[idx3],90) - # for models - for mm in range(nmodels): - mean3[mm] = np.nanmean(ncn3_m[mm][idx3]) - std3[mm] = np.nanstd(ncn3_m[mm][idx3]) - p10_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],10) - p25_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],25) - p75_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],75) - p90_3[mm] = np.nanpercentile(ncn3_m[mm][idx3],90) - bias3[mm] = mean3[mm] - mean3[nmodels] - c3 = scipy.stats.pearsonr(ncn3_m[mm][idx3],cpc3_o[idx3]) - corr3[mm] = [c3[0],c3[1]] - rmse3[mm] = np.sqrt(((ncn3_m[mm][idx3]-cpc3_o[idx3])**2).mean()) - - -#%% write out files - -if campaign in ['HISCALE', 'ACEENA']: - outfile = figpath_aircraft_statistics+'statistics_CN10nm_'+campaign+'_'+IOP+'.txt' -elif campaign in ['CSET', 'SOCRATES']: - outfile = figpath_aircraft_statistics+'statistics_CN10nm_'+campaign+'.txt' - -print('write statistics to file '+outfile) - -with open(outfile, 'w') as f: - f.write('statistics of Aerosol Number Concentration comparing with CPC(>10nm). sample size '+format(sum(idx10))+'\n') - line1 = list(Model_List) - line1.insert(0,' --- ') - line1.append('OBS') - for ii in range(len(line1)): - f.write(format(line1[ii],'10s')+', ') - # write mean - f.write('\n mean,\t') - for ii in range(len(mean10)): - f.write(format(mean10[ii],'10.2f')+', ') - # write std - f.write('\n std. dev.,') - for ii in range(len(std10)): - f.write(format(std10[ii],'10.2f')+', ') - # write percentiles - f.write('\n 10% percentile: ') - for ii in range(len(p10_10)): - f.write(format(p10_10[ii],'10.2f')+', ') - f.write('\n 25% percentile: ') - for ii in range(len(p25_10)): - f.write(format(p25_10[ii],'10.2f')+', ') - f.write('\n 75% percentile: ') - for ii in range(len(p75_10)): - f.write(format(p75_10[ii],'10.2f')+', ') - f.write('\n 90% percentile: ') - for ii in range(len(p90_10)): - f.write(format(p90_10[ii],'10.2f')+', ') - # write bias - f.write('\n bias,\t') - for ii in range(len(bias10)): - f.write(format(bias10[ii],'10.2f')+', ') - # write rmse - f.write('\n RMSE,\t') - for ii in range(len(rmse10)): - f.write(format(rmse10[ii],'10.2f')+', ') - # write correlation - f.write('\n corrcoef,\t') - for ii in range(len(rmse10)): - f.write(format(corr10[ii][0],'10.4f')+', ') - # write p value of correlation - f.write('\n P_corr,\t') - for ii in range(len(rmse10)): - f.write(format(corr10[ii][1],'10.2f')+', ') - - -if campaign in ['HISCALE', 'ACEENA']: - outfile = figpath_aircraft_statistics+'statistics_CN3nm_'+campaign+'_'+IOP+'.txt' print('write statistics to file '+outfile) + with open(outfile, 'w') as f: - f.write('statistics of Aerosol Number Concentration comparing with CPC(>3nm). sample size '+format(sum(idx3))+'\n') + f.write('statistics of Aerosol Number Concentration comparing with CPC(>10nm). sample size '+format(sum(idx10))+'\n') line1 = list(Model_List) line1.insert(0,' --- ') line1.append('OBS') @@ -395,95 +346,144 @@ f.write(format(line1[ii],'10s')+', ') # write mean f.write('\n mean,\t') - for ii in range(len(mean3)): - f.write(format(mean3[ii],'10.2f')+', ') + for ii in range(len(mean10)): + f.write(format(mean10[ii],'10.2f')+', ') # write std f.write('\n std. dev.,') - for ii in range(len(std3)): - f.write(format(std3[ii],'10.2f')+', ') + for ii in range(len(std10)): + f.write(format(std10[ii],'10.2f')+', ') # write percentiles f.write('\n 10% percentile: ') - for ii in range(len(p10_3)): - f.write(format(p10_3[ii],'10.2f')+', ') + for ii in range(len(p10_10)): + f.write(format(p10_10[ii],'10.2f')+', ') f.write('\n 25% percentile: ') - for ii in range(len(p25_3)): - f.write(format(p25_3[ii],'10.2f')+', ') + for ii in range(len(p25_10)): + f.write(format(p25_10[ii],'10.2f')+', ') f.write('\n 75% percentile: ') - for ii in range(len(p75_3)): - f.write(format(p75_3[ii],'10.2f')+', ') + for ii in range(len(p75_10)): + f.write(format(p75_10[ii],'10.2f')+', ') f.write('\n 90% percentile: ') - for ii in range(len(p90_3)): - f.write(format(p90_3[ii],'10.2f')+', ') + for ii in range(len(p90_10)): + f.write(format(p90_10[ii],'10.2f')+', ') # write bias f.write('\n bias,\t') - for ii in range(len(bias3)): - f.write(format(bias3[ii],'10.2f')+', ') + for ii in range(len(bias10)): + f.write(format(bias10[ii],'10.2f')+', ') # write rmse f.write('\n RMSE,\t') - for ii in range(len(rmse3)): - f.write(format(rmse3[ii],'10.2f')+', ') + for ii in range(len(rmse10)): + f.write(format(rmse10[ii],'10.2f')+', ') # write correlation f.write('\n corrcoef,\t') - for ii in range(len(rmse3)): - f.write(format(corr3[ii][0],'10.4f')+', ') + for ii in range(len(rmse10)): + f.write(format(corr10[ii][0],'10.4f')+', ') # write p value of correlation f.write('\n P_corr,\t') - for ii in range(len(rmse3)): - f.write(format(corr3[ii][1],'10.2f')+', ') - - -if campaign in ['HISCALE', 'ACEENA']: - outfile = figpath_aircraft_statistics+'statistics_CN100nm_'+campaign+'_'+IOP+'.txt' -elif campaign in ['CSET', 'SOCRATES']: - outfile = figpath_aircraft_statistics+'statistics_CN100nm_'+campaign+'.txt' -print('write statistics to file '+outfile) - -with open(outfile, 'w') as f: - if campaign in ['CSET', 'SOCRATES']: - f.write('statistics of Aerosol Number Concentration comparing with UHSAS(>100nm). sample size '+format(sum(idx100))+'\n') - elif campaign=='ACEENA': - f.write('statistics of Aerosol Number Concentration comparing with PCASP(>100nm). sample size '+format(sum(idx100))+'\n') - elif campaign=='HISCALE': - f.write('statistics of Aerosol Number Concentration comparing with PCASP(>120nm for IOP1, >90nm for IOP2). sample size '+format(sum(idx100))+'\n') - line1 = list(Model_List) - line1.insert(0,' --- ') - line1.append('OBS') - for ii in range(len(line1)): - f.write(format(line1[ii],'10s')+', ') - # write mean - f.write('\n mean,\t') - for ii in range(len(mean100)): - f.write(format(mean100[ii],'10.2f')+', ') - # write std - f.write('\n std. dev.,') - for ii in range(len(std100)): - f.write(format(std100[ii],'10.2f')+', ') - # write percentiles - f.write('\n 10% percentile: ') - for ii in range(len(p10_100)): - f.write(format(p10_100[ii],'10.2f')+', ') - f.write('\n 25% percentile: ') - for ii in range(len(p25_100)): - f.write(format(p25_100[ii],'10.2f')+', ') - f.write('\n 75% percentile: ') - for ii in range(len(p75_100)): - f.write(format(p75_100[ii],'10.2f')+', ') - f.write('\n 90% percentile: ') - for ii in range(len(p90_100)): - f.write(format(p90_100[ii],'10.2f')+', ') - # write bias - f.write('\n bias,\t') - for ii in range(len(bias100)): - f.write(format(bias100[ii],'10.2f')+', ') - # write rmse - f.write('\n RMSE,\t') - for ii in range(len(rmse100)): - f.write(format(rmse100[ii],'10.2f')+', ') - # write correlation - f.write('\n corrcoef,\t') - for ii in range(len(rmse100)): - f.write(format(corr100[ii][0],'10.4f')+', ') - # write p value of correlation - f.write('\n P_corr,\t') - for ii in range(len(rmse100)): - f.write(format(corr100[ii][1],'10.2f')+', ') \ No newline at end of file + for ii in range(len(rmse10)): + f.write(format(corr10[ii][1],'10.2f')+', ') + + + if campaign in ['HISCALE', 'ACEENA']: + outfile = figpath_aircraft_statistics+'statistics_CN3nm_'+campaign+'_'+IOP+'.txt' + print('write statistics to file '+outfile) + with open(outfile, 'w') as f: + f.write('statistics of Aerosol Number Concentration comparing with CPC(>3nm). sample size '+format(sum(idx3))+'\n') + line1 = list(Model_List) + line1.insert(0,' --- ') + line1.append('OBS') + for ii in range(len(line1)): + f.write(format(line1[ii],'10s')+', ') + # write mean + f.write('\n mean,\t') + for ii in range(len(mean3)): + f.write(format(mean3[ii],'10.2f')+', ') + # write std + f.write('\n std. dev.,') + for ii in range(len(std3)): + f.write(format(std3[ii],'10.2f')+', ') + # write percentiles + f.write('\n 10% percentile: ') + for ii in range(len(p10_3)): + f.write(format(p10_3[ii],'10.2f')+', ') + f.write('\n 25% percentile: ') + for ii in range(len(p25_3)): + f.write(format(p25_3[ii],'10.2f')+', ') + f.write('\n 75% percentile: ') + for ii in range(len(p75_3)): + f.write(format(p75_3[ii],'10.2f')+', ') + f.write('\n 90% percentile: ') + for ii in range(len(p90_3)): + f.write(format(p90_3[ii],'10.2f')+', ') + # write bias + f.write('\n bias,\t') + for ii in range(len(bias3)): + f.write(format(bias3[ii],'10.2f')+', ') + # write rmse + f.write('\n RMSE,\t') + for ii in range(len(rmse3)): + f.write(format(rmse3[ii],'10.2f')+', ') + # write correlation + f.write('\n corrcoef,\t') + for ii in range(len(rmse3)): + f.write(format(corr3[ii][0],'10.4f')+', ') + # write p value of correlation + f.write('\n P_corr,\t') + for ii in range(len(rmse3)): + f.write(format(corr3[ii][1],'10.2f')+', ') + + + if campaign in ['HISCALE', 'ACEENA']: + outfile = figpath_aircraft_statistics+'statistics_CN100nm_'+campaign+'_'+IOP+'.txt' + elif campaign in ['CSET', 'SOCRATES']: + outfile = figpath_aircraft_statistics+'statistics_CN100nm_'+campaign+'.txt' + print('write statistics to file '+outfile) + + with open(outfile, 'w') as f: + if campaign in ['CSET', 'SOCRATES']: + f.write('statistics of Aerosol Number Concentration comparing with UHSAS(>100nm). sample size '+format(sum(idx100))+'\n') + elif campaign=='ACEENA': + f.write('statistics of Aerosol Number Concentration comparing with PCASP(>100nm). sample size '+format(sum(idx100))+'\n') + elif campaign=='HISCALE': + f.write('statistics of Aerosol Number Concentration comparing with PCASP(>120nm for IOP1, >90nm for IOP2). sample size '+format(sum(idx100))+'\n') + line1 = list(Model_List) + line1.insert(0,' --- ') + line1.append('OBS') + for ii in range(len(line1)): + f.write(format(line1[ii],'10s')+', ') + # write mean + f.write('\n mean,\t') + for ii in range(len(mean100)): + f.write(format(mean100[ii],'10.2f')+', ') + # write std + f.write('\n std. dev.,') + for ii in range(len(std100)): + f.write(format(std100[ii],'10.2f')+', ') + # write percentiles + f.write('\n 10% percentile: ') + for ii in range(len(p10_100)): + f.write(format(p10_100[ii],'10.2f')+', ') + f.write('\n 25% percentile: ') + for ii in range(len(p25_100)): + f.write(format(p25_100[ii],'10.2f')+', ') + f.write('\n 75% percentile: ') + for ii in range(len(p75_100)): + f.write(format(p75_100[ii],'10.2f')+', ') + f.write('\n 90% percentile: ') + for ii in range(len(p90_100)): + f.write(format(p90_100[ii],'10.2f')+', ') + # write bias + f.write('\n bias,\t') + for ii in range(len(bias100)): + f.write(format(bias100[ii],'10.2f')+', ') + # write rmse + f.write('\n RMSE,\t') + for ii in range(len(rmse100)): + f.write(format(rmse100[ii],'10.2f')+', ') + # write correlation + f.write('\n corrcoef,\t') + for ii in range(len(rmse100)): + f.write(format(corr100[ii][0],'10.4f')+', ') + # write p value of correlation + f.write('\n P_corr,\t') + for ii in range(len(rmse100)): + f.write(format(corr100[ii][1],'10.2f')+', ') \ No newline at end of file diff --git a/src/esmac_diags/plotting/calc_statistic_sfc_CN.py b/src/esmac_diags/plotting/calc_statistic_sfc_CN.py index 215532a..d474e0d 100644 --- a/src/esmac_diags/plotting/calc_statistic_sfc_CN.py +++ b/src/esmac_diags/plotting/calc_statistic_sfc_CN.py @@ -4,8 +4,6 @@ # compare models and CPC measurements """ -import sys - # import matplotlib.pyplot as plt import os import glob @@ -18,530 +16,527 @@ from ..subroutines.specific_data_treatment import avg_time_1d -#%% settings - -from settings import campaign, cpcsfcpath, cpcusfcpath, uhsassfcpath, Model_List, \ - IOP, start_date, end_date, E3SM_sfc_path, figpath_sfc_statistics - -# set time range you want to average -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date,'noleap') -cday2 = yyyymmdd2cday(end_date,'noleap') -if start_date[0:4]!=end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] - -# # in calendar day -# if campaign=='ACEENA': -# if IOP=='IOP1': -# time_range = [172,212] -# elif IOP=='IOP2': -# time_range = [1,59] -# elif campaign=='HiScale': -# if IOP=='IOP1': -# time_range = [115,157] -# elif IOP=='IOP2': -# time_range = [238,268] - - -if not os.path.exists(figpath_sfc_statistics): - os.makedirs(figpath_sfc_statistics) - -missing_value = -999999. -missing_value = np.nan +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + cpcsfcpath = settings['cpcsfcpath'] + cpcusfcpath = settings['cpcusfcpath'] + uhsassfcpath = settings['uhsassfcpath'] + start_date = settings['start_date'] + end_date = settings['end_date'] + E3SM_sfc_path = settings['E3SM_sfc_path'] + figpath_sfc_statistics = settings['figpath_sfc_statistics'] -#%% read in obs data -if campaign=='ACEENA': - # cpc - if IOP=='IOP1': - lst = glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.2017062*')+glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201707*') - elif IOP=='IOP2': - lst = glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201801*')+glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201802*') - lst.sort() - t_cpc=np.empty(0) - cpc=np.empty(0) - for filename in lst: - (time,data,qc,timeunit,cpcunit)=read_cpc(filename) - data = qc_mask_qcflag(data,qc) - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - # average in time for consistent comparison with model - time2=np.arange(0,86400,3600) - data2 = avg_time_1d(np.array(time),np.array(data),time2) - t_cpc=np.hstack((t_cpc, cday+time2/86400)) - cpc=np.hstack((cpc, data2)) - # fill missing days - t_cpc2=np.arange(cday1*24,cday2*24+0.01,1)/24. - cpc2=avg_time_1d(t_cpc,cpc,t_cpc2) - cpc=cpc2 - t_cpc=t_cpc2 - cpc = qc_remove_neg(cpc) - # no cpcu - t_cpcu = np.array(np.nan) - cpcu = np.array(np.nan) + IOP = settings.get('IOP', None) - # uhsas - if IOP=='IOP1': - lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.2017062*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201707*') - elif IOP=='IOP2': - lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201801*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201802*') - lst.sort() - t_uhsas=np.empty(0) - uhsas=np.empty(0) - for filename in lst: - (time,dmin,dmax,data,timeunit,uhsasunit,long_name)=read_uhsas(filename) - # sum up uhsas data for size >100nm - data=np.ma.filled(data,np.nan) - idx100 = dmin>=100 - data1=np.nansum(data[:,idx100],1) - # average in time for consistent comparison with model - time2=np.arange(0,86400,3600) - data2 = avg_time_1d(np.array(time),np.array(data1),time2) - t_uhsas=np.hstack((t_uhsas, timeunit2cday(timeunit)+time2/86400)) - uhsas=np.hstack((uhsas, data2)) - # fill missing days - t_uhsas2=np.arange(cday1*24,cday2*24+0.01,1)/24. - uhsas2=avg_time_1d(t_uhsas,uhsas,t_uhsas2) - uhsas=uhsas2 - t_uhsas=t_uhsas2 + #%% other settings + # set time range you want to average + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date,'noleap') + cday2 = yyyymmdd2cday(end_date,'noleap') + if start_date[0:4]!=end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] + + if not os.path.exists(figpath_sfc_statistics): + os.makedirs(figpath_sfc_statistics) -elif campaign=='HISCALE': - # cpc - if IOP=='IOP1': - lst = glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201604*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201605*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201606*') - elif IOP=='IOP2': - lst = glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201608*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201609*') - lst.sort() - t_cpc=np.empty(0) - cpc=np.empty(0) - if len(lst)==0: - t_cpc = np.array(np.nan) - cpc = np.array(np.nan) - else: + missing_value = np.nan + + + #%% read in obs data + if campaign=='ACEENA': + # cpc + if IOP=='IOP1': + lst = glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.2017062*')+glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201707*') + elif IOP=='IOP2': + lst = glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201801*')+glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201802*') + lst.sort() + t_cpc=np.empty(0) + cpc=np.empty(0) for filename in lst: (time,data,qc,timeunit,cpcunit)=read_cpc(filename) - data = qc_mask_qcflag_cpc(data,qc) + data = qc_mask_qcflag(data,qc) timestr=timeunit.split(' ') date=timestr[2] cday=yyyymmdd2cday(date,'noleap') - t_cpc= np.hstack((t_cpc,cday+time/86400)) - cpc=np.hstack((cpc,data)) - # average in time for consistent comparison with model + # average in time for consistent comparison with model + time2=np.arange(0,86400,3600) + data2 = avg_time_1d(np.array(time),np.array(data),time2) + t_cpc=np.hstack((t_cpc, cday+time2/86400)) + cpc=np.hstack((cpc, data2)) + # fill missing days t_cpc2=np.arange(cday1*24,cday2*24+0.01,1)/24. cpc2=avg_time_1d(t_cpc,cpc,t_cpc2) cpc=cpc2 t_cpc=t_cpc2 cpc = qc_remove_neg(cpc) - - # cpcu - if IOP=='IOP1': - lst = glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201604*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201605*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201606*') - elif IOP=='IOP2': - lst = glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201608*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201609*') - lst.sort() - t_cpcu=np.empty(0) - cpcu=np.empty(0) - if len(lst)==0: + # no cpcu t_cpcu = np.array(np.nan) cpcu = np.array(np.nan) - else: + + # uhsas + if IOP=='IOP1': + lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.2017062*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201707*') + elif IOP=='IOP2': + lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201801*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201802*') + lst.sort() + t_uhsas=np.empty(0) + uhsas=np.empty(0) for filename in lst: - (time,data,qc,timeunit,cpcuunit)=read_cpc(filename) - data = qc_mask_qcflag_cpc(data,qc) - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - # t_cpcu= np.hstack((t_cpcu,cday+time/86400)) - # cpcu=np.hstack((cpcu,data)) + (time,dmin,dmax,data,timeunit,uhsasunit,long_name)=read_uhsas(filename) + # sum up uhsas data for size >100nm + data=np.ma.filled(data,np.nan) + idx100 = dmin>=100 + data1=np.nansum(data[:,idx100],1) # average in time for consistent comparison with model time2=np.arange(0,86400,3600) - data2 = avg_time_1d(np.array(time),np.array(data),time2) - t_cpcu=np.hstack((t_cpcu, cday+time2/86400)) - cpcu=np.hstack((cpcu, data2)) - cpcu = qc_remove_neg(cpcu) - # # average in time for consistent comparison with model - # t_cpcu2=np.arange(t_cpcu[0]*24,t_cpcu[-1]*24,1)/24. - # cpcu2=avg_time_1d(t_cpcu,cpcu,t_cpcu2) - # cpcu=cpcu2 - # t_cpcu=t_cpcu2 + data2 = avg_time_1d(np.array(time),np.array(data1),time2) + t_uhsas=np.hstack((t_uhsas, timeunit2cday(timeunit)+time2/86400)) + uhsas=np.hstack((uhsas, data2)) + # fill missing days + t_uhsas2=np.arange(cday1*24,cday2*24+0.01,1)/24. + uhsas2=avg_time_1d(t_uhsas,uhsas,t_uhsas2) + uhsas=uhsas2 + t_uhsas=t_uhsas2 - # uhsas - if IOP=='IOP1': - lst = glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201604*')+glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201605*')+glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201606*') - elif IOP=='IOP2': - lst = glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201608*')+glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201609*') - lst.sort() - t_uhsas=np.empty(0) - uhsas=np.empty(0) - for filename in lst: - (time,dmin,dmax,data,timeunit,uhsasunit,long_name)=read_uhsas(filename) - # sum up uhsas data for size >100nm - data=np.ma.filled(data,np.nan) - idx100 = dmin>=100 - data1=np.nansum(data[:,idx100],1) - # average in time for consistent comparison with model - time2=np.arange(0,86400,3600) - data2 = avg_time_1d(np.array(time),np.array(data1),time2) - t_uhsas=np.hstack((t_uhsas, timeunit2cday(timeunit)+time2/86400)) - uhsas=np.hstack((uhsas, data2)) - # fill missing days - t_uhsas2=np.arange(cday1*24,cday2*24+0.01,1)/24. - uhsas2=avg_time_1d(t_uhsas,uhsas,t_uhsas2) - uhsas=uhsas2 - t_uhsas=t_uhsas2 - - -#%% read in models -ncn100_m = [] -ncn_m = [] -nucn_m = [] -nmodels = len(Model_List) -for mm in range(nmodels): - tmp_ncn100=np.empty(0) - tmp_ncn=np.empty(0) - tmp_nucn=np.empty(0) - timem=np.empty(0) - for cday in range(cday1,cday2+1): - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] - filename_input = E3SM_sfc_path+'SFC_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - (time,ncn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NCN') - (time,nucn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NUCN') - (time,ncnall,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NCNall') + elif campaign=='HISCALE': + # cpc + if IOP=='IOP1': + lst = glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201604*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201605*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201606*') + elif IOP=='IOP2': + lst = glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201608*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201609*') + lst.sort() + t_cpc=np.empty(0) + cpc=np.empty(0) + if len(lst)==0: + t_cpc = np.array(np.nan) + cpc = np.array(np.nan) + else: + for filename in lst: + (time,data,qc,timeunit,cpcunit)=read_cpc(filename) + data = qc_mask_qcflag_cpc(data,qc) + timestr=timeunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + t_cpc= np.hstack((t_cpc,cday+time/86400)) + cpc=np.hstack((cpc,data)) + # average in time for consistent comparison with model + t_cpc2=np.arange(cday1*24,cday2*24+0.01,1)/24. + cpc2=avg_time_1d(t_cpc,cpc,t_cpc2) + cpc=cpc2 + t_cpc=t_cpc2 + cpc = qc_remove_neg(cpc) + + # cpcu + if IOP=='IOP1': + lst = glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201604*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201605*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201606*') + elif IOP=='IOP2': + lst = glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201608*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201609*') + lst.sort() + t_cpcu=np.empty(0) + cpcu=np.empty(0) + if len(lst)==0: + t_cpcu = np.array(np.nan) + cpcu = np.array(np.nan) + else: + for filename in lst: + (time,data,qc,timeunit,cpcuunit)=read_cpc(filename) + data = qc_mask_qcflag_cpc(data,qc) + timestr=timeunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + # t_cpcu= np.hstack((t_cpcu,cday+time/86400)) + # cpcu=np.hstack((cpcu,data)) + # average in time for consistent comparison with model + time2=np.arange(0,86400,3600) + data2 = avg_time_1d(np.array(time),np.array(data),time2) + t_cpcu=np.hstack((t_cpcu, cday+time2/86400)) + cpcu=np.hstack((cpcu, data2)) + cpcu = qc_remove_neg(cpcu) + # # average in time for consistent comparison with model + # t_cpcu2=np.arange(t_cpcu[0]*24,t_cpcu[-1]*24,1)/24. + # cpcu2=avg_time_1d(t_cpcu,cpcu,t_cpcu2) + # cpcu=cpcu2 + # t_cpcu=t_cpcu2 + + # uhsas + if IOP=='IOP1': + lst = glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201604*')+glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201605*')+glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201606*') + elif IOP=='IOP2': + lst = glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201608*')+glob.glob(uhsassfcpath+'sgpaosuhsasS01.a1.201609*') + lst.sort() + t_uhsas=np.empty(0) + uhsas=np.empty(0) + for filename in lst: + (time,dmin,dmax,data,timeunit,uhsasunit,long_name)=read_uhsas(filename) + # sum up uhsas data for size >100nm + data=np.ma.filled(data,np.nan) + idx100 = dmin>=100 + data1=np.nansum(data[:,idx100],1) + # average in time for consistent comparison with model + time2=np.arange(0,86400,3600) + data2 = avg_time_1d(np.array(time),np.array(data1),time2) + t_uhsas=np.hstack((t_uhsas, timeunit2cday(timeunit)+time2/86400)) + uhsas=np.hstack((uhsas, data2)) + # fill missing days + t_uhsas2=np.arange(cday1*24,cday2*24+0.01,1)/24. + uhsas2=avg_time_1d(t_uhsas,uhsas,t_uhsas2) + uhsas=uhsas2 + t_uhsas=t_uhsas2 - timem = np.hstack((timem,time)) - tmp_ncn = np.hstack((tmp_ncn,ncn*1e-6)) - tmp_nucn = np.hstack((tmp_nucn,nucn*1e-6)) - tmp_ncn100 = np.hstack((tmp_ncn100, np.sum(ncnall[100:,:],0)*1e-6)) + + #%% read in models + ncn100_m = [] + ncn_m = [] + nucn_m = [] + nmodels = len(Model_List) + for mm in range(nmodels): + tmp_ncn100=np.empty(0) + tmp_ncn=np.empty(0) + tmp_nucn=np.empty(0) + timem=np.empty(0) + for cday in range(cday1,cday2+1): + mmdd=cday2mmdd(cday) + date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + + filename_input = E3SM_sfc_path+'SFC_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + (time,ncn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NCN') + (time,nucn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NUCN') + (time,ncnall,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NCNall') + + timem = np.hstack((timem,time)) + tmp_ncn = np.hstack((tmp_ncn,ncn*1e-6)) + tmp_nucn = np.hstack((tmp_nucn,nucn*1e-6)) + tmp_ncn100 = np.hstack((tmp_ncn100, np.sum(ncnall[100:,:],0)*1e-6)) + + ncn100_m.append(tmp_ncn100) + ncn_m.append(tmp_ncn) + nucn_m.append(tmp_nucn) + + #%% calculate statistics - ncn100_m.append(tmp_ncn100) - ncn_m.append(tmp_ncn) - nucn_m.append(tmp_nucn) + # only choose the prescribed time range + idx = np.logical_and(t_cpc>=cday1, t_cpc<=cday2) + cpc=cpc[idx] + t_cpc=t_cpc[idx] + idx = np.logical_and(t_cpcu>=cday1, t_cpcu<=cday2) + cpcu=cpcu[idx] + t_cpcu=t_cpcu[idx] + idx = np.logical_and(t_uhsas>=cday1, t_uhsas<=cday2) + uhsas=uhsas[idx] + t_uhsas=t_uhsas[idx] + idx = np.logical_and(timem>=cday1, timem<=cday2) + for mm in range(nmodels): + ncn100_m[mm]=ncn100_m[mm][idx] + ncn_m[mm]=ncn_m[mm][idx] + nucn_m[mm]=nucn_m[mm][idx] + timem=timem[idx] -#%% calculate statistics - -# only choose the prescribed time range -idx = np.logical_and(t_cpc>=cday1, t_cpc<=cday2) -cpc=cpc[idx] -t_cpc=t_cpc[idx] -idx = np.logical_and(t_cpcu>=cday1, t_cpcu<=cday2) -cpcu=cpcu[idx] -t_cpcu=t_cpcu[idx] -idx = np.logical_and(t_uhsas>=cday1, t_uhsas<=cday2) -uhsas=uhsas[idx] -t_uhsas=t_uhsas[idx] -idx = np.logical_and(timem>=cday1, timem<=cday2) -for mm in range(nmodels): - ncn100_m[mm]=ncn100_m[mm][idx] - ncn_m[mm]=ncn_m[mm][idx] - nucn_m[mm]=nucn_m[mm][idx] -timem=timem[idx] - - - -# select only valid data in obs and the corresponding data in models -idx100 = ~np.isnan(uhsas) -idx10 = ~np.isnan(cpc) -idx3 = ~np.isnan(cpcu) - -mean100 = [None]*(nmodels+1) -mean10 = [None]*(nmodels+1) -mean3 = [None]*(nmodels+1) -std100 = [None]*(nmodels+1) -std10 = [None]*(nmodels+1) -std3 = [None]*(nmodels+1) -bias100 = [None]*(nmodels) -bias10 = [None]*(nmodels) -bias3 = [None]*(nmodels) -corr100 = [None]*(nmodels) -corr10 = [None]*(nmodels) -corr3 = [None]*(nmodels) -rmse100 = [None]*(nmodels) -rmse10 = [None]*(nmodels) -rmse3 = [None]*(nmodels) -p10_100 = [None]*(nmodels+1) -p10_10 = [None]*(nmodels+1) -p10_3 = [None]*(nmodels+1) -p25_100 = [None]*(nmodels+1) -p25_10 = [None]*(nmodels+1) -p25_3 = [None]*(nmodels+1) -p75_100 = [None]*(nmodels+1) -p75_10 = [None]*(nmodels+1) -p75_3 = [None]*(nmodels+1) -p90_100 = [None]*(nmodels+1) -p90_10 = [None]*(nmodels+1) -p90_3 = [None]*(nmodels+1) -if len(idx100)==0 or sum(idx100)/len(idx100)<0.1: # two few observation available - # for obs - mean100[nmodels] = missing_value - std100[nmodels] = missing_value - p10_100[nmodels] = missing_value - p25_100[nmodels] = missing_value - p75_100[nmodels] = missing_value - p90_100[nmodels] = missing_value - # for models - for mm in range(nmodels): - mean100[mm] = np.nanmean(ncn100_m[mm][idx100]) - std100[mm] = np.nanstd(ncn100_m[mm][idx100]) - p10_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],10) - p25_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],25) - p75_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],75) - p90_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],90) - bias100[mm] = missing_value - corr100[mm] = [missing_value, missing_value] - rmse100[mm] = missing_value -else: - # for obs - mean100[nmodels] = np.nanmean(uhsas[idx100]) - std100[nmodels] = np.nanstd(uhsas[idx100]) - p10_100[nmodels] = np.nanpercentile(uhsas[idx100],10) - p25_100[nmodels] = np.nanpercentile(uhsas[idx100],25) - p75_100[nmodels] = np.nanpercentile(uhsas[idx100],75) - p90_100[nmodels] = np.nanpercentile(uhsas[idx100],90) - # for models - for mm in range(nmodels): - mean100[mm] = np.nanmean(ncn100_m[mm][idx100]) - std100[mm] = np.nanstd(ncn100_m[mm][idx100]) - p10_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],10) - p25_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],25) - p75_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],75) - p90_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],90) - bias100[mm] = mean100[mm] - mean100[nmodels] - c100 = scipy.stats.pearsonr(ncn100_m[mm][idx100],uhsas[idx100]) - corr100[mm] = [c100[0],c100[1]] - rmse100[mm] = np.sqrt(((ncn100_m[mm][idx100]-uhsas[idx100])**2).mean()) - -if len(idx10)==0 or sum(idx10)/len(idx10)<0.1: # two few observation available - # for obs - mean10[nmodels] = missing_value - std10[nmodels] = missing_value - p10_10[nmodels] = missing_value - p25_10[nmodels] = missing_value - p75_10[nmodels] = missing_value - p90_10[nmodels] = missing_value - # for models - for mm in range(nmodels): - mean10[mm] = np.nanmean(ncn_m[mm][idx10]) - std10[mm] = np.nanstd(ncn_m[mm][idx10]) - p10_10[mm] = np.nanpercentile(ncn_m[mm][idx10],10) - p25_10[mm] = np.nanpercentile(ncn_m[mm][idx10],25) - p75_10[mm] = np.nanpercentile(ncn_m[mm][idx10],75) - p90_10[mm] = np.nanpercentile(ncn_m[mm][idx10],90) - bias10[mm] = missing_value - corr10[mm] = [missing_value, missing_value] - rmse10[mm] = missing_value -else: - # for obs - mean10[nmodels] = np.nanmean(cpc[idx10]) - std10[nmodels] = np.nanstd(cpc[idx10]) - p10_10[nmodels] = np.nanpercentile(cpc[idx10],10) - p25_10[nmodels] = np.nanpercentile(cpc[idx10],25) - p75_10[nmodels] = np.nanpercentile(cpc[idx10],75) - p90_10[nmodels] = np.nanpercentile(cpc[idx10],90) - # for models - for mm in range(nmodels): - mean10[mm] = np.nanmean(ncn_m[mm][idx10]) - std10[mm] = np.nanstd(ncn_m[mm][idx10]) - p10_10[mm] = np.nanpercentile(ncn_m[mm][idx10],10) - p25_10[mm] = np.nanpercentile(ncn_m[mm][idx10],25) - p75_10[mm] = np.nanpercentile(ncn_m[mm][idx10],75) - p90_10[mm] = np.nanpercentile(ncn_m[mm][idx10],90) - bias10[mm] = mean10[mm] - mean10[nmodels] - c10 = scipy.stats.pearsonr(ncn_m[mm][idx10],cpc[idx10]) - corr10[mm] = [c10[0],c10[1]] - rmse10[mm] = np.sqrt(((ncn_m[mm][idx10]-cpc[idx10])**2).mean()) - -if len(idx3)==0 or sum(idx3)/len(idx3)<0.1: # two few observation available - # for obs - mean3[nmodels] = missing_value - std3[nmodels] = missing_value - p10_3[nmodels] = missing_value - p25_3[nmodels] = missing_value - p75_3[nmodels] = missing_value - p90_3[nmodels] = missing_value - # for models - for mm in range(nmodels): - mean3[mm] = np.nanmean(nucn_m[mm][idx3]) - std3[mm] = np.nanstd(nucn_m[mm][idx3]) - p10_3[mm] = np.nanpercentile(nucn_m[mm][idx3],10) - p25_3[mm] = np.nanpercentile(nucn_m[mm][idx3],25) - p75_3[mm] = np.nanpercentile(nucn_m[mm][idx3],75) - p90_3[mm] = np.nanpercentile(nucn_m[mm][idx3],90) - bias3[mm] = missing_value - corr3[mm] = [missing_value, missing_value] - rmse3[mm] = missing_value -else: - # for obs - mean3[nmodels] = np.nanmean(cpcu[idx3]) - std3[nmodels] = np.nanstd(cpcu[idx3]) - p10_3[nmodels] = np.nanpercentile(cpcu[idx3],10) - p25_3[nmodels] = np.nanpercentile(cpcu[idx3],25) - p75_3[nmodels] = np.nanpercentile(cpcu[idx3],75) - p90_3[nmodels] = np.nanpercentile(cpcu[idx3],90) - # for models - for mm in range(nmodels): - mean3[mm] = np.nanmean(nucn_m[mm][idx3]) - std3[mm] = np.nanstd(nucn_m[mm][idx3]) - p10_3[mm] = np.nanpercentile(nucn_m[mm][idx3],10) - p25_3[mm] = np.nanpercentile(nucn_m[mm][idx3],25) - p75_3[mm] = np.nanpercentile(nucn_m[mm][idx3],75) - p90_3[mm] = np.nanpercentile(nucn_m[mm][idx3],90) - bias3[mm] = mean3[mm] - mean3[nmodels] - c3 = scipy.stats.pearsonr(nucn_m[mm][idx3],cpcu[idx3]) - corr3[mm] = [c3[0],c3[1]] - rmse3[mm] = np.sqrt(((nucn_m[mm][idx3]-cpcu[idx3])**2).mean()) - - -#%% write out files - -outfile = figpath_sfc_statistics+'statistics_CN10nm_'+campaign+'_'+IOP+'.txt' -print('write statistics to file '+outfile) - -with open(outfile, 'w') as f: - f.write('statistics of Aerosol Number Concentration comparing with CPC(>10nm). sample size '+format(sum(idx10))+'\n') - line1 = list(Model_List) - line1.insert(0,' --- ') - line1.append('OBS') - for ii in range(len(line1)): - f.write(format(line1[ii],'10s')+', ') - # write mean - f.write('\n mean,\t') - for ii in range(len(mean10)): - f.write(format(mean10[ii],'10.2f')+', ') - # write std - f.write('\n std. dev.,') - for ii in range(len(std10)): - f.write(format(std10[ii],'10.2f')+', ') - # write percentiles - f.write('\n 10% percentile: ') - for ii in range(len(p10_10)): - f.write(format(p10_10[ii],'10.2f')+', ') - f.write('\n 25% percentile: ') - for ii in range(len(p25_10)): - f.write(format(p25_10[ii],'10.2f')+', ') - f.write('\n 75% percentile: ') - for ii in range(len(p75_10)): - f.write(format(p75_10[ii],'10.2f')+', ') - f.write('\n 90% percentile: ') - for ii in range(len(p90_10)): - f.write(format(p90_10[ii],'10.2f')+', ') - # write bias - f.write('\n bias,\t') - for ii in range(len(bias10)): - f.write(format(bias10[ii],'10.2f')+', ') - # write rmse - f.write('\n RMSE,\t') - for ii in range(len(rmse10)): - f.write(format(rmse10[ii],'10.2f')+', ') - # write correlation - f.write('\n corrcoef,\t') - for ii in range(len(rmse10)): - f.write(format(corr10[ii][0],'10.4f')+', ') - # write p value of correlation - f.write('\n P_corr,\t') - for ii in range(len(rmse10)): - f.write(format(corr10[ii][1],'10.2f')+', ') + + # select only valid data in obs and the corresponding data in models + idx100 = ~np.isnan(uhsas) + idx10 = ~np.isnan(cpc) + idx3 = ~np.isnan(cpcu) + + mean100 = [None]*(nmodels+1) + mean10 = [None]*(nmodels+1) + mean3 = [None]*(nmodels+1) + std100 = [None]*(nmodels+1) + std10 = [None]*(nmodels+1) + std3 = [None]*(nmodels+1) + bias100 = [None]*(nmodels) + bias10 = [None]*(nmodels) + bias3 = [None]*(nmodels) + corr100 = [None]*(nmodels) + corr10 = [None]*(nmodels) + corr3 = [None]*(nmodels) + rmse100 = [None]*(nmodels) + rmse10 = [None]*(nmodels) + rmse3 = [None]*(nmodels) + p10_100 = [None]*(nmodels+1) + p10_10 = [None]*(nmodels+1) + p10_3 = [None]*(nmodels+1) + p25_100 = [None]*(nmodels+1) + p25_10 = [None]*(nmodels+1) + p25_3 = [None]*(nmodels+1) + p75_100 = [None]*(nmodels+1) + p75_10 = [None]*(nmodels+1) + p75_3 = [None]*(nmodels+1) + p90_100 = [None]*(nmodels+1) + p90_10 = [None]*(nmodels+1) + p90_3 = [None]*(nmodels+1) + if len(idx100)==0 or sum(idx100)/len(idx100)<0.1: # two few observation available + # for obs + mean100[nmodels] = missing_value + std100[nmodels] = missing_value + p10_100[nmodels] = missing_value + p25_100[nmodels] = missing_value + p75_100[nmodels] = missing_value + p90_100[nmodels] = missing_value + # for models + for mm in range(nmodels): + mean100[mm] = np.nanmean(ncn100_m[mm][idx100]) + std100[mm] = np.nanstd(ncn100_m[mm][idx100]) + p10_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],10) + p25_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],25) + p75_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],75) + p90_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],90) + bias100[mm] = missing_value + corr100[mm] = [missing_value, missing_value] + rmse100[mm] = missing_value + else: + # for obs + mean100[nmodels] = np.nanmean(uhsas[idx100]) + std100[nmodels] = np.nanstd(uhsas[idx100]) + p10_100[nmodels] = np.nanpercentile(uhsas[idx100],10) + p25_100[nmodels] = np.nanpercentile(uhsas[idx100],25) + p75_100[nmodels] = np.nanpercentile(uhsas[idx100],75) + p90_100[nmodels] = np.nanpercentile(uhsas[idx100],90) + # for models + for mm in range(nmodels): + mean100[mm] = np.nanmean(ncn100_m[mm][idx100]) + std100[mm] = np.nanstd(ncn100_m[mm][idx100]) + p10_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],10) + p25_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],25) + p75_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],75) + p90_100[mm] = np.nanpercentile(ncn100_m[mm][idx100],90) + bias100[mm] = mean100[mm] - mean100[nmodels] + c100 = scipy.stats.pearsonr(ncn100_m[mm][idx100],uhsas[idx100]) + corr100[mm] = [c100[0],c100[1]] + rmse100[mm] = np.sqrt(((ncn100_m[mm][idx100]-uhsas[idx100])**2).mean()) + + if len(idx10)==0 or sum(idx10)/len(idx10)<0.1: # two few observation available + # for obs + mean10[nmodels] = missing_value + std10[nmodels] = missing_value + p10_10[nmodels] = missing_value + p25_10[nmodels] = missing_value + p75_10[nmodels] = missing_value + p90_10[nmodels] = missing_value + # for models + for mm in range(nmodels): + mean10[mm] = np.nanmean(ncn_m[mm][idx10]) + std10[mm] = np.nanstd(ncn_m[mm][idx10]) + p10_10[mm] = np.nanpercentile(ncn_m[mm][idx10],10) + p25_10[mm] = np.nanpercentile(ncn_m[mm][idx10],25) + p75_10[mm] = np.nanpercentile(ncn_m[mm][idx10],75) + p90_10[mm] = np.nanpercentile(ncn_m[mm][idx10],90) + bias10[mm] = missing_value + corr10[mm] = [missing_value, missing_value] + rmse10[mm] = missing_value + else: + # for obs + mean10[nmodels] = np.nanmean(cpc[idx10]) + std10[nmodels] = np.nanstd(cpc[idx10]) + p10_10[nmodels] = np.nanpercentile(cpc[idx10],10) + p25_10[nmodels] = np.nanpercentile(cpc[idx10],25) + p75_10[nmodels] = np.nanpercentile(cpc[idx10],75) + p90_10[nmodels] = np.nanpercentile(cpc[idx10],90) + # for models + for mm in range(nmodels): + mean10[mm] = np.nanmean(ncn_m[mm][idx10]) + std10[mm] = np.nanstd(ncn_m[mm][idx10]) + p10_10[mm] = np.nanpercentile(ncn_m[mm][idx10],10) + p25_10[mm] = np.nanpercentile(ncn_m[mm][idx10],25) + p75_10[mm] = np.nanpercentile(ncn_m[mm][idx10],75) + p90_10[mm] = np.nanpercentile(ncn_m[mm][idx10],90) + bias10[mm] = mean10[mm] - mean10[nmodels] + c10 = scipy.stats.pearsonr(ncn_m[mm][idx10],cpc[idx10]) + corr10[mm] = [c10[0],c10[1]] + rmse10[mm] = np.sqrt(((ncn_m[mm][idx10]-cpc[idx10])**2).mean()) + + if len(idx3)==0 or sum(idx3)/len(idx3)<0.1: # two few observation available + # for obs + mean3[nmodels] = missing_value + std3[nmodels] = missing_value + p10_3[nmodels] = missing_value + p25_3[nmodels] = missing_value + p75_3[nmodels] = missing_value + p90_3[nmodels] = missing_value + # for models + for mm in range(nmodels): + mean3[mm] = np.nanmean(nucn_m[mm][idx3]) + std3[mm] = np.nanstd(nucn_m[mm][idx3]) + p10_3[mm] = np.nanpercentile(nucn_m[mm][idx3],10) + p25_3[mm] = np.nanpercentile(nucn_m[mm][idx3],25) + p75_3[mm] = np.nanpercentile(nucn_m[mm][idx3],75) + p90_3[mm] = np.nanpercentile(nucn_m[mm][idx3],90) + bias3[mm] = missing_value + corr3[mm] = [missing_value, missing_value] + rmse3[mm] = missing_value + else: + # for obs + mean3[nmodels] = np.nanmean(cpcu[idx3]) + std3[nmodels] = np.nanstd(cpcu[idx3]) + p10_3[nmodels] = np.nanpercentile(cpcu[idx3],10) + p25_3[nmodels] = np.nanpercentile(cpcu[idx3],25) + p75_3[nmodels] = np.nanpercentile(cpcu[idx3],75) + p90_3[nmodels] = np.nanpercentile(cpcu[idx3],90) + # for models + for mm in range(nmodels): + mean3[mm] = np.nanmean(nucn_m[mm][idx3]) + std3[mm] = np.nanstd(nucn_m[mm][idx3]) + p10_3[mm] = np.nanpercentile(nucn_m[mm][idx3],10) + p25_3[mm] = np.nanpercentile(nucn_m[mm][idx3],25) + p75_3[mm] = np.nanpercentile(nucn_m[mm][idx3],75) + p90_3[mm] = np.nanpercentile(nucn_m[mm][idx3],90) + bias3[mm] = mean3[mm] - mean3[nmodels] + c3 = scipy.stats.pearsonr(nucn_m[mm][idx3],cpcu[idx3]) + corr3[mm] = [c3[0],c3[1]] + rmse3[mm] = np.sqrt(((nucn_m[mm][idx3]-cpcu[idx3])**2).mean()) + + + #%% write out files + + outfile = figpath_sfc_statistics+'statistics_CN10nm_'+campaign+'_'+IOP+'.txt' + print('write statistics to file '+outfile) + + with open(outfile, 'w') as f: + f.write('statistics of Aerosol Number Concentration comparing with CPC(>10nm). sample size '+format(sum(idx10))+'\n') + line1 = list(Model_List) + line1.insert(0,' --- ') + line1.append('OBS') + for ii in range(len(line1)): + f.write(format(line1[ii],'10s')+', ') + # write mean + f.write('\n mean,\t') + for ii in range(len(mean10)): + f.write(format(mean10[ii],'10.2f')+', ') + # write std + f.write('\n std. dev.,') + for ii in range(len(std10)): + f.write(format(std10[ii],'10.2f')+', ') + # write percentiles + f.write('\n 10% percentile: ') + for ii in range(len(p10_10)): + f.write(format(p10_10[ii],'10.2f')+', ') + f.write('\n 25% percentile: ') + for ii in range(len(p25_10)): + f.write(format(p25_10[ii],'10.2f')+', ') + f.write('\n 75% percentile: ') + for ii in range(len(p75_10)): + f.write(format(p75_10[ii],'10.2f')+', ') + f.write('\n 90% percentile: ') + for ii in range(len(p90_10)): + f.write(format(p90_10[ii],'10.2f')+', ') + # write bias + f.write('\n bias,\t') + for ii in range(len(bias10)): + f.write(format(bias10[ii],'10.2f')+', ') + # write rmse + f.write('\n RMSE,\t') + for ii in range(len(rmse10)): + f.write(format(rmse10[ii],'10.2f')+', ') + # write correlation + f.write('\n corrcoef,\t') + for ii in range(len(rmse10)): + f.write(format(corr10[ii][0],'10.4f')+', ') + # write p value of correlation + f.write('\n P_corr,\t') + for ii in range(len(rmse10)): + f.write(format(corr10[ii][1],'10.2f')+', ') + + + outfile = figpath_sfc_statistics+'statistics_CN3nm_'+campaign+'_'+IOP+'.txt' + print('write statistics to file '+outfile) + + with open(outfile, 'w') as f: + f.write('statistics of Aerosol Number Concentration comparing with CPC(>3nm). sample size '+format(sum(idx3))+'\n') + line1 = list(Model_List) + line1.insert(0,' --- ') + line1.append('OBS') + for ii in range(len(line1)): + f.write(format(line1[ii],'10s')+', ') + # write mean + f.write('\n mean,\t') + for ii in range(len(mean3)): + f.write(format(mean3[ii],'10.2f')+', ') + # write std + f.write('\n std. dev.,') + for ii in range(len(std3)): + f.write(format(std3[ii],'10.2f')+', ') + # write percentiles + f.write('\n 10% percentile: ') + for ii in range(len(p10_3)): + f.write(format(p10_3[ii],'10.2f')+', ') + f.write('\n 25% percentile: ') + for ii in range(len(p25_3)): + f.write(format(p25_3[ii],'10.2f')+', ') + f.write('\n 75% percentile: ') + for ii in range(len(p75_3)): + f.write(format(p75_3[ii],'10.2f')+', ') + f.write('\n 90% percentile: ') + for ii in range(len(p90_3)): + f.write(format(p90_3[ii],'10.2f')+', ') + # write bias + f.write('\n bias,\t') + for ii in range(len(bias3)): + f.write(format(bias3[ii],'10.2f')+', ') + # write rmse + f.write('\n RMSE,\t') + for ii in range(len(rmse3)): + f.write(format(rmse3[ii],'10.2f')+', ') + # write correlation + f.write('\n corrcoef,\t') + for ii in range(len(rmse3)): + f.write(format(corr3[ii][0],'10.4f')+', ') + # write p value of correlation + f.write('\n P_corr,\t') + for ii in range(len(rmse3)): + f.write(format(corr3[ii][1],'10.2f')+', ') -outfile = figpath_sfc_statistics+'statistics_CN3nm_'+campaign+'_'+IOP+'.txt' -print('write statistics to file '+outfile) - -with open(outfile, 'w') as f: - f.write('statistics of Aerosol Number Concentration comparing with CPC(>3nm). sample size '+format(sum(idx3))+'\n') - line1 = list(Model_List) - line1.insert(0,' --- ') - line1.append('OBS') - for ii in range(len(line1)): - f.write(format(line1[ii],'10s')+', ') - # write mean - f.write('\n mean,\t') - for ii in range(len(mean3)): - f.write(format(mean3[ii],'10.2f')+', ') - # write std - f.write('\n std. dev.,') - for ii in range(len(std3)): - f.write(format(std3[ii],'10.2f')+', ') - # write percentiles - f.write('\n 10% percentile: ') - for ii in range(len(p10_3)): - f.write(format(p10_3[ii],'10.2f')+', ') - f.write('\n 25% percentile: ') - for ii in range(len(p25_3)): - f.write(format(p25_3[ii],'10.2f')+', ') - f.write('\n 75% percentile: ') - for ii in range(len(p75_3)): - f.write(format(p75_3[ii],'10.2f')+', ') - f.write('\n 90% percentile: ') - for ii in range(len(p90_3)): - f.write(format(p90_3[ii],'10.2f')+', ') - # write bias - f.write('\n bias,\t') - for ii in range(len(bias3)): - f.write(format(bias3[ii],'10.2f')+', ') - # write rmse - f.write('\n RMSE,\t') - for ii in range(len(rmse3)): - f.write(format(rmse3[ii],'10.2f')+', ') - # write correlation - f.write('\n corrcoef,\t') - for ii in range(len(rmse3)): - f.write(format(corr3[ii][0],'10.4f')+', ') - # write p value of correlation - f.write('\n P_corr,\t') - for ii in range(len(rmse3)): - f.write(format(corr3[ii][1],'10.2f')+', ') - -outfile = figpath_sfc_statistics+'statistics_CN100nm_'+campaign+'_'+IOP+'.txt' -print('write statistics to file '+outfile) - -with open(outfile, 'w') as f: - f.write('statistics of Aerosol Number Concentration comparing with UHSAS (>100nm). sample size '+format(sum(idx100))+'\n') - line1 = list(Model_List) - line1.insert(0,' --- ') - line1.append('OBS') - for ii in range(len(line1)): - f.write(format(line1[ii],'10s')+', ') - # write mean - f.write('\n mean,\t') - for ii in range(len(mean100)): - f.write(format(mean100[ii],'10.2f')+', ') - # write std - f.write('\n std. dev.,') - for ii in range(len(std100)): - f.write(format(std100[ii],'10.2f')+', ') - # write percentiles - f.write('\n 10% percentile: ') - for ii in range(len(p10_100)): - f.write(format(p10_100[ii],'10.2f')+', ') - f.write('\n 25% percentile: ') - for ii in range(len(p25_100)): - f.write(format(p25_100[ii],'10.2f')+', ') - f.write('\n 75% percentile: ') - for ii in range(len(p75_100)): - f.write(format(p75_100[ii],'10.2f')+', ') - f.write('\n 90% percentile: ') - for ii in range(len(p90_100)): - f.write(format(p90_100[ii],'10.2f')+', ') - # write bias - f.write('\n bias,\t') - for ii in range(len(bias100)): - f.write(format(bias100[ii],'10.2f')+', ') - # write rmse - f.write('\n RMSE,\t') - for ii in range(len(rmse100)): - f.write(format(rmse100[ii],'10.2f')+', ') - # write correlation - f.write('\n corrcoef,\t') - for ii in range(len(rmse100)): - f.write(format(corr100[ii][0],'10.4f')+', ') - # write p value of correlation - f.write('\n P_corr,\t') - for ii in range(len(rmse100)): - f.write(format(corr100[ii][1],'10.2f')+', ') - \ No newline at end of file + outfile = figpath_sfc_statistics+'statistics_CN100nm_'+campaign+'_'+IOP+'.txt' + print('write statistics to file '+outfile) + + with open(outfile, 'w') as f: + f.write('statistics of Aerosol Number Concentration comparing with UHSAS (>100nm). sample size '+format(sum(idx100))+'\n') + line1 = list(Model_List) + line1.insert(0,' --- ') + line1.append('OBS') + for ii in range(len(line1)): + f.write(format(line1[ii],'10s')+', ') + # write mean + f.write('\n mean,\t') + for ii in range(len(mean100)): + f.write(format(mean100[ii],'10.2f')+', ') + # write std + f.write('\n std. dev.,') + for ii in range(len(std100)): + f.write(format(std100[ii],'10.2f')+', ') + # write percentiles + f.write('\n 10% percentile: ') + for ii in range(len(p10_100)): + f.write(format(p10_100[ii],'10.2f')+', ') + f.write('\n 25% percentile: ') + for ii in range(len(p25_100)): + f.write(format(p25_100[ii],'10.2f')+', ') + f.write('\n 75% percentile: ') + for ii in range(len(p75_100)): + f.write(format(p75_100[ii],'10.2f')+', ') + f.write('\n 90% percentile: ') + for ii in range(len(p90_100)): + f.write(format(p90_100[ii],'10.2f')+', ') + # write bias + f.write('\n bias,\t') + for ii in range(len(bias100)): + f.write(format(bias100[ii],'10.2f')+', ') + # write rmse + f.write('\n RMSE,\t') + for ii in range(len(rmse100)): + f.write(format(rmse100[ii],'10.2f')+', ') + # write correlation + f.write('\n corrcoef,\t') + for ii in range(len(rmse100)): + f.write(format(corr100[ii][0],'10.4f')+', ') + # write p value of correlation + f.write('\n P_corr,\t') + for ii in range(len(rmse100)): + f.write(format(corr100[ii][1],'10.2f')+', ') diff --git a/src/esmac_diags/plotting/calc_statistic_ship_CN.py b/src/esmac_diags/plotting/calc_statistic_ship_CN.py index 0865812..8d7a982 100644 --- a/src/esmac_diags/plotting/calc_statistic_ship_CN.py +++ b/src/esmac_diags/plotting/calc_statistic_ship_CN.py @@ -3,7 +3,6 @@ # for ship measurements # compare models and CPC/UHSAS measurements """ -import sys import os import glob @@ -16,375 +15,381 @@ from ..subroutines.quality_control import qc_mask_qcflag, qc_remove_neg -#%% settings +def run_plot(settings): + #%% variables from settings -from settings import campaign, Model_List, shipcpcpath, shipmetpath, shipuhsaspath, E3SM_ship_path, figpath_ship_statistics + campaign = settings['campaign'] + Model_List = settings['Model_List'] + shipcpcpath = settings['shipcpcpath'] + shipmetpath = settings['shipmetpath'] + shipuhsaspath = settings['shipuhsaspath'] + E3SM_ship_path = settings['E3SM_ship_path'] + figpath_ship_statistics = settings['figpath_ship_statistics'] -if not os.path.exists(figpath_ship_statistics): - os.makedirs(figpath_ship_statistics) -missing_value = np.nan - -lst = glob.glob(E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[0]+'_shipleg*.nc') -lst.sort() - -nmodels = len(Model_List) -cpcall = np.empty(0) -uhsasall = np.empty(0) -ncn10all = [] -ncn100all = [] -for mm in range(nmodels): - ncn10all.append(np.empty(0)) - ncn100all.append(np.empty(0)) - -for ll in range(len(lst)): + #%% other settings + if not os.path.exists(figpath_ship_statistics): + os.makedirs(figpath_ship_statistics) + missing_value = np.nan - if campaign=='MAGIC': - legnum=lst[ll][-5:-3] - elif campaign=='MARCUS': - legnum=lst[ll][-4] - else: - raise ValueError('please check campaign name: '+campaign) - print('legnum '+format(legnum)) + #%% find files + lst = glob.glob(E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[0]+'_shipleg*.nc') + lst.sort() - #%% read in model - datam = list() - databins = list() + nmodels = len(Model_List) + cpcall = np.empty(0) + uhsasall = np.empty(0) + ncn10all = [] + ncn100all = [] for mm in range(nmodels): - filenamem = E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' - - (timem,NCNall,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCNall') - (timem,data,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCN') - - datam.append(data*1e-6) # change unit from 1/m3 to 1/cm3 - databins.append(NCNall*1e-6) # change unit from 1/m3 to 1/cm3 + ncn10all.append(np.empty(0)) + ncn100all.append(np.empty(0)) - # mask data where model grid is not at ocean surface (Ps is too different than obs) - filenamem = E3SM_ship_path+'Ship_vars_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' - (timem,psm,timeunitx,psmunit,psmlongname)=read_E3SM(filenamem,'PS') - datamask = mask_model_ps(timem,0.01*psm,legnum,campaign,shipmetpath) + for ll in range(len(lst)): - datam[mm][datamask]=np.nan + if campaign=='MAGIC': + legnum=lst[ll][-5:-3] + elif campaign=='MARCUS': + legnum=lst[ll][-4] + else: + raise ValueError('please check campaign name: '+campaign) + print('legnum '+format(legnum)) - year0 = str(int(timeunitm.split()[2][0:4])+1) - - #%% read in observations - # find the days related to the ship leg - day = [int(a) for a in timem] - day = list(set(day)) - day.sort() - - # CPC - t_cpc=np.empty(0) - cpc=np.empty(0) - for dd in day: + #%% read in model + datam = list() + databins = list() + for mm in range(nmodels): + filenamem = E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' - if campaign=='MAGIC': - if int(legnum)<=9: - if dd<=365: # year 2012 - filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*') + (timem,NCNall,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCNall') + (timem,data,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCN') + + datam.append(data*1e-6) # change unit from 1/m3 to 1/cm3 + databins.append(NCNall*1e-6) # change unit from 1/m3 to 1/cm3 + + # mask data where model grid is not at ocean surface (Ps is too different than obs) + filenamem = E3SM_ship_path+'Ship_vars_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' + (timem,psm,timeunitx,psmunit,psmlongname)=read_E3SM(filenamem,'PS') + datamask = mask_model_ps(timem,0.01*psm,legnum,campaign,shipmetpath) + + datam[mm][datamask]=np.nan + + year0 = str(int(timeunitm.split()[2][0:4])+1) + + #%% read in observations + # find the days related to the ship leg + day = [int(a) for a in timem] + day = list(set(day)) + day.sort() + + # CPC + t_cpc=np.empty(0) + cpc=np.empty(0) + for dd in day: + + if campaign=='MAGIC': + if int(legnum)<=9: + if dd<=365: # year 2012 + filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*') else: - filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*') - if len(filenameo)==0: - continue # some days may be missing - elif campaign=='MARCUS': - if int(legnum)<=2: - if dd<=365: # year 2012 - filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') + filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*') + if len(filenameo)==0: + continue # some days may be missing + elif campaign=='MARCUS': + if int(legnum)<=2: + if dd<=365: # year 2012 + filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') else: - filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + if len(filenameo)==0: + continue # some days may be missing + + + (time,obs,qc,timeunit,dataunit)=read_cpc(filenameo[0]) + obs = qc_mask_qcflag(obs,qc) + t_cpc=np.hstack((t_cpc, dd+time/86400)) + cpc=np.hstack((cpc, obs)) + + # if time expands two years, add 365 days to the second year + if t_cpc[0]>t_cpc[-1]: + t_cpc[t_cpc<=t_cpc[-1]]=t_cpc[t_cpc<=t_cpc[-1]]+365 + + # UHSAS + t_uh=np.empty(0) + uhsas=np.empty(0) + for dd in day: + + if campaign=='MAGIC': + if int(legnum)<=9: + if dd<=365: # year 2012 + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') + else: + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*.cdf') + else: + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') + elif campaign=='MARCUS': + if int(legnum)<=2: + if dd<=365: # year 2012 + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + if len(filenameo)==0: continue # some days may be missing + if len(filenameo)>1: + raise ValueError('find too many files: '+filenameo) - - (time,obs,qc,timeunit,dataunit)=read_cpc(filenameo[0]) - obs = qc_mask_qcflag(obs,qc) - t_cpc=np.hstack((t_cpc, dd+time/86400)) - cpc=np.hstack((cpc, obs)) + (time,dmin,dmax,obs,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) + obs=np.ma.filled(obs) + obs=qc_remove_neg(obs) + uhsas=np.hstack((uhsas, np.nansum(obs,1))) + t_uh = np.hstack((t_uh,time/86400+dd)) + + # if no obs available, fill one data with NaN + if len(t_uh)==0: + t_uh=[timem[0],timem[1]] + uhsas=np.full((2),np.nan) + + # if time expands two years, add 365 days to the second year + if t_uh[0]>t_uh[-1]: + t_uh[t_uh<=t_uh[-1]]=t_uh[t_uh<=t_uh[-1]]+365 - # if time expands two years, add 365 days to the second year - if t_cpc[0]>t_cpc[-1]: - t_cpc[t_cpc<=t_cpc[-1]]=t_cpc[t_cpc<=t_cpc[-1]]+365 - - # UHSAS - t_uh=np.empty(0) - uhsas=np.empty(0) - for dd in day: - if campaign=='MAGIC': - if int(legnum)<=9: - if dd<=365: # year 2012 - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') - else: - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*.cdf') - else: - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') - elif campaign=='MARCUS': - if int(legnum)<=2: - if dd<=365: # year 2012 - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + #%% Calculate model aerosol number concentration for UHSAS size range + b1 = int(dmin[0]) + b2 = int(dmax[-1]) + datam2=list() + for mm in range(nmodels): + datam2.append(np.nansum(databins[mm][b1-1:b2,:],0)) + datam2[mm][datamask]=np.nan - if len(filenameo)==0: - continue # some days may be missing - if len(filenameo)>1: - raise ValueError('find too many files: '+filenameo) + #%% average into 1hr resolution + time0 = np.arange(timem[0],timem[-1],1./24) + cpc = avg_time_1d(t_cpc,cpc,time0) + uhsas = avg_time_1d(t_uh,uhsas,time0) + for mm in range(nmodels): + datam[mm] = avg_time_1d(timem,datam[mm],time0) + datam2[mm] = avg_time_1d(timem,datam2[mm],time0) - (time,dmin,dmax,obs,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) - obs=np.ma.filled(obs) - obs=qc_remove_neg(obs) - uhsas=np.hstack((uhsas, np.nansum(obs,1))) - t_uh = np.hstack((t_uh,time/86400+dd)) - - # if no obs available, fill one data with NaN - if len(t_uh)==0: - t_uh=[timem[0],timem[1]] - uhsas=np.full((2),np.nan) - - # if time expands two years, add 365 days to the second year - if t_uh[0]>t_uh[-1]: - t_uh[t_uh<=t_uh[-1]]=t_uh[t_uh<=t_uh[-1]]+365 + #%% + cpcall = np.hstack((cpcall,cpc)) + uhsasall = np.hstack((uhsasall,uhsas)) + for mm in range(nmodels): + ncn10all[mm] = np.hstack((ncn10all[mm],datam[mm])) + ncn100all[mm] = np.hstack((ncn100all[mm],datam2[mm])) + + + #%% calculate statistics + if ncn10all[0].shape != cpcall.shape or ncn100all[0].shape != uhsasall.shape: + raise ValueError('observation and model dimensions are inconsitent ') - #%% Calculate model aerosol number concentration for UHSAS size range - b1 = int(dmin[0]) - b2 = int(dmax[-1]) - datam2=list() - for mm in range(nmodels): - datam2.append(np.nansum(databins[mm][b1-1:b2,:],0)) - datam2[mm][datamask]=np.nan + # select only valid data in obs and the corresponding data in models (all data are not NAN) + idx10 = sum(np.vstack((~np.isnan(ncn10all),~np.isnan(cpcall))))==nmodels+1 + idx100 = sum(np.vstack((~np.isnan(ncn100all),~np.isnan(uhsasall))))==nmodels+1 - #%% average into 1hr resolution - time0 = np.arange(timem[0],timem[-1],1./24) - cpc = avg_time_1d(t_cpc,cpc,time0) - uhsas = avg_time_1d(t_uh,uhsas,time0) - for mm in range(nmodels): - datam[mm] = avg_time_1d(timem,datam[mm],time0) - datam2[mm] = avg_time_1d(timem,datam2[mm],time0) + mean10 = [None]*(nmodels+1) + mean100 = [None]*(nmodels+1) + std10 = [None]*(nmodels+1) + std100 = [None]*(nmodels+1) + bias10 = [None]*(nmodels) + bias100 = [None]*(nmodels) + corr10 = [None]*(nmodels) + corr100 = [None]*(nmodels) + rmse10 = [None]*(nmodels) + rmse100 = [None]*(nmodels) + p10_100 = [None]*(nmodels+1) + p10_10 = [None]*(nmodels+1) + p25_100 = [None]*(nmodels+1) + p25_10 = [None]*(nmodels+1) + p75_100 = [None]*(nmodels+1) + p75_10 = [None]*(nmodels+1) + p90_100 = [None]*(nmodels+1) + p90_10 = [None]*(nmodels+1) - #%% - cpcall = np.hstack((cpcall,cpc)) - uhsasall = np.hstack((uhsasall,uhsas)) - for mm in range(nmodels): - ncn10all[mm] = np.hstack((ncn10all[mm],datam[mm])) - ncn100all[mm] = np.hstack((ncn100all[mm],datam2[mm])) - - -#%% calculate statistics - -if ncn10all[0].shape != cpcall.shape or ncn100all[0].shape != uhsasall.shape: - raise ValueError('observation and model dimensions are inconsitent ') - -# select only valid data in obs and the corresponding data in models (all data are not NAN) -idx10 = sum(np.vstack((~np.isnan(ncn10all),~np.isnan(cpcall))))==nmodels+1 -idx100 = sum(np.vstack((~np.isnan(ncn100all),~np.isnan(uhsasall))))==nmodels+1 - -mean10 = [None]*(nmodels+1) -mean100 = [None]*(nmodels+1) -std10 = [None]*(nmodels+1) -std100 = [None]*(nmodels+1) -bias10 = [None]*(nmodels) -bias100 = [None]*(nmodels) -corr10 = [None]*(nmodels) -corr100 = [None]*(nmodels) -rmse10 = [None]*(nmodels) -rmse100 = [None]*(nmodels) -p10_100 = [None]*(nmodels+1) -p10_10 = [None]*(nmodels+1) -p25_100 = [None]*(nmodels+1) -p25_10 = [None]*(nmodels+1) -p75_100 = [None]*(nmodels+1) -p75_10 = [None]*(nmodels+1) -p90_100 = [None]*(nmodels+1) -p90_10 = [None]*(nmodels+1) - -if len(idx10)==0 or sum(idx10)/len(idx10)<0.1: # two few observation available - # for obs - mean10[nmodels] = missing_value - std10[nmodels] = missing_value - p10_10[nmodels] = missing_value - p25_10[nmodels] = missing_value - p75_10[nmodels] = missing_value - p90_10[nmodels] = missing_value - # for models - for mm in range(nmodels): - mean10[mm] = np.nanmean(ncn10all[mm][idx10]) - std10[mm] = np.nanstd(ncn10all[mm][idx10]) - p10_10[mm] = np.nanpercentile(ncn10all[mm][idx10],10) - p25_10[mm] = np.nanpercentile(ncn10all[mm][idx10],25) - p75_10[mm] = np.nanpercentile(ncn10all[mm][idx10],75) - p90_10[mm] = np.nanpercentile(ncn10all[mm][idx10],90) - bias10[mm] = missing_value - corr10[mm] = [missing_value, missing_value] - rmse10[mm] = missing_value -else: - # for obs - mean10[nmodels] = np.nanmean(cpcall[idx10]) - std10[nmodels] = np.nanstd(cpcall[idx10]) - p10_10[nmodels] = np.nanpercentile(cpcall[idx10],10) - p25_10[nmodels] = np.nanpercentile(cpcall[idx10],25) - p75_10[nmodels] = np.nanpercentile(cpcall[idx10],75) - p90_10[nmodels] = np.nanpercentile(cpcall[idx10],90) - # for models - for mm in range(nmodels): - mean10[mm] = np.nanmean(ncn10all[mm][idx10]) - std10[mm] = np.nanstd(ncn10all[mm][idx10]) - p10_10[mm] = np.nanpercentile(ncn10all[mm][idx10],10) - p25_10[mm] = np.nanpercentile(ncn10all[mm][idx10],25) - p75_10[mm] = np.nanpercentile(ncn10all[mm][idx10],75) - p90_10[mm] = np.nanpercentile(ncn10all[mm][idx10],90) - bias10[mm] = mean10[mm] - mean10[nmodels] - c10 = scipy.stats.pearsonr(ncn10all[mm][idx10],cpcall[idx10]) - corr10[mm] = [c10[0],c10[1]] - rmse10[mm] = np.sqrt(((ncn10all[mm][idx10]-cpcall[idx10])**2).mean()) - -if len(idx100)==0 or sum(idx100)/len(idx100)<0.1: # two few observation available - # for obs - mean100[nmodels] = missing_value - std100[nmodels] = missing_value - p10_100[nmodels] = missing_value - p25_100[nmodels] = missing_value - p75_100[nmodels] = missing_value - p90_100[nmodels] = missing_value - # for models - for mm in range(nmodels): - mean100[mm] = np.nanmean(ncn100all[mm][idx100]) - std100[mm] = np.nanstd(ncn100all[mm][idx100]) - p10_100[mm] = np.nanpercentile(ncn100all[mm][idx100],10) - p25_100[mm] = np.nanpercentile(ncn100all[mm][idx100],25) - p75_100[mm] = np.nanpercentile(ncn100all[mm][idx100],75) - p90_100[mm] = np.nanpercentile(ncn100all[mm][idx100],90) - bias100[mm] = missing_value - corr100[mm] = [missing_value, missing_value] - rmse100[mm] = missing_value -else: - # for obs - mean100[nmodels] = np.nanmean(uhsasall[idx100]) - std100[nmodels] = np.nanstd(uhsasall[idx100]) - p10_100[nmodels] = np.nanpercentile(uhsasall[idx100],10) - p25_100[nmodels] = np.nanpercentile(uhsasall[idx100],25) - p75_100[nmodels] = np.nanpercentile(uhsasall[idx100],75) - p90_100[nmodels] = np.nanpercentile(uhsasall[idx100],90) - # for models - for mm in range(nmodels): - mean100[mm] = np.nanmean(ncn100all[mm][idx100]) - std100[mm] = np.nanstd(ncn100all[mm][idx100]) - p10_100[mm] = np.nanpercentile(ncn100all[mm][idx100],10) - p25_100[mm] = np.nanpercentile(ncn100all[mm][idx100],25) - p75_100[mm] = np.nanpercentile(ncn100all[mm][idx100],75) - p90_100[mm] = np.nanpercentile(ncn100all[mm][idx100],90) - bias100[mm] = mean100[mm] - mean100[nmodels] - c100 = scipy.stats.pearsonr(ncn100all[mm][idx100],uhsasall[idx100]) - corr100[mm] = [c100[0],c100[1]] - rmse100[mm] = np.sqrt(((ncn100all[mm][idx100]-uhsasall[idx100])**2).mean()) - - -#%% write out files - -outfile = figpath_ship_statistics+'statistics_CN10nm_'+campaign+'.txt' -print('write statistics to file '+outfile) - -with open(outfile, 'w') as f: - f.write('statistics of Aerosol Number Concentration comparing with CPC(>10nm). sample size '+format(sum(idx10))+'\n') - line1 = list(Model_List) - line1.insert(0,' --- ') - line1.append('OBS') - for ii in range(len(line1)): - f.write(format(line1[ii],'10s')+', ') - # write mean - f.write('\n mean,\t') - for ii in range(len(mean10)): - f.write(format(mean10[ii],'10.2f')+', ') - # write std - f.write('\n std. dev.,') - for ii in range(len(std10)): - f.write(format(std10[ii],'10.2f')+', ') - # write percentiles - f.write('\n 10% percentile: ') - for ii in range(len(p10_10)): - f.write(format(p10_10[ii],'10.2f')+', ') - f.write('\n 25% percentile: ') - for ii in range(len(p25_10)): - f.write(format(p25_10[ii],'10.2f')+', ') - f.write('\n 75% percentile: ') - for ii in range(len(p75_10)): - f.write(format(p75_10[ii],'10.2f')+', ') - f.write('\n 90% percentile: ') - for ii in range(len(p90_10)): - f.write(format(p90_10[ii],'10.2f')+', ') - # write bias - f.write('\n bias,\t') - for ii in range(len(bias10)): - f.write(format(bias10[ii],'10.2f')+', ') - # write rmse - f.write('\n RMSE,\t') - for ii in range(len(rmse10)): - f.write(format(rmse10[ii],'10.2f')+', ') - # write correlation - f.write('\n corrcoef,\t') - for ii in range(len(rmse10)): - f.write(format(corr10[ii][0],'10.4f')+', ') - # write p value of correlation - f.write('\n P_corr,\t') - for ii in range(len(rmse10)): - f.write(format(corr10[ii][1],'10.2f')+', ') - - -outfile = figpath_ship_statistics+'statistics_CN100nm_'+campaign+'.txt' -print('write statistics to file '+outfile) - -with open(outfile, 'w') as f: - f.write('statistics of Aerosol Number Concentration comparing with UHSAS100(>100nm). sample size '+format(sum(idx100))+'\n') - line1 = list(Model_List) - line1.insert(0,' --- ') - line1.append('OBS') - for ii in range(len(line1)): - f.write(format(line1[ii],'10s')+', ') - # write mean - f.write('\n mean,\t') - for ii in range(len(mean100)): - f.write(format(mean100[ii],'10.2f')+', ') - # write std - f.write('\n std. dev.,') - for ii in range(len(std100)): - f.write(format(std100[ii],'10.2f')+', ') - # write percentiles - f.write('\n 10% percentile: ') - for ii in range(len(p10_100)): - f.write(format(p10_100[ii],'10.2f')+', ') - f.write('\n 25% percentile: ') - for ii in range(len(p25_100)): - f.write(format(p25_100[ii],'10.2f')+', ') - f.write('\n 75% percentile: ') - for ii in range(len(p75_100)): - f.write(format(p75_100[ii],'10.2f')+', ') - f.write('\n 90% percentile: ') - for ii in range(len(p90_100)): - f.write(format(p90_100[ii],'10.2f')+', ') - # write bias - f.write('\n bias,\t') - for ii in range(len(bias100)): - f.write(format(bias100[ii],'10.2f')+', ') - # write rmse - f.write('\n RMSE,\t') - for ii in range(len(rmse100)): - f.write(format(rmse100[ii],'10.2f')+', ') - # write correlation - f.write('\n corrcoef,\t') - for ii in range(len(rmse100)): - f.write(format(corr100[ii][0],'10.4f')+', ') - # write p value of correlation - f.write('\n P_corr,\t') - for ii in range(len(rmse100)): - f.write(format(corr100[ii][1],'10.2f')+', ') + if len(idx10)==0 or sum(idx10)/len(idx10)<0.1: # two few observation available + # for obs + mean10[nmodels] = missing_value + std10[nmodels] = missing_value + p10_10[nmodels] = missing_value + p25_10[nmodels] = missing_value + p75_10[nmodels] = missing_value + p90_10[nmodels] = missing_value + # for models + for mm in range(nmodels): + mean10[mm] = np.nanmean(ncn10all[mm][idx10]) + std10[mm] = np.nanstd(ncn10all[mm][idx10]) + p10_10[mm] = np.nanpercentile(ncn10all[mm][idx10],10) + p25_10[mm] = np.nanpercentile(ncn10all[mm][idx10],25) + p75_10[mm] = np.nanpercentile(ncn10all[mm][idx10],75) + p90_10[mm] = np.nanpercentile(ncn10all[mm][idx10],90) + bias10[mm] = missing_value + corr10[mm] = [missing_value, missing_value] + rmse10[mm] = missing_value + else: + # for obs + mean10[nmodels] = np.nanmean(cpcall[idx10]) + std10[nmodels] = np.nanstd(cpcall[idx10]) + p10_10[nmodels] = np.nanpercentile(cpcall[idx10],10) + p25_10[nmodels] = np.nanpercentile(cpcall[idx10],25) + p75_10[nmodels] = np.nanpercentile(cpcall[idx10],75) + p90_10[nmodels] = np.nanpercentile(cpcall[idx10],90) + # for models + for mm in range(nmodels): + mean10[mm] = np.nanmean(ncn10all[mm][idx10]) + std10[mm] = np.nanstd(ncn10all[mm][idx10]) + p10_10[mm] = np.nanpercentile(ncn10all[mm][idx10],10) + p25_10[mm] = np.nanpercentile(ncn10all[mm][idx10],25) + p75_10[mm] = np.nanpercentile(ncn10all[mm][idx10],75) + p90_10[mm] = np.nanpercentile(ncn10all[mm][idx10],90) + bias10[mm] = mean10[mm] - mean10[nmodels] + c10 = scipy.stats.pearsonr(ncn10all[mm][idx10],cpcall[idx10]) + corr10[mm] = [c10[0],c10[1]] + rmse10[mm] = np.sqrt(((ncn10all[mm][idx10]-cpcall[idx10])**2).mean()) - - - + if len(idx100)==0 or sum(idx100)/len(idx100)<0.1: # two few observation available + # for obs + mean100[nmodels] = missing_value + std100[nmodels] = missing_value + p10_100[nmodels] = missing_value + p25_100[nmodels] = missing_value + p75_100[nmodels] = missing_value + p90_100[nmodels] = missing_value + # for models + for mm in range(nmodels): + mean100[mm] = np.nanmean(ncn100all[mm][idx100]) + std100[mm] = np.nanstd(ncn100all[mm][idx100]) + p10_100[mm] = np.nanpercentile(ncn100all[mm][idx100],10) + p25_100[mm] = np.nanpercentile(ncn100all[mm][idx100],25) + p75_100[mm] = np.nanpercentile(ncn100all[mm][idx100],75) + p90_100[mm] = np.nanpercentile(ncn100all[mm][idx100],90) + bias100[mm] = missing_value + corr100[mm] = [missing_value, missing_value] + rmse100[mm] = missing_value + else: + # for obs + mean100[nmodels] = np.nanmean(uhsasall[idx100]) + std100[nmodels] = np.nanstd(uhsasall[idx100]) + p10_100[nmodels] = np.nanpercentile(uhsasall[idx100],10) + p25_100[nmodels] = np.nanpercentile(uhsasall[idx100],25) + p75_100[nmodels] = np.nanpercentile(uhsasall[idx100],75) + p90_100[nmodels] = np.nanpercentile(uhsasall[idx100],90) + # for models + for mm in range(nmodels): + mean100[mm] = np.nanmean(ncn100all[mm][idx100]) + std100[mm] = np.nanstd(ncn100all[mm][idx100]) + p10_100[mm] = np.nanpercentile(ncn100all[mm][idx100],10) + p25_100[mm] = np.nanpercentile(ncn100all[mm][idx100],25) + p75_100[mm] = np.nanpercentile(ncn100all[mm][idx100],75) + p90_100[mm] = np.nanpercentile(ncn100all[mm][idx100],90) + bias100[mm] = mean100[mm] - mean100[nmodels] + c100 = scipy.stats.pearsonr(ncn100all[mm][idx100],uhsasall[idx100]) + corr100[mm] = [c100[0],c100[1]] + rmse100[mm] = np.sqrt(((ncn100all[mm][idx100]-uhsasall[idx100])**2).mean()) + + + #%% write out files + + outfile = figpath_ship_statistics+'statistics_CN10nm_'+campaign+'.txt' + print('write statistics to file '+outfile) + + with open(outfile, 'w') as f: + f.write('statistics of Aerosol Number Concentration comparing with CPC(>10nm). sample size '+format(sum(idx10))+'\n') + line1 = list(Model_List) + line1.insert(0,' --- ') + line1.append('OBS') + for ii in range(len(line1)): + f.write(format(line1[ii],'10s')+', ') + # write mean + f.write('\n mean,\t') + for ii in range(len(mean10)): + f.write(format(mean10[ii],'10.2f')+', ') + # write std + f.write('\n std. dev.,') + for ii in range(len(std10)): + f.write(format(std10[ii],'10.2f')+', ') + # write percentiles + f.write('\n 10% percentile: ') + for ii in range(len(p10_10)): + f.write(format(p10_10[ii],'10.2f')+', ') + f.write('\n 25% percentile: ') + for ii in range(len(p25_10)): + f.write(format(p25_10[ii],'10.2f')+', ') + f.write('\n 75% percentile: ') + for ii in range(len(p75_10)): + f.write(format(p75_10[ii],'10.2f')+', ') + f.write('\n 90% percentile: ') + for ii in range(len(p90_10)): + f.write(format(p90_10[ii],'10.2f')+', ') + # write bias + f.write('\n bias,\t') + for ii in range(len(bias10)): + f.write(format(bias10[ii],'10.2f')+', ') + # write rmse + f.write('\n RMSE,\t') + for ii in range(len(rmse10)): + f.write(format(rmse10[ii],'10.2f')+', ') + # write correlation + f.write('\n corrcoef,\t') + for ii in range(len(rmse10)): + f.write(format(corr10[ii][0],'10.4f')+', ') + # write p value of correlation + f.write('\n P_corr,\t') + for ii in range(len(rmse10)): + f.write(format(corr10[ii][1],'10.2f')+', ') + + + outfile = figpath_ship_statistics+'statistics_CN100nm_'+campaign+'.txt' + print('write statistics to file '+outfile) + + with open(outfile, 'w') as f: + f.write('statistics of Aerosol Number Concentration comparing with UHSAS100(>100nm). sample size '+format(sum(idx100))+'\n') + line1 = list(Model_List) + line1.insert(0,' --- ') + line1.append('OBS') + for ii in range(len(line1)): + f.write(format(line1[ii],'10s')+', ') + # write mean + f.write('\n mean,\t') + for ii in range(len(mean100)): + f.write(format(mean100[ii],'10.2f')+', ') + # write std + f.write('\n std. dev.,') + for ii in range(len(std100)): + f.write(format(std100[ii],'10.2f')+', ') + # write percentiles + f.write('\n 10% percentile: ') + for ii in range(len(p10_100)): + f.write(format(p10_100[ii],'10.2f')+', ') + f.write('\n 25% percentile: ') + for ii in range(len(p25_100)): + f.write(format(p25_100[ii],'10.2f')+', ') + f.write('\n 75% percentile: ') + for ii in range(len(p75_100)): + f.write(format(p75_100[ii],'10.2f')+', ') + f.write('\n 90% percentile: ') + for ii in range(len(p90_100)): + f.write(format(p90_100[ii],'10.2f')+', ') + # write bias + f.write('\n bias,\t') + for ii in range(len(bias100)): + f.write(format(bias100[ii],'10.2f')+', ') + # write rmse + f.write('\n RMSE,\t') + for ii in range(len(rmse100)): + f.write(format(rmse100[ii],'10.2f')+', ') + # write correlation + f.write('\n corrcoef,\t') + for ii in range(len(rmse100)): + f.write(format(corr100[ii][0],'10.4f')+', ') + # write p value of correlation + f.write('\n P_corr,\t') + for ii in range(len(rmse100)): + f.write(format(corr100[ii][1],'10.2f')+', ') + diff --git a/src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py b/src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py index 3fc33b6..09de4bd 100644 --- a/src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py +++ b/src/esmac_diags/plotting/contour_flight_timeseries_AerosolSize.py @@ -4,7 +4,6 @@ # compare models and aircraft measurements """ -import sys import os import glob @@ -15,173 +14,168 @@ # from time_format_change import yyyymmdd2cday, hhmmss2sec from ..subroutines.read_netcdf import read_merged_size,read_extractflight +def run_plot(settings): + + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_timeseries = settings['figpath_aircraft_timeseries'] -#%% settings - -from settings import campaign, Model_List, E3SM_aircraft_path, figpath_aircraft_timeseries + IOP = settings.get('IOP', None) + merged_size_path = settings.get('merged_size_path', None) + RFpath = settings.get('RFpath', None) -if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, merged_size_path -elif campaign in ['CSET', 'SOCRATES']: - from settings import RFpath -else: - raise ValueError('please check campaign name: '+campaign) - -if not os.path.exists(figpath_aircraft_timeseries): - os.makedirs(figpath_aircraft_timeseries) - -#%% find files for flight information -lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') -lst.sort() -if len(lst)==0: - raise ValueError('cannot find any file') -# choose files for specific IOP -if campaign=='HISCALE': - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() -elif campaign=='ACEENA': - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() + #%% other settings + if not os.path.exists(figpath_aircraft_timeseries): + os.makedirs(figpath_aircraft_timeseries) -alldates = [x.split('_')[-1].split('.')[0] for x in lst] + #%% find files for flight information + lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') + lst.sort() + if len(lst)==0: + raise ValueError('cannot find any file') + # choose files for specific IOP + if campaign=='HISCALE': + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + elif campaign=='ACEENA': + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + + alldates = [x.split('_')[-1].split('.')[0] for x in lst] + + # dN/dlnDp for model + dlnDp_m = np.empty((3000)) + for bb in range(3000): + dlnDp_m[bb]=np.log((bb+2)/(bb+1)) -# dN/dlnDp for model -dlnDp_m = np.empty((3000)) -for bb in range(3000): - dlnDp_m[bb]=np.log((bb+2)/(bb+1)) + for date in alldates: + + #%% read in Models + nmodels=len(Model_List) + data_m = [] + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + (timem,heightm,datam,timeunitm,datamunit,datamlongname)=read_extractflight(filename_m,'NCNall') + datam=datam*1e-6 # #/m3 to #/cm3 + # average in time for quicker plot + time2 = np.arange(timem[0],timem[-1],60) + data2 = avg_time_2d(timem,datam.T,time2) + datam = data2.T + # change to dN/dlnDp + for tt in range(len(time2)): + datam[:,tt]=datam[:,tt]/dlnDp_m + data_m.append(datam) + + # timem = (np.array(timem)-int(timem[0]))*24 + timem = time2/3600. + + + #%% read observation + if campaign in ['HISCALE', 'ACEENA']: -for date in alldates: + if campaign=='HISCALE': + filename = merged_size_path+'merged_bin_fims_pcasp_'+campaign+'_'+date+'.nc' + elif campaign=='ACEENA': + filename = merged_size_path+'merged_bin_fims_pcasp_opc_'+campaign+'_'+date+'.nc' + #% read in flight information + (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') + (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') + (time,size,height,timeunit,zunit,long_name)=read_merged_size(filename,'height') + (time,size,sizeh,timeunit,dataunit,long_name)=read_merged_size(filename,'size_high') + (time,size,sizel,timeunit,dataunit,long_name)=read_merged_size(filename,'size_low') + (time,size,merge,timeunit,dataunit,long_name)=read_merged_size(filename,'size_distribution_merged') + time=np.ma.compressed(time) + size=size*1000. + + elif campaign in ['CSET', 'SOCRATES']: + filename = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') + # cloud flag + (time,lwc,timeunit,lwcunit,lwclongname,size,cellunit)=read_RF_NCAR(filename[-1],'PLWCC') + # calculate cloud flag based on LWC + cflag=lwc2cflag(lwc,lwcunit) + if campaign=='CSET': + (time,uhsas,timeunit,dataunit,long_name,size,cellunit)=read_RF_NCAR(filename[-1],'CUHSAS_RWOOU') + elif campaign=='SOCRATES': + # there are two variables: CUHSAS_CVIU and CUHSAS_LWII + (time,uhsas,timeunit,dataunit,long_name,size,cellunit)=read_RF_NCAR(filename[-1],'CUHSAS_LWII') + merge = uhsas[:,0,:] + size=size*1000. + sizeh = size + sizel = np.hstack((2*size[0]-size[1], size[0:-1])) + + # merge=merge.T + # time=time/3600. + ## average in time for quicker plot + time2=np.arange(time[0],time[-1],60) + data2 = avg_time_2d(time,merge,time2) + merge = data2.T + time=time2/3600. - #%% read in Models - nmodels=len(Model_List) - data_m = [] - for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - (timem,heightm,datam,timeunitm,datamunit,datamlongname)=read_extractflight(filename_m,'NCNall') - datam=datam*1e-6 # #/m3 to #/cm3 - # average in time for quicker plot - time2 = np.arange(timem[0],timem[-1],60) - data2 = avg_time_2d(timem,datam.T,time2) - datam = data2.T # change to dN/dlnDp - for tt in range(len(time2)): - datam[:,tt]=datam[:,tt]/dlnDp_m - data_m.append(datam) + for bb in range(len(size)): + dlnDp=np.log(sizeh[bb]/sizel[bb]) + merge[bb,:]=merge[bb,:]/dlnDp + + - # timem = (np.array(timem)-int(timem[0]))*24 - timem = time2/3600. - - - #%% read observation - if campaign in ['HISCALE', 'ACEENA']: - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 - - if campaign=='HISCALE': - filename = merged_size_path+'merged_bin_fims_pcasp_'+campaign+'_'+date+'.nc' - elif campaign=='ACEENA': - filename = merged_size_path+'merged_bin_fims_pcasp_opc_'+campaign+'_'+date+'.nc' - #% read in flight information - (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') - (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') - (time,size,height,timeunit,zunit,long_name)=read_merged_size(filename,'height') - (time,size,sizeh,timeunit,dataunit,long_name)=read_merged_size(filename,'size_high') - (time,size,sizel,timeunit,dataunit,long_name)=read_merged_size(filename,'size_low') - (time,size,merge,timeunit,dataunit,long_name)=read_merged_size(filename,'size_distribution_merged') - time=np.ma.compressed(time) - size=size*1000. - - elif campaign in ['CSET', 'SOCRATES']: - filename = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') - # cloud flag - (time,lwc,timeunit,lwcunit,lwclongname,size,cellunit)=read_RF_NCAR(filename[-1],'PLWCC') - # calculate cloud flag based on LWC - cflag=lwc2cflag(lwc,lwcunit) - if campaign=='CSET': - (time,uhsas,timeunit,dataunit,long_name,size,cellunit)=read_RF_NCAR(filename[-1],'CUHSAS_RWOOU') - elif campaign=='SOCRATES': - # there are two variables: CUHSAS_CVIU and CUHSAS_LWII - (time,uhsas,timeunit,dataunit,long_name,size,cellunit)=read_RF_NCAR(filename[-1],'CUHSAS_LWII') - merge = uhsas[:,0,:] - size=size*1000. - sizeh = size - sizel = np.hstack((2*size[0]-size[1], size[0:-1])) + #%% make plot - # merge=merge.T - # time=time/3600. - ## average in time for quicker plot - time2=np.arange(time[0],time[-1],60) - data2 = avg_time_2d(time,merge,time2) - merge = data2.T - time=time2/3600. - - # change to dN/dlnDp - for bb in range(len(size)): - dlnDp=np.log(sizeh[bb]/sizel[bb]) - merge[bb,:]=merge[bb,:]/dlnDp + figname = figpath_aircraft_timeseries+'AerosolSize_'+campaign+'_'+date+'.png' + print('plotting figures to '+figname) + #fig = plt.figure() + fig,ax = plt.subplots(nmodels+1,1,figsize=(8,2*(nmodels+1))) # figsize in inches + plt.tight_layout(h_pad=1.1) #pad=0.4, w_pad=0.5, h_pad=1.0 + plt.subplots_adjust(right=0.9,bottom=0.1) - - #%% make plot - - figname = figpath_aircraft_timeseries+'AerosolSize_'+campaign+'_'+date+'.png' - print('plotting figures to '+figname) - - #fig = plt.figure() - fig,ax = plt.subplots(nmodels+1,1,figsize=(8,2*(nmodels+1))) # figsize in inches - plt.tight_layout(h_pad=1.1) #pad=0.4, w_pad=0.5, h_pad=1.0 - plt.subplots_adjust(right=0.9,bottom=0.1) - - leveltick=[0.1,1,10,100,1000,10000] - levellist=np.arange(np.log(leveltick[0]),11,.5) - - merge[merge<0.01]=0.01 - h1 = ax[0].contourf(time,size,np.log(merge),levellist,cmap=plt.get_cmap('jet')) - - d_mam=np.arange(1,3001) - h2=[] - for mm in range(nmodels): - datam = data_m[mm] - datam[datam<0.01]=0.01 - h_m = ax[mm+1].contourf(timem,d_mam,np.log(datam),levellist,cmap=plt.get_cmap('jet')) - h2.append(h_m) - - # colorbar - cax = plt.axes([0.95, 0.2, 0.02, 0.6]) - cbar=fig.colorbar(h2[0], cax=cax, ticks=np.log(leveltick)) - cbar.ax.set_yticklabels(leveltick, fontsize=14) - - # set axis - for ii in range(nmodels+1): - ax[ii].set_xlim(timem[0],timem[-1]) - ax[ii].set_yscale('log') - ax[ii].set_ylim(3, 5000) - ax[ii].set_yticks([10,100,1000]) - ax[ii].tick_params(color='k',labelsize=14) - if ii==0: - ax[ii].text(0.01, 0.94, 'OBS', fontsize=14,transform=ax[ii].transAxes, verticalalignment='top') - else: - ax[ii].text(0.01, 0.94, Model_List[ii-1], fontsize=14,transform=ax[ii].transAxes, verticalalignment='top') + leveltick=[0.1,1,10,100,1000,10000] + levellist=np.arange(np.log(leveltick[0]),11,.5) - ax[1].set_ylabel('Diameter (nm)',fontsize=14) - ax[0].set_title('Size Distribution (#/dlnDp, cm-3)',fontsize=15) - ax[nmodels].set_xlabel('time (hour UTC) in '+date,fontsize=14) - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - plt.close() - - \ No newline at end of file + merge[merge<0.01]=0.01 + h1 = ax[0].contourf(time,size,np.log(merge),levellist,cmap=plt.get_cmap('jet')) + + d_mam=np.arange(1,3001) + h2=[] + for mm in range(nmodels): + datam = data_m[mm] + datam[datam<0.01]=0.01 + h_m = ax[mm+1].contourf(timem,d_mam,np.log(datam),levellist,cmap=plt.get_cmap('jet')) + h2.append(h_m) + + # colorbar + cax = plt.axes([0.95, 0.2, 0.02, 0.6]) + cbar=fig.colorbar(h2[0], cax=cax, ticks=np.log(leveltick)) + cbar.ax.set_yticklabels(leveltick, fontsize=14) + + # set axis + for ii in range(nmodels+1): + ax[ii].set_xlim(timem[0],timem[-1]) + ax[ii].set_yscale('log') + ax[ii].set_ylim(3, 5000) + ax[ii].set_yticks([10,100,1000]) + ax[ii].tick_params(color='k',labelsize=14) + if ii==0: + ax[ii].text(0.01, 0.94, 'OBS', fontsize=14,transform=ax[ii].transAxes, verticalalignment='top') + else: + ax[ii].text(0.01, 0.94, Model_List[ii-1], fontsize=14,transform=ax[ii].transAxes, verticalalignment='top') + + ax[1].set_ylabel('Diameter (nm)',fontsize=14) + ax[0].set_title('Size Distribution (#/dlnDp, cm-3)',fontsize=15) + ax[nmodels].set_xlabel('time (hour UTC) in '+date,fontsize=14) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + plt.close() diff --git a/src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py b/src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py index 43d894c..0782d00 100644 --- a/src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py +++ b/src/esmac_diags/plotting/contour_sfc_diurnalcycle_AerosolSize.py @@ -3,8 +3,6 @@ # compare models and surface measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -16,214 +14,225 @@ from ..subroutines.specific_data_treatment import avg_time_2d from ..subroutines.quality_control import qc_mask_qcflag, qc_remove_neg,qc_correction_nanosmps -#%% settings -from settings import campaign, Model_List, IOP, start_date, end_date, E3SM_sfc_path, figpath_sfc_timeseries -if campaign=='ACEENA': - from settings import uhsassfcpath -elif campaign=='HISCALE': - if IOP=='IOP1': - from settings import smps_bnl_path, nanosmps_bnl_path - elif IOP=='IOP2': - from settings import smps_pnnl_path +def run_plot(settings): + #%% variables from settings + + campaign = settings['campaign'] + Model_List = settings['Model_List'] + start_date = settings['start_date'] + end_date = settings['end_date'] + E3SM_sfc_path = settings['E3SM_sfc_path'] + figpath_sfc_timeseries = settings['figpath_sfc_timeseries'] -if not os.path.exists(figpath_sfc_timeseries): - os.makedirs(figpath_sfc_timeseries) - -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date,'noleap') -cday2 = yyyymmdd2cday(end_date,'noleap') -if start_date[0:4]!=end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] - -#%% read in obs data -if campaign=='ACEENA': - if IOP=='IOP1': - lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.2017062*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201707*') - elif IOP=='IOP2': - lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201801*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201802*') - lst.sort() - t_uhsas=np.empty(0) - uhsas=np.empty((0,99)) - for filename in lst: - (time,dmin,dmax,data,timeunit,dataunit,long_name) = read_uhsas(filename) - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - # average in time for quicker plot - time2=np.arange(300,86400,600) - data2 = avg_time_2d(time,data,time2) - t_uhsas=np.hstack((t_uhsas, cday+time2/86400)) - uhsas=np.vstack((uhsas, data2)) - size_u = (dmin+dmax)/2 - uhsas=qc_remove_neg(uhsas) - # change to dN/dlogDp - dlnDp_u=np.empty(99) - for bb in range(len(size_u)): - dlnDp_u[bb]=np.log10(dmax[bb]/dmin[bb]) - uhsas[:,bb]=uhsas[:,bb]/dlnDp_u[bb] - - time0 = np.array(t_uhsas) - size = np.array(size_u) - obs = np.array(uhsas.T) - -elif campaign=='HISCALE': - if IOP=='IOP1': - lst = glob.glob(smps_bnl_path+'*.nc') + IOP = settings.get('IOP', None) + uhsassfcpath = settings.get('uhsassfcpath', None) + + if campaign=='HISCALE': + if IOP=='IOP1': + smps_bnl_path = settings['smps_bnl_path'] + nanosmps_bnl_path = settings['nanosmps_bnl_path'] + elif IOP=='IOP2': + smps_pnnl_path = settings['smps_pnnl_path'] + + #%% other settings + if not os.path.exists(figpath_sfc_timeseries): + os.makedirs(figpath_sfc_timeseries) + + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date,'noleap') + cday2 = yyyymmdd2cday(end_date,'noleap') + if start_date[0:4]!=end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] + + #%% read in obs data + if campaign=='ACEENA': + if IOP=='IOP1': + lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.2017062*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201707*') + elif IOP=='IOP2': + lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201801*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201802*') lst.sort() - t_smps=np.empty(0) - smps=np.empty((0,192)) + t_uhsas=np.empty(0) + uhsas=np.empty((0,99)) for filename in lst: - (time,size,flag,timeunit,dataunit,smps_longname)=read_smps_bnl(filename,'status_flag') - (time,size,data,timeunit,smpsunit,smps_longname)=read_smps_bnl(filename,'number_size_distribution') - data=qc_mask_qcflag(data,flag) - data=qc_remove_neg(data) + (time,dmin,dmax,data,timeunit,dataunit,long_name) = read_uhsas(filename) timestr=timeunit.split(' ') date=timestr[2] cday=yyyymmdd2cday(date,'noleap') - t_smps=np.hstack((t_smps, cday+time/86400)) - smps=np.vstack((smps, data)) - smps=smps.T - # combine with nanoSMPS - lst2 = glob.glob(nanosmps_bnl_path+'*.nc') - lst2.sort() - t_nano=np.empty(0) - nanosmps=np.empty((0,192)) - for filename2 in lst2: - (timen,sizen,flagn,timenunit,datanunit,long_name)=read_smps_bnl(filename2,'status_flag') - (timen,sizen,datan,timenunit,nanounit,nanoname)=read_smps_bnl(filename2,'number_size_distribution') - datan=qc_mask_qcflag(datan,flagn) - datan=qc_remove_neg(datan) - timestr=timenunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - t_nano=np.hstack((t_nano, cday+timen/86400)) - nanosmps=np.vstack((nanosmps, datan)) - # nanosmps is overcounting, adjust nanosmps value for smooth transition to SMPS - nanosmps=qc_correction_nanosmps(nanosmps.T) - for tt in range(smps.shape[1]): - if any(t_nano==t_smps[tt]): - smps[0:80,tt]=nanosmps[0:80,t_nano==t_smps[tt]].reshape(80) + # average in time for quicker plot + time2=np.arange(300,86400,600) + data2 = avg_time_2d(time,data,time2) + t_uhsas=np.hstack((t_uhsas, cday+time2/86400)) + uhsas=np.vstack((uhsas, data2)) + size_u = (dmin+dmax)/2 + uhsas=qc_remove_neg(uhsas) + # change to dN/dlogDp + dlnDp_u=np.empty(99) + for bb in range(len(size_u)): + dlnDp_u[bb]=np.log10(dmax[bb]/dmin[bb]) + uhsas[:,bb]=uhsas[:,bb]/dlnDp_u[bb] + + time0 = np.array(t_uhsas) + size = np.array(size_u) + obs = np.array(uhsas.T) + + elif campaign=='HISCALE': + if IOP=='IOP1': + lst = glob.glob(smps_bnl_path+'*.nc') + lst.sort() + t_smps=np.empty(0) + smps=np.empty((0,192)) + for filename in lst: + (time,size,flag,timeunit,dataunit,smps_longname)=read_smps_bnl(filename,'status_flag') + (time,size,data,timeunit,smpsunit,smps_longname)=read_smps_bnl(filename,'number_size_distribution') + data=qc_mask_qcflag(data,flag) + data=qc_remove_neg(data) + timestr=timeunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + t_smps=np.hstack((t_smps, cday+time/86400)) + smps=np.vstack((smps, data)) + smps=smps.T + # combine with nanoSMPS + lst2 = glob.glob(nanosmps_bnl_path+'*.nc') + lst2.sort() + t_nano=np.empty(0) + nanosmps=np.empty((0,192)) + for filename2 in lst2: + (timen,sizen,flagn,timenunit,datanunit,long_name)=read_smps_bnl(filename2,'status_flag') + (timen,sizen,datan,timenunit,nanounit,nanoname)=read_smps_bnl(filename2,'number_size_distribution') + datan=qc_mask_qcflag(datan,flagn) + datan=qc_remove_neg(datan) + timestr=timenunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + t_nano=np.hstack((t_nano, cday+timen/86400)) + nanosmps=np.vstack((nanosmps, datan)) + # nanosmps is overcounting, adjust nanosmps value for smooth transition to SMPS + nanosmps=qc_correction_nanosmps(nanosmps.T) + for tt in range(smps.shape[1]): + if any(t_nano==t_smps[tt]): + smps[0:80,tt]=nanosmps[0:80,t_nano==t_smps[tt]].reshape(80) + + elif IOP=='IOP2': + data=read_smpsb_pnnl(smps_pnnl_path+'HiScaleSMPSb_SGP_20160827_R1.ict') + size=read_smps_bin(smps_pnnl_path+'NSD_column_size_chart.txt') + time=data[0,:] + smps=data[1:-1,:] + flag=data[-1,:] + cday=yyyymmdd2cday('2016-08-27','noleap') + t_smps=cday+time/86400 + smps=qc_mask_qcflag(smps.T,flag).T + + time0 = np.array(t_smps) + size = np.array(size) + obs = np.array(smps) - elif IOP=='IOP2': - data=read_smpsb_pnnl(smps_pnnl_path+'HiScaleSMPSb_SGP_20160827_R1.ict') - size=read_smps_bin(smps_pnnl_path+'NSD_column_size_chart.txt') - time=data[0,:] - smps=data[1:-1,:] - flag=data[-1,:] - cday=yyyymmdd2cday('2016-08-27','noleap') - t_smps=cday+time/86400 - smps=qc_mask_qcflag(smps.T,flag).T + # SMPS is already divided by log10 - time0 = np.array(t_smps) - size = np.array(size) - obs = np.array(smps) + else: + raise ValueError('please check campaign name: '+campaign) - # SMPS is already divided by log10 + # only choose the time period between start_date and end_date + obs=obs[:,np.logical_and(time0>=cday1, time0=cday1, time0=cday1, time0=cday1, time0=days[dd], timem=days[dd], timemtimem0[-1]: - timem0[timem0<=timem0[-1]]=timem0[timem0<=timem0[-1]]+365 + for ll in range(len(lst)): + if campaign=='MAGIC': + legnum=lst[ll][-5:-3] + elif campaign=='MARCUS': + legnum=lst[ll][-4] + + + #%% read in model + nmodels=len(Model_List) + datam = list() + for mm in range(nmodels): + filenamem = E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' - # average in time for quicker plot - timem=np.arange(timem0[0]-0.1,timem0[-1]+0.1,1/24.) - data2 = avg_time_2d(timem0,data.T,timem) - data2 = data2.T + (timem0,data,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCNall') - # change to dN/dlnDp - for bb in range(3000): - dlnDp=np.log((bb+2)/(bb+1)) - data2[bb,:]=data2[bb,:]/dlnDp - datam.append(data2*1e-6) # change unit from 1/m3 to 1/cm3 + # if time expands two years, add 365 days to the second year + if timem0[0]>timem0[-1]: + timem0[timem0<=timem0[-1]]=timem0[timem0<=timem0[-1]]+365 + + # average in time for quicker plot + timem=np.arange(timem0[0]-0.1,timem0[-1]+0.1,1/24.) + data2 = avg_time_2d(timem0,data.T,timem) + data2 = data2.T + + # change to dN/dlnDp + for bb in range(3000): + dlnDp=np.log((bb+2)/(bb+1)) + data2[bb,:]=data2[bb,:]/dlnDp + datam.append(data2*1e-6) # change unit from 1/m3 to 1/cm3 + + year0 = str(int(timeunitm.split()[2][0:4])+1) - year0 = str(int(timeunitm.split()[2][0:4])+1) - - #%% read in observations - # find the days related to the ship leg - day = [int(a) for a in timem] - day = list(set(day)) - day.sort() - - nbins = 99 # for UHSAS at MAGIC - t_uh=np.empty(0) - uhsasall=np.empty((0,nbins)) - for dd in day: - if campaign=='MAGIC': - if int(legnum)<=9: - if dd<=365: # year 2012 - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') + #%% read in observations + # find the days related to the ship leg + day = [int(a) for a in timem] + day = list(set(day)) + day.sort() + + nbins = 99 # for UHSAS at MAGIC + t_uh=np.empty(0) + uhsasall=np.empty((0,nbins)) + for dd in day: + if campaign=='MAGIC': + if int(legnum)<=9: + if dd<=365: # year 2012 + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') + else: + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*.cdf') else: - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*.cdf') - else: - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') - elif campaign=='MARCUS': - if int(legnum)<=2: - if dd<=365: # year 2012 - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') + elif campaign=='MARCUS': + if int(legnum)<=2: + if dd<=365: # year 2012 + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') else: - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') - - if len(filenameo)==0: - continue # some days may be missing - if len(filenameo)>1: - raise ValueError('find too many files: ' + filenameo) + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + + if len(filenameo)==0: + continue # some days may be missing + if len(filenameo)>1: + raise ValueError('find too many files: ' + filenameo) + + + (time,dmin,dmax,uhsas,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) + + uhsas=np.ma.filled(uhsas) + uhsas=qc_remove_neg(uhsas) + + # average in time for quicker plot + time2=np.arange(1800,86400,3600) + data2 = avg_time_2d(time,uhsas,time2) + uhsasall=np.vstack((uhsasall, data2)) + t_uh = np.hstack((t_uh,time2/86400+dd)) + + # if no obs available, fill one data with NaN + if len(t_uh)==0: + t_uh=[timem[0],timem[1]] + uhsasall=np.full((2,nbins),np.nan) + + # if time expands two years, add 365 days to the second year + if t_uh[0]>t_uh[-1]: + t_uh[t_uh<=t_uh[-1]]=t_uh[t_uh<=t_uh[-1]]+365 + + size_u = (dmin+dmax)/2 + dsize_u = dmax-dmin + uhsasall=qc_remove_neg(uhsasall) - (time,dmin,dmax,uhsas,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) + # change to dN/dlnDp + dlnDp_u=np.empty(nbins) + for bb in range(len(size_u)): + dlnDp_u[bb]=np.log(dmax[bb]/dmin[bb]) + uhsasall[:,bb]=uhsasall[:,bb]/dlnDp_u[bb] - uhsas=np.ma.filled(uhsas) - uhsas=qc_remove_neg(uhsas) + #%% make plot + + figname = figpath_ship_timeseries+'timeseries_AerosolSize_'+campaign+'_ship'+legnum+'.png' + print('plotting figures to '+figname) - # average in time for quicker plot - time2=np.arange(1800,86400,3600) - data2 = avg_time_2d(time,uhsas,time2) - uhsasall=np.vstack((uhsasall, data2)) - t_uh = np.hstack((t_uh,time2/86400+dd)) + #fig = plt.figure() + fig,ax = plt.subplots(nmodels+1,1,figsize=(8,2*(nmodels+1))) # figsize in inches + plt.tight_layout(h_pad=1.1) #pad=0.4, w_pad=0.5, h_pad=1.0 + plt.subplots_adjust(right=0.9,bottom=0.1) - # if no obs available, fill one data with NaN - if len(t_uh)==0: - t_uh=[timem[0],timem[1]] - uhsasall=np.full((2,nbins),np.nan) + leveltick=[0.1,1,10,100,1000,10000,100000] + levellist=np.arange(np.log(leveltick[0]),12,.5) - # if time expands two years, add 365 days to the second year - if t_uh[0]>t_uh[-1]: - t_uh[t_uh<=t_uh[-1]]=t_uh[t_uh<=t_uh[-1]]+365 + uhsasall[uhsasall<0.01]=0.01 + h1 = ax[0].contourf(t_uh,size_u,np.log(uhsasall.T),levellist,cmap=plt.get_cmap('jet')) - size_u = (dmin+dmax)/2 - dsize_u = dmax-dmin + size_m=np.arange(1,3001) + h2=[] + for mm in range(nmodels): + data = datam[mm] + data[data<0.01]=0.01 + h_m = ax[mm+1].contourf(timem,size_m,np.log(data),levellist,cmap=plt.get_cmap('jet')) + h2.append(h_m) - uhsasall=qc_remove_neg(uhsasall) - - # change to dN/dlnDp - dlnDp_u=np.empty(nbins) - for bb in range(len(size_u)): - dlnDp_u[bb]=np.log(dmax[bb]/dmin[bb]) - uhsasall[:,bb]=uhsasall[:,bb]/dlnDp_u[bb] - - #%% make plot + # colorbar + cax = plt.axes([0.92, 0.2, 0.02, 0.6]) + cbar=fig.colorbar(h2[0], cax=cax, ticks=np.log(leveltick)) + cbar.ax.set_yticklabels(leveltick, fontsize=14) - figname = figpath_ship_timeseries+'timeseries_AerosolSize_'+campaign+'_ship'+legnum+'.png' - print('plotting figures to '+figname) - - #fig = plt.figure() - fig,ax = plt.subplots(nmodels+1,1,figsize=(8,2*(nmodels+1))) # figsize in inches - plt.tight_layout(h_pad=1.1) #pad=0.4, w_pad=0.5, h_pad=1.0 - plt.subplots_adjust(right=0.9,bottom=0.1) - - leveltick=[0.1,1,10,100,1000,10000,100000] - levellist=np.arange(np.log(leveltick[0]),12,.5) - - uhsasall[uhsasall<0.01]=0.01 - h1 = ax[0].contourf(t_uh,size_u,np.log(uhsasall.T),levellist,cmap=plt.get_cmap('jet')) - - size_m=np.arange(1,3001) - h2=[] - for mm in range(nmodels): - data = datam[mm] - data[data<0.01]=0.01 - h_m = ax[mm+1].contourf(timem,size_m,np.log(data),levellist,cmap=plt.get_cmap('jet')) - h2.append(h_m) - - # colorbar - cax = plt.axes([0.92, 0.2, 0.02, 0.6]) - cbar=fig.colorbar(h2[0], cax=cax, ticks=np.log(leveltick)) - cbar.ax.set_yticklabels(leveltick, fontsize=14) - - # set axis - for ii in range(nmodels+1): - ax[ii].set_xlim(timem[0],timem[-1]) - ax[ii].set_yscale('log') - ax[ii].set_ylim(5, 3000) - ax[ii].set_yticks([10,100,1000]) - ax[ii].tick_params(color='k',labelsize=14) - if ii==0: - ax[ii].text(0.01, 0.94, 'OBS', fontsize=14,transform=ax[ii].transAxes, verticalalignment='top') - else: - ax[ii].text(0.01, 0.94, Model_List[ii-1], fontsize=14,transform=ax[ii].transAxes, verticalalignment='top') + # set axis + for ii in range(nmodels+1): + ax[ii].set_xlim(timem[0],timem[-1]) + ax[ii].set_yscale('log') + ax[ii].set_ylim(5, 3000) + ax[ii].set_yticks([10,100,1000]) + ax[ii].tick_params(color='k',labelsize=14) + if ii==0: + ax[ii].text(0.01, 0.94, 'OBS', fontsize=14,transform=ax[ii].transAxes, verticalalignment='top') + else: + ax[ii].text(0.01, 0.94, Model_List[ii-1], fontsize=14,transform=ax[ii].transAxes, verticalalignment='top') + + ax[1].set_ylabel('Diameter (nm)',fontsize=14) + ax[0].set_title('Size Distribution (#/dlnDp, cm-3)',fontsize=15) + ax[nmodels].set_xlabel('Calendar Day in '+year0,fontsize=14) - ax[1].set_ylabel('Diameter (nm)',fontsize=14) - ax[0].set_title('Size Distribution (#/dlnDp, cm-3)',fontsize=15) - ax[nmodels].set_xlabel('Calendar Day in '+year0,fontsize=14) - - fig.text(.08, .97,'ship leg '+legnum, fontsize=12) - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - \ No newline at end of file + fig.text(.08, .97,'ship leg '+legnum, fontsize=12) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py b/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py index 64e8609..4b7af36 100644 --- a/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py +++ b/src/esmac_diags/plotting/plot_flight_pdf_AerosolSize.py @@ -4,8 +4,6 @@ # compare models and aircraft measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -18,28 +16,19 @@ from ..subroutines.specific_data_treatment import avg_time_2d from ..subroutines.quality_control import qc_mask_cloudflag, qc_uhsas_RF_NCAR,qc_remove_neg,qc_mask_takeoff_landing -#%% settings - def run_plot(settings): - # from settings import campaign, Model_List, color_model, \ - # E3SM_aircraft_path, figpath_aircraft_statistics - - # if campaign in ['HISCALE', 'ACEENA']: - # from settings import IOP, merged_size_path - # elif campaign in ['CSET', 'SOCRATES']: - # from settings import RFpath - # else: - # raise ValueError('campaign name is not recognized: '+campaign) - + #%% variables from settings campaign = settings['campaign'] Model_List = settings['Model_List'] color_model = settings['color_model'] E3SM_aircraft_path = settings['E3SM_aircraft_path'] figpath_aircraft_statistics = settings['figpath_aircraft_statistics'] + IOP = settings.get('IOP', None) merged_size_path = settings.get('merged_size_path', None) + #%% other settings if not os.path.exists(figpath_aircraft_statistics): os.makedirs(figpath_aircraft_statistics) diff --git a/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py index bc6e87b..0bad3a4 100644 --- a/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py +++ b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparateCloud_aceena.py @@ -3,7 +3,6 @@ # plot pdf and percentiles in several aerosol size bins for aircraft data # separated by observed PBLH """ -import sys import os import glob @@ -14,401 +13,409 @@ from ..subroutines.read_netcdf import read_merged_size,read_extractflight from ..subroutines.quality_control import qc_remove_neg -#%% settings +def run_plot(settings): -from settings import campaign, cpcpath,merged_size_path, \ - Model_List, color_model, IOP, E3SM_aircraft_path, figpath_aircraft_statistics - -if not os.path.exists(figpath_aircraft_statistics): - os.makedirs(figpath_aircraft_statistics) - -# set final bin sizes -binl = np.array([3, 15, 70, 300, 1000]) -binh = np.array([10, 70, 300, 1000, 3000]) -binm = (binl+binh)/2 - -d_mam=np.arange(1,3001) -blen = len(binm) - -# numbers of bins in merged size data -b2len=67 - -#%% find files for flight information - -lst = glob.glob(merged_size_path+'merged_bin_*'+campaign+'*.nc') -lst.sort() - -if len(lst)==0: - raise ValueError('cannot find any file') - -# choose files for specific IOP -if campaign=='ACEENA': - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+campaign+'_') - lst = glob.glob(a[0]+'*'+IOP+'*') - lst.sort() -else: - raise ValueError('this code is only for ACEENA, check the campaign settings') - -if len(lst)==0: - raise ValueError('cannot find any file') - -#%% read all data - -# pdf average for legs -pdf_sfc_obs=np.zeros([b2len,0]) -pdf_near_obs=np.zeros([b2len,0]) -pdf_above_obs=np.zeros([b2len,0]) - -cpcdiff_sfc=np.zeros([0]) -cpcdiff_near=np.zeros([0]) -cpcdiff_above=np.zeros([0]) - -nmodels=len(Model_List) -pdf_sfc_model=[] -pdf_near_model=[] -pdf_above_model=[] -for mm in range(nmodels): - pdf_sfc_model.append(np.zeros([3000,0])) - pdf_near_model.append(np.zeros([3000,0])) - pdf_above_model.append(np.zeros([3000,0])) - -# pdf for the final bin sizes -p2_sfc_obs = [] -p2_near_obs = [] -p2_above_obs = [] -p2_sfc_model=[] -p2_near_model=[] -p2_above_model=[] -for mm in range(nmodels): - p2_sfc_model.append([]) - p2_near_model.append([]) - p2_above_model.append([]) - -print('reading '+format(len(lst))+' files to calculate the statistics: ') - -for filename in lst: + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + cpcpath = settings['cpcpath'] + merged_size_path = settings['merged_size_path'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_statistics = settings['figpath_aircraft_statistics'] - # get date info: - date=filename[-12:-3] - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 - print(date) - - #%% read aerosol size distribution - (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') - (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') - (time,size,legnum,timeunit,cunit,long_name)=read_merged_size(filename,'leg_number') - (time,size,height,timeunit,zunit,long_name)=read_merged_size(filename,'height') - (time,size,sizeh,timeunit,dataunit,long_name)=read_merged_size(filename,'size_high') - (time,size,sizel,timeunit,dataunit,long_name)=read_merged_size(filename,'size_low') - (time,size,merge,timeunit,dataunit,long_name)=read_merged_size(filename,'size_distribution_merged') - time=np.ma.compressed(time) - timelen = len(time) - time=time/3600. - size=np.ma.compressed(size)*1000 # um to nm - sizel=sizel*1000 - sizeh=sizeh*1000 - merge=qc_remove_neg(merge) + IOP = settings.get('IOP', None) + + #%% other settings + if not os.path.exists(figpath_aircraft_statistics): + os.makedirs(figpath_aircraft_statistics) + + # set final bin sizes + binl = np.array([3, 15, 70, 300, 1000]) + binh = np.array([10, 70, 300, 1000, 3000]) + binm = (binl+binh)/2 + d_mam=np.arange(1,3001) + blen = len(binm) - - #%% read in CPC measurements + # numbers of bins in merged size data + b2len=67 + + #%% find files for flight information + + lst = glob.glob(merged_size_path+'merged_bin_*'+campaign+'*.nc') + lst.sort() + if len(lst)==0: + raise ValueError('cannot find any file') + + # choose files for specific IOP if campaign=='ACEENA': - filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_ACEENA001s.ict') + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+campaign+'_') + lst = glob.glob(a[0]+'*'+IOP+'*') + lst.sort() else: raise ValueError('this code is only for ACEENA, check the campaign settings') - filename_c.sort() - # read in data - if len(filename_c)==1 or len(filename_c)==2: # some days have two flights - (cpc,cpclist)=read_cpc(filename_c[flightidx-1]) - if np.logical_and(campaign=='ACEENA', date=='20180216a'): - cpc=np.insert(cpc,1404,(cpc[:,1403]+cpc[:,1404])/2,axis=1) - elif np.logical_and(campaign=='HiScale', date=='20160425a'): - cpc=np.insert(cpc,0,cpc[:,0],axis=1) - cpc[0,0]=cpc[0,0]-1 - time_cpc = cpc[0,:]/3600 - cpc10 = cpc[1,:] - cpc3 = cpc[2,:] - elif len(filename_c)==0: - time_cpc=time - cpc10=np.nan*np.empty([len(time)]) - cpc3=np.nan*np.empty([len(time)]) - else: - raise ValueError('find too many files in ' + filename_c) - cpcdiff = cpc3-cpc10 - cpcdiff=qc_remove_neg(cpcdiff) + if len(lst)==0: + raise ValueError('cannot find any file') + + #%% read all data - #%% read in Models - datam2 = [] + # pdf average for legs + pdf_sfc_obs=np.zeros([b2len,0]) + pdf_near_obs=np.zeros([b2len,0]) + pdf_above_obs=np.zeros([b2len,0]) + + cpcdiff_sfc=np.zeros([0]) + cpcdiff_near=np.zeros([0]) + cpcdiff_above=np.zeros([0]) + + nmodels=len(Model_List) + pdf_sfc_model=[] + pdf_near_model=[] + pdf_above_model=[] + for mm in range(nmodels): + pdf_sfc_model.append(np.zeros([3000,0])) + pdf_near_model.append(np.zeros([3000,0])) + pdf_above_model.append(np.zeros([3000,0])) + + # pdf for the final bin sizes + p2_sfc_obs = [] + p2_near_obs = [] + p2_above_obs = [] + p2_sfc_model=[] + p2_near_model=[] + p2_above_model=[] for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - (timem,heightm,datam,timeunitm,datamunit,datamlongname)=read_extractflight(filename_m,'NCNall') - datam2.append(datam*1e-6) # #/m3 to #/cm3 - - timem = (timem - int(timem[0]))*24 - - if len(timem)!=len(time) or len(time)!=len(time_cpc): - raise ValueError('time dimension for obs and/or model are not consistent') - - #%% get leg information near surface, near cloud base and above cloud - # leg_sfc = np.ma.compressed (np.unique(legnum[height<=200])[1:]) - leg_sfc = list() - leg_near = list() - leg_above = list() - leg_toomuchcld = list() - leg_nocld = list() - leg_nodata = list() - - for ii in range(1,max(legnum)+1): - # for ii in range(5,7): - idx_l = legnum==ii - # if any(cflag[idx_l]==1): - # make sure cloud flag less than 10% of time and FIMS is not all missing (e.g., TD mode) - if np.sum(cflag[idx_l])/len(cflag[idx_l]) >= 0.1: - # if np.sum(cflag[idx_l]) > 1: - leg_toomuchcld.append(ii) - continue - if all(np.isnan(merge[idx_l,10])): - leg_nodata.append(ii) - continue + p2_sfc_model.append([]) + p2_near_model.append([]) + p2_above_model.append([]) + + print('reading '+format(len(lst))+' files to calculate the statistics: ') + + for filename in lst: - legheight = np.mean(height[idx_l]) - # if legheight<=250: # leg number near surface - # leg_sfc.append(ii) + # get date info: + date=filename[-12:-3] + if date[-1]=='a': + flightidx=1 + else: + flightidx=2 + print(date) + + #%% read aerosol size distribution + (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') + (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') + (time,size,legnum,timeunit,cunit,long_name)=read_merged_size(filename,'leg_number') + (time,size,height,timeunit,zunit,long_name)=read_merged_size(filename,'height') + (time,size,sizeh,timeunit,dataunit,long_name)=read_merged_size(filename,'size_high') + (time,size,sizel,timeunit,dataunit,long_name)=read_merged_size(filename,'size_low') + (time,size,merge,timeunit,dataunit,long_name)=read_merged_size(filename,'size_distribution_merged') + time=np.ma.compressed(time) + time=time/3600. + size=np.ma.compressed(size)*1000 # um to nm + sizel=sizel*1000 + sizeh=sizeh*1000 + merge=qc_remove_neg(merge) + + + + #%% read in CPC measurements + + if campaign=='ACEENA': + filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_ACEENA001s.ict') + else: + raise ValueError('this code is only for ACEENA, check the campaign settings') + filename_c.sort() + # read in data + if len(filename_c)==1 or len(filename_c)==2: # some days have two flights + (cpc,cpclist)=read_cpc(filename_c[flightidx-1]) + if np.logical_and(campaign=='ACEENA', date=='20180216a'): + cpc=np.insert(cpc,1404,(cpc[:,1403]+cpc[:,1404])/2,axis=1) + elif np.logical_and(campaign=='HiScale', date=='20160425a'): + cpc=np.insert(cpc,0,cpc[:,0],axis=1) + cpc[0,0]=cpc[0,0]-1 + time_cpc = cpc[0,:]/3600 + cpc10 = cpc[1,:] + cpc3 = cpc[2,:] + elif len(filename_c)==0: + time_cpc=time + cpc10=np.nan*np.empty([len(time)]) + cpc3=np.nan*np.empty([len(time)]) + else: + raise ValueError('find too many files in ' + filename_c) + + cpcdiff = cpc3-cpc10 + cpcdiff=qc_remove_neg(cpcdiff) + + #%% read in Models + datam2 = [] + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + (timem,heightm,datam,timeunitm,datamunit,datamlongname)=read_extractflight(filename_m,'NCNall') + datam2.append(datam*1e-6) # #/m3 to #/cm3 + + timem = (timem - int(timem[0]))*24 + + if len(timem)!=len(time) or len(time)!=len(time_cpc): + raise ValueError('time dimension for obs and/or model are not consistent') + + #%% get leg information near surface, near cloud base and above cloud + # leg_sfc = np.ma.compressed (np.unique(legnum[height<=200])[1:]) + leg_sfc = list() + leg_near = list() + leg_above = list() + leg_toomuchcld = list() + leg_nocld = list() + leg_nodata = list() + + for ii in range(1,max(legnum)+1): + # for ii in range(5,7): + idx_l = legnum==ii + # if any(cflag[idx_l]==1): + # make sure cloud flag less than 10% of time and FIMS is not all missing (e.g., TD mode) + if np.sum(cflag[idx_l])/len(cflag[idx_l]) >= 0.1: + # if np.sum(cflag[idx_l]) > 1: + leg_toomuchcld.append(ii) + continue + if all(np.isnan(merge[idx_l,10])): + leg_nodata.append(ii) + continue - # find the mean cloud height within 1hr of the leg - i = np.argwhere(legnum==ii) - i_start = max(i[0][0]-3600, 0) - i_end = min(i[-1][0]+3600, len(cflag)) - if all(cflag[i_start:i_end]!=1): - leg_nocld.append(ii) - if legheight>2500: - leg_above.append(ii) - elif legheight<=250: # leg number near surface + legheight = np.mean(height[idx_l]) + # if legheight<=250: # leg number near surface + # leg_sfc.append(ii) + + # find the mean cloud height within 1hr of the leg + i = np.argwhere(legnum==ii) + i_start = max(i[0][0]-3600, 0) + i_end = min(i[-1][0]+3600, len(cflag)) + if all(cflag[i_start:i_end]!=1): + leg_nocld.append(ii) + if legheight>2500: + leg_above.append(ii) + elif legheight<=250: # leg number near surface + leg_sfc.append(ii) + continue + idx_c = cflag[i_start:i_end]==1 + cldheight = np.mean(height[i_start:i_end][idx_c]) + cldmax = np.max(height[i_start:i_end][idx_c]) + cldmin = np.min(height[i_start:i_end][idx_c]) + # if (legheight-cldheight)<=200 and (legheight-cldheight)>=-400: + if legheight>=max(cldmin,250) and legheight<=cldmax: + leg_near.append(ii) + elif legheight=-400: - if legheight>=max(cldmin,250) and legheight<=cldmax: - leg_near.append(ii) - elif legheight500: - elif legheight>cldmax: - leg_above.append(ii) - - #%% calculate all pdfs - for ii in range(len(leg_sfc)): - idx = legnum==leg_sfc[ii] - tmp_obs = np.nanmean(merge[idx,:],0) - tmp_obs[tmp_obs==0]=np.nan - pdf_sfc_obs = np.hstack((pdf_sfc_obs, np.reshape(tmp_obs,(b2len,1)))) - cpcdiff_sfc = np.hstack((cpcdiff_sfc, np.nanmean(cpcdiff[idx]))) - for mm in range(nmodels): - tmp_model = np.nanmean(datam2[mm][:,idx],1) - tmp_model[tmp_model==0]=np.nan - pdf_sfc_model[mm] = np.hstack((pdf_sfc_model[mm], np.reshape(tmp_model,(3000,1)))) + # elif (legheight-cldheight)>500: + elif legheight>cldmax: + leg_above.append(ii) + + #%% calculate all pdfs + for ii in range(len(leg_sfc)): + idx = legnum==leg_sfc[ii] + tmp_obs = np.nanmean(merge[idx,:],0) + tmp_obs[tmp_obs==0]=np.nan + pdf_sfc_obs = np.hstack((pdf_sfc_obs, np.reshape(tmp_obs,(b2len,1)))) + cpcdiff_sfc = np.hstack((cpcdiff_sfc, np.nanmean(cpcdiff[idx]))) + for mm in range(nmodels): + tmp_model = np.nanmean(datam2[mm][:,idx],1) + tmp_model[tmp_model==0]=np.nan + pdf_sfc_model[mm] = np.hstack((pdf_sfc_model[mm], np.reshape(tmp_model,(3000,1)))) + + for ii in range(len(leg_near)): + idx = legnum==leg_near[ii] + tmp_obs = np.nanmean(merge[idx,:],0) + tmp_obs[tmp_obs==0]=np.nan + pdf_near_obs = np.hstack((pdf_near_obs, np.reshape(tmp_obs,(b2len,1)))) + cpcdiff_near = np.hstack((cpcdiff_near, np.nanmean(cpcdiff[idx]))) + for mm in range(nmodels): + tmp_model = np.nanmean(datam2[mm][:,idx],1) + tmp_model[tmp_model==0]=np.nan + pdf_near_model[mm] = np.hstack((pdf_near_model[mm], np.reshape(tmp_model,(3000,1)))) + + for ii in range(len(leg_above)): + idx = legnum==leg_above[ii] + tmp_obs = np.nanmean(merge[idx,:],0) + tmp_obs[tmp_obs==0]=np.nan + pdf_above_obs = np.hstack((pdf_above_obs, np.reshape(tmp_obs,(b2len,1)))) + cpcdiff_above = np.hstack((cpcdiff_above, np.nanmean(cpcdiff[idx]))) + for mm in range(nmodels): + tmp_model = np.nanmean(datam2[mm][:,idx],1) + tmp_model[tmp_model==0]=np.nan + pdf_above_model[mm] = np.hstack((pdf_above_model[mm], np.reshape(tmp_model,(3000,1)))) - for ii in range(len(leg_near)): - idx = legnum==leg_near[ii] - tmp_obs = np.nanmean(merge[idx,:],0) - tmp_obs[tmp_obs==0]=np.nan - pdf_near_obs = np.hstack((pdf_near_obs, np.reshape(tmp_obs,(b2len,1)))) - cpcdiff_near = np.hstack((cpcdiff_near, np.nanmean(cpcdiff[idx]))) - for mm in range(nmodels): - tmp_model = np.nanmean(datam2[mm][:,idx],1) - tmp_model[tmp_model==0]=np.nan - pdf_near_model[mm] = np.hstack((pdf_near_model[mm], np.reshape(tmp_model,(3000,1)))) + + #%% change to the pre-defined size bins - for ii in range(len(leg_above)): - idx = legnum==leg_above[ii] - tmp_obs = np.nanmean(merge[idx,:],0) - tmp_obs[tmp_obs==0]=np.nan - pdf_above_obs = np.hstack((pdf_above_obs, np.reshape(tmp_obs,(b2len,1)))) - cpcdiff_above = np.hstack((cpcdiff_above, np.nanmean(cpcdiff[idx]))) + for bb in range(blen): + idx_m = np.logical_and(d_mam>=binl[bb], d_mam<=binh[bb]) for mm in range(nmodels): - tmp_model = np.nanmean(datam2[mm][:,idx],1) - tmp_model[tmp_model==0]=np.nan - pdf_above_model[mm] = np.hstack((pdf_above_model[mm], np.reshape(tmp_model,(3000,1)))) + p2_sfc_model[mm].append(np.nansum(pdf_sfc_model[mm][idx_m,:],0)) + p2_near_model[mm].append(np.nansum(pdf_near_model[mm][idx_m,:],0)) + p2_above_model[mm].append(np.nansum(pdf_above_model[mm][idx_m,:],0)) + + if bb==0: + p2_sfc_obs.append(cpcdiff_sfc[~np.isnan(cpcdiff_sfc)]) + p2_near_obs.append(cpcdiff_near[~np.isnan(cpcdiff_near)]) + p2_above_obs.append(cpcdiff_above[~np.isnan(cpcdiff_above)]) + else: + idx_o = np.logical_and(sizel>=binl[bb], sizeh<=binh[bb]) + if any(idx_o): + tmp_sfc = np.nansum(pdf_sfc_obs[idx_o,:],0) + tmp_near = np.nansum(pdf_near_obs[idx_o,:],0) + tmp_above = np.nansum(pdf_above_obs[idx_o,:],0) + p2_sfc_obs.append(tmp_sfc[tmp_sfc!=0]) + p2_near_obs.append(tmp_near[tmp_near!=0]) + p2_above_obs.append(tmp_above[tmp_above!=0]) + else: + raise ValueError("no sample is found in the size bin") + + #%% calculate dlnDp for dN/dlnDp + d_mam=np.arange(1,3001) + dlnDp_m=np.full(3000,np.nan) + for bb in range(3000): + dlnDp_m[bb]=np.log((bb+2)/(bb+1)) + dlnDp_o=np.empty(len(size)) + for bb in range(len(size)): + dlnDp_o[bb]=np.log(sizeh[bb]/sizel[bb]) - -#%% change to the pre-defined size bins -for bb in range(blen): - idx_m = np.logical_and(d_mam>=binl[bb], d_mam<=binh[bb]) + #%% plot entire pdf below and above PBL + figname = figpath_aircraft_statistics+'SeparateCloud_pdf_AerosolSize_ACEENA_'+IOP+'.png' + print('plotting PDF figures to '+figname) + + fig,(ax1,ax2,ax3) = plt.subplots(3,1,figsize=(6,8)) + + ax1.plot(size,np.nanmedian(pdf_above_obs,1)/dlnDp_o,color='k',linewidth=1,label='Obs') for mm in range(nmodels): - p2_sfc_model[mm].append(np.nansum(pdf_sfc_model[mm][idx_m,:],0)) - p2_near_model[mm].append(np.nansum(pdf_near_model[mm][idx_m,:],0)) - p2_above_model[mm].append(np.nansum(pdf_above_model[mm][idx_m,:],0)) - - if bb==0: - p2_sfc_obs.append(cpcdiff_sfc[~np.isnan(cpcdiff_sfc)]) - p2_near_obs.append(cpcdiff_near[~np.isnan(cpcdiff_near)]) - p2_above_obs.append(cpcdiff_above[~np.isnan(cpcdiff_above)]) - else: - idx_o = np.logical_and(sizel>=binl[bb], sizeh<=binh[bb]) - if any(idx_o): - tmp_sfc = np.nansum(pdf_sfc_obs[idx_o,:],0) - tmp_near = np.nansum(pdf_near_obs[idx_o,:],0) - tmp_above = np.nansum(pdf_above_obs[idx_o,:],0) - p2_sfc_obs.append(tmp_sfc[tmp_sfc!=0]) - p2_near_obs.append(tmp_near[tmp_near!=0]) - p2_above_obs.append(tmp_above[tmp_above!=0]) - else: - raise ValueError("no sample is found in the size bin") - -#%% calculate dlnDp for dN/dlnDp -d_mam=np.arange(1,3001) -dlnDp_m=np.full(3000,np.nan) -for bb in range(3000): - dlnDp_m[bb]=np.log((bb+2)/(bb+1)) -dlnDp_o=np.empty(len(size)) -for bb in range(len(size)): - dlnDp_o[bb]=np.log(sizeh[bb]/sizel[bb]) - - -#%% plot entire pdf below and above PBL -figname = figpath_aircraft_statistics+'SeparateCloud_pdf_AerosolSize_ACEENA_'+IOP+'.png' -print('plotting PDF figures to '+figname) - -fig,(ax1,ax2,ax3) = plt.subplots(3,1,figsize=(6,8)) - -ax1.plot(size,np.nanmedian(pdf_above_obs,1)/dlnDp_o,color='k',linewidth=1,label='Obs') -for mm in range(nmodels): - ax1.plot(d_mam,np.nanmedian(pdf_above_model[mm],1)/dlnDp_m,color=color_model[mm],linewidth=1, label=Model_List[mm]) -ax1.tick_params(color='k',labelsize=14) -ax1.set_xscale('log') -ax1.set_yscale('log') - -ax2.plot(size,np.nanmedian(pdf_near_obs,1)/dlnDp_o,color='k',linewidth=1,label='Obs') -for mm in range(nmodels): - ax2.plot(d_mam,np.nanmedian(pdf_near_model[mm],1)/dlnDp_m,color=color_model[mm],linewidth=1, label=Model_List[mm]) -ax2.tick_params(color='k',labelsize=14) -ax2.set_xscale('log') -ax2.set_yscale('log') - -ax3.plot(size,np.nanmedian(pdf_sfc_obs,1)/dlnDp_o,color='k',linewidth=1,label='Obs') -for mm in range(nmodels): - ax3.plot(d_mam,np.nanmedian(pdf_sfc_model[mm],1)/dlnDp_m,color=color_model[mm],linewidth=1, label=Model_List[mm]) -ax3.tick_params(color='k',labelsize=14) -ax3.set_xscale('log') -ax3.set_yscale('log') - -# ax0.set_xlim(5,4000) -# ax1.set_xlim(5,4000) -ax1.set_ylim(1e-3,1e5) -ax2.set_ylim(1e-3,1e5) -ax3.set_ylim(1e-3,1e5) - -ax2.set_ylabel('aerosol #/dlnDp (cm$^{-3}$)',fontsize=14) -ax3.set_xlabel('Diameter (nm)',fontsize=14) -l=ax3.legend(loc='lower center', shadow=False, fontsize='medium') - -ax1.set_title('size distribution for ACEENA '+IOP,fontsize=15) - -ax3.text(200,3000,'Near Surface ('+str(pdf_sfc_obs.shape[1])+' legs)',fontsize=12) -ax2.text(200,3000,'Near Clouds ('+str(pdf_near_obs.shape[1])+' legs)',fontsize=12) -ax1.text(200,3000,'Above Clouds ('+str(pdf_above_obs.shape[1])+' legs)',fontsize=12) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -# plt.close() - -#%% plot percentile on sizes - -figname = figpath_aircraft_statistics+'SeparateCloud_percentile_AerosolSize_ACEENA_'+IOP+'.png' -print('plotting percentile figures to '+figname) - -# set position shift so that models and obs are not overlapped -p_shift = np.arange(nmodels+1) -p_shift = (p_shift - p_shift.mean())*0.2 - -fig,(ax1,ax2,ax3) = plt.subplots(3,1,figsize=(6,8)) - -ax1.boxplot(p2_above_obs,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box -for mm in range(nmodels): - c = color_model[mm] - ax1.boxplot(p2_above_model[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - -ax2.boxplot(p2_near_obs,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box -for mm in range(nmodels): - c = color_model[mm] - ax2.boxplot(p2_near_model[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - -ax3.boxplot(p2_sfc_obs,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box -for mm in range(nmodels): - c = color_model[mm] - ax3.boxplot(p2_sfc_model[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - -ax3.tick_params(color='k',labelsize=12) -ax2.tick_params(color='k',labelsize=12) -ax1.tick_params(color='k',labelsize=12) -ax3.set_yscale('log') -ax2.set_yscale('log') -ax1.set_yscale('log') -ax1.set_xlim(-.5,blen-.5) -ax2.set_xlim(-.5,blen-.5) -ax3.set_xlim(-.5,blen-.5) - -ax3.set_xlabel('Diameter (nm)',fontsize=14) -ax2.set_ylabel('aerosol # (cm$^{-3}$)',fontsize=14) -ax1.set_title('percentile for ACEENA '+IOP,fontsize=15) - -ax3.text(2.4,4000,'Near Surface ('+str(pdf_sfc_obs.shape[1])+' legs)',fontsize=12) -ax2.text(2.4,4000,'Near Clouds ('+str(pdf_near_obs.shape[1])+' legs)',fontsize=12) -ax1.text(2.4,4000,'Above Clouds ('+str(pdf_above_obs.shape[1])+' legs)',fontsize=12) - -xlabel=[str(binl[x])+'-'+str(binh[x]) for x in range(blen)] -ax1.set_xticks(range(len(binm))) -ax1.set_xticklabels(xlabel) -ax2.set_xticks(range(len(binm))) -ax2.set_xticklabels(xlabel) -ax3.set_xticks(range(len(binm))) -ax3.set_xticklabels(xlabel) -ax1.set_ylim(1e-3,1e5) -ax2.set_ylim(1e-3,1e5) -ax3.set_ylim(1e-3,1e5) - -# plot temporal lines for label -ax3.plot([],c='k',label='Obs') -for mm in range(nmodels): - ax3.plot([],c=color_model[mm],label=Model_List[mm]) -ax3.legend(loc='lower left', shadow=False, fontsize='medium') -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -# plt.close() - + ax1.plot(d_mam,np.nanmedian(pdf_above_model[mm],1)/dlnDp_m,color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax1.tick_params(color='k',labelsize=14) + ax1.set_xscale('log') + ax1.set_yscale('log') + + ax2.plot(size,np.nanmedian(pdf_near_obs,1)/dlnDp_o,color='k',linewidth=1,label='Obs') + for mm in range(nmodels): + ax2.plot(d_mam,np.nanmedian(pdf_near_model[mm],1)/dlnDp_m,color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax2.tick_params(color='k',labelsize=14) + ax2.set_xscale('log') + ax2.set_yscale('log') + + ax3.plot(size,np.nanmedian(pdf_sfc_obs,1)/dlnDp_o,color='k',linewidth=1,label='Obs') + for mm in range(nmodels): + ax3.plot(d_mam,np.nanmedian(pdf_sfc_model[mm],1)/dlnDp_m,color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax3.tick_params(color='k',labelsize=14) + ax3.set_xscale('log') + ax3.set_yscale('log') + + # ax0.set_xlim(5,4000) + # ax1.set_xlim(5,4000) + ax1.set_ylim(1e-3,1e5) + ax2.set_ylim(1e-3,1e5) + ax3.set_ylim(1e-3,1e5) + + ax2.set_ylabel('aerosol #/dlnDp (cm$^{-3}$)',fontsize=14) + ax3.set_xlabel('Diameter (nm)',fontsize=14) + l=ax3.legend(loc='lower center', shadow=False, fontsize='medium') + + ax1.set_title('size distribution for ACEENA '+IOP,fontsize=15) + + ax3.text(200,3000,'Near Surface ('+str(pdf_sfc_obs.shape[1])+' legs)',fontsize=12) + ax2.text(200,3000,'Near Clouds ('+str(pdf_near_obs.shape[1])+' legs)',fontsize=12) + ax1.text(200,3000,'Above Clouds ('+str(pdf_above_obs.shape[1])+' legs)',fontsize=12) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + # plt.close() + + #%% plot percentile on sizes + + figname = figpath_aircraft_statistics+'SeparateCloud_percentile_AerosolSize_ACEENA_'+IOP+'.png' + print('plotting percentile figures to '+figname) + + # set position shift so that models and obs are not overlapped + p_shift = np.arange(nmodels+1) + p_shift = (p_shift - p_shift.mean())*0.2 + + fig,(ax1,ax2,ax3) = plt.subplots(3,1,figsize=(6,8)) + + ax1.boxplot(p2_above_obs,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax1.boxplot(p2_above_model[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + + ax2.boxplot(p2_near_obs,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax2.boxplot(p2_near_model[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + + ax3.boxplot(p2_sfc_obs,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax3.boxplot(p2_sfc_model[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + + ax3.tick_params(color='k',labelsize=12) + ax2.tick_params(color='k',labelsize=12) + ax1.tick_params(color='k',labelsize=12) + ax3.set_yscale('log') + ax2.set_yscale('log') + ax1.set_yscale('log') + ax1.set_xlim(-.5,blen-.5) + ax2.set_xlim(-.5,blen-.5) + ax3.set_xlim(-.5,blen-.5) + + ax3.set_xlabel('Diameter (nm)',fontsize=14) + ax2.set_ylabel('aerosol # (cm$^{-3}$)',fontsize=14) + ax1.set_title('percentile for ACEENA '+IOP,fontsize=15) + + ax3.text(2.4,4000,'Near Surface ('+str(pdf_sfc_obs.shape[1])+' legs)',fontsize=12) + ax2.text(2.4,4000,'Near Clouds ('+str(pdf_near_obs.shape[1])+' legs)',fontsize=12) + ax1.text(2.4,4000,'Above Clouds ('+str(pdf_above_obs.shape[1])+' legs)',fontsize=12) + + xlabel=[str(binl[x])+'-'+str(binh[x]) for x in range(blen)] + ax1.set_xticks(range(len(binm))) + ax1.set_xticklabels(xlabel) + ax2.set_xticks(range(len(binm))) + ax2.set_xticklabels(xlabel) + ax3.set_xticks(range(len(binm))) + ax3.set_xticklabels(xlabel) + ax1.set_ylim(1e-3,1e5) + ax2.set_ylim(1e-3,1e5) + ax3.set_ylim(1e-3,1e5) + + # plot temporal lines for label + ax3.plot([],c='k',label='Obs') + for mm in range(nmodels): + ax3.plot([],c=color_model[mm],label=Model_List[mm]) + ax3.legend(loc='lower left', shadow=False, fontsize='medium') + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + # plt.close() + diff --git a/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py index 0f1f2d5..68eb4a1 100644 --- a/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py +++ b/src/esmac_diags/plotting/plot_flight_pdf_percentile_SeparatePBLH_hiscale.py @@ -3,8 +3,6 @@ # separated by observed PBLH """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -14,369 +12,379 @@ from ..subroutines.read_surface import read_dl_pblh from ..subroutines.read_aircraft import read_cpc from ..subroutines.read_netcdf import read_merged_size,read_extractflight -from ..subroutines.quality_control import qc_remove_neg - -#%% settings - -from settings import campaign, cpcpath,merged_size_path, pblhpath, dlpath, \ - Model_List, color_model, IOP, E3SM_aircraft_path, figpath_aircraft_statistics - -if not os.path.exists(figpath_aircraft_statistics): - os.makedirs(figpath_aircraft_statistics) - -# set final bin sizes -binl = np.array([3, 15, 70, 400, 1000]) -binh = np.array([10, 70, 400, 1000, 3000]) -binm = (binl+binh)/2 - -# set a range around PBLH (PBLH +/- heightdiff) that only data outside of the range are counted -heightdiff = 100 - -#%% read in doppler lidar data. this is all days in one file -dl=read_dl_pblh(dlpath+'sgpdlC1_mlh_0.08.txt') - -mlh_dl = dl[6,:]*1000 -day_dl = np.array(mlh_dl[:]) -time_dl = np.array(mlh_dl[:]) -for tt in range(len(time_dl)): - yyyymmdd=format(int(dl[0,tt]),'04d')+format(int(dl[1,tt]),'02d')+format(int(dl[2,tt]),'02d') - hhmmss=format(int(dl[3,tt]),'02d')+':'+format(int(dl[4,tt]),'02d')+':'+format(int(dl[5,tt]),'02d') - day_dl[tt]=yyyymmdd2cday(yyyymmdd) - time_dl[tt]=hhmmss2sec(hhmmss) -mlh_dl=qc_remove_neg(mlh_dl) - - -#%% find files for flight information - -lst = glob.glob(merged_size_path+'merged_bin_*'+campaign+'*.nc') -lst.sort() +from ..subroutines.quality_control import qc_remove_neg, qc_mask_qcflag -if len(lst)==0: - raise ValueError('cannot find any file') +def run_plot(settings): -# choose files for specific IOP -if campaign=='HISCALE': - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+campaign+'_') - lst = glob.glob(a[0]+'*'+IOP+'*') - lst.sort() -else: - raise ValueError('this code is only for HISCALE, check the campaign settings') - -if len(lst)==0: - raise ValueError('cannot find any file') + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + cpcpath = settings['cpcpath'] + pblhpath = settings['pblhpath'] + dlpath = settings['dlpath'] + merged_size_path = settings['merged_size_path'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_statistics = settings['figpath_aircraft_statistics'] -#%% read all data - -# pdf average for legs -pdf_below_obs=np.full([44,len(lst)*10],np.nan) -pdf_above_obs=np.full([44,len(lst)*10],np.nan) - -cpcdiff_above=np.full([len(lst)*10],np.nan) -cpcdiff_below=np.full([len(lst)*10],np.nan) + IOP = settings.get('IOP', None) -nmodels=len(Model_List) -pdf_below_model=[] -pdf_above_model=[] -for mm in range(nmodels): - pdf_below_model.append(np.full([3000,len(lst)*10],np.nan)) - pdf_above_model.append(np.full([3000,len(lst)*10],np.nan)) - -n_below=0 -n_above=0 -n_total=0 + #%% other settings + if not os.path.exists(figpath_aircraft_statistics): + os.makedirs(figpath_aircraft_statistics) + + # set final bin sizes + binl = np.array([3, 15, 70, 400, 1000]) + binh = np.array([10, 70, 400, 1000, 3000]) + binm = (binl+binh)/2 -print('reading '+format(len(lst))+' files to calculate the statistics: ') - -for filename in lst: + # set a range around PBLH (PBLH +/- heightdiff) that only data outside of the range are counted + heightdiff = 100 + + #%% read in doppler lidar data. this is all days in one file + dl=read_dl_pblh(dlpath+'sgpdlC1_mlh_0.08.txt') + + mlh_dl = dl[6,:]*1000 + day_dl = np.array(mlh_dl[:]) + time_dl = np.array(mlh_dl[:]) + for tt in range(len(time_dl)): + yyyymmdd=format(int(dl[0,tt]),'04d')+format(int(dl[1,tt]),'02d')+format(int(dl[2,tt]),'02d') + hhmmss=format(int(dl[3,tt]),'02d')+':'+format(int(dl[4,tt]),'02d')+':'+format(int(dl[5,tt]),'02d') + day_dl[tt]=yyyymmdd2cday(yyyymmdd) + time_dl[tt]=hhmmss2sec(hhmmss) + mlh_dl=qc_remove_neg(mlh_dl) - # get date info: - date=filename[-12:-3] - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 - print(date) - #%% read aerosol size distribution - (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') - (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') - (time,size,legnum,timeunit,cunit,long_name)=read_merged_size(filename,'leg_number') - (time,size,height,timeunit,zunit,long_name)=read_merged_size(filename,'height') - (time,size,sizeh,timeunit,dataunit,long_name)=read_merged_size(filename,'size_high') - (time,size,sizel,timeunit,dataunit,long_name)=read_merged_size(filename,'size_low') - (time,size,merge,timeunit,dataunit,long_name)=read_merged_size(filename,'size_distribution_merged') - time=np.ma.compressed(time) - timelen = len(time) - time=time/3600. - size=np.ma.compressed(size)*1000 # um to nm - sizel=sizel*1000 - sizeh=sizeh*1000 - merge=qc_remove_neg(merge) - merge=merge.T + #%% find files for flight information - #%% read in CPC measurements + lst = glob.glob(merged_size_path+'merged_bin_*'+campaign+'*.nc') + lst.sort() + if len(lst)==0: + raise ValueError('cannot find any file') + + # choose files for specific IOP if campaign=='HISCALE': - filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_HiScale001s.ict.txt') + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+campaign+'_') + lst = glob.glob(a[0]+'*'+IOP+'*') + lst.sort() else: raise ValueError('this code is only for HISCALE, check the campaign settings') - filename_c.sort() - # read in data - if len(filename_c)==1 or len(filename_c)==2: # some days have two flights - (cpc,cpclist)=read_cpc(filename_c[flightidx-1]) - if np.logical_and(campaign=='ACEENA', date=='20180216a'): - cpc=np.insert(cpc,1404,(cpc[:,1403]+cpc[:,1404])/2,axis=1) - elif np.logical_and(campaign=='HISCALE', date=='20160425a'): - cpc=np.insert(cpc,0,cpc[:,0],axis=1) - cpc[0,0]=cpc[0,0]-1 - time_cpc = cpc[0,:]/3600 - cpc10 = cpc[1,:] - cpc3 = cpc[2,:] - elif len(filename_c)==0: - time_cpc=time - cpc10=np.nan*np.empty([len(time)]) - cpc3=np.nan*np.empty([len(time)]) - else: - raise ValueError('find too many files') - - cpcdiff = cpc3-cpc10 - cpcdiff=qc_remove_neg(cpcdiff) + if len(lst)==0: + raise ValueError('cannot find any file') + + #%% read all data - #%% read in PBLH data from MPL - filename_mpl=glob.glob(pblhpath+'sgppblhtmpl1sawyerliC1*'+date[0:8]+'*.nc') - # read in data - if len(filename_mpl)==1: - (time_pblh,timeunit,mpl) = read_pblhtmpl1(filename_mpl[0]) - elif len(filename_mpl)==0: - print('no pblh file in this day. skip...') - continue - else: - raise ValueError('find too many files: ' + filename_mpl) - time_pblh=time_pblh/3600 + # pdf average for legs + pdf_below_obs=np.full([44,len(lst)*10],np.nan) + pdf_above_obs=np.full([44,len(lst)*10],np.nan) - #%% choose the same time of DL. get pblh - cday0=yyyymmdd2cday(date[0:8]) - idx_dl = day_dl==cday0 - time_dl2 = time_dl[idx_dl]/3600 - mlh_dl2 = mlh_dl[idx_dl] + cpcdiff_above=np.full([len(lst)*10],np.nan) + cpcdiff_below=np.full([len(lst)*10],np.nan) - #%% read in Models - datam2 = [] + nmodels=len(Model_List) + pdf_below_model=[] + pdf_above_model=[] for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - (timem,heightm,datam,timeunitm,datamunit,datamlongname)=read_extractflight(filename_m,'NCNall') - datam2.append(datam*1e-6) # #/m3 to #/cm3 - - timem = timem/3600 - - if len(timem)!=len(time) or len(time)!=len(time_cpc): - raise ValueError('time dimension for obs and/or model are not consistent') + pdf_below_model.append(np.full([3000,len(lst)*10],np.nan)) + pdf_above_model.append(np.full([3000,len(lst)*10],np.nan)) - #%% get pdf for legs below and above PBLH + n_below=0 + n_above=0 + n_total=0 + + print('reading '+format(len(lst))+' files to calculate the statistics: ') - for ii in range(max(legnum)): - idx_leg = [legnum==ii+1] - # get the mean pblh for this leg - time_leg=time[legnum==ii+1] - cflag_leg=cflag[legnum==ii+1] - if np.sum(cflag_leg==1)>1: #0.01*len(cflag_leg): - continue # don't use legs with >10% cloud flag + for filename in lst: - idx_dl2 = np.logical_and(time_dl2>=time_leg[0], time_dl2<=time_leg[-1]) - if idx_dl2.any()==False: - idx_dl2 = np.logical_and(time_dl2>=time_leg[0]-2, time_dl2<=time_leg[-1]+2) # extend time range - if idx_dl2.any(): - pblh = np.nanmean(mlh_dl2[idx_dl2]) - else:# use MPL pblh - idx_mpl = np.logical_and(time_pblh>=time_leg[0], time_pblh=time_leg[0]-2, time_pblhpblh+heightdiff: - pdf_above_obs[:,n_above] = np.nanmean(merge[:,legnum==ii+1],1) - cpcdiff_above[n_above] = np.nanmean(cpcdiff[legnum==ii+1]) - for mm in range(nmodels): - pdf_above_model[mm][:,n_above] = np.nanmean(datam2[mm][:,legnum==ii+1],1) - n_above=n_above+1 + #%% choose the same time of DL. get pblh + cday0=yyyymmdd2cday(date[0:8]) + idx_dl = day_dl==cday0 + time_dl2 = time_dl[idx_dl]/3600 + mlh_dl2 = mlh_dl[idx_dl] + + #%% read in Models + datam2 = [] + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + (timem,heightm,datam,timeunitm,datamunit,datamlongname)=read_extractflight(filename_m,'NCNall') + datam2.append(datam*1e-6) # #/m3 to #/cm3 + + timem = timem/3600 + + if len(timem)!=len(time) or len(time)!=len(time_cpc): + raise ValueError('time dimension for obs and/or model are not consistent') + + #%% get pdf for legs below and above PBLH + + for ii in range(max(legnum)): + # get the mean pblh for this leg + time_leg=time[legnum==ii+1] + cflag_leg=cflag[legnum==ii+1] + if np.sum(cflag_leg==1)>1: #0.01*len(cflag_leg): + continue # don't use legs with >10% cloud flag + idx_dl2 = np.logical_and(time_dl2>=time_leg[0], time_dl2<=time_leg[-1]) + if idx_dl2.any()==False: + idx_dl2 = np.logical_and(time_dl2>=time_leg[0]-2, time_dl2<=time_leg[-1]+2) # extend time range + if idx_dl2.any(): + pblh = np.nanmean(mlh_dl2[idx_dl2]) + else:# use MPL pblh + idx_mpl = np.logical_and(time_pblh>=time_leg[0], time_pblh=time_leg[0]-2, time_pblh=binl[bb], d_model<=binh[bb]) + # average for each legs first + hmean = np.mean(height[legnum==ii+1]) + if hmeanpblh+heightdiff: + pdf_above_obs[:,n_above] = np.nanmean(merge[:,legnum==ii+1],1) + cpcdiff_above[n_above] = np.nanmean(cpcdiff[legnum==ii+1]) + for mm in range(nmodels): + pdf_above_model[mm][:,n_above] = np.nanmean(datam2[mm][:,legnum==ii+1],1) + n_above=n_above+1 + + + #%% change to the pre-defined size bins + + d_model=np.arange(1,3001) + blen = len(binm) + p2_below_obs = list() + p2_above_obs = list() + p2_above_model = list() + p2_below_model = list() for mm in range(nmodels): - data_below = np.nansum(pdf_below_model[mm][idx_m,:],0) - data_above = np.nansum(pdf_above_model[mm][idx_m,:],0) - # exclude pre-assigned data space that are not used - p2_below_model[mm].append(data_below[range(n_below)]) - p2_above_model[mm].append(data_above[range(n_above)]) - if bb==0: - p2_below_obs.append(cpcdiff_below[~np.isnan(cpcdiff_below)]) - p2_above_obs.append(cpcdiff_above[~np.isnan(cpcdiff_above)]) - else: - idx_o = np.logical_and(sizel>=binl[bb], sizeh<=binh[bb]) - if any(idx_o): - tmp_below = np.nansum(pdf_below_obs[idx_o,:],0) - tmp_above = np.nansum(pdf_above_obs[idx_o,:],0) - # exclude not used or not detected (0 value) data - p2_below_obs.append(tmp_below[tmp_below!=0]) - p2_above_obs.append(tmp_above[tmp_above!=0]) + p2_above_model.append([]) + p2_below_model.append([]) + + for bb in range(blen): + idx_m = np.logical_and(d_model>=binl[bb], d_model<=binh[bb]) + for mm in range(nmodels): + data_below = np.nansum(pdf_below_model[mm][idx_m,:],0) + data_above = np.nansum(pdf_above_model[mm][idx_m,:],0) + # exclude pre-assigned data space that are not used + p2_below_model[mm].append(data_below[range(n_below)]) + p2_above_model[mm].append(data_above[range(n_above)]) + if bb==0: + p2_below_obs.append(cpcdiff_below[~np.isnan(cpcdiff_below)]) + p2_above_obs.append(cpcdiff_above[~np.isnan(cpcdiff_above)]) else: - p2_below_obs.append(np.full([n_below],np.nan)) - p2_above_obs.append(np.full([n_above],np.nan)) - -#%% change to dN/dlnDp -# model -dlnDp=np.empty(3000) -for bb in range(3000): - dlnDp[bb]=np.log((bb+2)/(bb+1)) -for nn in range(n_below): + idx_o = np.logical_and(sizel>=binl[bb], sizeh<=binh[bb]) + if any(idx_o): + tmp_below = np.nansum(pdf_below_obs[idx_o,:],0) + tmp_above = np.nansum(pdf_above_obs[idx_o,:],0) + # exclude not used or not detected (0 value) data + p2_below_obs.append(tmp_below[tmp_below!=0]) + p2_above_obs.append(tmp_above[tmp_above!=0]) + else: + p2_below_obs.append(np.full([n_below],np.nan)) + p2_above_obs.append(np.full([n_above],np.nan)) + + #%% change to dN/dlnDp + # model + dlnDp=np.empty(3000) + for bb in range(3000): + dlnDp[bb]=np.log((bb+2)/(bb+1)) + for nn in range(n_below): + for mm in range(nmodels): + pdf_below_model[mm][:,nn]=pdf_below_model[mm][:,nn]/dlnDp + for nn in range(n_above): + for mm in range(nmodels): + pdf_above_model[mm][:,nn]=pdf_above_model[mm][:,nn]/dlnDp + + # Obs + dlnDp=np.empty(len(size)) + for bb in range(len(size)): + dlnDp[bb]=np.log(sizeh[bb]/sizel[bb]) + for nn in range(n_below): + pdf_below_obs[:,nn]=pdf_below_obs[:,nn]/dlnDp + for nn in range(n_above): + pdf_above_obs[:,nn]=pdf_above_obs[:,nn]/dlnDp + + + #%% plot entire pdf below and above PBL + figname = figpath_aircraft_statistics+'SeparatePBLH_pdf_AerosolSize_HISCALE_'+IOP+'.png' + print('plotting PDF figures to '+figname) + + fig,(ax0,ax1) = plt.subplots(2,1,figsize=(8,6)) + idx_v=range(n_above) + h3=ax0.plot(size,np.nanmean(pdf_above_obs[:,idx_v],1),color='k',linewidth=1,label='Obs') for mm in range(nmodels): - pdf_below_model[mm][:,nn]=pdf_below_model[mm][:,nn]/dlnDp -for nn in range(n_above): + ax0.plot(np.arange(1,3001),np.nanmean(pdf_above_model[mm][:,idx_v],1),color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax0.legend(loc='lower center', shadow=False, fontsize='large') + ax0.tick_params(color='k',labelsize=14) + ax0.set_xscale('log') + ax0.set_yscale('log') + + idx_v=range(n_below) + h3=ax1.plot(size,np.nanmean(pdf_below_obs[:,idx_v],1),color='k',linewidth=1,label='Obs') for mm in range(nmodels): - pdf_above_model[mm][:,nn]=pdf_above_model[mm][:,nn]/dlnDp + ax1.plot(np.arange(1,3001),np.nanmean(pdf_below_model[mm][:,idx_v],1),color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax1.legend(loc='lower left', shadow=False, fontsize='large') + ax1.tick_params(color='k',labelsize=14) + ax1.set_xscale('log') + ax1.set_yscale('log') -# Obs -dlnDp=np.empty(len(size)) -for bb in range(len(size)): - dlnDp[bb]=np.log(sizeh[bb]/sizel[bb]) -for nn in range(n_below): - pdf_below_obs[:,nn]=pdf_below_obs[:,nn]/dlnDp -for nn in range(n_above): - pdf_above_obs[:,nn]=pdf_above_obs[:,nn]/dlnDp + # ax0.set_xlim(5,4000) + # ax1.set_xlim(5,4000) + ax0.set_ylim(1e-3,1e5) + ax1.set_ylim(1e-3,1e5) + ax1.set_xlabel('Diameter (nm)',fontsize=14) + ax0.set_ylabel('aerosol #/dlnDp (cm$^{-3}$)',fontsize=13) + ax1.set_ylabel('aerosol #/dlnDp (cm$^{-3}$)',fontsize=13) + ax0.set_title('size distribution for Hi-Scale '+IOP,fontsize=15) + fig.text(.65,.83,'Above PBL ('+str(n_above)+' legs)',fontsize=12) + fig.text(.65,.43,'Below PBL ('+str(n_below)+' legs)',fontsize=12) + # fig.text(.68,.83,'Above PBL ('+format(n_above/n_total*100,'.1f')+'%)',fontsize=12) + # fig.text(.68,.43,'Below PBL ('+format(n_below/n_total*100,'.1f')+'%)',fontsize=12) + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + # plt.close() - -#%% plot entire pdf below and above PBL -figname = figpath_aircraft_statistics+'SeparatePBLH_pdf_AerosolSize_HISCALE_'+IOP+'.png' -print('plotting PDF figures to '+figname) - -fig,(ax0,ax1) = plt.subplots(2,1,figsize=(8,6)) -idx_v=range(n_above) -h3=ax0.plot(size,np.nanmean(pdf_above_obs[:,idx_v],1),color='k',linewidth=1,label='Obs') -for mm in range(nmodels): - ax0.plot(np.arange(1,3001),np.nanmean(pdf_above_model[mm][:,idx_v],1),color=color_model[mm],linewidth=1, label=Model_List[mm]) -# ax0.legend(loc='lower center', shadow=False, fontsize='large') -ax0.tick_params(color='k',labelsize=14) -ax0.set_xscale('log') -ax0.set_yscale('log') - -idx_v=range(n_below) -h3=ax1.plot(size,np.nanmean(pdf_below_obs[:,idx_v],1),color='k',linewidth=1,label='Obs') -for mm in range(nmodels): - ax1.plot(np.arange(1,3001),np.nanmean(pdf_below_model[mm][:,idx_v],1),color=color_model[mm],linewidth=1, label=Model_List[mm]) -ax1.legend(loc='lower left', shadow=False, fontsize='large') -ax1.tick_params(color='k',labelsize=14) -ax1.set_xscale('log') -ax1.set_yscale('log') - -# ax0.set_xlim(5,4000) -# ax1.set_xlim(5,4000) -ax0.set_ylim(1e-3,1e5) -ax1.set_ylim(1e-3,1e5) -ax1.set_xlabel('Diameter (nm)',fontsize=14) -ax0.set_ylabel('aerosol #/dlnDp (cm$^{-3}$)',fontsize=13) -ax1.set_ylabel('aerosol #/dlnDp (cm$^{-3}$)',fontsize=13) -ax0.set_title('size distribution for Hi-Scale '+IOP,fontsize=15) -fig.text(.65,.83,'Above PBL ('+str(n_above)+' legs)',fontsize=12) -fig.text(.65,.43,'Below PBL ('+str(n_below)+' legs)',fontsize=12) -# fig.text(.68,.83,'Above PBL ('+format(n_above/n_total*100,'.1f')+'%)',fontsize=12) -# fig.text(.68,.43,'Below PBL ('+format(n_below/n_total*100,'.1f')+'%)',fontsize=12) -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -# plt.close() - -#%% plot percentile on sizes - -figname = figpath_aircraft_statistics+'SeparatePBLH_percentile_AerosolSize_HISCALE_'+IOP+'.png' -print('plotting percentile figures to '+figname) - -# set position shift so that models and obs are not overlapped -p_shift = np.arange(nmodels+1) -p_shift = (p_shift - p_shift.mean())*0.2 - -fig,(ax0,ax1) = plt.subplots(2,1,figsize=(8,6)) + #%% plot percentile on sizes -ax0.boxplot(p2_above_obs,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box -for mm in range(nmodels): - c = color_model[mm] - ax0.boxplot(p2_above_model[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - -ax1.boxplot(p2_below_obs,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box -for mm in range(nmodels): - c = color_model[mm] - ax1.boxplot(p2_below_model[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(blen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box + figname = figpath_aircraft_statistics+'SeparatePBLH_percentile_AerosolSize_HISCALE_'+IOP+'.png' + print('plotting percentile figures to '+figname) -ax0.tick_params(color='k',labelsize=12) -ax1.tick_params(color='k',labelsize=14) -# ax0.set_xscale('log') -# ax1.set_xscale('log') -ax0.set_yscale('log') -ax1.set_yscale('log') -ax0.set_xlim(-1,blen) -ax1.set_xlim(-1,blen) -ax1.set_xlabel('Diameter (nm)',fontsize=14) -ax0.set_ylabel('aerosol # (cm$^{-3}$)',fontsize=14) -ax1.set_ylabel('aerosol # (cm$^{-3}$)',fontsize=14) -ax0.set_title('percentile for Hi-Scale '+IOP,fontsize=15) -fig.text(.66,.83,'Above PBL ('+str(n_above)+' legs)',fontsize=12) -fig.text(.66,.43,'Below PBL ('+str(n_below)+' legs)',fontsize=12) - -xlabel=[str(binl[x])+'-'+str(binh[x]) for x in range(blen)] -ax0.set_xticks(range(len(binm))) -ax0.set_xticklabels(xlabel) -ax1.set_xticks(range(len(binm))) -ax1.set_xticklabels(xlabel) -# ax0.set_yticks([1,3,5,7,9,11,12,13,14,15,16]) -# ax0.set_yticklabels(range(400,4100,400)) -ax0.set_ylim(1e-3,1e5) -ax1.set_ylim(1e-3,1e5) - -# plot temporal lines for label -ax1.plot([],c='k',label='Obs') -for mm in range(nmodels): - ax1.plot([],c=color_model[mm],label=Model_List[mm]) -ax1.legend(loc='lower left', shadow=False, fontsize='large') -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -# plt.close() \ No newline at end of file + # set position shift so that models and obs are not overlapped + p_shift = np.arange(nmodels+1) + p_shift = (p_shift - p_shift.mean())*0.2 + + fig,(ax0,ax1) = plt.subplots(2,1,figsize=(8,6)) + + ax0.boxplot(p2_above_obs,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax0.boxplot(p2_above_model[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + + ax1.boxplot(p2_below_obs,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax1.boxplot(p2_below_model[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(blen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + + ax0.tick_params(color='k',labelsize=12) + ax1.tick_params(color='k',labelsize=14) + # ax0.set_xscale('log') + # ax1.set_xscale('log') + ax0.set_yscale('log') + ax1.set_yscale('log') + ax0.set_xlim(-1,blen) + ax1.set_xlim(-1,blen) + ax1.set_xlabel('Diameter (nm)',fontsize=14) + ax0.set_ylabel('aerosol # (cm$^{-3}$)',fontsize=14) + ax1.set_ylabel('aerosol # (cm$^{-3}$)',fontsize=14) + ax0.set_title('percentile for Hi-Scale '+IOP,fontsize=15) + fig.text(.66,.83,'Above PBL ('+str(n_above)+' legs)',fontsize=12) + fig.text(.66,.43,'Below PBL ('+str(n_below)+' legs)',fontsize=12) + + xlabel=[str(binl[x])+'-'+str(binh[x]) for x in range(blen)] + ax0.set_xticks(range(len(binm))) + ax0.set_xticklabels(xlabel) + ax1.set_xticks(range(len(binm))) + ax1.set_xticklabels(xlabel) + # ax0.set_yticks([1,3,5,7,9,11,12,13,14,15,16]) + # ax0.set_yticklabels(range(400,4100,400)) + ax0.set_ylim(1e-3,1e5) + ax1.set_ylim(1e-3,1e5) + + # plot temporal lines for label + ax1.plot([],c='k',label='Obs') + for mm in range(nmodels): + ax1.plot([],c=color_model[mm],label=Model_List[mm]) + ax1.legend(loc='lower left', shadow=False, fontsize='large') + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + # plt.close() diff --git a/src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py b/src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py index 0843e3a..9cb6ea6 100644 --- a/src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py +++ b/src/esmac_diags/plotting/plot_flight_percentile_lat_CCN.py @@ -4,7 +4,6 @@ # for aircraft measurements in CSET or SOCRATES """ -import sys import glob import os @@ -14,419 +13,425 @@ from ..subroutines.read_netcdf import read_extractflight from ..subroutines.quality_control import qc_remove_neg -#%% settings +def run_plot(settings): -plot_method = 'all' # 'height': separate by height. 'all': all heights below 5km - -from settings import campaign, Model_List, color_model, \ - latbin, E3SM_aircraft_path, figpath_aircraft_statistics - -if campaign in ['CSET', 'SOCRATES']: - from settings import ccnpath, RFpath -else: - raise ValueError('This code is only for CSET or SOCRATES. check campaign setting: '+campaign) + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + latbin = settings['latbin'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_statistics = settings['figpath_aircraft_statistics'] -if not os.path.exists(figpath_aircraft_statistics): - os.makedirs(figpath_aircraft_statistics) - -dlat = latbin[1]-latbin[0] -latmin = latbin-dlat/2 -latmax = latbin+dlat/2 -latlen = len(latbin) + if campaign in ['CSET', 'SOCRATES']: + ccnpath = settings['ccnpath'] + RFpath = settings['RFpath'] + else: + raise ValueError('This code is only for CSET or SOCRATES. check campaign setting: '+campaign) -nmodels=len(Model_List) - -#%% find files for flight information - -lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') -lst.sort() -if len(lst)==0: - raise ValueError('cannot find any file') -alldates = [x.split('_')[-1].split('.')[0] for x in lst] + #%% other settings -#%% define variables by latitude bins below, near and above clouds + plot_method = 'all' # 'height': separate by height. 'all': all heights below 5km -ccna_below_lat = [] -ccna_near_lat = [] -ccna_above_lat = [] -ccnb_below_lat = [] -ccnb_near_lat = [] -ccnb_above_lat = [] -for bb in range(latlen): - ccna_below_lat.append(np.empty(0)) - ccna_near_lat.append(np.empty(0)) - ccna_above_lat.append(np.empty(0)) - ccnb_below_lat.append(np.empty(0)) - ccnb_near_lat.append(np.empty(0)) - ccnb_above_lat.append(np.empty(0)) + if not os.path.exists(figpath_aircraft_statistics): + os.makedirs(figpath_aircraft_statistics) + + dlat = latbin[1]-latbin[0] + latmin = latbin-dlat/2 + latmax = latbin+dlat/2 + latlen = len(latbin) + + nmodels=len(Model_List) -ccn3_below_lat = [] -ccn3_near_lat = [] -ccn3_above_lat = [] -ccn5_below_lat = [] -ccn5_near_lat = [] -ccn5_above_lat = [] -for mm in range(nmodels): - ccn3_below_lat.append([np.empty(0) for bb in range(latlen)]) - ccn3_near_lat.append([np.empty(0) for bb in range(latlen)]) - ccn3_above_lat.append([np.empty(0) for bb in range(latlen)]) - ccn5_below_lat.append([np.empty(0) for bb in range(latlen)]) - ccn5_near_lat.append([np.empty(0) for bb in range(latlen)]) - ccn5_above_lat.append([np.empty(0) for bb in range(latlen)]) - -print('reading '+format(len(alldates))+' files to calculate the statistics: ') - -for date in alldates: - print(date) + #%% find files for flight information - #%% read in Models + lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') + lst.sort() + if len(lst)==0: + raise ValueError('cannot find any file') + alldates = [x.split('_')[-1].split('.')[0] for x in lst] - ccn3=[] - ccn5=[] + #%% define variables by latitude bins below, near and above clouds + + ccna_below_lat = [] + ccna_near_lat = [] + ccna_above_lat = [] + ccnb_below_lat = [] + ccnb_near_lat = [] + ccnb_above_lat = [] + for bb in range(latlen): + ccna_below_lat.append(np.empty(0)) + ccna_near_lat.append(np.empty(0)) + ccna_above_lat.append(np.empty(0)) + ccnb_below_lat.append(np.empty(0)) + ccnb_near_lat.append(np.empty(0)) + ccnb_above_lat.append(np.empty(0)) + + ccn3_below_lat = [] + ccn3_near_lat = [] + ccn3_above_lat = [] + ccn5_below_lat = [] + ccn5_near_lat = [] + ccn5_above_lat = [] for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + ccn3_below_lat.append([np.empty(0) for bb in range(latlen)]) + ccn3_near_lat.append([np.empty(0) for bb in range(latlen)]) + ccn3_above_lat.append([np.empty(0) for bb in range(latlen)]) + ccn5_below_lat.append([np.empty(0) for bb in range(latlen)]) + ccn5_near_lat.append([np.empty(0) for bb in range(latlen)]) + ccn5_above_lat.append([np.empty(0) for bb in range(latlen)]) + + print('reading '+format(len(alldates))+' files to calculate the statistics: ') - (timem,heightm,ccn3_tmp,timeunitm,ccn3_unit,ccn3_longname)=read_extractflight(filename_m,'CCN3') - (timem,heightm,ccn5_tmp,timeunitm,ccn5_unit,ccn5_longname)=read_extractflight(filename_m,'CCN5') - ccn3.append(ccn3_tmp) - ccn5.append(ccn5_tmp) + for date in alldates: + print(date) - # get supersaturation - SS3 = ccn3_longname.split('=')[-1] - SS5 = ccn5_longname.split('=')[-1] - - #%% read in observations for CSET and SOCRATES - # CSET does not have observed CCN - if campaign=='CSET': - timea=timem - SSa=np.nan*np.empty([len(timem)]) - ccna=np.nan*np.empty([len(timem)]) - timeb=timem - SSb=np.nan*np.empty([len(timem)]) - ccnb=np.nan*np.empty([len(timem)]) + #%% read in Models + + ccn3=[] + ccn5=[] + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - # SOCRATES - elif campaign=='SOCRATES': - filename_ccn=glob.glob(ccnpath+'CCNscanning_SOCRATES_GV_RF*'+date[0:8]+'_R0.ict') - if len(filename_ccn)==1: - (data0,ccnlist)=read_ccn_socrates(filename_ccn[0]) - time_ccn = data0[0,:] - ccn = data0[1,:] - SS = data0[3,:] - ccn=qc_remove_neg(ccn) - timea=time_ccn - timeb=time_ccn - ccna=np.array(ccn) - ccnb=np.array(ccn) - idxa=np.logical_and(SS>0.05, SS<0.15) - ccna[idxa==False]=np.nan - SSa=np.full((len(timea)),0.1) - idxb=np.logical_and(SS>0.45, SS<0.55) - ccnb[idxb==False]=np.nan - SSb=np.full((len(timeb)),0.5) - elif len(filename_ccn)==0: + (timem,heightm,ccn3_tmp,timeunitm,ccn3_unit,ccn3_longname)=read_extractflight(filename_m,'CCN3') + (timem,heightm,ccn5_tmp,timeunitm,ccn5_unit,ccn5_longname)=read_extractflight(filename_m,'CCN5') + ccn3.append(ccn3_tmp) + ccn5.append(ccn5_tmp) + + # get supersaturation + SS3 = ccn3_longname.split('=')[-1] + SS5 = ccn5_longname.split('=')[-1] + + #%% read in observations for CSET and SOCRATES + # CSET does not have observed CCN + if campaign=='CSET': timea=timem SSa=np.nan*np.empty([len(timem)]) ccna=np.nan*np.empty([len(timem)]) timeb=timem SSb=np.nan*np.empty([len(timem)]) ccnb=np.nan*np.empty([len(timem)]) + + # SOCRATES + elif campaign=='SOCRATES': + filename_ccn=glob.glob(ccnpath+'CCNscanning_SOCRATES_GV_RF*'+date[0:8]+'_R0.ict') + if len(filename_ccn)==1: + (data0,ccnlist)=read_ccn_socrates(filename_ccn[0]) + time_ccn = data0[0,:] + ccn = data0[1,:] + SS = data0[3,:] + ccn=qc_remove_neg(ccn) + timea=time_ccn + timeb=time_ccn + ccna=np.array(ccn) + ccnb=np.array(ccn) + idxa=np.logical_and(SS>0.05, SS<0.15) + ccna[idxa==False]=np.nan + SSa=np.full((len(timea)),0.1) + idxb=np.logical_and(SS>0.45, SS<0.55) + ccnb[idxb==False]=np.nan + SSb=np.full((len(timeb)),0.5) + elif len(filename_ccn)==0: + timea=timem + SSa=np.nan*np.empty([len(timem)]) + ccna=np.nan*np.empty([len(timem)]) + timeb=timem + SSb=np.nan*np.empty([len(timem)]) + ccnb=np.nan*np.empty([len(timem)]) + else: + raise ValueError('find too many files: ' + filename_ccn) + + if any(timea!=timeb): + raise ValueError('inconsitent time dimension') + + + # need latitude from RF file + lst = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') + if len(lst)==1 or len(lst)==2: # SOCRATES has two flights in 20180217, choose the later one + filename=lst[-1] else: - raise ValueError('find too many files: ' + filename_ccn) + raise ValueError('find no file or too many files: ' + lst) + (time,lat,timeunit,latunit,latlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LAT') + + # exclude NaNs + idx = np.logical_or(~np.isnan(ccna), ~np.isnan(ccnb)) + ccna=ccna[idx] + ccnb=ccnb[idx] + SSa=SSa[idx] + SSb=SSb[idx] + + # for interpolation of model results + timea=timea[idx] + timeb=timeb[idx] + time=timea + # interpolate model results into observational time + for mm in range(nmodels): + ccn3[mm] = (np.interp(timea,timem,ccn3[mm])) + ccn5[mm] = (np.interp(timeb,timem,ccn5[mm])) + height = np.interp(timeb,timem,heightm) + lat = np.interp(timeb,timem,lat) + - if any(timea!=timeb): - raise ValueError('inconsitent time dimension') + #%% separate data by cloud or height + flag_below = np.zeros(len(time)) + flag_near = np.zeros(len(time)) + flag_above = np.zeros(len(time)) + if plot_method == 'height': + for ii in range(len(time)): + if height[ii]>5000: + continue # exclude measurements above 5km + elif height[ii]<2000: + flag_below[ii]=1 + elif height[ii]>=2000: + flag_above[ii]=1 + + # option 3: use all heights below 5km + elif plot_method == 'all': + for ii in range(len(time)): + if height[ii]<=5000: # exclude measurements above 5km + flag_below[ii]=1 + + for bb in range(latlen): + idx = np.logical_and(lat>=latmin[bb], lat5000: - continue # exclude measurements above 5km - elif height[ii]<2000: - flag_below[ii]=1 - elif height[ii]>=2000: - flag_above[ii]=1 - - # option 3: use all heights below 5km - elif plot_method == 'all': - for ii in range(len(time)): - if height[ii]<=5000: # exclude measurements above 5km - flag_below[ii]=1 - - for bb in range(latlen): - idx = np.logical_and(lat>=latmin[bb], lat25,lat<28)])) - - #%% separate data by cloud or height - flag_below = np.zeros(len(time)) - flag_near = np.zeros(len(time)) - flag_above = np.zeros(len(time)) + ncn10_below_lat.append([np.empty(0) for bb in range(latlen)]) + ncn10_near_lat.append([np.empty(0) for bb in range(latlen)]) + ncn10_above_lat.append([np.empty(0) for bb in range(latlen)]) + ncn100_below_lat.append([np.empty(0) for bb in range(latlen)]) + ncn100_near_lat.append([np.empty(0) for bb in range(latlen)]) + ncn100_above_lat.append([np.empty(0) for bb in range(latlen)]) - # option 1: separate data by cloud and put in each latitude bin - if plot_method == 'cloud': - for ii in range(len(time)): - if height[ii]>5000: - continue # exclude measurements above 5km - # check if there is cloud within 1hr window - i_start = max(ii-1800, 0) - i_end = min(ii+1800, len(time)) - if any(cldflag[i_start:i_end]==1): - cheight=height[i_start:i_end][cldflag[i_start:i_end]==1] - cldmax = np.max(cheight) - cldmin = np.min(cheight) - if height[ii]=cldmin and height[ii]<=cldmax: - flag_near[ii]=1 - elif height[ii]>max(cldmax,1000): - flag_above[ii]=1 + print('reading '+format(len(alldates))+' files to calculate the statistics: ') - # option 2: separate data by height - elif plot_method == 'height': - for ii in range(len(time)): - if height[ii]>5000: - continue # exclude measurements above 5km - # check if there is cloud within 1hr window - i_start = max(ii-1800, 0) - i_end = min(ii+1800, len(time)) - if any(cldflag[i_start:i_end]==1): - cheight=height[i_start:i_end][cldflag[i_start:i_end]==1] - cldmax = np.max(cheight) - cldmin = np.min(cheight) - if height[ii]max(cldmax,2000): - flag_above[ii]=1 - else: - if height[ii]<2000: + for date in alldates: + print(date) + + #%% read in Models + cpc100_m = [] + cpc10_m = [] + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + + (timem,heightm,cpc_m,timeunitm,ncn_unit,ncn_longname)=read_extractflight(filename_m,'NCN') + (timem,heightm,ncnall,timeunitm,ncnall_unit,ncnall_longname)=read_extractflight(filename_m,'NCNall') + + cpc100_m.append(np.sum(ncnall[100:,:],0)*1e-6) # #/m3 to #/cm3 + cpc10_m.append(cpc_m*1e-6) # #/m3 to #/cm3 + + #%% read in observations + # note that it is only for CSET and SOCRATES + lst = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') + if len(lst)==1 or len(lst)==2: # SOCRATES has two flights in 20180217, choose the later one + filename=lst[-1] + else: + raise ValueError('find no file or too many files: '+lst) + (time,height,timeunit,hunit,hlongname,cellsize,cellunit)=read_RF_NCAR(filename,'ALT') + (time,lat,timeunit,latunit,latlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LAT') + (time,lwc,timeunit,lwcunit,lwclongname,cellsize,cellunit)=read_RF_NCAR(filename,'PLWCC') + (time,cpc10,timeunit,cpc10unit,cpc10longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCN') + if campaign=='CSET': + (time,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCU100_RWOOU') + # (time,uhsas500,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCU500_RWOOU') + elif campaign=='SOCRATES': + # there are two variables: CONCU100_CVIU and CONCU100_LWII + (time,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCU100_LWII') + # (time,uhsas500,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCU500_LWII') + + # exclude 30min after takeoff and before landing + height=qc_mask_takeoff_landing(time,height) + lat=qc_mask_takeoff_landing(time,lat) + lwc=qc_mask_takeoff_landing(time,lwc) + cpc10=qc_mask_takeoff_landing(time,cpc10) + uhsas100=qc_mask_takeoff_landing(time,uhsas100) + timem=qc_mask_takeoff_landing(time,timem) + for mm in range(nmodels): + cpc10_m[mm]=qc_mask_takeoff_landing(time,cpc10_m[mm]) + cpc100_m[mm]=qc_mask_takeoff_landing(time,cpc100_m[mm]) + + # calculate cloud flag based on LWC + cldflag=lwc2cflag(lwc,lwcunit) + + cpc10 = qc_mask_cloudflag(cpc10,cldflag) + cpc10 = qc_remove_neg(cpc10) + uhsas100 = qc_mask_cloudflag(uhsas100,cldflag) + uhsas100 = qc_remove_neg(uhsas100) + + # if min(lat)<28: + # print(np.nanmax(uhsas100[np.logical_and(lat>25,lat<28)])) + + #%% separate data by cloud or height + flag_below = np.zeros(len(time)) + flag_near = np.zeros(len(time)) + flag_above = np.zeros(len(time)) + + # option 1: separate data by cloud and put in each latitude bin + if plot_method == 'cloud': + for ii in range(len(time)): + if height[ii]>5000: + continue # exclude measurements above 5km + # check if there is cloud within 1hr window + i_start = max(ii-1800, 0) + i_end = min(ii+1800, len(time)) + if any(cldflag[i_start:i_end]==1): + cheight=height[i_start:i_end][cldflag[i_start:i_end]==1] + cldmax = np.max(cheight) + cldmin = np.min(cheight) + if height[ii]=cldmin and height[ii]<=cldmax: + flag_near[ii]=1 + elif height[ii]>max(cldmax,1000): + flag_above[ii]=1 + + # option 2: separate data by height + elif plot_method == 'height': + for ii in range(len(time)): + if height[ii]>5000: + continue # exclude measurements above 5km + # check if there is cloud within 1hr window + i_start = max(ii-1800, 0) + i_end = min(ii+1800, len(time)) + if any(cldflag[i_start:i_end]==1): + cheight=height[i_start:i_end][cldflag[i_start:i_end]==1] + cldmax = np.max(cheight) + cldmin = np.min(cheight) + if height[ii]max(cldmax,2000): + flag_above[ii]=1 + else: + if height[ii]<2000: + flag_below[ii]=1 + elif height[ii]>=2000: + flag_above[ii]=1 + + # option 3: use all heights below 5km + elif plot_method == 'all': + for ii in range(len(time)): + if height[ii]<=5000: # exclude measurements above 5km flag_below[ii]=1 - elif height[ii]>=2000: - flag_above[ii]=1 - - # option 3: use all heights below 5km - elif plot_method == 'all': - for ii in range(len(time)): - if height[ii]<=5000: # exclude measurements above 5km - flag_below[ii]=1 - + + for bb in range(latlen): + idx = np.logical_and(lat>=latmin[bb], lat=latmin[bb], lat10nm) - figname = figpath_aircraft_statistics+'percentile_lat_CN10nm_bycldheight_'+campaign+'.png' - print('plotting figures to '+figname) - - fig,(ax1,ax2,ax3) = plt.subplots(3,1,figsize=(8,6)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.boxplot(cpc_above_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax1.boxplot(ncn10_above_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax1.tick_params(color='k',labelsize=15) - # ax1.set_yscale('log') - ax1.set_xlim(-1,latlen) - ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - ax1.plot([],c='k',label='CPC') - for mm in range(nmodels): - ax1.plot([],c=color_model[mm],label=Model_List[mm]) + cpc=cpc_below_lat[bb] + cpc_below_lat[bb] = cpc[~np.isnan(cpc)] + uhsas=uhsas_below_lat[bb] + uhsas_below_lat[bb] = uhsas[~np.isnan(uhsas)] + cpc=cpc_near_lat[bb] + cpc_near_lat[bb] = cpc[~np.isnan(cpc)] + uhsas=uhsas_near_lat[bb] + uhsas_near_lat[bb] = uhsas[~np.isnan(uhsas)] + cpc=cpc_above_lat[bb] + cpc_above_lat[bb] = cpc[~np.isnan(cpc)] + uhsas=uhsas_above_lat[bb] + uhsas_above_lat[bb] = uhsas[~np.isnan(uhsas)] + + + #%% make plot + # set position shift so that models and obs are not overlapped + p_shift = np.arange(nmodels+1) + p_shift = (p_shift - p_shift.mean())*0.2 + + #%% plot separate by cloud + if plot_method == 'cloud': + #%% for CPC (>10nm) + figname = figpath_aircraft_statistics+'percentile_lat_CN10nm_bycldheight_'+campaign+'.png' + print('plotting figures to '+figname) - ax2.boxplot(cpc_near_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax2.boxplot(ncn10_near_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax2.tick_params(color='k',labelsize=15) - # ax2.set_yscale('log') - ax2.set_xlim(-1,latlen) - ax2.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - ax2.plot([],c='k',label='CPC') - for mm in range(nmodels): - ax2.plot([],c=color_model[mm],label=Model_List[mm]) + fig,(ax1,ax2,ax3) = plt.subplots(3,1,figsize=(8,6)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.boxplot(cpc_above_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax1.boxplot(ncn10_above_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax1.tick_params(color='k',labelsize=15) + # ax1.set_yscale('log') + ax1.set_xlim(-1,latlen) + ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + ax1.plot([],c='k',label='CPC') + for mm in range(nmodels): + ax1.plot([],c=color_model[mm],label=Model_List[mm]) + + ax2.boxplot(cpc_near_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax2.boxplot(ncn10_near_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax2.tick_params(color='k',labelsize=15) + # ax2.set_yscale('log') + ax2.set_xlim(-1,latlen) + ax2.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + ax2.plot([],c='k',label='CPC') + for mm in range(nmodels): + ax2.plot([],c=color_model[mm],label=Model_List[mm]) + + ax3.boxplot(cpc_below_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax3.boxplot(ncn10_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax3.tick_params(color='k',labelsize=15) + # ax3.set_yscale('log') + ax3.set_xlim(-1,latlen) + ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + # plot temporal lines for label + ax3.plot([],c='k',label='CPC') + for mm in range(nmodels): + ax3.plot([],c=color_model[mm],label=Model_List[mm]) - ax3.boxplot(cpc_below_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax3.boxplot(ncn10_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax3.tick_params(color='k',labelsize=15) - # ax3.set_yscale('log') - ax3.set_xlim(-1,latlen) - ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - # plot temporal lines for label - ax3.plot([],c='k',label='CPC') - for mm in range(nmodels): - ax3.plot([],c=color_model[mm],label=Model_List[mm]) - - ax3.set_xlabel('Latitude',fontsize=16) - - ax1.set_xticklabels([]) - ax2.set_xticklabels([]) - ax3.set_xticklabels([]) - ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) - ax1.set_title('Percentile of CN (>10nm) # (cm$^{-3}$) '+campaign,fontsize=17) - fig.text(0.1,0.95,'Above Clouds',fontsize=15) - fig.text(0.1,0.6,'Near Clouds',fontsize=15) - fig.text(0.1,0.25,'Below Cloud',fontsize=15) - - ax2.legend(loc='upper right', shadow=False, fontsize='x-large') - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - - #%% plot for UHSAS (>100nm) - figname = figpath_aircraft_statistics+'percentile_lat_CN100nm_bycldheight_'+campaign+'.png' - print('plotting figures to '+figname) - - fig,(ax1,ax2,ax3) = plt.subplots(3,1,figsize=(8,6)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.boxplot(uhsas_above_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax1.boxplot(ncn100_above_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax1.tick_params(color='k',labelsize=15) - # ax1.set_yscale('log') - ax1.set_xlim(-1,latlen) - ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - ax1.plot([],c='k',label='UHSAS100') - for mm in range(nmodels): - ax1.plot([],c=color_model[mm],label=Model_List[mm]) + ax3.set_xlabel('Latitude',fontsize=16) - ax2.boxplot(uhsas_near_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax2.boxplot(ncn100_near_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax2.tick_params(color='k',labelsize=15) - # ax2.set_yscale('log') - ax2.set_xlim(-1,latlen) - ax2.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - ax2.plot([],c='k',label='UHSAS100') - for mm in range(nmodels): - ax2.plot([],c=color_model[mm],label=Model_List[mm]) + ax1.set_xticklabels([]) + ax2.set_xticklabels([]) + ax3.set_xticklabels([]) + ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) + ax1.set_title('Percentile of CN (>10nm) # (cm$^{-3}$) '+campaign,fontsize=17) + fig.text(0.1,0.95,'Above Clouds',fontsize=15) + fig.text(0.1,0.6,'Near Clouds',fontsize=15) + fig.text(0.1,0.25,'Below Cloud',fontsize=15) - ax3.boxplot(uhsas_below_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax3.boxplot(ncn100_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax3.tick_params(color='k',labelsize=15) - # ax3.set_yscale('log') - ax3.set_xlim(-1,latlen) - ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - # plot temporal lines for label - ax3.plot([],c='k',label='UHSAS100') - for mm in range(nmodels): - ax3.plot([],c=color_model[mm],label=Model_List[mm]) - - ax3.set_xlabel('Latitude',fontsize=16) - - ax1.set_xticklabels([]) - ax2.set_xticklabels([]) - ax3.set_xticklabels([]) - ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) - ax1.set_title('Percentile of CN (>100nm) # (cm$^{-3}$) '+campaign,fontsize=17) - fig.text(0.1,0.95,'Above Clouds',fontsize=15) - fig.text(0.1,0.6,'Near Clouds',fontsize=15) - fig.text(0.1,0.25,'Below Cloud',fontsize=15) - - ax2.legend(loc='upper right', shadow=False, fontsize='x-large') - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - -elif plot_method == 'height': - #%% for CPC (>10nm) - figname = figpath_aircraft_statistics+'percentile_lat_CN10nm_byheight_'+campaign+'.png' - print('plotting figures to '+figname) - - fig,(ax1,ax3) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.boxplot(cpc_above_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax1.boxplot(ncn10_above_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax1.tick_params(color='k',labelsize=15) - # ax1.set_yscale('log') - ax1.set_xlim(-1,latlen) - ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - if campaign=='SOCRATES': - ax1.set_ylim(-100,4000) - elif campaign=='CSET': - ax1.set_ylim(-20,1200) - ax1.plot([],c='k',label='CPC') - for mm in range(nmodels): - ax1.plot([],c=color_model[mm],label=Model_List[mm]) + ax2.legend(loc='upper right', shadow=False, fontsize='x-large') - ax3.boxplot(cpc_below_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax3.boxplot(ncn10_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax3.tick_params(color='k',labelsize=15) - # ax3.set_yscale('log') - ax3.set_xlim(-1,latlen) - ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - if campaign=='SOCRATES': - ax3.set_ylim(-100,2000) - elif campaign=='CSET': - ax3.set_ylim(-50,4000) - # plot temporal lines for label - ax3.plot([],c='k',label='CPC') - for mm in range(nmodels): - ax3.plot([],c=color_model[mm],label=Model_List[mm]) - - ax3.set_xlabel('Latitude',fontsize=16) - - ax1.set_xticklabels([]) - ax3.set_xticklabels([]) - ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) - ax1.set_title('Percentile of CN (>10nm) # (cm$^{-3}$) '+campaign,fontsize=17) - fig.text(0.1,0.9,'2-5km',fontsize=15) - fig.text(0.1,0.4,'0-2km',fontsize=15) - - ax1.legend(loc='upper right', shadow=False, fontsize='x-large') - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - - #%% plot for UHSAS (>100nm) - figname = figpath_aircraft_statistics+'percentile_lat_CN100nm_byheight_'+campaign+'.png' - print('plotting figures to '+figname) - - fig,(ax1,ax3) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.boxplot(uhsas_above_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax1.boxplot(ncn100_above_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax1.tick_params(color='k',labelsize=15) - # ax1.set_yscale('log') - ax1.set_xlim(-1,latlen) - ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - ax1.plot([],c='k',label='UHSAS100') - for mm in range(nmodels): - ax1.plot([],c=color_model[mm],label=Model_List[mm]) + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - ax3.boxplot(uhsas_below_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax3.boxplot(ncn100_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax3.tick_params(color='k',labelsize=15) - # ax3.set_yscale('log') - ax3.set_xlim(-1,latlen) - ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - ax3.set_ylim(-10,400) - # plot temporal lines for label - ax3.plot([],c='k',label='UHSAS100') - for mm in range(nmodels): - ax3.plot([],c=color_model[mm],label=Model_List[mm]) - - ax3.set_xlabel('Latitude',fontsize=16) - - ax1.set_xticklabels([]) - ax3.set_xticklabels([]) - ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) - ax1.set_title('Percentile of CN (>100nm) # (cm$^{-3}$) '+campaign,fontsize=17) - fig.text(0.1,0.9,'2-5km',fontsize=15) - fig.text(0.1,0.4,'0-2km',fontsize=15) - - ax1.legend(loc='upper right', shadow=False, fontsize='x-large') - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -#%% - -elif plot_method == 'all': - #%% for CPC (>10nm) - figname = figpath_aircraft_statistics+'percentile_lat_CN_'+campaign+'.png' - print('plotting figures to '+figname) + #%% plot for UHSAS (>100nm) + figname = figpath_aircraft_statistics+'percentile_lat_CN100nm_bycldheight_'+campaign+'.png' + print('plotting figures to '+figname) + + fig,(ax1,ax2,ax3) = plt.subplots(3,1,figsize=(8,6)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.boxplot(uhsas_above_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax1.boxplot(ncn100_above_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax1.tick_params(color='k',labelsize=15) + # ax1.set_yscale('log') + ax1.set_xlim(-1,latlen) + ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + ax1.plot([],c='k',label='UHSAS100') + for mm in range(nmodels): + ax1.plot([],c=color_model[mm],label=Model_List[mm]) + + ax2.boxplot(uhsas_near_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax2.boxplot(ncn100_near_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax2.tick_params(color='k',labelsize=15) + # ax2.set_yscale('log') + ax2.set_xlim(-1,latlen) + ax2.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + ax2.plot([],c='k',label='UHSAS100') + for mm in range(nmodels): + ax2.plot([],c=color_model[mm],label=Model_List[mm]) + + ax3.boxplot(uhsas_below_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax3.boxplot(ncn100_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax3.tick_params(color='k',labelsize=15) + # ax3.set_yscale('log') + ax3.set_xlim(-1,latlen) + ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + # plot temporal lines for label + ax3.plot([],c='k',label='UHSAS100') + for mm in range(nmodels): + ax3.plot([],c=color_model[mm],label=Model_List[mm]) + + ax3.set_xlabel('Latitude',fontsize=16) + + ax1.set_xticklabels([]) + ax2.set_xticklabels([]) + ax3.set_xticklabels([]) + ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) + ax1.set_title('Percentile of CN (>100nm) # (cm$^{-3}$) '+campaign,fontsize=17) + fig.text(0.1,0.95,'Above Clouds',fontsize=15) + fig.text(0.1,0.6,'Near Clouds',fontsize=15) + fig.text(0.1,0.25,'Below Cloud',fontsize=15) + + ax2.legend(loc='upper right', shadow=False, fontsize='x-large') + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - fig,(ax1,ax3) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.boxplot(cpc_below_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax1.boxplot(ncn10_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax1.tick_params(color='k',labelsize=15) - # ax1.set_yscale('log') - ax1.set_xlim(-1,latlen) - ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - if campaign=='SOCRATES': - ax1.set_ylim(-100,4000) - elif campaign=='CSET': - ax1.set_ylim(-20,2500) - ax1.plot([],c='k',label='CPC') - for mm in range(nmodels): - ax1.plot([],c=color_model[mm],label=Model_List[mm]) + elif plot_method == 'height': + #%% for CPC (>10nm) + figname = figpath_aircraft_statistics+'percentile_lat_CN10nm_byheight_'+campaign+'.png' + print('plotting figures to '+figname) - ax3.boxplot(uhsas_below_lat,whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[-1],widths=0.15, - boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), - vert=True, patch_artist=True) # need patch_artist to fill color in box - for mm in range(nmodels): - c = color_model[mm] - ax3.boxplot(ncn100_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, - positions=np.array(range(latlen))+p_shift[mm],widths=0.15, - boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), - medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), - vert=True, patch_artist=True) # need patch_artist to fill color in box - ax3.tick_params(color='k',labelsize=15) - # ax3.set_yscale('log') - ax3.set_xlim(-1,latlen) - ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) - if campaign=='SOCRATES': + fig,(ax1,ax3) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.boxplot(cpc_above_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax1.boxplot(ncn10_above_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax1.tick_params(color='k',labelsize=15) + # ax1.set_yscale('log') + ax1.set_xlim(-1,latlen) + ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + if campaign=='SOCRATES': + ax1.set_ylim(-100,4000) + elif campaign=='CSET': + ax1.set_ylim(-20,1200) + ax1.plot([],c='k',label='CPC') + for mm in range(nmodels): + ax1.plot([],c=color_model[mm],label=Model_List[mm]) + + ax3.boxplot(cpc_below_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax3.boxplot(ncn10_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax3.tick_params(color='k',labelsize=15) + # ax3.set_yscale('log') + ax3.set_xlim(-1,latlen) + ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + if campaign=='SOCRATES': + ax3.set_ylim(-100,2000) + elif campaign=='CSET': + ax3.set_ylim(-50,4000) + # plot temporal lines for label + ax3.plot([],c='k',label='CPC') + for mm in range(nmodels): + ax3.plot([],c=color_model[mm],label=Model_List[mm]) + + ax3.set_xlabel('Latitude',fontsize=16) + + ax1.set_xticklabels([]) + ax3.set_xticklabels([]) + ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) + ax1.set_title('Percentile of CN (>10nm) # (cm$^{-3}$) '+campaign,fontsize=17) + fig.text(0.1,0.9,'2-5km',fontsize=15) + fig.text(0.1,0.4,'0-2km',fontsize=15) + + ax1.legend(loc='upper right', shadow=False, fontsize='x-large') + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + + #%% plot for UHSAS (>100nm) + figname = figpath_aircraft_statistics+'percentile_lat_CN100nm_byheight_'+campaign+'.png' + print('plotting figures to '+figname) + + fig,(ax1,ax3) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.boxplot(uhsas_above_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax1.boxplot(ncn100_above_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax1.tick_params(color='k',labelsize=15) + # ax1.set_yscale('log') + ax1.set_xlim(-1,latlen) + ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + ax1.plot([],c='k',label='UHSAS100') + for mm in range(nmodels): + ax1.plot([],c=color_model[mm],label=Model_List[mm]) + + ax3.boxplot(uhsas_below_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax3.boxplot(ncn100_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax3.tick_params(color='k',labelsize=15) + # ax3.set_yscale('log') + ax3.set_xlim(-1,latlen) + ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) ax3.set_ylim(-10,400) - elif campaign=='CSET': - ax3.set_ylim(-10,1000) - # plot temporal lines for label - ax3.plot([],c='k',label='UHSAS100') - for mm in range(nmodels): - ax3.plot([],c=color_model[mm],label=Model_List[mm]) - - ax3.set_xlabel('Latitude',fontsize=16) - - ax1.set_xticklabels([]) - ax3.set_xticklabels([]) - ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) - ax1.set_title('Percentile of CN # (cm$^{-3}$) '+campaign,fontsize=17) - - ax1.legend(loc='upper right', shadow=False, fontsize='x-large') - ax3.legend(loc='upper right', shadow=False, fontsize='x-large') - fig.text(0.1,0.9,'>10nm',fontsize=15) - fig.text(0.1,0.4,'>100nm',fontsize=15) + # plot temporal lines for label + ax3.plot([],c='k',label='UHSAS100') + for mm in range(nmodels): + ax3.plot([],c=color_model[mm],label=Model_List[mm]) + + ax3.set_xlabel('Latitude',fontsize=16) + + ax1.set_xticklabels([]) + ax3.set_xticklabels([]) + ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) + ax1.set_title('Percentile of CN (>100nm) # (cm$^{-3}$) '+campaign,fontsize=17) + fig.text(0.1,0.9,'2-5km',fontsize=15) + fig.text(0.1,0.4,'0-2km',fontsize=15) + + ax1.legend(loc='upper right', shadow=False, fontsize='x-large') + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + #%% - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -#%% -else: - raise ValueError('does not recognize plot_method: '+plot_method) \ No newline at end of file + elif plot_method == 'all': + #%% for CPC (>10nm) + figname = figpath_aircraft_statistics+'percentile_lat_CN_'+campaign+'.png' + print('plotting figures to '+figname) + + fig,(ax1,ax3) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.boxplot(cpc_below_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax1.boxplot(ncn10_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax1.tick_params(color='k',labelsize=15) + # ax1.set_yscale('log') + ax1.set_xlim(-1,latlen) + ax1.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + if campaign=='SOCRATES': + ax1.set_ylim(-100,4000) + elif campaign=='CSET': + ax1.set_ylim(-20,2500) + ax1.plot([],c='k',label='CPC') + for mm in range(nmodels): + ax1.plot([],c=color_model[mm],label=Model_List[mm]) + + ax3.boxplot(uhsas_below_lat,whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[-1],widths=0.15, + boxprops=dict(facecolor='k', color='k'),whiskerprops=dict(color='k'), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color='k'), + vert=True, patch_artist=True) # need patch_artist to fill color in box + for mm in range(nmodels): + c = color_model[mm] + ax3.boxplot(ncn100_below_lat[mm],whis=(5,95),showmeans=False,showfliers=False, + positions=np.array(range(latlen))+p_shift[mm],widths=0.15, + boxprops=dict(facecolor=c, color=c),whiskerprops=dict(color=c), + medianprops=dict(color='lightyellow',linewidth=1),capprops=dict(color=c), + vert=True, patch_artist=True) # need patch_artist to fill color in box + ax3.tick_params(color='k',labelsize=15) + # ax3.set_yscale('log') + ax3.set_xlim(-1,latlen) + ax3.set_xticks(np.arange(-0.5*dlat,latlen-1,2)) + if campaign=='SOCRATES': + ax3.set_ylim(-10,400) + elif campaign=='CSET': + ax3.set_ylim(-10,1000) + # plot temporal lines for label + ax3.plot([],c='k',label='UHSAS100') + for mm in range(nmodels): + ax3.plot([],c=color_model[mm],label=Model_List[mm]) + + ax3.set_xlabel('Latitude',fontsize=16) + + ax1.set_xticklabels([]) + ax3.set_xticklabels([]) + ax3.set_xticklabels([int(np.floor(a)) for a in latbin[0::2]]) + ax1.set_title('Percentile of CN # (cm$^{-3}$) '+campaign,fontsize=17) + + ax1.legend(loc='upper right', shadow=False, fontsize='x-large') + ax3.legend(loc='upper right', shadow=False, fontsize='x-large') + fig.text(0.1,0.9,'>10nm',fontsize=15) + fig.text(0.1,0.4,'>100nm',fontsize=15) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + #%% + else: + raise ValueError('does not recognize plot_method: '+plot_method) \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py b/src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py index 9940228..5ff6c5f 100644 --- a/src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py +++ b/src/esmac_diags/plotting/plot_flight_percentile_lat_cldfreq.py @@ -2,7 +2,6 @@ # for aircraft measurements in CSET or SOCRATES # only select a certain height ranges for warm clouds (the height range needs to be further tuned) """ -import sys import os import glob @@ -13,151 +12,158 @@ from ..subroutines.specific_data_treatment import lwc2cflag from ..subroutines.quality_control import qc_mask_takeoff_landing -#%% settings +def run_plot(settings): -from settings import campaign, Model_List, color_model, \ - latbin, E3SM_aircraft_path, figpath_aircraft_statistics - -if campaign in ['CSET', 'SOCRATES']: - from settings import RFpath -else: - raise ValueError('This code is only for CSET or SOCRATES. check campaign setting: '+campaign) + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + latbin = settings['latbin'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_statistics = settings['figpath_aircraft_statistics'] -if not os.path.exists(figpath_aircraft_statistics): - os.makedirs(figpath_aircraft_statistics) + if campaign in ['CSET', 'SOCRATES']: + RFpath = settings['RFpath'] + else: + raise ValueError('This code is only for CSET or SOCRATES. check campaign setting: '+campaign) -dlat = latbin[1]-latbin[0] -latmin = latbin-dlat/2 -latmax = latbin+dlat/2 -latlen = len(latbin) + #%% other settings -nmodels=len(Model_List) - -#%% find files for flight information - -lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') -lst.sort() -if len(lst)==0: - raise ValueError('cannot fine any file') -alldates = [x.split('_')[-1].split('.')[0] for x in lst] - - -#%% define variables by latitude bins + if not os.path.exists(figpath_aircraft_statistics): + os.makedirs(figpath_aircraft_statistics) + + dlat = latbin[1]-latbin[0] + latmin = latbin-dlat/2 + latmax = latbin+dlat/2 + latlen = len(latbin) + + nmodels=len(Model_List) -height_lat = [] -cbheight = [] # cloud base height -cflag_lat = [] -cloudo_lat = [] # cloud fraction by flag - -for bb in range(latlen): - height_lat.append(np.empty(0)) - cbheight.append(np.empty(0)) - cflag_lat.append(np.empty(0)) - cloudo_lat.append(np.empty(0)) - -cloudm_lat = [] -for mm in range(nmodels): - cloudm_lat.append(list(cloudo_lat)) - -print('reading '+format(len(alldates))+' files to calculate the statistics: ') - -for date in alldates: - print(date) + #%% find files for flight information - #%% read in Models - cloudm = [] - for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') + lst.sort() + if len(lst)==0: + raise ValueError('cannot fine any file') + alldates = [x.split('_')[-1].split('.')[0] for x in lst] - (timem,heightm,cloud,timeunitm,clunit,cllongname)=read_extractflight(filename_m,'CLOUD') - cloudm.append(cloud) - #%% read in observations - # note that it is only for CSET and SOCRATES - lst = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') - if len(lst)==1 or len(lst)==2: # SOCRATES has two flights in 20180217, choose the later one - filename=lst[-1] - else: - raise ValueError('find no file or too many files: '+lst) - (time,height,timeunit,hunit,hlongname,cellsize,cellunit)=read_RF_NCAR(filename,'ALT') - (time,lat,timeunit,latunit,latlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LAT') - (time,lon,timeunit,lonunit,lonlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LON') - (time,lwc,timeunit,lwcunit,lwclongname,cellsize,cellunit)=read_RF_NCAR(filename,'PLWCC') - - # exclude 30min after takeoff and before landing - height=qc_mask_takeoff_landing(time,height) - lat=qc_mask_takeoff_landing(time,lat) - lon=qc_mask_takeoff_landing(time,lon) - lwc=qc_mask_takeoff_landing(time,lwc) - timem=qc_mask_takeoff_landing(time,timem) + #%% define variables by latitude bins + + height_lat = [] + cbheight = [] # cloud base height + cflag_lat = [] + cloudo_lat = [] # cloud fraction by flag + + for bb in range(latlen): + height_lat.append(np.empty(0)) + cbheight.append(np.empty(0)) + cflag_lat.append(np.empty(0)) + cloudo_lat.append(np.empty(0)) + + cloudm_lat = [] for mm in range(nmodels): - cloudm[mm]=qc_mask_takeoff_landing(time,cloudm[mm]) + cloudm_lat.append(list(cloudo_lat)) - # calculate cloud flag based on LWC - cldflag=lwc2cflag(lwc,lwcunit) + print('reading '+format(len(alldates))+' files to calculate the statistics: ') + for date in alldates: + print(date) - #%% put data in each latitude bin - for bb in range(latlen): - idx = np.logical_and(lat>=latmin[bb], lat=latmin[bb], lat=zmin[zz], height=zmin[zz], heighttimea[0]: - cflag = np.insert(cflag,np.full(int(time[0]-timea[0]),0), -9999) - time = np.insert(time,np.full(int(time[0]-timea[0]),0), -9999) - if time[-1]timea[-1]: - cflag = cflag[0:np.where(time==timea[-1])[0][0]+1] - time = time[0:np.where(time==timea[-1])[0][0]+1] - ccna = qc_mask_cloudflag(ccna,cflag) - ccnb = qc_mask_cloudflag(ccnb,cflag) + #%% read in Models + + ccn3=[] + ccn5=[] + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - # CSET does not have observed CCN - elif campaign=='CSET': - timea=timem - SSa=np.nan*np.empty([len(timem)]) - ccna=np.nan*np.empty([len(timem)]) - timeb=timem - SSb=np.nan*np.empty([len(timem)]) - ccnb=np.nan*np.empty([len(timem)]) + (timem,heightm,ccn3_tmp,timeunitm,ccn3_unit,ccn3_longname)=read_extractflight(filename_m,'CCN3') + (timem,heightm,ccn5_tmp,timeunitm,ccn5_unit,ccn5_longname)=read_extractflight(filename_m,'CCN5') + ccn3.append(ccn3_tmp) + ccn5.append(ccn5_tmp) + + + # get supersaturation + SS3 = ccn3_longname.split('=')[-1] + SS5 = ccn5_longname.split('=')[-1] - # SOCRATES - elif campaign=='SOCRATES': - filename_ccn=glob.glob(ccnpath+'CCNscanning_SOCRATES_GV_RF*'+date[0:8]+'_R0.ict') - if len(filename_ccn)==1: - (data0,ccnlist)=read_ccn_socrates(filename_ccn[0]) - time_ccn = data0[0,:] - ccn = data0[1,:] - SS = data0[3,:] - ccn=qc_remove_neg(ccn) + #%% read in flight data (for HISCALE) + if campaign=='HISCALE': + filename_ccn=glob.glob(ccnpath+'CCN_G1_'+date[0:8]+'*R2_HiScale001s.*') + filename_ccn.sort() + if date[-1]=='a': + flightidx=1 + else: + flightidx=2 + # read in data + if len(filename_ccn)==1 or len(filename_ccn)==2: + (data0,ccnlist)=read_ccn_hiscale(filename_ccn[flightidx-1]) + # only choose data quality is good (flag=0) + flag = data0[7,:] + time_ccn = data0[0,:] + ccna = data0[10,:] + ccnb = data0[11,:] + SSa = data0[2,:] + SSb = data0[5,:] + ccna = qc_mask_qcflag(ccna,flag) + ccnb = qc_mask_qcflag(ccnb,flag) + SSa=qc_remove_neg(SSa) + SSb=qc_remove_neg(SSb) + elif len(filename_ccn)==0: + time_ccn=timem + ccna=np.nan*np.empty([len(timem)]) + ccnb=np.nan*np.empty([len(timem)]) + SSa=0.24*np.full(len(timem),1) + SSb=0.46*np.full(len(timem),1) + else: + raise ValueError('find too many files: '+filename_ccn) timea=time_ccn timeb=time_ccn - ccna=np.array(ccn) - ccnb=np.array(ccn) - idxa=np.logical_and(SS>0.05, SS<0.15) - ccna[idxa==False]=np.nan - SSa=np.full((len(timea)),0.1) - idxb=np.logical_and(SS>0.45, SS<0.55) - ccnb[idxb==False]=np.nan - SSb=np.full((len(timeb)),0.5) - elif len(filename_ccn)==0: + # cloud flag + filename = merged_size_path+'merged_bin_fims_pcasp_'+campaign+'_'+date+'.nc' + (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') + ccna = qc_mask_cloudflag(ccna,cflag) + ccnb = qc_mask_cloudflag(ccnb,cflag) + + elif campaign=='ACEENA': + filename_ccna=glob.glob(ccnpath+'enaaafccn2colaF1.b1.'+date[0:8]+'*.nc') + filename_ccnb=glob.glob(ccnpath+'enaaafccn2colbF1.b1.'+date[0:8]+'*.nc') + # read in data + if len(filename_ccna)==1: + (timea,timeunita,ccna,qcflag,ccnunit,SSa)=read_ccn(filename_ccna[0]) + ccna=qc_mask_qcflag(ccna,qcflag) + ccna=qc_remove_neg(ccna) + SSa=qc_remove_neg(SSa) + elif len(filename_ccna)==0: + # print('no CCN data found. set as NaN') + timea=timem + SSa=np.nan*np.empty([len(timem)]) + ccna=np.nan*np.empty([len(timem)]) + else: + raise ValueError('find too many files: '+filename_ccna) + if len(filename_ccnb)==1: + (timeb,timeunitb,ccnb,qcflag,ccnunit,SSb)=read_ccn(filename_ccnb[0]) + ccnb=qc_mask_qcflag(ccnb,qcflag) + ccnb=qc_remove_neg(ccnb) + SSb=qc_remove_neg(SSb) + elif len(filename_ccnb)==0: + # print('no CCN data found. set as NaN') + timeb=timem + SSb=np.nan*np.empty([len(timem)]) + ccnb=np.nan*np.empty([len(timem)]) + else: + raise ValueError('find too many files: '+filename_ccnb) + # cloud flag + filename = merged_size_path+'merged_bin_fims_pcasp_opc_'+campaign+'_'+date+'.nc' + (time,size,cflag,timeunit,cunit,long_name)=read_merged_size(filename,'cld_flag') + if date=='20170707a': + time=np.delete(time,5247) + cflag=np.delete(cflag,5247) + elif date=='20180201a': + time=np.delete(time,3635) + cflag=np.delete(cflag,3635) + if time[0]timea[0]: + cflag = np.insert(cflag,np.full(int(time[0]-timea[0]),0), -9999) + time = np.insert(time,np.full(int(time[0]-timea[0]),0), -9999) + if time[-1]timea[-1]: + cflag = cflag[0:np.where(time==timea[-1])[0][0]+1] + time = time[0:np.where(time==timea[-1])[0][0]+1] + ccna = qc_mask_cloudflag(ccna,cflag) + ccnb = qc_mask_cloudflag(ccnb,cflag) + + # CSET does not have observed CCN + elif campaign=='CSET': timea=timem SSa=np.nan*np.empty([len(timem)]) ccna=np.nan*np.empty([len(timem)]) timeb=timem SSb=np.nan*np.empty([len(timem)]) ccnb=np.nan*np.empty([len(timem)]) - else: - raise ValueError('find too many files: '+filename_ccn) - if any(timea!=timeb): - raise ValueError('time dimension is inconsistent') + # SOCRATES + elif campaign=='SOCRATES': + filename_ccn=glob.glob(ccnpath+'CCNscanning_SOCRATES_GV_RF*'+date[0:8]+'_R0.ict') + if len(filename_ccn)==1: + (data0,ccnlist)=read_ccn_socrates(filename_ccn[0]) + time_ccn = data0[0,:] + ccn = data0[1,:] + SS = data0[3,:] + ccn=qc_remove_neg(ccn) + timea=time_ccn + timeb=time_ccn + ccna=np.array(ccn) + ccnb=np.array(ccn) + idxa=np.logical_and(SS>0.05, SS<0.15) + ccna[idxa==False]=np.nan + SSa=np.full((len(timea)),0.1) + idxb=np.logical_and(SS>0.45, SS<0.55) + ccnb[idxb==False]=np.nan + SSb=np.full((len(timeb)),0.5) + elif len(filename_ccn)==0: + timea=timem + SSa=np.nan*np.empty([len(timem)]) + ccna=np.nan*np.empty([len(timem)]) + timeb=timem + SSb=np.nan*np.empty([len(timem)]) + ccnb=np.nan*np.empty([len(timem)]) + else: + raise ValueError('find too many files: '+filename_ccn) + + if any(timea!=timeb): + raise ValueError('time dimension is inconsistent') + + # exclude NaNs + idx = np.logical_or(~np.isnan(ccna), ~np.isnan(ccnb)) + ccna_all.append(ccna[idx]) + ccnb_all.append(ccnb[idx]) + SSa_all=np.append(SSa_all,SSa[idx]) + SSb_all=np.append(SSb_all,SSb[idx]) - # exclude NaNs - idx = np.logical_or(~np.isnan(ccna), ~np.isnan(ccnb)) - ccna_all.append(ccna[idx]) - ccnb_all.append(ccnb[idx]) - SSa_all=np.append(SSa_all,SSa[idx]) - SSb_all=np.append(SSb_all,SSb[idx]) - - height2=np.interp(timea,timem,heightm) - height_all.append(height2[idx]) - - # for interpolation of model results - timea=timea[idx] - timeb=timeb[idx] + height2=np.interp(timea,timem,heightm) + height_all.append(height2[idx]) + + # for interpolation of model results + timea=timea[idx] + timeb=timeb[idx] + + # interpolate model results into observational time + for mm in range(nmodels): + ccn3_all[mm].append(np.interp(timea,timem,ccn3[mm])) + ccn5_all[mm].append(np.interp(timeb,timem,ccn5[mm])) + + #%% calculate percentiles for each height bin - # interpolate model results into observational time + ccna_z = list() + ccnb_z = list() + ccn3_z = [] + ccn5_z = [] + nmodels=len(Model_List) for mm in range(nmodels): - ccn3_all[mm].append(np.interp(timea,timem,ccn3[mm])) - ccn5_all[mm].append(np.interp(timeb,timem,ccn5[mm])) - -#%% calculate percentiles for each height bin - -ccna_z = list() -ccnb_z = list() -ccn3_z = [] -ccn5_z = [] -nmodels=len(Model_List) -for mm in range(nmodels): - ccn3_z.append([]) - ccn5_z.append([]) -for zz in range(zlen): - ccna_z.append(np.empty(0)) - ccnb_z.append(np.empty(0)) - for mm in range(nmodels): - ccn3_z[mm].append(np.empty(0)) - ccn5_z[mm].append(np.empty(0)) - -ndays=len(height_all) -for dd in range(ndays): - height = height_all[dd] - ccna = ccna_all[dd] - ccnb = ccnb_all[dd] + ccn3_z.append([]) + ccn5_z.append([]) for zz in range(zlen): - idx = np.logical_and(height>=zmin[zz], height=zmin[zz], height=zmin[zz], height=zmin[zz], height=zmin[zz], height=zmin[zz], height=zmin[zz], height=0] + if len(data)>0: + cldfreq_flag[zz] = sum(data==1)/len(data) + for mm in range(nmodels): + data = cldm_z[mm][zz] + data = data[~np.isnan(data)] + if len(data)>0: + cldfreq_m[mm][zz] = np.mean(data) + + #%% plot frequency + if campaign in ['HISCALE', 'ACEENA']: + figname = figpath_aircraft_statistics+'profile_height_CldFreq_'+campaign+'_'+IOP+'.png' + else: + figname = figpath_aircraft_statistics+'profile_height_CldFreq_'+campaign+'.png' + print('plotting figures to '+figname) + + fig,ax = plt.subplots(figsize=(4,8)) -for zz in range(zlen): - data = cflag_z[zz] - data = data[data>=0] - if len(data)>0: - cldfreq_flag[zz] = sum(data==1)/len(data) + ax.plot(cldfreq_flag,z,color='k',linewidth=1,linestyle='-',label='Obs') for mm in range(nmodels): - data = cldm_z[mm][zz] - data = data[~np.isnan(data)] - if len(data)>0: - cldfreq_m[mm][zz] = np.mean(data) - -#%% plot frequency -if campaign in ['HISCALE', 'ACEENA']: - figname = figpath_aircraft_statistics+'profile_height_CldFreq_'+campaign+'_'+IOP+'.png' -else: - figname = figpath_aircraft_statistics+'profile_height_CldFreq_'+campaign+'.png' -print('plotting figures to '+figname) - -fig,ax = plt.subplots(figsize=(4,8)) - -ax.plot(cldfreq_flag,z,color='k',linewidth=1,linestyle='-',label='Obs') -for mm in range(nmodels): - ax.plot(cldfreq_m[mm],z,color=color_model[mm],linewidth=1,label=Model_List[mm]) - -ax.tick_params(color='k',labelsize=12) -# ax.set_ylim(-1,zlen) -# ax.set_yticks(range(zlen)) -# ax.set_yticks(z[0:-1:2]) -ax.set_ylabel('Height (m MSL)',fontsize=12) -ax.legend(loc='upper right', fontsize='large') -ax.set_xlabel('Cloud Frequency',fontsize=12) -if campaign in ['HISCALE', 'ACEENA']: - ax.set_title(IOP,fontsize=15) -else: - ax.set_title(campaign,fontsize=15) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) \ No newline at end of file + ax.plot(cldfreq_m[mm],z,color=color_model[mm],linewidth=1,label=Model_List[mm]) + + ax.tick_params(color='k',labelsize=12) + # ax.set_ylim(-1,zlen) + # ax.set_yticks(range(zlen)) + # ax.set_yticks(z[0:-1:2]) + ax.set_ylabel('Height (m MSL)',fontsize=12) + ax.legend(loc='upper right', fontsize='large') + ax.set_xlabel('Cloud Frequency',fontsize=12) + if campaign in ['HISCALE', 'ACEENA']: + ax.set_title(IOP,fontsize=15) + else: + ax.set_title(campaign,fontsize=15) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_flight_profile_z_LWC.py b/src/esmac_diags/plotting/plot_flight_profile_z_LWC.py index 705b575..c49406f 100644 --- a/src/esmac_diags/plotting/plot_flight_profile_z_LWC.py +++ b/src/esmac_diags/plotting/plot_flight_profile_z_LWC.py @@ -3,8 +3,6 @@ # compare models and aircraft measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -13,186 +11,194 @@ from ..subroutines.read_netcdf import read_extractflight from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg -#%% settings +def run_plot(settings): -from settings import campaign, Model_List, color_model, \ - height_bin, E3SM_aircraft_path, figpath_aircraft_statistics - -if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, wcmpath -elif campaign in ['CSET', 'SOCRATES']: - from settings import RFpath -else: - raise ValueError('campaign name is not recognized: '+campaign) - -if not os.path.exists(figpath_aircraft_statistics): - os.makedirs(figpath_aircraft_statistics) - + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + height_bin = settings['height_bin'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_statistics = settings['figpath_aircraft_statistics'] -#%% -z=height_bin -dz = z[1]-z[0] -zmin=z-np.insert((z[1:]-z[0:-1])/2,0,dz) -zmax=z+np.append((z[1:]-z[0:-1])/2,dz) - -zlen=len(z) - -#%% find files for flight information + if campaign in ['HISCALE', 'ACEENA']: + IOP = settings.get('IOP', None) + wcmpath = settings.get('wcmpath', None) + elif campaign in ['CSET', 'SOCRATES']: + RFpath = settings.get('RFpath', None) + else: + raise ValueError('campaign name is not recognized: '+campaign) -lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') -lst.sort() -if len(lst)==0: - raise ValueError('cannot find any file') -# choose files for specific IOP -if campaign=='HISCALE': - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() -elif campaign=='ACEENA': - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() + #%% other settings + + if not os.path.exists(figpath_aircraft_statistics): + os.makedirs(figpath_aircraft_statistics) + -alldates = [x.split('_')[-1].split('.')[0] for x in lst] + #%% + z=height_bin + dz = z[1]-z[0] + zmin=z-np.insert((z[1:]-z[0:-1])/2,0,dz) + zmax=z+np.append((z[1:]-z[0:-1])/2,dz) -#%% read all data - -heightall=[] -lwcobsall=[] -lwcmall=[] - -nmodels=len(Model_List) -for mm in range(nmodels): - lwcmall.append([]) + zlen=len(z) -print('reading '+format(len(alldates))+' files to calculate the statistics: ') - -for date in alldates: - print(date) - - #%% read in obs - if campaign in ['HISCALE', 'ACEENA']: - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 - - filename_wcm = glob.glob(wcmpath+'WCM_G1_'+date[0:8]+'*') - filename_wcm.sort() - if len(filename_wcm)==0: - print('skip this date: '+date) - continue - (wcm,wcmlist)=read_wcm(filename_wcm[flightidx-1]) - time0=wcm[0,:] - flag=wcm[-1,:] - lwcobs=wcm[2,:] - lwcobs=qc_remove_neg(lwcobs) - lwcobs=qc_mask_qcflag(lwcobs,flag) + #%% find files for flight information - elif campaign in ['CSET', 'SOCRATES']: - filename = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') - if len(filename)==1 or len(filename)==2: # SOCRATES has two flights in 20180217, choose the later one - (time,lwcobs,timeunit,lwcunit,lwclongname,cellsize,cellunit)=read_RF_NCAR(filename[-1],'PLWCC') - lwcobs=qc_remove_neg(lwcobs) + lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') + lst.sort() + if len(lst)==0: + raise ValueError('cannot find any file') + # choose files for specific IOP + if campaign=='HISCALE': + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + elif campaign=='ACEENA': + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + + alldates = [x.split('_')[-1].split('.')[0] for x in lst] - lwcobsall.append(lwcobs) + #%% read all data - #%% read in models + heightall=[] + lwcobsall=[] + lwcmall=[] + nmodels=len(Model_List) for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + lwcmall.append([]) + + print('reading '+format(len(alldates))+' files to calculate the statistics: ') + + for date in alldates: + print(date) + + #%% read in obs + if campaign in ['HISCALE', 'ACEENA']: + if date[-1]=='a': + flightidx=1 + else: + flightidx=2 + + filename_wcm = glob.glob(wcmpath+'WCM_G1_'+date[0:8]+'*') + filename_wcm.sort() + if len(filename_wcm)==0: + print('skip this date: '+date) + continue + (wcm,wcmlist)=read_wcm(filename_wcm[flightidx-1]) + time0=wcm[0,:] + flag=wcm[-1,:] + lwcobs=wcm[2,:] + lwcobs=qc_remove_neg(lwcobs) + lwcobs=qc_mask_qcflag(lwcobs,flag) - (timem,heightm,lwc,timeunit,cldunit,cldname)=read_extractflight(filename_m,'LWC') + elif campaign in ['CSET', 'SOCRATES']: + filename = glob.glob(RFpath+'RF*'+date+'*.PNI.nc') + if len(filename)==1 or len(filename)==2: # SOCRATES has two flights in 20180217, choose the later one + (time,lwcobs,timeunit,lwcunit,lwclongname,cellsize,cellunit)=read_RF_NCAR(filename[-1],'PLWCC') + lwcobs=qc_remove_neg(lwcobs) - # change E3SM unit from kg/m3 to g/m3 - lwcmall[mm].append(lwc*1000) + lwcobsall.append(lwcobs) - heightall.append(heightm) + #%% read in models + + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + + (timem,heightm,lwc,timeunit,cldunit,cldname)=read_extractflight(filename_m,'LWC') + + # change E3SM unit from kg/m3 to g/m3 + lwcmall[mm].append(lwc*1000) + + heightall.append(heightm) + + #%% calculate percentiles for each height bin -#%% calculate percentiles for each height bin - -lwcobs_z = list() -lwcm_z = [] -for mm in range(nmodels): - lwcm_z.append([]) -for zz in range(zlen): - lwcobs_z.append(np.empty(0)) + lwcobs_z = list() + lwcm_z = [] for mm in range(nmodels): - lwcm_z[mm].append(np.empty(0)) - -ndays=len(heightall) -# ndays=1; -for dd in range(ndays): - height = heightall[dd] - lwcobs = lwcobsall[dd] + lwcm_z.append([]) for zz in range(zlen): - idx = np.logical_and(height>=zmin[zz], height=zmin[zz], height0: - lwcmean_o[zz] = np.mean(data) - std_lwc_o[zz] = np.std(data)/np.sqrt(len(data)) + lwcobs_z[zz]=np.append(lwcobs_z[zz],lwcobs[idx]) + + for mm in range(nmodels): + lwcm = lwcmall[mm][dd] + for zz in range(zlen): + idx = np.logical_and(height>=zmin[zz], height0: - lwcmean_m[mm][zz] = np.mean(data) - -#%% plot frequency -if campaign in ['HISCALE', 'ACEENA']: - figname = figpath_aircraft_statistics+'profile_height_LWC_'+campaign+'_'+IOP+'.png' -else: - figname = figpath_aircraft_statistics+'profile_height_LWC_'+campaign+'.png' -print('plotting figures to '+figname) - -fig,ax = plt.subplots(figsize=(3,8)) - -ax.plot(lwcmean_o,z,color='k',linewidth=1,linestyle='-',label='Obs') -ax.fill_betweenx(z,lwcmean_o-std_lwc_o,lwcmean_o+std_lwc_o,facecolor='k',alpha=0.2) - -for mm in range(nmodels): - ax.plot(lwcmean_m[mm],z,color=color_model[mm],linewidth=1,label=Model_List[mm]) - -ax.tick_params(color='k',labelsize=16) -# ax.set_ylim(-1,zlen) -# ax.set_yticks(range(zlen)) -if campaign=='HISCALE': - ax.set_ylim(0,4500) -ax.set_yticks(z) -ax.set_ylabel('Height (m MSL)',fontsize=16) -ax.legend(loc='upper right', fontsize='large') -ax.set_xlabel('LWC (g/m3)',fontsize=16) -if campaign in ['HISCALE', 'ACEENA']: - ax.set_title(IOP,fontsize=18) -else: - ax.set_title(campaign,fontsize=18) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - - + lwcmean_o[zz] = np.mean(data) + std_lwc_o[zz] = np.std(data)/np.sqrt(len(data)) + for mm in range(nmodels): + data = lwcm_z[mm][zz] + data = data[~np.isnan(data)] + if len(data)>0: + lwcmean_m[mm][zz] = np.mean(data) + + #%% plot frequency + if campaign in ['HISCALE', 'ACEENA']: + figname = figpath_aircraft_statistics+'profile_height_LWC_'+campaign+'_'+IOP+'.png' + else: + figname = figpath_aircraft_statistics+'profile_height_LWC_'+campaign+'.png' + print('plotting figures to '+figname) + + fig,ax = plt.subplots(figsize=(3,8)) + + ax.plot(lwcmean_o,z,color='k',linewidth=1,linestyle='-',label='Obs') + ax.fill_betweenx(z,lwcmean_o-std_lwc_o,lwcmean_o+std_lwc_o,facecolor='k',alpha=0.2) + + for mm in range(nmodels): + ax.plot(lwcmean_m[mm],z,color=color_model[mm],linewidth=1,label=Model_List[mm]) + + ax.tick_params(color='k',labelsize=16) + # ax.set_ylim(-1,zlen) + # ax.set_yticks(range(zlen)) + if campaign=='HISCALE': + ax.set_ylim(0,4500) + ax.set_yticks(z) + ax.set_ylabel('Height (m MSL)',fontsize=16) + ax.legend(loc='upper right', fontsize='large') + ax.set_xlabel('LWC (g/m3)',fontsize=16) + if campaign in ['HISCALE', 'ACEENA']: + ax.set_title(IOP,fontsize=18) + else: + ax.set_title(campaign,fontsize=18) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + + diff --git a/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py b/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py index 9d12fe7..ead49b5 100644 --- a/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py +++ b/src/esmac_diags/plotting/plot_flight_timeseries_AerosolComposition.py @@ -13,20 +13,9 @@ from ..subroutines.read_netcdf import read_merged_size,read_extractflight from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg - def run_plot(settings): - #%% settings - - # from settings import campaign, Model_List, color_model, \ - # E3SM_aircraft_path, figpath_aircraft_timeseries - - # if campaign in ['HISCALE', 'ACEENA']: - # from settings import IOP, merged_size_path, amspath, iwgpath - # elif campaign in ['CSET', 'SOCRATES']: - # raise ValueError('CSET and SOCRATES do not have composition data') - # else: - # raise ValueError('campaign name is not recognized: '+campaign) - + + #%% variables from settings campaign = settings['campaign'] Model_List = settings['Model_List'] color_model = settings['color_model'] @@ -42,6 +31,8 @@ def run_plot(settings): raise ValueError('CSET and SOCRATES do not have composition data') elif campaign not in ['HISCALE', 'ACEENA']: raise ValueError('campaign name is not recognized: '+campaign) + + #%% other settings if not os.path.exists(figpath_aircraft_timeseries): os.makedirs(figpath_aircraft_timeseries) @@ -204,14 +195,14 @@ def run_plot(settings): ax1.plot(timem2, so4_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) # ax1.set_yscale('log') ax1.tick_params(color='k',labelsize=12) - ylim1 = ax1.get_ylim() + # ylim1 = ax1.get_ylim() ax2.plot(time_ams/3600,orgaaf,color='k',linewidth=1,label='OBS') for mm in range(nmodels): ax2.plot(timem2, org_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) # ax2.set_yscale('log') ax2.tick_params(color='k',labelsize=12) - ylim2 = ax2.get_ylim() + # ylim2 = ax2.get_ylim() ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) diff --git a/src/esmac_diags/plotting/plot_flight_timeseries_CCN.py b/src/esmac_diags/plotting/plot_flight_timeseries_CCN.py index 9728a12..42d36f1 100644 --- a/src/esmac_diags/plotting/plot_flight_timeseries_CCN.py +++ b/src/esmac_diags/plotting/plot_flight_timeseries_CCN.py @@ -4,8 +4,6 @@ # compare models and aircraft measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -15,206 +13,213 @@ from ..subroutines.read_netcdf import read_extractflight from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg -#%% settings - -from settings import campaign, Model_List, color_model, \ - E3SM_aircraft_path, figpath_aircraft_timeseries +def run_plot(settings): -if campaign in ['HISCALE', 'ACEENA']: - from settings import ccnpath, IOP -elif campaign in ['CSET', 'SOCRATES']: - from settings import ccnpath -else: - raise ValueError('campaign name is not recognized: '+campaign) - -if not os.path.exists(figpath_aircraft_timeseries): - os.makedirs(figpath_aircraft_timeseries) + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_timeseries = settings['figpath_aircraft_timeseries'] + if campaign in ['HISCALE', 'ACEENA']: + IOP = settings.get('IOP', None) + ccnpath = settings.get('ccnpath', None) + elif campaign in ['CSET', 'SOCRATES']: + ccnpath = settings.get('ccnpath', None) + else: + raise ValueError('campaign name is not recognized: '+campaign) -#%% find files for flight information -lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') -lst.sort() -if len(lst)==0: - raise ValueError('cannot find any file') -# choose files for specific IOP -if campaign=='HISCALE': - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() -elif campaign=='ACEENA': - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+Model_List[0]+'_') - lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') - lst.sort() - -alldates = [x.split('_')[-1].split('.')[0] for x in lst] - -# for each flight -for date in alldates: - - #%% read in Models - nmodels=len(Model_List) - ccn3_m = [] - ccn5_m = [] - for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - - (timem,heightm,ccn3,timeunitm,ccn3_unit,ccn3_longname)=read_extractflight(filename_m,'CCN3') - (timem,heightm,ccn5,timeunitm,ccn5_unit,ccn5_longname)=read_extractflight(filename_m,'CCN5') + #%% other settings - ccn3_m.append(ccn3) - ccn5_m.append(ccn5) + if not os.path.exists(figpath_aircraft_timeseries): + os.makedirs(figpath_aircraft_timeseries) - # get supersaturation - SS3 = ccn3_longname.split('=')[-1] - SS5 = ccn5_longname.split('=')[-1] - timem2 = timem/3600 - #%% read in flight data (for HISCALE) + #%% find files for flight information + lst = glob.glob(E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[0]+'_*.nc') + lst.sort() + if len(lst)==0: + raise ValueError('cannot find any file') + # choose files for specific IOP if campaign=='HISCALE': - filename_ccn=glob.glob(ccnpath+'CCN_G1_'+date[0:8]+'*R2_HiScale001s.*') - filename_ccn.sort() - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 - # read in data - if len(filename_ccn)==1 or len(filename_ccn)==2: - (data0,ccnlist)=read_ccn_hiscale(filename_ccn[flightidx-1]) - # only choose data quality is good (flag=0) - flag = data0[7,:] - time_ccn = data0[0,:] - ccna = data0[10,:] - ccnb = data0[11,:] - SSa = data0[2,:] - SSb = data0[5,:] - ccna=qc_mask_qcflag(ccna,flag) - ccnb=qc_mask_qcflag(ccnb,flag) - elif len(filename_ccn)==0: - time_ccn=timem - ccna=np.nan*np.empty([len(timem)]) - ccnb=np.nan*np.empty([len(timem)]) - SSa=0.24 - SSb=0.46 - else: - raise ValueError('find too many files') - timea=time_ccn - timeb=time_ccn - + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() elif campaign=='ACEENA': - filename_ccna=glob.glob(ccnpath+'enaaafccn2colaF1.b1.'+date[0:8]+'*.nc') - filename_ccnb=glob.glob(ccnpath+'enaaafccn2colbF1.b1.'+date[0:8]+'*.nc') - # read in data - if len(filename_ccna)==1: - (timea,timeunita,ccna,qcflag,ccnunit,SSa)=read_ccn(filename_ccna[0]) - ccna=qc_mask_qcflag(ccna,qcflag) - ccna=qc_remove_neg(ccna) - SSa=qc_remove_neg(SSa) - elif len(filename_ccna)==0: - # print('no CCN data found. set as NaN') - timea=timem - SSa=np.nan*np.empty([len(timem)]) - ccna=np.nan*np.empty([len(timem)]) - else: - raise ValueError('find too many files') - if len(filename_ccnb)==1: - (timeb,timeunitb,ccnb,qcflag,ccnunit,SSb)=read_ccn(filename_ccnb[0]) - ccnb=qc_mask_qcflag(ccnb,qcflag) - ccnb=qc_remove_neg(ccnb) - SSb=qc_remove_neg(SSb) - elif len(filename_ccnb)==0: - # print('no CCN data found. set as NaN') - timeb=timem - SSb=np.nan*np.empty([len(timem)]) - ccnb=np.nan*np.empty([len(timem)]) - else: - raise ValueError('find too many files') + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+Model_List[0]+'_') + lst = glob.glob(a[0]+'_'+Model_List[0]+'_'+IOP+'*') + lst.sort() + + alldates = [x.split('_')[-1].split('.')[0] for x in lst] + + # for each flight + for date in alldates: - # CSET does not have observed CCN - elif campaign=='CSET': - timea=timem - SSa=np.nan*np.empty([len(timem)]) - ccna=np.nan*np.empty([len(timem)]) - timeb=timem - SSb=np.nan*np.empty([len(timem)]) - ccnb=np.nan*np.empty([len(timem)]) + #%% read in Models + nmodels=len(Model_List) + ccn3_m = [] + ccn5_m = [] + for mm in range(nmodels): + filename_m = E3SM_aircraft_path+'Aircraft_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + + (timem,heightm,ccn3,timeunitm,ccn3_unit,ccn3_longname)=read_extractflight(filename_m,'CCN3') + (timem,heightm,ccn5,timeunitm,ccn5_unit,ccn5_longname)=read_extractflight(filename_m,'CCN5') + + ccn3_m.append(ccn3) + ccn5_m.append(ccn5) + + # get supersaturation + SS3 = ccn3_longname.split('=')[-1] + SS5 = ccn5_longname.split('=')[-1] + timem2 = timem/3600 - # SOCRATES - elif campaign=='SOCRATES': - filename_ccn=glob.glob(ccnpath+'CCNscanning_SOCRATES_GV_RF*'+date[0:8]+'_R0.ict') - if len(filename_ccn)==1: - (data0,ccnlist)=read_ccn_socrates(filename_ccn[0]) - time_ccn = data0[0,:] - ccn = data0[1,:] - SS = data0[3,:] - ccn=qc_remove_neg(ccn) + #%% read in flight data (for HISCALE) + if campaign=='HISCALE': + filename_ccn=glob.glob(ccnpath+'CCN_G1_'+date[0:8]+'*R2_HiScale001s.*') + filename_ccn.sort() + if date[-1]=='a': + flightidx=1 + else: + flightidx=2 + # read in data + if len(filename_ccn)==1 or len(filename_ccn)==2: + (data0,ccnlist)=read_ccn_hiscale(filename_ccn[flightidx-1]) + # only choose data quality is good (flag=0) + flag = data0[7,:] + time_ccn = data0[0,:] + ccna = data0[10,:] + ccnb = data0[11,:] + SSa = data0[2,:] + SSb = data0[5,:] + ccna=qc_mask_qcflag(ccna,flag) + ccnb=qc_mask_qcflag(ccnb,flag) + elif len(filename_ccn)==0: + time_ccn=timem + ccna=np.nan*np.empty([len(timem)]) + ccnb=np.nan*np.empty([len(timem)]) + SSa=0.24 + SSb=0.46 + else: + raise ValueError('find too many files') timea=time_ccn timeb=time_ccn - ccna=np.array(ccn) - ccnb=np.array(ccn) - idxa=np.logical_and(SS>0.05, SS<0.15) - ccna[idxa==False]=np.nan - SSa=0.1 - idxb=np.logical_and(SS>0.45, SS<0.55) - ccnb[idxb==False]=np.nan - SSb=0.5 - elif len(filename_ccn)==0: + + elif campaign=='ACEENA': + filename_ccna=glob.glob(ccnpath+'enaaafccn2colaF1.b1.'+date[0:8]+'*.nc') + filename_ccnb=glob.glob(ccnpath+'enaaafccn2colbF1.b1.'+date[0:8]+'*.nc') + # read in data + if len(filename_ccna)==1: + (timea,timeunita,ccna,qcflag,ccnunit,SSa)=read_ccn(filename_ccna[0]) + ccna=qc_mask_qcflag(ccna,qcflag) + ccna=qc_remove_neg(ccna) + SSa=qc_remove_neg(SSa) + elif len(filename_ccna)==0: + # print('no CCN data found. set as NaN') + timea=timem + SSa=np.nan*np.empty([len(timem)]) + ccna=np.nan*np.empty([len(timem)]) + else: + raise ValueError('find too many files') + if len(filename_ccnb)==1: + (timeb,timeunitb,ccnb,qcflag,ccnunit,SSb)=read_ccn(filename_ccnb[0]) + ccnb=qc_mask_qcflag(ccnb,qcflag) + ccnb=qc_remove_neg(ccnb) + SSb=qc_remove_neg(SSb) + elif len(filename_ccnb)==0: + # print('no CCN data found. set as NaN') + timeb=timem + SSb=np.nan*np.empty([len(timem)]) + ccnb=np.nan*np.empty([len(timem)]) + else: + raise ValueError('find too many files') + + # CSET does not have observed CCN + elif campaign=='CSET': timea=timem SSa=np.nan*np.empty([len(timem)]) ccna=np.nan*np.empty([len(timem)]) timeb=timem SSb=np.nan*np.empty([len(timem)]) ccnb=np.nan*np.empty([len(timem)]) - else: - raise ValueError('find too many files') + # SOCRATES + elif campaign=='SOCRATES': + filename_ccn=glob.glob(ccnpath+'CCNscanning_SOCRATES_GV_RF*'+date[0:8]+'_R0.ict') + if len(filename_ccn)==1: + (data0,ccnlist)=read_ccn_socrates(filename_ccn[0]) + time_ccn = data0[0,:] + ccn = data0[1,:] + SS = data0[3,:] + ccn=qc_remove_neg(ccn) + timea=time_ccn + timeb=time_ccn + ccna=np.array(ccn) + ccnb=np.array(ccn) + idxa=np.logical_and(SS>0.05, SS<0.15) + ccna[idxa==False]=np.nan + SSa=0.1 + idxb=np.logical_and(SS>0.45, SS<0.55) + ccnb[idxb==False]=np.nan + SSb=0.5 + elif len(filename_ccn)==0: + timea=timem + SSa=np.nan*np.empty([len(timem)]) + ccna=np.nan*np.empty([len(timem)]) + timeb=timem + SSb=np.nan*np.empty([len(timem)]) + ccnb=np.nan*np.empty([len(timem)]) + else: + raise ValueError('find too many files') + + + + #%% make plot - - #%% make plot + figname = figpath_aircraft_timeseries+'CCN_'+campaign+'_'+date+'.png' + print('plotting figures to '+figname) - figname = figpath_aircraft_timeseries+'CCN_'+campaign+'_'+date+'.png' - print('plotting figures to '+figname) - - fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.plot(timea/3600,ccna,'k.',linewidth=1,label='OBS') - for mm in range(nmodels): - ax1.plot(timem2, ccn3_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - # ax1.set_yscale('log') - ax1.tick_params(color='k',labelsize=12) - ylim1 = ax1.get_ylim() - - ax2.plot(timeb/3600,ccnb,'k.',linewidth=1,label='OBS') - for mm in range(nmodels): - ax2.plot(timem2, ccn5_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - # ax2.set_yscale('log') - ax2.tick_params(color='k',labelsize=12) - ylim2 = ax2.get_ylim() - - # set ylimit consistent in subplots - ax1.set_ylim([ylim1[0], ylim2[1]]) - ax2.set_ylim([ylim1[0], ylim2[1]]) - - ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) - ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) - - # supersaturation - fig.text(0.67,0.9,'SS_obs='+format(np.nanmean(SSa),'.2f')+'%, SS_model='+SS3) - fig.text(0.67,0.4,'SS_obs='+format(np.nanmean(SSb),'.2f')+'%, SS_model='+SS5) - - ax2.set_xlabel('time (hour UTC) '+date,fontsize=14) - ax1.set_title('CCN Number Concentration (cm$^{-3}$)',fontsize=15) - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - plt.close() - \ No newline at end of file + fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.plot(timea/3600,ccna,'k.',linewidth=1,label='OBS') + for mm in range(nmodels): + ax1.plot(timem2, ccn3_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax1.set_yscale('log') + ax1.tick_params(color='k',labelsize=12) + ylim1 = ax1.get_ylim() + + ax2.plot(timeb/3600,ccnb,'k.',linewidth=1,label='OBS') + for mm in range(nmodels): + ax2.plot(timem2, ccn5_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax2.set_yscale('log') + ax2.tick_params(color='k',labelsize=12) + ylim2 = ax2.get_ylim() + + # set ylimit consistent in subplots + ax1.set_ylim([ylim1[0], ylim2[1]]) + ax2.set_ylim([ylim1[0], ylim2[1]]) + + ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + + # supersaturation + fig.text(0.67,0.9,'SS_obs='+format(np.nanmean(SSa),'.2f')+'%, SS_model='+SS3) + fig.text(0.67,0.4,'SS_obs='+format(np.nanmean(SSb),'.2f')+'%, SS_model='+SS5) + + ax2.set_xlabel('time (hour UTC) '+date,fontsize=14) + ax1.set_title('CCN Number Concentration (cm$^{-3}$)',fontsize=15) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + plt.close() + \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_flight_timeseries_CN.py b/src/esmac_diags/plotting/plot_flight_timeseries_CN.py index 4135d90..dda0a53 100644 --- a/src/esmac_diags/plotting/plot_flight_timeseries_CN.py +++ b/src/esmac_diags/plotting/plot_flight_timeseries_CN.py @@ -4,8 +4,6 @@ # compare models and CPC measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -14,159 +12,166 @@ from ..subroutines.read_netcdf import read_merged_size,read_extractflight from ..subroutines.quality_control import qc_cpc_air -#%% settings - -from settings import campaign, Model_List, color_model, \ - E3SM_aircraft_path, figpath_aircraft_timeseries - -if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, cpcpath,merged_size_path -elif campaign in ['CSET', 'SOCRATES']: - from settings import RFpath -else: - raise ValueError('campaign name is not recognized: '+campaign) +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] + figpath_aircraft_timeseries = settings['figpath_aircraft_timeseries'] -if not os.path.exists(figpath_aircraft_timeseries): - os.makedirs(figpath_aircraft_timeseries) - - -#%% find files for flight information -if campaign in ['HISCALE', 'ACEENA']: - lst = glob.glob(merged_size_path+'merged_bin_*'+campaign+'*.nc') -elif campaign in ['CSET', 'SOCRATES']: - lst = glob.glob(RFpath+'RF*.PNI.nc') -else: - raise ValueError('campaign name is not recognized: '+campaign) -lst.sort() + if campaign in ['HISCALE', 'ACEENA']: + IOP = settings.get('IOP', None) + merged_size_path = settings.get('merged_size_path', None) + cpcpath = settings.get('cpcpath', None) + elif campaign in ['CSET', 'SOCRATES']: + RFpath = settings.get('RFpath', None) + else: + raise ValueError('campaign name is not recognized: '+campaign) -if len(lst)==0: - raise ValueError('cannot find any file') - -# choose files for specific IOP -if campaign=='HISCALE': - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+campaign+'_') - lst = glob.glob(a[0]+'*'+IOP+'*') - lst.sort() -elif campaign=='ACEENA': - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+campaign+'_') - lst = glob.glob(a[0]+'*'+IOP+'*') - lst.sort() + #%% other settings -# for each flight -for filename in lst: + if not os.path.exists(figpath_aircraft_timeseries): + os.makedirs(figpath_aircraft_timeseries) + - #%% read in flight data (for HISCALE and ACEENA) + #%% find files for flight information if campaign in ['HISCALE', 'ACEENA']: - # get date info: - date=filename[-12:-3] - if date[-1]=='a': - flightidx=1 - else: - flightidx=2 + lst = glob.glob(merged_size_path+'merged_bin_*'+campaign+'*.nc') + elif campaign in ['CSET', 'SOCRATES']: + lst = glob.glob(RFpath+'RF*.PNI.nc') + else: + raise ValueError('campaign name is not recognized: '+campaign) + lst.sort() - #% read in flight information - (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') - time=np.ma.compressed(time) - if campaign=='HISCALE': - filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_HiScale001s.ict.txt') - elif campaign=='ACEENA': - filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_ACEENA001s.ict') - filename_c.sort() - # read in data - if len(filename_c)==1 or len(filename_c)==2: # some days have two flights - (cpc,cpclist)=read_cpc(filename_c[flightidx-1]) - if np.logical_and(campaign=='ACEENA', date=='20180216a'): - cpc=np.insert(cpc,1404,(cpc[:,1403]+cpc[:,1404])/2,axis=1) - time_cpc = cpc[0,:] - cpc10 = cpc[1,:] - cpc3 = cpc[2,:] - elif len(filename_c)==0: - time_cpc=time - cpc10=np.nan*np.empty([len(time)]) - cpc3=np.nan*np.empty([len(time)]) - else: - raise ValueError('find too many files') - # some quality checks - (cpc3,cpc10) = qc_cpc_air(cpc3,cpc10) + if len(lst)==0: + raise ValueError('cannot find any file') + + # choose files for specific IOP + if campaign=='HISCALE': + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+campaign+'_') + lst = glob.glob(a[0]+'*'+IOP+'*') + lst.sort() + elif campaign=='ACEENA': + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+campaign+'_') + lst = glob.glob(a[0]+'*'+IOP+'*') + lst.sort() - #%% read in flight data (for CSET and SOCRATES) - elif campaign in ['CSET', 'SOCRATES']: - fname=filename.split('.') - date=fname[-4] - (time_cpc,cpc10,timeunit,cpc10unit,cpc10longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCN') - if campaign=='CSET': - (time_cpc,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCU100_RWOOU') - elif campaign=='SOCRATES': - # there are two variables: CONCU100_CVIU and CONCU100_LWII - (time_cpc,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCU100_LWII') + # for each flight + for filename in lst: - #%% read in Models - nmodels=len(Model_List) - cpc100_m = [] - cpc10_m = [] - cpc3_m = [] - for mm in range(nmodels): - filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - - (timem,heightm,cpc_m,timeunitm,ncn_unit,ncn_longname)=read_extractflight(filename_m,'NCN') - (timem,heightm,cpcu_m,timeunitm,ncnu_unit,ncnu_longname)=read_extractflight(filename_m,'NUCN') - (timem,heightm,ncnall,timeunitm,ncnall_unit,ncnall_longname)=read_extractflight(filename_m,'NCNall') - # if len(cpc_m)!=cpc.shape[1]: - # print('CPC and MAM have different dimensions! check') - # print(cpc.shape,cpc_m.shape) - # errors - cpc100_m.append(np.sum(ncnall[100:,:],0)*1e-6) # #/m3 to #/cm3 - cpc10_m.append(cpc_m*1e-6) # #/m3 to #/cm3 - cpc3_m.append(cpcu_m*1e-6) # #/m3 to #/cm3 - - timem2 = timem/3600 - - #%% make plot + #%% read in flight data (for HISCALE and ACEENA) + if campaign in ['HISCALE', 'ACEENA']: + # get date info: + date=filename[-12:-3] + if date[-1]=='a': + flightidx=1 + else: + flightidx=2 - figname = figpath_aircraft_timeseries+'CN_'+campaign+'_'+date+'.png' - print('plotting figures to '+figname) - - fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.plot(time_cpc/3600,cpc10,color='k',linewidth=1,label='CPC(>10nm)') - for mm in range(nmodels): - ax1.plot(timem2, cpc10_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - ax1.set_yscale('log') - ax1.tick_params(color='k',labelsize=12) - ylim1 = ax1.get_ylim() - - if campaign in ['HISCALE', 'ACEENA']: - ax2.plot(time_cpc/3600,cpc3,color='k',linewidth=1,label='CPC(>3nm)') + #% read in flight information + (time,size,cvi,timeunit,cunit,long_name)=read_merged_size(filename,'CVI_inlet') + time=np.ma.compressed(time) + if campaign=='HISCALE': + filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_HiScale001s.ict.txt') + elif campaign=='ACEENA': + filename_c=glob.glob(cpcpath+'CPC_G1_'+date[0:8]+'*R2_ACEENA001s.ict') + filename_c.sort() + # read in data + if len(filename_c)==1 or len(filename_c)==2: # some days have two flights + (cpc,cpclist)=read_cpc(filename_c[flightidx-1]) + if np.logical_and(campaign=='ACEENA', date=='20180216a'): + cpc=np.insert(cpc,1404,(cpc[:,1403]+cpc[:,1404])/2,axis=1) + time_cpc = cpc[0,:] + cpc10 = cpc[1,:] + cpc3 = cpc[2,:] + elif len(filename_c)==0: + time_cpc=time + cpc10=np.nan*np.empty([len(time)]) + cpc3=np.nan*np.empty([len(time)]) + else: + raise ValueError('find too many files') + # some quality checks + (cpc3,cpc10) = qc_cpc_air(cpc3,cpc10) + + #%% read in flight data (for CSET and SOCRATES) + elif campaign in ['CSET', 'SOCRATES']: + fname=filename.split('.') + date=fname[-4] + (time_cpc,cpc10,timeunit,cpc10unit,cpc10longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCN') + if campaign=='CSET': + (time_cpc,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCU100_RWOOU') + elif campaign=='SOCRATES': + # there are two variables: CONCU100_CVIU and CONCU100_LWII + (time_cpc,uhsas100,timeunit,uhsas100unit,uhsas100longname,cellsize,cellunit)=read_RF_NCAR(filename,'CONCU100_LWII') + + #%% read in Models + nmodels=len(Model_List) + cpc100_m = [] + cpc10_m = [] + cpc3_m = [] for mm in range(nmodels): - ax2.plot(timem2, cpc3_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - elif campaign in ['CSET', 'SOCRATES']: - ax2.plot(time_cpc/3600,uhsas100,color='k',linewidth=1,label='UHSAS(>100nm)') + filename_m = E3SM_aircraft_path+'Aircraft_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + + (timem,heightm,cpc_m,timeunitm,ncn_unit,ncn_longname)=read_extractflight(filename_m,'NCN') + (timem,heightm,cpcu_m,timeunitm,ncnu_unit,ncnu_longname)=read_extractflight(filename_m,'NUCN') + (timem,heightm,ncnall,timeunitm,ncnall_unit,ncnall_longname)=read_extractflight(filename_m,'NCNall') + # if len(cpc_m)!=cpc.shape[1]: + # print('CPC and MAM have different dimensions! check') + # print(cpc.shape,cpc_m.shape) + # errors + cpc100_m.append(np.sum(ncnall[100:,:],0)*1e-6) # #/m3 to #/cm3 + cpc10_m.append(cpc_m*1e-6) # #/m3 to #/cm3 + cpc3_m.append(cpcu_m*1e-6) # #/m3 to #/cm3 + + timem2 = timem/3600 + + #%% make plot + + figname = figpath_aircraft_timeseries+'CN_'+campaign+'_'+date+'.png' + print('plotting figures to '+figname) + + fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.plot(time_cpc/3600,cpc10,color='k',linewidth=1,label='CPC(>10nm)') for mm in range(nmodels): - ax2.plot(timem2, cpc100_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - ax2.set_yscale('log') - ax2.tick_params(color='k',labelsize=12) - ylim2 = ax2.get_ylim() - - # set ylimit consistent in subplots - ax1.set_ylim([max(1,min(ylim1[0],ylim2[0])), max(ylim1[1],ylim2[1])]) - ax2.set_ylim([max(1,min(ylim1[0],ylim2[0])), max(ylim1[1],ylim2[1])]) - - ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) - ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) - - ax2.set_xlabel('time (hour UTC) '+date,fontsize=14) - ax1.set_title('Aerosol Number Concentration (cm$^{-3}$)',fontsize=15) - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - # plt.close() \ No newline at end of file + ax1.plot(timem2, cpc10_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax1.set_yscale('log') + ax1.tick_params(color='k',labelsize=12) + ylim1 = ax1.get_ylim() + + if campaign in ['HISCALE', 'ACEENA']: + ax2.plot(time_cpc/3600,cpc3,color='k',linewidth=1,label='CPC(>3nm)') + for mm in range(nmodels): + ax2.plot(timem2, cpc3_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + elif campaign in ['CSET', 'SOCRATES']: + ax2.plot(time_cpc/3600,uhsas100,color='k',linewidth=1,label='UHSAS(>100nm)') + for mm in range(nmodels): + ax2.plot(timem2, cpc100_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax2.set_yscale('log') + ax2.tick_params(color='k',labelsize=12) + ylim2 = ax2.get_ylim() + + # set ylimit consistent in subplots + ax1.set_ylim([max(1,min(ylim1[0],ylim2[0])), max(ylim1[1],ylim2[1])]) + ax2.set_ylim([max(1,min(ylim1[0],ylim2[0])), max(ylim1[1],ylim2[1])]) + + ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + + ax2.set_xlabel('time (hour UTC) '+date,fontsize=14) + ax1.set_title('Aerosol Number Concentration (cm$^{-3}$)',fontsize=15) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + plt.close() \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_flight_track_height.py b/src/esmac_diags/plotting/plot_flight_track_height.py index 2af3632..9801c1b 100644 --- a/src/esmac_diags/plotting/plot_flight_track_height.py +++ b/src/esmac_diags/plotting/plot_flight_track_height.py @@ -15,16 +15,7 @@ def run_plot(settings): - #%% settings - #from settings import campaign, lat0, lon0, figpath_aircraft_timeseries - - #if campaign in ['HISCALE', 'ACEENA']: - # from settings import IOP, iwgpath, cvipath - #elif campaign in ['CSET', 'SOCRATES']: - # from settings import RFpath - #else: - # raise ValueError('campaign name is not recognized: '+campaign) - + #%% variables from settings campaign = settings['campaign'] lat0 = settings['lat0'] lon0 = settings['lon0'] @@ -35,8 +26,8 @@ def run_plot(settings): cvipath = settings.get('cvipath', None) RFpath = settings.get('RFpath', None) + #%% other settings - if not os.path.exists(figpath_aircraft_timeseries): os.makedirs(figpath_aircraft_timeseries) diff --git a/src/esmac_diags/plotting/plot_profile_cloud.py b/src/esmac_diags/plotting/plot_profile_cloud.py index 3ecf432..f0a5efc 100644 --- a/src/esmac_diags/plotting/plot_profile_cloud.py +++ b/src/esmac_diags/plotting/plot_profile_cloud.py @@ -4,8 +4,6 @@ # compare models and surface measurements """ -import sys - import os import matplotlib.pyplot as plt import numpy as np @@ -13,107 +11,117 @@ from ..subroutines.read_ARMdata import read_armbe from ..subroutines.read_netcdf import read_E3SM_z -#%% settings - -from settings import campaign, armbepath, Model_List, IOP, start_date, end_date, \ - lon0, E3SM_profile_path, figpath_profile_timeseries - -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date,'noleap') -cday2 = yyyymmdd2cday(end_date,'noleap') -if start_date[0:4]!=end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] - -if not os.path.exists(figpath_profile_timeseries): - os.makedirs(figpath_profile_timeseries) +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + lon0 = settings['lon0'] + Model_List = settings['Model_List'] + armbepath = settings['armbepath'] + start_date = settings['start_date'] + end_date = settings['end_date'] + E3SM_profile_path = settings['E3SM_profile_path'] + figpath_profile_timeseries = settings['figpath_profile_timeseries'] + IOP = settings.get('IOP', None) -#%% read in obs data -if campaign=='ACEENA': - if IOP=='IOP1': - filename_armbe = armbepath+'enaarmbecldradC1.c1.20170101.003000.nc' - year='2017' - elif IOP=='IOP2': - filename_armbe = armbepath+'enaarmbecldradC1.c1.20180101.003000.nc' - year='2018' -elif campaign=='HISCALE': - filename_armbe = armbepath+'sgparmbecldradC1.c1.20160101.003000.nc' - year='2016' + #%% other settings -(time0,height0,cld0,time0unit,cld0unit) = read_armbe(filename_armbe,'cld_frac') - - -time0=time0/86400.+timeunit2cday(time0unit) -if campaign=='HISCALE': - # observation is leap year. change the time for comparison with noleap model output. - # note that it is not suitable for January and February - time0=time0-1 + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date,'noleap') + cday2 = yyyymmdd2cday(end_date,'noleap') + if start_date[0:4]!=end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] + + if not os.path.exists(figpath_profile_timeseries): + os.makedirs(figpath_profile_timeseries) -#%% read in model - -cldm = [] -nmodels = len(Model_List) -for mm in range(nmodels): - timem=np.empty(0) - for cday in range(cday1,cday2+1): - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + + #%% read in obs data + if campaign=='ACEENA': + if IOP=='IOP1': + filename_armbe = armbepath+'enaarmbecldradC1.c1.20170101.003000.nc' + year='2017' + elif IOP=='IOP2': + filename_armbe = armbepath+'enaarmbecldradC1.c1.20180101.003000.nc' + year='2018' + elif campaign=='HISCALE': + filename_armbe = armbepath+'sgparmbecldradC1.c1.20160101.003000.nc' + year='2016' + + (time0,height0,cld0,time0unit,cld0unit) = read_armbe(filename_armbe,'cld_frac') + + + time0=time0/86400.+timeunit2cday(time0unit) + if campaign=='HISCALE': + # observation is leap year. change the time for comparison with noleap model output. + # note that it is not suitable for January and February + time0=time0-1 - filename_input = E3SM_profile_path+'Profile_vars_'+campaign+'_'+Model_List[mm]+'.'+date+'.nc' - (time,height,data,timemunit,dataunit,long_name)=read_E3SM_z(filename_input,'CLOUD') + #%% read in model + + cldm = [] + nmodels = len(Model_List) + for mm in range(nmodels): + timem=np.empty(0) + for cday in range(cday1,cday2+1): + mmdd=cday2mmdd(cday) + date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + + filename_input = E3SM_profile_path+'Profile_vars_'+campaign+'_'+Model_List[mm]+'.'+date+'.nc' + (time,height,data,timemunit,dataunit,long_name)=read_E3SM_z(filename_input,'CLOUD') + + timem = np.hstack((timem,time)) + if cday==cday1: + datam=data*100 + else: + datam = np.vstack((datam,data*100)) - timem = np.hstack((timem,time)) - if cday==cday1: - datam=data*100 - else: - datam = np.vstack((datam,data*100)) + data=data*100. + dataunit='%' + cldm.append(datam) - data=data*100. - dataunit='%' - cldm.append(datam) - -# change to local solar time -timeshift = lon0/360*24 -if timeshift>12: - timeshift=timeshift-24 -time0 = time0+timeshift/24. -timem = timem+timeshift/24. - -#%% plot cloud for each day in time_range - - -for cday in range(cday1,cday2+1): - idxo=np.logical_and(time0>cday-0.1, time0cday-0.1, timem12: + timeshift=timeshift-24 + time0 = time0+timeshift/24. + timem = timem+timeshift/24. - mmdd = cday2mmdd(cday) - figname = figpath_profile_timeseries+'cloudfraction_'+campaign+'_'+year+mmdd+'.png' - print('plotting figures to '+figname) + #%% plot cloud for each day in time_range - fig,ax = plt.subplots(nmodels+1,1,figsize=(6,2*nmodels+1)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - h0=ax[0].contourf(time0[idxo],height0/1000,cld0[idxo,:].T,np.arange(0,101,10),cmap=plt.get_cmap('jet')) - ax[0].set_title('Cloud Fraction (%) Obs') - ax[0].set_ylim(0,15) - ax[0].set_xlim(cday,cday+1) - ax[0].set_xticks(np.arange(cday,cday+1.01,0.125)) - ax[0].set_xticklabels([]) - ax[0].set_ylabel('Height (km)') - for mm in range(nmodels): - ax[mm+1].contourf(timem[idxm],height/1000,cldm[mm][idxm,:].T,np.arange(0,101,10),cmap=plt.get_cmap('jet')) - ax[mm+1].set_title(Model_List[mm]) - ax[mm+1].set_ylim(0,15) - ax[mm+1].set_xlim(cday,cday+1) - ax[mm+1].set_xticks(np.arange(cday,cday+1.01,0.125)) - ax[mm+1].set_xticklabels([]) - ax[mm+1].set_ylabel('Height (km)') + + for cday in range(cday1,cday2+1): + idxo=np.logical_and(time0>cday-0.1, time0cday-0.1, timem1: # not NaN + for dd in range(len(days)): + for tt in range(len(time_dc)): + time_tmp = days[dd]+time_dc[tt]/1440. + idx = np.abs(t_obs-time_tmp).argmin() + if (t_obs[idx]-time_tmp)*1440 <= 30: + so4_o_dc[tt,dd] = so4_obs[idx] + if len(org_obs)>1: + for dd in range(len(days)): + for tt in range(len(time_dc)): + time_tmp = days[dd]+time_dc[tt]/1440. + idx = np.abs(t_obs-time_tmp).argmin() + if (t_obs[idx]-time_tmp)*1440 <= 30: + org_o_dc[tt,dd] = org_obs[idx] + so4_o_dc = np.nanmean(so4_o_dc,1) + org_o_dc = np.nanmean(org_o_dc,1) + + # for E3SM data + so4_m_dc = [] + org_m_dc = [] + for mm in range(nmodels): + tmp_so4 = np.full((24,len(days)),np.nan) + tmp_org = np.full((24,len(days)),np.nan) + for dd in range(len(days)): + idx=np.logical_and(timem2>=days[dd], timem21: # not NaN - for dd in range(len(days)): - for tt in range(len(time_dc)): - time_tmp = days[dd]+time_dc[tt]/1440. - idx = np.abs(t_obs-time_tmp).argmin() - if (t_obs[idx]-time_tmp)*1440 <= 30: - so4_o_dc[tt,dd] = so4_obs[idx] -if len(org_obs)>1: - for dd in range(len(days)): - for tt in range(len(time_dc)): - time_tmp = days[dd]+time_dc[tt]/1440. - idx = np.abs(t_obs-time_tmp).argmin() - if (t_obs[idx]-time_tmp)*1440 <= 30: - org_o_dc[tt,dd] = org_obs[idx] -so4_o_dc = np.nanmean(so4_o_dc,1) -org_o_dc = np.nanmean(org_o_dc,1) - -# for E3SM data -so4_m_dc = [] -org_m_dc = [] -for mm in range(nmodels): - tmp_so4 = np.full((24,len(days)),np.nan) - tmp_org = np.full((24,len(days)),np.nan) - for dd in range(len(days)): - idx=np.logical_and(timem2>=days[dd], timem20.05, SS<0.15) + t_ccna = t_ccn[idx] + ccna = ccn[idx] + SSa = 0.1 + # SS=0.5% + idx = np.logical_and(SS>0.4, SS<0.6) + t_ccnb = t_ccn[idx] + ccnb = ccn[idx] + SSb = 0.5 -#%% read in obs data -if campaign=='ACEENA': - # cpc - if IOP=='IOP1': - lst = glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201706*')+glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201707*') - elif IOP=='IOP2': - lst = glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201801*')+glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201802*') - lst.sort() - t_ccn=np.empty(0) - ccn=np.empty(0) - SS=np.empty(0) - for filename in lst: - (time,timeunit,data,qc,dataunit,SS0)=read_ccn(filename) - data=qc_mask_qcflag(data,qc) - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - t_ccn=np.hstack((t_ccn, cday+time/86400)) - ccn=np.hstack((ccn, data)) - SS=np.hstack((SS, SS0)) - ccn=qc_remove_neg(ccn) - ccn=qc_ccn_max(ccn,SS) - # SS=0.1% - idx = np.logical_and(SS>0.05, SS<0.15) - t_ccna = t_ccn[idx] - ccna = ccn[idx] - SSa = 0.1 - # SS=0.5% - idx = np.logical_and(SS>0.4, SS<0.6) - t_ccnb = t_ccn[idx] - ccnb = ccn[idx] - SSb = 0.5 - -elif campaign=='HISCALE': - if IOP=='IOP1': - (times_ccn,ccnsfc,sssfc,timeunit)=read_CCN_hiscale_IOP1(ccnsfcpath) - sssfc=[int(x*10) for x in sssfc] - sssfc=np.array(sssfc)/10. - times_ccn=np.array(times_ccn) - ccnsfc=np.array(ccnsfc) - elif IOP=='IOP2': - (times_ccn,ccnsfc,sssfc,timeunit)=read_CCN_hiscale_IOP2(ccnsfcpath) - sssfc=[int(x*10) for x in sssfc] - sssfc=np.array(sssfc)/10. - times_ccn=np.array(times_ccn) - ccnsfc=np.array(ccnsfc) - # find the nearest Supersaturation in Obs comparing to model - # 0.1% - idx = sssfc==0.1 - ccna = ccnsfc[idx] - t_ccna = times_ccn[idx] - SSa = 0.1 - # 0.5% - idx = sssfc==0.5 - ccnb = ccnsfc[idx] - t_ccnb = times_ccn[idx] - SSb = 0.5 + elif campaign=='HISCALE': + if IOP=='IOP1': + (times_ccn,ccnsfc,sssfc,timeunit)=read_CCN_hiscale_IOP1(ccnsfcpath) + sssfc=[int(x*10) for x in sssfc] + sssfc=np.array(sssfc)/10. + times_ccn=np.array(times_ccn) + ccnsfc=np.array(ccnsfc) + elif IOP=='IOP2': + (times_ccn,ccnsfc,sssfc,timeunit)=read_CCN_hiscale_IOP2(ccnsfcpath) + sssfc=[int(x*10) for x in sssfc] + sssfc=np.array(sssfc)/10. + times_ccn=np.array(times_ccn) + ccnsfc=np.array(ccnsfc) + # find the nearest Supersaturation in Obs comparing to model + # 0.1% + idx = sssfc==0.1 + ccna = ccnsfc[idx] + t_ccna = times_ccn[idx] + SSa = 0.1 + # 0.5% + idx = sssfc==0.5 + ccnb = ccnsfc[idx] + t_ccnb = times_ccn[idx] + SSb = 0.5 + + #%% read in models + ccna_m = [] + ccnb_m = [] + nmodels = len(Model_List) + for mm in range(nmodels): + tmp_CCN3=np.empty(0) + tmp_CCN5=np.empty(0) + timem=np.empty(0) + for cday in range(cday1,cday2+1): + mmdd=cday2mmdd(cday) + date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + + filename_input = E3SM_sfc_path+'SFC_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + (time,ccn3,timemunit,dataunit,ccn3_longname)=read_E3SM(filename_input,'CCN3') + (time,ccn5,timemunit,dataunit,ccn5_longname)=read_E3SM(filename_input,'CCN5') + + timem = np.hstack((timem,time)) + tmp_CCN3 = np.hstack((tmp_CCN3,ccn3)) + tmp_CCN5 = np.hstack((tmp_CCN5,ccn5)) + + ccna_m.append(tmp_CCN3) + ccnb_m.append(tmp_CCN5) + + # get supersaturation + SS3 = ccn3_longname.split('=')[-1] + SS5 = ccn5_longname.split('=')[-1] + + + + #%% calculate diurnal cycle + days = np.arange(cday1, cday2+1) -#%% read in models -ccna_m = [] -ccnb_m = [] -nmodels = len(Model_List) -for mm in range(nmodels): - tmp_CCN3=np.empty(0) - tmp_CCN5=np.empty(0) - timem=np.empty(0) - for cday in range(cday1,cday2+1): - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + time_dc = np.arange(30,1440.,60) + ccna_o_dc = np.full((len(time_dc),len(days)),np.nan) + ccnb_o_dc = np.full((len(time_dc),len(days)),np.nan) + for dd in range(len(days)): + for tt in range(len(time_dc)): + time_tmp = days[dd]+time_dc[tt]/1440. + idx = np.abs(t_ccna-time_tmp).argmin() + if (t_ccna[idx]-time_tmp)*1440 <= 30: + ccna_o_dc[tt,dd] = ccna[idx] + idx = np.abs(t_ccnb-time_tmp).argmin() + if (t_ccnb[idx]-time_tmp)*1440 <= 30: + ccnb_o_dc[tt,dd] = ccnb[idx] + ccna_o_dc = np.nanmean(ccna_o_dc,1) + ccnb_o_dc = np.nanmean(ccnb_o_dc,1) + + # for E3SM data + ccna_m_dc = [] + ccnb_m_dc = [] + for mm in range(nmodels): + tmp_ccna = np.full((24,len(days)),np.nan) + tmp_ccnb = np.full((24,len(days)),np.nan) + for dd in range(len(days)): + idx=np.logical_and(timem>=days[dd], timem=days[dd], timem1: # not NaN + for dd in range(len(days)): + for tt in range(len(time_dc)): + time_tmp = days[dd]+time_dc[tt]/1440. + idx = np.abs(t_cpc-time_tmp).argmin() + if (t_cpc[idx]-time_tmp)*1440 <= 30: + cpc_o_dc[tt,dd] = cpc[idx] + if len(cpcu)>1: + for dd in range(len(days)): + for tt in range(len(time_dc)): + time_tmp = days[dd]+time_dc[tt]/1440. + idx = np.abs(t_cpcu-time_tmp).argmin() + if (t_cpcu[idx]-time_tmp)*1440 <= 30: + cpcu_o_dc[tt,dd] = cpcu[idx] + cpc_o_dc = np.nanmean(cpc_o_dc,1) + cpcu_o_dc = np.nanmean(cpcu_o_dc,1) -#%% read in models -ncn_m = [] -nucn_m = [] -nmodels = len(Model_List) -for mm in range(nmodels): - tmp_ncn=np.empty(0) - tmp_nucn=np.empty(0) - timem=np.empty(0) - for cday in range(cday1,cday2+1): - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + # for E3SM data + ncn_m_dc = [] + nucn_m_dc = [] + for mm in range(nmodels): + tmp_ncn = np.full((24,len(days)),np.nan) + tmp_nucn = np.full((24,len(days)),np.nan) + for dd in range(len(days)): + idx=np.logical_and(timem>=days[dd], timem1: # not NaN - for dd in range(len(days)): - for tt in range(len(time_dc)): - time_tmp = days[dd]+time_dc[tt]/1440. - idx = np.abs(t_cpc-time_tmp).argmin() - if (t_cpc[idx]-time_tmp)*1440 <= 30: - cpc_o_dc[tt,dd] = cpc[idx] -if len(cpcu)>1: - for dd in range(len(days)): - for tt in range(len(time_dc)): - time_tmp = days[dd]+time_dc[tt]/1440. - idx = np.abs(t_cpcu-time_tmp).argmin() - if (t_cpcu[idx]-time_tmp)*1440 <= 30: - cpcu_o_dc[tt,dd] = cpcu[idx] -cpc_o_dc = np.nanmean(cpc_o_dc,1) -cpcu_o_dc = np.nanmean(cpcu_o_dc,1) - -# for E3SM data -ncn_m_dc = [] -nucn_m_dc = [] -for mm in range(nmodels): - tmp_ncn = np.full((24,len(days)),np.nan) - tmp_nucn = np.full((24,len(days)),np.nan) - for dd in range(len(days)): - idx=np.logical_and(timem>=days[dd], timem10nm)') + for mm in range(nmodels): + ax1.plot(time_dc/60, ncn_m_dc[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax1.tick_params(color='k',labelsize=12) + # ylim1 = ax1.get_ylim() -#%% make plot + ax2.plot(time_dc/60,cpcu_o_dc,color='k',linewidth=1,label='CPC(>3nm)') + for mm in range(nmodels): + ax2.plot(time_dc/60, nucn_m_dc[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax2.tick_params(color='k',labelsize=12) + # ylim2 = ax2.get_ylim() -figname = figpath_sfc_timeseries+'diurnalcycle_CN_'+campaign+'_'+IOP+'.png' -print('plotting figures to '+figname) - -fig,(ax1,ax2) = plt.subplots(2,1,figsize=(6,4)) # figsize in inches -plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - -ax1.plot(time_dc/60,cpc_o_dc,color='k',linewidth=1,label='CPC(>10nm)') -for mm in range(nmodels): - ax1.plot(time_dc/60, ncn_m_dc[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) -ax1.tick_params(color='k',labelsize=12) -ylim1 = ax1.get_ylim() - -ax2.plot(time_dc/60,cpcu_o_dc,color='k',linewidth=1,label='CPC(>3nm)') -for mm in range(nmodels): - ax2.plot(time_dc/60, nucn_m_dc[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) -ax2.tick_params(color='k',labelsize=12) -ylim2 = ax2.get_ylim() - -ax1.set_xlim(0,24) -ax2.set_xlim(0,24) -ax1.set_xticks(np.arange(0,24,3)) -ax2.set_xticks(np.arange(0,24,3)) - -# set ylimit consistent in subplots -# ax1.set_yticks([10,100,1000,10000,100000]) -# ax2.set_yticks([10,100,1000,10000,100000]) -# ax1.set_yscale('log') -# ax2.set_yscale('log') -# ax1.set_ylim([ylim1[0], ylim2[1]]) -# ax2.set_ylim([ylim1[0], ylim2[1]]) - - -ax1.legend(loc='center right', shadow=False, fontsize='medium',bbox_to_anchor=(1.3, .5)) -ax2.legend(loc='center right', shadow=False, fontsize='medium',bbox_to_anchor=(1.3, .5)) - -ax2.set_xlabel('Hour (UTC)',fontsize=12) -ax1.set_title('Aerosol Number Concentration (cm$^{-3}$) '+campaign+' '+IOP,fontsize=14) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -# plt.close() \ No newline at end of file + ax1.set_xlim(0,24) + ax2.set_xlim(0,24) + ax1.set_xticks(np.arange(0,24,3)) + ax2.set_xticks(np.arange(0,24,3)) + + # set ylimit consistent in subplots + # ax1.set_yticks([10,100,1000,10000,100000]) + # ax2.set_yticks([10,100,1000,10000,100000]) + # ax1.set_yscale('log') + # ax2.set_yscale('log') + # ax1.set_ylim([ylim1[0], ylim2[1]]) + # ax2.set_ylim([ylim1[0], ylim2[1]]) + + + ax1.legend(loc='center right', shadow=False, fontsize='medium',bbox_to_anchor=(1.3, .5)) + ax2.legend(loc='center right', shadow=False, fontsize='medium',bbox_to_anchor=(1.3, .5)) + + ax2.set_xlabel('Hour (UTC)',fontsize=12) + ax1.set_title('Aerosol Number Concentration (cm$^{-3}$) '+campaign+' '+IOP,fontsize=14) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + # plt.close() \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py b/src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py index 319b337..0085fbd 100644 --- a/src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py +++ b/src/esmac_diags/plotting/plot_sfc_pdf_AerosolSize.py @@ -3,8 +3,6 @@ # compare models and surface measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -16,197 +14,207 @@ from ..subroutines.specific_data_treatment import avg_time_2d from ..subroutines.quality_control import qc_mask_qcflag,qc_correction_nanosmps - -#%% settings - -from settings import campaign, Model_List, color_model, IOP, start_date, end_date, \ - E3SM_sfc_path, figpath_sfc_statistics - -if campaign=='ACEENA': - from settings import uhsassfcpath -elif campaign=='HISCALE': - if IOP=='IOP1': - from settings import smps_bnl_path, nanosmps_bnl_path - elif IOP=='IOP2': - from settings import smps_pnnl_path - -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date,'noleap') -cday2 = yyyymmdd2cday(end_date,'noleap') -if start_date[0:4]!=end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] - -if not os.path.exists(figpath_sfc_statistics): - os.makedirs(figpath_sfc_statistics) +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + start_date = settings['start_date'] + end_date = settings['end_date'] + E3SM_sfc_path = settings['E3SM_sfc_path'] + figpath_sfc_statistics = settings['figpath_sfc_statistics'] + + if campaign=='ACEENA': + IOP = settings['IOP'] + uhsassfcpath = settings['uhsassfcpath'] + elif campaign=='HISCALE': + IOP = settings['IOP'] + if IOP=='IOP1': + smps_bnl_path = settings['smps_bnl_path'] + nanosmps_bnl_path = settings['nanosmps_bnl_path'] + elif IOP=='IOP2': + smps_pnnl_path = settings['smps_pnnl_path'] + else: + raise ValueError('campaign name is not recognized: '+campaign) -#%% read in obs data -if campaign=='ACEENA': - if IOP=='IOP1': - lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.2017062*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201707*') - elif IOP=='IOP2': - lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201801*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201802*') - lst.sort() - t_uhsas=np.empty(0) - uhsas=np.empty((0,99)) - for filename in lst: - (time,dmin,dmax,data,timeunit,dataunit,long_name) = read_uhsas(filename) - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - # average in time for quicker plot - time2=np.arange(1800,86400,3600) - data2 = avg_time_2d(time,data,time2) - t_uhsas=np.hstack((t_uhsas, cday+time2/86400)) - uhsas=np.vstack((uhsas, data2)) - size_u = (dmin+dmax)/2 - # change to dN/dlogDp - dlnDp_u=np.empty(99) - for bb in range(len(size_u)): - dlnDp_u[bb]=np.log10(dmax[bb]/dmin[bb]) - uhsas[:,bb]=uhsas[:,bb]/dlnDp_u[bb] - - time = np.array(t_uhsas) - size = np.array(size_u) - obs = np.array(uhsas.T) + #%% other settings + + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date,'noleap') + cday2 = yyyymmdd2cday(end_date,'noleap') + if start_date[0:4]!=end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] -elif campaign=='HISCALE': - if IOP=='IOP1': - lst = glob.glob(smps_bnl_path+'*.nc') + if not os.path.exists(figpath_sfc_statistics): + os.makedirs(figpath_sfc_statistics) + + #%% read in obs data + if campaign=='ACEENA': + if IOP=='IOP1': + lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.2017062*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201707*') + elif IOP=='IOP2': + lst = glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201801*')+glob.glob(uhsassfcpath+'enaaosuhsasC1.a1.201802*') lst.sort() - t_smps=np.empty(0) - smps=np.empty((0,192)) + t_uhsas=np.empty(0) + uhsas=np.empty((0,99)) for filename in lst: - (time,size,flag,timeunit,dataunit,smps_longname)=read_smps_bnl(filename,'status_flag') - (time,size,data,timeunit,smpsunit,smps_longname)=read_smps_bnl(filename,'number_size_distribution') - data=qc_mask_qcflag(data,flag) + (time,dmin,dmax,data,timeunit,dataunit,long_name) = read_uhsas(filename) timestr=timeunit.split(' ') date=timestr[2] cday=yyyymmdd2cday(date,'noleap') # average in time for quicker plot time2=np.arange(1800,86400,3600) data2 = avg_time_2d(time,data,time2) - t_smps=np.hstack((t_smps, cday+time2/86400)) - smps=np.vstack((smps, data2)) - smps=smps.T - # combine with nanoSMPS - lst2 = glob.glob(nanosmps_bnl_path+'*.nc') - lst2.sort() - t_nano=np.empty(0) - nanosmps=np.empty((0,192)) - for filename2 in lst2: - (timen,sizen,flagn,timenunit,datanunit,long_name)=read_smps_bnl(filename2,'status_flag') - (timen,sizen,datan,timenunit,nanounit,nanoname)=read_smps_bnl(filename2,'number_size_distribution') - datan=qc_mask_qcflag(datan,flagn) - timestr=timenunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') + t_uhsas=np.hstack((t_uhsas, cday+time2/86400)) + uhsas=np.vstack((uhsas, data2)) + size_u = (dmin+dmax)/2 + # change to dN/dlogDp + dlnDp_u=np.empty(99) + for bb in range(len(size_u)): + dlnDp_u[bb]=np.log10(dmax[bb]/dmin[bb]) + uhsas[:,bb]=uhsas[:,bb]/dlnDp_u[bb] + + time = np.array(t_uhsas) + size = np.array(size_u) + obs = np.array(uhsas.T) + + elif campaign=='HISCALE': + if IOP=='IOP1': + lst = glob.glob(smps_bnl_path+'*.nc') + lst.sort() + t_smps=np.empty(0) + smps=np.empty((0,192)) + for filename in lst: + (time,size,flag,timeunit,dataunit,smps_longname)=read_smps_bnl(filename,'status_flag') + (time,size,data,timeunit,smpsunit,smps_longname)=read_smps_bnl(filename,'number_size_distribution') + data=qc_mask_qcflag(data,flag) + timestr=timeunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + # average in time for quicker plot + time2=np.arange(1800,86400,3600) + data2 = avg_time_2d(time,data,time2) + t_smps=np.hstack((t_smps, cday+time2/86400)) + smps=np.vstack((smps, data2)) + smps=smps.T + # combine with nanoSMPS + lst2 = glob.glob(nanosmps_bnl_path+'*.nc') + lst2.sort() + t_nano=np.empty(0) + nanosmps=np.empty((0,192)) + for filename2 in lst2: + (timen,sizen,flagn,timenunit,datanunit,long_name)=read_smps_bnl(filename2,'status_flag') + (timen,sizen,datan,timenunit,nanounit,nanoname)=read_smps_bnl(filename2,'number_size_distribution') + datan=qc_mask_qcflag(datan,flagn) + timestr=timenunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + # average in time for quicker plot + time2=np.arange(1800,86400,3600) + data2 = avg_time_2d(timen,datan,time2) + t_nano=np.hstack((t_nano, cday+time2/86400)) + nanosmps=np.vstack((nanosmps, data2)) + # nanosmps is overcounting, adjust nanosmps value for smooth transition to SMPS + nanosmps=qc_correction_nanosmps(nanosmps.T) + for tt in range(smps.shape[1]): + if any(t_nano==t_smps[tt]): + smps[0:80,tt]=nanosmps[0:80,t_nano==t_smps[tt]].reshape(80) + + elif IOP=='IOP2': + data=read_smpsb_pnnl(smps_pnnl_path+'HiScaleSMPSb_SGP_20160827_R1.ict') + size=read_smps_bin(smps_pnnl_path+'NSD_column_size_chart.txt') + time=data[0,:] + smps=data[1:-1,:] + flag=data[-1,:] + smps=qc_mask_qcflag(smps.T,flag).T + cday=yyyymmdd2cday('2016-08-27') # average in time for quicker plot - time2=np.arange(1800,86400,3600) - data2 = avg_time_2d(timen,datan,time2) - t_nano=np.hstack((t_nano, cday+time2/86400)) - nanosmps=np.vstack((nanosmps, data2)) - # nanosmps is overcounting, adjust nanosmps value for smooth transition to SMPS - nanosmps=qc_correction_nanosmps(nanosmps.T) - for tt in range(smps.shape[1]): - if any(t_nano==t_smps[tt]): - smps[0:80,tt]=nanosmps[0:80,t_nano==t_smps[tt]].reshape(80) + time2=np.arange(time[0],time[-1]+1800,3600) + data2 = avg_time_2d(time,smps.T,time2) + t_smps=cday+time2/86400 + smps=data2.T + + time = np.array(t_smps) + size = np.array(size) + obs = np.array(smps) + + # SMPS is already divided by log10 + + else: + raise ValueError('does not recognize this campaign: '+campaign) + + #%% read in models + model = [] + nmodels = len(Model_List) + for mm in range(nmodels): + tmp_data=np.empty((3000,0)) + timem=np.empty(0) + for cday in range(cday1,cday2+1): + mmdd=cday2mmdd(cday) + date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + + filename_input = E3SM_sfc_path+'SFC_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + (time,ncn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NCNall') + + timem = np.hstack((timem,time)) + tmp_data = np.hstack((tmp_data,ncn*1e-6)) - elif IOP=='IOP2': - data=read_smpsb_pnnl(smps_pnnl_path+'HiScaleSMPSb_SGP_20160827_R1.ict') - size=read_smps_bin(smps_pnnl_path+'NSD_column_size_chart.txt') - time=data[0,:] - smps=data[1:-1,:] - flag=data[-1,:] - smps=qc_mask_qcflag(smps.T,flag).T - cday=yyyymmdd2cday('2016-08-27') - # average in time for quicker plot - time2=np.arange(time[0],time[-1]+1800,3600) - data2 = avg_time_2d(time,smps.T,time2) - t_smps=cday+time2/86400 - smps=data2.T + # change to dN/dlog10Dp + for bb in range(3000): + dlnDp=np.log10((bb+2)/(bb+1)) + tmp_data[bb,:]=tmp_data[bb,:]/dlnDp - time = np.array(t_smps) - size = np.array(size) - obs = np.array(smps) + model.append(tmp_data) + + #%% calculate mean pdf + pdf_obs=np.nanmean(obs,1) + pdf_model=[None]*nmodels + for mm in range(nmodels): + pdf_model[mm]=np.nanmean(model[mm],1) - # SMPS is already divided by log10 + #%% + pct1_o = [np.nanpercentile(obs[i,:],10) for i in range(len(size))] + pct2_o = [np.nanpercentile(obs[i,:],90) for i in range(len(size))] + pct1_m = [[] for mm in range(nmodels)] + pct2_m = [[] for mm in range(nmodels)] + for mm in range(nmodels): + pct1_m[mm] = [np.nanpercentile(model[mm][i,:],10) for i in range(3000)] + pct2_m[mm] = [np.nanpercentile(model[mm][i,:],90) for i in range(3000)] -else: - raise ValueError('does not recognize this campaign: '+campaign) + # import scipy.stats as stats + # sem_o = np.ma.filled(stats.sem(obs,1,nan_policy='omit'),np.nan) + # sem_m = [[] for mm in range(nmodels)] + # for mm in range(nmodels): + # sem_m[mm] = np.ma.filled(stats.sem(model[mm],1,nan_policy='omit'),np.nan) -#%% read in models -model = [] -nmodels = len(Model_List) -for mm in range(nmodels): - tmp_data=np.empty((3000,0)) - timem=np.empty(0) - for cday in range(cday1,cday2+1): - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] - - filename_input = E3SM_sfc_path+'SFC_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - (time,ncn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NCNall') - - timem = np.hstack((timem,time)) - tmp_data = np.hstack((tmp_data,ncn*1e-6)) + #%% make plot + # not plotting data if the mean value is 0 + pdf_obs[pdf_obs==0] = np.nan - # change to dN/dlog10Dp - for bb in range(3000): - dlnDp=np.log10((bb+2)/(bb+1)) - tmp_data[bb,:]=tmp_data[bb,:]/dlnDp + figname = figpath_sfc_statistics+'pdf_AerosolSize_'+campaign+'_'+IOP+'.png' - model.append(tmp_data) - -#%% calculate mean pdf -pdf_obs=np.nanmean(obs,1) -pdf_model=[None]*nmodels -for mm in range(nmodels): - pdf_model[mm]=np.nanmean(model[mm],1) - -#%% -pct1_o = [np.nanpercentile(obs[i,:],10) for i in range(len(size))] -pct2_o = [np.nanpercentile(obs[i,:],90) for i in range(len(size))] -pct1_m = [[] for mm in range(nmodels)] -pct2_m = [[] for mm in range(nmodels)] -for mm in range(nmodels): - pct1_m[mm] = [np.nanpercentile(model[mm][i,:],10) for i in range(3000)] - pct2_m[mm] = [np.nanpercentile(model[mm][i,:],90) for i in range(3000)] - -# import scipy.stats as stats -# sem_o = np.ma.filled(stats.sem(obs,1,nan_policy='omit'),np.nan) -# sem_m = [[] for mm in range(nmodels)] -# for mm in range(nmodels): -# sem_m[mm] = np.ma.filled(stats.sem(model[mm],1,nan_policy='omit'),np.nan) - -#%% make plot -# not plotting data if the mean value is 0 -pdf_obs[pdf_obs==0] = np.nan - -figname = figpath_sfc_statistics+'pdf_AerosolSize_'+campaign+'_'+IOP+'.png' - -print('plotting figures to '+figname) - -fig,ax = plt.subplots(figsize=(4,2.5)) # figsize in inches - -ax.plot(size,pdf_obs,color='k',label='Obs') -for mm in range(nmodels): - ax.plot(np.arange(1,3001),pdf_model[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - -ax.fill_between(size,pct1_o,pct2_o, alpha=0.5, facecolor='gray') -for mm in range(nmodels): - ax.fill_between(np.arange(1,3001),pct1_m[mm],pct2_m[mm], alpha=0.2, facecolor=color_model[mm]) - -ax.legend(loc='upper right', shadow=False, fontsize='medium') -ax.tick_params(color='k',labelsize=12) -ax.set_xscale('log') -ax.set_yscale('log') -ax.set_ylim(0.01,1e4) -ax.set_xlim(0.67,4500) -ax.set_xlabel('Diameter (nm)',fontsize=13) -ax.set_ylabel('#/dlnDp (cm$^{-3}$)',fontsize=13) -ax.set_title(campaign+' '+IOP,fontsize=14) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -# plt.close() - \ No newline at end of file + print('plotting figures to '+figname) + + fig,ax = plt.subplots(figsize=(4,2.5)) # figsize in inches + + ax.plot(size,pdf_obs,color='k',label='Obs') + for mm in range(nmodels): + ax.plot(np.arange(1,3001),pdf_model[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + + ax.fill_between(size,pct1_o,pct2_o, alpha=0.5, facecolor='gray') + for mm in range(nmodels): + ax.fill_between(np.arange(1,3001),pct1_m[mm],pct2_m[mm], alpha=0.2, facecolor=color_model[mm]) + + ax.legend(loc='upper right', shadow=False, fontsize='medium') + ax.tick_params(color='k',labelsize=12) + ax.set_xscale('log') + ax.set_yscale('log') + ax.set_ylim(0.01,1e4) + ax.set_xlim(0.67,4500) + ax.set_xlabel('Diameter (nm)',fontsize=13) + ax.set_ylabel('#/dlnDp (cm$^{-3}$)',fontsize=13) + ax.set_title(campaign+' '+IOP,fontsize=14) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + # plt.close() diff --git a/src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py b/src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py index 3893018..13fa642 100644 --- a/src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py +++ b/src/esmac_diags/plotting/plot_sfc_pie_AerosolComposition.py @@ -3,8 +3,6 @@ # plot models and surface measurements separately """ -import sys - import glob import matplotlib.pyplot as plt import numpy as np @@ -13,161 +11,170 @@ from ..subroutines.read_netcdf import read_E3SM from ..subroutines.quality_control import qc_remove_neg,qc_acsm_org_max -#%% settings +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + acsmpath = settings['acsmpath'] + start_date = settings['start_date'] + end_date = settings['end_date'] + E3SM_sfc_path = settings['E3SM_sfc_path'] + figpath_sfc_statistics = settings['figpath_sfc_statistics'] -from settings import campaign, acsmpath, Model_List, \ - IOP, start_date, end_date, E3SM_sfc_path, figpath_sfc_statistics + IOP = settings.get('IOP', None) -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date,'noleap') -cday2 = yyyymmdd2cday(end_date,'noleap') -if start_date[0:4]!=end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] + #%% other settings -import os -if not os.path.exists(figpath_sfc_statistics): - os.makedirs(figpath_sfc_statistics) + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date,'noleap') + cday2 = yyyymmdd2cday(end_date,'noleap') + if start_date[0:4]!=end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] + + import os + if not os.path.exists(figpath_sfc_statistics): + os.makedirs(figpath_sfc_statistics) + + + #%% read in obs data + if campaign=='ACEENA': + if IOP=='IOP1': + lst = glob.glob(acsmpath+'enaaosacsmC1.a1.201706*') + glob.glob(acsmpath+'enaaosacsmC1.a1.201707*') + elif IOP=='IOP2': + lst = glob.glob(acsmpath+'enaaosacsmC1.a1.201801*') + glob.glob(acsmpath+'enaaosacsmC1.a1.201802*') + lst.sort() + elif campaign=='HISCALE': + if IOP=='IOP1': + lst = glob.glob(acsmpath+'sgpaosacsmC1.b1.201604*') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201605*') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201606*') + elif IOP=='IOP2': + lst = glob.glob(acsmpath+'sgpaosacsmC1.b1.201608*.cdf') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201609*.cdf') + lst.sort() + else: + raise ValueError('surface aerosol composition is only available in HISCALE or ACEENA. check: '+campaign) + + t_obs=np.empty(0) + so4_obs=np.empty(0) + org_obs=np.empty(0) + nh4_obs=np.empty(0) + no3_obs=np.empty(0) + chl_obs=np.empty(0) + for filename in lst: + (times_obs,so4sfc,timeunit,so4sfcunit)=read_acsm(filename,'sulfate') + (times_obs,orgsfc,timeunit,orgsfcunit)=read_acsm(filename,'total_organics') + (times_obs,nh4sfc,timeunit,nh4sfcunit)=read_acsm(filename,'ammonium') + (times_obs,no3sfc,timeunit,no3sfcunit)=read_acsm(filename,'nitrate') + (times_obs,chlsfc,timeunit,chlsfcunit)=read_acsm(filename,'chloride') + timestr=timeunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + so4_obs=np.hstack((so4_obs, so4sfc)) + org_obs=np.hstack((org_obs, orgsfc)) + nh4_obs=np.hstack((nh4_obs, nh4sfc)) + no3_obs=np.hstack((no3_obs, no3sfc)) + chl_obs=np.hstack((chl_obs, chlsfc)) + so4_obs=qc_remove_neg(so4_obs) + nh4_obs=qc_remove_neg(nh4_obs) + no3_obs=qc_remove_neg(no3_obs) + chl_obs=qc_remove_neg(chl_obs) + org_obs=qc_remove_neg(org_obs) + org_obs=qc_acsm_org_max(org_obs) - -#%% read in obs data -if campaign=='ACEENA': - if IOP=='IOP1': - lst = glob.glob(acsmpath+'enaaosacsmC1.a1.201706*') + glob.glob(acsmpath+'enaaosacsmC1.a1.201707*') - elif IOP=='IOP2': - lst = glob.glob(acsmpath+'enaaosacsmC1.a1.201801*') + glob.glob(acsmpath+'enaaosacsmC1.a1.201802*') - lst.sort() -elif campaign=='HISCALE': - if IOP=='IOP1': - lst = glob.glob(acsmpath+'sgpaosacsmC1.b1.201604*') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201605*') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201606*') - elif IOP=='IOP2': - lst = glob.glob(acsmpath+'sgpaosacsmC1.b1.201608*.cdf') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201609*.cdf') - lst.sort() -else: - raise ValueError('surface aerosol composition is only available in HISCALE or ACEENA. check: '+campaign) + #%% read in models + nmodels = len(Model_List) + model_org = list() + model_so4 = list() + model_bc = list() + model_dst = list() + model_ncl = list() -t_obs=np.empty(0) -so4_obs=np.empty(0) -org_obs=np.empty(0) -nh4_obs=np.empty(0) -no3_obs=np.empty(0) -chl_obs=np.empty(0) -for filename in lst: - (times_obs,so4sfc,timeunit,so4sfcunit)=read_acsm(filename,'sulfate') - (times_obs,orgsfc,timeunit,orgsfcunit)=read_acsm(filename,'total_organics') - (times_obs,nh4sfc,timeunit,nh4sfcunit)=read_acsm(filename,'ammonium') - (times_obs,no3sfc,timeunit,no3sfcunit)=read_acsm(filename,'nitrate') - (times_obs,chlsfc,timeunit,chlsfcunit)=read_acsm(filename,'chloride') - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - so4_obs=np.hstack((so4_obs, so4sfc)) - org_obs=np.hstack((org_obs, orgsfc)) - nh4_obs=np.hstack((nh4_obs, nh4sfc)) - no3_obs=np.hstack((no3_obs, no3sfc)) - chl_obs=np.hstack((chl_obs, chlsfc)) -so4_obs=qc_remove_neg(so4_obs) -nh4_obs=qc_remove_neg(nh4_obs) -no3_obs=qc_remove_neg(no3_obs) -chl_obs=qc_remove_neg(chl_obs) -org_obs=qc_remove_neg(org_obs) -org_obs=qc_acsm_org_max(org_obs) - -#%% read in models -nmodels = len(Model_List) -model_org = list() -model_so4 = list() -model_bc = list() -model_dst = list() -model_ncl = list() - -for mm in range(nmodels): - bcvarname=['bc_a1','bc_a3','bc_a4'] - dstvarname=['dst_a1','dst_a3'] - nclvarname=['ncl_a1','ncl_a2','ncl_a3'] - so4varname=['so4_a1','so4_a2','so4_a3'] - orgvarname=['soa_a1','soa_a2','soa_a3','pom_a1','pom_a3','pom_a4',\ - 'mom_a1','mom_a2','mom_a3','mom_a4'] - if Model_List[mm]=='NucSoaCond': - so4varname.append('so4_a5') - orgvarname.append('soa_a5') - - timem2 = np.array([]) - tmp_so4 = np.empty(0) - tmp_org = np.empty(0) - tmp_bc = np.empty(0) - tmp_dst = np.empty(0) - tmp_ncl = np.empty(0) - ps = np.empty(0) - ts = np.empty(0) - for cday in range(cday1,cday2+1): - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] - filename_input = E3SM_sfc_path+'SFC_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + for mm in range(nmodels): + bcvarname=['bc_a1','bc_a3','bc_a4'] + dstvarname=['dst_a1','dst_a3'] + nclvarname=['ncl_a1','ncl_a2','ncl_a3'] + so4varname=['so4_a1','so4_a2','so4_a3'] + orgvarname=['soa_a1','soa_a2','soa_a3','pom_a1','pom_a3','pom_a4',\ + 'mom_a1','mom_a2','mom_a3','mom_a4'] + if Model_List[mm]=='NucSoaCond': + so4varname.append('so4_a5') + orgvarname.append('soa_a5') + + timem2 = np.array([]) + tmp_so4 = np.empty(0) + tmp_org = np.empty(0) + tmp_bc = np.empty(0) + tmp_dst = np.empty(0) + tmp_ncl = np.empty(0) + ps = np.empty(0) + ts = np.empty(0) + for cday in range(cday1,cday2+1): + mmdd=cday2mmdd(cday) + date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + filename_input = E3SM_sfc_path+'SFC_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + + (timem,so4all,timeunitm,so4unit,so4name)=read_E3SM(filename_input,so4varname) + (timem,orgall,timeunitm,orgunit,orgname)=read_E3SM(filename_input,orgvarname) + (timem,bcall,timeunitm,bcunit,bcname)=read_E3SM(filename_input,bcvarname) + (timem,dstall,timeunitm,dstunit,dstname)=read_E3SM(filename_input,dstvarname) + (timem,nclall,timeunitm,nclunit,nclname)=read_E3SM(filename_input,nclvarname) + (timem,[psm,tsm],timeunitm,varunit,varlongname)=read_E3SM(filename_input,['PS','T']) + + tmp_so4 = np.hstack((tmp_so4,sum(so4all))) + tmp_org = np.hstack((tmp_org,sum(orgall))) + tmp_bc = np.hstack((tmp_bc,sum(bcall))) + tmp_dst = np.hstack((tmp_dst,sum(dstall))) + tmp_ncl = np.hstack((tmp_ncl,sum(nclall))) + ps = np.hstack((ps,psm)) + ts = np.hstack((ts,tsm)) + timem2 = np.hstack((timem2,timem)) - (timem,so4all,timeunitm,so4unit,so4name)=read_E3SM(filename_input,so4varname) - (timem,orgall,timeunitm,orgunit,orgname)=read_E3SM(filename_input,orgvarname) - (timem,bcall,timeunitm,bcunit,bcname)=read_E3SM(filename_input,bcvarname) - (timem,dstall,timeunitm,dstunit,dstname)=read_E3SM(filename_input,dstvarname) - (timem,nclall,timeunitm,nclunit,nclname)=read_E3SM(filename_input,nclvarname) - (timem,[psm,tsm],timeunitm,varunit,varlongname)=read_E3SM(filename_input,['PS','T']) + model_so4.append(tmp_so4) + model_org.append(tmp_org) + model_bc.append(tmp_bc) + model_dst.append(tmp_dst) + model_ncl.append(tmp_ncl) + + # change E3SM unit from kg/kg to ug/m3 + rho = ps/287.06/ts + + for mm in range(nmodels): + model_so4[mm]=model_so4[mm]*1e9*rho + model_org[mm]=model_org[mm]*1e9*rho + model_bc[mm]=model_bc[mm]*1e9*rho + model_dst[mm]=model_dst[mm]*1e9*rho + model_ncl[mm]=model_ncl[mm]*1e9*rho - tmp_so4 = np.hstack((tmp_so4,sum(so4all))) - tmp_org = np.hstack((tmp_org,sum(orgall))) - tmp_bc = np.hstack((tmp_bc,sum(bcall))) - tmp_dst = np.hstack((tmp_dst,sum(dstall))) - tmp_ncl = np.hstack((tmp_ncl,sum(nclall))) - ps = np.hstack((ps,psm)) - ts = np.hstack((ts,tsm)) - timem2 = np.hstack((timem2,timem)) + #%% Pie plot - model_so4.append(tmp_so4) - model_org.append(tmp_org) - model_bc.append(tmp_bc) - model_dst.append(tmp_dst) - model_ncl.append(tmp_ncl) - -# change E3SM unit from kg/kg to ug/m3 -rho = ps/287.06/ts - -for mm in range(nmodels): - model_so4[mm]=model_so4[mm]*1e9*rho - model_org[mm]=model_org[mm]*1e9*rho - model_bc[mm]=model_bc[mm]*1e9*rho - model_dst[mm]=model_dst[mm]*1e9*rho - model_ncl[mm]=model_ncl[mm]*1e9*rho + figname = figpath_sfc_statistics+'Pieplot_AerosolComposition_'+campaign+'_'+IOP+'.png' + print('plotting figures to '+figname) -#%% Pie plot - -figname = figpath_sfc_statistics+'Pieplot_AerosolComposition_'+campaign+'_'+IOP+'.png' -print('plotting figures to '+figname) - -fig,ax = plt.subplots(1,nmodels+1,figsize=((nmodels+1)*3.5,3.5)) # figsize in inches -# colors = ['limegreen', 'red', 'b', 'y', 'orange' ] - -colors_o = ['limegreen', 'red', 'orange', 'lightblue', 'yellow'] -labels_o = ['ORG', 'SO4', 'NO3', 'NH4', 'CHL'] -sizeo = [np.nanmean(org_obs),np.nanmean(so4_obs),np.nanmean(no3_obs),np.nanmean(nh4_obs),np.nanmean(chl_obs)] - -colors_m = ['limegreen', 'red', 'k', 'silver','gray'] -labels_m = ['ORG', 'SO4', 'BC', 'DST', 'NCL'] -sizem = [] -for mm in range(nmodels): - sizem.append([np.mean(model_org[mm]),np.mean(model_so4[mm]),np.mean(model_bc[mm]),np.mean(model_dst[mm]),np.mean(model_ncl[mm])]) - -def absolute_value(val): - a=np.round(val*sum(sizeo))/100 - return a -ax[0].pie(sizeo/sum(sizeo),labels=labels_o,colors=colors_o, autopct=absolute_value) # autopct='%1.1f%%' -for mm in range(nmodels): - def absolute_valuemm(val): - a=np.round(val*sum(sizem[mm]))/100 + fig,ax = plt.subplots(1,nmodels+1,figsize=((nmodels+1)*3.5,3.5)) # figsize in inches + # colors = ['limegreen', 'red', 'b', 'y', 'orange' ] + + colors_o = ['limegreen', 'red', 'orange', 'lightblue', 'yellow'] + labels_o = ['ORG', 'SO4', 'NO3', 'NH4', 'CHL'] + sizeo = [np.nanmean(org_obs),np.nanmean(so4_obs),np.nanmean(no3_obs),np.nanmean(nh4_obs),np.nanmean(chl_obs)] + + colors_m = ['limegreen', 'red', 'k', 'silver','gray'] + labels_m = ['ORG', 'SO4', 'BC', 'DST', 'NCL'] + sizem = [] + for mm in range(nmodels): + sizem.append([np.mean(model_org[mm]),np.mean(model_so4[mm]),np.mean(model_bc[mm]),np.mean(model_dst[mm]),np.mean(model_ncl[mm])]) + + def absolute_value(val): + a=np.round(val*sum(sizeo))/100 return a - ax[mm+1].pie(sizem[mm]/sum(sizem[mm]),labels=labels_m, colors=colors_m, autopct=absolute_valuemm) + ax[0].pie(sizeo/sum(sizeo),labels=labels_o,colors=colors_o, autopct=absolute_value) # autopct='%1.1f%%' + for mm in range(nmodels): + def absolute_valuemm(val): + a=np.round(val*sum(sizem[mm]))/100 + return a + ax[mm+1].pie(sizem[mm]/sum(sizem[mm]),labels=labels_m, colors=colors_m, autopct=absolute_valuemm) + + ax[0].set_title('Obs',fontsize=14) + for mm in range(nmodels): + ax[mm+1].set_title(Model_List[mm],fontsize=14) + fig.text(.5,.15,'unit: $\mu$g/m$^3$') -ax[0].set_title('Obs',fontsize=14) -for mm in range(nmodels): - ax[mm+1].set_title(Model_List[mm],fontsize=14) -fig.text(.5,.15,'unit: $\mu$g/m$^3$') - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) \ No newline at end of file + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py b/src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py index 0e4eff4..6cb3220 100644 --- a/src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py +++ b/src/esmac_diags/plotting/plot_sfc_timeseries_AerosolComposition.py @@ -3,8 +3,6 @@ # compare models and surface measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -15,127 +13,137 @@ from ..subroutines.specific_data_treatment import avg_time_1d from ..subroutines.quality_control import qc_remove_neg,qc_acsm_org_max -#%% settings +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + acsmpath = settings['acsmpath'] + start_date = settings['start_date'] + end_date = settings['end_date'] + E3SM_sfc_path = settings['E3SM_sfc_path'] + figpath_sfc_timeseries = settings['figpath_sfc_timeseries'] -from settings import campaign, acsmpath, Model_List, color_model, \ - IOP, start_date, end_date, E3SM_sfc_path, figpath_sfc_timeseries + IOP = settings.get('IOP', None) -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date,'noleap') -cday2 = yyyymmdd2cday(end_date,'noleap') -if start_date[0:4]!=end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] + #%% other settings -if not os.path.exists(figpath_sfc_timeseries): - os.makedirs(figpath_sfc_timeseries) + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date,'noleap') + cday2 = yyyymmdd2cday(end_date,'noleap') + if start_date[0:4]!=end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] + + if not os.path.exists(figpath_sfc_timeseries): + os.makedirs(figpath_sfc_timeseries) + + #%% read in obs data + if campaign=='ACEENA': + if IOP=='IOP1': + lst = glob.glob(acsmpath+'enaaosacsmC1.a1.201706*') + glob.glob(acsmpath+'enaaosacsmC1.a1.201707*') + elif IOP=='IOP2': + lst = glob.glob(acsmpath+'enaaosacsmC1.a1.201801*') + glob.glob(acsmpath+'enaaosacsmC1.a1.201802*') + lst.sort() + elif campaign=='HISCALE': + if IOP=='IOP1': + lst = glob.glob(acsmpath+'sgpaosacsmC1.b1.201604*') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201605*') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201606*') + elif IOP=='IOP2': + lst = glob.glob(acsmpath+'sgpaosacsmC1.b1.201608*.cdf') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201609*.cdf') + lst.sort() + + t_obs=np.empty(0) + so4_obs=np.empty(0) + org_obs=np.empty(0) + for filename in lst: + (times_obs,so4sfc,timeunit,so4sfcunit)=read_acsm(filename,'sulfate') + (times_obs,orgsfc,timeunit,orgsfcunit)=read_acsm(filename,'total_organics') + timestr=timeunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + # average in time for quicker plot + time2=np.arange(1800,86400,3600) + so42 = avg_time_1d(np.array(times_obs),np.array(so4sfc),time2) + org2 = avg_time_1d(np.array(times_obs),np.array(orgsfc),time2) + t_obs=np.hstack((t_obs, cday+time2/86400)) + so4_obs=np.hstack((so4_obs, so42)) + org_obs=np.hstack((org_obs, org2)) + so4_obs=qc_remove_neg(so4_obs) + org_obs=qc_remove_neg(org_obs) + org_obs=qc_acsm_org_max(org_obs) + -#%% read in obs data -if campaign=='ACEENA': - if IOP=='IOP1': - lst = glob.glob(acsmpath+'enaaosacsmC1.a1.201706*') + glob.glob(acsmpath+'enaaosacsmC1.a1.201707*') - elif IOP=='IOP2': - lst = glob.glob(acsmpath+'enaaosacsmC1.a1.201801*') + glob.glob(acsmpath+'enaaosacsmC1.a1.201802*') - lst.sort() -elif campaign=='HISCALE': - if IOP=='IOP1': - lst = glob.glob(acsmpath+'sgpaosacsmC1.b1.201604*') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201605*') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201606*') - elif IOP=='IOP2': - lst = glob.glob(acsmpath+'sgpaosacsmC1.b1.201608*.cdf') + glob.glob(acsmpath+'sgpaosacsmC1.b1.201609*.cdf') - lst.sort() + #%% read in models + nmodels = len(Model_List) + model_org = list() + model_so4 = list() -t_obs=np.empty(0) -so4_obs=np.empty(0) -org_obs=np.empty(0) -for filename in lst: - (times_obs,so4sfc,timeunit,so4sfcunit)=read_acsm(filename,'sulfate') - (times_obs,orgsfc,timeunit,orgsfcunit)=read_acsm(filename,'total_organics') - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - # average in time for quicker plot - time2=np.arange(1800,86400,3600) - so42 = avg_time_1d(np.array(times_obs),np.array(so4sfc),time2) - org2 = avg_time_1d(np.array(times_obs),np.array(orgsfc),time2) - t_obs=np.hstack((t_obs, cday+time2/86400)) - so4_obs=np.hstack((so4_obs, so42)) - org_obs=np.hstack((org_obs, org2)) -so4_obs=qc_remove_neg(so4_obs) -org_obs=qc_remove_neg(org_obs) -org_obs=qc_acsm_org_max(org_obs) + for mm in range(nmodels): + so4varname=['so4_a1','so4_a2','so4_a3'] + orgvarname=['soa_a1','soa_a2','soa_a3','pom_a1','pom_a3','pom_a4',\ + 'mom_a1','mom_a2','mom_a3','mom_a4'] + if Model_List[mm]=='NucSoaCond': + so4varname.append('so4_a5') + orgvarname.append('soa_a5') - -#%% read in models -nmodels = len(Model_List) -model_org = list() -model_so4 = list() - -for mm in range(nmodels): - so4varname=['so4_a1','so4_a2','so4_a3'] - orgvarname=['soa_a1','soa_a2','soa_a3','pom_a1','pom_a3','pom_a4',\ - 'mom_a1','mom_a2','mom_a3','mom_a4'] - if Model_List[mm]=='NucSoaCond': - so4varname.append('so4_a5') - orgvarname.append('soa_a5') - - timem2 = np.array([]) - tmp_so4 = np.empty(0) - tmp_org = np.empty(0) - ps = np.empty(0) - ts = np.empty(0) - for cday in range(cday1,cday2+1): - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] - filename_input = E3SM_sfc_path+'SFC_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + timem2 = np.array([]) + tmp_so4 = np.empty(0) + tmp_org = np.empty(0) + ps = np.empty(0) + ts = np.empty(0) + for cday in range(cday1,cday2+1): + mmdd=cday2mmdd(cday) + date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + filename_input = E3SM_sfc_path+'SFC_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + + (timem,so4all,timeunitm,so4unit,so4name)=read_E3SM(filename_input,so4varname) + (timem,orgall,timeunitm,orgunit,orgname)=read_E3SM(filename_input,orgvarname) + (timem,[psm,tsm],timeunitm,varunit,varlongname)=read_E3SM(filename_input,['PS','T']) + + tmp_so4 = np.hstack((tmp_so4,sum(so4all))) + tmp_org = np.hstack((tmp_org,sum(orgall))) + ps = np.hstack((ps,psm)) + ts = np.hstack((ts,tsm)) + timem2 = np.hstack((timem2,timem)) - (timem,so4all,timeunitm,so4unit,so4name)=read_E3SM(filename_input,so4varname) - (timem,orgall,timeunitm,orgunit,orgname)=read_E3SM(filename_input,orgvarname) - (timem,[psm,tsm],timeunitm,varunit,varlongname)=read_E3SM(filename_input,['PS','T']) + model_org.append(tmp_org) + model_so4.append(tmp_so4) + + # change E3SM unit from kg/kg to ug/m3 + rho = ps/287.06/ts + + for mm in range(nmodels): + model_so4[mm]=model_so4[mm]*1e9*rho + model_org[mm]=model_org[mm]*1e9*rho + + #%% make plot - tmp_so4 = np.hstack((tmp_so4,sum(so4all))) - tmp_org = np.hstack((tmp_org,sum(orgall))) - ps = np.hstack((ps,psm)) - ts = np.hstack((ts,tsm)) - timem2 = np.hstack((timem2,timem)) + figname = figpath_sfc_timeseries+'timeseries_AerosolComposition_'+campaign+'_'+IOP+'.png' + print('plotting figures to '+figname) - model_org.append(tmp_org) - model_so4.append(tmp_so4) - -# change E3SM unit from kg/kg to ug/m3 -rho = ps/287.06/ts - -for mm in range(nmodels): - model_so4[mm]=model_so4[mm]*1e9*rho - model_org[mm]=model_org[mm]*1e9*rho - -#%% make plot + fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5) #pad=0.4, w_pad=0.5, h_pad=1.0 -figname = figpath_sfc_timeseries+'timeseries_AerosolComposition_'+campaign+'_'+IOP+'.png' -print('plotting figures to '+figname) - -fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches -plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - -ax1.plot(t_obs,so4_obs,color='k',linewidth=1,label='OBS (SO4)') -for mm in range(nmodels): - ax1.plot(timem2, model_so4[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) -# ax1.set_yscale('log') -ax1.tick_params(color='k',labelsize=12) - -ax2.plot(t_obs,org_obs,color='k',linewidth=1,label='OBS (ORG)') -for mm in range(nmodels): - ax2.plot(timem2, model_org[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) -# ax2.set_yscale('log') -ax2.tick_params(color='k',labelsize=12) - -ax1.set_xlim(cday1,cday2) -ax2.set_xlim(cday1,cday2) - -ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) -ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) - -ax2.set_xlabel('Calendar Day',fontsize=14) - -ax1.set_title('Aerosol Sulfate and Organic Concentration ($\mu$g/m$^3$) '+campaign+' '+IOP,fontsize=14) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + ax1.plot(t_obs,so4_obs,color='k',linewidth=1,label='OBS (SO4)') + for mm in range(nmodels): + ax1.plot(timem2, model_so4[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax1.set_yscale('log') + ax1.tick_params(color='k',labelsize=12) + + ax2.plot(t_obs,org_obs,color='k',linewidth=1,label='OBS (ORG)') + for mm in range(nmodels): + ax2.plot(timem2, model_org[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax2.set_yscale('log') + ax2.tick_params(color='k',labelsize=12) + + ax1.set_xlim(cday1,cday2) + ax2.set_xlim(cday1,cday2) + + ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + + ax2.set_xlabel('Calendar Day',fontsize=14) + + ax1.set_title('Aerosol Sulfate and Organic Concentration ($\mu$g/m$^3$) '+campaign+' '+IOP,fontsize=14) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) diff --git a/src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py b/src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py index 8efd9be..49ad30a 100644 --- a/src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py +++ b/src/esmac_diags/plotting/plot_sfc_timeseries_CCN.py @@ -3,8 +3,6 @@ # compare models and surface measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -15,146 +13,156 @@ from ..subroutines.read_netcdf import read_E3SM from ..subroutines.quality_control import qc_remove_neg,qc_mask_qcflag,qc_ccn_max -#%% settings +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + ccnsfcpath = settings['ccnsfcpath'] + start_date = settings['start_date'] + end_date = settings['end_date'] + E3SM_sfc_path = settings['E3SM_sfc_path'] + figpath_sfc_timeseries = settings['figpath_sfc_timeseries'] -from settings import campaign, ccnsfcpath, Model_List, color_model, \ - IOP, start_date, end_date, E3SM_sfc_path, figpath_sfc_timeseries + IOP = settings.get('IOP', None) -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date,'noleap') -cday2 = yyyymmdd2cday(end_date,'noleap') -if start_date[0:4]!=end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] - -if not os.path.exists(figpath_sfc_timeseries): - os.makedirs(figpath_sfc_timeseries) - + #%% other settings -#%% read in obs data -if campaign=='ACEENA': - # cpc - if IOP=='IOP1': - lst = glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201706*')+glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201707*') - elif IOP=='IOP2': - lst = glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201801*')+glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201802*') - lst.sort() - t_ccn=np.empty(0) - ccn=np.empty(0) - SS=np.empty(0) - for filename in lst: - (time,timeunit,data,qc,dataunit,SS0)=read_ccn(filename) - data=qc_mask_qcflag(data,qc) - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - t_ccn=np.hstack((t_ccn, cday+time/86400)) - ccn=np.hstack((ccn, data)) - SS=np.hstack((SS, SS0)) - ccn=qc_remove_neg(ccn) - ccn=qc_ccn_max(ccn,SS) - # SS=0.1% - idx = np.logical_and(SS>0.05, SS<0.15) - t_ccna = t_ccn[idx] - ccna = ccn[idx] - SSa = 0.1 - # SS=0.5% - idx = np.logical_and(SS>0.4, SS<0.6) - t_ccnb = t_ccn[idx] - ccnb = ccn[idx] - SSb = 0.5 - -elif campaign=='HISCALE': - if IOP=='IOP1': - (times_ccn,ccnsfc,sssfc,timeunit)=read_CCN_hiscale_IOP1(ccnsfcpath) - sssfc=[int(x*10) for x in sssfc] - sssfc=np.array(sssfc)/10. - times_ccn=np.array(times_ccn) - ccnsfc=np.array(ccnsfc) - elif IOP=='IOP2': - (times_ccn,ccnsfc,sssfc,timeunit)=read_CCN_hiscale_IOP2(ccnsfcpath) - sssfc=[int(x*10) for x in sssfc] - sssfc=np.array(sssfc)/10. - times_ccn=np.array(times_ccn) - ccnsfc=np.array(ccnsfc) - # find the nearest Supersaturation in Obs comparing to model - # 0.1% - idx = sssfc==0.1 - ccna = ccnsfc[idx] - t_ccna = times_ccn[idx] - SSa = 0.1 - # 0.5% - idx = sssfc==0.5 - ccnb = ccnsfc[idx] - t_ccnb = times_ccn[idx] - SSb = 0.5 + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date,'noleap') + cday2 = yyyymmdd2cday(end_date,'noleap') + if start_date[0:4]!=end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] + + if not os.path.exists(figpath_sfc_timeseries): + os.makedirs(figpath_sfc_timeseries) + + + #%% read in obs data + if campaign=='ACEENA': + # cpc + if IOP=='IOP1': + lst = glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201706*')+glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201707*') + elif IOP=='IOP2': + lst = glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201801*')+glob.glob(ccnsfcpath+'enaaosccn1colavgC1.b1.201802*') + lst.sort() + t_ccn=np.empty(0) + ccn=np.empty(0) + SS=np.empty(0) + for filename in lst: + (time,timeunit,data,qc,dataunit,SS0)=read_ccn(filename) + data=qc_mask_qcflag(data,qc) + timestr=timeunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + t_ccn=np.hstack((t_ccn, cday+time/86400)) + ccn=np.hstack((ccn, data)) + SS=np.hstack((SS, SS0)) + ccn=qc_remove_neg(ccn) + ccn=qc_ccn_max(ccn,SS) + # SS=0.1% + idx = np.logical_and(SS>0.05, SS<0.15) + t_ccna = t_ccn[idx] + ccna = ccn[idx] + SSa = 0.1 + # SS=0.5% + idx = np.logical_and(SS>0.4, SS<0.6) + t_ccnb = t_ccn[idx] + ccnb = ccn[idx] + SSb = 0.5 -#%% read in models -ccna_m = [] -ccnb_m = [] -nmodels = len(Model_List) -for mm in range(nmodels): - tmp_CCN3=np.empty(0) - tmp_CCN5=np.empty(0) - timem=np.empty(0) - for cday in range(cday1,cday2+1): - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + elif campaign=='HISCALE': + if IOP=='IOP1': + (times_ccn,ccnsfc,sssfc,timeunit)=read_CCN_hiscale_IOP1(ccnsfcpath) + sssfc=[int(x*10) for x in sssfc] + sssfc=np.array(sssfc)/10. + times_ccn=np.array(times_ccn) + ccnsfc=np.array(ccnsfc) + elif IOP=='IOP2': + (times_ccn,ccnsfc,sssfc,timeunit)=read_CCN_hiscale_IOP2(ccnsfcpath) + sssfc=[int(x*10) for x in sssfc] + sssfc=np.array(sssfc)/10. + times_ccn=np.array(times_ccn) + ccnsfc=np.array(ccnsfc) + # find the nearest Supersaturation in Obs comparing to model + # 0.1% + idx = sssfc==0.1 + ccna = ccnsfc[idx] + t_ccna = times_ccn[idx] + SSa = 0.1 + # 0.5% + idx = sssfc==0.5 + ccnb = ccnsfc[idx] + t_ccnb = times_ccn[idx] + SSb = 0.5 + + #%% read in models + ccna_m = [] + ccnb_m = [] + nmodels = len(Model_List) + for mm in range(nmodels): + tmp_CCN3=np.empty(0) + tmp_CCN5=np.empty(0) + timem=np.empty(0) + for cday in range(cday1,cday2+1): + mmdd=cday2mmdd(cday) + date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + + filename_input = E3SM_sfc_path+'SFC_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + (time,ccn3,timemunit,dataunit,ccn3_longname)=read_E3SM(filename_input,'CCN3') + (time,ccn5,timemunit,dataunit,ccn5_longname)=read_E3SM(filename_input,'CCN5') + + timem = np.hstack((timem,time)) + tmp_CCN3 = np.hstack((tmp_CCN3,ccn3)) + tmp_CCN5 = np.hstack((tmp_CCN5,ccn5)) + + ccna_m.append(tmp_CCN3) + ccnb_m.append(tmp_CCN5) - filename_input = E3SM_sfc_path+'SFC_vars_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - (time,ccn3,timemunit,dataunit,ccn3_longname)=read_E3SM(filename_input,'CCN3') - (time,ccn5,timemunit,dataunit,ccn5_longname)=read_E3SM(filename_input,'CCN5') + # get supersaturation + SS3 = ccn3_longname.split('=')[-1] + SS5 = ccn5_longname.split('=')[-1] - timem = np.hstack((timem,time)) - tmp_CCN3 = np.hstack((tmp_CCN3,ccn3)) - tmp_CCN5 = np.hstack((tmp_CCN5,ccn5)) + #%% make plot + + figname = figpath_sfc_timeseries+'timeseries_CCN_'+campaign+'_'+IOP+'.png' + print('plotting figures to '+figname) - ccna_m.append(tmp_CCN3) - ccnb_m.append(tmp_CCN5) + fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - # get supersaturation - SS3 = ccn3_longname.split('=')[-1] - SS5 = ccn5_longname.split('=')[-1] + ax1.plot(t_ccna,ccna,color='k',linewidth=1,label='Obs') + for mm in range(nmodels): + ax1.plot(timem, ccna_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax1.set_yscale('log') + ax1.tick_params(color='k',labelsize=12) + ylim1 = ax1.get_ylim() -#%% make plot + ax2.plot(t_ccnb,ccnb,color='k',linewidth=1,label='Obs') + for mm in range(nmodels): + ax2.plot(timem, ccnb_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + ax2.set_yscale('log') + ax2.tick_params(color='k',labelsize=12) + ylim2 = ax2.get_ylim() -figname = figpath_sfc_timeseries+'timeseries_CCN_'+campaign+'_'+IOP+'.png' -print('plotting figures to '+figname) - -fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches -plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - -ax1.plot(t_ccna,ccna,color='k',linewidth=1,label='Obs') -for mm in range(nmodels): - ax1.plot(timem, ccna_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) -ax1.set_yscale('log') -ax1.tick_params(color='k',labelsize=12) -ylim1 = ax1.get_ylim() - -ax2.plot(t_ccnb,ccnb,color='k',linewidth=1,label='Obs') -for mm in range(nmodels): - ax2.plot(timem, ccnb_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) -ax2.set_yscale('log') -ax2.tick_params(color='k',labelsize=12) -ylim2 = ax2.get_ylim() - -# ax1.set_yticks([10,100,1000,10000,100000]) -# ax2.set_yticks([10,100,1000,10000,100000]) -ax1.set_xlim(cday1,cday2) -ax2.set_xlim(cday1,cday2) - -# set ylimit consistent in subplots -ax1.set_ylim([ylim1[0], ylim2[1]]) -ax2.set_ylim([ylim1[0], ylim2[1]]) - -# supersaturation -fig.text(0.67,0.9,'SS_obs='+format(np.nanmean(SSa),'.2f')+'%, SS_model='+SS3) -fig.text(0.67,0.4,'SS_obs='+format(np.nanmean(SSb),'.2f')+'%, SS_model='+SS5) - -ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) -ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) - -ax2.set_xlabel('Calendar Day',fontsize=14) -ax1.set_title('CCN Number Concentration (cm$^{-3}$) '+campaign+' '+IOP,fontsize=15) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + # ax1.set_yticks([10,100,1000,10000,100000]) + # ax2.set_yticks([10,100,1000,10000,100000]) + ax1.set_xlim(cday1,cday2) + ax2.set_xlim(cday1,cday2) + + # set ylimit consistent in subplots + ax1.set_ylim([ylim1[0], ylim2[1]]) + ax2.set_ylim([ylim1[0], ylim2[1]]) + + # supersaturation + fig.text(0.67,0.9,'SS_obs='+format(np.nanmean(SSa),'.2f')+'%, SS_model='+SS3) + fig.text(0.67,0.4,'SS_obs='+format(np.nanmean(SSb),'.2f')+'%, SS_model='+SS5) + + ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + + ax2.set_xlabel('Calendar Day',fontsize=14) + ax1.set_title('CCN Number Concentration (cm$^{-3}$) '+campaign+' '+IOP,fontsize=15) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) diff --git a/src/esmac_diags/plotting/plot_sfc_timeseries_CN.py b/src/esmac_diags/plotting/plot_sfc_timeseries_CN.py index 59d7eb7..c5de59d 100644 --- a/src/esmac_diags/plotting/plot_sfc_timeseries_CN.py +++ b/src/esmac_diags/plotting/plot_sfc_timeseries_CN.py @@ -3,8 +3,6 @@ # compare models and surface measurements """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -15,152 +13,163 @@ from ..subroutines.specific_data_treatment import avg_time_1d from ..subroutines.quality_control import qc_remove_neg,qc_mask_qcflag_cpc -#%% settings - -from settings import campaign, cpcsfcpath, cpcusfcpath, Model_List, color_model, \ - IOP, start_date, end_date, E3SM_sfc_path, figpath_sfc_timeseries - -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date,'noleap') -cday2 = yyyymmdd2cday(end_date,'noleap') -if start_date[0:4]!=end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] - -if not os.path.exists(figpath_sfc_timeseries): - os.makedirs(figpath_sfc_timeseries) - -#%% read in obs data -if campaign=='ACEENA': - # cpc - if IOP=='IOP1': - lst = glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.2017062*')+glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201707*') - elif IOP=='IOP2': - lst = glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201801*')+glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201802*') - lst.sort() - t_cpc=np.empty(0) - cpc=np.empty(0) - for filename in lst: - (time,data,qc,timeunit,cpcunit)=read_cpc(filename) - data=qc_mask_qcflag_cpc(data,qc) - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - # average in time for quicker and clearer plot - time2=np.arange(1800,86400,3600) - data2 = avg_time_1d(np.array(time),np.array(data),time2) - t_cpc=np.hstack((t_cpc, cday+time2/86400)) - cpc=np.hstack((cpc, data2)) - # no cpcu - t_cpcu = np.array(np.nan) - cpcu = np.array(np.nan) +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + cpcsfcpath = settings['cpcsfcpath'] + cpcusfcpath = settings['cpcusfcpath'] + start_date = settings['start_date'] + end_date = settings['end_date'] + E3SM_sfc_path = settings['E3SM_sfc_path'] + figpath_sfc_timeseries = settings['figpath_sfc_timeseries'] + + IOP = settings.get('IOP', None) + + #%% other settings -elif campaign=='HISCALE': - # cpc - if IOP=='IOP1': - lst = glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201604*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201605*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201606*') - elif IOP=='IOP2': - lst = glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201608*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201609*') - lst.sort() - t_cpc=np.empty(0) - cpc=np.empty(0) - if len(lst)==0: - t_cpc = np.array(np.nan) - cpc = np.array(np.nan) - else: + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date,'noleap') + cday2 = yyyymmdd2cday(end_date,'noleap') + if start_date[0:4]!=end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] + + if not os.path.exists(figpath_sfc_timeseries): + os.makedirs(figpath_sfc_timeseries) + + #%% read in obs data + if campaign=='ACEENA': + # cpc + if IOP=='IOP1': + lst = glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.2017062*')+glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201707*') + elif IOP=='IOP2': + lst = glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201801*')+glob.glob(cpcsfcpath+'enaaoscpcfC1.b1.201802*') + lst.sort() + t_cpc=np.empty(0) + cpc=np.empty(0) for filename in lst: (time,data,qc,timeunit,cpcunit)=read_cpc(filename) data=qc_mask_qcflag_cpc(data,qc) timestr=timeunit.split(' ') date=timestr[2] cday=yyyymmdd2cday(date,'noleap') - t_cpc=np.hstack((t_cpc, cday+time/86400)) - cpc=np.hstack((cpc, data)) - cpc=qc_remove_neg(cpc) - - # cpcu - if IOP=='IOP1': - lst = glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201604*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201605*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201606*') - elif IOP=='IOP2': - lst = glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201608*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201609*') - lst.sort() - t_cpcu=np.empty(0) - cpcu=np.empty(0) - if len(lst)==0: + # average in time for quicker and clearer plot + time2=np.arange(1800,86400,3600) + data2 = avg_time_1d(np.array(time),np.array(data),time2) + t_cpc=np.hstack((t_cpc, cday+time2/86400)) + cpc=np.hstack((cpc, data2)) + # no cpcu t_cpcu = np.array(np.nan) cpcu = np.array(np.nan) - else: - for filename in lst: - (time,data,qc,timeunit,cpcuunit)=read_cpc(filename) - data=qc_mask_qcflag_cpc(data,qc) - timestr=timeunit.split(' ') - date=timestr[2] - cday=yyyymmdd2cday(date,'noleap') - t_cpcu=np.hstack((t_cpcu, cday+time/86400)) - cpcu=np.hstack((cpcu, data)) - cpcu=qc_remove_neg(cpcu) - -#%% read in models -ncn_m = [] -nucn_m = [] -nmodels = len(Model_List) -for mm in range(nmodels): - tmp_ncn=np.empty(0) - tmp_nucn=np.empty(0) - timem=np.empty(0) - for cday in range(cday1,cday2+1): - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] - filename_input = E3SM_sfc_path+'SFC_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' - (time,ncn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NCN') - (time,nucn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NUCN') + elif campaign=='HISCALE': + # cpc + if IOP=='IOP1': + lst = glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201604*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201605*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201606*') + elif IOP=='IOP2': + lst = glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201608*')+glob.glob(cpcsfcpath+'sgpaoscpcC1.b1.201609*') + lst.sort() + t_cpc=np.empty(0) + cpc=np.empty(0) + if len(lst)==0: + t_cpc = np.array(np.nan) + cpc = np.array(np.nan) + else: + for filename in lst: + (time,data,qc,timeunit,cpcunit)=read_cpc(filename) + data=qc_mask_qcflag_cpc(data,qc) + timestr=timeunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + t_cpc=np.hstack((t_cpc, cday+time/86400)) + cpc=np.hstack((cpc, data)) + cpc=qc_remove_neg(cpc) + + # cpcu + if IOP=='IOP1': + lst = glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201604*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201605*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201606*') + elif IOP=='IOP2': + lst = glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201608*')+glob.glob(cpcusfcpath+'sgpaoscpcuS01.b1.201609*') + lst.sort() + t_cpcu=np.empty(0) + cpcu=np.empty(0) + if len(lst)==0: + t_cpcu = np.array(np.nan) + cpcu = np.array(np.nan) + else: + for filename in lst: + (time,data,qc,timeunit,cpcuunit)=read_cpc(filename) + data=qc_mask_qcflag_cpc(data,qc) + timestr=timeunit.split(' ') + date=timestr[2] + cday=yyyymmdd2cday(date,'noleap') + t_cpcu=np.hstack((t_cpcu, cday+time/86400)) + cpcu=np.hstack((cpcu, data)) + cpcu=qc_remove_neg(cpcu) + + #%% read in models + ncn_m = [] + nucn_m = [] + nmodels = len(Model_List) + for mm in range(nmodels): + tmp_ncn=np.empty(0) + tmp_nucn=np.empty(0) + timem=np.empty(0) + for cday in range(cday1,cday2+1): + mmdd=cday2mmdd(cday) + date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] + + filename_input = E3SM_sfc_path+'SFC_CNsize_'+campaign+'_'+Model_List[mm]+'_'+date+'.nc' + (time,ncn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NCN') + (time,nucn,timemunit,dataunit,long_name)=read_E3SM(filename_input,'NUCN') + + timem = np.hstack((timem,time)) + tmp_ncn = np.hstack((tmp_ncn,ncn*1e-6)) + tmp_nucn = np.hstack((tmp_nucn,nucn*1e-6)) + + ncn_m.append(tmp_ncn) + nucn_m.append(tmp_nucn) - timem = np.hstack((timem,time)) - tmp_ncn = np.hstack((tmp_ncn,ncn*1e-6)) - tmp_nucn = np.hstack((tmp_nucn,nucn*1e-6)) - ncn_m.append(tmp_ncn) - nucn_m.append(tmp_nucn) + #%% make plot + + figname = figpath_sfc_timeseries+'timeseries_CN_'+campaign+'_'+IOP+'.png' + print('plotting figures to '+figname) - -#%% make plot + fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.plot(t_cpc,cpc,color='k',linewidth=1,label='CPC(>10nm)') + for mm in range(nmodels): + ax1.plot(timem, ncn_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax1.set_yscale('log') + ax1.tick_params(color='k',labelsize=12) + # ylim1 = ax1.get_ylim() + + ax2.plot(t_cpcu,cpcu,color='k',linewidth=1,label='CPC(>3nm)') + for mm in range(nmodels): + ax2.plot(timem, nucn_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax2.set_yscale('log') + ax2.tick_params(color='k',labelsize=12) + # ylim2 = ax2.get_ylim() + + # ax1.set_yticks([10,100,1000,10000,100000]) + # ax2.set_yticks([10,100,1000,10000,100000]) + ax1.set_xlim(cday1,cday2) + ax2.set_xlim(cday1,cday2) + + # # set ylimit consistent in subplots + # ax1.set_ylim([ylim1[0], ylim2[1]]) + # ax2.set_ylim([ylim1[0], ylim2[1]]) + + + ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) + + ax2.set_xlabel('Calendar Day',fontsize=14) + ax1.set_title('Aerosol Number Concentration (cm$^{-3}$) '+campaign+' '+IOP,fontsize=15) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) -figname = figpath_sfc_timeseries+'timeseries_CN_'+campaign+'_'+IOP+'.png' -print('plotting figures to '+figname) - -fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches -plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - -ax1.plot(t_cpc,cpc,color='k',linewidth=1,label='CPC(>10nm)') -for mm in range(nmodels): - ax1.plot(timem, ncn_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) -# ax1.set_yscale('log') -ax1.tick_params(color='k',labelsize=12) -ylim1 = ax1.get_ylim() - -ax2.plot(t_cpcu,cpcu,color='k',linewidth=1,label='CPC(>3nm)') -for mm in range(nmodels): - ax2.plot(timem, nucn_m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) -# ax2.set_yscale('log') -ax2.tick_params(color='k',labelsize=12) -ylim2 = ax2.get_ylim() - -# ax1.set_yticks([10,100,1000,10000,100000]) -# ax2.set_yticks([10,100,1000,10000,100000]) -ax1.set_xlim(cday1,cday2) -ax2.set_xlim(cday1,cday2) - -# # set ylimit consistent in subplots -# ax1.set_ylim([ylim1[0], ylim2[1]]) -# ax2.set_ylim([ylim1[0], ylim2[1]]) - - -ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) -ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.25, .5)) - -ax2.set_xlabel('Calendar Day',fontsize=14) -ax1.set_title('Aerosol Number Concentration (cm$^{-3}$) '+campaign+' '+IOP,fontsize=15) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - diff --git a/src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py b/src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py index 8caf715..ba89cf4 100644 --- a/src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py +++ b/src/esmac_diags/plotting/plot_ship_latitude_rainLWP.py @@ -2,8 +2,6 @@ # plot ship-track meteorological variables binned by different latitudes """ -import sys - import os import glob import matplotlib.pyplot as plt @@ -14,223 +12,231 @@ from ..subroutines.read_netcdf import read_E3SM from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd -#%% settings - -from settings import campaign, latbin, Model_List, color_model, \ - shipmetpath, shipmwrpath, E3SM_ship_path, figpath_ship_statistics - -dlat = latbin[1]-latbin[0] -latmin = latbin-dlat/2 -latmax = latbin+dlat/2 -latlen = len(latbin) - -if not os.path.exists(figpath_ship_statistics): - os.makedirs(figpath_ship_statistics) - - -#%% read in observation - -# initialize variables by latitude bins -lwp_o = list() -rain_o = list() -for bb in range(latlen): - lwp_o.append(np.empty(0)) - rain_o.append(np.empty(0)) - -if campaign=='MAGIC': - lst = glob.glob(shipmetpath+'marmet*.txt') - lst.sort() - - for ll in range(len(lst)): - legnum=lst[ll][-6:-4] +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + latbin = settings['latbin'] + shipmetpath = settings['shipmetpath'] + shipmwrpath = settings['shipmwrpath'] + E3SM_ship_path = settings['E3SM_ship_path'] + figpath_ship_statistics = settings['figpath_ship_statistics'] + + #%% other settings + + dlat = latbin[1]-latbin[0] + latmin = latbin-dlat/2 + latmax = latbin+dlat/2 + latlen = len(latbin) + + if not os.path.exists(figpath_ship_statistics): + os.makedirs(figpath_ship_statistics) + + + #%% read in observation + + # initialize variables by latitude bins + lwp_o = list() + rain_o = list() + for bb in range(latlen): + lwp_o.append(np.empty(0)) + rain_o.append(np.empty(0)) + + if campaign=='MAGIC': + lst = glob.glob(shipmetpath+'marmet*.txt') + lst.sort() + + for ll in range(len(lst)): + legnum=lst[ll][-6:-4] + + # read in MET + filenameo = shipmetpath+'marmet'+legnum+'.txt' + (shipdata,shipvarlist) = read_marmet(filenameo) + # get variables + lat=np.array([float(a[shipvarlist.index('lat')]) for a in shipdata]) + lon=np.array([float(a[shipvarlist.index('lon')]) for a in shipdata]) + rain=np.array([float(a[shipvarlist.index('org')]) for a in shipdata]) + lat[lat==-999]=np.nan + lon[lon==-999]=np.nan + rain[rain==-999]=np.nan + # rain rate in leg 19 are unrealistic. mask all data + if legnum=='19': + rain=rain*np.nan + # separate into latitude bins + for bb in range(latlen): + idx = np.logical_and(lat>=latmin[bb], lat=latmin[bb], latt_lwp[-1]: + t_lwp[t_lwp<=t_lwp[-1]]=t_lwp[t_lwp<=t_lwp[-1]]+365 + lat1=np.interp(t_lwp,time0,lat) + lon1=np.interp(t_lwp,time0,lon) + # separate into latitude bins + for bb in range(latlen): + idx = np.logical_and(lat1>=latmin[bb], lat1=latmin[bb], latt_lwp[-1]: - t_lwp[t_lwp<=t_lwp[-1]]=t_lwp[t_lwp<=t_lwp[-1]]+365 - lat1=np.interp(t_lwp,time0,lat) - lon1=np.interp(t_lwp,time0,lon) - # separate into latitude bins - for bb in range(latlen): - idx = np.logical_and(lat1>=latmin[bb], lat1=latmin[bb], lat1=latmin[bb], lat=latmin[bb], lat1=latmin[bb], lat0=latmin[bb], lat00)) # number of valid values + data=data*1e-6 # change unit from 1/m3 to 1/cm3 + + # average in time for quicker plot + time0=np.arange(timem[0],timem[-1]+0.04,1./24) + data0 = avg_time_2d(timem,data.T,time0) + pdfall_m[mm] = np.column_stack((pdfall_m[mm],data0.T)) + + meandata=np.nanmean(data,1) + data2.append(meandata) + + # mean pdf + ntotal=sum(ntimes) + data3=[data2[ii]*ntimes[ii]/ntotal for ii in range(len(ntimes))] + pdf_model.append(sum(data3)) + + #%% read in observations + + nbins = 99 # for UHSAS at MAGIC + pdfall_o = np.empty((nbins,0)) + + if campaign=='MAGIC': + startdate='2012-09-22' + enddate='2013-09-26' + elif campaign=='MARCUS': + startdate='2017-10-30' + enddate='2018-03-22' + cday1=yyyymmdd2cday(startdate,'noleap') + cday2=yyyymmdd2cday(enddate,'noleap') + if startdate[0:4]!=enddate[0:4]: + cday2=cday2+365 # cover two years + + uhsasall=list() ntimes = list() - for ll in range(len(lst)): + for cc in range(cday1,cday2+1): + if cc<=365: + yyyymmdd=startdate[0:4]+cday2mmdd(cc) + else: + yyyymmdd=enddate[0:4]+cday2mmdd(cc-365) + if campaign=='MAGIC': - legnum=lst[ll][-5:-3] + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.'+yyyymmdd+'*') elif campaign=='MARCUS': - legnum=lst[ll][-4] - print(legnum) + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.'+yyyymmdd+'*') + if len(filenameo)==0: + continue + elif len(filenameo)>1: + raise ValueError('find too many files') - filenamem = E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' - (timem,data,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCNall') + print(yyyymmdd) - # average for each file to reduce computational time - ntimes.append(sum(data[0,:]>0)) # number of valid values - data=data*1e-6 # change unit from 1/m3 to 1/cm3 + (time,dmin,dmax,uhsas,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) + uhsas=np.ma.filled(uhsas) # average in time for quicker plot - time0=np.arange(timem[0],timem[-1]+0.04,1./24) - data0 = avg_time_2d(timem,data.T,time0) - pdfall_m[mm] = np.column_stack((pdfall_m[mm],data0.T)) + time0=np.arange(1800,86400,3600) + data0 = avg_time_2d(time,uhsas,time0) + pdfall_o = np.column_stack((pdfall_o,data0.T)) - meandata=np.nanmean(data,1) - data2.append(meandata) + # average for each file to reduce computational time + ntimes.append(sum(uhsas[:,0]>=0)) # number of valid values + meandata=np.nanmean(uhsas,0) + meandata[np.isnan(meandata)]=0 + uhsasall.append(meandata) + size_u = (dmin+dmax)/2 + # mean pdf ntotal=sum(ntimes) - data3=[data2[ii]*ntimes[ii]/ntotal for ii in range(len(ntimes))] - pdf_model.append(sum(data3)) + pdf_obs=sum([uhsasall[ii]*ntimes[ii]/ntotal for ii in range(len(ntimes))]) -#%% read in observations - -nbins = 99 # for UHSAS at MAGIC -pdfall_o = np.empty((nbins,0)) - -if campaign=='MAGIC': - startdate='2012-09-22' - enddate='2013-09-26' -elif campaign=='MARCUS': - startdate='2017-10-30' - enddate='2018-03-22' -cday1=yyyymmdd2cday(startdate,'noleap') -cday2=yyyymmdd2cday(enddate,'noleap') -if startdate[0:4]!=enddate[0:4]: - cday2=cday2+365 # cover two years - -uhsasall=list() -ntimes = list() -for cc in range(cday1,cday2+1): - if cc<=365: - yyyymmdd=startdate[0:4]+cday2mmdd(cc) - else: - yyyymmdd=enddate[0:4]+cday2mmdd(cc-365) + #%% change to dN/dlnDp + dlnDp_u=np.empty(nbins) + for bb in range(len(size_u)): + dlnDp_u[bb]=np.log(dmax[bb]/dmin[bb]) + dlnDp=np.empty(3000) + for bb in range(3000): + dlnDp[bb]=np.log((bb+2)/(bb+1)) + pdf_obs=pdf_obs/dlnDp_u + for mm in range(nmodels): + pdf_model[mm]=pdf_model[mm]/dlnDp + + #%% + pct1_o = [np.nanpercentile(pdfall_o[i,:]/dlnDp_u[i],10) for i in range(nbins)] + pct2_o = [np.nanpercentile(pdfall_o[i,:]/dlnDp_u[i],90) for i in range(nbins)] + pct1_m = [[] for mm in range(nmodels)] + pct2_m = [[] for mm in range(nmodels)] + for mm in range(nmodels): + pct1_m[mm] = [np.nanpercentile(pdfall_m[mm][i,:]/dlnDp[i],10) for i in range(3000)] + pct2_m[mm] = [np.nanpercentile(pdfall_m[mm][i,:]/dlnDp[i],90) for i in range(3000)] + + #%% plot + figname = figpath_ship_statistics+'pdf_AerosolSize_'+campaign+'.png' + + print('plotting figures to '+figname) + + #fig = plt.figure() + fig,ax = plt.subplots(figsize=(4,2.5)) # figsize in inches + + ax.plot(size_u,pdf_obs,color='k',label='Obs') + for mm in range(nmodels): + ax.plot(np.arange(1,3001),pdf_model[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + + ax.fill_between(size_u,pct1_o,pct2_o, alpha=0.5, facecolor='gray') + for mm in range(nmodels): + ax.fill_between(np.arange(1,3001),pct1_m[mm],pct2_m[mm], alpha=0.2, facecolor=color_model[mm]) - if campaign=='MAGIC': - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.'+yyyymmdd+'*') - elif campaign=='MARCUS': - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.'+yyyymmdd+'*') - if len(filenameo)==0: - continue - elif len(filenameo)>1: - raise ValueError('find too many files') - - print(yyyymmdd) - - (time,dmin,dmax,uhsas,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) - - uhsas=np.ma.filled(uhsas) - # average in time for quicker plot - time0=np.arange(1800,86400,3600) - data0 = avg_time_2d(time,uhsas,time0) - pdfall_o = np.column_stack((pdfall_o,data0.T)) - - # average for each file to reduce computational time - ntimes.append(sum(uhsas[:,0]>=0)) # number of valid values - meandata=np.nanmean(uhsas,0) - meandata[np.isnan(meandata)]=0 - uhsasall.append(meandata) - -size_u = (dmin+dmax)/2 -dsize_u = dmax-dmin - -# mean pdf -ntotal=sum(ntimes) -pdf_obs=sum([uhsasall[ii]*ntimes[ii]/ntotal for ii in range(len(ntimes))]) - -#%% change to dN/dlnDp -dlnDp_u=np.empty(nbins) -for bb in range(len(size_u)): - dlnDp_u[bb]=np.log(dmax[bb]/dmin[bb]) -dlnDp=np.empty(3000) -for bb in range(3000): - dlnDp[bb]=np.log((bb+2)/(bb+1)) -pdf_obs=pdf_obs/dlnDp_u -for mm in range(nmodels): - pdf_model[mm]=pdf_model[mm]/dlnDp - -#%% -pct1_o = [np.nanpercentile(pdfall_o[i,:]/dlnDp_u[i],10) for i in range(nbins)] -pct2_o = [np.nanpercentile(pdfall_o[i,:]/dlnDp_u[i],90) for i in range(nbins)] -pct1_m = [[] for mm in range(nmodels)] -pct2_m = [[] for mm in range(nmodels)] -for mm in range(nmodels): - pct1_m[mm] = [np.nanpercentile(pdfall_m[mm][i,:]/dlnDp[i],10) for i in range(3000)] - pct2_m[mm] = [np.nanpercentile(pdfall_m[mm][i,:]/dlnDp[i],90) for i in range(3000)] - -#%% plot -figname = figpath_ship_statistics+'pdf_AerosolSize_'+campaign+'.png' - -print('plotting figures to '+figname) - -#fig = plt.figure() -fig,ax = plt.subplots(figsize=(4,2.5)) # figsize in inches - -ax.plot(size_u,pdf_obs,color='k',label='Obs') -for mm in range(nmodels): - ax.plot(np.arange(1,3001),pdf_model[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - -ax.fill_between(size_u,pct1_o,pct2_o, alpha=0.5, facecolor='gray') -for mm in range(nmodels): - ax.fill_between(np.arange(1,3001),pct1_m[mm],pct2_m[mm], alpha=0.2, facecolor=color_model[mm]) - -ax.legend(loc='upper right', shadow=False, fontsize='medium') -ax.tick_params(color='k',labelsize=12) -ax.set_xscale('log') -ax.set_yscale('log') -ax.set_ylim(0.01,1e4) -ax.set_xlabel('Diameter (nm)',fontsize=13) -ax.set_ylabel('#/dlnDp (cm$^{-3}$)',fontsize=13) -ax.set_title(campaign,fontsize=14) - -fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) - + ax.legend(loc='upper right', shadow=False, fontsize='medium') + ax.tick_params(color='k',labelsize=12) + ax.set_xscale('log') + ax.set_yscale('log') + ax.set_ylim(0.01,1e4) + ax.set_xlabel('Diameter (nm)',fontsize=13) + ax.set_ylabel('#/dlnDp (cm$^{-3}$)',fontsize=13) + ax.set_title(campaign,fontsize=14) + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + diff --git a/src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py b/src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py index 3ec8326..ecf9b08 100644 --- a/src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py +++ b/src/esmac_diags/plotting/plot_ship_percentile_lat_CCN.py @@ -1,7 +1,6 @@ """ # plot ship-track CCN number concentration binned by different latitudes """ -import sys import os import glob @@ -12,211 +11,218 @@ from ..subroutines.time_format_change import cday2mmdd from ..subroutines.quality_control import qc_mask_qcflag,qc_ccn_max -#%% settings +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + latbin = settings['latbin'] + shipccnpath = settings['shipccnpath'] + E3SM_ship_path = settings['E3SM_ship_path'] + figpath_ship_statistics = settings['figpath_ship_statistics'] -from settings import campaign, latbin, Model_List, color_model, \ - shipccnpath, E3SM_ship_path, figpath_ship_statistics - -dlat = latbin[1]-latbin[0] -latmin = latbin-dlat/2 -latmax = latbin+dlat/2 -latlen = len(latbin) - -if not os.path.exists(figpath_ship_statistics): - os.makedirs(figpath_ship_statistics) - -#%% read in model -nmodels=len(Model_List) -ccn3_m = list() -ccn5_m = list() -for mm in range(nmodels): - # initialize variables by latitude bins - ccn3_tmp = list() - ccn5_tmp = list() - for bb in range(latlen): - ccn3_tmp.append(np.empty(0)) - ccn5_tmp.append(np.empty(0)) + #%% other settings + + dlat = latbin[1]-latbin[0] + latmin = latbin-dlat/2 + latmax = latbin+dlat/2 + latlen = len(latbin) - lst = glob.glob(E3SM_ship_path+'Ship_vars_'+campaign+'_'+Model_List[mm]+'_shipleg*.nc') + if not os.path.exists(figpath_ship_statistics): + os.makedirs(figpath_ship_statistics) + + #%% read in model + nmodels=len(Model_List) + ccn3_m = list() + ccn5_m = list() + for mm in range(nmodels): + # initialize variables by latitude bins + ccn3_tmp = list() + ccn5_tmp = list() + for bb in range(latlen): + ccn3_tmp.append(np.empty(0)) + ccn5_tmp.append(np.empty(0)) - for ll in range(len(lst)): + lst = glob.glob(E3SM_ship_path+'Ship_vars_'+campaign+'_'+Model_List[mm]+'_shipleg*.nc') + + for ll in range(len(lst)): + filenamem = lst[ll] + (timem,varm,timeunitm,varmunit,varmlongname)=read_E3SM(filenamem,['CCN3','CCN5','lat','lon']) + for ii in range(len(varm)): + varm[ii][varm[ii]<-9000] = np.nan + + lat0=varm[2] + lon0=varm[3] + ccn3=varm[0] + ccn5=varm[1] + + # separate into latitude bins + for bb in range(latlen): + idx = np.logical_and(lat0>=latmin[bb], lat0timem[-1]: + timem[timem<=timem[-1]]=timem[timem<=timem[-1]]+365 + + # find the days related to the ship leg + day = [int(a) for a in timem] + day = list(set(day)) + day.sort() - lat0=varm[2] - lon0=varm[3] - ccn3=varm[0] - ccn5=varm[1] + # read in CCN + t_ccn=np.empty(0) + ccn=np.empty(0) + SS=np.empty(0) + for dd in day: + if campaign=='MAGIC': + if int(legnum)<=9: + if dd<=365: # year 2012 + filenameo = glob.glob(shipccnpath+'magaosccn100M1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') + else: + filenameo = glob.glob(shipccnpath+'magaosccn100M1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*.cdf') + else: + filenameo = glob.glob(shipccnpath+'magaosccn100M1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') + if len(filenameo)==0: + continue # some days may be missing + (time,timeunit,obs,dataunit,SS0)=read_ccn_magic(filenameo[0]) + elif campaign=='MARCUS': + if int(legnum)<=2: + if dd<=365: # year 2012 + filenameo = glob.glob(shipccnpath+'maraosccn1colavgM1.b1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipccnpath+'maraosccn1colavgM1.b1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipccnpath+'maraosccn1colavgM1.b1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + if len(filenameo)==0: + continue # some days may be missing + (time,timeunit,obs,qc,dataunit,SS0)=read_ccn(filenameo[0]) + obs=qc_mask_qcflag(obs,qc) + t_ccn=np.hstack((t_ccn, dd+time/86400)) + ccn=np.hstack((ccn, obs)) + SS=np.hstack((SS, SS0)) + + ccn=qc_ccn_max(ccn,SS) + # if time expands two years, add 365 days to the second year + if t_ccn[0]>t_ccn[-1]: + t_ccn[t_ccn<=t_ccn[-1]]=t_ccn[t_ccn<=t_ccn[-1]]+365 + # SS=0.1% + idx = np.logical_and(SS>0.05, SS<0.15) + t_ccn1 = t_ccn[idx] + ccn1o = ccn[idx] + SS1 = 0.1 + # SS=0.5% + idx = np.logical_and(SS>0.4, SS<0.6) + t_ccn5 = t_ccn[idx] + ccn5o = ccn[idx] + SS5 = 0.5 + + lat1=np.interp(t_ccn1,timem,lat0) + lon1=np.interp(t_ccn1,timem,lon0) + lat5=np.interp(t_ccn5,timem,lat0) + lon5=np.interp(t_ccn5,timem,lon0) # separate into latitude bins for bb in range(latlen): - idx = np.logical_and(lat0>=latmin[bb], lat0=latmin[bb], lat1=latmin[bb], lat5timem[-1]: - timem[timem<=timem[-1]]=timem[timem<=timem[-1]]+365 - - # find the days related to the ship leg - day = [int(a) for a in timem] - day = list(set(day)) - day.sort() + #%% + for bb in range(latlen): + ccn3_o[bb] = ccn3_o[bb][~np.isnan(ccn3_o[bb])] + ccn5_o[bb] = ccn5_o[bb][~np.isnan(ccn5_o[bb])] - # read in CCN - t_ccn=np.empty(0) - ccn=np.empty(0) - SS=np.empty(0) - for dd in day: - if campaign=='MAGIC': - if int(legnum)<=9: - if dd<=365: # year 2012 - filenameo = glob.glob(shipccnpath+'magaosccn100M1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') - else: - filenameo = glob.glob(shipccnpath+'magaosccn100M1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*.cdf') - else: - filenameo = glob.glob(shipccnpath+'magaosccn100M1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') - if len(filenameo)==0: - continue # some days may be missing - (time,timeunit,obs,dataunit,SS0)=read_ccn_magic(filenameo[0]) - elif campaign=='MARCUS': - if int(legnum)<=2: - if dd<=365: # year 2012 - filenameo = glob.glob(shipccnpath+'maraosccn1colavgM1.b1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipccnpath+'maraosccn1colavgM1.b1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipccnpath+'maraosccn1colavgM1.b1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') - if len(filenameo)==0: - continue # some days may be missing - (time,timeunit,obs,qc,dataunit,SS0)=read_ccn(filenameo[0]) - obs=qc_mask_qcflag(obs,qc) - t_ccn=np.hstack((t_ccn, dd+time/86400)) - ccn=np.hstack((ccn, obs)) - SS=np.hstack((SS, SS0)) - - ccn=qc_ccn_max(ccn,SS) - # if time expands two years, add 365 days to the second year - if t_ccn[0]>t_ccn[-1]: - t_ccn[t_ccn<=t_ccn[-1]]=t_ccn[t_ccn<=t_ccn[-1]]+365 - # SS=0.1% - idx = np.logical_and(SS>0.05, SS<0.15) - t_ccn1 = t_ccn[idx] - ccn1o = ccn[idx] - SS1 = 0.1 - # SS=0.5% - idx = np.logical_and(SS>0.4, SS<0.6) - t_ccn5 = t_ccn[idx] - ccn5o = ccn[idx] - SS5 = 0.5 + #%% make plot + # set position shift so that models and obs are not overlapped + p_shift = np.arange(nmodels+1) + p_shift = (p_shift - p_shift.mean())*0.2 - lat1=np.interp(t_ccn1,timem,lat0) - lon1=np.interp(t_ccn1,timem,lon0) - lat5=np.interp(t_ccn5,timem,lat0) - lon5=np.interp(t_ccn5,timem,lon0) - # separate into latitude bins - for bb in range(latlen): - idx = np.logical_and(lat1>=latmin[bb], lat1=latmin[bb], lat5=latmin[bb], lat0t_cpc[-1]: + t_cpc[t_cpc<=t_cpc[-1]]=t_cpc[t_cpc<=t_cpc[-1]]+365 + lat2=np.interp(t_cpc,timem,lat1) # separate into latitude bins for bb in range(latlen): - idx = np.logical_and(lat0>=latmin[bb], lat0=latmin[bb], lat2t_cpc[-1]: - t_cpc[t_cpc<=t_cpc[-1]]=t_cpc[t_cpc<=t_cpc[-1]]+365 - lat2=np.interp(t_cpc,timem,lat1) - lon2=np.interp(t_cpc,timem,lon1) - # separate into latitude bins + if len(filenameo)>1: + raise ValueError('find too many files') + + (time,dmin,dmax,obs,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) + obs=np.ma.filled(obs) + obs=qc_remove_neg(obs) + uhsas=np.hstack((uhsas, np.nansum(obs,1))) + t_uh = np.hstack((t_uh,time/86400+dd)) + + uhsas=qc_cn_max(uhsas,100) + # if no obs available, fill one data with NaN + if len(t_uh)==0: + t_uh=[timem[0],timem[1]] + uhsas=np.full((2),np.nan) + # if time expands two years, add 365 days to the second year + if t_uh[0]>t_uh[-1]: + t_uh[t_uh<=t_uh[-1]]=t_uh[t_uh<=t_uh[-1]]+365 + lat3=np.interp(t_uh,timem,lat1) + # separate into latitude bins + for bb in range(latlen): + idx = np.logical_and(lat3>=latmin[bb], lat3=latmin[bb], lat21: - raise ValueError('find too many files') - - (time,dmin,dmax,obs,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) - obs=np.ma.filled(obs) - obs=qc_remove_neg(obs) - uhsas=np.hstack((uhsas, np.nansum(obs,1))) - t_uh = np.hstack((t_uh,time/86400+dd)) + figname = figpath_ship_statistics+'percentile_lat_CN_'+campaign+'.png' + print('plotting figures to '+figname) + + fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - uhsas=qc_cn_max(uhsas,100) - # if no obs available, fill one data with NaN - if len(t_uh)==0: - t_uh=[timem[0],timem[1]] - uhsas=np.full((2),np.nan) - # if time expands two years, add 365 days to the second year - if t_uh[0]>t_uh[-1]: - t_uh[t_uh<=t_uh[-1]]=t_uh[t_uh<=t_uh[-1]]+365 - lat3=np.interp(t_uh,timem,lat1) - lon3=np.interp(t_uh,timem,lon1) - # separate into latitude bins - for bb in range(latlen): - idx = np.logical_and(lat3>=latmin[bb], lat3=latmin[bb], lat0=latmin[bb], lat0=latmin[bb], lat1=latmin[bb], lat1=latmin[bb], lat=latmin[bb], lat=latmin[bb], lat0=latmin[bb], lat=latmin[bb], lat=latmin[bb], lat0t_ccn[-1]: - t_ccn[t_ccn<=t_ccn[-1]]=t_ccn[t_ccn<=t_ccn[-1]]+365 - - # ccn[np.logical_or(ccn<0,ccn>1500)]=np.nan - # SS=0.1% - idx = np.logical_and(SS>0.05, SS<0.15) - t_ccn1 = t_ccn[idx] - ccn1o = ccn[idx] - SS1 = 0.1 - # SS=0.5% - idx = np.logical_and(SS>0.4, SS<0.6) - t_ccn5 = t_ccn[idx] - ccn5o = ccn[idx] - SS5 = 0.5 - - #%% make plot + # if time expands two years, add 365 days to the second year + if t_ccn[0]>t_ccn[-1]: + t_ccn[t_ccn<=t_ccn[-1]]=t_ccn[t_ccn<=t_ccn[-1]]+365 + + # ccn[np.logical_or(ccn<0,ccn>1500)]=np.nan + # SS=0.1% + idx = np.logical_and(SS>0.05, SS<0.15) + t_ccn1 = t_ccn[idx] + ccn1o = ccn[idx] + SS1 = 0.1 + # SS=0.5% + idx = np.logical_and(SS>0.4, SS<0.6) + t_ccn5 = t_ccn[idx] + ccn5o = ccn[idx] + SS5 = 0.5 - figname = figpath_ship_timeseries+'timeseries_CCN_'+campaign+'_ship'+legnum+'.png' - print('plotting figures to '+figname) - - fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.plot(t_ccn1,ccn1o,color='k',linewidth=1,label='OBS') - for mm in range(nmodels): - ax1.plot(timem, ccn1m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - # ax1.set_yscale('log') - ax1.tick_params(color='k',labelsize=12) - ylim1 = ax1.get_ylim() - - ax2.plot(t_ccn5,ccn5o,color='k',linewidth=1,label='OBS') - for mm in range(nmodels): - ax2.plot(timem, ccn5m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - # ax2.set_yscale('log') - ax2.tick_params(color='k',labelsize=12) - ylim2 = ax2.get_ylim() - - # set ylimit consistent in subplots - # ax1.set_ylim([ylim1[0], ylim2[1]]) - # ax2.set_ylim([ylim1[0], ylim2[1]]) - - ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.2, .5)) - ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.2, .5)) - - # supersaturation - fig.text(0.08,0.9,'SS='+str(SS1)+'%') - fig.text(0.08,0.4,'SS='+str(SS5)+'%') - - ax2.set_xlabel('Calendar Day in '+year0,fontsize=14) + #%% make plot + + figname = figpath_ship_timeseries+'timeseries_CCN_'+campaign+'_ship'+legnum+'.png' + print('plotting figures to '+figname) - ax1.set_title('CCN Number Concentration (cm$^{-3}$)',fontsize=15) - - fig.text(.08, .999,'trip # '+legnum, fontsize=12) - - # mask non-ocean model grid (ps is inconsistent with obs) - ax1.vlines(timem[datamask],ylim1[0],ylim1[1],color='lightgray') - ax2.vlines(timem[datamask],ylim2[0],ylim2[1],color='lightgray') - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) \ No newline at end of file + fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 + + ax1.plot(t_ccn1,ccn1o,color='k',linewidth=1,label='OBS') + for mm in range(nmodels): + ax1.plot(timem, ccn1m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax1.set_yscale('log') + ax1.tick_params(color='k',labelsize=12) + ylim1 = ax1.get_ylim() + + ax2.plot(t_ccn5,ccn5o,color='k',linewidth=1,label='OBS') + for mm in range(nmodels): + ax2.plot(timem, ccn5m[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax2.set_yscale('log') + ax2.tick_params(color='k',labelsize=12) + ylim2 = ax2.get_ylim() + + # set ylimit consistent in subplots + # ax1.set_ylim([ylim1[0], ylim2[1]]) + # ax2.set_ylim([ylim1[0], ylim2[1]]) + + ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.2, .5)) + ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.2, .5)) + + # supersaturation + fig.text(0.08,0.9,'SS='+str(SS1)+'%') + fig.text(0.08,0.4,'SS='+str(SS5)+'%') + + ax2.set_xlabel('Calendar Day in '+year0,fontsize=14) + + ax1.set_title('CCN Number Concentration (cm$^{-3}$)',fontsize=15) + + fig.text(.08, .999,'trip # '+legnum, fontsize=12) + + # mask non-ocean model grid (ps is inconsistent with obs) + ax1.vlines(timem[datamask],ylim1[0],ylim1[1],color='lightgray') + ax2.vlines(timem[datamask],ylim2[0],ylim2[1],color='lightgray') + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + plt.close() \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_ship_timeseries_CN.py b/src/esmac_diags/plotting/plot_ship_timeseries_CN.py index 9c35411..5787ce6 100644 --- a/src/esmac_diags/plotting/plot_ship_timeseries_CN.py +++ b/src/esmac_diags/plotting/plot_ship_timeseries_CN.py @@ -1,7 +1,6 @@ """ # plot timeseries of surface aerosol number concentration along each ship leg """ -import sys import os import glob @@ -13,176 +12,185 @@ from ..subroutines.specific_data_treatment import mask_model_ps from ..subroutines.quality_control import qc_mask_qcflag,qc_remove_neg,qc_cn_max -#%% settings +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + shipcpcpath = settings['shipcpcpath'] + shipuhsaspath = settings['shipuhsaspath'] + shipmetpath = settings['shipmetpath'] + E3SM_ship_path = settings['E3SM_ship_path'] + figpath_ship_timeseries = settings['figpath_ship_timeseries'] -from settings import campaign, Model_List, color_model, \ - shipcpcpath, shipmetpath, shipuhsaspath, E3SM_ship_path, figpath_ship_timeseries - -if not os.path.exists(figpath_ship_timeseries): - os.makedirs(figpath_ship_timeseries) - -lst = glob.glob(E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[0]+'_shipleg*.nc') -lst.sort() - -for ll in range(len(lst)): + #%% other settings - if campaign=='MAGIC': - legnum=lst[ll][-5:-3] - elif campaign=='MARCUS': - legnum=lst[ll][-4] + if not os.path.exists(figpath_ship_timeseries): + os.makedirs(figpath_ship_timeseries) - #%% read in model - nmodels=len(Model_List) - datam = list() - databins = list() - for mm in range(nmodels): - filenamem = E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' + lst = glob.glob(E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[0]+'_shipleg*.nc') + lst.sort() - (timem,NCNall,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCNall') - (timem,data,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCN') - - datam.append(data*1e-6) # change unit from 1/m3 to 1/cm3 - databins.append(NCNall*1e-6) # change unit from 1/m3 to 1/cm3 + for ll in range(len(lst)): + + if campaign=='MAGIC': + legnum=lst[ll][-5:-3] + elif campaign=='MARCUS': + legnum=lst[ll][-4] - # mask data where model grid is not at ocean surface (Ps is too different than obs) - filenamem = E3SM_ship_path+'Ship_vars_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' - (timem,psm,timeunitx,psmunit,psmlongname)=read_E3SM(filenamem,'PS') - datamask = mask_model_ps(timem,0.01*psm,legnum,campaign,shipmetpath) - # for mm in range(nmodels): - # datam[mm][datamask]=np.nan + #%% read in model + nmodels=len(Model_List) + datam = list() + databins = list() + for mm in range(nmodels): + filenamem = E3SM_ship_path+'Ship_CNsize_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' - year0 = str(int(timeunitm.split()[2][0:4])+1) - - #%% read in observations - # find the days related to the ship leg - day = [int(a) for a in timem] - day = list(set(day)) - day.sort() - - # CPC - t_cpc=np.empty(0) - cpc=np.empty(0) - for dd in day: + (timem,NCNall,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCNall') + (timem,data,timeunitm,datamunit,datamlongname)=read_E3SM(filenamem,'NCN') - if campaign=='MAGIC': - if int(legnum)<=9: - if dd<=365: # year 2012 - filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*') + datam.append(data*1e-6) # change unit from 1/m3 to 1/cm3 + databins.append(NCNall*1e-6) # change unit from 1/m3 to 1/cm3 + + # mask data where model grid is not at ocean surface (Ps is too different than obs) + filenamem = E3SM_ship_path+'Ship_vars_'+campaign+'_'+Model_List[mm]+'_shipleg'+legnum+'.nc' + (timem,psm,timeunitx,psmunit,psmlongname)=read_E3SM(filenamem,'PS') + datamask = mask_model_ps(timem,0.01*psm,legnum,campaign,shipmetpath) + # for mm in range(nmodels): + # datam[mm][datamask]=np.nan + + year0 = str(int(timeunitm.split()[2][0:4])+1) + + #%% read in observations + # find the days related to the ship leg + day = [int(a) for a in timem] + day = list(set(day)) + day.sort() + + # CPC + t_cpc=np.empty(0) + cpc=np.empty(0) + for dd in day: + + if campaign=='MAGIC': + if int(legnum)<=9: + if dd<=365: # year 2012 + filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*') else: - filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*') - if len(filenameo)==0: - continue # some days may be missing - elif campaign=='MARCUS': - if int(legnum)<=2: - if dd<=365: # year 2012 - filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') + filenameo = glob.glob(shipcpcpath+'magaoscpcfM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*') + if len(filenameo)==0: + continue # some days may be missing + elif campaign=='MARCUS': + if int(legnum)<=2: + if dd<=365: # year 2012 + filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + if len(filenameo)==0: + continue # some days may be missing + + + (time,obs,qc,timeunit,dataunit)=read_cpc(filenameo[0]) + obs=qc_mask_qcflag(obs,qc) + t_cpc=np.hstack((t_cpc, dd+time/86400)) + cpc=np.hstack((cpc, obs)) + + cpc=qc_remove_neg(cpc) + cpc=qc_cn_max(cpc,10) + # if time expands two years, add 365 days to the second year + if t_cpc[0]>t_cpc[-1]: + t_cpc[t_cpc<=t_cpc[-1]]=t_cpc[t_cpc<=t_cpc[-1]]+365 + + # UHSAS + t_uh=np.empty(0) + uhsas=np.empty(0) + for dd in day: + + if campaign=='MAGIC': + if int(legnum)<=9: + if dd<=365: # year 2012 + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') + else: + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*.cdf') + else: + filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') + elif campaign=='MARCUS': + if int(legnum)<=2: + if dd<=365: # year 2012 + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') + else: + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') else: - filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipcpcpath+'maraoscpcf1mM1.b1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + if len(filenameo)==0: continue # some days may be missing + if len(filenameo)>1: + raise ValueError('find too many files') + (time,dmin,dmax,obs,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) + obs=np.ma.filled(obs) + obs=qc_remove_neg(obs) + uhsas=np.hstack((uhsas, np.nansum(obs,1))) + t_uh = np.hstack((t_uh,time/86400+dd)) + + uhsas=qc_cn_max(uhsas,100) + # if no obs available, fill one data with NaN + if len(t_uh)==0: + t_uh=[timem[0],timem[1]] + uhsas=np.full((2),np.nan) + + # if time expands two years, add 365 days to the second year + if t_uh[0]>t_uh[-1]: + t_uh[t_uh<=t_uh[-1]]=t_uh[t_uh<=t_uh[-1]]+365 - (time,obs,qc,timeunit,dataunit)=read_cpc(filenameo[0]) - obs=qc_mask_qcflag(obs,qc) - t_cpc=np.hstack((t_cpc, dd+time/86400)) - cpc=np.hstack((cpc, obs)) + #%% Calculate model aerosol number concentration for UHSAS size range + b1 = int(dmin[0]) + b2 = int(dmax[-1]) + datam2=list() + for mm in range(nmodels): + datam2.append(np.nansum(databins[mm][b1-1:b2,:],0)) + # datam2[mm][datamask]=np.nan - cpc=qc_remove_neg(cpc) - cpc=qc_cn_max(cpc,10) - # if time expands two years, add 365 days to the second year - if t_cpc[0]>t_cpc[-1]: - t_cpc[t_cpc<=t_cpc[-1]]=t_cpc[t_cpc<=t_cpc[-1]]+365 - - # UHSAS - t_uh=np.empty(0) - uhsas=np.empty(0) - for dd in day: + #%% make plot + + figname = figpath_ship_timeseries+'timeseries_CN_'+campaign+'_ship'+legnum+'.png' + print('plotting figures to '+figname) - if campaign=='MAGIC': - if int(legnum)<=9: - if dd<=365: # year 2012 - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2012'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') - else: - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd-365,calendar='noleap')+'.*.cdf') - else: - filenameo = glob.glob(shipuhsaspath+'magaosuhsasM1.a1.2013'+cday2mmdd(dd,calendar='noleap')+'.*.cdf') - elif campaign=='MARCUS': - if int(legnum)<=2: - if dd<=365: # year 2012 - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2017'+cday2mmdd(dd,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd-365,calendar='noleap')+'.*') - else: - filenameo = glob.glob(shipuhsaspath+'maraosuhsasM1.a1.2018'+cday2mmdd(dd,calendar='noleap')+'.*') + fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches + plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - if len(filenameo)==0: - continue # some days may be missing - if len(filenameo)>1: - raise ValueError('find too many files') - - (time,dmin,dmax,obs,timeunit,uhunit,uhlongname)=read_uhsas(filenameo[0]) - obs=np.ma.filled(obs) - obs=qc_remove_neg(obs) - uhsas=np.hstack((uhsas, np.nansum(obs,1))) - t_uh = np.hstack((t_uh,time/86400+dd)) + ax1.plot(t_cpc,cpc,color='k',linewidth=1,label='CPC') + for mm in range(nmodels): + ax1.plot(timem, datam[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax1.set_yscale('log') + ax1.tick_params(color='k',labelsize=12) + ylim1 = ax1.get_ylim() + + ax2.plot(t_uh,uhsas,color='k',linewidth=1,label='UHSAS') + # ax2.plot(t_uh,uhsas,color='k',linewidth=1,label='UHSAS ('+str(b1)+'-'+str(b2)+'nm)') + for mm in range(nmodels): + ax2.plot(timem, datam2[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) + # ax1.set_yscale('log') + ax2.tick_params(color='k',labelsize=12) + ylim2 = ax2.get_ylim() - uhsas=qc_cn_max(uhsas,100) - # if no obs available, fill one data with NaN - if len(t_uh)==0: - t_uh=[timem[0],timem[1]] - uhsas=np.full((2),np.nan) + ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.2, .5)) + ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.2, .5)) - # if time expands two years, add 365 days to the second year - if t_uh[0]>t_uh[-1]: - t_uh[t_uh<=t_uh[-1]]=t_uh[t_uh<=t_uh[-1]]+365 + ax2.set_xlabel('Calendar Day in '+year0,fontsize=14) - #%% Calculate model aerosol number concentration for UHSAS size range - b1 = int(dmin[0]) - b2 = int(dmax[-1]) - datam2=list() - for mm in range(nmodels): - datam2.append(np.nansum(databins[mm][b1-1:b2,:],0)) - # datam2[mm][datamask]=np.nan - - #%% make plot + ax1.set_title('Aerosol Number Concentration (cm$^{-3}$)',fontsize=15) - figname = figpath_ship_timeseries+'timeseries_CN_'+campaign+'_ship'+legnum+'.png' - print('plotting figures to '+figname) - - fig,(ax1,ax2) = plt.subplots(2,1,figsize=(8,4)) # figsize in inches - plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=1.5) #pad=0.4, w_pad=0.5, h_pad=1.0 - - ax1.plot(t_cpc,cpc,color='k',linewidth=1,label='CPC') - for mm in range(nmodels): - ax1.plot(timem, datam[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - # ax1.set_yscale('log') - ax1.tick_params(color='k',labelsize=12) - ylim1 = ax1.get_ylim() - - ax2.plot(t_uh,uhsas,color='k',linewidth=1,label='UHSAS') - # ax2.plot(t_uh,uhsas,color='k',linewidth=1,label='UHSAS ('+str(b1)+'-'+str(b2)+'nm)') - for mm in range(nmodels): - ax2.plot(timem, datam2[mm],color=color_model[mm],linewidth=1, label=Model_List[mm]) - # ax1.set_yscale('log') - ax2.tick_params(color='k',labelsize=12) - ylim2 = ax2.get_ylim() - - ax1.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.2, .5)) - ax2.legend(loc='center right', shadow=False, fontsize='large',bbox_to_anchor=(1.2, .5)) - - ax2.set_xlabel('Calendar Day in '+year0,fontsize=14) + fig.text(.08, .999,'trip # '+legnum, fontsize=12) - ax1.set_title('Aerosol Number Concentration (cm$^{-3}$)',fontsize=15) - - fig.text(.08, .999,'trip # '+legnum, fontsize=12) - - # mask non-ocean model grid (ps is inconsistent with obs) - ax1.vlines(timem[datamask],ylim1[0],ylim1[1],color='lightgray') - ax2.vlines(timem[datamask],ylim2[0],ylim2[1],color='lightgray') - - - fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) \ No newline at end of file + # mask non-ocean model grid (ps is inconsistent with obs) + ax1.vlines(timem[datamask],ylim1[0],ylim1[1],color='lightgray') + ax2.vlines(timem[datamask],ylim2[0],ylim2[1],color='lightgray') + + + fig.savefig(figname,dpi=fig.dpi,bbox_inches='tight', pad_inches=1) + plt.close() \ No newline at end of file diff --git a/src/esmac_diags/plotting/plot_ship_timeseries_met.py b/src/esmac_diags/plotting/plot_ship_timeseries_met.py index e03adb8..c4b95c6 100644 --- a/src/esmac_diags/plotting/plot_ship_timeseries_met.py +++ b/src/esmac_diags/plotting/plot_ship_timeseries_met.py @@ -1,7 +1,6 @@ """ # plot timeseries of basic meteorological variables along ship track """ -import sys import os import glob @@ -13,189 +12,195 @@ from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd from ..subroutines.specific_data_treatment import avg_time_1d +def run_plot(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + color_model = settings['color_model'] + shipmetpath = settings['shipmetpath'] + E3SM_ship_path = settings['E3SM_ship_path'] + figpath_ship_timeseries = settings['figpath_ship_timeseries'] -#%% settings - -from settings import campaign, Model_List, color_model, shipmetpath, E3SM_ship_path, figpath_ship_timeseries - -if not os.path.exists(figpath_ship_timeseries): - os.makedirs(figpath_ship_timeseries) - - -lst = glob.glob(E3SM_ship_path+'Ship_vars_'+campaign+'_'+Model_List[0]+'_shipleg*.nc') -lst.sort() - -for ll in range(len(lst)): + #%% other settings + + if not os.path.exists(figpath_ship_timeseries): + os.makedirs(figpath_ship_timeseries) - #%% for MAGIC, read each ship leg - if campaign=='MAGIC': - legnum=lst[ll][-5:-3] - filenameo = shipmetpath+'marmet'+legnum+'.txt' - (shipdata,shipvarlist) = read_marmet(filenameo) - year=[a[1] for a in shipdata] - month=[a[2] for a in shipdata] - day=[a[3] for a in shipdata] - hh=[int(a[4]) for a in shipdata] - mm=[int(a[5]) for a in shipdata] - ss=[int(a[6]) for a in shipdata] - yyyymmdd = [year[i]+month[i]+day[i] for i in range(len(year))] # yyyymmdd - # get time in calendar day - time = np.array(hh)/24. + np.array(mm)/1440. + np.array(ss)/86400. - time = np.array([time[i] + yyyymmdd2cday(yyyymmdd[i],'noleap') for i in range(len(time))]) - if time[-1]1e10]=np.nan - aodall = np.vstack((aodall,np.ma.filled(aod,np.nan))) - -aodmean = np.nanmean(aodall,0) -if len(aodmean)!=len(lonm): - print(aodall.shape) - error - - -# %% output extacted file -outputname = 'AOD_mean_global_'+model+'.nc' -print('output to this file: '+E3SM_output_path+outputname) - -# define filename -f = Dataset(E3SM_output_path+outputname, 'w', format='NETCDF4') - -# define dimensions -t = f.createDimension('ncol', None) # unlimited - -# create variable list -lat_o = f.createVariable("lat","f8",("ncol",)) -lon_o = f.createVariable("lon","f8",("ncol",)) -var_o = f.createVariable("AODmean",'f8',("ncol",)) - -# write data -lat_o[:] = latm -lon_o[:] = lonm -var_o[:] = aodmean - -# attributes -lat_o.units = latmunit -lon_o.units = lonmunit -var_o.units = aodunit -var_o.long_name = aodname - -# global attributes -import time as ttt -f.description = model+" extact global mean AOD" -f.history = "Created by Shuaiqi at " + ttt.ctime(ttt.time()) - -f.close() - - - - - diff --git a/src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py b/src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py deleted file mode 100644 index 913bd1d..0000000 --- a/src/esmac_diags/preprocessing/extract_E3SM_AOD_regionmean.py +++ /dev/null @@ -1,117 +0,0 @@ - -import sys - -import numpy as np -from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd -from read_netcdf import read_E3SM -from netCDF4 import Dataset - - -#%% settings - -from settings import campaign, E3SM_h3_path, E3SM_h3_filehead, Model_List - -E3SM_region_path = '../../figures/' - - -if campaign=='HISCALE': - E3SMdomain_range='260e_to_265e_34n_to_39n' # domain range in E3SM regional output - start_date='2016-04-25' - end_date='2016-09-22' -elif campaign=='ACEENA': - E3SMdomain_range='330e_to_335e_37n_to_42n' - start_date='2017-06-20' - end_date='2018-02-19' -elif campaign=='CSET': - E3SMdomain_range='202e_to_240e_19n_to_40n' - start_date='2015-07-01' - end_date='2015-08-15' -elif campaign=='SOCRATES': - E3SMdomain_range='133e_to_164e_42s_to_63s' - start_date='2018-01-15' - end_date='2018-02-24' -elif campaign=='MAGIC': - E3SMdomain_range='202e_to_243e_20n_to_35n' # domain range in E3SM regional output - start_date='2012-10-01' - end_date='2013-09-30' -elif campaign=='MARCUS': - E3SMdomain_range='60e_to_160e_42s_to_70s' - start_date='2017-10-01' - end_date='2018-04-20' -else: - print('ERROR: please specify domain info for '+campaign) - error - -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date,'noleap') -cday2 = yyyymmdd2cday(end_date,'noleap') - -year0 = start_date[0:4] -if start_date[0:4]!=end_date[0:4]: - cday2=cday2+365 - -for mm in range(len(Model_List)): - model=Model_List[mm] - #%% process data for each day - for cday in range(cday1,cday2+1): - if cday>365: - mmdd=cday2mmdd(cday-365) - date=end_date[0:4]+'-'+mmdd[0:2]+'-'+mmdd[2:4] - else: - mmdd=cday2mmdd(cday) - date=year0+'-'+mmdd[0:2]+'-'+mmdd[2:4] - - print(date) - filename_input = E3SM_h3_path[mm]+E3SM_h3_filehead[mm]+'.cam.h3.'+date+'-00000.nc' - - if cday==cday1: - (timem,lonm,timeunitm,lonmunit,lonmname)=read_E3SM(filename_input,'lon_'+E3SMdomain_range) - (timem,latm,timeunitm,latmunit,latmname)=read_E3SM(filename_input,'lat_'+E3SMdomain_range) - aodall = np.empty((0,len(lonm))) - (timem,aod,timeunitm,aodunit,aodname)=read_E3SM(filename_input,'AODVIS_'+E3SMdomain_range) - aod[aod>1e10]=np.nan - aodall = np.vstack((aodall,np.ma.filled(aod,np.nan))) - - aodmean = np.nanmean(aodall,0) - if len(aodmean)!=len(lonm): - print(aodall.shape) - error - - - # %% output extacted file - outputname = 'AOD_mean_'+campaign+'_'+model+'.nc' - print('output to this file: '+E3SM_region_path+outputname) - - # define filename - f = Dataset(E3SM_region_path+outputname, 'w', format='NETCDF4') - - # define dimensions - t = f.createDimension('ncol', None) # unlimited - - # create variable list - lat_o = f.createVariable("lat","f8",("ncol",)) - lon_o = f.createVariable("lon","f8",("ncol",)) - var_o = f.createVariable("AODmean",'f8',("ncol",)) - - # write data - lat_o[:] = latm - lon_o[:] = lonm - var_o[:] = aodmean - - # attributes - lat_o.units = latmunit - lon_o.units = lonmunit - var_o.units = aodunit - var_o.long_name = aodname - - # global attributes - import time as ttt - f.description = model+" extact mean AOD during "+campaign - f.history = "Created by Shuaiqi at " + ttt.ctime(ttt.time()) - - f.close() - - - - - diff --git a/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py index cb590d3..1f060ab 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_allvars.py @@ -3,7 +3,6 @@ # input data is IWG measurements from aircraft and E3SM regional output # output is aerosol variables for each flight """ -import sys import glob import os @@ -18,192 +17,197 @@ def find_nearest(xall, yall, x, y): idx = distance.argmin() return(idx) +def run_prep(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + E3SM_hourly_path = settings['E3SM_hourly_path'] + E3SM_hourly_filehead = settings['E3SM_hourly_filehead'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] -#%% settings - - -from settings import campaign, E3SM_h3_path, E3SM_h3_filehead, E3SM_aircraft_path, Model_List - -if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, iwgpath -elif campaign in ['CSET', 'SOCRATES']: - from settings import RFpath -else: - raise ValueError('this aircraft campaign is not recognized: ' + campaign) - -if not os.path.exists(E3SM_aircraft_path): - os.makedirs(E3SM_aircraft_path) - + if campaign in ['HISCALE', 'ACEENA']: + IOP = settings['IOP'] + iwgpath = settings['iwgpath'] + elif campaign in ['CSET', 'SOCRATES']: + RFpath = settings['RFpath'] + else: + raise ValueError('this aircraft campaign is not recognized: ' + campaign) -#%% find all flight data -if campaign == 'HISCALE': - lst = glob.glob(iwgpath + '*a2.txt') - lst.sort() - if IOP == 'IOP1': - lst = lst[0:17] - elif IOP == 'IOP2': - lst = lst[17:] - elif IOP[0:4] == '2016': - a = lst[0].split('_' + campaign + '_') - lst = glob.glob(a[0] + '*' + IOP + '*') - lst.sort() -elif campaign == 'ACEENA': - lst = glob.glob(iwgpath + '*a2.txt') - lst.sort() - if IOP == 'IOP1': - lst = lst[0:20] - elif IOP == 'IOP2': - lst = lst[20:] - elif IOP[0:4] == '2017' or IOP[0:4] == '2018': - a = lst[0].split('_' + campaign + '_') - lst = glob.glob(a[0] + '*' + IOP + '*') - lst.sort() -elif campaign in ['CSET', 'SOCRATES']: - lst = glob.glob(RFpath + 'RF*.PNI.nc') - lst.sort() -else: - raise ValueError('this aircraft campaign is not recognized: ' + campaign) + #%% other settings -print('total number of files:' + str(len(lst))) - -for filename in lst: + if not os.path.exists(E3SM_aircraft_path): + os.makedirs(E3SM_aircraft_path) - fname = filename.split('.') - #%% read in flight data - if campaign in ['HISCALE', 'ACEENA']: - date = fname[-3] - print('input data for ' + date) - year = date[0:4] - month = date[4:6] - - (flight, flightvars) = read_iwg1(filename) - timelen = len(flight) - # get lat, lon, height, time - lon = np.empty(timelen) - lat = np.empty(timelen) - height = np.empty(timelen) - time = np.empty(timelen) - if np.logical_and(campaign == 'ACEENA', date == '20180216a'): - flight.insert(1403, list(flight[1403])) - tstr = flight[1403][1] - tstr = tstr[0:-1] + str(int(tstr[-1])-1) - flight[1403][1] = tstr - del flight[-1] - for t in range(timelen): - lat[t] = float(flight[t][2]) - lon[t] = float(flight[t][3]) + 360 - height[t] = float(flight[t][4]) - timestr = flight[t][1].split(' ') - time[t] = hhmmss2sec(timestr[1]) + #%% find all flight data + if campaign == 'HISCALE': + lst = glob.glob(iwgpath + '*a2.txt') + lst.sort() + if IOP == 'IOP1': + lst = lst[0:17] + elif IOP == 'IOP2': + lst = lst[17:] + elif IOP[0:4] == '2016': + a = lst[0].split('_' + campaign + '_') + lst = glob.glob(a[0] + '*' + IOP + '*') + lst.sort() + elif campaign == 'ACEENA': + lst = glob.glob(iwgpath + '*a2.txt') + lst.sort() + if IOP == 'IOP1': + lst = lst[0:20] + elif IOP == 'IOP2': + lst = lst[20:] + elif IOP[0:4] == '2017' or IOP[0:4] == '2018': + a = lst[0].split('_' + campaign + '_') + lst = glob.glob(a[0] + '*' + IOP + '*') + lst.sort() elif campaign in ['CSET', 'SOCRATES']: - date = fname[-4] - print('input data for ' + date) - year = date[0:4] - month = date[4:6] - (time, height, timeunit, hunit, hlongname, cellsize, cellunit) = read_RF_NCAR(filename, 'ALT') - (time, lat, timeunit, latunit, latlongname, cellsize, cellunit) = read_RF_NCAR(filename, 'LAT') - (time, lon, timeunit, lonunit, lonlongname, cellsize, cellunit) = read_RF_NCAR(filename, 'LON') - lon[lon<0] = lon[lon<0] + 360 + lst = glob.glob(RFpath + 'RF*.PNI.nc') + lst.sort() + else: + raise ValueError('this aircraft campaign is not recognized: ' + campaign) - #%% set variables and model region - for mm in range(len(Model_List)): - model = Model_List[mm] - variable_names = ['T', 'U', 'V', 'Q', 'RELHUM', 'RHW', 'RHI', 'CLOUD', 'CLDLIQ', 'NUMLIQ', - 'CLDICE', 'NUMICE', 'RAINQM', 'NUMRAI', 'AWNI', 'AWNC', 'AQRAIN', 'AQSNOW', - 'AREI', 'AREL', 'FICE', 'IWC', 'LWC', 'ICLDIWP', 'ICLDTWP', 'ICWNC', 'ICINC', - 'WP2_CLUBB', 'CCN1', 'CCN3', 'CCN5', 'bc_a1', 'bc_a3', 'bc_a4', 'dst_a1', 'dst_a3', - 'mom_a1', 'mom_a2', 'mom_a3', 'mom_a4', 'ncl_a1', 'ncl_a2', 'ncl_a3', - 'pom_a1', 'pom_a3', 'pom_a4', 'so4_a1', 'so4_a2', 'so4_a3', - 'soa_a1', 'soa_a2', 'soa_a3', 'num_a1', 'num_a2', 'num_a3', 'num_a4', - 'num_c1', 'num_c2', 'num_c3', 'num_c4', "dgnd_a01", "dgnd_a02", "dgnd_a03", "dgnd_a04", - "dgnw_a01", "dgnw_a02", "dgnw_a03", "dgnw_a04", 'EXTINCT', 'ABSORB'] + print('total number of files:' + str(len(lst))) - if model == 'NucSoaCond': # with so4 and soa in nucleation mode - variable_names = variable_names + ['so4_a5', 'soa_a5', 'num_a5', 'num_c5', "dgnd_a05", "dgnw_a05"] - elif model == 'Nuc': # only with so4 in nucleation mode - variable_names = variable_names + ['so4_a5', 'num_a5', 'num_c5', "dgnd_a05", "dgnw_a05"] - varlen = len(variable_names) + for filename in lst: - if campaign == 'HISCALE': - E3SMdomain_range = '260e_to_265e_34n_to_39n' # domain range in E3SM regional output - elif campaign == 'ACEENA': - E3SMdomain_range = '330e_to_335e_37n_to_42n' - elif campaign == 'CSET': - E3SMdomain_range = '202e_to_240e_19n_to_40n' - elif campaign == 'SOCRATES': - E3SMdomain_range = '133e_to_164e_42s_to_63s' - else: - raise ValueError('this aircraft campaign is not recognized: ' + campaign) + fname = filename.split('.') + #%% read in flight data + if campaign in ['HISCALE', 'ACEENA']: + date = fname[-3] + print('input data for ' + date) + # year = date[0:4] + # month = date[4:6] + + (flight, flightvars) = read_iwg1(filename) + timelen = len(flight) + # get lat, lon, height, time + lon = np.empty(timelen) + lat = np.empty(timelen) + height = np.empty(timelen) + time = np.empty(timelen) + if np.logical_and(campaign == 'ACEENA', date == '20180216a'): + flight.insert(1403, list(flight[1403])) + tstr = flight[1403][1] + tstr = tstr[0:-1] + str(int(tstr[-1])-1) + flight[1403][1] = tstr + del flight[-1] + for t in range(timelen): + lat[t] = float(flight[t][2]) + lon[t] = float(flight[t][3]) + 360 + height[t] = float(flight[t][4]) + timestr = flight[t][1].split(' ') + time[t] = hhmmss2sec(timestr[1]) - #%% read in E3SM data - variables_out = list() - pblh_out = list() - for varname in variable_names: - variables_out.append([]) + elif campaign in ['CSET', 'SOCRATES']: + date = fname[-4] + print('input data for ' + date) + # year = date[0:4] + # month = date[4:6] + (time, height, timeunit, hunit, hlongname, cellsize, cellunit) = read_RF_NCAR(filename, 'ALT') + (time, lat, timeunit, latunit, latlongname, cellsize, cellunit) = read_RF_NCAR(filename, 'LAT') + (time, lon, timeunit, lonunit, lonlongname, cellsize, cellunit) = read_RF_NCAR(filename, 'LON') + lon[lon<0] = lon[lon<0] + 360 + + #%% set variables and model region + for mm in range(len(Model_List)): + model = Model_List[mm] + variable_names = ['T', 'U', 'V', 'Q', 'RELHUM', 'RHW', 'RHI', 'CLOUD', 'CLDLIQ', 'NUMLIQ', + 'CLDICE', 'NUMICE', 'RAINQM', 'NUMRAI', 'AWNI', 'AWNC', 'AQRAIN', 'AQSNOW', + 'AREI', 'AREL', 'FICE', 'IWC', 'LWC', 'ICLDIWP', 'ICLDTWP', 'ICWNC', 'ICINC', + 'WP2_CLUBB', 'CCN1', 'CCN3', 'CCN5', 'bc_a1', 'bc_a3', 'bc_a4', 'dst_a1', 'dst_a3', + 'mom_a1', 'mom_a2', 'mom_a3', 'mom_a4', 'ncl_a1', 'ncl_a2', 'ncl_a3', + 'pom_a1', 'pom_a3', 'pom_a4', 'so4_a1', 'so4_a2', 'so4_a3', + 'soa_a1', 'soa_a2', 'soa_a3', 'num_a1', 'num_a2', 'num_a3', 'num_a4', + 'num_c1', 'num_c2', 'num_c3', 'num_c4', "dgnd_a01", "dgnd_a02", "dgnd_a03", "dgnd_a04", + "dgnw_a01", "dgnw_a02", "dgnw_a03", "dgnw_a04", 'EXTINCT', 'ABSORB'] - date2 = date[0:4] + '-' + date[4:6] + '-' + date[6:8] - filename_input = E3SM_h3_path[mm] + E3SM_h3_filehead[mm] + '.cam.h3.' + date2 + '-00000.nc' - - (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) - (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) - (timem, z3, timeunitm, zunit, zname) = read_E3SM(filename_input, 'Z3_' + E3SMdomain_range) - (timem, pblh, timeunitm, pblhunit, pblhname) = read_E3SM(filename_input, 'PBLH_' + E3SMdomain_range) - # read in all variables - (timem, variables, timeunitm, var_units, var_longnames) = \ - read_E3SM(filename_input, [a + '_' + E3SMdomain_range for a in variable_names]) - - cdaym = timeunit2cday(timeunitm, 'noleap') - yearm = timeunitm.split(' ')[2][0:4] - timem = 86400* (timem.data - int(timem[0])) + if model == 'NucSoaCond': # with so4 and soa in nucleation mode + variable_names = variable_names + ['so4_a5', 'soa_a5', 'num_a5', 'num_c5', "dgnd_a05", "dgnw_a05"] + elif model == 'Nuc': # only with so4 in nucleation mode + variable_names = variable_names + ['so4_a5', 'num_a5', 'num_c5', "dgnd_a05", "dgnw_a05"] + varlen = len(variable_names) + + if campaign == 'HISCALE': + E3SMdomain_range = '260e_to_265e_34n_to_39n' # domain range in E3SM regional output + elif campaign == 'ACEENA': + E3SMdomain_range = '330e_to_335e_37n_to_42n' + elif campaign == 'CSET': + E3SMdomain_range = '202e_to_240e_19n_to_40n' + elif campaign == 'SOCRATES': + E3SMdomain_range = '133e_to_164e_42s_to_63s' + else: + raise ValueError('this aircraft campaign is not recognized: ' + campaign) + + #%% read in E3SM data + variables_out = list() + pblh_out = list() + for varname in variable_names: + variables_out.append([]) + + date2 = date[0:4] + '-' + date[4:6] + '-' + date[6:8] + filename_input = E3SM_hourly_path[mm] + E3SM_hourly_filehead[mm] + '.cam.h3.' + date2 + '-00000.nc' - for tt in range(len(time)): - t_idx = np.abs(timem-time[tt]).argmin() - x_idx = find_nearest(lonm, latm, lon[tt], lat[tt]) - z_idx = np.abs(z3[t_idx, :, x_idx]-height[tt]).argmin() + (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) + (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) + (timem, z3, timeunitm, zunit, zname) = read_E3SM(filename_input, 'Z3_' + E3SMdomain_range) + (timem, pblh, timeunitm, pblhunit, pblhname) = read_E3SM(filename_input, 'PBLH_' + E3SMdomain_range) + # read in all variables + (timem, variables, timeunitm, var_units, var_longnames) = \ + read_E3SM(filename_input, [a + '_' + E3SMdomain_range for a in variable_names]) + + # cdaym = timeunit2cday(timeunitm, 'noleap') + # yearm = timeunitm.split(' ')[2][0:4] + timem = 86400* (timem.data - int(timem[0])) + + for tt in range(len(time)): + t_idx = np.abs(timem-time[tt]).argmin() + x_idx = find_nearest(lonm, latm, lon[tt], lat[tt]) + z_idx = np.abs(z3[t_idx, :, x_idx]-height[tt]).argmin() + for vv in range(varlen): + variables_out[vv].append(variables[vv][t_idx, z_idx, x_idx]) + pblh_out.append(pblh[t_idx, x_idx]) + + # %% output extacted file + outputname = 'Aircraft_vars_' + campaign + '_' + model + '_' + date + '.nc' + print('output to this file: ' + E3SM_aircraft_path + outputname) + + # define filename + f = Dataset(E3SM_aircraft_path + outputname, 'w', format = 'NETCDF4') + + # define dimensions + t = f.createDimension('time', None) # unlimited + + # create variable list + time_o = f.createVariable("time", "f8", ("time",)) + height_o = f.createVariable("height", 'f8', ("time",)) + pblh_o = f.createVariable('PBLH', 'f8', ("time",)) + var_o = list() for vv in range(varlen): - variables_out[vv].append(variables[vv][t_idx, z_idx, x_idx]) - pblh_out.append(pblh[t_idx, x_idx]) + var_o.append (f.createVariable(variable_names[vv], 'f8', ("time", ))) + + # write data + time_o[:] = time + height_o[:] = height + pblh_o[:] = np.array(pblh_out) + for vv in range(varlen): + var_o[vv][:] = np.array(variables_out[vv]) + + # attributes + time_o.units = "Seconds since " + date2 + ' 00:00 UTC' + height_o.units = 'm MSL' + pblh_o.units = pblhunit + pblh_o.long_name = pblhname + for vv in range(varlen): + var_o[vv].units = var_units[vv] + var_o[vv].long_name = var_longnames[vv] + + # global attributes + import time as ttt + f.description = model + " extact for aircraft track for " + campaign + f.aircraftfile = filename.split('\\')[-1] + f.create_time = ttt.ctime(ttt.time()) + + f.close() - # %% output extacted file - outputname = 'Aircraft_vars_' + campaign + '_' + model + '_' + date + '.nc' - print('output to this file: ' + E3SM_aircraft_path + outputname) - - # define filename - f = Dataset(E3SM_aircraft_path + outputname, 'w', format = 'NETCDF4') - - # define dimensions - t = f.createDimension('time', None) # unlimited - - # create variable list - time_o = f.createVariable("time", "f8", ("time",)) - height_o = f.createVariable("height", 'f8', ("time",)) - pblh_o = f.createVariable('PBLH', 'f8', ("time",)) - var_o = list() - for vv in range(varlen): - var_o.append (f.createVariable(variable_names[vv], 'f8', ("time", ))) - - # write data - time_o[:] = time - height_o[:] = height - pblh_o[:] = np.array(pblh_out) - for vv in range(varlen): - var_o[vv][:] = np.array(variables_out[vv]) - - # attributes - time_o.units = "Seconds since " + date2 + ' 00:00 UTC' - height_o.units = 'm MSL' - pblh_o.units = pblhunit - pblh_o.long_name = pblhname - for vv in range(varlen): - var_o[vv].units = var_units[vv] - var_o[vv].long_name = var_longnames[vv] - - # global attributes - import time as ttt - f.description = model + " extact for aircraft track for " + campaign - f.aircraftfile = filename.split('\\')[-1] - f.create_time = ttt.ctime(ttt.time()) - - f.close() - diff --git a/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py index 48133ba..01d81c7 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_flighttrack_bins.py @@ -3,7 +3,6 @@ # input data is IWG measurements from aircraft and E3SM regional output # output is aerosol size distribution for each flight """ -import sys import glob import os @@ -21,213 +20,220 @@ def find_nearest(xall,yall,x,y): return(idx) -#%% settings +def run_prep(settings): + #%% variables from settings + campaign = settings['campaign'] + Model_List = settings['Model_List'] + E3SM_hourly_path = settings['E3SM_hourly_path'] + E3SM_hourly_filehead = settings['E3SM_hourly_filehead'] + E3SM_aircraft_path = settings['E3SM_aircraft_path'] -from settings import campaign, E3SM_h3_path, E3SM_h3_filehead, E3SM_aircraft_path, Model_List + if campaign in ['HISCALE', 'ACEENA']: + IOP = settings['IOP'] + iwgpath = settings['iwgpath'] + elif campaign in ['CSET', 'SOCRATES']: + RFpath = settings['RFpath'] + else: + raise ValueError('this aircraft campaign is not recognized: ' + campaign) -if campaign in ['HISCALE', 'ACEENA']: - from settings import IOP, iwgpath -elif campaign in ['CSET', 'SOCRATES']: - from settings import RFpath -else: - raise ValueError('this aircraft campaign is not recognized: '+campaign) + #%% other settings -if not os.path.exists(E3SM_aircraft_path): - os.makedirs(E3SM_aircraft_path) - - -if campaign=='HISCALE': - E3SMdomain_range='260e_to_265e_34n_to_39n' # domain range in E3SM regional output -elif campaign=='ACEENA': - E3SMdomain_range='330e_to_335e_37n_to_42n' -elif campaign=='CSET': - E3SMdomain_range='202e_to_240e_19n_to_40n' -elif campaign=='SOCRATES': - E3SMdomain_range='133e_to_164e_42s_to_63s' -else: - raise ValueError('this aircraft campaign is not recognized: '+campaign) - -#%% find all flight data -if campaign=='HISCALE': - lst = glob.glob(iwgpath+'*a2.txt') - lst.sort() - if IOP=='IOP1': - lst=lst[0:17] - elif IOP=='IOP2': - lst=lst[17:] - elif IOP[0:4]=='2016': - a=lst[0].split('_'+campaign+'_') - lst = glob.glob(a[0]+'*'+IOP+'*') - lst.sort() -elif campaign=='ACEENA': - lst = glob.glob(iwgpath+'*a2.txt') - lst.sort() - if IOP=='IOP1': - lst=lst[0:20] - elif IOP=='IOP2': - lst=lst[20:] - elif IOP[0:4]=='2017' or IOP[0:4]=='2018': - a=lst[0].split('_'+campaign+'_') - lst = glob.glob(a[0]+'*'+IOP+'*') - lst.sort() -elif campaign in ['CSET', 'SOCRATES']: - lst = glob.glob(RFpath+'RF*.PNI.nc') - lst.sort() -else: - raise ValueError('this aircraft campaign is not recognized: '+campaign) + if not os.path.exists(E3SM_aircraft_path): + os.makedirs(E3SM_aircraft_path) -print('total number of files:'+str(len(lst))) - -for filename in lst: - fname=filename.split('.') - #%% read in flight data - if campaign in ['HISCALE', 'ACEENA']: - date=fname[-3] - print('input data for '+date) - year=date[0:4] - month=date[4:6] - - (flight,flightvars)=read_iwg1(filename) - timelen = len(flight) - # get lat, lon, height, time - lon=np.empty(timelen) - lat=np.empty(timelen) - height=np.empty(timelen) - time=np.empty(timelen) - if np.logical_and(campaign=='ACEENA', date=='20180216a'): - flight.insert(1403,list(flight[1403])) - tstr=flight[1403][1] - tstr=tstr[0:-1]+str(int(tstr[-1])-1) - flight[1403][1]=tstr - del flight[-1] - for t in range(timelen): - lat[t]=float(flight[t][2]) - lon[t]=float(flight[t][3])+360 - height[t]=float(flight[t][4]) - timestr=flight[t][1].split(' ') - time[t]=hhmmss2sec(timestr[1]) + if campaign=='HISCALE': + E3SMdomain_range='260e_to_265e_34n_to_39n' # domain range in E3SM regional output + elif campaign=='ACEENA': + E3SMdomain_range='330e_to_335e_37n_to_42n' + elif campaign=='CSET': + E3SMdomain_range='202e_to_240e_19n_to_40n' + elif campaign=='SOCRATES': + E3SMdomain_range='133e_to_164e_42s_to_63s' + else: + raise ValueError('this aircraft campaign is not recognized: '+campaign) + #%% find all flight data + if campaign=='HISCALE': + lst = glob.glob(iwgpath+'*a2.txt') + lst.sort() + if IOP=='IOP1': + lst=lst[0:17] + elif IOP=='IOP2': + lst=lst[17:] + elif IOP[0:4]=='2016': + a=lst[0].split('_'+campaign+'_') + lst = glob.glob(a[0]+'*'+IOP+'*') + lst.sort() + elif campaign=='ACEENA': + lst = glob.glob(iwgpath+'*a2.txt') + lst.sort() + if IOP=='IOP1': + lst=lst[0:20] + elif IOP=='IOP2': + lst=lst[20:] + elif IOP[0:4]=='2017' or IOP[0:4]=='2018': + a=lst[0].split('_'+campaign+'_') + lst = glob.glob(a[0]+'*'+IOP+'*') + lst.sort() elif campaign in ['CSET', 'SOCRATES']: - date=fname[-4] - print('input data for '+date) - year=date[0:4] - month=date[4:6] - (time,height,timeunit,hunit,hlongname,cellsize,cellunit)=read_RF_NCAR(filename,'ALT') - (time,lat,timeunit,latunit,latlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LAT') - (time,lon,timeunit,lonunit,lonlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LON') - lon[lon<0]=lon[lon<0]+360 - timelen = len(time) - - #%% read in E3SM data - for mm in range(len(Model_List)): - model=Model_List[mm] - date2 = date[0:4]+'-'+date[4:6]+'-'+date[6:8] - filename_input = E3SM_h3_path[mm]+E3SM_h3_filehead[mm]+'.cam.h3.'+date2+'-00000.nc' - - (timem,lonm,timeunitm,lonmunit,lonmname)=read_E3SM(filename_input,'lon_'+E3SMdomain_range) - (timem,latm,timeunitm,latmunit,latmname)=read_E3SM(filename_input,'lat_'+E3SMdomain_range) - (timem,z3,timeunitm,latmunit,latmname)=read_E3SM(filename_input,'Z3_'+E3SMdomain_range) - # do not use read_E3SM because hyam and hybm don't have units - f = Dataset(filename_input,'r') - P0 = f.variables['P0'][:] - hyam = f.variables['hyam'][:] - hybm = f.variables['hybm'][:] - T = f.variables['T_'+E3SMdomain_range][:] - PS = f.variables['PS_'+E3SMdomain_range][:] - num_a1 = f.variables['num_a1_'+E3SMdomain_range][:] - num_a2 = f.variables['num_a2_'+E3SMdomain_range][:] - num_a3 = f.variables['num_a3_'+E3SMdomain_range][:] - num_a4 = f.variables['num_a4_'+E3SMdomain_range][:] - dn1 = f.variables['dgnd_a01_'+E3SMdomain_range][:] - dn2 = f.variables['dgnd_a02_'+E3SMdomain_range][:] - dn3 = f.variables['dgnd_a03_'+E3SMdomain_range][:] - dn4 = f.variables['dgnd_a04_'+E3SMdomain_range][:] - if model[0:3]=='Nuc': # with nucleation mode - num_a5 = f.variables['num_a5_'+E3SMdomain_range][:] - dn5 = f.variables['dgnd_a05_'+E3SMdomain_range][:] - f.close() + lst = glob.glob(RFpath+'RF*.PNI.nc') + lst.sort() + else: + raise ValueError('this aircraft campaign is not recognized: '+campaign) - Pres = np.nan*T - zlen=T.shape[1] - for kk in range(zlen): - Pres[:,kk,:] = hyam[kk]*P0 + hybm[kk]*PS + print('total number of files:'+str(len(lst))) - #% find the nearest time and height of the aircraft measurements - cdaym = timeunit2cday(timeunitm,'noleap') - timem = 86400* (timem.data - int(timem[0])) - NCNall=np.full((3000,timelen),np.nan) - tzx0 = [0,0,0] - t0 = 0 - for tt in range(timelen): - t_idx = np.abs(timem-time[tt]).argmin() - x_idx = find_nearest(lonm,latm,lon[tt],lat[tt]) - z_idx = np.abs(z3[t_idx,:,x_idx]-height[tt]).argmin() - - # copy the same grid to save time - if [t_idx,x_idx,z_idx]==tzx0: - NCNall[:,tt] = NCNall[:,t0] - else: - numall = [num_a1[t_idx,z_idx,x_idx],num_a2[t_idx,z_idx,x_idx],num_a3[t_idx,z_idx,x_idx],num_a4[t_idx,z_idx,x_idx]] - dnall = [dn1[t_idx,z_idx,x_idx],dn2[t_idx,z_idx,x_idx],dn3[t_idx,z_idx,x_idx],dn4[t_idx,z_idx,x_idx]] - if model[0:3]=='Nuc': # with nucleation mode - numall.append(num_a5[t_idx,z_idx,x_idx]) - dnall.append(dn5[t_idx,z_idx,x_idx]) - NCNall[:,tt] = calc_CNsize_cutoff_0_3000nm(dnall,numall,T[t_idx,z_idx,x_idx],Pres[t_idx,z_idx,x_idx]) - # update the time of this unique grid - tzx0=[t_idx,x_idx,z_idx] - t0=tt - - # calculate total CN concentration for CPC (>10nm) and CPCU (>3nm) - NUCN = np.nansum(NCNall[3:,:],0) # >3nm - NCN = np.nansum(NCNall[10:,:],0) # >10nm + for filename in lst: + fname=filename.split('.') + #%% read in flight data + if campaign in ['HISCALE', 'ACEENA']: + date=fname[-3] + print('input data for '+date) + # year=date[0:4] + # month=date[4:6] - #%% output extacted file - outputname = 'Aircraft_CNsize_'+campaign+'_'+model+'_'+date+'.nc' - print('output to this file: '+E3SM_aircraft_path+outputname) + (flight,flightvars)=read_iwg1(filename) + timelen = len(flight) + # get lat, lon, height, time + lon=np.empty(timelen) + lat=np.empty(timelen) + height=np.empty(timelen) + time=np.empty(timelen) + if np.logical_and(campaign=='ACEENA', date=='20180216a'): + flight.insert(1403,list(flight[1403])) + tstr=flight[1403][1] + tstr=tstr[0:-1]+str(int(tstr[-1])-1) + flight[1403][1]=tstr + del flight[-1] + for t in range(timelen): + lat[t]=float(flight[t][2]) + lon[t]=float(flight[t][3])+360 + height[t]=float(flight[t][4]) + timestr=flight[t][1].split(' ') + time[t]=hhmmss2sec(timestr[1]) - # define filename - f = Dataset(E3SM_aircraft_path+outputname, 'w', format='NETCDF4') + elif campaign in ['CSET', 'SOCRATES']: + date=fname[-4] + print('input data for '+date) + # year=date[0:4] + # month=date[4:6] + (time,height,timeunit,hunit,hlongname,cellsize,cellunit)=read_RF_NCAR(filename,'ALT') + (time,lat,timeunit,latunit,latlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LAT') + (time,lon,timeunit,lonunit,lonlongname,cellsize,cellunit)=read_RF_NCAR(filename,'LON') + lon[lon<0]=lon[lon<0]+360 + timelen = len(time) - # define dimensions - t = f.createDimension('time', None) # unlimited - size=f.createDimension('size',3000) + #%% read in E3SM data + for mm in range(len(Model_List)): + model=Model_List[mm] + date2 = date[0:4]+'-'+date[4:6]+'-'+date[6:8] + filename_input = E3SM_hourly_path[mm]+E3SM_hourly_filehead[mm]+'.cam.h3.'+date2+'-00000.nc' - # create variable list - time_o = f.createVariable("time","f8",("time",)) - height_o = f.createVariable("height",'f8',("time",)) - size_o = f.createVariable("size",'i8',("size")) - - data_o = f.createVariable('NCNall','f8',("size","time")) - ncn_o = f.createVariable("NCN","f8",("time",)) - nucn_o = f.createVariable("NUCN","f8",("time",)) - - # write data - time_o[:] = time - height_o[:] = height - size_o[:] = np.arange(1,3001) - data_o[:,:]=NCNall - ncn_o[:]=NCN - nucn_o[:]=NUCN - - # attributes - time_o.units = "Seconds since "+date2+' 00:00 UTC' - height_o.units = 'm MSL' - size_o.units = 'nm' - size_o.long_name="0 to 3000nm with 1nm increment" - data_o.units = '#/m3' - data_o.long_name = 'aerosol size distribution' - ncn_o.units = '#/m3' - ncn_o.long_name = 'aerosol number concentration for size >10nm' - nucn_o.units = '#/m3' - nucn_o.long_name = 'aerosol number concentration for size >3nm' - - # global attributes - import time as ttt - f.description = model+" extact for aircraft track for "+campaign - f.aircraftfile = filename.split('\\')[-1] - f.create_time = ttt.ctime(ttt.time()) + (timem,lonm,timeunitm,lonmunit,lonmname)=read_E3SM(filename_input,'lon_'+E3SMdomain_range) + (timem,latm,timeunitm,latmunit,latmname)=read_E3SM(filename_input,'lat_'+E3SMdomain_range) + (timem,z3,timeunitm,latmunit,latmname)=read_E3SM(filename_input,'Z3_'+E3SMdomain_range) + # do not use read_E3SM because hyam and hybm don't have units + f = Dataset(filename_input,'r') + P0 = f.variables['P0'][:] + hyam = f.variables['hyam'][:] + hybm = f.variables['hybm'][:] + T = f.variables['T_'+E3SMdomain_range][:] + PS = f.variables['PS_'+E3SMdomain_range][:] + num_a1 = f.variables['num_a1_'+E3SMdomain_range][:] + num_a2 = f.variables['num_a2_'+E3SMdomain_range][:] + num_a3 = f.variables['num_a3_'+E3SMdomain_range][:] + num_a4 = f.variables['num_a4_'+E3SMdomain_range][:] + dn1 = f.variables['dgnd_a01_'+E3SMdomain_range][:] + dn2 = f.variables['dgnd_a02_'+E3SMdomain_range][:] + dn3 = f.variables['dgnd_a03_'+E3SMdomain_range][:] + dn4 = f.variables['dgnd_a04_'+E3SMdomain_range][:] + if model[0:3]=='Nuc': # with nucleation mode + num_a5 = f.variables['num_a5_'+E3SMdomain_range][:] + dn5 = f.variables['dgnd_a05_'+E3SMdomain_range][:] + f.close() + + Pres = np.nan*T + zlen=T.shape[1] + for kk in range(zlen): + Pres[:,kk,:] = hyam[kk]*P0 + hybm[kk]*PS - f.close() - + #% find the nearest time and height of the aircraft measurements + cdaym = timeunit2cday(timeunitm,'noleap') + timem = 86400* (timem.data - int(timem[0])) + NCNall=np.full((3000,timelen),np.nan) + tzx0 = [0,0,0] + t0 = 0 + for tt in range(timelen): + t_idx = np.abs(timem-time[tt]).argmin() + x_idx = find_nearest(lonm,latm,lon[tt],lat[tt]) + z_idx = np.abs(z3[t_idx,:,x_idx]-height[tt]).argmin() + + # copy the same grid to save time + if [t_idx,x_idx,z_idx]==tzx0: + NCNall[:,tt] = NCNall[:,t0] + else: + numall = [num_a1[t_idx,z_idx,x_idx],num_a2[t_idx,z_idx,x_idx],num_a3[t_idx,z_idx,x_idx],num_a4[t_idx,z_idx,x_idx]] + dnall = [dn1[t_idx,z_idx,x_idx],dn2[t_idx,z_idx,x_idx],dn3[t_idx,z_idx,x_idx],dn4[t_idx,z_idx,x_idx]] + if model[0:3]=='Nuc': # with nucleation mode + numall.append(num_a5[t_idx,z_idx,x_idx]) + dnall.append(dn5[t_idx,z_idx,x_idx]) + NCNall[:,tt] = calc_CNsize_cutoff_0_3000nm(dnall,numall,T[t_idx,z_idx,x_idx],Pres[t_idx,z_idx,x_idx]) + # update the time of this unique grid + tzx0=[t_idx,x_idx,z_idx] + t0=tt + + # calculate total CN concentration for CPC (>10nm) and CPCU (>3nm) + NUCN = np.nansum(NCNall[3:,:],0) # >3nm + NCN = np.nansum(NCNall[10:,:],0) # >10nm + + + #%% output extacted file + outputname = 'Aircraft_CNsize_'+campaign+'_'+model+'_'+date+'.nc' + print('output to this file: '+E3SM_aircraft_path+outputname) + + # define filename + f = Dataset(E3SM_aircraft_path+outputname, 'w', format='NETCDF4') + + # define dimensions + t = f.createDimension('time', None) # unlimited + size=f.createDimension('size',3000) + + # create variable list + time_o = f.createVariable("time","f8",("time",)) + height_o = f.createVariable("height",'f8',("time",)) + size_o = f.createVariable("size",'i8',("size")) + + data_o = f.createVariable('NCNall','f8',("size","time")) + ncn_o = f.createVariable("NCN","f8",("time",)) + nucn_o = f.createVariable("NUCN","f8",("time",)) + + # write data + time_o[:] = time + height_o[:] = height + size_o[:] = np.arange(1,3001) + data_o[:,:]=NCNall + ncn_o[:]=NCN + nucn_o[:]=NUCN + + # attributes + time_o.units = "Seconds since "+date2+' 00:00 UTC' + height_o.units = 'm MSL' + size_o.units = 'nm' + size_o.long_name="0 to 3000nm with 1nm increment" + data_o.units = '#/m3' + data_o.long_name = 'aerosol size distribution' + ncn_o.units = '#/m3' + ncn_o.long_name = 'aerosol number concentration for size >10nm' + nucn_o.units = '#/m3' + nucn_o.long_name = 'aerosol number concentration for size >3nm' + + # global attributes + import time as ttt + f.description = model+" extact for aircraft track for "+campaign + f.aircraftfile = filename.split('\\')[-1] + f.create_time = ttt.ctime(ttt.time()) + + f.close() + diff --git a/src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py index 37b2bfd..59024eb 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_profile_allvars.py @@ -3,7 +3,6 @@ # input data is E3SM regional output # output is variables at the nearest column """ -import sys import os import numpy as np @@ -16,122 +15,131 @@ def find_nearest(xall, yall, x, y): idx = distance.argmin() return(idx) -#%% settings +def run_prep(settings): + #%% variables from settings + campaign = settings['campaign'] + lat0 = settings['lat0'] + lon0 = settings['lon0'] + site = settings['site'] + start_date = settings['start_date'] + end_date = settings['end_date'] + Model_List = settings['Model_List'] + E3SM_hourly_path = settings['E3SM_hourly_path'] + E3SM_hourly_filehead = settings['E3SM_hourly_filehead'] + E3SM_profile_path = settings['E3SM_profile_path'] -from settings import campaign, lat0, lon0,site, start_date, end_date, \ - E3SM_h3_path, E3SM_h3_filehead, E3SM_profile_path, Model_List - -# output height above ground. data will be interpolated into z_f -z_f = np.hstack((np.arange(0, 500, 50), np.arange(500, 2000, 100), np.arange(2000, 5000, 300), - np.arange(5000, 10000, 500), np.arange(10000, 20001, 1000))) -zlen = len(z_f) - -if not os.path.exists(E3SM_profile_path): - os.makedirs(E3SM_profile_path) - -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date, 'noleap') -cday2 = yyyymmdd2cday(end_date, 'noleap') -if start_date[0:4]!=end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] - -#%% set variables for profiles -variable_names = ['T', 'U', 'V', 'Q', 'RELHUM', 'RHW', 'RHI', 'CLOUD', 'LWC', 'IWC', - 'CLDLIQ', 'CLDICE', 'NUMLIQ', "AREI", "AREL", "ICLDIWP", "ICLDTWP"] -varlen = len(variable_names) + #%% other settings -if site=='SGP': - E3SMdomain_range = '260e_to_265e_34n_to_39n' # domain range in E3SM regional output -elif site=='ENA': - E3SMdomain_range = '330e_to_335e_37n_to_42n' -else: - raise ValueError('data for this site is not specified: ' + site) - -for mm in range(len(Model_List)): - model = Model_List[mm] + # output height above ground. data will be interpolated into z_f + z_f = np.hstack((np.arange(0, 500, 50), np.arange(500, 2000, 100), np.arange(2000, 5000, 300), + np.arange(5000, 10000, 500), np.arange(10000, 20001, 1000))) + zlen = len(z_f) - #%% process data - for cday in range(cday1, cday2 + 1): - mmdd = cday2mmdd(cday) - date = year0 + '-' + mmdd[0:2] + '-' + mmdd[2:4] - - # read in E3SM data - variables = list() - var_units = list() - var_longnames = list() - - filename_input = E3SM_h3_path[mm] + E3SM_h3_filehead[mm] + '.cam.h3.' + date + '-00000.nc' + if not os.path.exists(E3SM_profile_path): + os.makedirs(E3SM_profile_path) - (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) - (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) - (timem, z3, timeunitm, zunit, zname) = read_E3SM(filename_input, 'Z3_' + E3SMdomain_range) - - x_idx = find_nearest(lonm, latm, lon0, lat0) - zm = z3[:, :, x_idx] - - # read in all variables - (timem, var2d, timeunitm, var2dunit, var2dlongname) = \ - read_E3SM(filename_input, [a + '_' + E3SMdomain_range for a in variable_names]) - - tlen = len(timem) - for vv in range(varlen): - var = var2d[vv][:, :, x_idx] - var2 = np.full((tlen, zlen), np.nan) - for tt in range(tlen): - # interpolate height above sea level to height above ground - var2[tt, :] = np.interp(z_f, np.flip(zm[tt, :]-zm[tt, -1]), np.flip(var[tt, :])) - variables.append(var2) - var_units.append(var2dunit[vv]) - var_longnames.append(var2dlongname[vv]) + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date, 'noleap') + cday2 = yyyymmdd2cday(end_date, 'noleap') + if start_date[0:4]!=end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] - cdaym = timeunit2cday(timeunitm, 'noleap') - yearm = timeunitm.split(' ')[2][0:4] - time = timem.data - 365*(int(year0)-int(yearm)) + cdaym + #%% set variables for profiles + variable_names = ['T', 'U', 'V', 'Q', 'RELHUM', 'RHW', 'RHI', 'CLOUD', 'LWC', 'IWC', + 'CLDLIQ', 'CLDICE', 'NUMLIQ', "AREI", "AREL", "ICLDIWP", "ICLDTWP"] + varlen = len(variable_names) + if site=='SGP': + E3SMdomain_range = '260e_to_265e_34n_to_39n' # domain range in E3SM regional output + elif site=='ENA': + E3SMdomain_range = '330e_to_335e_37n_to_42n' + else: + raise ValueError('data for this site is not specified: ' + site) - # %% output extacted file - outputname = 'Profile_vars_' + campaign + '_' + model + '.' + date + '.nc' - print('output to this file: ' + E3SM_profile_path + outputname) - - # define filename - f = Dataset(E3SM_profile_path + outputname, 'w', format = 'NETCDF4') - - # define dimensions - t = f.createDimension('time', None) # unlimited - z = f.createDimension('height', zlen) - - # create variable list - time_o = f.createVariable("time", "f8", ("time", )) - height_o = f.createVariable("height", "f8", ("height", )) - lat_o = f.createVariable("lat", "f8", ()) - lon_o = f.createVariable("lon", "f8", ()) - var_o = list() - for vv in range(varlen): - var_o.append (f.createVariable(variable_names[vv], 'f8', ("time", "height"))) - - # write data - time_o[:] = time - height_o[:] = z_f - lat_o[:] = latm[x_idx] - lon_o[:] = lonm[x_idx] - for vv in range(varlen): - var_o[vv][:] = np.array(variables[vv]) + for mm in range(len(Model_List)): + model = Model_List[mm] - # attributes - time_o.units = "days since " + str(int(year0)-1) + "-12-31 00:00:00 UTC" - lat_o.units = "latitude" - lon_o.units = "longitude" - height_o.units = "gpm above ground" - for vv in range(varlen): - var_o[vv].units = var_units[vv] - var_o[vv].long_name = var_longnames[vv] + #%% process data + for cday in range(cday1, cday2 + 1): + mmdd = cday2mmdd(cday) + date = year0 + '-' + mmdd[0:2] + '-' + mmdd[2:4] + + # read in E3SM data + variables = list() + var_units = list() + var_longnames = list() + + filename_input = E3SM_hourly_path[mm] + E3SM_hourly_filehead[mm] + '.cam.h3.' + date + '-00000.nc' - # global attributes - import time as ttt - f.description = model + " extact vertical variables for " + campaign - f.modeldata = filename_input - f.create_time = ttt.ctime(ttt.time()) + (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) + (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) + (timem, z3, timeunitm, zunit, zname) = read_E3SM(filename_input, 'Z3_' + E3SMdomain_range) + + x_idx = find_nearest(lonm, latm, lon0, lat0) + zm = z3[:, :, x_idx] + + # read in all variables + (timem, var2d, timeunitm, var2dunit, var2dlongname) = \ + read_E3SM(filename_input, [a + '_' + E3SMdomain_range for a in variable_names]) + + tlen = len(timem) + for vv in range(varlen): + var = var2d[vv][:, :, x_idx] + var2 = np.full((tlen, zlen), np.nan) + for tt in range(tlen): + # interpolate height above sea level to height above ground + var2[tt, :] = np.interp(z_f, np.flip(zm[tt, :]-zm[tt, -1]), np.flip(var[tt, :])) + variables.append(var2) + var_units.append(var2dunit[vv]) + var_longnames.append(var2dlongname[vv]) - f.close() + cdaym = timeunit2cday(timeunitm, 'noleap') + yearm = timeunitm.split(' ')[2][0:4] + time = timem.data - 365*(int(year0)-int(yearm)) + cdaym + + # %% output extacted file + outputname = 'Profile_vars_' + campaign + '_' + model + '.' + date + '.nc' + print('output to this file: ' + E3SM_profile_path + outputname) + + # define filename + f = Dataset(E3SM_profile_path + outputname, 'w', format = 'NETCDF4') + + # define dimensions + t = f.createDimension('time', None) # unlimited + z = f.createDimension('height', zlen) + + # create variable list + time_o = f.createVariable("time", "f8", ("time", )) + height_o = f.createVariable("height", "f8", ("height", )) + lat_o = f.createVariable("lat", "f8", ()) + lon_o = f.createVariable("lon", "f8", ()) + var_o = list() + for vv in range(varlen): + var_o.append (f.createVariable(variable_names[vv], 'f8', ("time", "height"))) + + # write data + time_o[:] = time + height_o[:] = z_f + lat_o[:] = latm[x_idx] + lon_o[:] = lonm[x_idx] + for vv in range(varlen): + var_o[vv][:] = np.array(variables[vv]) + + # attributes + time_o.units = "days since " + str(int(year0)-1) + "-12-31 00:00:00 UTC" + lat_o.units = "latitude" + lon_o.units = "longitude" + height_o.units = "gpm above ground" + for vv in range(varlen): + var_o[vv].units = var_units[vv] + var_o[vv].long_name = var_longnames[vv] + + # global attributes + import time as ttt + f.description = model + " extact vertical variables for " + campaign + f.modeldata = filename_input + f.create_time = ttt.ctime(ttt.time()) + + f.close() diff --git a/src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py index c73b4f4..4f8bdb8 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_sfc_allvars.py @@ -3,7 +3,6 @@ # input data is E3SM regional output # output is surface variables at the nearest grid """ -import sys import os import numpy as np @@ -16,122 +15,132 @@ def find_nearest(xall, yall, x, y): idx = distance.argmin() return(idx) -#%% settings +def run_prep(settings): + #%% variables from settings + campaign = settings['campaign'] + lat0 = settings['lat0'] + lon0 = settings['lon0'] + site = settings['site'] + start_date = settings['start_date'] + end_date = settings['end_date'] + Model_List = settings['Model_List'] + E3SM_hourly_path = settings['E3SM_hourly_path'] + E3SM_hourly_filehead = settings['E3SM_hourly_filehead'] + E3SM_sfc_path = settings['E3SM_sfc_path'] -from settings import campaign, lat0, lon0,site, start_date, end_date, \ - E3SM_h3_path, E3SM_h3_filehead, E3SM_sfc_path, Model_List - -if not os.path.exists(E3SM_sfc_path): - os.makedirs(E3SM_sfc_path) - -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date, 'noleap') -cday2 = yyyymmdd2cday(end_date, 'noleap') -if start_date[0:4] != end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') -year0 = start_date[0:4] - -if site == 'SGP': - E3SMdomain_range = '260e_to_265e_34n_to_39n' # domain range in E3SM regional output -elif site == 'ENA': - E3SMdomain_range = '330e_to_335e_37n_to_42n' -else: - raise ValueError('data for this site is not specified: ' + site) - - -#%% set variables -for mm in range(len(Model_List)): - model = Model_List[mm] - variable1d_names = ['PS', 'PBLH', 'FLNT', 'FSNT', 'FLNS', 'FSNS', "LHFLX", "SHFLX", - 'TREFHT','PRECT','PRECL', "TGCLDLWP", "TGCLDIWP"] - variable2d_names = ['T', 'U', 'V', 'Q', 'RELHUM', 'RHW', 'RHI', 'CLOUD', - 'CLDLIQ', 'CLDICE', 'NUMLIQ', 'NUMICE', 'NUMRAI', 'NUMSNO', 'RAINQM', 'SNOWQM', - 'CCN1', 'CCN3', 'CCN5', "AREI", "AREL", "ICLDIWP", "ICLDTWP", - 'bc_a1', 'bc_a3', 'bc_a4', 'dst_a1', 'dst_a3', 'mom_a1', 'mom_a2', 'mom_a3', 'mom_a4', - 'ncl_a1', 'ncl_a2', 'ncl_a3', 'pom_a1', 'pom_a3', 'pom_a4', 'so4_a1', 'so4_a2', 'so4_a3', - 'soa_a1', 'soa_a2', 'soa_a3', 'num_a1', 'num_a2', 'num_a3', 'num_a4', - 'num_c1', 'num_c2', 'num_c3', 'num_c4', "dgnd_a01", "dgnd_a02", "dgnd_a03", "dgnd_a04", - "dgnw_a01", "dgnw_a02", "dgnw_a03", "dgnw_a04", 'EXTINCT', 'ABSORB'] - if model == 'NucSoaCond': # with so4 and soa in nucleation mode - variable2d_names = variable2d_names + ['so4_a5', 'soa_a5', 'num_a5', 'num_c5', "dgnd_a05", "dgnw_a05"] - elif model == 'Nuc': # only with so4 in nucleation mode - variable2d_names = variable2d_names + ['so4_a5','num_a5','num_c5', "dgnd_a05", "dgnw_a05"] - var1dlen = len(variable1d_names) - var2dlen = len(variable2d_names) - varlen = var1dlen + var2dlen - variable_names = variable1d_names + variable2d_names - - #%% process data for each day - for cday in range(cday1, cday2 + 1): - mmdd = cday2mmdd(cday) - date = year0 + '-' + mmdd[0:2] + '-' + mmdd[2:4] - - filename_input = E3SM_h3_path[mm] + E3SM_h3_filehead[mm] + '.cam.h3.' + date + '-00000.nc' - - # read in E3SM data - variables = list() - var_units = list() - var_longnames = list() + #%% other settings - (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) - (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) - x_idx = find_nearest(lonm, latm, lon0, lat0) - - - (timem, var1d, timeunitm, var1dunit, var1dlongname) = \ - read_E3SM(filename_input, [a + '_' + E3SMdomain_range for a in variable1d_names]) - (timem, var2d, timeunitm, var2dunit, var2dlongname) = \ - read_E3SM(filename_input, [a + '_' + E3SMdomain_range for a in variable2d_names]) - for vv in range(var1dlen): - variables.append(var1d[vv][:, x_idx]) - for vv in range(var2dlen): - variables.append(var2d[vv][:, -1, x_idx]) # choose the lowest level - var_units = var1dunit + var2dunit - var_longnames = var1dlongname + var2dlongname + if not os.path.exists(E3SM_sfc_path): + os.makedirs(E3SM_sfc_path) - cdaym = timeunit2cday(timeunitm, 'noleap') - yearm = timeunitm.split(' ')[2][0:4] - time = timem.data - 365*(int(year0) - int(yearm)) + cdaym - - - # %% output extacted file - outputname = 'SFC_vars_' + campaign + '_' + model + '_' + date + '.nc' - print('output to this file: ' + E3SM_sfc_path + outputname) - - # define filename - f = Dataset(E3SM_sfc_path + outputname, 'w', format = 'NETCDF4') - - # define dimensions - t = f.createDimension('time', None) # unlimited - - # create variable list - time_o = f.createVariable("time", "f8", ("time", )) - lat_o = f.createVariable("lat", "f8", ()) - lon_o = f.createVariable("lon", "f8", ()) - var_o = list() - for vv in range(varlen): - var_o.append(f.createVariable(variable_names[vv], 'f8', ("time", ))) + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date, 'noleap') + cday2 = yyyymmdd2cday(end_date, 'noleap') + if start_date[0:4] != end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') + year0 = start_date[0:4] - # write data - time_o[:] = time - lat_o[:] = latm[x_idx] - lon_o[:] = lonm[x_idx] - for vv in range(varlen): - var_o[vv][:] = np.array(variables[vv]) + if site == 'SGP': + E3SMdomain_range = '260e_to_265e_34n_to_39n' # domain range in E3SM regional output + elif site == 'ENA': + E3SMdomain_range = '330e_to_335e_37n_to_42n' + else: + raise ValueError('data for this site is not specified: ' + site) - # attributes - time_o.units = "days since " + str(int(year0) - 1) + "-12-31 00:00:00 UTC" - lat_o.units = "latitude" - lon_o.units = "longitude" - for vv in range(varlen): - var_o[vv].units = var_units[vv] - var_o[vv].long_name = var_longnames[vv] - # global attributes - import time as ttt - f.description = model + " extact surface variables for " + campaign - f.modeldata = filename_input - f.create_time = ttt.ctime(ttt.time()) + #%% set variables + for mm in range(len(Model_List)): + model = Model_List[mm] + variable1d_names = ['PS', 'PBLH', 'FLNT', 'FSNT', 'FLNS', 'FSNS', "LHFLX", "SHFLX", + 'TREFHT','PRECT','PRECL', "TGCLDLWP", "TGCLDIWP"] + variable2d_names = ['T', 'U', 'V', 'Q', 'RELHUM', 'RHW', 'RHI', 'CLOUD', + 'CLDLIQ', 'CLDICE', 'NUMLIQ', 'NUMICE', 'NUMRAI', 'NUMSNO', 'RAINQM', 'SNOWQM', + 'CCN1', 'CCN3', 'CCN5', "AREI", "AREL", "ICLDIWP", "ICLDTWP", + 'bc_a1', 'bc_a3', 'bc_a4', 'dst_a1', 'dst_a3', 'mom_a1', 'mom_a2', 'mom_a3', 'mom_a4', + 'ncl_a1', 'ncl_a2', 'ncl_a3', 'pom_a1', 'pom_a3', 'pom_a4', 'so4_a1', 'so4_a2', 'so4_a3', + 'soa_a1', 'soa_a2', 'soa_a3', 'num_a1', 'num_a2', 'num_a3', 'num_a4', + 'num_c1', 'num_c2', 'num_c3', 'num_c4', "dgnd_a01", "dgnd_a02", "dgnd_a03", "dgnd_a04", + "dgnw_a01", "dgnw_a02", "dgnw_a03", "dgnw_a04", 'EXTINCT', 'ABSORB'] + if model == 'NucSoaCond': # with so4 and soa in nucleation mode + variable2d_names = variable2d_names + ['so4_a5', 'soa_a5', 'num_a5', 'num_c5', "dgnd_a05", "dgnw_a05"] + elif model == 'Nuc': # only with so4 in nucleation mode + variable2d_names = variable2d_names + ['so4_a5','num_a5','num_c5', "dgnd_a05", "dgnw_a05"] + var1dlen = len(variable1d_names) + var2dlen = len(variable2d_names) + varlen = var1dlen + var2dlen + variable_names = variable1d_names + variable2d_names - f.close() + #%% process data for each day + for cday in range(cday1, cday2 + 1): + mmdd = cday2mmdd(cday) + date = year0 + '-' + mmdd[0:2] + '-' + mmdd[2:4] + + filename_input = E3SM_hourly_path[mm] + E3SM_hourly_filehead[mm] + '.cam.h3.' + date + '-00000.nc' + + # read in E3SM data + variables = list() + var_units = list() + var_longnames = list() + + (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) + (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) + x_idx = find_nearest(lonm, latm, lon0, lat0) + + + (timem, var1d, timeunitm, var1dunit, var1dlongname) = \ + read_E3SM(filename_input, [a + '_' + E3SMdomain_range for a in variable1d_names]) + (timem, var2d, timeunitm, var2dunit, var2dlongname) = \ + read_E3SM(filename_input, [a + '_' + E3SMdomain_range for a in variable2d_names]) + for vv in range(var1dlen): + variables.append(var1d[vv][:, x_idx]) + for vv in range(var2dlen): + variables.append(var2d[vv][:, -1, x_idx]) # choose the lowest level + var_units = var1dunit + var2dunit + var_longnames = var1dlongname + var2dlongname + cdaym = timeunit2cday(timeunitm, 'noleap') + yearm = timeunitm.split(' ')[2][0:4] + time = timem.data - 365*(int(year0) - int(yearm)) + cdaym + + + # %% output extacted file + outputname = 'SFC_vars_' + campaign + '_' + model + '_' + date + '.nc' + print('output to this file: ' + E3SM_sfc_path + outputname) + + # define filename + f = Dataset(E3SM_sfc_path + outputname, 'w', format = 'NETCDF4') + + # define dimensions + t = f.createDimension('time', None) # unlimited + + # create variable list + time_o = f.createVariable("time", "f8", ("time", )) + lat_o = f.createVariable("lat", "f8", ()) + lon_o = f.createVariable("lon", "f8", ()) + var_o = list() + for vv in range(varlen): + var_o.append(f.createVariable(variable_names[vv], 'f8', ("time", ))) + + # write data + time_o[:] = time + lat_o[:] = latm[x_idx] + lon_o[:] = lonm[x_idx] + for vv in range(varlen): + var_o[vv][:] = np.array(variables[vv]) + + # attributes + time_o.units = "days since " + str(int(year0) - 1) + "-12-31 00:00:00 UTC" + lat_o.units = "latitude" + lon_o.units = "longitude" + for vv in range(varlen): + var_o[vv].units = var_units[vv] + var_o[vv].long_name = var_longnames[vv] + + # global attributes + import time as ttt + f.description = model + " extact surface variables for " + campaign + f.modeldata = filename_input + f.create_time = ttt.ctime(ttt.time()) + + f.close() + diff --git a/src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py b/src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py index 26e57a8..b2c78bb 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_sfc_bins.py @@ -3,7 +3,6 @@ # input data is E3SM regional output # output is surface aerosol distribution at the nearest grid """ -import sys import os import numpy as np @@ -17,134 +16,144 @@ def find_nearest(xall, yall, x, y): idx = distance.argmin() return(idx) -#%% settings +def run_prep(settings): + #%% variables from settings + campaign = settings['campaign'] + lat0 = settings['lat0'] + lon0 = settings['lon0'] + site = settings['site'] + start_date = settings['start_date'] + end_date = settings['end_date'] + Model_List = settings['Model_List'] + E3SM_hourly_path = settings['E3SM_hourly_path'] + E3SM_hourly_filehead = settings['E3SM_hourly_filehead'] + E3SM_sfc_path = settings['E3SM_sfc_path'] -from settings import campaign, lat0, lon0,site, start_date, end_date, \ - E3SM_h3_path, E3SM_h3_filehead, E3SM_sfc_path, Model_List - -if not os.path.exists(E3SM_sfc_path): - os.makedirs(E3SM_sfc_path) - -# change start date into calendar day -cday1 = yyyymmdd2cday(start_date, 'noleap') -cday2 = yyyymmdd2cday(end_date, 'noleap') -if start_date[0:4] != end_date[0:4]: - raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') - -year0 = start_date[0:4] + #%% other settings -if site == 'SGP': - E3SMdomain_range = '260e_to_265e_34n_to_39n' # domain range in E3SM regional output -elif site == 'ENA': - E3SMdomain_range = '330e_to_335e_37n_to_42n' -else: - raise ValueError('data for this site is not specified: ' + site) + if not os.path.exists(E3SM_sfc_path): + os.makedirs(E3SM_sfc_path) -#%% process data for each day -for mm in range(len(Model_List)): - model = Model_List[mm] + # change start date into calendar day + cday1 = yyyymmdd2cday(start_date, 'noleap') + cday2 = yyyymmdd2cday(end_date, 'noleap') + if start_date[0:4] != end_date[0:4]: + raise ValueError('currently not support multiple years. please set start_date and end_date in the same year') - for cday in range(cday1, cday2 + 1): - mmdd = cday2mmdd(cday) - date = year0 + '-' + mmdd[0:2] + '-' + mmdd[2:4] + year0 = start_date[0:4] - filename_input = E3SM_h3_path[mm] + E3SM_h3_filehead[mm] + '.cam.h3.' + date + '-00000.nc' + if site == 'SGP': + E3SMdomain_range = '260e_to_265e_34n_to_39n' # domain range in E3SM regional output + elif site == 'ENA': + E3SMdomain_range = '330e_to_335e_37n_to_42n' + else: + raise ValueError('data for this site is not specified: ' + site) - (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) - (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) - x_idx = find_nearest(lonm, latm, lon0, lat0) + #%% process data for each day + for mm in range(len(Model_List)): + model = Model_List[mm] - cdaym = timeunit2cday(timeunitm, 'noleap') - yearm = timeunitm.split(' ')[2][0:4] - time = timem.data - 365*(int(year0)-int(yearm)) + cdaym + for cday in range(cday1, cday2 + 1): + mmdd = cday2mmdd(cday) + date = year0 + '-' + mmdd[0:2] + '-' + mmdd[2:4] - # do not use read_E3SM because hyam and hybm don't have units - f = Dataset(filename_input, 'r') - P0 = f.variables['P0'][:] - hyam = f.variables['hyam'][:] - hybm = f.variables['hybm'][:] - T = f.variables['T_' + E3SMdomain_range][:] - PS = f.variables['PS_' + E3SMdomain_range][:] - num_a1 = f.variables['num_a1_' + E3SMdomain_range][:] - num_a2 = f.variables['num_a2_' + E3SMdomain_range][:] - num_a3 = f.variables['num_a3_' + E3SMdomain_range][:] - num_a4 = f.variables['num_a4_' + E3SMdomain_range][:] - dn1 = f.variables['dgnd_a01_' + E3SMdomain_range][:] - dn2 = f.variables['dgnd_a02_' + E3SMdomain_range][:] - dn3 = f.variables['dgnd_a03_' + E3SMdomain_range][:] - dn4 = f.variables['dgnd_a04_' + E3SMdomain_range][:] - if model[0:3] == 'Nuc': # with nucleation mode - num_a5 = f.variables['num_a5_' + E3SMdomain_range][:] - dn5 = f.variables['dgnd_a05_' + E3SMdomain_range][:] - f.close() - - Pres = np.nan*T - zlen = T.shape[1] - for kk in range(zlen): - Pres[:, kk, :] = hyam[kk]*P0 + hybm[kk]*PS - - numall = [num_a1[:, -1, x_idx], num_a2[:, -1, x_idx], num_a3[:, -1, x_idx], num_a4[:, -1, x_idx]] - dnall = [dn1[:, -1, x_idx], dn2[:, -1, x_idx], dn3[:, -1, x_idx], dn4[:, -1, x_idx]] - if model[0:3] == 'Nuc': # with nucleation mode - numall.append(num_a5[:, -1, x_idx]) - dnall.append(dn5[:, -1, x_idx]) - - - NCNall = calc_CNsize_cutoff_0_3000nm(dnall, numall, T[:, -1, x_idx], Pres[:, -1, x_idx]) - - # calculate total CN concentration for CPC (>10nm) and CPCU (>3nm) - NUCN = np.nansum(NCNall[3:, :], 0) # >3nm - NCN = np.nansum(NCNall[10:, :], 0) # >10nm + filename_input = E3SM_hourly_path[mm] + E3SM_hourly_filehead[mm] + '.cam.h3.' + date + '-00000.nc' + + (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) + (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) + x_idx = find_nearest(lonm, latm, lon0, lat0) + + cdaym = timeunit2cday(timeunitm, 'noleap') + yearm = timeunitm.split(' ')[2][0:4] + time = timem.data - 365*(int(year0)-int(yearm)) + cdaym + + # do not use read_E3SM because hyam and hybm don't have units + f = Dataset(filename_input, 'r') + P0 = f.variables['P0'][:] + hyam = f.variables['hyam'][:] + hybm = f.variables['hybm'][:] + T = f.variables['T_' + E3SMdomain_range][:] + PS = f.variables['PS_' + E3SMdomain_range][:] + num_a1 = f.variables['num_a1_' + E3SMdomain_range][:] + num_a2 = f.variables['num_a2_' + E3SMdomain_range][:] + num_a3 = f.variables['num_a3_' + E3SMdomain_range][:] + num_a4 = f.variables['num_a4_' + E3SMdomain_range][:] + dn1 = f.variables['dgnd_a01_' + E3SMdomain_range][:] + dn2 = f.variables['dgnd_a02_' + E3SMdomain_range][:] + dn3 = f.variables['dgnd_a03_' + E3SMdomain_range][:] + dn4 = f.variables['dgnd_a04_' + E3SMdomain_range][:] + if model[0:3] == 'Nuc': # with nucleation mode + num_a5 = f.variables['num_a5_' + E3SMdomain_range][:] + dn5 = f.variables['dgnd_a05_' + E3SMdomain_range][:] + f.close() + Pres = np.nan*T + zlen = T.shape[1] + for kk in range(zlen): + Pres[:, kk, :] = hyam[kk]*P0 + hybm[kk]*PS + numall = [num_a1[:, -1, x_idx], num_a2[:, -1, x_idx], num_a3[:, -1, x_idx], num_a4[:, -1, x_idx]] + dnall = [dn1[:, -1, x_idx], dn2[:, -1, x_idx], dn3[:, -1, x_idx], dn4[:, -1, x_idx]] + if model[0:3] == 'Nuc': # with nucleation mode + numall.append(num_a5[:, -1, x_idx]) + dnall.append(dn5[:, -1, x_idx]) + + + NCNall = calc_CNsize_cutoff_0_3000nm(dnall, numall, T[:, -1, x_idx], Pres[:, -1, x_idx]) - #%% output extacted file - outputname = 'SFC_CNsize_' + campaign + '_' + model + '_' + date + '.nc' - print('output to this file: ' + E3SM_sfc_path + outputname) - - # define filename - f = Dataset(E3SM_sfc_path + outputname, 'w', format='NETCDF4') - - # define dimensions - t = f.createDimension('time', None) # unlimited - s = f.createDimension('size', 3000) # unlimited - - # create variable list - time_o = f.createVariable("time", "f8", ("time", )) - size_o = f.createVariable("size", "f8", ("size", )) - lat_o = f.createVariable("lat", "f8", ()) - lon_o = f.createVariable("lon", "f8", ()) - - data_o = f.createVariable('NCNall', 'f8', ("size", "time")) - ncn_o = f.createVariable("NCN", "f8", ("time", )) - nucn_o = f.createVariable("NUCN", "f8", ("time", )) - - # write data - time_o[:] = time - lat_o[:] = latm[x_idx] - lon_o[:] = lonm[x_idx] - size_o[:] = np.arange(1, 3001) - data_o[:, :] = NCNall - ncn_o[:] = NCN - nucn_o[:] = NUCN - - # attributes - time_o.units = "days since " + str(int(year0)-1) + "-12-31 00:00:00 UTC" - lat_o.units = "latitude" - lon_o.units = "longitude" - size_o.units = 'nm' - size_o.long_name = "0 to 3000nm with 1nm increment" - data_o.units = '#/m3' - data_o.long_name = 'aerosol size distribution' - ncn_o.units = '#/m3' - ncn_o.long_name = 'aerosol number concentration for size >10nm' - nucn_o.units = '#/m3' - nucn_o.long_name = 'aerosol number concentration for size >3nm' - - # global attributes - import time as ttt - f.description = model + " extact surface aerosol size distribution for " + campaign - f.modeldata = filename_input - f.create_time = ttt.ctime(ttt.time()) + # calculate total CN concentration for CPC (>10nm) and CPCU (>3nm) + NUCN = np.nansum(NCNall[3:, :], 0) # >3nm + NCN = np.nansum(NCNall[10:, :], 0) # >10nm + + - f.close() + #%% output extacted file + outputname = 'SFC_CNsize_' + campaign + '_' + model + '_' + date + '.nc' + print('output to this file: ' + E3SM_sfc_path + outputname) + + # define filename + f = Dataset(E3SM_sfc_path + outputname, 'w', format='NETCDF4') + + # define dimensions + t = f.createDimension('time', None) # unlimited + s = f.createDimension('size', 3000) # unlimited + + # create variable list + time_o = f.createVariable("time", "f8", ("time", )) + size_o = f.createVariable("size", "f8", ("size", )) + lat_o = f.createVariable("lat", "f8", ()) + lon_o = f.createVariable("lon", "f8", ()) + + data_o = f.createVariable('NCNall', 'f8', ("size", "time")) + ncn_o = f.createVariable("NCN", "f8", ("time", )) + nucn_o = f.createVariable("NUCN", "f8", ("time", )) + + # write data + time_o[:] = time + lat_o[:] = latm[x_idx] + lon_o[:] = lonm[x_idx] + size_o[:] = np.arange(1, 3001) + data_o[:, :] = NCNall + ncn_o[:] = NCN + nucn_o[:] = NUCN + + # attributes + time_o.units = "days since " + str(int(year0)-1) + "-12-31 00:00:00 UTC" + lat_o.units = "latitude" + lon_o.units = "longitude" + size_o.units = 'nm' + size_o.long_name = "0 to 3000nm with 1nm increment" + data_o.units = '#/m3' + data_o.long_name = 'aerosol size distribution' + ncn_o.units = '#/m3' + ncn_o.long_name = 'aerosol number concentration for size >10nm' + nucn_o.units = '#/m3' + nucn_o.long_name = 'aerosol number concentration for size >3nm' + + # global attributes + import time as ttt + f.description = model + " extact surface aerosol size distribution for " + campaign + f.modeldata = filename_input + f.create_time = ttt.ctime(ttt.time()) + + f.close() diff --git a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py index b204fff..d80af6a 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_allvars.py @@ -3,7 +3,6 @@ # input data is E3SM regional output # output is surface variables at the nearest grid of the ship track """ -import sys import os import glob @@ -19,218 +18,225 @@ def find_nearest(xall, yall, x, y): idx = distance.argmin() return(idx) -#%% settings +def run_prep(settings): + #%% variables from settings + campaign = settings['campaign'] + shipmetpath = settings['shipmetpath'] + Model_List = settings['Model_List'] + E3SM_hourly_path = settings['E3SM_hourly_path'] + E3SM_hourly_filehead = settings['E3SM_hourly_filehead'] + E3SM_ship_path = settings['E3SM_ship_path'] -from settings import campaign, shipmetpath, E3SM_h3_path, E3SM_h3_filehead, E3SM_ship_path, Model_List - -if not os.path.exists(E3SM_ship_path): - os.makedirs(E3SM_ship_path) - -#%% get all ship data -if campaign=='MAGIC': - lst = glob.glob(shipmetpath+'marmet*.txt') - E3SMdomain_range='202e_to_243e_20n_to_35n' # domain range in E3SM regional output -elif campaign=='MARCUS': - lst = [1, 2, 3, 4] # there are 4 ship trips (legs) for MARCUS - E3SMdomain_range='60e_to_160e_42s_to_70s' -else: - raise ValueError('data for this field campaign is not specified: ' + campaign) - -lst.sort() -print('total number of ship leg files:'+str(len(lst))) - - -for filename in lst: - - #%% read in ship data + #%% other settings + if not os.path.exists(E3SM_ship_path): + os.makedirs(E3SM_ship_path) + + #%% get all ship data if campaign=='MAGIC': - # for each ship leg - legnum=filename[-6:-4] - - (shipdata, shipvarlist) = read_marmet(filename) - year=[a[1] for a in shipdata] - month=[a[2] for a in shipdata] - day=[a[3] for a in shipdata] - hh=[int(a[4]) for a in shipdata] - mm=[int(a[5]) for a in shipdata] - ss=[int(a[6]) for a in shipdata] - lat=np.array([float(a[7]) for a in shipdata]) - lon=np.array([float(a[8]) for a in shipdata]) - - # ymd = [year[i]+'-'+month[i]+'-'+day[i] for i in range(len(year))] # yyyy-mm-dd - yyyymmdd = [year[i]+month[i]+day[i] for i in range(len(year))] # yyyymmdd - ymd=list(set(yyyymmdd)) # unique date - ymd.sort() - - - time = np.array(hh)/24. + np.array(mm)/1440. + np.array(ss)/86400. - for i in range(len(time)): - cday0 = yyyymmdd2cday(yyyymmdd[i], 'noleap') - if year[i]==year[0]: - time[i]=time[i]+cday0 - else: - time[i]=time[i]+cday0+365 # next year - + lst = glob.glob(shipmetpath+'marmet*.txt') + E3SMdomain_range='202e_to_243e_20n_to_35n' # domain range in E3SM regional output elif campaign=='MARCUS': - legnum=str(filename) - if legnum=='1': - startdate='2017-10-30' - enddate='2017-12-02' - elif legnum=='2': - startdate='2017-12-13' - enddate='2018-01-11' - elif legnum=='3': - startdate='2018-01-16' - enddate='2018-03-04' - elif legnum=='4': - startdate='2018-03-09' - enddate='2018-03-22' - - cday1=yyyymmdd2cday(startdate, 'noleap') - cday2=yyyymmdd2cday(enddate, 'noleap') - if startdate[0:4]!=enddate[0:4]: - cday2=cday2+365 # cover two years - - time=np.empty(0) - lon=np.empty(0) - lat=np.empty(0) - ymd=[] - for cc in range(cday1, cday2+1): - if cc<=365: - yyyymmdd=startdate[0:4]+cday2mmdd(cc) - else: - yyyymmdd=enddate[0:4]+cday2mmdd(cc-365) - - lst0 = glob.glob(shipmetpath+'maraadmetX1.b1.'+yyyymmdd+'*') - (time0, lon0, timeunit, lonunit, lon_long_name)=read_met(lst0[0], 'lon') - (time0, lat0, timeunit, lonunit, lon_long_name)=read_met(lst0[0], 'lat') - ymd0 = timeunit.split()[2] - ymd.append(ymd0[0:4]+ymd0[5:7]+ymd0[8:10]) - - time = np.hstack((time, time0/86400. + cc)) - lat = np.hstack((lat, lat0)) - lon = np.hstack((lon, lon0)) + lst = [1, 2, 3, 4] # there are 4 ship trips (legs) for MARCUS + E3SMdomain_range='60e_to_160e_42s_to_70s' + else: + raise ValueError('data for this field campaign is not specified: ' + campaign) + + lst.sort() + print('total number of ship leg files:'+str(len(lst))) - print('date for shipleg '+legnum+': '+ymd[0]+'-'+ymd[-1]) - #%% set variables to be read - for mm in range(len(Model_List)): - model=Model_List[mm] - variable1d_names = ['PS', 'PBLH', 'FLNT', 'FSNT', 'FLNS', 'FSNS', "LHFLX", "SHFLX", - 'TREFHT', 'PRECT', 'PRECL', "TGCLDLWP", "TGCLDIWP"] - variable2d_names = ['T', 'U', 'V', 'Q', 'RELHUM', 'RHW', 'RHI', 'CLOUD', - 'CLDLIQ', 'CLDICE', 'NUMLIQ', 'NUMICE', 'NUMRAI', 'NUMSNO', 'RAINQM', 'SNOWQM', - 'CCN1', 'CCN3', 'CCN5', "AREI", "AREL", "ICLDIWP", "ICLDTWP", - 'bc_a1', 'bc_a3', 'bc_a4', 'dst_a1', 'dst_a3', 'mom_a1', 'mom_a2', 'mom_a3', 'mom_a4', - 'ncl_a1', 'ncl_a2', 'ncl_a3', 'pom_a1', 'pom_a3', 'pom_a4', 'so4_a1', 'so4_a2', 'so4_a3', - 'soa_a1', 'soa_a2', 'soa_a3', 'num_a1', 'num_a2', 'num_a3', 'num_a4', - 'num_c1', 'num_c2', 'num_c3', 'num_c4', "dgnd_a01", "dgnd_a02", "dgnd_a03", "dgnd_a04", - "dgnw_a01", "dgnw_a02", "dgnw_a03", "dgnw_a04", 'EXTINCT', 'ABSORB'] - if model=='NucSoaCond': # with so4 and soa in nucleation mode - variable2d_names=variable2d_names+['so4_a5', 'soa_a5', 'num_a5', 'num_c5', "dgnd_a05", "dgnw_a05"] - elif model=='Nuc': # only with so4 in nucleation mode - variable2d_names=variable2d_names+['so4_a5', 'num_a5', 'num_c5', "dgnd_a05", "dgnw_a05"] - var1dlen = len(variable1d_names) - var2dlen = len(variable2d_names) - variable_names = variable1d_names+variable2d_names - varlen = var1dlen+var2dlen + for filename in lst: - #%% read in E3SM data - variables = list() - var_units = list() - var_longnames = list() + #%% read in ship data - # read all days in the ship leg - for dd in range(len(ymd)): - ymd2 = ymd[dd][0:4]+'-'+ymd[dd][4:6]+'-'+ymd[dd][6:8] - print('read this date: '+ymd2) - filename_input = E3SM_h3_path[mm]+E3SM_h3_filehead[mm]+'.cam.h3.'+ymd2+'-00000.nc' + if campaign=='MAGIC': + # for each ship leg + legnum=filename[-6:-4] - (timem, lonm, timeunitm, lonmunit, lonmname)=read_E3SM(filename_input, 'lon_'+E3SMdomain_range) - (timem, latm, timeunitm, latmunit, latmname)=read_E3SM(filename_input, 'lat_'+E3SMdomain_range) - # (timem, psm, timeunitm, psmunit, psmname)=read_E3SM(filename_input, 'PS_'+E3SMdomain_range) + (shipdata, shipvarlist) = read_marmet(filename) + year=[a[1] for a in shipdata] + month=[a[2] for a in shipdata] + day=[a[3] for a in shipdata] + hh=[int(a[4]) for a in shipdata] + mm=[int(a[5]) for a in shipdata] + ss=[int(a[6]) for a in shipdata] + lat=np.array([float(a[7]) for a in shipdata]) + lon=np.array([float(a[8]) for a in shipdata]) - cdaym = timeunit2cday(timeunitm, 'noleap') - yearm = timeunitm.split(' ')[2][0:4] - timem2 = timem.data-365*(int(ymd[0][0:4])-int(yearm)) + cdaym + # ymd = [year[i]+'-'+month[i]+'-'+day[i] for i in range(len(year))] # yyyy-mm-dd + yyyymmdd = [year[i]+month[i]+day[i] for i in range(len(year))] # yyyymmdd + ymd=list(set(yyyymmdd)) # unique date + ymd.sort() - # ship measurement times during the model day - timeo = time[np.logical_and(time>=timem2[0], time=timem2[0], time=timem2[0], time=timem2[0], time=timem2[0], time=timem2[0], time= timem2[0], time < timem2[0] + 1)] - lono = lon[np.logical_and(time >= timem2[0], time < timem2[0] + 1)] - lato = lat[np.logical_and(time >= timem2[0], time < timem2[0] + 1)] - + cdaym = timeunit2cday(timeunitm, 'noleap') + yearm = timeunitm.split(' ')[2][0:4] + timem2 = timem.data - 365*(int(ymd[0][0:4]) - int(yearm)) + cdaym - # allocation variables and attributes - if dd == 0: - for vv in range(varlen): - variables.append([]) + # do not use read_E3SM because hyam and hybm don't have units + f = Dataset(filename_input, 'r') + P0 = f.variables['P0'][:] + hyam = f.variables['hyam'][:] + hybm = f.variables['hybm'][:] + T = f.variables['T_' + E3SMdomain_range][:] + PS = f.variables['PS_' + E3SMdomain_range][:] + num_a1 = f.variables['num_a1_' + E3SMdomain_range][:] + num_a2 = f.variables['num_a2_' + E3SMdomain_range][:] + num_a3 = f.variables['num_a3_' + E3SMdomain_range][:] + num_a4 = f.variables['num_a4_' + E3SMdomain_range][:] + dn1 = f.variables['dgnd_a01_' + E3SMdomain_range][:] + dn2 = f.variables['dgnd_a02_' + E3SMdomain_range][:] + dn3 = f.variables['dgnd_a03_' + E3SMdomain_range][:] + dn4 = f.variables['dgnd_a04_' + E3SMdomain_range][:] + if model == 'Nuc': # with nucleation mode + num_a5 = f.variables['num_a5_' + E3SMdomain_range][:] + dn5 = f.variables['dgnd_a05_' + E3SMdomain_range][:] + f.close() + + Pres = np.nan*T + zlen = T.shape[1] + for kk in range(zlen): + Pres[:, kk, :] = hyam[kk]*P0 + hybm[kk]*PS + + varall = [T, Pres, num_a1, dn1, num_a2, dn2, num_a3, dn3, num_a4, dn4] + if model == 'Nuc': # with nucleation mode + varall.append(num_a5) + varall.append(dn5) - # extract the data at the time and location of ship - for tt in range(len(timeo)): - t_idx = np.abs(timem2-timeo[tt]).argmin() - if lono[tt]<-900. or lato[tt]<-900: - for vv in range(varlen): - variables[vv].append(np.nan) - else: - x_idx = find_nearest(lonm, latm, lono[tt], lato[tt]) + # ship measurement times during the model day + timeo = time[np.logical_and(time >= timem2[0], time < timem2[0] + 1)] + lono = lon[np.logical_and(time >= timem2[0], time < timem2[0] + 1)] + lato = lat[np.logical_and(time >= timem2[0], time < timem2[0] + 1)] + + + # allocation variables and attributes + if dd == 0: for vv in range(varlen): - variables[vv].append(varall[vv][t_idx, -1, x_idx]) # choose the lowest level - - numall = [np.array(a) for a in variables[2::2]] - dnall = [np.array(a) for a in variables[3::2]] - - NCNall = calc_CNsize_cutoff_0_3000nm(dnall, numall, np.array(variables[0]), np.array(variables[1])) - - # calculate total CN concentration for CPC (>10nm) and CPCU (>3nm) - NUCN = np.nansum(NCNall[3:, :], 0) # >3nm - NCN = np.nansum(NCNall[10:, :], 0) # >10nm - - - # %% output extacted file - outputname = 'Ship_CNsize_' + campaign + '_' + model + '_shipleg' + legnum + '.nc' - print('output to this file: ' + E3SM_ship_path + outputname) - - # define filename - f = Dataset(E3SM_ship_path + outputname, 'w', format='NETCDF4') - - # define dimensions - t = f.createDimension('time', None) # unlimited - size = f.createDimension('size', 3000) - - # create variable list - time_o = f.createVariable("time", "f8", ("time", )) - size_o = f.createVariable("size", 'i8', ("size")) - lat_o = f.createVariable("lat", "f8", ("time", )) - lon_o = f.createVariable("lon", "f8", ("time", )) - - data_o = f.createVariable('NCNall', 'f8', ("size", "time")) - ncn_o = f.createVariable("NCN", "f8", ("time", )) - nucn_o = f.createVariable("NUCN", "f8", ("time", )) - - # write data - time_o[:] = time - size_o[:] = np.arange(1, 3001) - lat[lat<-900] = -9999. - lon[lon<-900] = -9999. - lat_o[:] = lat - lon_o[:] = lon - NCNall[np.isnan(NCNall)] = -9999. - NCN[np.isnan(NCN)] = -9999. - NUCN[np.isnan(NUCN)] = -9999. - data_o[:, :] = NCNall - ncn_o[:] = NCN - nucn_o[:] = NUCN - - # attributes - time_o.units = "days since " + str(int(ymd[0][0:4])-1) + "-12-31 00:00:00 UTC" - lat_o.units = "degree north" - lon_o.units = "degree east" - time_o.long_name = "Calendar Day" - lat_o.long_name = "latitude" - lon_o.long_name = "longitude" - size_o.units = 'nm' - size_o.long_name = "0 to 3000nm with 1nm increment" - data_o.units = '#/m3' - data_o.long_name = 'aerosol size distribution' - ncn_o.units = '#/m3' - ncn_o.long_name = 'aerosol number concentration for size >10nm' - nucn_o.units = '#/m3' - nucn_o.long_name = 'aerosol number concentration for size >3nm' - - # global attributes - import time as ttt - f.description = model + " calculated aerosol size distribution along ship tracks for " + campaign - f.shiptrackdata = filename - f.modeldata = E3SM_h3_path[mm] + E3SM_h3_filehead[mm] + '.cam.h3.*.nc' - f.datanotes = 'variables are set as missing if GPS location is missing' - f.create_time = ttt.ctime(ttt.time()) - - f.close() \ No newline at end of file + variables.append([]) + + # extract the data at the time and location of ship + for tt in range(len(timeo)): + t_idx = np.abs(timem2-timeo[tt]).argmin() + if lono[tt]<-900. or lato[tt]<-900: + for vv in range(varlen): + variables[vv].append(np.nan) + else: + x_idx = find_nearest(lonm, latm, lono[tt], lato[tt]) + for vv in range(varlen): + variables[vv].append(varall[vv][t_idx, -1, x_idx]) # choose the lowest level + + numall = [np.array(a) for a in variables[2::2]] + dnall = [np.array(a) for a in variables[3::2]] + + NCNall = calc_CNsize_cutoff_0_3000nm(dnall, numall, np.array(variables[0]), np.array(variables[1])) + + # calculate total CN concentration for CPC (>10nm) and CPCU (>3nm) + NUCN = np.nansum(NCNall[3:, :], 0) # >3nm + NCN = np.nansum(NCNall[10:, :], 0) # >10nm + + + # %% output extacted file + outputname = 'Ship_CNsize_' + campaign + '_' + model + '_shipleg' + legnum + '.nc' + print('output to this file: ' + E3SM_ship_path + outputname) + + # define filename + f = Dataset(E3SM_ship_path + outputname, 'w', format='NETCDF4') + + # define dimensions + t = f.createDimension('time', None) # unlimited + size = f.createDimension('size', 3000) + + # create variable list + time_o = f.createVariable("time", "f8", ("time", )) + size_o = f.createVariable("size", 'i8', ("size")) + lat_o = f.createVariable("lat", "f8", ("time", )) + lon_o = f.createVariable("lon", "f8", ("time", )) + + data_o = f.createVariable('NCNall', 'f8', ("size", "time")) + ncn_o = f.createVariable("NCN", "f8", ("time", )) + nucn_o = f.createVariable("NUCN", "f8", ("time", )) + + # write data + time_o[:] = time + size_o[:] = np.arange(1, 3001) + lat[lat<-900] = -9999. + lon[lon<-900] = -9999. + lat_o[:] = lat + lon_o[:] = lon + NCNall[np.isnan(NCNall)] = -9999. + NCN[np.isnan(NCN)] = -9999. + NUCN[np.isnan(NUCN)] = -9999. + data_o[:, :] = NCNall + ncn_o[:] = NCN + nucn_o[:] = NUCN + + # attributes + time_o.units = "days since " + str(int(ymd[0][0:4])-1) + "-12-31 00:00:00 UTC" + lat_o.units = "degree north" + lon_o.units = "degree east" + time_o.long_name = "Calendar Day" + lat_o.long_name = "latitude" + lon_o.long_name = "longitude" + size_o.units = 'nm' + size_o.long_name = "0 to 3000nm with 1nm increment" + data_o.units = '#/m3' + data_o.long_name = 'aerosol size distribution' + ncn_o.units = '#/m3' + ncn_o.long_name = 'aerosol number concentration for size >10nm' + nucn_o.units = '#/m3' + nucn_o.long_name = 'aerosol number concentration for size >3nm' + + # global attributes + import time as ttt + f.description = model + " calculated aerosol size distribution along ship tracks for " + campaign + f.shiptrackdata = filename + f.modeldata = E3SM_hourly_path[mm] + E3SM_hourly_filehead[mm] + '.cam.h3.*.nc' + f.datanotes = 'variables are set as missing if GPS location is missing' + f.create_time = ttt.ctime(ttt.time()) + + f.close() \ No newline at end of file diff --git a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py index 365b137..3733257 100644 --- a/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py +++ b/src/esmac_diags/preprocessing/prep_E3SM_shiptrack_profiles.py @@ -3,7 +3,6 @@ # input data is E3SM regional output # output is vertical profiles at the nearest grid of the ship track """ -import sys import os import glob @@ -19,213 +18,220 @@ def find_nearest(xall, yall, x, y): idx = distance.argmin() return(idx) -#%% settings +def run_prep(settings): + #%% variables from settings + campaign = settings['campaign'] + shipmetpath = settings['shipmetpath'] + Model_List = settings['Model_List'] + E3SM_hourly_path = settings['E3SM_hourly_path'] + E3SM_hourly_filehead = settings['E3SM_hourly_filehead'] + E3SM_ship_path = settings['E3SM_ship_path'] -from settings import campaign, shipmetpath, E3SM_h3_path, E3SM_h3_filehead, E3SM_ship_path, Model_List - -if not os.path.exists(E3SM_ship_path): - os.makedirs(E3SM_ship_path) - -# output height above ground. data will be interpolated into z_f -z_f = np.hstack((np.arange(0,500,50), np.arange(500,2000,100), np.arange(2000,5000,300), - np.arange(5000,10000,500), np.arange(10000,20001,1000))) -zlen = len(z_f) - -#%% set variables to be read -variable_names = ['T', 'U', 'V', 'Q', 'RELHUM', 'RHW', 'RHI', 'CLOUD', 'LWC', 'IWC', - 'CLDLIQ', 'CLDICE', 'NUMLIQ', "AREI", "AREL", "ICLDIWP", "ICLDTWP"] -varlen = len(variable_names) - -#%% get all ship data -if campaign == 'MAGIC': - lst = glob.glob(shipmetpath + 'marmet*.txt') - E3SMdomain_range = '202e_to_243e_20n_to_35n' # domain range in E3SM regional output -elif campaign == 'MARCUS': - lst = [1, 2, 3, 4] # there are 4 ship trips (legs) for MARCUS - E3SMdomain_range = '60e_to_160e_42s_to_70s' -else: - raise ValueError('data for this field campaign is not specified: ' + campaign) -lst.sort() -print('total number of ship leg files:' + str(len(lst))) - - -for filename in lst: + #%% other settings + + if not os.path.exists(E3SM_ship_path): + os.makedirs(E3SM_ship_path) - - #%% read in ship data + # output height above ground. data will be interpolated into z_f + z_f = np.hstack((np.arange(0,500,50), np.arange(500,2000,100), np.arange(2000,5000,300), + np.arange(5000,10000,500), np.arange(10000,20001,1000))) + zlen = len(z_f) + + #%% set variables to be read + variable_names = ['T', 'U', 'V', 'Q', 'RELHUM', 'RHW', 'RHI', 'CLOUD', 'LWC', 'IWC', + 'CLDLIQ', 'CLDICE', 'NUMLIQ', "AREI", "AREL", "ICLDIWP", "ICLDTWP"] + varlen = len(variable_names) + #%% get all ship data if campaign == 'MAGIC': - # for each ship leg - legnum = filename[-6:-4] + lst = glob.glob(shipmetpath + 'marmet*.txt') + E3SMdomain_range = '202e_to_243e_20n_to_35n' # domain range in E3SM regional output + elif campaign == 'MARCUS': + lst = [1, 2, 3, 4] # there are 4 ship trips (legs) for MARCUS + E3SMdomain_range = '60e_to_160e_42s_to_70s' + else: + raise ValueError('data for this field campaign is not specified: ' + campaign) + lst.sort() + print('total number of ship leg files:' + str(len(lst))) - (shipdata, shipvarlist) = read_marmet(filename) - year = [a[1] for a in shipdata] - month = [a[2] for a in shipdata] - day = [a[3] for a in shipdata] - hh = [int(a[4]) for a in shipdata] - mm = [int(a[5]) for a in shipdata] - ss = [int(a[6]) for a in shipdata] - lat = np.array([float(a[7]) for a in shipdata]) - lon = np.array([float(a[8]) for a in shipdata]) + + for filename in lst: - # ymd = [year[i] + '-' + month[i] + '-' + day[i] for i in range(len(year))] # yyyy-mm-dd - yyyymmdd = [year[i] + month[i] + day[i] for i in range(len(year))] # yyyymmdd - ymd = list(set(yyyymmdd)) # unique date - ymd.sort() + + #%% read in ship data + if campaign == 'MAGIC': + # for each ship leg + legnum = filename[-6:-4] - time = np.array(hh)/24. + np.array(mm)/1440. + np.array(ss)/86400. - for i in range(len(time)): - cday0 = yyyymmdd2cday(yyyymmdd[i], 'noleap') - if year[i] == year[0]: - time[i] = time[i] + cday0 - else: - time[i] = time[i] + cday0 + 365 # next year - - elif campaign == 'MARCUS': - legnum = str(filename) - if legnum == '1': - startdate = '2017-10-30' - enddate = '2017-12-02' - elif legnum == '2': - startdate = '2017-12-13' - enddate = '2018-01-11' - elif legnum == '3': - startdate = '2018-01-16' - enddate = '2018-03-04' - elif legnum == '4': - startdate = '2018-03-09' - enddate = '2018-03-22' + (shipdata, shipvarlist) = read_marmet(filename) + year = [a[1] for a in shipdata] + month = [a[2] for a in shipdata] + day = [a[3] for a in shipdata] + hh = [int(a[4]) for a in shipdata] + mm = [int(a[5]) for a in shipdata] + ss = [int(a[6]) for a in shipdata] + lat = np.array([float(a[7]) for a in shipdata]) + lon = np.array([float(a[8]) for a in shipdata]) + + # ymd = [year[i] + '-' + month[i] + '-' + day[i] for i in range(len(year))] # yyyy-mm-dd + yyyymmdd = [year[i] + month[i] + day[i] for i in range(len(year))] # yyyymmdd + ymd = list(set(yyyymmdd)) # unique date + ymd.sort() - cday1 = yyyymmdd2cday(startdate, 'noleap') - cday2 = yyyymmdd2cday(enddate, 'noleap') - if startdate[0:4] != enddate[0:4]: - cday2 = cday2 + 365 # cover two years - - time = np.empty(0) - lon = np.empty(0) - lat = np.empty(0) - ymd = [] - for cc in range(cday1, cday2 + 1): - if cc <= 365: - yyyymmdd = startdate[0:4] + cday2mmdd(cc) - else: - yyyymmdd = enddate[0:4] + cday2mmdd(cc-365) - - lst0 = glob.glob(shipmetpath + 'maraadmetX1.b1.' + yyyymmdd + '*') - (time0, lon0, timeunit, lonunit, lon_long_name) = read_met(lst0[0], 'lon') - (time0, lat0, timeunit, lonunit, lon_long_name) = read_met(lst0[0], 'lat') - ymd0 = timeunit.split()[2] - ymd.append(ymd0[0:4] + ymd0[5:7] + ymd0[8:10]) - time = np.hstack((time, time0/86400. + cc)) - lat = np.hstack((lat, lat0)) - lon = np.hstack((lon, lon0)) + time = np.array(hh)/24. + np.array(mm)/1440. + np.array(ss)/86400. + for i in range(len(time)): + cday0 = yyyymmdd2cday(yyyymmdd[i], 'noleap') + if year[i] == year[0]: + time[i] = time[i] + cday0 + else: + time[i] = time[i] + cday0 + 365 # next year - print('date for shipleg ' + legnum + ': ' + ymd[0] + '-' + ymd[-1]) + elif campaign == 'MARCUS': + legnum = str(filename) + if legnum == '1': + startdate = '2017-10-30' + enddate = '2017-12-02' + elif legnum == '2': + startdate = '2017-12-13' + enddate = '2018-01-11' + elif legnum == '3': + startdate = '2018-01-16' + enddate = '2018-03-04' + elif legnum == '4': + startdate = '2018-03-09' + enddate = '2018-03-22' + + cday1 = yyyymmdd2cday(startdate, 'noleap') + cday2 = yyyymmdd2cday(enddate, 'noleap') + if startdate[0:4] != enddate[0:4]: + cday2 = cday2 + 365 # cover two years - #%% read in E3SM data - for mm in range(len(Model_List)): - model = Model_List[mm] - variables = list() - var_units = list() - var_longnames = list() + time = np.empty(0) + lon = np.empty(0) + lat = np.empty(0) + ymd = [] + for cc in range(cday1, cday2 + 1): + if cc <= 365: + yyyymmdd = startdate[0:4] + cday2mmdd(cc) + else: + yyyymmdd = enddate[0:4] + cday2mmdd(cc-365) + + lst0 = glob.glob(shipmetpath + 'maraadmetX1.b1.' + yyyymmdd + '*') + (time0, lon0, timeunit, lonunit, lon_long_name) = read_met(lst0[0], 'lon') + (time0, lat0, timeunit, lonunit, lon_long_name) = read_met(lst0[0], 'lat') + ymd0 = timeunit.split()[2] + ymd.append(ymd0[0:4] + ymd0[5:7] + ymd0[8:10]) + + time = np.hstack((time, time0/86400. + cc)) + lat = np.hstack((lat, lat0)) + lon = np.hstack((lon, lon0)) + + print('date for shipleg ' + legnum + ': ' + ymd[0] + '-' + ymd[-1]) - # read all days in the ship leg - for dd in range(len(ymd)): - ymd2 = ymd[dd][0:4] + '-' + ymd[dd][4:6] + '-' + ymd[dd][6:8] - print('read this date: ' + ymd2) - filename_input = E3SM_h3_path[mm] + E3SM_h3_filehead[mm] + '.cam.h3.' + ymd2 + '-00000.nc' + #%% read in E3SM data + for mm in range(len(Model_List)): + model = Model_List[mm] + variables = list() + var_units = list() + var_longnames = list() - (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) - (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) - (timem, z3, timeunitm, zunit, zname) = read_E3SM(filename_input, 'Z3_' + E3SMdomain_range) - # (timem, psm, timeunitm, psmunit, psmname) = read_E3SM(filename_input, 'PS_' + E3SMdomain_range) + # read all days in the ship leg + for dd in range(len(ymd)): + ymd2 = ymd[dd][0:4] + '-' + ymd[dd][4:6] + '-' + ymd[dd][6:8] + print('read this date: ' + ymd2) + filename_input = E3SM_hourly_path[mm] + E3SM_hourly_filehead[mm] + '.cam.h3.' + ymd2 + '-00000.nc' + + (timem, lonm, timeunitm, lonmunit, lonmname) = read_E3SM(filename_input, 'lon_' + E3SMdomain_range) + (timem, latm, timeunitm, latmunit, latmname) = read_E3SM(filename_input, 'lat_' + E3SMdomain_range) + (timem, z3, timeunitm, zunit, zname) = read_E3SM(filename_input, 'Z3_' + E3SMdomain_range) + # (timem, psm, timeunitm, psmunit, psmname) = read_E3SM(filename_input, 'PS_' + E3SMdomain_range) + + cdaym = timeunit2cday(timeunitm, 'noleap') + yearm = timeunitm.split(' ')[2][0:4] + timem2 = timem.data-365*(int(ymd[0][0:4])-int(yearm)) + cdaym + + # ship measurement times during the model day + timeo = time[np.logical_and(time>=timem2[0], time=timem2[0], time=timem2[0], time=timem2[0], time=timem2[0], time=timem2[0], time1e4] = 1e8 - # data2[np.logical_or(data2<0, data2>1e4)] = np.nan - time_fims = data0[0, :] - # change data from #/dlnDp to number - data2 = data0[1:-3, :]*dlnDp_f + # read in fims bin + (d_fims, dmin_f, dmax_f) = read_fims_bin(fimspath + 'ACEENA_FIMS_bins_R0.dat') + # change unit to um + d_fims = [x/1000 for x in d_fims] + dmin_f = [x/1000 for x in dmin_f] + dmax_f = [x/1000 for x in dmax_f] + dlnDp_f = np.empty(len(d_fims)) + for bb in range(len(d_fims)): + dlnDp_f[bb] = np.log(dmax_f[bb]/dmin_f[bb]) + dlnDp_f = np.mean(dlnDp_f) + + for filename in lst[:]: - # TD mode or AMB mode. remove TD mode - TD_AMB = data0[-1, :] - data2[:, TD_AMB != 0] = -9999. + # get date + fname = re.split('aceena.|.a2', filename) + date = fname[-2] + print(date) - fims = np.empty([30, len(time)]) - for ii in range(30): - fims[ii, :] = np.interp(time, time_fims, data2[ii, :]) - idx = np.logical_or(time>time_fims[-1], time1e6)] = np.nan - # pcasp[:, flag != 0] = np.nan - if not all(time_pcasp == time): - raise ValueError('PCASP time is inconsistent with FIMS') - elif len(filename_p) == 0: - time_pcasp = time - d_pcasp = [(dmin_p[x] + dmax_p[x])/2 for x in range(len(dmin_p))] - pcasp = np.full([len(d_pcasp), len(time)], -9999.) - pcasp_total = np.full(len(time), -9999.) - else: - raise ValueError('find more than one file: ' + filename_p) - - # !! PCASP data is for standard T and p (Conc = Conc_orig*[(1013.25/Pamb)*(Tamb/293.15)]), change to ambient T/p - pcasp2 = np.array(pcasp) - for tt in range(len(time)): - pcasp[:, tt] = pcasp[:, tt]/((1013.25/p_amb[tt])*((T_amb[tt] + 273.15)/293.15)) - - # CVI - filename_c = glob.glob(cvipath + 'enaaafinletcviF1.c1.' + date[0:8] + '*.nc') - filename_c.sort() - # read in data - if len(filename_c) == 1: - (time_c, lon_c, lat_c, alt_c, timeunit_c, cvimode, cvi_inlet, enhance_factor, dilution_factor) = read_cvi(filename_c[0]) + #%% read in data + # IWG + (iwg, iwgvars) = read_iwg1(filename) + timelen = len(iwg) + # get lat, lon, height, time + lon = np.empty(timelen) + lat = np.empty(timelen) + height = np.empty(timelen) + time = np.empty(timelen) + cldflag = np.empty(timelen) + legnum = np.empty(timelen) + T_amb = np.empty(timelen) + p_amb = np.empty(timelen) if date == '20180216a': - time_c = np.insert(time_c, 1403, (time_c[1402] + time_c[1403])/2) - cvi_inlet=np.insert(cvi_inlet, 1403, cvi_inlet[1403]) - cvimode=np.insert(cvimode, 1403, cvimode[1403]) - enhance_factor = np.insert(enhance_factor, 1403, enhance_factor[1403]) - dilution_factor = np.insert(dilution_factor, 1403, dilution_factor[1403]) - enhance_factor[enhance_factor<-9000] = np.nan - dilution_factor[dilution_factor<-9000] = np.nan - if not all(time_c == time): - raise ValueError('CVI time is inconsistent with FIMS') - elif len(filename_c) == 0: - time_c = time - cvi_inlet = np.nan*np.empty([len(time)]) - cvimode = np.nan*np.empty([len(time)]) - enhance_factor = np.nan*np.empty([len(time)]) - dilution_factor = np.nan*np.empty([len(time)]) - else: - raise ValueError('find more than one file: ' + filename_c) - - cvi_inlet[cvi_inlet == -9] = 1 # if cvi_inlet is unfunctional, assume it is isokinetic and use fims as good data + iwg.insert(1403, list(iwg[1403])) + tstr = iwg[1403][1] + tstr = tstr[0:-1] + str(int(tstr[-1])-1) + iwg[1403][1] = tstr + del iwg[-1] + for t in range(timelen): + lat[t] = float(iwg[t][2]) + lon[t] = float(iwg[t][3]) + height[t] = float(iwg[t][4]) + T_amb[t] = float(iwg[t][20]) + p_amb[t] = float(iwg[t][23]) + cldflag[t] = int(iwg[t][35]) + legnum[t] = int(iwg[t][-1]) + timestr = iwg[t][1].split(' ') + time[t] = hhmmss2sec(timestr[1]) + datestr = timestr[0] + # FIMS + filename_f = glob.glob(fimspath + 'FIMS_G1_' + date[0:8] + '*_001s.ict') + # read in data + if len(filename_f) == 1: + (data0, fimslist) = read_fims(filename_f[0]) + # remove some unrealistic data + # data2 = data0[1:-2, :] + # data2[np.isnan(data2)] = 1e8 + # data2[:, data2[0, :]>1e4] = 1e8 + # data2[np.logical_or(data2<0, data2>1e4)] = np.nan + time_fims = data0[0, :] + # change data from #/dlnDp to number + data2 = data0[1:-3, :]*dlnDp_f + + # TD mode or AMB mode. remove TD mode + TD_AMB = data0[-1, :] + data2[:, TD_AMB != 0] = -9999. + + fims = np.empty([30, len(time)]) + for ii in range(30): + fims[ii, :] = np.interp(time, time_fims, data2[ii, :]) + idx = np.logical_or(time>time_fims[-1], time1e6)] = np.nan + # pcasp[:, flag != 0] = np.nan + if not all(time_pcasp == time): + raise ValueError('PCASP time is inconsistent with FIMS') + elif len(filename_p) == 0: + time_pcasp = time + d_pcasp = [(dmin_p[x] + dmax_p[x])/2 for x in range(len(dmin_p))] + pcasp = np.full([len(d_pcasp), len(time)], -9999.) + pcasp_total = np.full(len(time), -9999.) + else: + raise ValueError('find more than one file: ' + filename_p) + + # !! PCASP data is for standard T and p (Conc = Conc_orig*[(1013.25/Pamb)*(Tamb/293.15)]), change to ambient T/p + pcasp2 = np.array(pcasp) + for tt in range(len(time)): + pcasp[:, tt] = pcasp[:, tt]/((1013.25/p_amb[tt])*((T_amb[tt] + 273.15)/293.15)) - d_merge = (dia_merge_h + dia_merge_l)/2 + # CVI + filename_c = glob.glob(cvipath + 'enaaafinletcviF1.c1.' + date[0:8] + '*.nc') + filename_c.sort() + # read in data + if len(filename_c) == 1: + (time_c, lon_c, lat_c, alt_c, timeunit_c, cvimode, cvi_inlet, enhance_factor, dilution_factor) = read_cvi(filename_c[0]) + if date == '20180216a': + time_c = np.insert(time_c, 1403, (time_c[1402] + time_c[1403])/2) + cvi_inlet=np.insert(cvi_inlet, 1403, cvi_inlet[1403]) + cvimode=np.insert(cvimode, 1403, cvimode[1403]) + enhance_factor = np.insert(enhance_factor, 1403, enhance_factor[1403]) + dilution_factor = np.insert(dilution_factor, 1403, dilution_factor[1403]) + enhance_factor[enhance_factor<-9000] = np.nan + dilution_factor[dilution_factor<-9000] = np.nan + if not all(time_c == time): + raise ValueError('CVI time is inconsistent with FIMS') + elif len(filename_c) == 0: + time_c = time + cvi_inlet = np.nan*np.empty([len(time)]) + cvimode = np.nan*np.empty([len(time)]) + enhance_factor = np.nan*np.empty([len(time)]) + dilution_factor = np.nan*np.empty([len(time)]) + else: + raise ValueError('find more than one file: ' + filename_c) - # merged concentration - conc_merge = np.full([timelen, nbin_merge], -9999.) - fims[np.isnan(fims)] = -9999. # do not treat missing as NaN. treat -9999 - for k in range(timelen): - # mask all data with cloud flag on - if cldflag[k] != 0: - continue - # use fims data up to d_fims[24] - for n in range(24 + 1): - if cvi_inlet[k] == 0: # in Jerome's code it is 0. looks like it should be 1 (CVI in cloud) - fims[n, k] = -9999 - conc_merge[k, n] = fims[n, k] - # overlapping bins - idx = dmin_p.index(0.3) # start merging size. choose the index of pcasp for merging - if fims[25, k] >=0: - if cvi_inlet[k] == 1: - ffac = 0.8 - pfac = 0.2 - elif cvi_inlet[k] == 0: + cvi_inlet[cvi_inlet == -9] = 1 # if cvi_inlet is unfunctional, assume it is isokinetic and use fims as good data + + + # read OPC + filename_o = glob.glob(opcpath + 'OPCISO_G1_' + date[0:8] + '*.ict') + if len(filename_o) == 1: + (opc, dmin_o, dmax_o, d_opc, opclist) = read_opc(filename_o[0]) + time_o = opc[0, :] + opc = opc[1:, :] + opc[opc<0] = np.nan + else: + raise ValueError('can not find OPC data or find multiple files: ' + filename_o) + if date == '20180216a': + time_o = np.hstack((time_o[0:1403], 47873., time_o[1403:])) + opc = np.hstack((opc[:, 0:1403], (opc[:, 1402:1403] + opc[:, 1403:1404])/2, opc[:, 1403:])) + if any(time_o != time): + raise ValueError('OPC time is inconsistent with FIMS') + if sum(np.isnan(opc[0, :]))<0.1*len(time_o): + for ii in range(len(d_opc)): # fill missing timesteps + opc2 = opc[ii, :] + opc[ii, np.isnan(opc2)] = np.interp(time[np.isnan(opc2)], time[~np.isnan(opc2)], opc[ii, ~np.isnan(opc2)]) + else: + print('this date does not fill NaN OPC values') + + #%% now merge fims and pcasp + timelen = len(time) + nbin_merge = 67 + nbin_fims = len(d_fims) + nbin_pcasp = len(d_pcasp) + nbin_opc = len(d_opc) + # low and high range of each bin + dia_merge_l = np.full(nbin_merge, np.nan) + dia_merge_h = np.full(nbin_merge, np.nan) + # from bins 1-30, use FIMS bin + for n in range(nbin_fims): + dia_merge_l[n] = dmin_f[n] + dia_merge_h[n] = dmax_f[n] + # for the next bin, use upper range (0.64) of FIMS as low bound and 0.8 of PCASP as high bound + idx = dmax_p.index(0.8) + dia_merge_l[nbin_fims] = dmax_f[-1] + dia_merge_h[nbin_fims] = dmax_p[idx] + # next bin uses 0.8 as low bound and high bound of 2nd bin (0.9) of OPC + dia_merge_l[31] = 0.8 + dia_merge_h[31] = 0.9 + # next few bins are merged two OPC bins + for n in range(1, 6): + dia_merge_l[31 + n] = dmin_o[n*2] + dia_merge_h[31 + n] = dmax_o[n*2 + 1] + # other bins follows OPC bins + for n in range(12, nbin_opc): + dia_merge_l[25 + n] = dmin_o[n] + dia_merge_h[25 + n] = dmax_o[n] + + d_merge = (dia_merge_h + dia_merge_l)/2 + + # merged concentration + conc_merge = np.full([timelen, nbin_merge], -9999.) + fims[np.isnan(fims)] = -9999. # do not treat missing as NaN. treat -9999 + for k in range(timelen): + # mask all data with cloud flag on + if cldflag[k] != 0: + continue + # use fims data up to d_fims[24] + for n in range(24 + 1): + if cvi_inlet[k] == 0: # in Jerome's code it is 0. looks like it should be 1 (CVI in cloud) + fims[n, k] = -9999 + conc_merge[k, n] = fims[n, k] + # overlapping bins + idx = dmin_p.index(0.3) # start merging size. choose the index of pcasp for merging + if fims[25, k] >=0: + if cvi_inlet[k] == 1: + ffac = 0.8 + pfac = 0.2 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') + else: ffac = 0.0 pfac = 1.0 + conc_merge[k, 25] = (fims[25, k]*ffac + pcasp[idx, k]*0.3*pfac) + if fims[26, k] >=0: + if cvi_inlet[k] == 1: + ffac = 0.7 + pfac = 0.3 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 25] = (fims[25, k]*ffac + pcasp[idx, k]*0.3*pfac) - if fims[26, k] >=0: - if cvi_inlet[k] == 1: - ffac = 0.7 - pfac = 0.3 - elif cvi_inlet[k] == 0: ffac = 0.0 pfac = 1.0 + conc_merge[k, 26] = (fims[26, k]*ffac + (pcasp[idx, k]*0.3 + pcasp[idx + 1, k]*0.2)*pfac) + if fims[27, k] >=0: + if cvi_inlet[k] == 1: + ffac = 0.5 + pfac = 0.5 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 26] = (fims[26, k]*ffac + (pcasp[idx, k]*0.3 + pcasp[idx + 1, k]*0.2)*pfac) - if fims[27, k] >=0: - if cvi_inlet[k] == 1: - ffac = 0.5 - pfac = 0.5 - elif cvi_inlet[k] == 0: ffac = 0.0 pfac = 1.0 + conc_merge[k, 27] = (fims[27, k]*ffac + (pcasp[idx + 1, k]*0.65)*pfac) + if fims[28, k] >=0: + if cvi_inlet[k] == 1: + ffac = 0.3 + pfac = 0.7 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 27] = (fims[27, k]*ffac + (pcasp[idx + 1, k]*0.65)*pfac) - if fims[28, k] >=0: - if cvi_inlet[k] == 1: - ffac = 0.3 - pfac = 0.7 - elif cvi_inlet[k] == 0: ffac = 0.0 pfac = 1.0 + conc_merge[k, 28] = (fims[28, k]*ffac + (pcasp[idx + 1, k]*0.15 + pcasp[idx + 2, k]*0.5)*pfac) + if fims[29, k] >=0: + if cvi_inlet[k] == 1: + ffac = 0.2 + pfac = 0.8 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 28] = (fims[28, k]*ffac + (pcasp[idx + 1, k]*0.15 + pcasp[idx + 2, k]*0.5)*pfac) - if fims[29, k] >=0: - if cvi_inlet[k] == 1: - ffac = 0.2 - pfac = 0.8 - elif cvi_inlet[k] == 0: ffac = 0.0 pfac = 1.0 + conc_merge[k, 29] = (fims[29, k]*ffac + (pcasp[idx + 2, k]*0.4 + pcasp[idx + 3, k]*0.2)*pfac) + conc_merge[k, 30] = pcasp[idx + 3, k]*0.8 + if not all(pcasp[idx:idx + 4, k] >=0): + conc_merge[k, 25:30] = fims[25:30, k] + conc_merge[k, 30] = (conc_merge[k, 29] + opc[1, k]*1.4)/2.0 + # next merge OPC and PCASP, remove PCASP if the values is 10x larger than OPC + pcasp2 = pcasp[18, k]*0.5 + opc2 = opc[1, k]*1.4 # the first bin of OPC contains all small-size particles. not using opc[0, k] + if np.isnan(opc2): + conc_merge[k, 31] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 31] = opc2 else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 29] = (fims[29, k]*ffac + (pcasp[idx + 2, k]*0.4 + pcasp[idx + 3, k]*0.2)*pfac) - conc_merge[k, 30] = pcasp[idx + 3, k]*0.8 - if not all(pcasp[idx:idx + 4, k] >=0): - conc_merge[k, 25:30] = fims[25:30, k] - conc_merge[k, 30] = (conc_merge[k, 29] + opc[1, k]*1.4)/2.0 - # next merge OPC and PCASP, remove PCASP if the values is 10x larger than OPC - pcasp2 = pcasp[18, k]*0.5 - opc2 = opc[1, k]*1.4 # the first bin of OPC contains all small-size particles. not using opc[0, k] - if np.isnan(opc2): - conc_merge[k, 31] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 31] = opc2 - else: - conc_merge[k, 31] = (opc2 + pcasp2)/2.0 # assume equal weight - pcasp2 = pcasp[18, k]*0.5 + pcasp[19, k]*0.2 - opc2 = opc[2, k] + opc[3, k] - if np.isnan(opc2): - conc_merge[k, 32] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 32] = opc2 - else: - conc_merge[k, 32] = (opc2 + pcasp2)/2.0 # assume equal weight - pcasp2 = pcasp[19, k]*0.8 - opc2 = opc[4, k] + opc[5, k] - if np.isnan(opc2): - conc_merge[k, 33] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 33] = opc2 - else: - conc_merge[k, 33] = (opc2 + pcasp2)/2.0 # assume equal weight - pcasp2 = pcasp[20, k]*0.9 - opc2 = opc[6, k] + opc[7, k] - if np.isnan(opc2): - conc_merge[k, 34] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 34] = opc2 - else: - conc_merge[k, 34] = (opc2 + pcasp2)/2.0 # assume equal weight - pcasp2 = pcasp[20, k]*0.1 + pcasp[21, k] - opc2 = opc[8, k] + opc[9, k] - if np.isnan(opc2): - conc_merge[k, 35] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 35] = opc2 - else: - conc_merge[k, 35] = (opc2 + pcasp2)/2.0 # assume equal weight - pcasp2 = pcasp[22, k] + pcasp[23, k]*0.2 - opc2 = opc[10, k] + opc[11, k] - if np.isnan(opc2): - conc_merge[k, 36] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 36] = opc2 - else: - conc_merge[k, 36] = (opc2 + pcasp2)/2.0 # assume equal weight - pcasp2 = pcasp[23, k]*0.7 - opc2 = opc[12, k] - if np.isnan(opc2): - conc_merge[k, 37] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 37] = opc2 - else: - conc_merge[k, 37] = (opc2 + pcasp2)/2.0 # assume equal weight - pcasp2 = pcasp[23, k]*0.1 + pcasp[24, k]*0.7 - opc2 = opc[13, k] - if np.isnan(opc2): - conc_merge[k, 38] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 38] = opc2 - else: - conc_merge[k, 38] = (opc2 + pcasp2)/2.0 # assume equal weight - pcasp2 = pcasp[24, k]*0.3 + pcasp[25, k]*0.4 - opc2 = opc[14, k] - if np.isnan(opc2): - conc_merge[k, 39] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 39] = opc2 - else: - conc_merge[k, 39] = (opc2 + pcasp2)/2.0 # assume equal weight - pcasp2 = pcasp[25, k]*0.6 + pcasp[26, k]*0.3 - opc2 = opc[15, k] - if np.isnan(opc2): - conc_merge[k, 40] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 40] = opc2 - else: - conc_merge[k, 40] = opc2*0.6 + pcasp2*0.4 # gradually reduce the weight of PCASP - pcasp2 = pcasp[26, k]*0.7 + pcasp[27, k]*0.2 - opc2 = opc[16, k] - if np.isnan(opc2): - conc_merge[k, 41] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 41] = opc2 - else: - conc_merge[k, 41] = opc2*0.7 + pcasp2*0.3 # gradually reduce the weight of PCASP - pcasp2 = pcasp[27, k]*0.8 + pcasp[28, k]*0.2 - opc2 = opc[17, k] - if np.isnan(opc2): - conc_merge[k, 42] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 42] = opc2 - else: - conc_merge[k, 42] = opc2*0.8 + pcasp2*0.2 # gradually reduce the weight of PCASP - pcasp2 = pcasp[28, k]*0.8 + pcasp[29, k]*0.3 - opc2 = opc[18, k] - if np.isnan(opc2): - conc_merge[k, 43] = pcasp2 - elif pcasp2>10*opc2 or pcasp2<0: - conc_merge[k, 43] = opc2 - else: - conc_merge[k, 43] = opc2*0.9 + pcasp2*0.1 # gradually reduce the weight of PCASP - # using OPC for other bins - for n in range(44, nbin_merge): - conc_merge[k, n] = opc[n-25, k] + conc_merge[k, 31] = (opc2 + pcasp2)/2.0 # assume equal weight + pcasp2 = pcasp[18, k]*0.5 + pcasp[19, k]*0.2 + opc2 = opc[2, k] + opc[3, k] + if np.isnan(opc2): + conc_merge[k, 32] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 32] = opc2 + else: + conc_merge[k, 32] = (opc2 + pcasp2)/2.0 # assume equal weight + pcasp2 = pcasp[19, k]*0.8 + opc2 = opc[4, k] + opc[5, k] + if np.isnan(opc2): + conc_merge[k, 33] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 33] = opc2 + else: + conc_merge[k, 33] = (opc2 + pcasp2)/2.0 # assume equal weight + pcasp2 = pcasp[20, k]*0.9 + opc2 = opc[6, k] + opc[7, k] + if np.isnan(opc2): + conc_merge[k, 34] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 34] = opc2 + else: + conc_merge[k, 34] = (opc2 + pcasp2)/2.0 # assume equal weight + pcasp2 = pcasp[20, k]*0.1 + pcasp[21, k] + opc2 = opc[8, k] + opc[9, k] + if np.isnan(opc2): + conc_merge[k, 35] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 35] = opc2 + else: + conc_merge[k, 35] = (opc2 + pcasp2)/2.0 # assume equal weight + pcasp2 = pcasp[22, k] + pcasp[23, k]*0.2 + opc2 = opc[10, k] + opc[11, k] + if np.isnan(opc2): + conc_merge[k, 36] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 36] = opc2 + else: + conc_merge[k, 36] = (opc2 + pcasp2)/2.0 # assume equal weight + pcasp2 = pcasp[23, k]*0.7 + opc2 = opc[12, k] + if np.isnan(opc2): + conc_merge[k, 37] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 37] = opc2 + else: + conc_merge[k, 37] = (opc2 + pcasp2)/2.0 # assume equal weight + pcasp2 = pcasp[23, k]*0.1 + pcasp[24, k]*0.7 + opc2 = opc[13, k] + if np.isnan(opc2): + conc_merge[k, 38] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 38] = opc2 + else: + conc_merge[k, 38] = (opc2 + pcasp2)/2.0 # assume equal weight + pcasp2 = pcasp[24, k]*0.3 + pcasp[25, k]*0.4 + opc2 = opc[14, k] + if np.isnan(opc2): + conc_merge[k, 39] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 39] = opc2 + else: + conc_merge[k, 39] = (opc2 + pcasp2)/2.0 # assume equal weight + pcasp2 = pcasp[25, k]*0.6 + pcasp[26, k]*0.3 + opc2 = opc[15, k] + if np.isnan(opc2): + conc_merge[k, 40] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 40] = opc2 + else: + conc_merge[k, 40] = opc2*0.6 + pcasp2*0.4 # gradually reduce the weight of PCASP + pcasp2 = pcasp[26, k]*0.7 + pcasp[27, k]*0.2 + opc2 = opc[16, k] + if np.isnan(opc2): + conc_merge[k, 41] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 41] = opc2 + else: + conc_merge[k, 41] = opc2*0.7 + pcasp2*0.3 # gradually reduce the weight of PCASP + pcasp2 = pcasp[27, k]*0.8 + pcasp[28, k]*0.2 + opc2 = opc[17, k] + if np.isnan(opc2): + conc_merge[k, 42] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 42] = opc2 + else: + conc_merge[k, 42] = opc2*0.8 + pcasp2*0.2 # gradually reduce the weight of PCASP + pcasp2 = pcasp[28, k]*0.8 + pcasp[29, k]*0.3 + opc2 = opc[18, k] + if np.isnan(opc2): + conc_merge[k, 43] = pcasp2 + elif pcasp2>10*opc2 or pcasp2<0: + conc_merge[k, 43] = opc2 + else: + conc_merge[k, 43] = opc2*0.9 + pcasp2*0.1 # gradually reduce the weight of PCASP + # using OPC for other bins + for n in range(44, nbin_merge): + conc_merge[k, n] = opc[n-25, k] + + + #%% output data + if not os.path.exists(merged_size_path): + os.mkdir(merged_size_path) + outfile = merged_size_path + 'merged_bin_fims_pcasp_opc_ACEENA_' + date + '.nc' + # define filename + f = Dataset(outfile, 'w', format = 'NETCDF4') + + # define dimensions + t = f.createDimension('time', None) # unlimited + s = f.createDimension('size', nbin_merge) # unlimited + + # create variable list + time_o = f.createVariable("time", "f8", ("time", )) + size_o = f.createVariable("size", "f8", ("size", )) + sizeh_o = f.createVariable("size_high", "f8", ("size", )) + sizel_o = f.createVariable("size_low", "f8", ("size", )) + lon_o = f.createVariable("lon", 'f8', ("time", )) + lat_o = f.createVariable("lat", 'f8', ("time", )) + height_o = f.createVariable("height", 'f8', ("time", )) + cflag_o = f.createVariable('cld_flag', 'i8', ("time", )) + legnum_o = f.createVariable('leg_number', 'i8', ("time", )) + cvi_o = f.createVariable('CVI_inlet', 'i8', ("time", )) + cvim_o = f.createVariable('CVI_mode', 'i8', ("time", )) + df_o = f.createVariable('CVI_Dilution_Factor', 'f8', ("time", )) + ef_o = f.createVariable('CVI_Enhancement_Factor', 'f8', ("time", )) + merge_o = f.createVariable('size_distribution_merged', 'f8', ("time", "size")) + fims_o = f.createVariable('totalnum_fims', 'f8', ("time", )) + pcasp_o = f.createVariable('totalnum_pcasp', 'f8', ("time", )) + + # write data + time_o[:] = time + size_o[:] = d_merge + sizeh_o[:] = dia_merge_h + sizel_o[:] = dia_merge_l + lon_o[:] = lon + lat_o[:] = lat + height_o[:] = height + cflag_o[:] = cldflag + legnum_o[:] = legnum + cvi_o[:] = cvi_inlet + cvim_o[:] = np.array(cvimode) + dilution_factor[np.isnan(dilution_factor)] = -9999. + df_o[:] = dilution_factor + enhance_factor[np.isnan(enhance_factor)] = -9999. + ef_o[:] = enhance_factor + conc_merge[np.isnan(conc_merge)] = -9999. + conc_merge[conc_merge<0] = -9999. + merge_o[:, :] = conc_merge + fims_total[np.isnan(fims_total)] = -9999. + fims_total[fims_total<0] = -9999. + fims_o[:] = fims_total + pcasp_total[np.isnan(pcasp_total)] = -9999. + pcasp_total[pcasp_total<0] = -9999. + pcasp_o[:] = pcasp_total + + # attributes + time_o.units = "seconds since " + date[0:4] + '-' + date[4:6] + '-' + date[6:8] + " 00:00:00" + size_o.units = 'um' + size_o.long_name = 'center of size bin' + sizeh_o.units = 'um' + sizeh_o.long_name = 'upper bound of size bin' + sizel_o.units = 'um' + sizel_o.long_name = 'lower bound of size bin' + lon_o.units = 'degree east' + lon_o.long_name = 'Longitude' + lat_o.units = 'degree north' + lat_o.long_name = 'Latitude' + height_o.units = 'm MSL' + height_o.long_name = 'height' + cflag_o.units = 'N/A' + cflag_o.long_name = 'cloud flag' + cflag_o.description = '1-cloud; 0-no cloud' + legnum_o.units = 'N/A' + legnum_o.long_name = 'leg number' + cvi_o.units = 'N/A' + cvi_o.long_name = 'CVI inlet status' + cvi_o.description = '0-CVI inlet on; 1-Isokinetic inlet on' + cvim_o.units = 'N/A' + cvim_o.long_name = 'CVI mode flag' + cvim_o.description = '0: CVI mode; 1: under-kinetic; -1: transition' + df_o.units = 'N/A' + df_o.long_name = 'CVI Dilution Factor' + df_o.description = 'Dilution Factor after under-kinetic mode. Some measurements such as AMS, need to divide by this number' + ef_o.units = 'N/A' + ef_o.long_name = 'CVI Enhancement Factor' + ef_o.description = 'Enhancement Factor after CVI mode. Some measurements such as AMS, need to divide by this number' + merge_o.units = '#/cm3' + merge_o.long_name = 'merged size distribution' + fims_o.units = '#/cm3' + fims_o.long_name = 'total aerosol concentration from FIMS' + pcasp_o.units = '#/cm3' + pcasp_o.long_name = 'total aerosol concentration from PCASP' + + # global attributes + import time as ttt + f.description = "Merged size distribution from FIMS, PCASP and OPC" + f.create_time = ttt.ctime(ttt.time()) + + f.close() - #%% output data - if not os.path.exists(merged_size_path): - os.mkdir(merged_size_path) - outfile = merged_size_path + 'merged_bin_fims_pcasp_opc_ACEENA_' + date + '.nc' - # define filename - f = Dataset(outfile, 'w', format = 'NETCDF4') - - # define dimensions - t = f.createDimension('time', None) # unlimited - s = f.createDimension('size', nbin_merge) # unlimited - - # create variable list - time_o = f.createVariable("time", "f8", ("time", )) - size_o = f.createVariable("size", "f8", ("size", )) - sizeh_o = f.createVariable("size_high", "f8", ("size", )) - sizel_o = f.createVariable("size_low", "f8", ("size", )) - lon_o = f.createVariable("lon", 'f8', ("time", )) - lat_o = f.createVariable("lat", 'f8', ("time", )) - height_o = f.createVariable("height", 'f8', ("time", )) - cflag_o = f.createVariable('cld_flag', 'i8', ("time", )) - legnum_o = f.createVariable('leg_number', 'i8', ("time", )) - cvi_o = f.createVariable('CVI_inlet', 'i8', ("time", )) - cvim_o = f.createVariable('CVI_mode', 'i8', ("time", )) - df_o = f.createVariable('CVI_Dilution_Factor', 'f8', ("time", )) - ef_o = f.createVariable('CVI_Enhancement_Factor', 'f8', ("time", )) - merge_o = f.createVariable('size_distribution_merged', 'f8', ("time", "size")) - fims_o = f.createVariable('totalnum_fims', 'f8', ("time", )) - pcasp_o = f.createVariable('totalnum_pcasp', 'f8', ("time", )) - - # write data - time_o[:] = time - size_o[:] = d_merge - sizeh_o[:] = dia_merge_h - sizel_o[:] = dia_merge_l - lon_o[:] = lon - lat_o[:] = lat - height_o[:] = height - cflag_o[:] = cldflag - legnum_o[:] = legnum - cvi_o[:] = cvi_inlet - cvim_o[:] = np.array(cvimode) - dilution_factor[np.isnan(dilution_factor)] = -9999. - df_o[:] = dilution_factor - enhance_factor[np.isnan(enhance_factor)] = -9999. - ef_o[:] = enhance_factor - conc_merge[np.isnan(conc_merge)] = -9999. - conc_merge[conc_merge<0] = -9999. - merge_o[:, :] = conc_merge - fims_total[np.isnan(fims_total)] = -9999. - fims_total[fims_total<0] = -9999. - fims_o[:] = fims_total - pcasp_total[np.isnan(pcasp_total)] = -9999. - pcasp_total[pcasp_total<0] = -9999. - pcasp_o[:] = pcasp_total - - # attributes - time_o.units = "seconds since " + date[0:4] + '-' + date[4:6] + '-' + date[6:8] + " 00:00:00" - size_o.units = 'um' - size_o.long_name = 'center of size bin' - sizeh_o.units = 'um' - sizeh_o.long_name = 'upper bound of size bin' - sizel_o.units = 'um' - sizel_o.long_name = 'lower bound of size bin' - lon_o.units = 'degree east' - lon_o.long_name = 'Longitude' - lat_o.units = 'degree north' - lat_o.long_name = 'Latitude' - height_o.units = 'm MSL' - height_o.long_name = 'height' - cflag_o.units = 'N/A' - cflag_o.long_name = 'cloud flag' - cflag_o.description = '1-cloud; 0-no cloud' - legnum_o.units = 'N/A' - legnum_o.long_name = 'leg number' - cvi_o.units = 'N/A' - cvi_o.long_name = 'CVI inlet status' - cvi_o.description = '0-CVI inlet on; 1-Isokinetic inlet on' - cvim_o.units = 'N/A' - cvim_o.long_name = 'CVI mode flag' - cvim_o.description = '0: CVI mode; 1: under-kinetic; -1: transition' - df_o.units = 'N/A' - df_o.long_name = 'CVI Dilution Factor' - df_o.description = 'Dilution Factor after under-kinetic mode. Some measurements such as AMS, need to divide by this number' - ef_o.units = 'N/A' - ef_o.long_name = 'CVI Enhancement Factor' - ef_o.description = 'Enhancement Factor after CVI mode. Some measurements such as AMS, need to divide by this number' - merge_o.units = '#/cm3' - merge_o.long_name = 'merged size distribution' - fims_o.units = '#/cm3' - fims_o.long_name = 'total aerosol concentration from FIMS' - pcasp_o.units = '#/cm3' - pcasp_o.long_name = 'total aerosol concentration from PCASP' - - # global attributes - import time as ttt - f.description = "Merged size distribution from FIMS, PCASP and OPC" - f.create_time = ttt.ctime(ttt.time()) - - f.close() - - diff --git a/src/esmac_diags/preprocessing/prep_obs_mergesize_HISCALE.py b/src/esmac_diags/preprocessing/prep_obs_mergesize_HISCALE.py index 302986c..2cccdb1 100644 --- a/src/esmac_diags/preprocessing/prep_obs_mergesize_HISCALE.py +++ b/src/esmac_diags/preprocessing/prep_obs_mergesize_HISCALE.py @@ -4,389 +4,390 @@ # Shuaiqi Tang # 2020.10.1 """ -import sys -sys.path.insert(1, '../subroutines/') import os import glob import re import numpy as np -from read_aircraft import read_fims, read_fims_bin, read_iwg1, read_pcasp, read_cvi_hiscale as read_cvi -from time_format_change import hhmmss2sec +from ..subroutines.read_aircraft import read_fims, read_fims_bin, read_iwg1, read_pcasp, read_cvi_hiscale as read_cvi +from ..subroutines.time_format_change import hhmmss2sec from netCDF4 import Dataset -#%% set data paths +def run_prep(settings): + #%% variables from settings + iwgpath = settings['iwgpath'] + fimspath = settings['fimspath'] + pcasppath = settings['pcasppath'] + cvipath = settings['cvipath'] + merged_size_path = settings['merged_size_path'] -from settings import iwgpath, fimspath, pcasppath, cvipath, merged_size_path - -if not os.path.exists(merged_size_path): - os.makedirs(merged_size_path) + #%% other settings - -# %% find all data -# lst = glob.glob(iwgpath + 'aaf.iwg1001s.g1.hiscale.20160830*.a2.txt') -lst = glob.glob(iwgpath + '*.a2.txt') -lst.sort() - -# read in fims bin -(d_fims, dmin_f, dmax_f) = read_fims_bin(fimspath + 'HISCALE_FIMS_bins_R1.dat') -# change unit to um -d_fims = [x/1000 for x in d_fims] -dmin_f = [x/1000 for x in dmin_f] -dmax_f = [x/1000 for x in dmax_f] -dlnDp_f = np.empty(len(d_fims)) -for bb in range(len(d_fims)): - dlnDp_f[bb] = np.log(dmax_f[bb]/dmin_f[bb]) -dlnDp_f = np.mean(dlnDp_f) - -for filename in lst[:]: + if not os.path.exists(merged_size_path): + os.makedirs(merged_size_path) + - # get date - fname = re.split('hiscale.|.a2', filename) - date = fname[-2] - print(date) - if date[-1] == 'a': - flightidx = 1 - else: - flightidx = 2 + # %% find all data + # lst = glob.glob(iwgpath + 'aaf.iwg1001s.g1.hiscale.20160830*.a2.txt') + lst = glob.glob(iwgpath + '*.a2.txt') + lst.sort() - #%% read in data - # IWG - (iwg, iwgvars) = read_iwg1(filename) - timelen = len(iwg) - # get lat, lon, height, time - lon = np.empty(timelen) - lat = np.empty(timelen) - height = np.empty(timelen) - time = np.empty(timelen) - cldflag = np.empty(timelen) - legnum = np.empty(timelen) - T_amb = np.empty(timelen) - p_amb = np.empty(timelen) - for t in range(timelen): - lat[t] = float(iwg[t][2]) - lon[t] = float(iwg[t][3]) - height[t] = float(iwg[t][4]) - T_amb[t] = float(iwg[t][20]) - p_amb[t] = float(iwg[t][23]) - cldflag[t] = int(iwg[t][35]) - legnum[t] = int(iwg[t][-1]) - timestr = iwg[t][1].split(' ') - time[t] = hhmmss2sec(timestr[1]) - datestr = timestr[0] - - # FIMS - filename_f = glob.glob(fimspath + 'FIMS_G1_' + date[0:8] + '*' + str(flightidx) + '_HISCALE_001s.ict') - # read in data - if len(filename_f) == 1: - (data0, fimslist) = read_fims(filename_f[0]) - # remove some unrealistic data - fims2 = data0[1:-2, :] - data2 = data0[1:-2, :] - data2[np.isnan(data2)] = 1e8 - data2[:, data2[0, :] > 1e4] = 1e8 - data2[np.logical_or(data2 < 0, data2 > 1e4)] = np.nan - data0[1:-2, :] = data2 - time_fims = data0[0, :] - # change data from #/dlnDp to number - data2 = data0[1:-2, :]*dlnDp_f - fims = np.empty([30, len(time)]) - for ii in range(30): - fims[ii, :] = np.interp(time, time_fims, data2[ii, :]) - idx = np.logical_or(time > time_fims[-1], time < time_fims[0]) - fims[:, idx] = np.nan - elif len(filename_f) == 0: - time_fims = time - fims = np.nan*np.empty([len(d_fims), len(time)]) - else: - raise ValueError('find more than one file: ' + filename_f) - fims_total = np.nansum(fims, 0) - fims_total[fims_total <= 0] = np.nan - - # PCASP - filename_p = glob.glob(pcasppath + 'pcasp_g1_' + date[0:8] + '*' + str(flightidx) + '_hiscale001s.ict.txt') - if date[4:6] == '04' or date[4:6] == '05': - binlen = 27 - dmax_p = [130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, 400, 500, \ - 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800, 3000] - dmin_p = [120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, 400, 500, \ - 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800] - elif date[4:6] == '08' or date[4:6] == '09': - binlen = 30 - dmax_p = [100, 110, 120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, \ - 400, 500, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800, 3000] - dmin_p = [90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, \ - 400, 500, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800] - dmin_p = [x/1000 for x in dmin_p] - dmax_p = [x/1000 for x in dmax_p] - # read in data - if len(filename_p) == 1: - (data0, pcasplist) = read_pcasp(filename_p[0]) - pcasp2 = data0[1:-5, :] - time_pcasp = data0[0, :] - d_pcasp = [float(i) for i in pcasplist[1:-5]] - pcasp = data0[1:-5, :] - flag = data0[-2, :] - pcasp_total = data0[-5, :] - # remove some questionable data - # pcasp[np.isnan(pcasp)] = -9999 - # pcasp[np.logical_or(pcasp <= 0, pcasp > 1e6)] = np.nan - pcasp[:, flag != 0] = np.nan - pcasp[:, cldflag == 1] = np.nan - if not all(time_pcasp == time): - raise ValueError('PCASP time is inconsistent with FIMS') - elif len(filename_p) == 0: - time_pcasp = time - d_pcasp = [(dmin_p[x] + dmax_p[x])/2 for x in range(len(dmin_p))] - pcasp = np.nan*np.empty([len(d_pcasp), len(time)]) - else: - raise ValueError('find more than one file: ' + filename_p) - # !! PCASP data is for standard T and p (Conc = Conc_orig*[(1013.25/Pamb)*(Tamb/293.15)]), change to ambient T/p - pcasp2 = np.array(pcasp) - for tt in range(len(time)): - pcasp[:, tt] = pcasp[:, tt]/((1013.25/p_amb[tt])*((T_amb[tt] + 273.15)/293.15)) - + # read in fims bin + (d_fims, dmin_f, dmax_f) = read_fims_bin(fimspath + 'HISCALE_FIMS_bins_R1.dat') + # change unit to um + d_fims = [x/1000 for x in d_fims] + dmin_f = [x/1000 for x in dmin_f] + dmax_f = [x/1000 for x in dmax_f] + dlnDp_f = np.empty(len(d_fims)) + for bb in range(len(d_fims)): + dlnDp_f[bb] = np.log(dmax_f[bb]/dmin_f[bb]) + dlnDp_f = np.mean(dlnDp_f) + + for filename in lst[:]: - # CVI - filename_c = glob.glob(cvipath + 'CVI_G1_' + date[0:8] + '*R4_HISCALE_001s.ict.txt') - filename_c.sort() - # read in data - if len(filename_c) == 1 or len(filename_c) == 2: - (cvi, cvilist) = read_cvi(filename_c[flightidx-1]) - time_cvi = cvi[0, :] - cvi_inlet = cvi[-1, :] - enhance_factor = cvi[2, :] - enhance_factor[enhance_factor < -9000] = np.nan - dilution_factor = cvi[3, :] - dilution_factor[dilution_factor < -9000] = np.nan - cvi_mode = cvi[4, :] - cvi_qc = cvi[5, :] - if not all(time_cvi == time): - raise ValueError('CVI time is inconsistent with FIMS') - elif len(filename_c) == 0: - time_cvi = time - cvi_inlet = np.nan*np.empty([len(time)]) - cvi_mode = np.nan*np.empty([len(time)]) - dilution_factor = np.nan*np.empty([len(time)]) - enhance_factor = np.nan*np.empty([len(time)]) - cvi_qc = np.nan*np.empty([len(time)]) - else: - raise ValueError('find more than one file: ' + filename_c) - cvi_mode[cvi_qc != 0] = -9999 + # get date + fname = re.split('hiscale.|.a2', filename) + date = fname[-2] + print(date) + if date[-1] == 'a': + flightidx = 1 + else: + flightidx = 2 - #%% now merge fims and pcasp - timelen = len(time) - nbin_merge = 44 - nbin_fims = len(d_fims) - nbin_pcasp = len(d_pcasp) - # low and high range of each bin - dia_merge_l = np.empty(nbin_merge) - dia_merge_h = np.empty(nbin_merge) - for n in range(nbin_fims): - dia_merge_l[n] = dmin_f[n] - dia_merge_h[n] = dmax_f[n] - idx = dmax_p.index(0.5) - # use upper range (0.425) of FIMS as low bound and 0.5 of PCASP as high bound - dia_merge_l[nbin_fims] = dmax_f[-1] - dia_merge_h[nbin_fims] = dmax_p[idx] - for n in range(idx + 1, nbin_pcasp): - dia_merge_l[nbin_fims + n-idx] = dmin_p[n] - dia_merge_h[nbin_fims + n-idx] = dmax_p[n] - d_merge = (dia_merge_h + dia_merge_l)/2 + #%% read in data + # IWG + (iwg, iwgvars) = read_iwg1(filename) + timelen = len(iwg) + # get lat, lon, height, time + lon = np.empty(timelen) + lat = np.empty(timelen) + height = np.empty(timelen) + time = np.empty(timelen) + cldflag = np.empty(timelen) + legnum = np.empty(timelen) + T_amb = np.empty(timelen) + p_amb = np.empty(timelen) + for t in range(timelen): + lat[t] = float(iwg[t][2]) + lon[t] = float(iwg[t][3]) + height[t] = float(iwg[t][4]) + T_amb[t] = float(iwg[t][20]) + p_amb[t] = float(iwg[t][23]) + cldflag[t] = int(iwg[t][35]) + legnum[t] = int(iwg[t][-1]) + timestr = iwg[t][1].split(' ') + time[t] = hhmmss2sec(timestr[1]) + datestr = timestr[0] + + # FIMS + filename_f = glob.glob(fimspath + 'FIMS_G1_' + date[0:8] + '*' + str(flightidx) + '_HISCALE_001s.ict') + # read in data + if len(filename_f) == 1: + (data0, fimslist) = read_fims(filename_f[0]) + # remove some unrealistic data + data2 = data0[1:-2, :] + data2[np.isnan(data2)] = 1e8 + data2[:, data2[0, :] > 1e4] = 1e8 + data2[np.logical_or(data2 < 0, data2 > 1e4)] = np.nan + data0[1:-2, :] = data2 + time_fims = data0[0, :] + # change data from #/dlnDp to number + data2 = data0[1:-2, :]*dlnDp_f + fims = np.empty([30, len(time)]) + for ii in range(30): + fims[ii, :] = np.interp(time, time_fims, data2[ii, :]) + idx = np.logical_or(time > time_fims[-1], time < time_fims[0]) + fims[:, idx] = np.nan + elif len(filename_f) == 0: + time_fims = time + fims = np.nan*np.empty([len(d_fims), len(time)]) + else: + raise ValueError('find more than one file: ' + filename_f) + fims_total = np.nansum(fims, 0) + fims_total[fims_total <= 0] = np.nan - # merged concentration - conc_merge = np.empty([timelen, nbin_merge]) - fims[np.isnan(fims)] = -9999. # do not treat missing as NaN. treat -9999 - for k in range(timelen): - # use fims data up to d_fims[23] (~0.19 um) - for n in range(23 + 1): - if cvi_inlet[k] == 0: # in Jerome's code it is 0. looks like it should be 1 (CVI in cloud) - fims[n, k] = -9999 - conc_merge[k, n] = fims[n, k] - # overlapping bins - idx = dmin_p.index(0.2) # start merging size. corresponding to 10 in IOP2 - if fims[24, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.95 - pfac = 0.05 - elif cvi_inlet[k] == 0: + # PCASP + filename_p = glob.glob(pcasppath + 'pcasp_g1_' + date[0:8] + '*' + str(flightidx) + '_hiscale001s.ict.txt') + if date[4:6] == '04' or date[4:6] == '05': + binlen = 27 + dmax_p = [130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, 400, 500, \ + 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800, 3000] + dmin_p = [120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, 400, 500, \ + 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800] + elif date[4:6] == '08' or date[4:6] == '09': + binlen = 30 + dmax_p = [100, 110, 120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, \ + 400, 500, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800, 3000] + dmin_p = [90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, \ + 400, 500, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800] + dmin_p = [x/1000 for x in dmin_p] + dmax_p = [x/1000 for x in dmax_p] + # read in data + if len(filename_p) == 1: + (data0, pcasplist) = read_pcasp(filename_p[0]) + time_pcasp = data0[0, :] + d_pcasp = [float(i) for i in pcasplist[1:-5]] + pcasp = data0[1:-5, :] + flag = data0[-2, :] + pcasp_total = data0[-5, :] + # remove some questionable data + # pcasp[np.isnan(pcasp)] = -9999 + # pcasp[np.logical_or(pcasp <= 0, pcasp > 1e6)] = np.nan + pcasp[:, flag != 0] = np.nan + pcasp[:, cldflag == 1] = np.nan + if not all(time_pcasp == time): + raise ValueError('PCASP time is inconsistent with FIMS') + elif len(filename_p) == 0: + time_pcasp = time + d_pcasp = [(dmin_p[x] + dmax_p[x])/2 for x in range(len(dmin_p))] + pcasp = np.nan*np.empty([len(d_pcasp), len(time)]) + else: + raise ValueError('find more than one file: ' + filename_p) + # !! PCASP data is for standard T and p (Conc = Conc_orig*[(1013.25/Pamb)*(Tamb/293.15)]), change to ambient T/p + for tt in range(len(time)): + pcasp[:, tt] = pcasp[:, tt]/((1013.25/p_amb[tt])*((T_amb[tt] + 273.15)/293.15)) + + + # CVI + filename_c = glob.glob(cvipath + 'CVI_G1_' + date[0:8] + '*R4_HISCALE_001s.ict.txt') + filename_c.sort() + # read in data + if len(filename_c) == 1 or len(filename_c) == 2: + (cvi, cvilist) = read_cvi(filename_c[flightidx-1]) + time_cvi = cvi[0, :] + cvi_inlet = cvi[-1, :] + enhance_factor = cvi[2, :] + enhance_factor[enhance_factor < -9000] = np.nan + dilution_factor = cvi[3, :] + dilution_factor[dilution_factor < -9000] = np.nan + cvi_mode = cvi[4, :] + cvi_qc = cvi[5, :] + if not all(time_cvi == time): + raise ValueError('CVI time is inconsistent with FIMS') + elif len(filename_c) == 0: + time_cvi = time + cvi_inlet = np.nan*np.empty([len(time)]) + cvi_mode = np.nan*np.empty([len(time)]) + dilution_factor = np.nan*np.empty([len(time)]) + enhance_factor = np.nan*np.empty([len(time)]) + cvi_qc = np.nan*np.empty([len(time)]) + else: + raise ValueError('find more than one file: ' + filename_c) + cvi_mode[cvi_qc != 0] = -9999 + + #%% now merge fims and pcasp + timelen = len(time) + nbin_merge = 44 + nbin_fims = len(d_fims) + nbin_pcasp = len(d_pcasp) + # low and high range of each bin + dia_merge_l = np.empty(nbin_merge) + dia_merge_h = np.empty(nbin_merge) + for n in range(nbin_fims): + dia_merge_l[n] = dmin_f[n] + dia_merge_h[n] = dmax_f[n] + idx = dmax_p.index(0.5) + # use upper range (0.425) of FIMS as low bound and 0.5 of PCASP as high bound + dia_merge_l[nbin_fims] = dmax_f[-1] + dia_merge_h[nbin_fims] = dmax_p[idx] + for n in range(idx + 1, nbin_pcasp): + dia_merge_l[nbin_fims + n-idx] = dmin_p[n] + dia_merge_h[nbin_fims + n-idx] = dmax_p[n] + d_merge = (dia_merge_h + dia_merge_l)/2 + + # merged concentration + conc_merge = np.empty([timelen, nbin_merge]) + fims[np.isnan(fims)] = -9999. # do not treat missing as NaN. treat -9999 + for k in range(timelen): + # use fims data up to d_fims[23] (~0.19 um) + for n in range(23 + 1): + if cvi_inlet[k] == 0: # in Jerome's code it is 0. looks like it should be 1 (CVI in cloud) + fims[n, k] = -9999 + conc_merge[k, n] = fims[n, k] + # overlapping bins + idx = dmin_p.index(0.2) # start merging size. corresponding to 10 in IOP2 + if fims[24, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.95 + pfac = 0.05 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') + else: ffac = 0.0 pfac = 1.0 + conc_merge[k, 24] = (fims[24, k]*ffac + (pcasp[idx, k]*1.0 + pcasp[idx + 1, k]*0.25)*pfac) + if fims[25, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.8 + pfac = 0.2 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 24] = (fims[24, k]*ffac + (pcasp[idx, k]*1.0 + pcasp[idx + 1, k]*0.25)*pfac) - if fims[25, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.8 - pfac = 0.2 - elif cvi_inlet[k] == 0: ffac = 0.0 pfac = 1.0 + conc_merge[k, 25] = (fims[25, k]*ffac + (pcasp[idx + 1, k]*0.75 + pcasp[idx + 2, k]*0.8)*pfac) + if fims[26, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.65 + pfac = 0.35 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 25] = (fims[25, k]*ffac + (pcasp[idx + 1, k]*0.75 + pcasp[idx + 2, k]*0.8)*pfac) - if fims[26, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.65 - pfac = 0.35 - elif cvi_inlet[k] == 0: ffac = 0.0 pfac = 1.0 + conc_merge[k, 26] = (fims[26, k]*ffac + (pcasp[idx + 2, k]*0.2 + pcasp[idx + 3, k]*1.0 + pcasp[idx + 4, k]*0.5)*pfac) + if fims[27, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.35 + pfac = 0.65 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 26] = (fims[26, k]*ffac + (pcasp[idx + 2, k]*0.2 + pcasp[idx + 3, k]*1.0 + pcasp[idx + 4, k]*0.5)*pfac) - if fims[27, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.35 - pfac = 0.65 - elif cvi_inlet[k] == 0: ffac = 0.0 pfac = 1.0 + conc_merge[k, 27] = (fims[27, k]*ffac + (pcasp[idx + 4, k]*0.5 + pcasp[idx + 5, k]*0.25)*pfac) + if fims[28, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.2 + pfac = 0.8 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 27] = (fims[27, k]*ffac + (pcasp[idx + 4, k]*0.5 + pcasp[idx + 5, k]*0.25)*pfac) - if fims[28, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.2 - pfac = 0.8 - elif cvi_inlet[k] == 0: ffac = 0.0 pfac = 1.0 + conc_merge[k, 28] = (fims[28, k]*ffac + (pcasp[idx + 5, k]*0.5)*pfac) + if fims[29, k] > 0: + if cvi_inlet[k] == 1: + ffac = 0.05 + pfac = 0.95 + elif cvi_inlet[k] == 0: + ffac = 0.0 + pfac = 1.0 + else: + raise ValueError('cvi_inlet value is neither 0 nor 1') else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 28] = (fims[28, k]*ffac + (pcasp[idx + 5, k]*0.5)*pfac) - if fims[29, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.05 - pfac = 0.95 - elif cvi_inlet[k] == 0: ffac = 0.0 pfac = 1.0 - else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 29] = (fims[29, k]*ffac + (pcasp[idx + 5, k]*0.25 + pcasp[idx + 6, k]*0.25)*pfac) - conc_merge[k, 30] = pcasp[idx + 6, k]*0.75 - # using PCASP for upper bins - nn = 31 - for n in range(idx + 7, nbin_pcasp): - conc_merge[k, nn] = pcasp[n, k] - nn = nn + 1 + conc_merge[k, 29] = (fims[29, k]*ffac + (pcasp[idx + 5, k]*0.25 + pcasp[idx + 6, k]*0.25)*pfac) + conc_merge[k, 30] = pcasp[idx + 6, k]*0.75 + # using PCASP for upper bins + nn = 31 + for n in range(idx + 7, nbin_pcasp): + conc_merge[k, nn] = pcasp[n, k] + nn = nn + 1 + + #%% output data + if not os.path.exists(merged_size_path): + os.mkdir(merged_size_path) + outfile = merged_size_path + 'merged_bin_fims_pcasp_HISCALE_' + date + '.nc' + # define filename + f = Dataset(outfile, 'w', format = 'NETCDF4') + + # define dimensions + t = f.createDimension('time', None) # unlimited + s = f.createDimension('size', nbin_merge) # unlimited + + # create variable list + time_o = f.createVariable("time", "f8", ("time", )) + size_o = f.createVariable("size", "f8", ("size", )) + sizeh_o = f.createVariable("size_high", "f8", ("size", )) + sizel_o = f.createVariable("size_low", "f8", ("size", )) + lon_o = f.createVariable("lon", 'f8', ("time", )) + lat_o = f.createVariable("lat", 'f8', ("time", )) + height_o = f.createVariable("height", 'f8', ("time", )) + cflag_o = f.createVariable('cld_flag', 'i8', ("time", )) + legnum_o = f.createVariable('leg_number', 'i8', ("time", )) + cvi_o = f.createVariable('CVI_inlet', 'i8', ("time", )) + cvim_o = f.createVariable('CVI_mode', 'i8', ("time", )) + df_o = f.createVariable('CVI_Dilution_Factor', 'f8', ("time", )) + ef_o = f.createVariable('CVI_Enhancement_Factor', 'f8', ("time", )) + merge_o = f.createVariable('size_distribution_merged', 'f8', ("time", "size")) + fims_o = f.createVariable('totalnum_fims', 'f8', ("time", )) + pcasp_o = f.createVariable('totalnum_pcasp', 'f8', ("time", )) + + # write data + time_o[:] = time + size_o[:] = d_merge + sizeh_o[:] = dia_merge_h + sizel_o[:] = dia_merge_l + lon_o[:] = lon + lat_o[:] = lat + height_o[:] = height + cflag_o[:] = cldflag + legnum_o[:] = legnum + cvi_o[:] = cvi_inlet + cvim_o[:] = np.array(cvi_mode) + dilution_factor[np.isnan(dilution_factor)] = -9999. + df_o[:] = dilution_factor + enhance_factor[np.isnan(enhance_factor)] = -9999. + ef_o[:] = enhance_factor + conc_merge[np.isnan(conc_merge)] = -9999. + conc_merge[conc_merge < 0] = -9999. + merge_o[:, :] = conc_merge + fims_total[np.isnan(fims_total)] = -9999. + fims_total[fims_total < 0] = -9999. + fims_o[:] = fims_total + pcasp_total[np.isnan(pcasp_total)] = -9999. + pcasp_total[pcasp_total < 0] = -9999. + pcasp_o[:] = pcasp_total + + # attributes + time_o.units = "seconds since " + date[0:4] + '-' + date[4:6] + '-' + date[6:8] + " 00:00:00" + size_o.units = 'um' + size_o.long_name = 'center of size bin' + sizeh_o.units = 'um' + sizeh_o.long_name = 'upper bound of size bin' + sizel_o.units = 'um' + sizel_o.long_name = 'lower bound of size bin' + lon_o.units = 'degree east' + lon_o.long_name = 'Longitude' + lat_o.units = 'degree north' + lat_o.long_name = 'Latitude' + height_o.units = 'm MSL' + height_o.long_name = 'height' + cflag_o.units = 'N/A' + cflag_o.long_name = 'cloud flag' + cflag_o.description = '1-cloud; 0-no cloud' + legnum_o.units = 'N/A' + legnum_o.long_name = 'leg number' + cvi_o.units = 'N/A' + cvi_o.long_name = 'CVI inlet status' + cvi_o.description = '0-CVI inlet on; 1-Isokinetic inlet on' + cvim_o.units = 'N/A' + cvim_o.long_name = 'CVI mode flag' + cvim_o.description = '0: CVI mode; 1: under-kinetic; -1: transition' + df_o.units = 'N/A' + df_o.long_name = 'CVI Dilution Factor' + df_o.description = 'Dilution Factor after under-kinetic mode. Some measurements such as AMS, need to divide by this number' + ef_o.units = 'N/A' + ef_o.long_name = 'CVI Enhancement Factor' + ef_o.description = 'Enhancement Factor after CVI mode. Some measurements such as AMS, need to divide by this number' + merge_o.units = '#/cm3' + merge_o.long_name = 'merged size distribution' + fims_o.units = '#/cm3' + fims_o.long_name = 'total aerosol concentration from FIMS' + pcasp_o.units = '#/cm3' + pcasp_o.long_name = 'total aerosol concentration from PCASP' + + # global attributes + import time as ttt + f.description = "Merged size distribution from FIMS and PCASP" + f.create_time = ttt.ctime(ttt.time()) + + f.close() - #%% output data - if not os.path.exists(merged_size_path): - os.mkdir(merged_size_path) - outfile = merged_size_path + 'merged_bin_fims_pcasp_HISCALE_' + date + '.nc' - # define filename - f = Dataset(outfile, 'w', format = 'NETCDF4') - - # define dimensions - t = f.createDimension('time', None) # unlimited - s = f.createDimension('size', nbin_merge) # unlimited - - # create variable list - time_o = f.createVariable("time", "f8", ("time", )) - size_o = f.createVariable("size", "f8", ("size", )) - sizeh_o = f.createVariable("size_high", "f8", ("size", )) - sizel_o = f.createVariable("size_low", "f8", ("size", )) - lon_o = f.createVariable("lon", 'f8', ("time", )) - lat_o = f.createVariable("lat", 'f8', ("time", )) - height_o = f.createVariable("height", 'f8', ("time", )) - cflag_o = f.createVariable('cld_flag', 'i8', ("time", )) - legnum_o = f.createVariable('leg_number', 'i8', ("time", )) - cvi_o = f.createVariable('CVI_inlet', 'i8', ("time", )) - cvim_o = f.createVariable('CVI_mode', 'i8', ("time", )) - df_o = f.createVariable('CVI_Dilution_Factor', 'f8', ("time", )) - ef_o = f.createVariable('CVI_Enhancement_Factor', 'f8', ("time", )) - merge_o = f.createVariable('size_distribution_merged', 'f8', ("time", "size")) - fims_o = f.createVariable('totalnum_fims', 'f8', ("time", )) - pcasp_o = f.createVariable('totalnum_pcasp', 'f8', ("time", )) - - # write data - time_o[:] = time - size_o[:] = d_merge - sizeh_o[:] = dia_merge_h - sizel_o[:] = dia_merge_l - lon_o[:] = lon - lat_o[:] = lat - height_o[:] = height - cflag_o[:] = cldflag - legnum_o[:] = legnum - cvi_o[:] = cvi_inlet - cvim_o[:] = np.array(cvi_mode) - dilution_factor[np.isnan(dilution_factor)] = -9999. - df_o[:] = dilution_factor - enhance_factor[np.isnan(enhance_factor)] = -9999. - ef_o[:] = enhance_factor - conc_merge[np.isnan(conc_merge)] = -9999. - conc_merge[conc_merge < 0] = -9999. - merge_o[:, :] = conc_merge - fims_total[np.isnan(fims_total)] = -9999. - fims_total[fims_total < 0] = -9999. - fims_o[:] = fims_total - pcasp_total[np.isnan(pcasp_total)] = -9999. - pcasp_total[pcasp_total < 0] = -9999. - pcasp_o[:] = pcasp_total - - # attributes - time_o.units = "seconds since " + date[0:4] + '-' + date[4:6] + '-' + date[6:8] + " 00:00:00" - size_o.units = 'um' - size_o.long_name = 'center of size bin' - sizeh_o.units = 'um' - sizeh_o.long_name = 'upper bound of size bin' - sizel_o.units = 'um' - sizel_o.long_name = 'lower bound of size bin' - lon_o.units = 'degree east' - lon_o.long_name = 'Longitude' - lat_o.units = 'degree north' - lat_o.long_name = 'Latitude' - height_o.units = 'm MSL' - height_o.long_name = 'height' - cflag_o.units = 'N/A' - cflag_o.long_name = 'cloud flag' - cflag_o.description = '1-cloud; 0-no cloud' - legnum_o.units = 'N/A' - legnum_o.long_name = 'leg number' - cvi_o.units = 'N/A' - cvi_o.long_name = 'CVI inlet status' - cvi_o.description = '0-CVI inlet on; 1-Isokinetic inlet on' - cvim_o.units = 'N/A' - cvim_o.long_name = 'CVI mode flag' - cvim_o.description = '0: CVI mode; 1: under-kinetic; -1: transition' - df_o.units = 'N/A' - df_o.long_name = 'CVI Dilution Factor' - df_o.description = 'Dilution Factor after under-kinetic mode. Some measurements such as AMS, need to divide by this number' - ef_o.units = 'N/A' - ef_o.long_name = 'CVI Enhancement Factor' - ef_o.description = 'Enhancement Factor after CVI mode. Some measurements such as AMS, need to divide by this number' - merge_o.units = '#/cm3' - merge_o.long_name = 'merged size distribution' - fims_o.units = '#/cm3' - fims_o.long_name = 'total aerosol concentration from FIMS' - pcasp_o.units = '#/cm3' - pcasp_o.long_name = 'total aerosol concentration from PCASP' - - # global attributes - import time as ttt - f.description = "Merged size distribution from FIMS and PCASP" - f.create_time = ttt.ctime(ttt.time()) - - f.close() - diff --git a/src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py b/src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py deleted file mode 100644 index 86341b3..0000000 --- a/src/esmac_diags/preprocessing/prep_obs_mergesize_HiScale.py +++ /dev/null @@ -1,391 +0,0 @@ -""" -# merge size distribution from FIMS and PCASP for Hi-Scale -# revised from size_bin_merge.pro by Jerome Fast -# Shuaiqi Tang -# 2020.10.1 -""" -import sys - -import os -import glob -import re -import numpy as np -from ..subroutines.read_aircraft import read_fims, read_fims_bin, read_iwg1, read_pcasp, read_cvi_hiscale as read_cvi -from ..subroutines.time_format_change import hhmmss2sec -from netCDF4 import Dataset - -#%% set data paths - -from settings import iwgpath, fimspath, pcasppath, cvipath, merged_size_path - -if not os.path.exists(merged_size_path): - os.makedirs(merged_size_path) - - -# %% find all data -# lst = glob.glob(iwgpath + 'aaf.iwg1001s.g1.hiscale.20160830*.a2.txt') -lst = glob.glob(iwgpath + '*.a2.txt') -lst.sort() - -# read in fims bin -(d_fims, dmin_f, dmax_f) = read_fims_bin(fimspath + 'HISCALE_FIMS_bins_R1.dat') -# change unit to um -d_fims = [x/1000 for x in d_fims] -dmin_f = [x/1000 for x in dmin_f] -dmax_f = [x/1000 for x in dmax_f] -dlnDp_f = np.empty(len(d_fims)) -for bb in range(len(d_fims)): - dlnDp_f[bb] = np.log(dmax_f[bb]/dmin_f[bb]) -dlnDp_f = np.mean(dlnDp_f) - -for filename in lst[:]: - - # get date - fname = re.split('hiscale.|.a2', filename) - date = fname[-2] - print(date) - if date[-1] == 'a': - flightidx = 1 - else: - flightidx = 2 - - #%% read in data - # IWG - (iwg, iwgvars) = read_iwg1(filename) - timelen = len(iwg) - # get lat, lon, height, time - lon = np.empty(timelen) - lat = np.empty(timelen) - height = np.empty(timelen) - time = np.empty(timelen) - cldflag = np.empty(timelen) - legnum = np.empty(timelen) - T_amb = np.empty(timelen) - p_amb = np.empty(timelen) - for t in range(timelen): - lat[t] = float(iwg[t][2]) - lon[t] = float(iwg[t][3]) - height[t] = float(iwg[t][4]) - T_amb[t] = float(iwg[t][20]) - p_amb[t] = float(iwg[t][23]) - cldflag[t] = int(iwg[t][35]) - legnum[t] = int(iwg[t][-1]) - timestr = iwg[t][1].split(' ') - time[t] = hhmmss2sec(timestr[1]) - datestr = timestr[0] - - # FIMS - filename_f = glob.glob(fimspath + 'FIMS_G1_' + date[0:8] + '*' + str(flightidx) + '_HISCALE_001s.ict') - # read in data - if len(filename_f) == 1: - (data0, fimslist) = read_fims(filename_f[0]) - # remove some unrealistic data - fims2 = data0[1:-2, :] - data2 = data0[1:-2, :] - data2[np.isnan(data2)] = 1e8 - data2[:, data2[0, :] > 1e4] = 1e8 - data2[np.logical_or(data2 < 0, data2 > 1e4)] = np.nan - data0[1:-2, :] = data2 - time_fims = data0[0, :] - # change data from #/dlnDp to number - data2 = data0[1:-2, :]*dlnDp_f - fims = np.empty([30, len(time)]) - for ii in range(30): - fims[ii, :] = np.interp(time, time_fims, data2[ii, :]) - idx = np.logical_or(time > time_fims[-1], time < time_fims[0]) - fims[:, idx] = np.nan - elif len(filename_f) == 0: - time_fims = time - fims = np.nan*np.empty([len(d_fims), len(time)]) - else: - raise ValueError('find more than one file: ' + filename_f) - fims_total = np.nansum(fims, 0) - fims_total[fims_total <= 0] = np.nan - - # PCASP - filename_p = glob.glob(pcasppath + 'pcasp_g1_' + date[0:8] + '*' + str(flightidx) + '_hiscale001s.ict.txt') - if date[4:6] == '04' or date[4:6] == '05': - binlen = 27 - dmax_p = [130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, 400, 500, \ - 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800, 3000] - dmin_p = [120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, 400, 500, \ - 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800] - elif date[4:6] == '08' or date[4:6] == '09': - binlen = 30 - dmax_p = [100, 110, 120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, \ - 400, 500, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800, 3000] - dmin_p = [90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 200, 220, 240, 260, 280, 300, \ - 400, 500, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2800] - dmin_p = [x/1000 for x in dmin_p] - dmax_p = [x/1000 for x in dmax_p] - # read in data - if len(filename_p) == 1: - (data0, pcasplist) = read_pcasp(filename_p[0]) - pcasp2 = data0[1:-5, :] - time_pcasp = data0[0, :] - d_pcasp = [float(i) for i in pcasplist[1:-5]] - pcasp = data0[1:-5, :] - flag = data0[-2, :] - pcasp_total = data0[-5, :] - # remove some questionable data - # pcasp[np.isnan(pcasp)] = -9999 - # pcasp[np.logical_or(pcasp <= 0, pcasp > 1e6)] = np.nan - pcasp[:, flag != 0] = np.nan - pcasp[:, cldflag == 1] = np.nan - if not all(time_pcasp == time): - raise ValueError('PCASP time is inconsistent with FIMS') - elif len(filename_p) == 0: - time_pcasp = time - d_pcasp = [(dmin_p[x] + dmax_p[x])/2 for x in range(len(dmin_p))] - pcasp = np.nan*np.empty([len(d_pcasp), len(time)]) - else: - raise ValueError('find more than one file: ' + filename_p) - # !! PCASP data is for standard T and p (Conc = Conc_orig*[(1013.25/Pamb)*(Tamb/293.15)]), change to ambient T/p - pcasp2 = np.array(pcasp) - for tt in range(len(time)): - pcasp[:, tt] = pcasp[:, tt]/((1013.25/p_amb[tt])*((T_amb[tt] + 273.15)/293.15)) - - - # CVI - filename_c = glob.glob(cvipath + 'CVI_G1_' + date[0:8] + '*R4_HISCALE_001s.ict.txt') - filename_c.sort() - # read in data - if len(filename_c) == 1 or len(filename_c) == 2: - (cvi, cvilist) = read_cvi(filename_c[flightidx-1]) - time_cvi = cvi[0, :] - cvi_inlet = cvi[-1, :] - enhance_factor = cvi[2, :] - enhance_factor[enhance_factor < -9000] = np.nan - dilution_factor = cvi[3, :] - dilution_factor[dilution_factor < -9000] = np.nan - cvi_mode = cvi[4, :] - cvi_qc = cvi[5, :] - if not all(time_cvi == time): - raise ValueError('CVI time is inconsistent with FIMS') - elif len(filename_c) == 0: - time_cvi = time - cvi_inlet = np.nan*np.empty([len(time)]) - cvi_mode = np.nan*np.empty([len(time)]) - dilution_factor = np.nan*np.empty([len(time)]) - enhance_factor = np.nan*np.empty([len(time)]) - cvi_qc = np.nan*np.empty([len(time)]) - else: - raise ValueError('find more than one file: ' + filename_c) - cvi_mode[cvi_qc != 0] = -9999 - - #%% now merge fims and pcasp - timelen = len(time) - nbin_merge = 44 - nbin_fims = len(d_fims) - nbin_pcasp = len(d_pcasp) - # low and high range of each bin - dia_merge_l = np.empty(nbin_merge) - dia_merge_h = np.empty(nbin_merge) - for n in range(nbin_fims): - dia_merge_l[n] = dmin_f[n] - dia_merge_h[n] = dmax_f[n] - idx = dmax_p.index(0.5) - # use upper range (0.425) of FIMS as low bound and 0.5 of PCASP as high bound - dia_merge_l[nbin_fims] = dmax_f[-1] - dia_merge_h[nbin_fims] = dmax_p[idx] - for n in range(idx + 1, nbin_pcasp): - dia_merge_l[nbin_fims + n-idx] = dmin_p[n] - dia_merge_h[nbin_fims + n-idx] = dmax_p[n] - d_merge = (dia_merge_h + dia_merge_l)/2 - - # merged concentration - conc_merge = np.empty([timelen, nbin_merge]) - fims[np.isnan(fims)] = -9999. # do not treat missing as NaN. treat -9999 - for k in range(timelen): - # use fims data up to d_fims[23] (~0.19 um) - for n in range(23 + 1): - if cvi_inlet[k] == 0: # in Jerome's code it is 0. looks like it should be 1 (CVI in cloud) - fims[n, k] = -9999 - conc_merge[k, n] = fims[n, k] - # overlapping bins - idx = dmin_p.index(0.2) # start merging size. corresponding to 10 in IOP2 - if fims[24, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.95 - pfac = 0.05 - elif cvi_inlet[k] == 0: - ffac = 0.0 - pfac = 1.0 - else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 24] = (fims[24, k]*ffac + (pcasp[idx, k]*1.0 + pcasp[idx + 1, k]*0.25)*pfac) - if fims[25, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.8 - pfac = 0.2 - elif cvi_inlet[k] == 0: - ffac = 0.0 - pfac = 1.0 - else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 25] = (fims[25, k]*ffac + (pcasp[idx + 1, k]*0.75 + pcasp[idx + 2, k]*0.8)*pfac) - if fims[26, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.65 - pfac = 0.35 - elif cvi_inlet[k] == 0: - ffac = 0.0 - pfac = 1.0 - else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 26] = (fims[26, k]*ffac + (pcasp[idx + 2, k]*0.2 + pcasp[idx + 3, k]*1.0 + pcasp[idx + 4, k]*0.5)*pfac) - if fims[27, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.35 - pfac = 0.65 - elif cvi_inlet[k] == 0: - ffac = 0.0 - pfac = 1.0 - else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 27] = (fims[27, k]*ffac + (pcasp[idx + 4, k]*0.5 + pcasp[idx + 5, k]*0.25)*pfac) - if fims[28, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.2 - pfac = 0.8 - elif cvi_inlet[k] == 0: - ffac = 0.0 - pfac = 1.0 - else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 28] = (fims[28, k]*ffac + (pcasp[idx + 5, k]*0.5)*pfac) - if fims[29, k] > 0: - if cvi_inlet[k] == 1: - ffac = 0.05 - pfac = 0.95 - elif cvi_inlet[k] == 0: - ffac = 0.0 - pfac = 1.0 - else: - raise ValueError('cvi_inlet value is neither 0 nor 1') - else: - ffac = 0.0 - pfac = 1.0 - conc_merge[k, 29] = (fims[29, k]*ffac + (pcasp[idx + 5, k]*0.25 + pcasp[idx + 6, k]*0.25)*pfac) - conc_merge[k, 30] = pcasp[idx + 6, k]*0.75 - # using PCASP for upper bins - nn = 31 - for n in range(idx + 7, nbin_pcasp): - conc_merge[k, nn] = pcasp[n, k] - nn = nn + 1 - - #%% output data - if not os.path.exists(merged_size_path): - os.mkdir(merged_size_path) - outfile = merged_size_path + 'merged_bin_fims_pcasp_HISCALE_' + date + '.nc' - # define filename - f = Dataset(outfile, 'w', format = 'NETCDF4') - - # define dimensions - t = f.createDimension('time', None) # unlimited - s = f.createDimension('size', nbin_merge) # unlimited - - # create variable list - time_o = f.createVariable("time", "f8", ("time", )) - size_o = f.createVariable("size", "f8", ("size", )) - sizeh_o = f.createVariable("size_high", "f8", ("size", )) - sizel_o = f.createVariable("size_low", "f8", ("size", )) - lon_o = f.createVariable("lon", 'f8', ("time", )) - lat_o = f.createVariable("lat", 'f8', ("time", )) - height_o = f.createVariable("height", 'f8', ("time", )) - cflag_o = f.createVariable('cld_flag', 'i8', ("time", )) - legnum_o = f.createVariable('leg_number', 'i8', ("time", )) - cvi_o = f.createVariable('CVI_inlet', 'i8', ("time", )) - cvim_o = f.createVariable('CVI_mode', 'i8', ("time", )) - df_o = f.createVariable('CVI_Dilution_Factor', 'f8', ("time", )) - ef_o = f.createVariable('CVI_Enhancement_Factor', 'f8', ("time", )) - merge_o = f.createVariable('size_distribution_merged', 'f8', ("time", "size")) - fims_o = f.createVariable('totalnum_fims', 'f8', ("time", )) - pcasp_o = f.createVariable('totalnum_pcasp', 'f8', ("time", )) - - # write data - time_o[:] = time - size_o[:] = d_merge - sizeh_o[:] = dia_merge_h - sizel_o[:] = dia_merge_l - lon_o[:] = lon - lat_o[:] = lat - height_o[:] = height - cflag_o[:] = cldflag - legnum_o[:] = legnum - cvi_o[:] = cvi_inlet - cvim_o[:] = np.array(cvi_mode) - dilution_factor[np.isnan(dilution_factor)] = -9999. - df_o[:] = dilution_factor - enhance_factor[np.isnan(enhance_factor)] = -9999. - ef_o[:] = enhance_factor - conc_merge[np.isnan(conc_merge)] = -9999. - conc_merge[conc_merge < 0] = -9999. - merge_o[:, :] = conc_merge - fims_total[np.isnan(fims_total)] = -9999. - fims_total[fims_total < 0] = -9999. - fims_o[:] = fims_total - pcasp_total[np.isnan(pcasp_total)] = -9999. - pcasp_total[pcasp_total < 0] = -9999. - pcasp_o[:] = pcasp_total - - # attributes - time_o.units = "seconds since " + date[0:4] + '-' + date[4:6] + '-' + date[6:8] + " 00:00:00" - size_o.units = 'um' - size_o.long_name = 'center of size bin' - sizeh_o.units = 'um' - sizeh_o.long_name = 'upper bound of size bin' - sizel_o.units = 'um' - sizel_o.long_name = 'lower bound of size bin' - lon_o.units = 'degree east' - lon_o.long_name = 'Longitude' - lat_o.units = 'degree north' - lat_o.long_name = 'Latitude' - height_o.units = 'm MSL' - height_o.long_name = 'height' - cflag_o.units = 'N/A' - cflag_o.long_name = 'cloud flag' - cflag_o.description = '1-cloud; 0-no cloud' - legnum_o.units = 'N/A' - legnum_o.long_name = 'leg number' - cvi_o.units = 'N/A' - cvi_o.long_name = 'CVI inlet status' - cvi_o.description = '0-CVI inlet on; 1-Isokinetic inlet on' - cvim_o.units = 'N/A' - cvim_o.long_name = 'CVI mode flag' - cvim_o.description = '0: CVI mode; 1: under-kinetic; -1: transition' - df_o.units = 'N/A' - df_o.long_name = 'CVI Dilution Factor' - df_o.description = 'Dilution Factor after under-kinetic mode. Some measurements such as AMS, need to divide by this number' - ef_o.units = 'N/A' - ef_o.long_name = 'CVI Enhancement Factor' - ef_o.description = 'Enhancement Factor after CVI mode. Some measurements such as AMS, need to divide by this number' - merge_o.units = '#/cm3' - merge_o.long_name = 'merged size distribution' - fims_o.units = '#/cm3' - fims_o.long_name = 'total aerosol concentration from FIMS' - pcasp_o.units = '#/cm3' - pcasp_o.long_name = 'total aerosol concentration from PCASP' - - # global attributes - import time as ttt - f.description = "Merged size distribution from FIMS and PCASP" - f.create_time = ttt.ctime(ttt.time()) - - f.close() - diff --git a/src/esmac_diags/preprocessing/settings.py b/src/esmac_diags/preprocessing/settings.py deleted file mode 100644 index e4f7929..0000000 --- a/src/esmac_diags/preprocessing/settings.py +++ /dev/null @@ -1,236 +0,0 @@ -# settings of the aerosol diagnostic package - -import numpy as np - -#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -# global settings - -############ these settings will be replaced by the settings in scripts_*.csh ############# -# set field campaign name. More settings on specific field campaigns are in next section -campaign = 'HISCALE' -# set model names. up to three -Model_List = ['EAMv1_CONUS_RRM'] -# set line colors for each model. corresponding to the Model_List -color_model = ['b','g'] -# set IOP that the statistics, pdf and percentiles are averaged for. Only available for HISCALE and ACEENA -# IOP1/IOP2 -IOP = 'IOP2' -############ these settings will be replaced by the settings in scripts_*.csh ############# - - -# path of the diagnostic package -package_path = '../../' - -# path of E3SM model data (h3) for preprocessing. list with the same length of Model_List -E3SM_h3_path=[] -E3SM_h3_filehead=[] # filename before .cam.h3.yyyy-mm-dd.00000.nc -for mm in Model_List: - E3SM_h3_path.append('/global/cscratch1/sd/sqtang/EAGLES/E3SM_output/E3SMv1_h3/') - if campaign=='MAGIC': - E3SM_h3_filehead.append(mm+'_2012-2013') - else: -# E3SM_h3_filehead.append(mm+'_2014-2018') - E3SM_h3_filehead.append(mm) - #E3SM_h3_path.append('/qfs/projects/eagles/zhan524/simulations/compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm+'/h3/') - #E3SM_h3_filehead.append('compy_F20TRC5-CMIP6_ne30_EG1_R2_'+mm) - -# path of output figures -figpath_aircraft_timeseries = package_path+'figures/'+campaign+'/aircraft/timeseries/' -figpath_aircraft_statistics = package_path+'figures/'+campaign+'/aircraft/statistics/' -figpath_ship_timeseries = package_path+'figures/'+campaign+'/ship/timeseries/' -figpath_ship_statistics = package_path+'figures/'+campaign+'/ship/statistics/' -figpath_sfc_timeseries = package_path+'figures/'+campaign+'/surface/timeseries/' -figpath_sfc_statistics = package_path+'figures/'+campaign+'/surface/statistics/' -figpath_profile_timeseries = package_path+'figures/'+campaign+'/profile/timeseries/' - - -#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -# settings for different field campaigns - -# set location and time information -if campaign=='HISCALE': - site='SGP' - # lat/lon at SGP - lat0 = 36.6059 - lon0 = 360-97.48792 # 0-360 - # bin of flight heights to calculate percentiles - height_bin = np.arange(300,4300,300) - # height_bin = np.arange(400,4300,200) - - # time periods for IOPs. needed in preprocessing of surface data - if IOP=='IOP1': - start_date='2016-04-25' - end_date='2016-05-29' - elif IOP=='IOP2': - start_date='2016-08-27' - end_date='2016-09-22' - - # observational data path. - # aircraf measurements merged_bin data are used for all plot_flight_*.py to provide flight/cloud/CVI info - merged_size_path=package_path+'data/'+campaign+'/obs/aircraft/merged_bin/' - iwgpath = package_path+'data/'+campaign+'/obs/aircraft/mei-iwg1/' - fimspath = package_path+'data/'+campaign+'/obs/aircraft/wang-fims/' - pcasppath = package_path+'data/'+campaign+'/obs/aircraft/tomlinson-pcasp/' - cvipath = package_path+'data/'+campaign+'/obs/aircraft/pekour-cvi/' - cpcpath = package_path+'data/'+campaign+'/obs/aircraft/mei-cpc/' - ccnpath = package_path+'data/'+campaign+'/obs/aircraft/mei-ccn/' - amspath = package_path+'data/'+campaign+'/obs/aircraft/shilling-ams/' - wcmpath = package_path+'data/'+campaign+'/obs/aircraft/matthews-wcm/' - # surface measurements - smps_pnnl_path = package_path+'data/'+campaign+'/obs/surface/pnnl-smps/' - smps_bnl_path = package_path+'data/'+campaign+'/obs/surface/bnl-smps/' - nanosmps_bnl_path = package_path+'data/'+campaign+'/obs/surface/bnl-nanosmps/' - uhsassfcpath = package_path+'data/'+campaign+'/obs/surface/arm-uhsas/' - cpcsfcpath = package_path+'data/'+campaign+'/obs/surface/arm-cpc/' - cpcusfcpath = package_path+'data/'+campaign+'/obs/surface/arm-cpcu/' - ccnsfcpath = package_path+'data/'+campaign+'/obs/surface/arm-ccn/' - metpath = package_path+'data/'+campaign+'/obs/surface/arm-met/' - acsmpath = package_path+'data/'+campaign+'/obs/surface/arm_acsm/' - # vertical profile measurements - armbepath = package_path+'data/'+campaign+'/obs/profile/sgparmbecldrad/' - - # PBLH data needed for plot_flight_pdf_percentile_SeparatePBLH_hiscale.py only - pblhpath = package_path+'data/'+campaign+'/obs/profile/arm-pblh/' - dlpath = package_path+'data/'+campaign+'/obs/profile/dl-pblh/' - - # model path - # pre-processed model path - E3SM_sfc_path = package_path+'data/'+campaign+'/model/surface/' - E3SM_aircraft_path = package_path+'data/'+campaign+'/model/flighttrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - - -elif campaign=='ACEENA': - site='ENA' - # lat/lon for ENA - lat0 = 39.09527 - lon0 = 360-28.0339 - # bin of flight heights to calculate percentiles - height_bin = np.arange(100,4300,300) - - # time periods for IOPs. needed in preprocessing of surface data - if IOP=='IOP1': - start_date='2017-06-20' - end_date='2017-07-20' - elif IOP=='IOP2': - start_date='2018-01-21' - end_date='2018-02-19' - - # observational data path. - # aircraf measurements merged_bin data are used for all plot_flight_*.py to provide flight/cloud/CVI info - merged_size_path=package_path+'data/'+campaign+'/obs/aircraft/merged_bin/' - iwgpath = package_path+'data/'+campaign+'/obs/aircraft/IWG/' - fimspath = package_path+'data/'+campaign+'/obs/aircraft/FIMS/' - pcasppath = package_path+'data/'+campaign+'/obs/aircraft/pcasp_g1/' - cvipath = package_path+'data/'+campaign+'/obs/aircraft/inletcvi/' - opcpath = package_path+'data/'+campaign+'/obs/aircraft/opciso/' - cpcpath = package_path+'data/'+campaign+'/obs/aircraft/cpc_aaf/' - ccnpath = package_path+'data/'+campaign+'/obs/aircraft/ccn_aaf/' - amspath = package_path+'data/'+campaign+'/obs/aircraft/shilling-hrfams/' - wcmpath = package_path+'data/'+campaign+'/obs/aircraft/wcm_ACEENA/' - # surface measurements - uhsassfcpath = package_path+'data/'+campaign+'/obs/surface/arm_uhsas/' - cpcsfcpath = package_path+'data/'+campaign+'/obs/surface/arm_cpcf/' - cpcusfcpath = 'N/A' - ccnsfcpath = package_path+'data/'+campaign+'/obs/surface/arm_aosccn1/' - metpath = package_path+'data/'+campaign+'/obs/surface/arm_met/' - acsmpath = package_path+'data/'+campaign+'/obs/surface/arm_acsm/' - # vertical profile measurements - armbepath = package_path+'data/'+campaign+'/obs/profile/enaarmbecldrad/' - - # model path - # pre-processed model path - E3SM_sfc_path = package_path+'data/'+campaign+'/model/surface/' - E3SM_aircraft_path = package_path+'data/'+campaign+'/model/flighttrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -elif campaign=='MAGIC': - site='MAG' - - # bin of latitude to calculate ship track composite - latbin = np.arange(21.5,34,1) - - # reference lat/lon - lat0=30. - lon0=230. - - # observational data path. - # ship measurements - shipmetpath=package_path+'data/'+campaign+'/obs/ship/raynolds-marmet/' - shipccnpath=package_path+'data/'+campaign+'/obs/ship/magaosccn100M1.a1/' - shipcpcpath=package_path+'data/'+campaign+'/obs/ship/magaoscpcfM1.a1/' - shipmwrpath=package_path+'data/'+campaign+'/obs/ship/magmwrret1liljclouM1.s2/' - shipuhsaspath=package_path+'data/'+campaign+'/obs/ship/magaosuhsasM1.a1/' - - # model path - # pre-processed model path - E3SM_ship_path = package_path+'data/'+campaign+'/model/shiptrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -elif campaign=='MARCUS': - site='MAR' - - # bin of latitude to calculate ship track composite - latbin = np.arange(-68.5,-42,1) - - # reference lat/lon - lat0=-40. - lon0=120. - - - # observational data path. - # ship measurements - shipmetpath=package_path+'data/'+campaign+'/obs/ship/maraadmetX1.b1/' - shipccnpath=package_path+'data/'+campaign+'/obs/ship/maraosccn1colavgM1.b1/' - shipcpcpath=package_path+'data/'+campaign+'/obs/ship/maraoscpcf1mM1.b1/' - shipmwrpath=package_path+'data/'+campaign+'/obs/ship/marmwrret1liljclouM1.s2/' - shipuhsaspath=package_path+'data/'+campaign+'/obs/ship/maraosuhsasM1.a1/' - - # model path - # pre-processed model path - E3SM_ship_path = package_path+'data/'+campaign+'/model/shiptrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -elif campaign=='CSET': - # bin of flight heights to calculate percentiles - height_bin = np.arange(200,8000,400) - # bin of latitude to calculate composite percentiles, same as MAGIC - latbin = np.arange(22.5,39,1) - - # lat/lon at the airport - lat0 = 38.5564 - lon0 = 360-121.3120 - - # observational data path. - # aircraft measurements - RFpath=package_path+'data/'+campaign+'/obs/aircraft/aircraft_lowrate/' - ccnpath='N/A' - - # model path - # pre-processed model path - E3SM_aircraft_path = package_path+'data/'+campaign+'/model/flighttrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -elif campaign=='SOCRATES': - # bin of flight heights to calculate percentiles - height_bin = np.arange(200,8000,400) - # bin of latitude to calculate composite percentiles - latbin = np.arange(-63.5,-42,1) - # height_bin = np.arange(200,7000,400) - # lat/lon at the airport - lat0 = -42.8371 - lon0 = 147.5054 - - # observational data path. - # aircraft measurements - RFpath=package_path+'data/'+campaign+'/obs/aircraft/aircraft_lowrate/' - ccnpath=package_path+'data/'+campaign+'/obs/aircraft/CCN/' - - # model path - # pre-processed model path - E3SM_aircraft_path = package_path+'data/'+campaign+'/model/flighttrack/' - E3SM_profile_path = package_path+'data/'+campaign+'/model/profile/' - -else: - raise ValueError("does not recognize this campaign: "+campaign) - diff --git a/src/esmac_diags/subroutines/specific_data_treatment.py b/src/esmac_diags/subroutines/specific_data_treatment.py index 1aad79f..2eaa7e3 100644 --- a/src/esmac_diags/subroutines/specific_data_treatment.py +++ b/src/esmac_diags/subroutines/specific_data_treatment.py @@ -3,6 +3,7 @@ """ import numpy as np +from ..subroutines.quality_control import qc_remove_neg #%% def avg_time_1d(time0, data0, time): @@ -23,7 +24,6 @@ def avg_time_1d(time0, data0, time): data : output data """ - from quality_control import qc_remove_neg data0 = qc_remove_neg(data0) if data0.shape[0] != len(time0): raise ValueError("Arrays must have the same size") @@ -53,7 +53,6 @@ def avg_time_2d(time0, data0, time): data : output data """ - from quality_control import qc_remove_neg data0 = qc_remove_neg(data0) if data0.shape[0] != len(time0): raise ValueError("the first dimension of input data must have the same size with time") @@ -119,14 +118,10 @@ def mask_model_ps(timem, psm, legnum, campaign, shipmetpath): datamask : mask flag of large Ps difference """ - - import sys - sys.path.insert(1, '../subroutines/') - import glob - from read_ship import read_marmet - from read_ARMdata import read_met - from time_format_change import yyyymmdd2cday, cday2mmdd + from ..subroutines.read_ship import read_marmet + from ..subroutines.read_ARMdata import read_met + from ..subroutines.time_format_change import yyyymmdd2cday, cday2mmdd if campaign == 'MAGIC': filenameo = shipmetpath + 'marmet' + legnum + '.txt' From 984bcc59f788bd1216ecd919e3a28e966505ceab Mon Sep 17 00:00:00 2001 From: Shuaiqi Tang Date: Wed, 10 Nov 2021 19:51:43 -0800 Subject: [PATCH 14/14] Update README.md --- README.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d767845..efe4f5d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This Earth System Model (ESM) aerosol-cloud diagnostics package (ESMAC Diags) is currently used to evaluate aerosols, clouds and aerosol-cloud interactions simulated by the Department of Energy’s (DOE) Energy Exascale Earth System Model (E3SM). The first version (v1.0) focuses on comparing simulated aerosol properties with in-situ aircraft, ship and surface measurements. Various types of diagnostics and metrics are performed for aerosol number, size distribution, chemical composition, and CCN concentration to assess how well E3SM represents observed aerosol properties across spatial scales. Metrics for various meteorological and aerosol precursor quantities from the same field campaigns are also included. Version 2 is under development focusing on aerosol-cloud interactions. -More information can be found in README_ESMAC_Diags_v1.0.pdf +More information can be found in README_ESMAC_Diags_v1.0-alpha.pdf ## To install This code is best run using a conda virtual environment. To install the required environment one can do @@ -20,7 +20,11 @@ Which will install the code as editable allowing you to make changes to the code # Test run -To verify the package, enter scripts/ directory and run scripts_testcase.csh. Then check the directory in testcase/figures/. There should be three figures generated: +To verify the package, enter scripts/ directory and run +```bash +python run_testcase.py +``` +Then go to the directory in testcase/figures/. There should be three figures generated: flighttrack_ACEENA_20170630a.png