import os
from pywps import Process
from pywps import LiteralInput, LiteralOutput
from pywps import ComplexInput, ComplexOutput
from pywps import Format, FORMATS
from pywps.app.Common import Metadata
from copernicus import runner
from copernicus import util
import logging
LOGGER = logging.getLogger("PYWPS")
[docs]class PyDemo(Process):
def __init__(self):
inputs = [
LiteralInput('model', 'Model',
abstract='Choose a model like MPI-ESM-LR.',
data_type='string',
allowed_values=['MPI-ESM-LR', 'MPI-ESM-MR'],
default='MPI-ESM-LR'),
LiteralInput('experiment', 'Experiment',
abstract='Choose an experiment like historical.',
data_type='string',
allowed_values=['historical', 'rcp26', 'rcp45', 'rcp85'],
default='historical'),
LiteralInput('ensemble', 'Ensemble',
abstract='Choose an ensemble like r1i1p1.',
data_type='string',
allowed_values=['r1i1p1', 'r2i1p1', 'r3i1p1'],
default='r1i1p1'),
LiteralInput('start_year', 'Start year', data_type='integer',
abstract='Start year of model data.',
default="2000"),
LiteralInput('end_year', 'End year', data_type='integer',
abstract='End year of model data.',
default="2001"),
]
outputs = [
ComplexOutput('namelist', 'namelist',
abstract='ESMValTool namelist used for processing.',
as_reference=True,
supported_formats=[Format('text/plain')]),
ComplexOutput('log', 'Log File',
abstract='Log File of ESMValTool processing.',
as_reference=True,
supported_formats=[Format('text/plain')]),
ComplexOutput('output', 'Output plot',
abstract='Generated output plot of ESMValTool processing.',
as_reference=True,
supported_formats=[Format('image/png'), Format('application/pdf')]),
]
super(PyDemo, self).__init__(
self._handler,
identifier="py_demo",
title="Python Demo",
version=runner.VERSION,
abstract="Generates a plot for temperature using ESMValTool."
" The default run uses the following CMIP5 data:"
" project=CMIP5, experiment=historical, ensemble=r1i1p1, variable=ta, model=MPI-ESM-LR, time_frequency=mon", # noqa
metadata=[
Metadata('ESMValTool', 'http://www.esmvaltool.org/'),
Metadata('Documentation',
'https://copernicus-wps-demo.readthedocs.io/en/latest/processes.html#pydemo',
role=util.WPS_ROLE_DOC),
Metadata('Media',
util.diagdata_url() + '/pydemo/pydemo_thumbnail.png',
role=util.WPS_ROLE_MEDIA),
Metadata('ESGF Testdata',
'https://esgf1.dkrz.de/thredds/catalog/esgcet/7/cmip5.output1.MPI-M.MPI-ESM-LR.historical.mon.atmos.Amon.r1i1p1.v20120315.html?dataset=cmip5.output1.MPI-M.MPI-ESM-LR.historical.mon.atmos.Amon.r1i1p1.v20120315.ta_Amon_MPI-ESM-LR_historical_r1i1p1_199001-199912.nc'), # noqa
],
inputs=inputs,
outputs=outputs,
status_supported=True,
store_supported=True)
def _handler(self, request, response):
response.update_status("starting ...", 0)
# build esgf search constraints
constraints = dict(
model=request.inputs['model'][0].data,
experiment=request.inputs['experiment'][0].data,
time_frequency='mon',
cmor_table='Amon',
ensemble=request.inputs['ensemble'][0].data,
)
# generate namelist
response.update_status("generate namelist ...", 10)
namelist_file, config_file = runner.generate_namelist(
workdir=self.workdir,
diag='py_demo',
constraints=constraints,
start_year=request.inputs['start_year'][0].data,
end_year=request.inputs['end_year'][0].data,
output_format='pdf',
)
# run diag
response.update_status("running diag ...", 20)
logfile, output_dir = runner.run(namelist_file, config_file)
# namelist output
response.outputs['namelist'].output_format = FORMATS.TEXT
response.outputs['namelist'].file = namelist_file
# log output
response.outputs['log'].output_format = FORMATS.TEXT
response.outputs['log'].file = logfile
# result plot
response.update_status("collect output plot ...", 90)
response.outputs['output'].output_format = Format('application/pdf')
response.outputs['output'].file = runner.get_output(
output_dir,
path_filter=os.path.join('ta_diagnostic', 'test_ta'),
name_filter="CMIP5*",
output_format="pdf")
response.update_status("done.", 100)
return response