Commit 24da3d1e authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[projections] add test_massif_names_adamont_v2 to check that all massifs are...

[projections] add test_massif_names_adamont_v2 to check that all massifs are the same than for SAFRAN 2020.
add assertion to check to the year_min and year_max for each scenario.
compute bias in the mean maxima at the masssif level
parent f67f19b8
No related merge requests found
Showing with 106 additions and 54 deletions
+106 -54
...@@ -13,7 +13,7 @@ from extreme_data.meteo_france_data.adamont_data.adamont.adamont_variables impor ...@@ -13,7 +13,7 @@ from extreme_data.meteo_france_data.adamont_data.adamont.adamont_variables impor
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_gcm_rcm_couples import get_gcm_rcm_couple_adamont_to_full_name
from extreme_data.meteo_france_data.adamont_data.adamont_scenario import scenario_to_str, AdamontScenario, \ from extreme_data.meteo_france_data.adamont_data.adamont_scenario import scenario_to_str, AdamontScenario, \
get_year_min_and_year_max_from_scenario, get_suffix_for_the_nc_file, \ get_year_min_and_year_max_from_scenario, get_suffix_for_the_nc_file, \
scenario_to_real_scenarios, get_year_max scenario_to_real_scenarios, get_year_max, adamont_scenarios_real
from extreme_data.meteo_france_data.adamont_data.utils.utils import massif_number_to_massif_name from extreme_data.meteo_france_data.adamont_data.utils.utils import massif_number_to_massif_name
from extreme_data.utils import DATA_PATH from extreme_data.utils import DATA_PATH
...@@ -89,6 +89,12 @@ class AbstractAdamontStudy(AbstractStudy): ...@@ -89,6 +89,12 @@ class AbstractAdamontStudy(AbstractStudy):
year_to_annual_maxima = OrderedDict() year_to_annual_maxima = OrderedDict()
year_min, year_max = get_year_min_and_year_max_from_scenario(self.scenario, self.gcm_rcm_couple) year_min, year_max = get_year_min_and_year_max_from_scenario(self.scenario, self.gcm_rcm_couple)
years = list(range(year_min, year_max + 1)) years = list(range(year_min, year_max + 1))
if self.scenario in adamont_scenarios_real:
time = dataset.variables['time']
msg = 'len_years={} while len_time={},' \
'check year_min and year_max, ' \
'check in debug mode the time field of the daatset to see the starting date'.format(years, time)
assert len(years) == len(time), msg
for year, maxima in zip(years, annual_maxima): for year, maxima in zip(years, annual_maxima):
if self.year_min <= year <= self.year_max: if self.year_min <= year <= self.year_max:
year_to_annual_maxima[year] = maxima year_to_annual_maxima[year] = maxima
...@@ -110,11 +116,10 @@ class AbstractAdamontStudy(AbstractStudy): ...@@ -110,11 +116,10 @@ class AbstractAdamontStudy(AbstractStudy):
scenario_name = self._scenario_to_str_adamont_v2(scenario) scenario_name = self._scenario_to_str_adamont_v2(scenario)
directory = self.gcm_rcm_full_name + '_' + scenario_name directory = self.gcm_rcm_full_name + '_' + scenario_name
filename = self.nc_filename_adamont_v2(scenario) filename = self.nc_filename_adamont_v2(scenario)
print(directory)
print(filename)
full_path = op.join(ADAMONT_v2_WEBPATH, directory, filename) full_path = op.join(ADAMONT_v2_WEBPATH, directory, filename)
# Download file # Download file
request = 'wget {} -P {}'.format(full_path, path_folder) request = 'wget {} -P {}'.format(full_path, path_folder)
print(request)
subprocess.run(request, shell=True) subprocess.run(request, shell=True)
def nc_filename_adamont_v2(self, scenario): def nc_filename_adamont_v2(self, scenario):
......
...@@ -43,7 +43,8 @@ def get_year_min(adamont_scenario, gcm_rcm_couple): ...@@ -43,7 +43,8 @@ def get_year_min(adamont_scenario, gcm_rcm_couple):
year_min = 1982 year_min = 1982
elif rcm == 'RCA4': elif rcm == 'RCA4':
year_min = 1971 year_min = 1971
elif gcm_rcm_couple in [('NorESM1-M', 'HIRHAM5'), ('IPSL-CM5A-MR', 'WRF331F')]: elif gcm_rcm_couple in [('NorESM1-M', 'HIRHAM5'), ('IPSL-CM5A-MR', 'WRF331F'), ('CNRM-CM5', 'ALADIN63'),
('IPSL-CM5A-MR', 'WRF381P')]:
year_min = 1952 year_min = 1952
else: else:
year_min = 1951 year_min = 1951
......
...@@ -20,29 +20,44 @@ from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import Alti ...@@ -20,29 +20,44 @@ from projects.altitude_spatial_model.altitudes_fit.altitudes_studies import Alti
def compute_bias_and_display_it(ax, def compute_bias_and_display_it(ax,
altitude_studies_reanalysis: AltitudesStudies, altitude_studies_reanalysis: AltitudesStudies,
adamont_altitude_studies: AltitudesStudies, adamont_altitude_studies: AltitudesStudies,
gcm_rcm_couple gcm_rcm_couple,
massif_names=None,
): ):
bias_in_the_mean_maxima = [] bias_in_the_mean_maxima = []
altitudes = [] altitudes = []
for altitude, study_reanalysis in altitude_studies_reanalysis.altitude_to_study.items(): for altitude, study_reanalysis in altitude_studies_reanalysis.altitude_to_study.items():
altitudes.append(altitude)
adamont_study = adamont_altitude_studies.altitude_to_study[altitude] adamont_study = adamont_altitude_studies.altitude_to_study[altitude]
mean_maxima_adamont = adamont_study.mean_annual_maxima can_compute_biais = (massif_names is None) or any([m in adamont_study.study_massif_names for m in massif_names])
mean_maxima_reanalysis = study_reanalysis.mean_annual_maxima if can_compute_biais:
bias = mean_maxima_adamont - mean_maxima_reanalysis
bias_in_the_mean_maxima.append(bias) altitudes.append(altitude)
if massif_names is None:
mean_maxima_adamont = adamont_study.mean_annual_maxima
mean_maxima_reanalysis = study_reanalysis.mean_annual_maxima
else:
mean_maxima_reanalysis = np.mean(np.concatenate([study_reanalysis.massif_name_to_annual_maxima[m]
for m in massif_names
if m in study_reanalysis.massif_name_to_annual_maxima]))
mean_maxima_adamont = np.mean(np.concatenate([adamont_study.massif_name_to_annual_maxima[m]
for m in massif_names
if m in adamont_study.massif_name_to_annual_maxima]))
bias = mean_maxima_adamont - mean_maxima_reanalysis
bias_in_the_mean_maxima.append(bias)
color = gcm_rcm_couple_to_color[gcm_rcm_couple] color = gcm_rcm_couple_to_color[gcm_rcm_couple]
label = gcm_rcm_couple_to_str(gcm_rcm_couple) label = gcm_rcm_couple_to_str(gcm_rcm_couple)
ax.plot(bias_in_the_mean_maxima, altitudes, label=label, color=color) ax.plot(bias_in_the_mean_maxima, altitudes, label=label, color=color)
return np.array(bias_in_the_mean_maxima) return np.array(bias_in_the_mean_maxima), altitudes
def main_comparaison_plot(): def main_comparaison_plot():
altitudes = [600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600][:] altitudes = [600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600][:]
for adamont_version in [1, 2]: for adamont_version in [1, 2][1:]:
ax = plt.gca() print('version:', adamont_version)
gcm_rcm_couples = load_gcm_rcm_couples(adamont_scenario=AdamontScenario.histo, adamont_version=adamont_version) gcm_rcm_couples = load_gcm_rcm_couples(adamont_scenario=AdamontScenario.histo, adamont_version=adamont_version)
study_class = SafranSnowfall2020 if adamont_version == 2 else SafranSnowfall1Day study_class = SafranSnowfall2020 if adamont_version == 2 else SafranSnowfall1Day
...@@ -57,47 +72,67 @@ def main_comparaison_plot(): ...@@ -57,47 +72,67 @@ def main_comparaison_plot():
altitudes=altitudes, altitudes=altitudes,
year_min=1988, year_min=1988,
year_max=2011) year_max=2011)
bias_in_the_mean = []
for gcm_rcm_couple in gcm_rcm_couples: if adamont_version == 1:
print(gcm_rcm_couple) list_of_massis_names = [None]
gcm, rcm = gcm_rcm_couple else:
years_reanalysis, years_model = get_year_min_and_year_max_used_to_compute_quantile(gcm) list_of_massis_names = [None] + [[m] for m in reanalysis_altitude_studies_1981.study.all_massif_names()]
assert years_reanalysis[0] in [1981, 1988]
if years_reanalysis[0] == 1981: for massif_names in list_of_massis_names[:]:
reanalysis_altitude_studies = reanalysis_altitude_studies_1981 ax = plt.gca()
else: bias_in_the_mean = []
reanalysis_altitude_studies = reanalysis_altitude_studies_1988 list_altitudes_for_bias = []
adamont_altitude_studies = AltitudesStudies(study_class=AdamontSnowfall, for gcm_rcm_couple in gcm_rcm_couples:
altitudes=altitudes, print(massif_names, gcm_rcm_couple)
year_min=years_model[0], gcm, rcm = gcm_rcm_couple
year_max=years_model[1], years_reanalysis, years_model = get_year_min_and_year_max_used_to_compute_quantile(gcm)
scenario=AdamontScenario.histo, assert years_reanalysis[0] in [1981, 1988]
gcm_rcm_couple=gcm_rcm_couple, if years_reanalysis[0] == 1981:
adamont_version=adamont_version) reanalysis_altitude_studies = reanalysis_altitude_studies_1981
bias_in_the_mean.append(compute_bias_and_display_it(ax, reanalysis_altitude_studies, else:
adamont_altitude_studies, gcm_rcm_couple)) reanalysis_altitude_studies = reanalysis_altitude_studies_1988
adamont_altitude_studies = AltitudesStudies(study_class=AdamontSnowfall,
bias_in_the_mean = np.array(bias_in_the_mean) altitudes=altitudes,
min_bias, median_bias, max_bias = [f(bias_in_the_mean, axis=0) for f in [np.min, np.median, np.max]] year_min=years_model[0],
year_max=years_model[1],
# Plot the range for the bias, and the median scenario=AdamontScenario.histo,
ax.yaxis.set_ticks(altitudes) gcm_rcm_couple=gcm_rcm_couple,
color = 'k' adamont_version=adamont_version)
ax.plot(median_bias, altitudes, label='Median bias', color=color, linewidth=4) bias, altitudes_for_bias = compute_bias_and_display_it(ax, reanalysis_altitude_studies,
# ax.fill_betweenx(altitudes, min_bias, max_bias, label='Range for the bias', alpha=0.2, color='whitesmoke') adamont_altitude_studies, gcm_rcm_couple, massif_names)
ax.vlines(0, ymin=altitudes[0], ymax=altitudes[-1], color='k', linestyles='dashed') bias_in_the_mean.append(bias)
study_str = STUDY_CLASS_TO_ABBREVIATION[type(reanalysis_altitude_studies.study)] list_altitudes_for_bias.append(altitudes_for_bias)
plot_name = 'Bias for annual maxima of {}'.format(study_str)
ax.set_ylim(top=altitudes[-1] + 1300) # Assert the all the bias have been computed for the same altitudes
study = adamont_altitude_studies.study altitudes_for_bias = list_altitudes_for_bias[0]
ax.legend(ncol=3, prop={'size': 7}) for alti in list_altitudes_for_bias:
ax.set_ylabel('Altitude (m)', fontsize=10) assert alti == altitudes_for_bias
ax.set_xlabel('Bias in the mean annual maxima of {} for ADAMONT v{} members\n'
' against {} on the quantile mapping period ({})'.format(study_str, adamont_version, bias_in_the_mean = np.array(bias_in_the_mean)
comparaison_study_class, min_bias, median_bias, max_bias = [f(bias_in_the_mean, axis=0) for f in [np.min, np.median, np.max]]
study.variable_unit), fontsize=10)
reanalysis_altitude_studies.show_or_save_to_file(plot_name=plot_name, no_title=True) # Plot the range for the bias, and the median
plt.close() ax.yaxis.set_ticks(altitudes)
color = 'k'
ax.plot(median_bias, altitudes_for_bias, label='Median bias', color=color, linewidth=4)
# ax.fill_betweenx(altitudes, min_bias, max_bias, label='Range for the bias', alpha=0.2, color='whitesmoke')
ax.vlines(0, ymin=altitudes[0], ymax=altitudes[-1], color='k', linestyles='dashed')
study_str = STUDY_CLASS_TO_ABBREVIATION[type(reanalysis_altitude_studies.study)]
ax.set_ylim(top=altitudes[-1] + 1300)
study = adamont_altitude_studies.study
ax.legend(ncol=3, prop={'size': 7})
ax.set_ylabel('Altitude (m)', fontsize=10)
massif_str = 'all massifs' if massif_names is None else 'the {} massif'.format(massif_names[0])
title = 'Bias in the mean annual maxima of {} of {}\n' \
'for ADAMONT v{}' \
' against {} on the quantile mapping period ({})'.format(study_str, massif_str,
adamont_version,
comparaison_study_class,
study.variable_unit)
plot_name = title
ax.set_xlabel(title, fontsize=10)
reanalysis_altitude_studies.show_or_save_to_file(plot_name=plot_name, no_title=True)
plt.close()
if __name__ == '__main__': if __name__ == '__main__':
......
...@@ -3,6 +3,7 @@ import unittest ...@@ -3,6 +3,7 @@ import unittest
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_gcm_rcm_couples import get_gcm_rcm_couple_adamont_to_full_name
from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario from extreme_data.meteo_france_data.adamont_data.adamont_scenario import AdamontScenario
from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall from extreme_data.meteo_france_data.adamont_data.adamont.adamont_snowfall import AdamontSnowfall
from extreme_data.meteo_france_data.scm_models_data.safran.safran import SafranSnowfall1Day
class TestAdamontStudy(unittest.TestCase): class TestAdamontStudy(unittest.TestCase):
...@@ -27,6 +28,16 @@ class TestAdamontStudy(unittest.TestCase): ...@@ -27,6 +28,16 @@ class TestAdamontStudy(unittest.TestCase):
# print(len(study.massif_name_to_annual_maxima['Vanoise'])) # print(len(study.massif_name_to_annual_maxima['Vanoise']))
self.assertTrue(True) self.assertTrue(True)
def test_massifs_names_adamont_v2(self):
year_min = 2004
adamont_version = 2 # this test will not pass with adamont version 1
for altitude in [600, 900, 1200, 1500, 1800, 2100, 2400, 2700, 3000, 3300, 3600]:
reanalysis_study = SafranSnowfall1Day(altitude=altitude, year_min=year_min)
for gcm_rcm_couple in get_gcm_rcm_couple_adamont_to_full_name(adamont_version).keys():
adamont_study = AdamontSnowfall(altitude=altitude, adamont_version=adamont_version,
year_min=year_min, gcm_rcm_couple=gcm_rcm_couple)
assert set(adamont_study.study_massif_names) == set(reanalysis_study.study_massif_names)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment