Plots from operational simulations

Created on 6 déc. 2018

@author: lafaysse

usage: python postprocess.py [-b YYYYMMDD] [-e YYYYMMDD] [-o diroutput]

  1. extracts operational simulation results

  2. Plots maps for the Alps, the Pyrenees the Corse, Vosges, Massif Central, Jura

  3. Creates spaghetti plots for all massifs and stations

class plots.pearps2m.postprocess.Config(OPTIONS)[source]

Bases: object

Configuration passed to S2MExtractor and to be used in vortex toolboxes.

  1. checks and converts dates

  2. creates output directories if they don’t exist.

__init__(OPTIONS)[source]
  1. checks and converts dates

  2. creates output directories if they don’t exist.

alternate_xpid = ['OPER@lafaysse']

Alternative experiment id

diroutput

output directory

diroutput_maps

output directory for maps

diroutput_plots

output directory for other plots

list_geometry = ['alp', 'pyr', 'cor', 'jur', 'mac', 'vog', 'postes']

List of geometries

list_members = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]

35 for determinstic member, 36 for sytron, 0-34 for PEARP members

previ = True

False for analysis, True for forecast

rundate

Date of model run bronx.stdtypes.date.Date

xpid = 'oper'

Operational chain

class plots.pearps2m.postprocess.Ensemble[source]

Bases: object

Describes an ensemble of simulations

__init__()[source]
close()[source]

Close simulation files and remove data from ensemble.

csg_mean_nonorm(a1, a2, a3, a4, ensmean, ensPOP)[source]

Calculate mu of predictive censored shifted gamma distribution from regression coefficients alpha 1 to alpha 4, ensemble mean and probability of non-zero values of the ensemble.

Parameters:
  • a1 (float) – regression coefficient alpha 1

  • a2 (float) – regression coefficient alpha 2

  • a3 (float) – regression coefficient alpha 3

  • a4 (float) – regression coefficient alpha 4

  • ensmean (float) – ensemble mean

  • ensPOP (float) – probability of non-zero values of the ensemble [0., 1.]

Returns:

mu of predictive censored shifted gamma distribution

Return type:

float

csg_std_nonorm(b1, muclim, sigmaclim, csgmean)[source]

Calculate sigma of predictive censored shifted gamma distribution from regression coefficients beta 1, climatological mu and sigma and csg mu parameter.

Parameters:
  • b1 (float) – regression coefficient beta 1

  • muclim (float) – climatological mu

  • sigmaclim (float) – climatological sigma

  • csgmean (float) – csg mu parameter

Returns:

sigma of predictive censored shifted gamma distribution

Return type:

float

emos_csg_nonorm_allstations_newsnow(varname, level)[source]

Applies Censored Shifted Gamma (CSG) EMOS trained for 24h new snow variable and all stations in the Alps without normalisation (internship Benoit Gacon 2024) to variable “varname” and returns the quantiles given in “levels” of the CSG distribution.

Parameters:
  • varname (str) – variable name

  • level (array) – quantiles (range 0 to 100)

Returns:

quantiles of predictive distribution

Return type:

np.array

ensemble

data dict with variable names as keys and np.arrays as values

get_alti()[source]

Get altitude variable from the first simulation file.

Returns:

altitude variable

Return type:

numpy array

get_aspect()[source]

Get aspect variable from the first simulation file.

Returns:

aspect variable

Return type:

numpy array

get_csg_predictive_dist_nonorm_allstations(varname)[source]

get the censored shifted gamma regression coefficients and climatological paramters for each lead time and apply them to the ensemble forecast and return the parameters mu, sigma and delta of the predictive censored shifted gamma distribution.

Parameters:

varname – variable name

Returns:

mu, sigma, delta of the predictive CSG distribution

get_metadata()[source]

Get a tuple with spatial indices.

Returns:

indpoints, indpoints

get_npoints()[source]

Get the number of spatial points.

Returns:

total number of spatial points

Return type:

int

indpoints
Variables:

indpoints – list with spatial indices :vartype indpoints: list

mean(varname)[source]

Calculate ensemble mean for a given variable.

Parameters:

varname (str) – variable name

Returns:

ensemble mean

Return type:

numpy array

nech

number of time steps (forecast steps). type int

nmembers

number of members type int

npoints
Variables:

npoints – total number of spatial points :vartype npoints: int

open(listmembers)[source]

Opens simulation files

Parameters:

listmembers (list) – list of ensemble members (filenames)

Variables:

inddeterministic (int) – index of the deterministic member

probability(varname, seuilinf=-999999999.0, seuilsup=999999999.0)[source]

Calculates probability as the proportion of ensemble members with values larger than seuilinf and smaller than seuilsup.

Parameters:
  • varname (str) – name of the variable for which to calculate the probability

  • seuilinf – lower threshold

  • seuilsup – upper threshold

Returns:

probability field (or np.nan if the ensemble is not defined)

Return type:

numpy array

quantile(varname, level)[source]

Calculates ensemble percentiles for a given variable and given percentile levels.

Parameters:
  • varname (str) – Variable name

  • level (list of numbers between 0 and 100) – list of percentiles to calculate

Returns:

array of percentiles

Return type:

numpy array

quantiles_CSGD(csgmean, csgstd, csgdelta, quantiles)[source]

get quantiles of the censored shifted gamma (CSG) distribution with given mu, sigma and delta.

Parameters:
  • csgmean (array) – mu parameter of CSG

  • csgstd (array) – sigma parameter of CSG

  • csgdelta (array) – delta parameter of CSG

  • quantiles (array of floats) – quantiles wanted

Returns:

array of quantiles

Return type:

array of same length as quantiles.

read(varname)[source]

Read a variable and store it in ensemble

Parameters:

varname (str) – name of the variable to be read (corresponds to the variable name of the simulation NetCDF files)

read_geovar(varname)[source]

Read a variable from the first simulation file.

Parameters:

varname (str) – NetCDF variable name of the variable to read

Returns:

data read

Return type:

numpy array

select_points()[source]

Get a list of spatial indices from the spatial dimension length in the first simulation file.

Returns:

list of spatial points (indices)

Return type:

list

simufiles

list of prosimu objects with simulation file

property spatialdim

Name of spatial dimension

spread(varname)[source]

Calculate ensemble spread (standard deviation) for a given variable.

Parameters:

varname (str) – variable name

Returns:

ensemble spread

Return type:

numpy array

Return type:

numpy array

time
Variables:

~.time – time variable from the first simulation file :vartype ~.time: numpy array

class plots.pearps2m.postprocess.EnsembleDiags[source]

Bases: Ensemble

Probabilities and quantiles from ensembles.

__init__()[source]
close()[source]

Close simulation files and remove data from ensemble, proba and quantiles

diags(list_var, list_quantiles, list_seuils)[source]

Calculate quantiles and exceedance probabilities for a list of variables, quantiles and thresholds. The quantiles are stored in quantiles and the probabilities in proba

Parameters:
  • list_var (iterable) – list of variables

  • list_quantiles (iterable) – list of percentiles to be calculated

  • list_seuils (dict of iterables with variable names as keys) – list of thresholds for each variable

proba

probabilities

quantiles

percentiles

class plots.pearps2m.postprocess.EnsembleFlatMassif[source]

Bases: _EnsembleMassif

Class for ensemble simulations on a massif geometry (SAFRAN like) where all data points are considered on flat terrain (zero slope and no orientation information).

select_points()[source]

Select spatial indices from the first simulation file where aspect=-1 (zero slope, no orientation information).

Returns:

spatial indices to be read from simulation files

Return type:

numpy boolean array

class plots.pearps2m.postprocess.EnsembleHydro(variables, inputfiles, decile=array([10, 20, 30, 40, 50, 60, 70, 80, 90]), outdir='.', outfilename='PRO_post.nc', emosmethod=None)[source]

Bases: EnsemblePostproc

Class to provide a synthesis of ensemble hydrological diagnostics of S2M

Parameters:
  • variables – list of variables to process

  • inputfiles – list of input files

  • decile – list of percentiles

  • outdir (str) – Output directory

  • outfilename – output file name

  • emosmethod – emos method to use. The method is supposed to take a variable name and the wanted quantiles as arguments.

property spatialdim

Name of spatial dimension

property standardvars

variables always written to the output file

class plots.pearps2m.postprocess.EnsembleMassifPoint(massif_num, alti, aspect, slope)[source]

Bases: _EnsembleMassif

Class for extracting one specific point in massif geometry

__init__(massif_num, alti, aspect, slope)[source]
select_points()[source]

Select index of the corresponding point

class plots.pearps2m.postprocess.EnsembleNorthSouthMassif[source]

Bases: _EnsembleMassif

Class for ensemble simulations on a massif geometry (SAFRAN like) where data points are considered at a slope of 40 degrees and two orientations: North and South.

select_points()[source]

Select spatial indices from the first simulation file where slope=40 and aspect either 0 or 180.

Returns:

spatial indices to be read from simulation files

Return type:

a tuple of numpy boolean array, where the first component corresponds to the Northern orientation and the second to the Southern one.

class plots.pearps2m.postprocess.EnsembleOperDiags[source]

Bases: EnsembleDiags

Class for operationally used plots.

__init__()[source]
alldiags()[source]

Calculate percentiles for all variables in list_var_spag and list_var_map.

attributes = {'DSN_T_ISBA': {'convert_unit': 100.0, 'label': 'Hauteur de neige (cm)'}, 'NAT_LEV': {'forcemax': 5.5, 'forcemin': -0.5, 'label': 'Risque naturel', 'ncolors': 6, 'palette': 'YlOrRd', 'ticks': ['Très faible', 'Faible', 'Mod. A', 'Mod. D', 'Fort', 'Très fort']}, 'PP_SD_1DY_ISBA': {'convert_unit': 1.0, 'forcemax': 60.0, 'forcemin': 0.0, 'label': 'Epaisseur de neige fraîche en 24h (cm)', 'palette': 'YlGnBu', 'seuiltext': 50.0}, 'RAINF_ISBA': {'convert_unit': 10800.0, 'forcemax': 60.0, 'forcemin': 0.0, 'label': 'Pluie en 3h (kg/m2/3h)', 'palette': 'YlGnBu', 'seuiltext': 50.0}, 'RAMSOND_ISBA': {'convert_unit': 100.0, 'forcemax': 60.0, 'forcemin': 0.0, 'label': 'Epaisseur mobilisable (cm)', 'palette': 'YlGnBu', 'seuiltext': 50.0}, 'REFRZTH_ISBA': {'convert_unit': 100.0, 'forcemax': 60.0, 'forcemin': 0.0, 'label': 'Epaisseur regelée (cm)', 'palette': 'YlGnBu', 'seuiltext': 50.0}, 'SD_1DY_ISBA': {'convert_unit': 100.0, 'forcemax': 60.0, 'forcemin': 0.0, 'label': 'Epaisseur de neige fraîche en 24h (cm)', 'palette': 'YlGnBu', 'seuiltext': 50.0}, 'SD_3DY_ISBA': {'convert_unit': 100.0, 'forcemax': 60.0, 'forcemin': 0.0, 'label': 'Epaisseur de neige fraîche en 72h (cm)', 'palette': 'YlGnBu', 'seuiltext': 50.0}, 'SNOMLT_ISBA': {'convert_unit': 10800.0, 'forcemax': 60.0, 'forcemin': 0.0, 'label': 'Ecoulement en 3h (kg/m2/3h)', 'palette': 'YlGnBu', 'seuiltext': 50.0}, 'WET_TH_ISBA': {'convert_unit': 100.0, 'forcemax': 60.0, 'forcemin': 0.0, 'label': 'Epaisseur humide (cm)', 'palette': 'YlGnBu', 'seuiltext': 50.0}, 'WSN_T_ISBA': {'label': 'Equivalent en eau (kg/m2)'}, 'naturalIndex': {'forcemax': 8.0, 'forcemin': 0.0, 'format': '%.1f', 'label': 'Indice de risque naturel', 'nolevel': True, 'palette': 'YlOrRd'}}

dict of plot attributes for each variable

formatplot = 'png'

plot format

list_q = [20, 50, 80]

list of quantiles

pack_spaghettis(suptitle, diroutput='.')[source]

Produce spaghetti plots for all variables in list_var_spag.

Parameters:
  • suptitle (unicode string) – Suptitle for all plots.

  • diroutput – directory to save the plots

pack_spaghettis_multipoints(list_pairs, suptitle, diroutput='.', **kwargs)[source]

Produce spaghetti plots with up to four points per plot for variables in list_var_spag_2points.

Each point gets a different color.

Parameters:
  • list_pairs (list of list) – list of indices to plot together on each plot

  • suptitle (unicode str) – common suptitle for all plots

  • diroutput – output directory

  • kwargs – arguments to be passed to plotting routines, notably “labels”

class plots.pearps2m.postprocess.EnsembleOperDiagsFlatMassif[source]

Bases: EnsembleOperDiags, EnsembleFlatMassif

Class for operationally plotting maps and spaghetti plots for ensembles with massif geometry and for the zero slope case.

levelmax = 3900

maximum height level to be treated

levelmin = 0

minimum heigth level to be treated

list_var_map = ['naturalIndex', 'SD_1DY_ISBA', 'SD_3DY_ISBA', 'SNOMLT_ISBA']

list of variables to plot maps for

list_var_spag = ['naturalIndex', 'DSN_T_ISBA', 'WSN_T_ISBA', 'SNOMLT_ISBA']

list of variables to do spaghetti plots for

pack_maps(domain, suptitle, diroutput='.')[source]

Produce maps for the variables given in list_var_map over the regions given in domain for each available altitude level and time step.

Each massif is colored corresponding to the second percentile value defined in list_q and the color map defined in attributes. At the center of each massif the values corresponding to the first three percentiles in list_q are marked.

Parameters:
  • domain – list of region identifiers (e.g., “alp”, “pyr”, “cor”)

  • suptitle (str) – common suptitle for all plots

  • diroutput – output directory to save the maps

class plots.pearps2m.postprocess.EnsembleOperDiagsNorthSouthMassif[source]

Bases: EnsembleOperDiags, EnsembleNorthSouthMassif

Class for operationally plot maps and spaghetti plots distinguishing between northern and southern orientation at each massif.

alldiags()[source]

Calculate percentiles for all variables in list_var_spag_2points and list_var_map.

ensemble = {}

ensemble data

get_pairs_ns()[source]

Get for each massif and altitude the pair of indices corresponding to values for the northern and southern slopes.

Returns:

indices corresponding to northern and southern slopes

Return type:

list of lists

levelmax = 3900

maximum height level to plot

levelmin = 0

minimum height level to plot

list_var_map = ['RAMSOND_ISBA', 'NAT_LEV', 'WET_TH_ISBA', 'REFRZTH_ISBA']

variable list for producing maps

list_var_spag = []

variable list for standard spaghetti plots

list_var_spag_2points = ['RAMSOND_ISBA', 'NAT_LEV', 'WET_TH_ISBA', 'REFRZTH_ISBA']

variable list for spaghetti plots combining northern and southern orientation

pack_maps(domain, suptitle, diroutput)[source]

Produce maps for the variables given in list_var_map over the regions given in domain for each available altitude level and time step.

For each massif a table with background colors and values corresponding to the percentiles in list_q and the color map defined in attributes is plotted near the center of each massif.

Parameters:
  • domain – list of region identifiers (e.g., “alp”, “pyr”, “cor”)

  • suptitle (str) – common suptitle for all plots

  • diroutput – output directory to save the maps

pack_spaghettis_ns(suptitle, diroutput='.')[source]

Do spaghetti plots with values for the northern and southern slope on the same plot.

Parameters:
  • suptitle – common suptitle for all plots

  • diroutput – directory to save the plots

versants = ['Nord 40°', 'Sud 40°']

labels for the two orientations

class plots.pearps2m.postprocess.EnsembleOperDiagsStations[source]

Bases: EnsembleOperDiags, EnsembleStation

Class for operationally plotting spaghetti plots for station based simulations.

list_var_map = []

list of variables to plot maps for

list_var_spag = ['DSN_T_ISBA', 'WSN_T_ISBA', 'RAMSOND_ISBA', 'WET_TH_ISBA', 'REFRZTH_ISBA', 'SNOMLT_ISBA']

list of variables to plot spaghetti plots for.

class plots.pearps2m.postprocess.EnsemblePostproc(variables, inputfiles, decile=array([10, 20, 30, 40, 50, 60, 70, 80, 90]), outdir='.', outfilename='PRO_post.nc', emosmethod=None)[source]

Bases: _EnsembleMassif

Class for ensemble post-processing.

Parameters:
  • variables – list of variables to process

  • inputfiles – list of input files

  • decile – list of percentiles

  • outdir (str) – Output directory

  • outfilename – output file name

  • emosmethod – emos method to use. The method is supposed to take a variable name and the wanted quantiles as arguments.

__init__(variables, inputfiles, decile=array([10, 20, 30, 40, 50, 60, 70, 80, 90]), outdir='.', outfilename='PRO_post.nc', emosmethod=None)[source]
Parameters:
  • variables – list of variables to process

  • inputfiles – list of input files

  • decile – list of percentiles

  • outdir (str) – Output directory

  • outfilename – output file name

  • emosmethod – emos method to use. The method is supposed to take a variable name and the wanted quantiles as arguments.

create_outfile()[source]

Create output data set.

Variables:

outdataset (utils.prosimu.prosimu) – output data set

decile

list of percentiles

deciles()[source]

Calculates percentiles given in decile for variables in variables and adds them to the output data set including the corresponding dimension, coordinate variable and attributes applying the method in emosmethod to obtain the percentiles.

init_outfile()[source]

Copy global attributes, dimensions and standard variables from the first simulation file to the output file.

median()[source]

Calculates the median for variables in variables and adds the median to the output data set including the corresponding attributes.

outfile

output filename

postprocess()[source]

Do postprocessing

  1. create output file

  2. copy global attributes and standard variables to the output file

  3. calculate deciles for the data variables and put them to the output file

  4. close all input and output data sets.

Calls create_outfile(), init_outfile(), deciles() and close methods for all data sets.

property standardvars

variables always written to the output file

variables

list of variables

class plots.pearps2m.postprocess.EnsemblePostprocStation(variables, inputfiles, decile=array([10, 20, 30, 40, 50, 60, 70, 80, 90]), outdir='.', outfilename='PRO_post.nc', emosmethod=None)[source]

Bases: EnsemblePostproc

Class for ensemble postprocessing at station locations.

Parameters:
  • variables – list of variables to process

  • inputfiles – list of input files

  • decile – list of percentiles

  • outdir (str) – Output directory

  • outfilename – output file name

  • emosmethod – emos method to use. The method is supposed to take a variable name and the wanted quantiles as arguments.

property standardvars

variables always written to the output file

class plots.pearps2m.postprocess.EnsembleStation[source]

Bases: Ensemble

Class for ensemble simulations at station locations.

Variables:

InfoMassifs – Information on the Massif the station is situated.

build_filename(station, alti)[source]

Construct a filename from a station number

Parameters:
  • station – station number

  • alti – altitude level (not used)

Returns:

filename

Return type:

station number as 8digit integer.

build_title(station, alti)[source]

Construct a title from a station number and altitude level.

Parameters:
  • station – station number

  • alti – station altitude

Returns:

title string composed of the station name and the altitude.

Return type:

unicode str

property geo

Geometry information.

Returns:

“stations”

get_metadata(**kwargs)[source]

Construct filenames and plot titles from altitude and station information

Parameters:

kwargs

Returns:

a list of filenames and a list of plot titles

get_station()[source]

Read station numbers from the first simulation file.

Returns:

station numbers

Return type:

numpy array

class plots.pearps2m.postprocess.PPQuantiles(filename)[source]

Bases: object

Class for handling files containing postprocessed (quantile) forecasts.

__init__(filename)[source]
levelmax = 3900

maximum height level to be treated

levelmin = 0

minimum heigth level to be treated

list_var_map = ['SD_1DY_ISBA', 'SD_12H_ISBA']

list of variables to plot maps for

list_var_spag = ['SD_1DY_ISBA', 'SD_12H_ISBA']

list of variables to do spaghetti plots for

quantilemaps(domain, suptitle, diroutput, mapindex=array([False, True, False, False, True, False, False, True, False]))[source]

Plots maps of quantile forecasts. For example EMOS postprocessed quantiles.

Parameters:
  • domain – domain (region) string to determine which map class to use

  • suptitle – Plot title highest level

  • diroutput – Output directory for the plots

  • mapindex – array of bool indicating for with indices of the quantile dimension (last dimension of the data array) maps should be drawn.

spaghetti_plots(suptitle, diroutput='.')[source]

Produce spaghetti plots for all variables in list_var_spag.

Parameters:
  • suptitle (unicode string) – Suptitle for all plots.

  • diroutput – directory to save the plots

class plots.pearps2m.postprocess._EnsembleMassif[source]

Bases: Ensemble

Metaclass for ensemble simulations on a massif geometry (SAFRAN like).

Variables:

InfoMassifs – Information of Massifs

build_filename(massif, alti)[source]

Construct a filename from massif and altitude information.

Parameters:
  • massif – a massif number

  • alti – an altitude level

Returns:

filename

Return type:

str

build_title(massif, alti)[source]

Construct a figure title from massif and altitude information.

Parameters:
  • massif – a massif number

  • alti – an altitude level

Returns:

a title

Return type:

unicode str

property geo

Geometry

Returns:

“massifs”

get_massifdim()[source]

Read massif_num variable from the first simulation file.

Returns:

massif numbers

Return type:

numpy array

get_massifvar()[source]

Read “massif” variable from the first simulation file.

Returns:

massif numbers

Return type:

numpy array

get_metadata(nolevel=False)[source]

Construct filenames and plot titles from massif and altitude variables in the first simulation file.

Parameters:

nolevel – if True the altitude is not included in the filenames and titles.

Returns:

a list of filenames and a list of titles

Return type:

two lists.

read(varname)[source]

Read data for a given variable name into the ensemble instance variable.

Parameters:

varname (str) – variable name

plots.pearps2m.postprocess.build_filename(massif, alti)[source]

Construct a filename from massif and altitude information.

Parameters:
  • massif – a massif number

  • alti – an altitude level

Returns:

filename

Return type:

str

plots.pearps2m.postprocess.main(c)[source]
Parameters:

c – config

plots.pearps2m.postprocess.pp_plots(c)[source]

downloads files with postprocessed quantiles and plots maps and spaghetti plots of them

Parameters:

c – config