From 3d34328424364e8e43be7511371dbaa209b057af Mon Sep 17 00:00:00 2001 From: Le Roux Erwan <erwan.le-roux@irstea.fr> Date: Fri, 26 Feb 2021 14:16:47 +0100 Subject: [PATCH] [refactor] add swe and ground snow load variable for adamont v2. rename also some files. --- .../adamont_data/abstract_adamont_study.py | 1 + .../adamont_data/adamont/adamont_crocus.py | 28 ++++++++++ ...{adamont_snowfall.py => adamont_safran.py} | 11 +--- .../adamont_data/adamont/adamont_variables.py | 35 +++++++++++++ ...load_adamont.py => download_adamont_v1.py} | 0 .../scm_models_data/crocus/crocus.py | 2 +- .../crocus/crocus_variables.py | 7 ++- .../visualization/main_study_visualizer.py | 2 +- .../preliminary_analysis.py | 2 +- .../checks/main_inquiry_weird_pattern.py | 2 +- .../main_comparison_on_quantile_period.py | 2 +- ...ation_temporal_for_projections_ensemble.py | 2 +- .../section_data/main_data.py | 2 +- .../test_adamont_study.py | 51 ++++++++++++------- .../test_altitudes_studies.py | 2 +- test/test_extreme_trend/test_one_fold_fit.py | 2 +- 16 files changed, 112 insertions(+), 39 deletions(-) create mode 100644 extreme_data/meteo_france_data/adamont_data/adamont/adamont_crocus.py rename extreme_data/meteo_france_data/adamont_data/adamont/{adamont_snowfall.py => adamont_safran.py} (57%) rename extreme_data/meteo_france_data/adamont_data/utils/{download_adamont.py => download_adamont_v1.py} (100%) diff --git a/extreme_data/meteo_france_data/adamont_data/abstract_adamont_study.py b/extreme_data/meteo_france_data/adamont_data/abstract_adamont_study.py index 53f2031b..00ccb21b 100644 --- a/extreme_data/meteo_france_data/adamont_data/abstract_adamont_study.py +++ b/extreme_data/meteo_france_data/adamont_data/abstract_adamont_study.py @@ -85,6 +85,7 @@ class AbstractAdamontStudy(AbstractStudy): year_to_annual_maxima = OrderedDict() for dataset, real_scenario in zip(self.datasets, self.adamont_real_scenarios): annual_maxima = np.array(dataset.variables[self.variable_class.indicator_name_for_maxima]) + annual_maxima = self.variable_class.transform_annual_maxima(annual_maxima) assert annual_maxima.shape[1] == len(self.column_mask) annual_maxima = annual_maxima[:, self.column_mask] year_min, year_max = get_year_min_and_year_max_from_scenario(real_scenario, self.gcm_rcm_couple) diff --git a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_crocus.py b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_crocus.py new file mode 100644 index 00000000..32da20bd --- /dev/null +++ b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_crocus.py @@ -0,0 +1,28 @@ +from extreme_data.meteo_france_data.adamont_data.abstract_adamont_study import AbstractAdamontStudy +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_variables import CrocusSweSimulationVariable, \ + CrocusTotalSnowLoadVariable +from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario +from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import CrocusVariable +from extreme_data.meteo_france_data.scm_models_data.utils import Season, FrenchRegion + + +class AdamontSwe(AbstractAdamontStudy): + + def __init__(self, *args, **kwargs): + super().__init__(CrocusSweSimulationVariable, *args, **kwargs) + + +class AdamontSnowLoad(AbstractAdamontStudy): + + def __init__(self, *args, **kwargs): + super().__init__(CrocusTotalSnowLoadVariable, *args, **kwargs) + + def load_annual_maxima(self, dataset): + return CrocusVariable.snow_load_multiplication_factor * super().load_annual_maxima(dataset) + + +if __name__ == '__main__': + for study_class in [AdamontSwe, AdamontSnowLoad]: + study = study_class(altitude=1800, adamont_version=2, gcm_rcm_couple=('HadGEM2-ES', 'RACMO22E'), + scenario=AdamontScenario.rcp85_extended) + print(study.year_to_annual_maxima[2000]) \ No newline at end of file diff --git a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_snowfall.py b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_safran.py similarity index 57% rename from extreme_data/meteo_france_data/adamont_data/adamont/adamont_snowfall.py rename to extreme_data/meteo_france_data/adamont_data/adamont/adamont_safran.py index 822136ea..87ece792 100644 --- a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_snowfall.py +++ b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_safran.py @@ -7,15 +7,8 @@ from extreme_data.meteo_france_data.scm_models_data.utils import Season, FrenchR class AdamontSnowfall(AbstractAdamontStudy): - def __init__(self, altitude: int = 1800, - year_min=None, year_max=None, - multiprocessing=True, season=Season.annual, - french_region=FrenchRegion.alps, - scenario=AdamontScenario.histo, gcm_rcm_couple=('CNRM-CM5', 'ALADIN53'), - adamont_version=2): - super().__init__(SafranSnowfallSimulationVariable, altitude, - year_min, year_max, - multiprocessing, season, french_region, scenario, gcm_rcm_couple, adamont_version) + def __init__(self, *args, **kwargs): + super().__init__(SafranSnowfallSimulationVariable, *args, **kwargs) if __name__ == '__main__': diff --git a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_variables.py b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_variables.py index 81609475..ab6a061c 100644 --- a/extreme_data/meteo_france_data/adamont_data/adamont/adamont_variables.py +++ b/extreme_data/meteo_france_data/adamont_data/adamont/adamont_variables.py @@ -1,6 +1,8 @@ import numpy as np from extreme_data.meteo_france_data.scm_models_data.abstract_variable import AbstractVariable +from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import AbstractSnowLoadVariable, \ + TotalSnowLoadVariable, CrocusTotalSweVariable from extreme_data.meteo_france_data.scm_models_data.safran.safran_variable import SafranSnowfallVariable from root_utils import classproperty @@ -15,10 +17,16 @@ class AbstractAdamontVariable(AbstractVariable): def indicator_name_for_maxima(cls): raise NotImplementedError + @classmethod + def transform_annual_maxima(cls, annual_maxima): + return annual_maxima + class SafranSnowfallSimulationVariable(AbstractAdamontVariable): UNIT = SafranSnowfallVariable.UNIT NAME = SafranSnowfallVariable.NAME + # For adamont v1 + @property def daily_time_serie_array(self) -> np.ndarray: return self.variable_array @@ -27,6 +35,8 @@ class SafranSnowfallSimulationVariable(AbstractAdamontVariable): def keyword(cls): return 'SNOW' + # For adamont v2 + @classmethod def variable_name_for_folder_and_nc_file(cls): return 'Snow' @@ -35,3 +45,28 @@ class SafranSnowfallSimulationVariable(AbstractAdamontVariable): def indicator_name_for_maxima(cls): return 'max-1day-snowf' + +class CrocusSweSimulationVariable(AbstractAdamontVariable): + UNIT = CrocusTotalSweVariable.UNIT + NAME = CrocusTotalSweVariable.NAME + + # For adamont v2 + + @classmethod + def variable_name_for_folder_and_nc_file(cls): + return cls.indicator_name_for_maxima.replace('-', '_').capitalize() + + @classproperty + def indicator_name_for_maxima(cls): + return 'swe-max-winter-11-04-NN' + + +class CrocusTotalSnowLoadVariable(CrocusSweSimulationVariable): + NAME = TotalSnowLoadVariable.NAME + UNIT = TotalSnowLoadVariable.UNIT + + @classmethod + def transform_annual_maxima(cls, annual_maxima): + return AbstractSnowLoadVariable.transform_swe_into_snow_load(annual_maxima) + + diff --git a/extreme_data/meteo_france_data/adamont_data/utils/download_adamont.py b/extreme_data/meteo_france_data/adamont_data/utils/download_adamont_v1.py similarity index 100% rename from extreme_data/meteo_france_data/adamont_data/utils/download_adamont.py rename to extreme_data/meteo_france_data/adamont_data/utils/download_adamont_v1.py diff --git a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py index ff0473ca..104dbf30 100644 --- a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py +++ b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus.py @@ -134,7 +134,7 @@ class CrocusDaysWithSnowOnGround(Crocus): if __name__ == '__main__': - for study in [CrocusSwe3Days(altitude=900, orientation=90.0)]: + for study in [CrocusSnowLoadTotal(altitude=900, orientation=90.0)]: d = study.year_to_dataset_ordered_dict[1959] print(d) print(study.reanalysis_path) diff --git a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py index 77896b70..ab426a9f 100644 --- a/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py +++ b/extreme_data/meteo_france_data/scm_models_data/crocus/crocus_variables.py @@ -57,8 +57,11 @@ class AbstractSnowLoadVariable(CrocusVariable): @property def daily_time_serie_array(self) -> np.ndarray: - snow_pressure = self.snow_load_multiplication_factor * super().daily_time_serie_array - return snow_pressure + return self.transform_swe_into_snow_load(super().daily_time_serie_array) + + @classmethod + def transform_swe_into_snow_load(cls, swe): + return cls.snow_load_multiplication_factor * swe class RecentSnowLoadVariableOneDay(AbstractSnowLoadVariable, CrocusRecentSweVariableOneDay): diff --git a/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py b/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py index c6899e4d..7dbf4ba2 100644 --- a/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py +++ b/extreme_data/meteo_france_data/scm_models_data/visualization/main_study_visualizer.py @@ -2,7 +2,7 @@ import time from collections import OrderedDict from typing import List -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.scm_models_data.abstract_study import AbstractStudy from extreme_data.meteo_france_data.scm_models_data.crocus.crocus import CrocusDepth, CrocusSweTotal, \ ExtendedCrocusDepth, \ diff --git a/projects/past_extreme_snowfall/section_data_and_results/preliminary_analysis.py b/projects/past_extreme_snowfall/section_data_and_results/preliminary_analysis.py index e3387ead..ff04a43d 100644 --- a/projects/past_extreme_snowfall/section_data_and_results/preliminary_analysis.py +++ b/projects/past_extreme_snowfall/section_data_and_results/preliminary_analysis.py @@ -5,7 +5,7 @@ from itertools import chain import numpy as np from extreme_data.meteo_france_data.adamont_data.abstract_adamont_study import AbstractAdamontStudy -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_gcm_rcm_couples import _gcm_rcm_couple_adamont_v2_to_full_name from extreme_data.meteo_france_data.adamont_data.adamont_scenario import get_gcm_rcm_couples, rcp_scenarios from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day diff --git a/projects/projected_extreme_snowfall/checks/main_inquiry_weird_pattern.py b/projects/projected_extreme_snowfall/checks/main_inquiry_weird_pattern.py index 4cc564ef..ab3ddc47 100644 --- a/projects/projected_extreme_snowfall/checks/main_inquiry_weird_pattern.py +++ b/projects/projected_extreme_snowfall/checks/main_inquiry_weird_pattern.py @@ -1,4 +1,4 @@ -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario from extreme_data.meteo_france_data.scm_models_data.altitudes_studies import AltitudesStudies diff --git a/projects/projected_extreme_snowfall/evaluation/main_comparison_on_quantile_period.py b/projects/projected_extreme_snowfall/evaluation/main_comparison_on_quantile_period.py index 042cc1df..ff21e635 100644 --- a/projects/projected_extreme_snowfall/evaluation/main_comparison_on_quantile_period.py +++ b/projects/projected_extreme_snowfall/evaluation/main_comparison_on_quantile_period.py @@ -2,7 +2,7 @@ import numpy as np import os.path as op import matplotlib -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_gcm_rcm_couples import \ get_year_min_and_year_max_used_to_compute_quantile, gcm_rcm_couple_to_color from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, \ diff --git a/projects/projected_extreme_snowfall/main_elevation_temporal_for_projections_ensemble.py b/projects/projected_extreme_snowfall/main_elevation_temporal_for_projections_ensemble.py index d991d926..06b95de0 100644 --- a/projects/projected_extreme_snowfall/main_elevation_temporal_for_projections_ensemble.py +++ b/projects/projected_extreme_snowfall/main_elevation_temporal_for_projections_ensemble.py @@ -21,7 +21,7 @@ from extreme_trend.elevation_temporal_model_for_projections.visualizer_for_proje import matplotlib from extreme_fit.model.utils import set_seed_for_test -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, get_gcm_rcm_couples, \ rcp_scenarios from spatio_temporal_dataset.coordinates.temporal_coordinates.abstract_temporal_covariate_for_fit import TimeTemporalCovariate diff --git a/projects/projected_extreme_snowfall/section_data/main_data.py b/projects/projected_extreme_snowfall/section_data/main_data.py index 4bb24359..f20e2858 100644 --- a/projects/projected_extreme_snowfall/section_data/main_data.py +++ b/projects/projected_extreme_snowfall/section_data/main_data.py @@ -9,7 +9,7 @@ mpl.rcParams['text.latex.preamble'] = [r'\usepackage{amsmath}'] import matplotlib.pyplot as plt from projects.projected_extreme_snowfall.evaluation.comparison_plot import individual_plot -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, get_gcm_rcm_couples, \ scenario_to_real_scenarios, rcp_scenarios, rcm_scenarios_extended from extreme_data.meteo_france_data.adamont_data.adamont_studies import AdamontStudies diff --git a/test/test_extreme_data/test_meteo_france_data/test_adamont_study.py b/test/test_extreme_data/test_meteo_france_data/test_adamont_study.py index a987b096..e7305c84 100644 --- a/test/test_extreme_data/test_meteo_france_data/test_adamont_study.py +++ b/test/test_extreme_data/test_meteo_france_data/test_adamont_study.py @@ -1,9 +1,11 @@ import unittest +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_crocus import AdamontSwe, AdamontSnowLoad from extreme_data.meteo_france_data.adamont_data.adamont_gcm_rcm_couples import get_gcm_rcm_couple_adamont_to_full_name from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario, adamont_scenarios_real, \ rcp_scenarios, get_gcm_rcm_couples, rcm_scenarios_extended -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall +from extreme_data.meteo_france_data.scm_models_data.crocus.crocus_variables import CrocusVariable from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day @@ -11,24 +13,36 @@ class TestAdamontStudy(unittest.TestCase): def test_load_adamont_snowfall(self): for version in [1, 2][:]: - study_list = [ - AdamontSnowfall(altitude=900, adamont_version=version), - AdamontSnowfall(altitude=1800, adamont_version=version) - ] - for scenario in rcp_scenarios + rcm_scenarios_extended: - gcm_rcm_couples = get_gcm_rcm_couples(scenario, version) - if len(gcm_rcm_couples) > 0: - first_gcm_rcm_couple = gcm_rcm_couples[0] - study_list.append(AdamontSnowfall(altitude=900, scenario=scenario, adamont_version=version, - gcm_rcm_couple=first_gcm_rcm_couple)) + self.load_many_study(AdamontSnowfall, version) + self.assertTrue(True) + + def test_load_adamont_swe(self): + self.load_many_study(AdamontSwe, version=2) + self.assertTrue(True) - study_list.extend([AdamontSnowfall(altitude=900, gcm_rcm_couple=gcm_rcm_couple, adamont_version=version) - for gcm_rcm_couple in get_gcm_rcm_couples(adamont_version=version)]) - for study in study_list: - annual_maxima_for_year_min = study.year_to_annual_maxima[study.year_min] - # print(study.altitude, study.scenario_name, study.gcm_rcm_couple) - # print(len(study.massif_name_to_annual_maxima['Vanoise'])) - self.assertTrue(True) + def test_load_adamont_swe(self): + maxima = [study_class(altitude=1800, adamont_version=2, gcm_rcm_couple=('HadGEM2-ES', 'RACMO22E'), + scenario=AdamontScenario.rcp85_extended).year_to_annual_maxima[2000][0] + for study_class in [AdamontSwe, AdamontSnowLoad]] + swe, snow_load = maxima + snow_load_from_swe = swe * CrocusVariable.snow_load_multiplication_factor + self.assertEqual(snow_load_from_swe, snow_load) + + def load_many_study(self, adamont_study_class, version): + study_list = [ + adamont_study_class(altitude=900, adamont_version=version), + adamont_study_class(altitude=1800, adamont_version=version) + ] + for scenario in rcp_scenarios + rcm_scenarios_extended: + gcm_rcm_couples = get_gcm_rcm_couples(scenario, version) + if len(gcm_rcm_couples) > 0: + first_gcm_rcm_couple = gcm_rcm_couples[0] + study_list.append(adamont_study_class(altitude=900, scenario=scenario, adamont_version=version, + gcm_rcm_couple=first_gcm_rcm_couple)) + study_list.extend([adamont_study_class(altitude=900, gcm_rcm_couple=gcm_rcm_couple, adamont_version=version) + for gcm_rcm_couple in get_gcm_rcm_couples(adamont_version=version)]) + for study in study_list: + annual_maxima_for_year_min = study.year_to_annual_maxima[study.year_min] def test_massifs_names_adamont_v2(self): year_min = 2004 @@ -47,7 +61,6 @@ class TestAdamontStudy(unittest.TestCase): self.assertEqual(len(study.ordered_years), len(study.massif_name_to_annual_maxima["Vanoise"])) self.assertTrue(True) - def test_existing_gcm_rcm_couple_and_rcp(self): altitude = 1800 for scenario in rcp_scenarios[:]: diff --git a/test/test_extreme_data/test_meteo_france_data/test_altitudes_studies.py b/test/test_extreme_data/test_meteo_france_data/test_altitudes_studies.py index c1525de2..0c34971c 100644 --- a/test/test_extreme_data/test_meteo_france_data/test_altitudes_studies.py +++ b/test/test_extreme_data/test_meteo_france_data/test_altitudes_studies.py @@ -1,6 +1,6 @@ import unittest -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day from extreme_data.meteo_france_data.scm_models_data.altitudes_studies import AltitudesStudies diff --git a/test/test_extreme_trend/test_one_fold_fit.py b/test/test_extreme_trend/test_one_fold_fit.py index e4e2a546..0196e983 100644 --- a/test/test_extreme_trend/test_one_fold_fit.py +++ b/test/test_extreme_trend/test_one_fold_fit.py @@ -1,6 +1,6 @@ import unittest -from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall +from extreme_data.meteo_france_data.adamont_data.adamont.adamont_safran import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario from extreme_data.meteo_france_data.adamont_data.cmip5.temperature_to_year import temperature_minmax_to_year_minmax from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day -- GitLab