CLIMATE-966 - Jupyter Notebook to run cordex.py on AWS
diff --git a/RCMES/CORDEX/CORDEX.ipynb b/RCMES/CORDEX/CORDEX.ipynb
new file mode 100644
index 0000000..9574260
--- /dev/null
+++ b/RCMES/CORDEX/CORDEX.ipynb
@@ -0,0 +1,166 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import os\n",
+    "import sys\n",
+    "import subprocess\n",
+    "import jinja2\n",
+    "import requests\n",
+    "from metadata_extractor import CORDEXMetadataExtractor, obs4MIPSMetadataExtractor\n",
+    "from tqdm import tqdm_notebook as tqdm\n",
+    "from glob import glob\n",
+    "from IPython.display import Markdown, Image"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "domain should be one of these three: 'AFR-44', 'EUR-11', 'NAM-44'\n",
+    "* AFR-44: CORDEX Africa RCMs at 44 km resolution\n",
+    "* EUR-11: CORDEX Europe RCMs at 11 km resolution\n",
+    "* NAM-44: CORDEX North America RCMs at 44 km resolution"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "domain = 'NAM-44'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# The output directory\n",
+    "cwd = os.getcwd()\n",
+    "workdir = cwd +'/evaluation_result'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Location of obs4Mips files\n",
+    "obs_dir = '/mnt/efs/obs4mips'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Location of CORDEX files\n",
+    "models_dir = '/mnt/efs/'+domain+'/*'.format(domain=domain)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# Extract metadata from model and obs files, pairing up files with the same\n",
+    "# variables for separate evaluations\n",
+    "obs_extractor = obs4MIPSMetadataExtractor(obs_dir)\n",
+    "models_extractor = CORDEXMetadataExtractor(models_dir)\n",
+    "groups = obs_extractor.group(models_extractor, 'variable')\n",
+    "\n",
+    "# Configuration file template, to be rendered repeatedly for each evaluation\n",
+    "# run\n",
+    "env =  jinja2.Environment(loader=jinja2.FileSystemLoader('./templates'),\n",
+    "                          trim_blocks=True, lstrip_blocks=True)\n",
+    "t = env.get_template('CORDEX.yaml.template')\n",
+    "\n",
+    "# Each group represents a single evaluation. Repeat the evaluation for\n",
+    "# three seasons: Summer, Winter, and Annual.\n",
+    "seasons = ['annual', 'winter', 'summer']\n",
+    "errored = []\n",
+    "for group in tqdm(groups, desc='variable loop'):\n",
+    "    obs_info, models_info = group\n",
+    "    instrument = obs_info['instrument']\n",
+    "    variable = obs_info['variable']\n",
+    "    for season in tqdm(seasons, desc='season loop'):\n",
+    "        configfile_basename = '_'.join([domain, instrument, variable, season]) + '.yaml'\n",
+    "        configfile_path = os.path.join(workdir, domain, instrument,\n",
+    "                                       variable, season)\n",
+    "        if not os.path.exists(configfile_path):\n",
+    "            os.makedirs(configfile_path)\n",
+    "        configfile_path = os.path.join(configfile_path, configfile_basename)\n",
+    "        with open(configfile_path, 'w') as configfile:\n",
+    "            configfile.write(t.render(obs_info=obs_info, models_info=models_info,\n",
+    "                                      season=season, output_dir=workdir))\n",
+    "\n",
+    "        # TODO: Do this in parallel. Will change this once this approach\n",
+    "        # is well tested.\n",
+    "        code = subprocess.call([sys.executable, '../run_RCMES.py', configfile_path])\n",
+    "        if code:\n",
+    "            errored.append(configfile_path)\n",
+    "print(\"All runs done. The following ended with an error: {}\".format(errored))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Check the evaluation result or download the processed obs4mips and model output."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "display(Markdown('Evaluation results'))\n",
+    "ip_address = (requests.get('http://169.254.169.254/latest/meta-data/public-ipv4').content).decode('utf-8')\n",
+    "for obs_info in obs_extractor.data:\n",
+    "    inst_name = obs_info['instrument']\n",
+    "    var_name = obs_info['variable']\n",
+    "    display(Markdown('Instrument: '+inst_name+'& Variable: '+var_name))\n",
+    "    for season in seasons:\n",
+    "        os.chdir(workdir+'/'+domain+'/'+inst_name+'/'+var_name+'/'+season)\n",
+    "        png_files = glob('*.png')\n",
+    "        for png_file in png_files:    \n",
+    "            display(Image(os.getcwd()+'/'+png_file))\n",
+    "        nc_file = glob('*.nc')[0]\n",
+    "        display(Markdown('['+nc_file+'](http://'+ip_address+':8888'+os.getcwd()+'/'+nc_file+')'))\n",
+    "os.chdir(cwd)        \n"
+   ]
+  }
+ ],
+ "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.7.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}