This presentation: [https://www.pik-potsdam.de/~menz/model_comparison_toolbox/introduction](https://www.pik-potsdam.de/~menz/model_comparison_toolbox/introduction)

model-comparison-toolbox @ pik-gitlab: [https://gitlab.pik-potsdam.de/menz/model-comparison-toolbox](https://gitlab.pik-potsdam.de/menz/model-comparison-toolbox)
Model Comparison Toolbox

Christoph Menz
RDII
Potsdam Institut for Climate Impact Research

## MCT - Model Comparison Toolbox - Toolbox for plotting various datasets - global and regional climate models - observations - reanalysis - and more - Developed since ~2018 - On pik-gitlab since 2020 - Implemented on foote and stand-alone

map legend time series seasonal cycle bivariate separate years plot

## Plot Types

## Map Plots

## Time series and Box Plots

## Seasonality and Diurnal Cycle Plots

## Spatial and Temporal CDFs

## Bivariate and Separate Years Plots

Model Comparison Toolbox
Installation

### Model Comparison Toolbox - Stand-alone [https://gitlab.pik-potsdam.de/menz/model-comparison-toolbox](https://gitlab.pik-potsdam.de/menz/model-comparison-toolbox) - Installation on local computer - Offline utilization of MCT - Requires local python environment and setup of module dependencies - Requires local path to input data
### Model Comparison Toolbox - Stand-alone
- Create python environment with venv

[menz@login01: ~]> python -m venv  ~/python_envs/mctenv
[menz@login01: ~]> source ~/python_envs/mctenv/bin/activate
[menz@login01: ~]> pip install cartopy numpy xarray matplotlib netcdf4 pyinterp shapely scipy pyproj cftime dask distributed
                        
**OR** conda

[menz@login01: ~]> conda create -n mctenv
[menz@login01: ~]> conda activate mctenv
[menz@login01: ~]> conda install cartopy numpy xarray matplotlib netcdf4 pyinterp shapely scipy pyproj cftime dask distributed
[menz@login01: ~]> conda activate mctenv
                        
- Clone and install model-comparison-toolbox

[menz@login01: ~]> git clone https://gitlab.pik-potsdam.de/menz/model-comparison-toolbox
[menz@login01: ~]> cd model-comparison-toolbox 
[menz@login01: ~]> pip install .
                        
### Model Comparison Toolbox @ foote - Pre-installed python environment with latest version of MCT installed - Integrated in lmod module system for easy loading - Recommended way to use MCT - Large number of pre-installed datasets available - Maintained code base - Requires access to foote
### Model Comparison Toolbox @ foote
load mct lmod module on foote

[menz@login01: ~]> module use /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/envs/lmod
[menz@login01: ~]> module load mct
                        

The recommended way
Model Comparison Toolbox @ foote

### Model Comparison Toolbox @ foote : Directories

main directory:

/p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox
                                
source directory:

/p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/src
                                
python environment:

/p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/envs/python/mctenv
                                
climate data (netCDF):

/p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/netcdf_data
                                
climate data (pickle):

/p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data
                                
domain shape files:

/p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/domain_data
                                
### Model Comparison Toolbox @ foote : Datasets

#### Observations
CRU-TS
Berkeley-Earth
MSWEP
CHIRPS-v2.0
GPCC
GPCP
CPC
TRMM
E-OBS
JKI-DWD-PIK
HYRAS

#### Reanalysis
W5E5
W5E5_v2.0
WFDE5_v2.0
WFD-EI
WFD-ERA40
PGF
GSWP3
ERA5
ERA5-Land
NCEP-NCAR R1
NCEP-DOE R2
NOAA-CIRES-DOE 20th century V3

#### Model Simulations
ISIMIPFastTrack
ISIMIP2b
ISIMIP3b
CMIP3
CMIP5
CMIP6
PIK−STARS
DWD−EPISODES
CORDEX−EUR11
CORDEX−MNA22
CORDEX−MNA44
DWD−Referenzensemble
GDDP−CMIP6
MDK
ClimatePredictionsDE

### Model Comparison Toolbox @ foote
load mct module

[menz@login01: ~]> module use /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/envs/lmod
[menz@login01: ~]> module load mct
                        

usage Unified CLI:

[menz@login01: ~]> mct ...
                                
General settings:

settings.py
                                
Dataset definition:

dataset_list.py
                                
### Model Comparison Toolbox @ foote
display help

[menz@login01: ~]> mct --help
usage: mct [-h] [-p PLOT_TYPE] [-v VARIABLE] [-ts TIME_SET] [-rtf REF_TIMEFRAME] [-etf EVA_TIMEFRAME] [-d DATASET_LIST] [-o FNAME_OUT] [-dom DOMAIN_NAME] [-lcheck] [-zlevel Z_LEVEL]
           [-g GRID_NAME] [-ls] [-dpl DIST_PLOT_LAYOUT] [-xlim XLIM] [-figsize FIGSIZE] [-smp] [-lt LEGEND_TYPE] [-ylim YLIM] [-nolaxis] [-noraxis] [-freq FREQUENCY] [-stat STAT_TYPE]
           [-time-boot-stat TIME_DIM_BOOT_STAT] [-model-boot-stat MODEL_DIM_BOOT_STAT] [-ref-years REF_YEARS] [-me MAP_EXTENT] [-xlabel XLABEL] [-ylabel YLABEL]

optional arguments:
  -p PLOT_TYPE, --ptype PLOT_TYPE, --plottype PLOT_TYPE
                        Type of plot to create (default: map)
  -v VARIABLE, --variable VARIABLE
                        Climate variable to plot (default: tas)
  -ts TIME_SET, --timeset TIME_SET
                        Season to plot [DJF, MAM, AMJJAS, etc.] (default: annual)
  -rtf REF_TIMEFRAME, --reftimeframe REF_TIMEFRAME, --RefTimeFrame REF_TIMEFRAME
                        Reference timeframe [YYYY-MM-DD,YYYY-MM-DD] (default: 1971-01-01,2000-12-31)
  -etf EVA_TIMEFRAME, --evafimeframe EVA_TIMEFRAME, --EvaTimeFrame EVA_TIMEFRAME
                        Evaluation timeframe [YYYY-MM-DD,YYYY-MM-DD] (default: 2071-01-01,2100-12-31)
  -d DATASET_LIST, --data DATASET_LIST, --dataset DATASET_LIST
                        Comma seperated list of datasets [use ISIMIPFastTrack_rcp26, ISIMIPFastTrack_rcp85, ISIMIP2b_rcp26, ISIMIP2b_rcp85, ISIMIP3b_ssp126, ISIMIP3b_ssp370,
                        ISIMIP3b_ssp585, CMIP6-ISIMIP3b_ssp126, CMIP6-ISIMIP3b_ssp370, CMIP6-ISIMIP3b_ssp585, CMIP3_sresb1, CMIP3_sresa1b, CMIP3_sresa2, CMIP5_rcp26, CMIP5_rcp45,
                        CMIP5_rcp85, CMIP6_ssp119, CMIP6_ssp126, CMIP6_ssp370, CMIP6_ssp585, CMIP6_ssp585_ECMWF, CMIP6_ssp585_Canada, CMIP6_ssp585_GFS, CMIP6_ssp585_UK, CMIP6_ssp585_INM,
                        CMIP6_ssp585_IPSL, CMIP6_ssp585_MIROC, CMIP6_ssp585_UCLA, CMIP6_ssp585_GFDL, CMIP6_ssp585_UA, Germany_esd_cmip5_rcp26, Germany_esd_cmip5_rcp85,
                        Germany_esd_driver_cmip5_rcp26, Germany_esd_driver_cmip5_rcp85, Germany_STARS-PIK3_rcp26, Germany_STARS-PIK3_rcp85, Germany_episodes_cmip5_rcp26,
                        Germany_episodes_cmip5_rcp85, Germany_episodes_cmip6_ssp126, Germany_episodes_cmip6_ssp585, CORDEX-EUR11_rcm_cmip5_rcp26, CORDEX-EUR11_rcm_cmip5_rcp45, CORDEX-
                        EUR11_rcm_cmip5_rcp85, CORDEX-EUR11_rcm_driver_cmip5_rcp26, CORDEX-EUR11_rcm_driver_cmip5_rcp45, CORDEX-EUR11_rcm_driver_cmip5_rcp85, CORDEX-
                        EUR11_rcm_cmip5_isimip3ba_v1_rcp26, CORDEX-EUR11_rcm_cmip5_isimip3ba_v1_rcp45, CORDEX-EUR11_rcm_cmip5_isimip3ba_v1_rcp85, CORDEX-MNA22_rcp45, CORDEX-MNA22_rcp85,
                        CORDEX-MNA22_isimip3ba_rcp45, CORDEX-MNA22_isimip3ba_rcp85, CORDEX-MNA22_isimip3ba_rcp45_near_east, CORDEX-MNA22_isimip3ba_rcp85_near_east, CORDEX-MNA44_rcp26,
                        CORDEX-MNA44_rcp45, CORDEX-MNA44_rcp85, CORDEX-MNA44_isimip3ba_rcp26, CORDEX-MNA44_isimip3ba_rcp45, CORDEX-MNA44_isimip3ba_rcp85, CORDEX-
                        MNA44_isimip3ba_rcp26_near_east, CORDEX-MNA44_isimip3ba_rcp45_near_east, CORDEX-MNA44_isimip3ba_rcp85_near_east, DWD-Referenzensemble_rcm_cmip5_rcp26, DWD-
                        Referenzensemble_rcm_cmip5_rcp45, DWD-Referenzensemble_rcm_cmip5_rcp85, MDK_rcp26_raw, MDK_rcp45_raw, MDK_rcp85_raw, MDK_rcp26_isimip3ba, MDK_rcp45_isimip3ba,
                        MDK_rcp85_isimip3ba, GDDP-CMIP6_ssp126, GDDP-CMIP6_ssp245, GDDP-CMIP6_ssp370, GDDP-CMIP6_ssp585, decadal_forecast_ClimatePredictionsDE_dhc2021,
                        decadal_forecast_ClimatePredictionsDE_dfc2022, E-OBS_pre1950, E-OBS_v19.0eHOM, E-OBS_v19.0e, E-OBS_v20.0e, E-OBS_v21.0e, E-OBS_v22.0e, E-OBS_v23.1e, E-OBS_v24.0e,
                        E-OBS_v25.0e, E-OBS_v27.0e, E-OBS_v28.0e, E-OBS_v29.0e, CRU-TS_v4.04, CRU-TS_v4.05, CRU-TS_v4.06, CRU-TS_v4.07, Berkeley-Earth, MSWEP_v1.4, GSWP3_v1.09, W5E5_v1.0,
                        W5E5_v2.0, WFDE5_v2.0, WFD-EI, WFD-ERA40, PGF, CHIRPS-v2.0, GPCC_daily_1.0deg, GPCC_monthly_0.25deg, GPCP_v2.3, CPC_v1.0, TRMM-3B42, ERA5, ERA5-Land, NCEP-NCAR_R1,
                        NCEP-DOE_R2, NOAA-CIRES-DOE_20th_century_V3, Germany_JKI-DWD-PIK, HYRAS_v4.0, HYRAS_v5.0] (default: CMIP5_rcp26,CMIP5_rcp85,CMIP6_ssp126,CMIP6_ssp585)
  -o FNAME_OUT, --out FNAME_OUT, --fnameout FNAME_OUT
                        Filename of the plot (default: ./pictures/plot.png)
  -dom DOMAIN_NAME, --domain DOMAIN_NAME, --domainname DOMAIN_NAME, --DomainName DOMAIN_NAME
                        Domain to analyse (a country/state or one of settings.predefined_domains). For map plot this will be only used to highlight the domain. (default: global)
  -lcheck               Switch to deactivate consistency checks of .pickle files, to speedup calculations (default: False)
  -zlevel Z_LEVEL       Select a specific z_level for z coordinate (i.e. scale for spi/spei or return_period for gevintensity) (default: None)
  -g GRID_NAME, --grid GRID_NAME, --Grid GRID_NAME
                        Grid to plot the data on [use one of [reg-01, reg-05, reg-10, reg-20, reg-005, cordex-eur11, cordex-was22, cordex-was44, cordex-mna22, cordex-mna44]] (default:
                        reg-05)
  -ls, --lsignificance   Switch to activate identification of significance levels (default: False)
  -dpl DIST_PLOT_LAYOUT, --distplotlayout DIST_PLOT_LAYOUT, --DistPlotLayout DIST_PLOT_LAYOUT, --distributionplotlayout DIST_PLOT_LAYOUT, --DistributionPlotLayout DIST_PLOT_LAYOUT
                        How to visualize the marginal distributions [use box, violin or none] (default: box)
  -xlim XLIM            Limits of x-axis (default: None)
  -figsize FIGSIZE, --figsize FIGSIZE
                        Size of the final figure (in inches). (default: None)
  -smp, --singlemodelplot, --SingleModelPlot
                        Add time series of single models to the plot (default: False)
  -lt LEGEND_TYPE, --legend-type LEGEND_TYPE, --legendtype LEGEND_TYPE
                        Specification of the legend (no (default), within or separate) (default: no)
  -ylim YLIM            Limits of y-axis (default: None)
  -nolaxis              Switch to deactive left y-axis (default: False)
  -noraxis              Switch to deactive right y-axis (default: False)
  -freq FREQUENCY, --frequency FREQUENCY
                        Frequency of data to read. (default: None)
  -stat STAT_TYPE, --stattype STAT_TYPE, --StatType STAT_TYPE
                        Statistic to calculate across time_set (default: None)
  -time-boot-stat TIME_DIM_BOOT_STAT, --time-dim-boot-stat TIME_DIM_BOOT_STAT, --time-dim-bootstrap-statistic TIME_DIM_BOOT_STAT
                        Statistic to calculate along time dimension during bootstrapping (default: None)
  -model-boot-stat MODEL_DIM_BOOT_STAT, --model-dim-boot-stat MODEL_DIM_BOOT_STAT, --model-dim-bootstrap-statistic MODEL_DIM_BOOT_STAT
                        Statistic to calculate along model dimension during bootstrapping (default: None)
  -ref-years REF_YEARS, --ref-years REF_YEARS
                        Comma seperated list of reference years to plot. (default: None)
  -me MAP_EXTENT, --map-extent MAP_EXTENT
                        Boundaries of map to plot or restirct spatial analysis (default: global)
  -xlabel XLABEL        Label of x-axis (default: None)
  -ylabel YLABEL        Label of y-axis (default: None)
                        
### Model Comparison Toolbox @ foote

[menz@login01: ~]> mct -p map -v tas -rtf '2071-01-01,2100-12-31' -etf None -d CMIP6_ssp585 -g reg-20 -me Europe

  %Status: datasets considered are CMIP6_ssp585
  %Status: plot type: map
  %Status: plot subtype: absolut
  %Status: variable:  ['tas']
  %Status: time_set:  annual
  %Status: domain:    global
  %Status: map extent:    Europe
  %Status: grid:    reg-20
  %Status: fname_out: ./pictures/plot.png
  %Status: reference timeframe: 2071-01-01 to 2100-12-31

  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP6_ssp585_map_Amon-in_annual-mean-out_20710101-21001231.pickle.
  %Status:       found unequal grids, interpolating to common grid to calculate ensemble statistics
  %Status:       interpolating: - - TaiESM1-r1i1p1f1
  %Status:       interpolating: - - AWI-CM-1-1-MR-r1i1p1f1
  %Status:       interpolating: - - BCC-CSM2-MR-r1i1p1f1
  %Status:       interpolating: - - CAMS-CSM1-0-r1i1p1f1
  %Status:       interpolating: - - FGOALS-f3-L-r1i1p1f1
  %Status:       interpolating: - - FGOALS-g3-r1i1p1f1
  %Status:       interpolating: - - CanESM5-CanOE-r1i1p2f1
  %Status:       interpolating: - - CanESM5-r1i1p1f1
  %Status:       interpolating: - - CanESM5-r1i1p2f1
  %Status:       interpolating: - - CanESM5-r2i1p1f1
  %Status:       interpolating: - - IITM-ESM-r1i1p1f1
  %Status:       interpolating: - - CMCC-CM2-SR5-r1i1p1f1
  %Status:       interpolating: - - CMCC-ESM2-r1i1p1f1
  %Status:       interpolating: - - CNRM-CM6-1-r1i1p1f2
  %Status:       interpolating: - - CNRM-ESM2-1-r1i1p1f2
  %Status:       interpolating: - - ACCESS-ESM1-5-r1i1p1f1
  %Status:       interpolating: - - ACCESS-CM2-r1i1p1f1
  %Status:       interpolating: - - E3SM-1-1-r1i1p1f1
  %Status:       interpolating: - - EC-Earth3-CC-r1i1p1f1
  %Status:       interpolating: - - EC-Earth3-r1i1p1f1
  %Status:       interpolating: - - EC-Earth3-r4i1p1f1
  %Status:       interpolating: - - EC-Earth3-Veg-r1i1p1f1
  %Status:       interpolating: - - EC-Earth3-Veg-LR-r1i1p1f1
  %Status:       interpolating: - - FIO-ESM-2-0-r1i1p1f1
  %Status:       interpolating: - - INM-CM4-8-r1i1p1f1
  %Status:       interpolating: - - INM-CM5-0-r1i1p1f1
  %Status:       interpolating: - - IPSL-CM6A-LR-r1i1p1f1
  %Status:       interpolating: - - MIROC6-r1i1p1f1
  %Status:       interpolating: - - MIROC-ES2L-r1i1p1f2
  %Status:       interpolating: - - HadGEM3-GC31-LL-r1i1p1f3
  %Status:       interpolating: - - UKESM1-0-LL-r1i1p1f2
  %Status:       interpolating: - - MPI-ESM1-2-HR-r1i1p1f1
  %Status:       interpolating: - - MPI-ESM1-2-HR-r2i1p1f1
  %Status:       interpolating: - - MPI-ESM1-2-LR-r1i1p1f1
  %Status:       interpolating: - - MRI-ESM2-0-r1i1p1f1
  %Status:       interpolating: - - GISS-E2-1-G-r1i1p3f1
  %Status:       interpolating: - - CESM2-r1i1p1f1
  %Status:       interpolating: - - CESM2-WACCM-r1i1p1f1
  %Status:       interpolating: - - NorESM2-LM-r1i1p1f1
  %Status:       interpolating: - - NorESM2-MM-r1i1p1f1
  %Status:       interpolating: - - KACE-1-0-G-r1i1p1f1
  %Status:       interpolating: - - GFDL-CM4-r1i1p1f1
  %Status:       interpolating: - - GFDL-ESM4-r1i1p1f1
  %Status:       interpolating: - - NESM3-r1i1p1f1
  %Status:       interpolating: - - MCM-UA-1-0-r1i1p1f2
  %Status:   plotting CMIP6_ssp585
  %Status: plotting map
  %Status: plot range: (-5.919135, 29.385233)
                        
### Model Comparison Toolbox @ foote

[menz@login01: ~]> mct -p time_series -v tas -rtf '1971-01-01,2000-12-31' -etf '2071-01-01,2100-12-31' -d CMIP6_ssp585 --domain Europe

  %Status: datasets considered are CMIP6_ssp585
  %Status: plot type: time series
  %Status: plot subtype: change
  %Status: variable:  tas
  %Status: time_set:  annual
  %Status: domain:    Europe
  %Status: fname_out: ./pictures/plot.png
  %Status: Full time frame considered (RefDateStart to EvaDateEnd): 1971-01-01 to 2100-12-31

  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP6_ssp585_Europe-mean_Amon-in_annual-mean-out_19710101-21001231.pickle.
  %Status:   calculating ensemble statistics.
  %Status: ploting line
  %Status: statistics of dataset: CMIP6_ssp585
                 nobs: 41000.0000
                 mean:     7.5149
               median:     7.3245
                  min:     3.3569
                  max:    13.4823
                  std:     1.8765
                 q-01:     3.8042
                 q-05:     4.9168
                 q-10:     5.3358
                 q-25:     6.0859
                 q-50:     7.3245
                 q-75:     8.5602
                 q-90:     9.9821
                 q-95:    10.7485
                 q-99:    12.7593
                        
### Model Comparison Toolbox @ foote

[menz@login03: ~/Downloads]> mct -p spatial_pdf -v tas -rtf '1981-01-01,2010-12-31' -etf None -d CORDEX-EUR11_rcm_cmip5_rcp85,E-OBS_v29.0e --domain Germany

  %Status: datasets considered are CORDEX-EUR11_rcm_cmip5_rcp85, E-OBS_v29.0e
  %Status: plot type: spatial_pdf
  %Status: plot subtype: absolut
  %Status: variable:  tas
  %Status: time_set:  annual
  %Status: domain:    Germany
  %Status: fname_out: ./pictures/plot.png
  %Status: reference timeframe: 1981-01-01 to 2010-12-31

  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CORDEX-EUR11_rcm_cmip5_rcp85_map_day-in_annual-mean-out_19810101-20101231.pickle.
  %Status:       found unequal grids, interpolating to common grid to calculate ensemble statistics
  %Status:       interpolating: CLMcom-CCLM4-8-17-v1 - CCCma-CanESM2-r1i1p1
  %Status:       interpolating: CLMcom-CCLM4-8-17-v1 - CNRM-CERFACS-CNRM-CM5-r1i1p1
  %Status:       interpolating: CLMcom-CCLM4-8-17-v1 - ICHEC-EC-EARTH-r12i1p1
  %Status:       interpolating: CLMcom-CCLM4-8-17-v1 - MIROC-MIROC5-r1i1p1
  %Status:       interpolating: CLMcom-CCLM4-8-17-v1 - MOHC-HadGEM2-ES-r1i1p1
  %Status:       interpolating: CLMcom-CCLM4-8-17-v1 - MPI-M-MPI-ESM-LR-r1i1p1
  %Status:       interpolating: DMI-HIRHAM5-v1 - CNRM-CERFACS-CNRM-CM5-r1i1p1
  %Status:       interpolating: DMI-HIRHAM5-v2 - CNRM-CERFACS-CNRM-CM5-r1i1p1
  %Status:       interpolating: DMI-HIRHAM5-v1 - ICHEC-EC-EARTH-r12i1p1
  %Status:       interpolating: DMI-HIRHAM5-v1 - ICHEC-EC-EARTH-r1i1p1
  %Status:       interpolating: DMI-HIRHAM5-v1 - ICHEC-EC-EARTH-r3i1p1
  %Status:       interpolating: DMI-HIRHAM5-v1 - MOHC-HadGEM2-ES-r1i1p1
  %Status:       interpolating: DMI-HIRHAM5-v2 - NCC-NorESM1-M-r1i1p1
  %Status:       interpolating: GERICS-REMO2015-v1 - CCCma-CanESM2-r1i1p1
  %Status:       interpolating: GERICS-REMO2015-v1 - CNRM-CERFACS-CNRM-CM5-r1i1p1
  %Status:       interpolating: GERICS-REMO2015-v1 - ICHEC-EC-EARTH-r12i1p1
  %Status:       interpolating: GERICS-REMO2015-v1 - MIROC-MIROC5-r1i1p1
  %Status:       interpolating: GERICS-REMO2015-v1 - MOHC-HadGEM2-ES-r1i1p1
  %Status:       interpolating: GERICS-REMO2015-v1 - NCC-NorESM1-M-r1i1p1
  %Status:       interpolating: IPSL-INERIS-WRF331F-v1 - IPSL-IPSL-CM5A-MR-r1i1p1
  %Status:       interpolating: KNMI-RACMO22E-v2 - CNRM-CERFACS-CNRM-CM5-r1i1p1
  %Status:       interpolating: KNMI-RACMO22E-v1 - ICHEC-EC-EARTH-r12i1p1
  %Status:       interpolating: KNMI-RACMO22E-v1 - ICHEC-EC-EARTH-r1i1p1
  %Status:       interpolating: KNMI-RACMO22E-v1 - ICHEC-EC-EARTH-r3i1p1
  %Status:       interpolating: KNMI-RACMO22E-v2 - MOHC-HadGEM2-ES-r1i1p1
  %Status:       interpolating: MPI-CSC-REMO2009-v1 - MPI-M-MPI-ESM-LR-r1i1p1
  %Status:       interpolating: MPI-CSC-REMO2009-v1 - MPI-M-MPI-ESM-LR-r2i1p1
  %Status:       interpolating: SMHI-RCA4-v1 - CNRM-CERFACS-CNRM-CM5-r1i1p1
  %Status:       interpolating: SMHI-RCA4-v1 - ICHEC-EC-EARTH-r12i1p1
  %Status:       interpolating: SMHI-RCA4-v1 - ICHEC-EC-EARTH-r3i1p1
  %Status:       interpolating: SMHI-RCA4-v1 - IPSL-IPSL-CM5A-MR-r1i1p1
  %Status:       interpolating: SMHI-RCA4-v1 - MOHC-HadGEM2-ES-r1i1p1
  %Status:       interpolating: SMHI-RCA4-v1a - MPI-M-MPI-ESM-LR-r1i1p1
  %Status:       interpolating: SMHI-RCA4-v1 - NCC-NorESM1-M-r1i1p1
  %Status:       interpolating: UHOH-WRF361H-v1 - ICHEC-EC-EARTH-r1i1p1
  %Status:       interpolating: UHOH-WRF361H-v1 - MOHC-HadGEM2-ES-r1i1p1
  %Status:       interpolating: UHOH-WRF361H-v1 - MPI-M-MPI-ESM-LR-r1i1p1
  %Status:       number of grid-points covering the domain: 224
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_E-OBS_v29.0e_map_day-in_annual-mean-out_19810101-20101231.pickle.
  %Status:       interpolating: evaluation-v29.0e - E-OBS-r1i1p1
  %Status:       number of grid-points covering the domain: 224
  %Status: ploting pdf
  %Status: statistics of dataset: CORDEX-EUR11_rcm_cmip5_rcp85
                 nobs:   224.0000
                 mean:     8.1604
               median:     8.4550
                  min:    -0.0998
                  max:    10.0244
                  std:     1.3362
                 q-01:     1.8178
                 q-05:     6.4034
                 q-10:     6.8781
                 q-25:     7.8475
                 q-50:     8.4550
                 q-75:     8.8727
                 q-90:     9.2402
                 q-95:     9.4329
                 q-99:     9.8568
  %Status: statistics of dataset: E-OBS_v29.0e
                 nobs:   209.0000
                 mean:     8.8221
               median:     9.0006
                  min:     3.0843
                  max:    10.9565
                  std:     1.0864
                 q-01:     5.5352
                 q-05:     6.9321
                 q-10:     7.6156
                 q-25:     8.4087
                 q-50:     9.0006
                 q-75:     9.4647
                 q-90:    10.0842
                 q-95:    10.3588
                 q-99:    10.8007
                        
### Model Comparison Toolbox @ foote

[menz@login03: ~/Downloads]> mct -p seasonal_cycle -v tas -rtf '1971-01-01,2000-12-31' -etf '2071-01-01,2100-12-31' -d CMIP6_ssp585 --domain Berlin
  %Warning: only daily and monthly time_set supported.

  %Status: datasets considered are CMIP6_ssp585
  %Status: plot type: seasonal
  %Status: plot subtype: change
  %Status: variable:  tas
  %Status: domain:    Berlin
  %Status: fname_out: ./pictures/plot.png
  %Status: reference timeframe: 1971-01-01 to 2000-12-31
  %Status: evaluation timeframe: 2071-01-01 to 2100-12-31

  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP6_ssp585_Berlin-mean_Amon-in_monthly-mean-out_19710101-20001231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP6_ssp585_Berlin-mean_Amon-in_monthly-mean-out_20710101-21001231.pickle.
  %Status:   calculating ensemble statistics.
  %Status: ploting seasonal cycle
                        
### Model Comparison Toolbox @ foote

[menz@login01: ~/Downloads]> mct -p diurnal_cycle -v tas -rtf '1981-01-01,2010-12-31' -etf None -d NOAA-CIRES-DOE_20th_century_V3 --domain Peru -ylim='15,25'
  %Warning: wrong time_set (annual) resetting to dc-annual.
  %Warning: diurnal cycle plot are implemented for frequency=Amon-hr only.

  %Status: datasets considered are NOAA-CIRES-DOE_20th_century_V3
  %Status: plot type: diurnal cycle
  %Status: plot subtype: absolut
  %Status: variable:  tas
  %Status: domain:    Peru
  %Status: fname_out: ./pictures/plot.png
  %Status: reference timeframe: 1981-01-01 to 2010-12-31

  %Status:   gathering metadata of NOAA-CIRES-DOE_20th_century_V3.
  %Status:   reading NOAA-CIRES-DOE_20th_century_V3.
  %Status:       reading: GCM:NOAA-CIRES-DOE_20th_century_V3, REALIZATION:, RCM:, VERSION:
  %Status:       number of grid-points covering the domain: 273
  %Status:       calculate statistic.
  %Status:           converting calendar.
  %Status:   writing to pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_NOAA-CIRES-DOE_20th_century_V3_Peru-mean_Amon-hr-in_dc-annual-mean-out_19810101-20101231.pickle.
  %Status:   calculating ensemble statistics.
  %Status: ploting diurnal cycle
                        
### Model Comparison Toolbox @ foote

[menz@login03: ~/Downloads]> mct -p bivariate -v tas,pr -rtf '1981-01-01,2010-12-31' -etf '2071-01-01,2100-12-31' -tsAMJJAS -d CMIP5_rcp26,CMIP5_rcp85,CMIP6_ssp126,CMIP6_ssp585 --domain Italy

  %Status: datasets considered are CMIP5_rcp26, CMIP5_rcp85, CMIP6_ssp126, CMIP6_ssp585
  %Status: plot type: bivariate change
  %Status: plot subtype: change
  %Status: variable-tuple:  ['tas', 'pr']
  %Status: time_set:  AMJJAS
  %Status: domain:    Italy
  %Status: fname_out: ./pictures/plot.png
  %Status: reference timeframe: 1981-01-01 to 2010-12-31
  %Status: evaluation timeframe: 2071-01-01 to 2100-12-31

  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP5_rcp26_Italy-mean_Amon-in_AMJJAS-mean-out_19810101-20101231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP5_rcp26_Italy-mean_Amon-in_AMJJAS-mean-out_20710101-21001231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/pr_CMIP5_rcp26_Italy-mean_Amon-in_AMJJAS-mean-out_19810101-20101231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/pr_CMIP5_rcp26_Italy-mean_Amon-in_AMJJAS-mean-out_20710101-21001231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP5_rcp85_Italy-mean_Amon-in_AMJJAS-mean-out_19810101-20101231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP5_rcp85_Italy-mean_Amon-in_AMJJAS-mean-out_20710101-21001231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/pr_CMIP5_rcp85_Italy-mean_Amon-in_AMJJAS-mean-out_19810101-20101231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/pr_CMIP5_rcp85_Italy-mean_Amon-in_AMJJAS-mean-out_20710101-21001231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP6_ssp126_Italy-mean_Amon-in_AMJJAS-mean-out_19810101-20101231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP6_ssp126_Italy-mean_Amon-in_AMJJAS-mean-out_20710101-21001231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/pr_CMIP6_ssp126_Italy-mean_Amon-in_AMJJAS-mean-out_19810101-20101231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/pr_CMIP6_ssp126_Italy-mean_Amon-in_AMJJAS-mean-out_20710101-21001231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP6_ssp585_Italy-mean_Amon-in_AMJJAS-mean-out_19810101-20101231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_CMIP6_ssp585_Italy-mean_Amon-in_AMJJAS-mean-out_20710101-21001231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/pr_CMIP6_ssp585_Italy-mean_Amon-in_AMJJAS-mean-out_19810101-20101231.pickle.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/pr_CMIP6_ssp585_Italy-mean_Amon-in_AMJJAS-mean-out_20710101-21001231.pickle.
  %Status: plotting bivariate
                        
### Model Comparison Toolbox @ foote

[menz@login01: ~/Downloads]> mct -p separate_years -v pr -rtf '1981-01-01,2023-12-31' -etf None -d E-OBS_v29.0e --domain Brandenburg -ref-years='2018,2020'

  %Status: datasets considered are E-OBS_v29.0e
  %Status: plot type: separate years
  %Status: plot subtype: absolut (only type supported)
  %Status: variable:  pr
  %Status: time_set:  daily
  %Status: domain:    France
  %Status: fname_out: ./pictures/plot.png
  %Status: reference timeframe: 1981-01-01 to 2023-12-31

  %Status: working on E-OBS_v29.0e.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/pr_E-OBS_v29.0e_France-mean_day-in_daily-mean-out_19810101-20231231.pickle.
  %Status:    disentangle dataset.
  %Status: ploting separate years
  %Status: return period of year 2018 (Cumulative Precipitation [$\mathrm{mm}/\mathrm{d}$] =   901.14):
  %Status:     E-OBS_v29.0e                                      : 27/43
  %Status: return period of year 2020 (Cumulative Precipitation [$\mathrm{mm}/\mathrm{d}$] =   826.46):
  %Status:     E-OBS_v29.0e                                      : 16/43
                        
### Model Comparison Toolbox @ foote

[menz@login03: ~/Downloads]> mct -p cdf -v tas -rtf '1981-01-01,2010-12-31' -etf None -d E-OBS_v20.0e,E-OBS_v21.0e,E-OBS_v22.0e,E-OBS_v23.1e,E-OBS_v25.0e,E-OBS_v27.0e,E-OBS_v29.0e --domain Germany -lt no
  %Warning: only absolut plot subtype for the evaluation timeframe (etf) supported for cdf plots!

  %Status: datasets considered are E-OBS_v20.0e, E-OBS_v21.0e, E-OBS_v22.0e, E-OBS_v23.1e, E-OBS_v25.0e, E-OBS_v27.0e, E-OBS_v29.0e
  %Status: plot type: cdf plot
  %Status: plot subtype: absolut
  %Status: variable:  tas
  %Status: time_set:  annual
  %Status: frequency: day
  %Status: domain:    Germany
  %Status: fname_out: ./pictures/plot.png
  %Status: evaluation timeframe: 1981-01-01 to 2010-12-31

  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_E-OBS_v20.0e_Germany-mean_day-in_annual-mean-out_19810101-20101231.pickle.
  %Status:    disentangle dataset.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_E-OBS_v21.0e_Germany-mean_day-in_annual-mean-out_19810101-20101231.pickle.
  %Status:    disentangle dataset.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_E-OBS_v22.0e_Germany-mean_day-in_annual-mean-out_19810101-20101231.pickle.
  %Status:    disentangle dataset.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_E-OBS_v23.1e_Germany-mean_day-in_annual-mean-out_19810101-20101231.pickle.
  %Status:    disentangle dataset.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_E-OBS_v25.0e_Germany-mean_day-in_annual-mean-out_19810101-20101231.pickle.
  %Status:    disentangle dataset.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_E-OBS_v27.0e_Germany-mean_day-in_annual-mean-out_19810101-20101231.pickle.
  %Status:    disentangle dataset.
  %Status:   reading from pickle /p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data/tas_E-OBS_v29.0e_Germany-mean_day-in_annual-mean-out_19810101-20101231.pickle.
  %Status:    disentangle dataset.
  %Status: ploting cdf
  %Status: statistics of dataset: E-OBS_v20.0e
                 nobs:    30.0000
                 mean:     8.8718
               median:     9.0424
                  min:     7.1940
                  max:     9.8509
                  std:     0.7459
                 q-01:     7.2667
                 q-05:     7.4522
                 q-10:     7.8141
                 q-25:     8.4113
                 q-50:     9.0424
                 q-75:     9.4593
                 q-90:     9.5834
                 q-95:     9.7961
                 q-99:     9.8477
  %Status: statistics of dataset: E-OBS_v21.0e
                 nobs:    30.0000
                 mean:     8.8713
               median:     9.0416
                  min:     7.1935
                  max:     9.8503
                  std:     0.7461
                 q-01:     7.2661
                 q-05:     7.4515
                 q-10:     7.8138
                 q-25:     8.4114
                 q-50:     9.0416
                 q-75:     9.4590
                 q-90:     9.5833
                 q-95:     9.7962
                 q-99:     9.8473
  %Status: statistics of dataset: E-OBS_v22.0e
                 nobs:    30.0000
                 mean:     8.8763
               median:     9.0474
                  min:     7.1976
                  max:     9.8517
                  std:     0.7453
                 q-01:     7.2705
                 q-05:     7.4564
                 q-10:     7.8152
                 q-25:     8.4202
                 q-50:     9.0474
                 q-75:     9.4702
                 q-90:     9.5844
                 q-95:     9.7951
                 q-99:     9.8488
  %Status: statistics of dataset: E-OBS_v23.1e
                 nobs:    30.0000
                 mean:     8.8737
               median:     9.0446
                  min:     7.1949
                  max:     9.8515
                  std:     0.7455
                 q-01:     7.2682
                 q-05:     7.4549
                 q-10:     7.8153
                 q-25:     8.4147
                 q-50:     9.0446
                 q-75:     9.4617
                 q-90:     9.5847
                 q-95:     9.7978
                 q-99:     9.8487
  %Status: statistics of dataset: E-OBS_v25.0e
                 nobs:    30.0000
                 mean:     8.8918
               median:     9.0580
                  min:     7.2018
                  max:     9.8774
                  std:     0.7494
                 q-01:     7.2727
                 q-05:     7.4595
                 q-10:     7.8316
                 q-25:     8.4537
                 q-50:     9.0580
                 q-75:     9.4911
                 q-90:     9.6178
                 q-95:     9.8114
                 q-99:     9.8744
  %Status: statistics of dataset: E-OBS_v27.0e
                 nobs:    30.0000
                 mean:     8.8949
               median:     9.0608
                  min:     7.2042
                  max:     9.8903
                  std:     0.7515
                 q-01:     7.2742
                 q-05:     7.4578
                 q-10:     7.8384
                 q-25:     8.4526
                 q-50:     9.0608
                 q-75:     9.4950
                 q-90:     9.6274
                 q-95:     9.8137
                 q-99:     9.8848
  %Status: statistics of dataset: E-OBS_v29.0e
                 nobs:    30.0000
                 mean:     8.8985
               median:     9.0676
                  min:     7.2051
                  max:     9.8899
                  std:     0.7503
                 q-01:     7.2776
                 q-05:     7.4665
                 q-10:     7.8384
                 q-25:     8.4546
                 q-50:     9.0676
                 q-75:     9.4982
                 q-90:     9.6270
                 q-95:     9.8162
                 q-99:     9.8855
                        
### Model Comparison Toolbox @ foote - When executed first time mct will read netcdf files and pre-processes them into a single file (pickle) - Merging data from different netcdf files - Selecting time frame to analyse - Selecting domain and spatial averaging - Calculation of statistical properties (e.g., seasonal averaging) - Merging single ensemble members into single data object - Save results into pickle format (python native) in pre-defined path - Later execution with the same settings will use the pickle file to save time
### Model Comparison Toolbox @ foote : settings.py

# main path definitions ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
pickle_path = '/p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/pickle_data'
domain_path = '/p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/domain_data'
netcdf_path = '/p/projects/ou/rd2/hydroclimatic_risks/model_comparison_toolbox/data/netcdf_data'

...

# domain settings ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
predefined_domains = {
    'central-asia-box': [np.vstack((
                                   # lon vertices  lat vertices
                                   (45, 90, 90, 45, 45), (25, 25, 60, 60, 25)))],
    'global': [np.vstack((
                         # lon vertices  lat vertices
                         (-180, 180, 180, -180, -180),
                         # lat vertices
                         (-90, -90, 90, 90, -90)))],
    'Germany-box': [np.vstack((
                         # lon vertices  lat vertices
                         (4.0, 17.5, 17.5, 4.0, 4.0), (45.5, 45.5, 56.5, 56.5, 45.5)))],
    ...

    'Tarim': spatial_tools.get_domain_bounds(os.path.join(domain_path, 'Tarim/sumario_project_tarim_basin.dat'),
                                             encoding='utf-8'),
    'Guanting': spatial_tools.get_domain_bounds(os.path.join(domain_path, 'Guanting/guanting.dat'),
                                                encoding='utf-8'),
    'Spree': spatial_tools.get_domain_bounds(os.path.join(domain_path, 'Spree/Spree_EZG1_UBA.shp'),
                                             encoding='windows-1252'),
    }


# grid definitions +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
grid_lib_list = {**{'reg-{0:02d}'.format(res): {'x': np.arange(-180+res/20.,  180., res/10),
                                                'y': np.arange(-90.+res/20.,   90., res/10.),
                                                'crs': CRS.from_epsg('4326')} for res in [1, 5, 10, 20]},
                 **{'reg-{0:03d}'.format(res): {'x': np.arange(-180+res/200., 180., res/100),
                                                'y': np.arange(-90.+res/200.,  90., res/100.),
                                                'crs': CRS.from_epsg('4326')} for res in [5]},
                 'cordex-eur11': {'x': np.arange(-28.43+0.11/2., 18.21, 0.11),
                                  'y': np.arange(-23.43+0.11/2., 21.89, 0.11),
                                  'crs': cordex_eur_crs},
                 'cordex-was22': {'x': np.arange(-32.34+0.22/2., 48.18, 0.22),
                                  'y': np.arange(-21.78+0.22/2., 31.02, 0.22),
                                  'crs': cordex_was_crs},
                 'cordex-was44': {'x': np.arange(-32.34+0.44/2., 52.58, 0.44),
                                  'y': np.arange(-21.78+0.44/2., 35.42, 0.44),
                                  'crs': cordex_was_crs},
                 'cordex-mna22': {'x': np.arange(-26.62+0.22/2., 75.46, 0.22),
                                  'y': np.arange(-6.82+0.22/2., 45.1, 0.22),
                                  'crs': cordex_mna_crs},
                 'cordex-mna44': {'x': np.arange(-26.62+0.44/2., 75.46, 0.44),
                                  'y': np.arange(-6.82+0.44/2., 45.1, 0.44),
                                  'crs': cordex_mna_crs},
                 }

# bounds of the map plot +++++++++++++++++++++++++++++++++++++++++++++++++++++++
map_extent = {'Germany':  {'xy': [5, 16, 46, 57], 'crs': CRS.from_epsg('4326'), 'x_offset': 0, 'y_offset': 0},
              'Europe-large':  {'xy': [-11, 39, 35, 71], 'crs': CRS.from_epsg('4326'), 'x_offset': 0, 'y_offset': 0},
              'Europe-small':  {'xy': [-11, 39, 35, 65], 'crs': CRS.from_epsg('4326'), 'x_offset': 0, 'y_offset': 0},
              'global': {'xy': [-180, 180, -89, 89], 'crs': CRS.from_epsg('4326'), 'x_offset': 0, 'y_offset': 0},
              'Africa': {'xy': [-20, 55, -37, 40], 'crs': CRS.from_epsg('4326'), 'x_offset': 2, 'y_offset': 2},
              'Antarctica': {'xy': [-180, 180, -90, -55], 'crs': CRS.from_epsg('4326'), 'x_offset': 0, 'y_offset': 0},
              'Asia': {'xy': [25, 178, -18, 82], 'crs': CRS.from_epsg('4326'), 'x_offset': 2, 'y_offset': 2},
              'Australia': {'xy': [110, 155, -45, -9], 'crs': CRS.from_epsg('4326'), 'x_offset': 2, 'y_offset': 2},
              'Europe': {'xy': [-21, 46, 34, 72], 'crs': CRS.from_epsg('4326'), 'x_offset': 2, 'y_offset': 2},
              'Kenya': {'xy': [33, 42, -6, 6], 'crs': CRS.from_epsg('4326'), 'x_offset': 1, 'y_offset': 1},
              'Zimbabwe': {'xy': [24, 34, -23, -15], 'crs': CRS.from_epsg('4326'), 'x_offset': 1, 'y_offset': 1},
              'Ghana': {'xy': [-4, 1, 4, 12], 'crs': CRS.from_epsg('4326'), 'x_offset': 1, 'y_offset': 1},
              'North-America': {'xy': [-170, -50, 10, 80], 'crs': CRS.from_epsg('4326'), 'x_offset': 2, 'y_offset': 2},
              'South-America': {'xy': [-90, -30, -60, 20], 'crs': CRS.from_epsg('4326'), 'x_offset': 2, 'y_offset': 2},
              'South-Asia': {'xy': [65, 130, -12, 56], 'crs': CRS.from_epsg('4326'), 'x_offset': 0, 'y_offset': 0},
              'Maldives': {'xy': [72.6930, 73.7740, 0.2555, 7.1019], 'crs': CRS.from_epsg('4326'),
                           'x_offset': 3, 'y_offset': 0.5},
              'Guadalupe': {'xy': [-119, -117, 28, 30], 'crs': CRS.from_epsg('4326'),
                            'x_offset': 1, 'y_offset': 1},
              }

map_plot_projection = ccrs.PlateCarree()
# map_plot_projection = None

# cities to add to map_plot ++++++++++++++++++++++++++++++++++++++++++++++++++++
# cities = ['Amman','Jerusalem','Damascus','Beirut']
cities = None

# background layer for map_plot ++++++++++++++++++++++++++++++++++++++++++++++++
# scale defines resolution of the backgroupd map (higher values mean higher resolution)
# bg_layer = {'tile': cimg_tiles.GoogleTiles(style='satellite'), 'scale': 6}
bg_layer = None

# remove countries from map ++++++++++++++++++++++++++++++++++++++++++++++++++++
# remove_from_map = ['Turkey', 'Algeria', 'Morocco', 'Tunisia', 'Egypt',
#                    'Libya', 'Syria', 'Israel', 'Lebanon', 'Jordan', 'Russian Federation']
# remove_from_map = ['Turkey', 'Algeria', 'Morocco', 'Tunisia', 'Egypt',
#                    'Libya', 'Syria', 'Israel', 'Lebanon', 'Jordan']
remove_from_map = []

# line and bivariate plot ranges +++++++++++++++++++++++++++++++++++++++++++++++
ylim = {
        'tasmin': [-3, 7],
        'tasmax': [-3, 7],
        'tas': [-3, 7],
       }

# map plot color and ranges ++++++++++++++++++++++++++++++++++++++++++++++++++++
cmap = {
        'tasmin': {'absolut': mpl.cm.turbo,
                   'bias': mpl.cm.RdBu_r,
                   'change': mpl.cm.RdBu_r},
        'tasmax': {'absolut': mpl.cm.turbo,
                   'bias': mpl.cm.RdBu_r,
                   'change': mpl.cm.RdBu_r},
        'tas': {'absolut': mpl.cm.rainbow,
                'bias': mpl.cm.RdBu_r,
                'change': mpl.cm.RdBu_r},
       }

clevs = {
        'tasmin': {'absolut': {'levels': np.arange(8.0, 20.0 + 0.1, 0.1),
                               'ticks': np.arange(8.0, 20.0 + 2, 2),
                               'ticklabels': np.arange(8.0, 20.0 + 2, 2),
                               'extend': 'both'},
                   'bias': {'levels': np.arange(-4.0, 4.0 + 0.1, 0.1),
                            'ticks': np.arange(-4.0, 4.0 + 1.0, 1.0),
                            'ticklabels': np.arange(-4, 4 + 1, 1),
                            'extend': 'both'},
                   'change': {'levels': np.arange(-4.0, 4.0 + 0.1, 0.1),
                              'ticks': np.arange(-4.0, 4.0 + 1.0, 1.0),
                              'ticklabels': np.arange(-4, 4 + 1, 1),
                              'extend': 'both'}},
        'tasmax': {'absolut': {'levels': np.arange(8.0, 20.0 + 0.1, 0.1),
                               'ticks': np.arange(8.0, 20.0 + 2, 2),
                               'ticklabels': np.arange(8.0, 20.0 + 2, 2),
                               'extend': 'both'},
                   'bias': {'levels': np.arange(-4.0, 4.0 + 0.1, 0.1),
                            'ticks': np.arange(-4.0, 4.0 + 1.0, 1.0),
                            'ticklabels': np.arange(-4, 4 + 1, 1),
                            'extend': 'both'},
                   'change': {'levels': np.arange(-4.0, 4.0 + 0.1, 0.1),
                              'ticks': np.arange(-4.0, 4.0 + 1.0, 1.0),
                              'ticklabels': np.arange(-4, 4 + 1, 1),
                              'extend': 'both'}},
        'tas': {'absolut': {'levels': np.arange(2.0, 16.0 + 0.1, 0.1),
                            'ticks': np.arange(2.0, 16.0 + 4, 4),
                            'ticklabels': np.arange(2.0, 16.0 + 4, 4),
                            'extend': 'both'},
                'bias': {'levels': np.arange(-4.0, 4.0 + 0.1, 0.1),
                         'ticks': np.arange(-4.0, 4.0 + 1.0, 1.0),
                         'ticklabels': np.arange(-4, 4 + 1, 1),
                         'extend': 'both'},
                'change': {'levels': np.arange(-7.0, 7.0 + 0.1, 0.1),
                           'ticks': np.arange(-7.0, 7.0 + 2.0, 2.0),
                           'ticklabels': np.arange(-7, 7 + 2, 2),
                           'extend': 'both'}},
        }

# legend for line plots, bivariate plotas and maps +++++++++++++++++++++++++++++
legend = {
          'tasmin': {'absolut': r'Minimum Temperature [${}^\circ\mathrm{C}$]',
                     'bias': r'Minimum Temperature Bias [$\mathrm{K}$]',
                     'change': r'Minimum Temperature Change [$\mathrm{K}$]'},
          'tasmax': {'absolut': r'Maximum Temperature [${}^\circ\mathrm{C}$]',
                     'bias': r'Maximum Temperature Bias [$\mathrm{K}$]',
                     'change': r'Maximum Temperature Change [$\mathrm{K}$]'},
          'tas': {'absolut': r'Temperature [${}^\circ\mathrm{C}$]',
                  'bias': r'Temperature Bias [$\mathrm{K}$]',
                  'change': r'Temperature Change [$\mathrm{K}$]'},
         }


# scaling and shift of variables +++++++++++++++++++++++++++++++++++++++++++++++
mul = {
       'tasmax': 1.0,
       'tasmin': 1.0,
       'tas': 1.0,
      }
add = {
       'tasmax': -273.15,
       'tasmin': -273.15,
       'tas': -273.15,
      }

# plot labels ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
month_names = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
               'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
# month_names = ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun',
#                'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez']

# statistic settings +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
n_samples = 1000  # bootstrapping

lbound_q = 5
ubound_q = 95
threshold = (100. - ubound_q + lbound_q)/100.
ma_window = 5

bins = 50

# settings for parallelization +++++++++++++++++++++++++++++++++++++++++++++++++
# used for statistical calculations
n_tasks = 4
backend = 'threads'

dtype = 'float32'

# interpolation settings +++++++++++++++++++++++++++++++++++++++++++++++++++++++
# interpolation_method = 'inverse_distance_weighting'
# interpolation_kwgs = {'radius': 100000, 'within': True, 'k': 9}
interpolation_method = 'universal_kriging'
interpolation_kwgs = {'radius': None, 'within': True, 'k': 9}

interpolation_fill_up_lib = {'pre': {'lswitch': False, 'nx': 1, 'ny': 1},
                             'post': {'lswitch': True, 'nx': 5, 'ny': 5}}  # fill up values at boundaries
                                                                           # prior to interpolation

# plot settings ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
dpi = 300
                        
### Model Comparison Toolbox @ foote : dataset_list.py

# datasets +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
dataset_specs = {
    # ISIMIPFastTrack
    'ISIMIPFastTrack_rcp26': {
        'dir_in': os.path.join(settings.netcdf_path, 'RCM-ESD', 'ISIMIP', 'ISIMIPFastTrack'),
        'experiment_list': ['hist', 'rcp2p6'],
        'lobservation': False,
        'add_include': [],
        'model_list': [
            {'rcm':  '', 'version':  '', 'gcm':  'hadgem2-es',     'realization':  ''},
            {'rcm':  '', 'version':  '', 'gcm':  'ipsl-cm5a-lr',   'realization':  ''},
            {'rcm':  '', 'version':  '', 'gcm':  'miroc-esm-chem', 'realization':  ''},
            {'rcm':  '', 'version':  '', 'gcm':  'gfdl-esm2m',     'realization':  ''},
            {'rcm':  '', 'version':  '', 'gcm':  'noresm1-m',      'realization':  ''},
           ],
                            },
    'ISIMIPFastTrack_rcp85': {
        'dir_in': os.path.join(settings.netcdf_path, 'RCM-ESD', 'ISIMIP', 'ISIMIPFastTrack'),
        'experiment_list': ['hist', 'rcp8p5'],
        'lobservation': False,
        'add_include': [],
        'model_list': [
            {'rcm':  '', 'version':  '', 'gcm':  'hadgem2-es',     'realization':  ''},
            {'rcm':  '', 'version':  '', 'gcm':  'ipsl-cm5a-lr',   'realization':  ''},
            {'rcm':  '', 'version':  '', 'gcm':  'miroc-esm-chem', 'realization':  ''},
            {'rcm':  '', 'version':  '', 'gcm':  'gfdl-esm2m',     'realization':  ''},
            {'rcm':  '', 'version':  '', 'gcm':  'noresm1-m',      'realization':  ''},
           ],
                            },
                            ...
}
# dataset plot specifications ++++++++++++++++++++++++++++++++++++++++++++++++++
# appearance of all datasets (color, marker etc.)
dataset_plot_specs = {
    'ISIMIPFastTrack_rcp26': __gen_plot_specs(color=__colors_lib__['low'][3], marker=__marker_lib__['ISIMIPFastTrack'],
                                              name='ISIMIP-FastTrack RCP2.6'),
    'ISIMIPFastTrack_rcp85': __gen_plot_specs(color=__colors_lib__['mid'][0], marker=__marker_lib__['ISIMIPFastTrack'],
                                              name='ISIMIP-FastTrack RCP8.5'),
                            ...
}
                        
### Model Comparison Toolbox @ foote
- Helper-function to determine domain names

[menz@login01: src/model-comparison-toolbox]> get_domain_name --domain "Amer"                                                                                                      (master|)
  %Status: found domain name: "North America" in continents
  %Status: found domain name: "South America" in continents
  %Status: found domain name: "Cameron" in admin_2_counties - cultural
  %Status: found domain name: "Cameron" in admin_2_counties - cultural
  %Status: found domain name: "Cameron" in admin_2_counties - cultural
  %Status: found domain name: "HaMerkaz" in admin_1_states_provinces - cultural
  %Status: found domain name: "Cameroon" in admin_0_countries - cultural
  %Status: found domain name: "United States of America" in admin_0_countries - cultural
  %Status: found domain name: "American Samoa" in admin_0_countries - cultural
                        
- Helper-function to determine city names

[menz@login01: src/model-comparison-toolbox]> get_city_name --city "Berl"                                                                                                          (master|)
  %Status: found domain name: "Cumberland" in populated_places - cultural
  %Status: found domain name: "Kimberley" in populated_places - cultural
  %Status: found domain name: "Uberlândia" in populated_places - cultural
  %Status: found domain name: "Berlin" in populated_places - cultural
                        

Outlook

### Swim Model Toolbox - Implement model-comparison-toolbox into swim model toolbox - Comparison of different climate model projections - Guide selection process for climate input data - Pre-process climate input data for swim?
### Outlool - Model Comparison Toolbox is in development - Adding new plots types - Adding new data sets - Improving plot layout - Improve performance - Improving usability - More users or developers always welcome christoph.menz@pik-potsdam.de and menz@Mattermost