Calling ESMValTools diagnostic scripts¶
ESMValTool is a software package for evaluating Earth Sytem Models ; it includes a large number of recipes
which are configuration files for its runs (see a recipe example); such recipes
include a data preparation and preprocessing step, followed by the call of one or more diagnostic scripts.
CliMAF can feed those diagnostic scripts and launch it. The following applies :
Script declaration¶
The ESMValTool diagnostic script must be declared using function evt_script()
(and using the same name as in ESMValTool recipes); it allows to create a python function for calling the script, herafter called the nickname
function.
Script inputs¶
- when using this feature, it is the user’s responsibility to understand which data pre-processing is needed upstream of the diagnostic script and to reproduce that pre-processing using CliMAF, in order to feed the diagnostic consistently. The recipe describes that pre-processing;
- according to ESMValTool’s principles, each script input of type
field
must be an ensemble of fields, composed of fields representing the same geophysical variable - these ensembles must be provided as arguments to the
nickname
function in the same order than used in ESMValTool recipe’s list of variables; - any script parameter that can be set in a
recipe
can also be set through CliMAF as a keyword argument to thenickname
function call - other parameters that ESMValTool users set in the config-user.yml file and that ESMValTool passes to the script can also be set through CliMAF at the stage of the
nickname
function call. This applies for instance to parameters : output_dir
(defaults to ./evtscript_output/),output_type
(png) ,write_netcdf
(True)write_plots
(True)profile_diagnostic
(False),auxiliary_data_dir
(empty)
- other parameters that ESMValTool users set in the config-user.yml file and that ESMValTool passes to the script can also be set through CliMAF at the stage of the
- the log level passed to the script is the current CliMAF log level, but can be superseded using parameter
log_level
Scripts outputs¶
- diagnostic script outputs are organized similarly to ESMValtool’s : a subdirectory of
output_dir
is created for each call, which name includes a date/time stamp and is part of the value returned by thenickname
function call (see below); it includes subdirectoriespreproc
,work
,run
andplots
; these sub-directories have a simpler organization than in ESMValTool (less hierarchy levels) because they represent outputs for a simpler run : only the diagnostic script (rather than a full recipe with its pre-processing) - subdir
preproc
includes, like in ESMValTool, one sub-directory per input variable (i.e per input ensemble); each one includes symbolic links to the input data files, which are located in CliMAF cache; the symbolic link name is built using the key (in the ensemble dictionnary), the variable name and the start and end year for the data period; these symbolic names are those used as provenance information by ESMValTool and cannot host the kind of provenance information that CliMAF could provide; - there is yet no way for CliMAF to handle ESMValTool diagnostic script’s output data as CliMAF objects, because ESMValTool doesn’t include any rule for symbolic naming of these outputs. So, calling an ESMValTool script is more or less a dead-end in the data processing flow.
- ESMValTool generates
provenance
information using diagnostic script’s outputs, and builds an html index of graphic type outputs, namedindex.html
, in the output dir. The provenance information dictionnary is included in thenickname
function call returned values.
Values returned upon diagnostic script call¶
Upon invocation, the nickname
function returns a pair of values :
- the name for the script’s top-level outputs directory
- the dictionnary of provenance information (see ESMValTool documentation)
ESMValTool scripts wrapper¶
An helper script is needed in order to set the relevant environment for calling ESMValTool scripts before calling it. Such a wrapper script must be tuned for each ESMValTool install one wants to use, and to the specifics of the platform for handling software envroinments. Variable wrapper()
should be set to the path for such a wrapper script. If it is not set, CliMAF will try to use hard-coded values depending on the current platform. At the time of writing, hard-coded values are limited to the case of Ciclad, and the corresponding wrapper is available in CliMAF distribution as scripts/ESMValTool_python_diags_wrapper_for_ciclad.sh
. However, this script may have to be updated for an alternate ESMValTool install location.
Example¶
The example below is also available for download here
# An example of declaring and calling an ESMValTool script from CliMAF
from climaf.api import *
from climaf.ESMValTool_diags import evt_script
# If your platform is not Ciclad, you must tell which is the wrapper for ESMValTool scripts
climaf.ESMValTool_diags.wrapper = \
"/home/ssenesi/climaf_installs/climaf_running/scripts/"+\
"ESMValTool_python_diags_wrapper_for_ciclad.sh"
# Create a CliMAF function for calling the ESMValTool diagnostic script
# (use the same syntax as the ESMVaTool recipe for designating the script)
evt_script("call_cvdp", "cvdp/cvdp_wrapper")
# Prepare input datasets for the diag.
base = dict(project="CMIP6", experiment="historical",
realization='r1i1p1f2', table="Amon", period="1850-1855", )
models = [ "CNRM-CM6-1", "CNRM-ESM2-1"]
variables = [ "ts", "tas", "pr", "psl" ]
ensembles = []
for variable in variables:
ensemble = cens(
{
model : ds(model=model, variable=variable, **base)
for model in models
})
ensembles.append(ensemble)
# Note : here, for other diagnostic scripts, you may have to reproduce
# the preprocessing steps that ESMValTool recipes implement upstream
# of the diagnostic script. For CVDP, there is actually no such
# preprocessing
# Call the diag. You may provide parameters that are known to ESMValTool
# or to the diagnostic script
wdir, prov = call_cvdp(*ensembles, output_dir="./out", write_netcdf=False)
# First returned value is the diag's working directory
print(wdir)
# Second one is a dictionnary of provenance information which
# describes all outputs (either graphics or NetCDF files) by various
# attributes, one of which being a 'caption'
one_output, its_attributes=prov.popitem()
print(one_output, its_attributes['caption'])
# But there is no further established framework in ESMValTool for a
# diagnostic to 'publish' a list of identifiers for its outputs
Public functions and variables involved¶
-
climaf.ESMValTool_diags.
evt_script
(climaf_name, script)[source]¶ Create a function named CLIMAF_NAME for launching an ESMValTool’s diagnostic script SCRIPT (which follows EMSValTool naming convention)
The created function will actually invoke
ceval_evt()
with argument SCRIPT and own arguments.
-
climaf.ESMValTool_diags.
wrapper
= None¶ Path for the wrapper script for setting ESMValTool’s diag scripts environment and launching them
Private functions and variables involved¶
-
climaf.driver.
ceval_evt
(climaf_name, script, *operands, **parameters)[source]¶ Evaluates OPERANDS and forward them to function
call_evt_script()
together with all arguments.This function is NOT supposed to be called directly except by CliMAF driver, see doc.
-
climaf.ESMValTool_diags.
call_evt_script
(climaf_name, script, ensembles, *operands, **parameters)[source]¶ Driver for calling an ESMValTool diagnostic script (DS).
This function is NOT supposed to be called directly except by CliMAF driver, see doc.
Arguments :
- climaf_name : name of the python function associated to the DS
- script : name of the DS, according to ESMValTool convention
- ensembles : list of datasets ensemble objects to provide to the DS (one member per variable)
- operands : values of the ensemble objects (i.e. filenames)
- parameters : additional key/value pairs to provide to the DS
This drivers creates a directory dedicated to running that DS, and all necessary interface files. It checks that execution was successfull.
Returns a pair : DS working directory, dictionnary of provenance information