{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Rooki to access WPS with climate data operations" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from rooki import rooki" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# The same as using birdy\n", "#from birdy import WPSClient\n", "#url = 'https://bovec.dkrz.de/ows/proxy/roocs'\n", "#url = 'http://localhost:5000/wps'\n", "#rooki = WPSClient(url, verify=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Available processes" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mType:\u001b[0m WPSClient\n", "\u001b[0;31mString form:\u001b[0m \n", "\u001b[0;31mFile:\u001b[0m ~/.conda/envs/rooki/lib/python3.8/site-packages/birdy/client/base.py\n", "\u001b[0;31mDocstring:\u001b[0m \n", "A demostrator for a WPS service for roocs.\n", "\n", "Processes\n", "---------\n", "\n", "subset\n", " Run subsetting on climate data.\n", "\n", "average\n", " Run averaging on climate data.\n", "\n", "orchestrate\n", " Run a workflow\n", "\u001b[0;31mClass docstring:\u001b[0m\n", "Returns a class where every public method is a WPS process available at\n", "the given url.\n", "\n", "Example:\n", " >>> emu = WPSClient(url='')\n", " >>> emu.hello('stranger')\n", " 'Hello stranger'\n", "\u001b[0;31mInit docstring:\u001b[0m \n", "Args:\n", " url (str): Link to WPS provider. config (Config): an instance\n", " processes: Specify a subset of processes to bind. Defaults to all\n", " processes.\n", " converters (dict): Correspondence of {mimetype: class} to convert\n", " this mimetype to a python object.\n", " username (str): passed to :class:`owslib.wps.WebProcessingService`\n", " password (str): passed to :class:`owslib.wps.WebProcessingService`\n", " headers (str): passed to :class:`owslib.wps.WebProcessingService`\n", " auth (requests.auth.AuthBase): requests-style auth class to authenticate,\n", " see https://2.python-requests.org/en/master/user/authentication/\n", " verify (bool): passed to :class:`owslib.wps.WebProcessingService`\n", " cert (str): passed to :class:`owslib.wps.WebProcessingService`\n", " verbose (str): passed to :class:`owslib.wps.WebProcessingService`\n", " progress (bool): If True, enable interactive user mode.\n", " version (str): WPS version to use.\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rooki?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Run subset" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mSignature:\u001b[0m\n", "\u001b[0mrooki\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msubset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mdata_ref\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.atmos.Amon.r1i1p1.latest.tas'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mtime\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'2085-01-01/2120-12-30'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mpre_checked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mspace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'-5.,49.,10.,65'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1000\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mDocstring:\u001b[0m\n", "Run subsetting on climate data.\n", "\n", "Parameters\n", "----------\n", "data_ref : string\n", " Data references\n", "time : string\n", " Time Period\n", "space : string\n", " Bounding Box\n", "level : integer\n", " Level\n", "pre_checked : boolean\n", " Use checked data only.\n", "\n", "Returns\n", "-------\n", "output : ComplexData:mimetype:`application/x-netcdf`\n", " Output\n", "\u001b[0;31mFile:\u001b[0m ~/Documents/GitHub/roocs/rooki/notebooks/\n", "\u001b[0;31mType:\u001b[0m method\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rooki.subset?" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "resp_subset = rooki.subset(\n", " data_ref='cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.atmos.Amon.r1i1p1.latest.tas',\n", " time='2085-01-01/2120-12-30',\n", ")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "subsetResponse(\n", " output='https://bovec.dkrz.de/download/outputs/roocswps/26797ff0-6a08-11ea-94ce-109836a7cf3a/output.nc'\n", ")" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resp_subset.get()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Run average" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mSignature:\u001b[0m\n", "\u001b[0mrooki\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maverage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mdata_ref\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.atmos.Amon.r1i1p1.latest.tas'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0maxes\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'time'\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m \u001b[0mpre_checked\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\n", "\u001b[0;34m\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mDocstring:\u001b[0m\n", "Run averaging on climate data.\n", "\n", "Parameters\n", "----------\n", "data_ref : string\n", " Data references\n", "axes : {'time', 'latitude', 'longitude'}string\n", " Please choose an axes for averaging.\n", "pre_checked : boolean\n", " Use checked data only.\n", "\n", "Returns\n", "-------\n", "output : ComplexData:mimetype:`text/plain`\n", " Output\n", "\u001b[0;31mFile:\u001b[0m ~/Documents/GitHub/roocs/rooki/notebooks/\n", "\u001b[0;31mType:\u001b[0m method\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rooki.average?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Run orchestrate workflow" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\u001b[0;31mSignature:\u001b[0m \u001b[0mrooki\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0morchestrate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mworkflow\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mmode\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'tree'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mDocstring:\u001b[0m\n", "Run a workflow\n", "\n", "Parameters\n", "----------\n", "workflow : ComplexData:mimetype:`application/json`\n", " Workflow\n", "mode : {'tree', 'simple'}string\n", " Mode\n", "\n", "Returns\n", "-------\n", "output : ComplexData:mimetype:`application/x-netcdf`\n", " Output\n", "\u001b[0;31mFile:\u001b[0m ~/Documents/GitHub/roocs/rooki/notebooks/\n", "\u001b[0;31mType:\u001b[0m method\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "rooki.orchestrate?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Simple Workflow Chain**" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "wf_simple = {\n", " 'doc': \"simple workflow\",\n", " 'inputs': {\n", " 'data_ref': ['cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.atmos.Amon.r1i1p1.latest.tas'],\n", " },\n", " 'steps': [\n", " {'subset': {\"time\": \"2085-01-01/2120-12-30\"}},\n", " {'subset': {\"time\": \"2090-01-01/2100-12-30\"}},\n", " {'average': {\"axes\": \"time\"}}\n", " ]}" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'{\"doc\": \"simple workflow\", \"inputs\": {\"data_ref\": [\"cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.atmos.Amon.r1i1p1.latest.tas\"]}, \"steps\": [{\"subset\": {\"time\": \"2085-01-01/2120-12-30\"}}, {\"subset\": {\"time\": \"2090-01-01/2100-12-30\"}}, {\"average\": {\"axes\": \"time\"}}]}'" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import json\n", "wf_simple_json = json.dumps(wf_simple)\n", "wf_simple_json" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "resp_wf = rooki.orchestrate(workflow=wf_simple_json, mode='simple')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "orchestrateResponse(\n", " output='https://bovec.dkrz.de/download/outputs/roocswps/314957de-6a08-11ea-94ce-109836a7cf3a/output.nc'\n", ")" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resp_wf.get()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Workflow with Function Tree**" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "wf_tree = {\n", " 'doc': \"tree workflow\",\n", " 'inputs': {\n", " 'tas': ['cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.atmos.Amon.r1i1p1.latest.tas'],\n", " },\n", " \"outputs\": {\n", " \"output\": \"average_tas/output\"\n", " },\n", " 'steps': {\n", " \"subset_tas_1\": {\n", " \"run\": \"subset\",\n", " \"in\": {\n", " \"data_ref\": \"inputs/tas\",\n", " \"time\": \"2085-01-01/2120-12-30\"\n", " }\n", " },\n", " \"subset_tas_2\": {\n", " \"run\": \"subset\",\n", " \"in\": {\n", " \"data_ref\": \"subset_tas_1/output\",\n", " \"time\": \"2090-01-01/2100-12-30\"\n", " }\n", " },\n", " \"average_tas\": {\n", " \"run\": \"average\",\n", " \"in\": {\n", " \"data_ref\": \"subset_tas_2/output\",\n", " \"axes\": \"time\"\n", " }\n", " }\n", " }}" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'{\"doc\": \"tree workflow\", \"inputs\": {\"tas\": [\"cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.atmos.Amon.r1i1p1.latest.tas\"]}, \"outputs\": {\"output\": \"average_tas/output\"}, \"steps\": {\"subset_tas_1\": {\"run\": \"subset\", \"in\": {\"data_ref\": \"inputs/tas\", \"time\": \"2085-01-01/2120-12-30\"}}, \"subset_tas_2\": {\"run\": \"subset\", \"in\": {\"data_ref\": \"subset_tas_1/output\", \"time\": \"2090-01-01/2100-12-30\"}}, \"average_tas\": {\"run\": \"average\", \"in\": {\"data_ref\": \"subset_tas_2/output\", \"axes\": \"time\"}}}}'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wf_tree_json = json.dumps(wf_tree)\n", "wf_tree_json" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "resp_wf = rooki.orchestrate(workflow=wf_tree_json, mode='tree')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "orchestrateResponse(\n", " output='https://bovec.dkrz.de/download/outputs/roocswps/382a84a6-6a08-11ea-94ce-109836a7cf3a/output.nc'\n", ")" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resp_wf.get()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Function Tree with diff operator (multiple inputs)**" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "wf_tree = {\n", " 'doc': \"tree workflow with diff operator\",\n", " 'inputs': {\n", " 'inm': ['cmip5.output1.INM.inmcm4.rcp45.mon.ocean.Omon.r1i1p1.latest.zostoga'],\n", " 'mpi': ['cmip5.output1.MPI-M.MPI-ESM-LR.rcp45.mon.ocean.Omon.r1i1p1.latest.zostoga']\n", " },\n", " \"outputs\": {\n", " \"output\": \"diff/output\"\n", " },\n", " 'steps': {\n", " \"subsetA\": {\n", " \"run\": \"subset\",\n", " \"in\": {\n", " \"data_ref\": \"inputs/inm\",\n", " \"time\": \"2085-01-01/2120-12-30\"\n", " }\n", " },\n", " \"subsetB\": {\n", " \"run\": \"subset\",\n", " \"in\": {\n", " \"data_ref\": \"inputs/mpi\",\n", " \"time\": \"2085-01-01/2120-12-30\"\n", " }\n", " },\n", " \"diff\": {\n", " \"run\": \"diff\",\n", " \"in\": {\n", " \"data_ref_a\": \"subsetA/output\",\n", " \"data_ref_b\": \"subsetB/output\",\n", " }\n", " }\n", " }}" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'{\"doc\": \"tree workflow with diff operator\", \"inputs\": {\"inm\": [\"cmip5.output1.INM.inmcm4.rcp45.mon.ocean.Omon.r1i1p1.latest.zostoga\"], \"mpi\": [\"cmip5.output1.MPI-M.MPI-ESM-LR.rcp45.mon.ocean.Omon.r1i1p1.latest.zostoga\"]}, \"outputs\": {\"output\": \"diff/output\"}, \"steps\": {\"subsetA\": {\"run\": \"subset\", \"in\": {\"data_ref\": \"inputs/inm\", \"time\": \"2085-01-01/2120-12-30\"}}, \"subsetB\": {\"run\": \"subset\", \"in\": {\"data_ref\": \"inputs/mpi\", \"time\": \"2085-01-01/2120-12-30\"}}, \"diff\": {\"run\": \"diff\", \"in\": {\"data_ref_a\": \"subsetA/output\", \"data_ref_b\": \"subsetB/output\"}}}}'" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wf_tree_json = json.dumps(wf_tree)\n", "wf_tree_json" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "resp_wf = rooki.orchestrate(workflow=wf_tree_json, mode='tree')" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "orchestrateResponse(\n", " output='https://bovec.dkrz.de/download/outputs/roocswps/409b1a74-6a08-11ea-94ce-109836a7cf3a/output.nc'\n", ")" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "resp_wf.get()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" } }, "nbformat": 4, "nbformat_minor": 4 }