{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "collapsed": true,
    "id": "YSV5DrHtlHp-",
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# Tutorial 03 - Analysing Data Sets\n",
    "\n",
    "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/openforcefield/openff-evaluator/blob/master/docs/tutorials/tutorial03.ipynb)\n",
    "\n",
    "In this tutorial we will be analysing the results of the calculations which we performed in the [second tutorial](tutorial02.ipynb). \n",
    "The tutorial will cover:\n",
    "\n",
    "- comparing the estimated data set with the experimental data set.\n",
    "- plotting the two data sets. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "collapsed": false,
    "id": "pvunG4GblHqA"
   },
   "source": [
    "*Note: If you are running this tutorial in google colab you will need to run a setup script instead of following the \n",
    "installation instructions:*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "BRDQOezZlHqC",
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "# !wget https://raw.githubusercontent.com/openforcefield/openff-evaluator/master/docs/tutorials/colab_setup.ipynb\n",
    "# %run colab_setup.ipynb"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "collapsed": false,
    "id": "kETNDAhSlHqJ"
   },
   "source": [
    "For the sake of clarity all warnings will be disabled in this tutorial:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "DDquWWI4lHqL",
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "import logging\n",
    "logging.getLogger(\"openforcefield\").setLevel(logging.ERROR)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "collapsed": false,
    "id": "D5fOLXw1lHqS",
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Loading the Data Sets\n",
    "\n",
    "We will begin by loading both the experimental data set and the estimated data set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "4aHO4zhClHqX",
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "from openff.evaluator.datasets import PhysicalPropertyDataSet\n",
    "\n",
    "experimental_data_set_path = \"filtered_data_set.json\"\n",
    "estimated_data_set_path = \"estimated_data_set.json\"\n",
    "\n",
    "# If you have not yet completed the previous tutorials or do not have the data set files \n",
    "# available, copies are provided by the framework:\n",
    "\n",
    "# from openff.evaluator.utils import get_data_filename\n",
    "# experimental_data_set_path = get_data_filename(\n",
    "#     \"tutorials/tutorial01/filtered_data_set.json\"\n",
    "# )\n",
    "# estimated_data_set_path = get_data_filename(\n",
    "#     \"tutorials/tutorial02/estimated_data_set.json\"\n",
    "# )\n",
    "\n",
    "experimental_data_set = PhysicalPropertyDataSet.from_json(experimental_data_set_path)\n",
    "estimated_data_set = PhysicalPropertyDataSet.from_json(estimated_data_set_path)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "collapsed": false,
    "id": "5vl3MxX5lHqh",
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "if everything went well from the previous tutorials, these data sets will contain the density and $H_{vap}$ of ethanol \n",
    "and isopropanol:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 241
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 293013,
     "status": "ok",
     "timestamp": 1583292817554,
     "user": {
      "displayName": "",
      "photoUrl": "",
      "userId": ""
     },
     "user_tz": 420
    },
    "id": "4vI-dJ3VlHqj",
    "outputId": "930607e6-2a25-4c00-9362-c6b4b4ba1613",
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Temperature (K)</th>\n",
       "      <th>Pressure (kPa)</th>\n",
       "      <th>Phase</th>\n",
       "      <th>N Components</th>\n",
       "      <th>Component 1</th>\n",
       "      <th>Role 1</th>\n",
       "      <th>Mole Fraction 1</th>\n",
       "      <th>Exact Amount 1</th>\n",
       "      <th>Density Value (g / ml)</th>\n",
       "      <th>Density Uncertainty (g / ml)</th>\n",
       "      <th>EnthalpyOfVaporization Value (kJ / mol)</th>\n",
       "      <th>EnthalpyOfVaporization Uncertainty (kJ / mol)</th>\n",
       "      <th>Source</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>298.15</td>\n",
       "      <td>101.325</td>\n",
       "      <td>Liquid</td>\n",
       "      <td>1</td>\n",
       "      <td>CC(C)O</td>\n",
       "      <td>Solvent</td>\n",
       "      <td>1.0</td>\n",
       "      <td>None</td>\n",
       "      <td>0.78270</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.1016/j.fluid.2013.10.034</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>298.15</td>\n",
       "      <td>101.325</td>\n",
       "      <td>Liquid</td>\n",
       "      <td>1</td>\n",
       "      <td>CCO</td>\n",
       "      <td>Solvent</td>\n",
       "      <td>1.0</td>\n",
       "      <td>None</td>\n",
       "      <td>0.78507</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>10.1021/je1013476</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>298.15</td>\n",
       "      <td>101.325</td>\n",
       "      <td>Liquid + Gas</td>\n",
       "      <td>1</td>\n",
       "      <td>CCO</td>\n",
       "      <td>Solvent</td>\n",
       "      <td>1.0</td>\n",
       "      <td>None</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>42.26</td>\n",
       "      <td>0.02</td>\n",
       "      <td>10.1016/S0021-9614(71)80108-8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>298.15</td>\n",
       "      <td>101.325</td>\n",
       "      <td>Liquid + Gas</td>\n",
       "      <td>1</td>\n",
       "      <td>CC(C)O</td>\n",
       "      <td>Solvent</td>\n",
       "      <td>1.0</td>\n",
       "      <td>None</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>45.34</td>\n",
       "      <td>0.02</td>\n",
       "      <td>10.1016/S0021-9614(71)80108-8</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Temperature (K)  ...                         Source\n",
       "0           298.15  ...    10.1016/j.fluid.2013.10.034\n",
       "1           298.15  ...              10.1021/je1013476\n",
       "2           298.15  ...  10.1016/S0021-9614(71)80108-8\n",
       "3           298.15  ...  10.1016/S0021-9614(71)80108-8\n",
       "\n",
       "[4 rows x 13 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "experimental_data_set.to_pandas().head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 224
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 293099,
     "status": "ok",
     "timestamp": 1583292817643,
     "user": {
      "displayName": "",
      "photoUrl": "",
      "userId": ""
     },
     "user_tz": 420
    },
    "id": "PNJ1G1LXlHqq",
    "outputId": "17f510e9-2e7e-458d-cf8b-f70626df919f",
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Temperature (K)</th>\n",
       "      <th>Pressure (kPa)</th>\n",
       "      <th>Phase</th>\n",
       "      <th>N Components</th>\n",
       "      <th>Component 1</th>\n",
       "      <th>Role 1</th>\n",
       "      <th>Mole Fraction 1</th>\n",
       "      <th>Exact Amount 1</th>\n",
       "      <th>Density Value (g / ml)</th>\n",
       "      <th>Density Uncertainty (g / ml)</th>\n",
       "      <th>EnthalpyOfVaporization Value (kJ / mol)</th>\n",
       "      <th>EnthalpyOfVaporization Uncertainty (kJ / mol)</th>\n",
       "      <th>Source</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>298.15</td>\n",
       "      <td>101.325</td>\n",
       "      <td>Liquid</td>\n",
       "      <td>1</td>\n",
       "      <td>CCO</td>\n",
       "      <td>Solvent</td>\n",
       "      <td>1.0</td>\n",
       "      <td>None</td>\n",
       "      <td>0.791767</td>\n",
       "      <td>0.000705</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SimulationLayer</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>298.15</td>\n",
       "      <td>101.325</td>\n",
       "      <td>Liquid + Gas</td>\n",
       "      <td>1</td>\n",
       "      <td>CCO</td>\n",
       "      <td>Solvent</td>\n",
       "      <td>1.0</td>\n",
       "      <td>None</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>39.434820</td>\n",
       "      <td>0.170356</td>\n",
       "      <td>SimulationLayer</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>298.15</td>\n",
       "      <td>101.325</td>\n",
       "      <td>Liquid</td>\n",
       "      <td>1</td>\n",
       "      <td>CC(C)O</td>\n",
       "      <td>Solvent</td>\n",
       "      <td>1.0</td>\n",
       "      <td>None</td>\n",
       "      <td>0.804158</td>\n",
       "      <td>0.000680</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>SimulationLayer</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>298.15</td>\n",
       "      <td>101.325</td>\n",
       "      <td>Liquid + Gas</td>\n",
       "      <td>1</td>\n",
       "      <td>CC(C)O</td>\n",
       "      <td>Solvent</td>\n",
       "      <td>1.0</td>\n",
       "      <td>None</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>45.649979</td>\n",
       "      <td>0.234394</td>\n",
       "      <td>SimulationLayer</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Temperature (K)  ...           Source\n",
       "0           298.15  ...  SimulationLayer\n",
       "1           298.15  ...  SimulationLayer\n",
       "2           298.15  ...  SimulationLayer\n",
       "3           298.15  ...  SimulationLayer\n",
       "\n",
       "[4 rows x 13 columns]"
      ]
     },
     "execution_count": 5,
     "metadata": {
      "tags": []
     },
     "output_type": "execute_result"
    }
   ],
   "source": [
    "estimated_data_set.to_pandas().head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "collapsed": false,
    "id": "X9NjUh89lHqx"
   },
   "source": [
    "## Extracting the Results\n",
    "\n",
    "We will now compare how the value of each property estimated by simulation deviates from the experimental measurement. \n",
    "\n",
    "To do this we will extract a list which contains pairs of experimental and evaluated properties. We can easily match \n",
    "properties based on the unique ids which were automatically assigned to them on their creation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "colab": {},
    "colab_type": "code",
    "id": "kc65RHp_lHqz",
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "properties_by_type = {\n",
    "    \"Density\": [],\n",
    "    \"EnthalpyOfVaporization\": []\n",
    "}\n",
    "\n",
    "for experimental_property in experimental_data_set:\n",
    "\n",
    "    # Find the estimated property which has the same id as the\n",
    "    # experimental property.\n",
    "    estimated_property = next(\n",
    "        x for x in estimated_data_set if x.id == experimental_property.id\n",
    "    )\n",
    "    \n",
    "    # Add this pair of properties to the list of pairs\n",
    "    property_type = experimental_property.__class__.__name__\n",
    "    properties_by_type[property_type].append((experimental_property, estimated_property))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "collapsed": false,
    "id": "I6lPQul9lHq5",
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Plotting the Results\n",
    "\n",
    "We will now compare the experimental results to the estimated ones by plotting them using `matplotlib`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "colab": {
     "base_uri": "https://localhost:8080/",
     "height": 300
    },
    "colab_type": "code",
    "executionInfo": {
     "elapsed": 293750,
     "status": "ok",
     "timestamp": 1583292818301,
     "user": {
      "displayName": "",
      "photoUrl": "",
      "userId": ""
     },
     "user_tz": 420
    },
    "id": "m71PXnHPlHq6",
    "outputId": "9d9ed590-6749-4bef-b4e1-43f014e1a764",
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n38zMrED+P13KmSHw3vp2AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 576x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "tags": []
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot\n",
    "\n",
    "# Create the figure we will plot to.\n",
    "figure, axes = pyplot.subplots(nrows=1, ncols=2, figsize=(8.0, 4.0))\n",
    "\n",
    "# Set the axis titles\n",
    "axes[0].set_xlabel('OpenFF 1.0.0')\n",
    "axes[0].set_ylabel('Experimental')\n",
    "axes[0].set_title('Density $kg m^{-3}$')\n",
    "\n",
    "axes[1].set_xlabel('OpenFF 1.0.0')\n",
    "axes[1].set_ylabel('Experimental')\n",
    "axes[1].set_title('$H_{vap}$ $kJ mol^{-1}$')\n",
    "\n",
    "# Define the preferred units of the properties\n",
    "from openff.evaluator import unit\n",
    "\n",
    "preferred_units = {\n",
    "    \"Density\": unit.kilogram / unit.meter ** 3,\n",
    "    \"EnthalpyOfVaporization\": unit.kilojoule / unit.mole\n",
    "}\n",
    "\n",
    "for index, property_type in enumerate(properties_by_type):\n",
    "\n",
    "    experimental_values = []\n",
    "    estimated_values = []\n",
    "\n",
    "    preferred_unit = preferred_units[property_type]\n",
    "\n",
    "    # Convert the values of our properties to the preferred units.\n",
    "    for experimental_property, estimated_property in properties_by_type[property_type]:\n",
    "        \n",
    "        experimental_values.append(\n",
    "            experimental_property.value.to(preferred_unit).magnitude\n",
    "        )\n",
    "        estimated_values.append(\n",
    "            estimated_property.value.to(preferred_unit).magnitude\n",
    "        )\n",
    "\n",
    "    axes[index].plot(\n",
    "        estimated_values, experimental_values, marker='x', linestyle='None'\n",
    "    )\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "colab_type": "text",
    "collapsed": false,
    "id": "tx8U-ExOlHrA",
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## Conclusion\n",
    "\n",
    "And that concludes the third tutorial!\n",
    "\n",
    "If you have any questions and / or feedback, please open an issue on the\n",
    "[GitHub issue tracker](https://github.com/openforcefield/openff-evaluator/issues)."
   ]
  }
 ],
 "metadata": {
  "colab": {
   "collapsed_sections": [],
   "name": "Copy of tutorial03.ipynb",
   "provenance": [
    {
     "file_id": "1HqdyHBbruwoS6e5FUHcxEmFgUV7CJtyE",
     "timestamp": 1583293097635
    },
    {
     "file_id": "https://github.com/openforcefield/openff-evaluator/blob/master/docs/tutorials/tutorial03.ipynb",
     "timestamp": 1583293048478
    }
   ]
  },
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
