{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Analyzing the flexible path length simulation" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from __future__ import print_function\n", "%matplotlib inline\n", "import openpathsampling as paths\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import os\n", "import openpathsampling.visualize as ops_vis\n", "from IPython.display import SVG" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Load the file, and from the file pull our the engine (which tells us what the timestep was) and the move scheme (which gives us a starting point for much of the analysis)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# note that this log will overwrite the log from the previous notebook\n", "#import logging.config\n", "#logging.config.fileConfig(\"logging.conf\", disable_existing_loggers=False)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "CPU times: user 1min 2s, sys: 3.52 s, total: 1min 6s\n", "Wall time: 1min 6s\n" ] } ], "source": [ "%%time\n", "flexible = paths.AnalysisStorage(\"ad_tps.nc\")\n", "# opening as AnalysisStorage is a little slower, but speeds up the move_summary" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "engine = flexible.engines[0]\n", "flex_scheme = flexible.schemes[0]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "File size: 18.65GB for 10001 steps, 985686 snapshots\n" ] } ], "source": [ "print(\"File size: {0} for {1} steps, {2} snapshots\".format(\n", " flexible.file_size_str,\n", " len(flexible.steps),\n", " len(flexible.snapshots)\n", "))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That tell us a little about the file we're dealing with. Now we'll start analyzing the contents of that file. We used a very simple move scheme (only shooting), so the main information that the `move_summary` gives us is the acceptance of the only kind of move in that scheme. See the MSTIS examples for more complicated move schemes, where you want to make sure that frequency at which the move runs is close to what was expected." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6d9ea6ac33644ce4a0bd7cd57a00a0c1", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value=''), FloatProgress(value=0.0, max=10001.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "shooting ran 100.000% (expected 100.00%) of the cycles with acceptance 5529/10000 (55.29%)\n" ] } ], "source": [ "flex_scheme.move_summary(flexible.steps)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Replica history tree and decorrelated trajectories\n", "\n", "The `ReplicaHistoryTree` object gives us both the history tree (often called the \"move tree\") and the number of decorrelated trajectories.\n", "\n", "A `ReplicaHistoryTree` is made for a certain set of Monte Carlo steps. First, we make a tree of only the first 25 steps in order to visualize it. (All 10000 steps would be unwieldy.) \n", "\n", "After the visualization, we make a second `PathTree` of all the steps. We won't visualize that; instead we use it to count the number of decorrelated trajectories." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "+BFBBFBBFFBBcorstep01481112171819202224" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "replica_history = ops_vis.ReplicaEvolution(replica=0)\n", "tree = ops_vis.PathTree(\n", " flexible.steps[0:25],\n", " replica_history\n", ")\n", "tree.options.css['scale_x'] = 3\n", "\n", "SVG(tree.svg())" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# can write to svg file and open with programs that can read SVG\n", "with open(\"flex_tps_tree.svg\", 'w') as f:\n", " f.write(tree.svg())" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Decorrelated trajectories: 3\n" ] } ], "source": [ "print(\"Decorrelated trajectories:\", len(tree.generator.decorrelated_trajectories))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "All decorrelated trajectories: 846\n", "CPU times: user 1min 22s, sys: 321 ms, total: 1min 22s\n", "Wall time: 1min 22s\n" ] } ], "source": [ "%%time\n", "full_history = ops_vis.PathTree(\n", " flexible.steps,\n", " ops_vis.ReplicaEvolution(\n", " replica=0\n", " )\n", ")\n", "\n", "n_decorrelated = len(full_history.generator.decorrelated_trajectories)\n", "\n", "print(\"All decorrelated trajectories:\", n_decorrelated)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Path length distribution\n", "\n", "Flexible length TPS gives a distribution of path lengths. Here we calculate the length of every accepted trajectory, then histogram those lengths, and calculate the maximum and average path lengths.\n", "\n", "We also use `engine.snapshot_timestep` to convert the count of frames to time, including correct units." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Maximum: 449 (8.980 ps)\n", "Average: 84.56 (1.691 ps)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "path_lengths = [len(step.active[0].trajectory) for step in flexible.steps]\n", "plt.hist(path_lengths, bins=40, alpha=0.5);\n", "print(\"Maximum:\", max(path_lengths), \n", " \"(\"+(max(path_lengths)*engine.snapshot_timestep).format(\"%.3f\")+\")\")\n", "print (\"Average:\", \"{0:.2f}\".format(np.mean(path_lengths)),\n", " \"(\"+(np.mean(path_lengths)*engine.snapshot_timestep).format(\"%.3f\")+\")\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Path density histogram\n", "\n", "Next we will create a path density histogram. Calculating the histogram itself is quite easy: first we reload the collective variables we want to plot it in (we choose the phi and psi angles). Then we create the empty path density histogram, by telling it which CVs to use and how to make the histogram (bin sizes, etc). Finally, we build the histogram by giving it the list of active trajectories to histogram." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "from openpathsampling.numerics import HistogramPlotter2D" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "psi = flexible.cvs['psi']\n", "phi = flexible.cvs['phi']\n", "deg = 180.0 / np.pi" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "path_density = paths.PathDensityHistogram(cvs=[phi, psi],\n", " left_bin_edges=(-180/deg,-180/deg),\n", " bin_widths=(2.0/deg,2.0/deg))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "48a614f7c58f423682e8b13a43f44b05", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(HTML(value=''), FloatProgress(value=0.0, max=10001.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "path_dens_counter = path_density.histogram([s.active[0].trajectory for s in flexible.steps])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we've built the path density histogram, and we want to visualize it. We have a convenient `plot_2d_histogram` function that works in this case, and takes the histogram, desired plot tick labels and limits, and additional `matplotlib` named arguments to `plt.pcolormesh`." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tick_labels = np.arange(-np.pi, np.pi+0.01, np.pi/4)\n", "plotter = HistogramPlotter2D(path_density, \n", " xticklabels=tick_labels,\n", " yticklabels=tick_labels, \n", " label_format=\"{:4.2f}\")\n", "ax = plotter.plot(cmap=\"Blues\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convert to MDTraj for analysis by external tools\n", "\n", "The trajectory can be converted to an MDTraj trajectory, and then used anywhere that MDTraj can be used. This includes writing it to a file (in any number of file formats) or visualizing the trajectory using, e.g., NGLView." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ops_traj = flexible.steps[1000].active[0].trajectory\n", "traj = ops_traj.to_mdtraj()\n", "traj" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Here's how you would then use NGLView:\n", "#import nglview as nv\n", "#view = nv.show_mdtraj(traj)\n", "#view" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "flexible.close()" ] } ], "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.8" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": true, "sideBar": true, "skip_h1_title": true, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": true }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "072e689f3ff442098bfbb72d7bfe0128": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_ba6f4a4a33ca449fafed2501220630fa", "style": "IPY_MODEL_076f3b6e16cf41669e6836684364f4a4", "value": " 10001/10001 [02:01<00:00, 82.01it/s]" } }, "076f3b6e16cf41669e6836684364f4a4": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "description_width": "" } }, "0ceb43b5a8ec4110a0c7d255faaeccf0": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "description_width": "" } }, "1c7a82694e9e4b8984c2784a2be65b3b": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "2ec07b6f4e0543a280aa283c9b502b76": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "FloatProgressModel", "state": { "bar_style": "success", "layout": "IPY_MODEL_b6e930bc9ceb43c4b7fd9cde02008310", "max": 10001, "style": "IPY_MODEL_cf10d2fa4b0a40cca143fae16c41c342", "value": 10001 } }, "38a10ee289aa486ebe0cec8e2ce74d4c": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "48a614f7c58f423682e8b13a43f44b05": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HBoxModel", "state": { "children": [ "IPY_MODEL_517e0f594e9b40138cc997d371a9d141", "IPY_MODEL_2ec07b6f4e0543a280aa283c9b502b76", "IPY_MODEL_c42228d3aa6744b2b3789f702c706030" ], "layout": "IPY_MODEL_c162e8a3a8884efa9ffde682f591cfe1" } }, "517e0f594e9b40138cc997d371a9d141": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_864991f30c684ec4a4adb30e084b7de3", "style": "IPY_MODEL_0ceb43b5a8ec4110a0c7d255faaeccf0", "value": "100%" } }, "610249cfd1ba4df48aeb805331c087f7": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "description_width": "" } }, "6486501647e4483c8d6d56521b987909": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "6d9ea6ac33644ce4a0bd7cd57a00a0c1": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HBoxModel", "state": { "children": [ "IPY_MODEL_9fd2d9446de14152a348e8cbe8f694f1", "IPY_MODEL_705206a17997442fa15856bf4a49cf9f", "IPY_MODEL_072e689f3ff442098bfbb72d7bfe0128" ], "layout": "IPY_MODEL_6486501647e4483c8d6d56521b987909" } }, "705206a17997442fa15856bf4a49cf9f": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "FloatProgressModel", "state": { "bar_style": "success", "layout": "IPY_MODEL_38a10ee289aa486ebe0cec8e2ce74d4c", "max": 10001, "style": "IPY_MODEL_c626d27db8044405bea559fb5162f882", "value": 10001 } }, "780c392f82404ce3b5049dbde4461d4c": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "DescriptionStyleModel", "state": { "description_width": "" } }, "864991f30c684ec4a4adb30e084b7de3": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "9fd2d9446de14152a348e8cbe8f694f1": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_fa8db0dff6f3467eb1b850fcdd0794d7", "style": "IPY_MODEL_610249cfd1ba4df48aeb805331c087f7", "value": "100%" } }, "b6e930bc9ceb43c4b7fd9cde02008310": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "ba6f4a4a33ca449fafed2501220630fa": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "c162e8a3a8884efa9ffde682f591cfe1": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} }, "c42228d3aa6744b2b3789f702c706030": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "HTMLModel", "state": { "layout": "IPY_MODEL_1c7a82694e9e4b8984c2784a2be65b3b", "style": "IPY_MODEL_780c392f82404ce3b5049dbde4461d4c", "value": " 10001/10001 [02:29<00:00, 67.01it/s]" } }, "c626d27db8044405bea559fb5162f882": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ProgressStyleModel", "state": { "description_width": "" } }, "cf10d2fa4b0a40cca143fae16c41c342": { "model_module": "@jupyter-widgets/controls", "model_module_version": "1.5.0", "model_name": "ProgressStyleModel", "state": { "description_width": "" } }, "fa8db0dff6f3467eb1b850fcdd0794d7": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": {} } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 }