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
+}