{ "cells": [ { "attachments": {}, "cell_type": "markdown", "id": "531e3b0a", "metadata": {}, "source": [ "# WEDAP Figures\n", "\n", "---\n", "**WEDAP** : **W**eighted **E**nsemble **D**ata **A**nalysis and **P**lotting (pronounced we-dap)\n", "

\n", " \"wedap\n", "

\n", "\n", "This notebook is a more bare-bones (less explanations) example of how the figures for the `WEDAP` paper were created. More details about the plots can be found in the actual paper. \n", "\n", "For general examples and explanations, see the [wedap demo jupyter notebook](https://github.com/darianyang/wedap/blob/main/docs/notebook/wedap_demo.ipynb). Note there is some similarity with the examples in the demo notebook and some of the examples in this notebook." ] }, { "cell_type": "markdown", "id": "7ea950e7-90ad-4c96-b7e1-74019ce6a1a4", "metadata": {}, "source": [ "The format of the notebook will be to demonstrate creating each plot separately using the CLI (if available) and the Python API. All examples assume you're running them in the `paper_figures/` directory.\n", "\n", "CLI commands are denoted in markdown as follows:\n", "```\n", "$ wedap --help\n", "```\n", "\n", "Python API scripting is done directly within the cells of the Jupyter notebook.\n", "\n", "**The main `WEDAP` plotting arguments:**\n", "\n", "Available `--data-type` || `data_type` options:\n", "* `evolution` -- plot the evolution of a 1D pcoord over each WE iteration.\n", "* `average` -- plot 1D or 2D+ using a range of WE iterations.\n", "* `instant` -- plot 1D or 2D+ using a single WE iteration.\n", "\n", "Available `--plot-mode` || `plot_mode` options:\n", "* `line` -- plot 1D lines.\n", "* `hist` -- plot histogram (default).\n", "* `hist_l` -- plot histogram and contour lines.\n", "* `contour` -- plot contour levels and lines.\n", "* `contour_f` -- plot contour levels only.\n", "* `contour_l` -- plot contour lines only.\n", "* `scatter3d` -- plot 3 datasets in a scatter plot.\n", "* `hexbin3d` -- plot 3 datasets in a hexbin plot." ] }, { "cell_type": "code", "execution_count": 1, "id": "d05d1d84", "metadata": {}, "outputs": [], "source": [ "import wedap\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 9, "id": "6020c897", "metadata": {}, "outputs": [], "source": [ "# optionally apply default wedap matplotlib style sheet\n", "plt.style.use(\"default.mplstyle\")" ] }, { "attachments": {}, "cell_type": "markdown", "id": "891da989", "metadata": {}, "source": [ "### Example 1: Evolution Plot" ] }, { "cell_type": "markdown", "id": "b66e6650-dcec-4539-958d-cfab5bd1e3fb", "metadata": {}, "source": [ "This is a classic plot of the evolution of a WE simulation, plotting the probability distribution on the X axis as you progress through each iteration of the WE simulation on the Y axis. The colorbar is showing the probability values of each bin in the histogram. The probability values are derived from the raw data count values of the multiple segments in each WE iteration in the west.h5 file, weighted by each segment weight. This weighted histogram is normalized and shown on an inverted natural log scale: $-\\ln(\\frac{P(x)}{P(max)})$" ] }, { "attachments": {}, "cell_type": "markdown", "id": "0d7e0bf9", "metadata": {}, "source": [ "```\n", "$ wedap -W west.h5 --data-type evolution --xlabel \"Heavy Atom RMSD ($\\AA$)\"\n", "```" ] }, { "cell_type": "code", "execution_count": 3, "id": "01dc607d", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "7c262469775242f5aedfde46cf914877", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Evolution: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap.H5_Plot(h5=\"west.h5\", data_type=\"evolution\").plot()\n", "plt.xlabel(\"Heavy Atom RMSD ($\\AA$)\")\n", "plt.ylabel(\"WE Iteration\")" ] }, { "attachments": {}, "cell_type": "markdown", "id": "f9713446", "metadata": {}, "source": [ "### Example 2: 1D Probability Distribution" ] }, { "attachments": {}, "cell_type": "markdown", "id": "864c231f", "metadata": {}, "source": [ "You can also make simple 1D plots for a single iteration `--data-type instant` || `data_type='instant'` or for the average of a range of iterations `--data-type average` || `data_type='average'`. Here we show the average probability distribution for the entire range of WE iterations in the input `west.h5` file." ] }, { "attachments": {}, "cell_type": "markdown", "id": "fa47ede8", "metadata": {}, "source": [ "```\n", "$ wedap -W west.h5 -dt average --plot-mode line --xlabel \"Heavy Atom RMSD ($\\AA$)\"\n", "```" ] }, { "cell_type": "code", "execution_count": 4, "id": "d4096cb9", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "fe8b3678468d4c169ae27ce74c3eb975", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 1D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap.H5_Plot(h5=\"west.h5\", data_type=\"average\", plot_mode=\"line\").plot()\n", "plt.xlabel(\"Heavy Atom RMSD ($\\AA$)\")" ] }, { "attachments": {}, "cell_type": "markdown", "id": "eb137a87-7873-4784-8090-768469147519", "metadata": {}, "source": [ "We can make advanced plots using this 1D framework:\n", "\n", "Here we plot multiple datasets on one plot and also include the data from standard MD." ] }, { "attachments": {}, "cell_type": "markdown", "id": "73ed74a5-f29c-421a-9b87-79623877871f", "metadata": {}, "source": [ "We can also directly compare multiple aux or pcoord datasets on a single axis." ] }, { "attachments": {}, "cell_type": "markdown", "id": "ce4bc169-e34c-4600-a537-cf99e2a86a7b", "metadata": {}, "source": [ "If we wanted to, mdap could then be used to compare standard MD data to WE data." ] }, { "cell_type": "code", "execution_count": 47, "id": "dfe9274e-f5cc-4727-ac1f-07691e5a45d6", "metadata": {}, "outputs": [], "source": [ "# change style back to wedap default\n", "import matplotlib as mpl\n", "mpl.rcParams.update(mpl.rcParamsDefault)\n", "plt.style.use(\"default.mplstyle\")" ] }, { "cell_type": "code", "execution_count": 73, "id": "4e5f14c0-394a-42e6-b6ba-6514e3942f2e", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9cb0624558de40c9b26ebe08b6b374f8", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 1D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import mdap\n", "\n", "fig, ax = plt.subplots()\n", "\n", "for i, j in zip([\"RMS_Backbone\", \"RMS_Heavy\"],[\"Backbone RMSD\", \"Heavy Atom RMSD\"]):\n", " wedap.H5_Plot(h5=\"west.h5\", data_type=\"average\", ax=ax, plot_mode=\"line\",\n", " Xname=i, data_label=j).plot()\n", "\n", "# extra line needed to also plot the standard MD distribution data\n", "mdap.MD_Plot(Xname=\"rms_heavy_nmr.dat\", data_type=\"pdist\", plot_mode=\"line\", \n", " data_label=\"From MD\", ax=ax, color=\"gray\").plot()\n", "\n", "ax.set_xlabel(\"RMSD ($\\AA$)\")\n", "plt.legend()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "25f7bfbd-a7ee-4011-8a9b-d1c768aea20b", "metadata": {}, "source": [ "But keep in mind that this example doesn't make too much sense because the datasets between standard MD and WE are for different systems and metrics. Ideally, you could use this framework to compare the same calculation for the same system to see how (hopefully) the WE simulation was able to explore the landscape better than standard MD." ] }, { "cell_type": "code", "execution_count": 23, "id": "bf8cd4a0-8bcb-4162-95ee-0e63f7084bf8", "metadata": {}, "outputs": [], "source": [ "# save the resulting figure\n", "fig.tight_layout()\n", "fig.savefig(\"e2.png\")" ] }, { "attachments": {}, "cell_type": "markdown", "id": "7d22b696", "metadata": {}, "source": [ "### Example 3: 2D Probability Distribution" ] }, { "attachments": {}, "cell_type": "markdown", "id": "20ca64d2", "metadata": {}, "source": [ "We can also make probability distributions using two datasets, first we can try this with just our two dimensional progress coordinates. Note that you can set the progress coordinate or any aux dataset index using `Xindex`, `Yindex`, and `Zindex`. This can be useful for multi-dimensional progress coordinates, but also for multi-dimensional auxiliary data." ] }, { "attachments": {}, "cell_type": "markdown", "id": "e8356268", "metadata": {}, "source": [ "```\n", "$ wedap -W west.h5 --xlabel \"Heavy Atom RMSD ($\\AA$)\" -dt average -y RoG --ylabel \"Radius of Gyration ($\\AA$)\"\n", "```" ] }, { "cell_type": "code", "execution_count": 5, "id": "7d540f94", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f7723d00277045f7b70f5994ad7dc0c5", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 2D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap.H5_Plot(h5=\"west.h5\", data_type=\"average\", Xindex=0, Yname=\"RoG\", Yindex=0).plot()\n", "plt.xlabel(\"Heavy Atom RMSD ($\\AA$)\")\n", "plt.ylabel(\"Radius of Gyration ($\\AA$)\")" ] }, { "attachments": {}, "cell_type": "markdown", "id": "f30d82ba", "metadata": {}, "source": [ "### Example 4: 3D Scatter Plot" ] }, { "attachments": {}, "cell_type": "markdown", "id": "3667027f", "metadata": {}, "source": [ "What if you don't want to show the probability axis? Well, you can also just show how three different datasets are related in a 3D scatter plot. Here we can put two different aux datasets on the X and Y axes and we can set the colorbar to show the progress coordinate values in comparison:" ] }, { "attachments": {}, "cell_type": "markdown", "id": "09f3c82c", "metadata": {}, "source": [ "```\n", "$ wedap -W west.h5 --xlabel \"Radius of Gyration ($\\AA$)\" -x RoG -dt average -y Total_SASA --ylabel \"SASA ($\\AA^2$)\" -z pcoord --cbar-label \"Heavy Atom RMSD ($\\AA$)\" -pm scatter3d --scatter-interval 10 --scatter-size 1\n", "```" ] }, { "cell_type": "code", "execution_count": 6, "id": "a15a82c4", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4c55a23d777846519fc6e908d172d927", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Data 3D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap.H5_Plot(h5=\"west.h5\", data_type=\"average\", plot_mode=\"scatter3d\", \n", " Xname=\"RoG\", Yname=\"Total_SASA\", Zname=\"pcoord\",\n", " cbar_label=\"Heavy Atom RMSD ($\\AA$)\", scatter_interval=10, scatter_size=1,\n", " xlabel=\"Radius of Gyration ($\\AA$)\", ylabel=\"SASA ($\\AA^2$)\").plot()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ded328ca-8fc9-41f5-a301-e79c86a5ff04", "metadata": {}, "source": [ "### Example 5: 3D Hexbin Plot" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ebc1e187-0dd7-479a-9310-8db8783934f5", "metadata": {}, "source": [ "We can make a similar 3D plot using hexbins." ] }, { "attachments": {}, "cell_type": "markdown", "id": "399c6d4a-120c-4941-b1bb-5a7e13f45340", "metadata": {}, "source": [ "```\n", "$ wedap -W west.h5 --xlabel \"Radius of Gyration ($\\AA$)\" -x RoG -dt average -y Total_SASA --ylabel \"SASA ($\\AA^2$)\" -z pcoord --cbar-label \"Heavy Atom RMSD ($\\AA$)\" -pm hexbin3d --hexbin-grid 25\n", "```" ] }, { "cell_type": "code", "execution_count": 7, "id": "864515c5-1d47-491f-bb31-4f885050060d", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "abe0b6f4ee074ee696a4aa3075f21fe6", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Data 3D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap.H5_Plot(h5=\"west.h5\", data_type=\"average\", plot_mode=\"hexbin3d\", \n", " Xname=\"RoG\", Yname=\"Total_SASA\", Zname=\"pcoord\",\n", " cbar_label=\"Heavy Atom RMSD ($\\AA$)\", hexbin_grid=25,\n", " xlabel=\"Radius of Gyration ($\\AA$)\", ylabel=\"SASA ($\\AA^2$)\").plot()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "0311d610-c907-4da3-8acd-f70d6012d2a2", "metadata": {}, "source": [ "### Example 6: 2D Hist with contour lines" ] }, { "cell_type": "markdown", "id": "0b40d152-1ec9-4f7c-80ae-d18bcccbead6", "metadata": {}, "source": [ "```\n", "$ wedap -h5 west.h5 -dt average -pm hist_l -X pcoord -Y RoG --xlabel \"Heavy Atom RMSD ($\\AA$)\" --ylabel \"Radius of Gyration ($\\AA$)\" --contour-interval 1 --pmax 20 -pu kcal --cmap afmhot_r --color k -lw 0.4 -sl 1 -hrx 2 6.5 -hry 17 20.5\n", "```" ] }, { "cell_type": "code", "execution_count": 32, "id": "15d17730-7600-49e6-9620-c5562372176f", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "5ca24c71f98544d3a65b40616c64ee42", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 2D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# if there is alot of plotting choices, it can be easier to just put it all into a dictionary\n", "plot_options = {\"h5\" : \"west.h5\",\n", " \"data_type\" : \"average\", \n", " \"plot_mode\" : \"hist_l\",\n", " \"color\" : \"k\",\n", " \"Xname\" : \"pcoord\", \n", " \"Yname\" : \"RoG\", \n", " \"p_units\" : \"kcal\",\n", " \"cmap\" : \"afmhot_r\",\n", " \"xlabel\" : \"Heavy Atom RMSD ($\\AA$)\",\n", " \"ylabel\" : \"Radius of Gyration ($\\AA$)\",\n", " \"p_max\" : 20,\n", " \"contour_interval\" : 1,\n", " \"linewidth\" : 0.4,\n", " \"smoothing_level\" : 1,\n", " \"histrange_x\" : (2, 6.5),\n", " \"histrange_y\" : (17, 20.5),\n", " }\n", "wedap.H5_Plot(**plot_options).plot()\n", "plt.tight_layout()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "ab4c7b48-71e5-45f4-8aa5-397cff951b37", "metadata": {}, "source": [ "We can also use the histogram from WE and grab the contour lines overlaid from standard MD:" ] }, { "cell_type": "code", "execution_count": 72, "id": "ed13dd1c-8a47-4293-99d9-67a5df0cc388", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9ab3a12014264375b24fce559677c595", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 2D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import mdap\n", "\n", "fig, ax = plt.subplots()\n", "\n", "# if there is alot of plotting choices, it can be easier to just put it all into a dictionary\n", "plot_options = {\"h5\" : \"west.h5\",\n", " \"data_type\" : \"average\", \n", " \"plot_mode\" : \"hist\",\n", " \"color\" : \"k\",\n", " \"Xname\" : \"RMS_Heavy\", \n", " \"Yname\" : \"RoG\", \n", " \"p_units\" : \"kcal\",\n", " \"cmap\" : \"afmhot_r\",\n", " \"xlabel\" : \"Heavy Atom RMSD ($\\AA$)\",\n", " \"ylabel\" : \"Radius of Gyration ($\\AA$)\",\n", " \"p_max\" : 20,\n", " \"contour_interval\" : 1,\n", " \"linewidth\" : 0.4,\n", " \"smoothing_level\" : 1,\n", " \"histrange_x\" : (1, 6.5),\n", " \"histrange_y\" : (17, 20.5),\n", " \"ax\" : ax,\n", " }\n", "wedap.H5_Plot(**plot_options).plot()\n", "\n", "mdap.MD_Plot(Xname=\"rms_heavy_nmr.dat\", Yname=\"RoG.dat\", ax=ax, plot_mode=\"contour_l\", #p_max=3, p_units=\"kT\",\n", " data_type=\"pdist\", color=\"gray\", linewidth=0.5, smoothing_level=1, contour_interval=1.5).plot(cbar=False)\n", "\n", "plt.tight_layout()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "671eb842-ef3b-493e-89d4-f2c4adb6623b", "metadata": {}, "source": [ "### Example 7: 3D Contour Plot" ] }, { "cell_type": "markdown", "id": "0a078bc0-4281-4533-aa21-8592f272bb2f", "metadata": {}, "source": [ "```\n", "$ wedap -h5 west.h5 -dt average -pm contour -X pcoord -Y RoG --xlabel \"Heavy Atom RMSD ($\\AA$)\" --ylabel \"Radius of Gyration ($\\AA$)\" --contour-interval 0.2 --zlabel \"-RT ln(P) (kcal/mol)\" --p-units kcal -3d --style None\n", "```" ] }, { "cell_type": "code", "execution_count": 12, "id": "1aab4cd6-d841-432b-bb20-28e7e4c997f6", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a7fa99e87eab4d1b92f64b4e2660cee0", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 2D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# if there is alot of plotting choices, it can be easier to just put it all into a dictionary\n", "plot_options = {\"h5\" : \"west.h5\",\n", " \"data_type\" : \"average\", \n", " \"plot_mode\" : \"contour\", \n", " \"Xname\" : \"pcoord\", \n", " \"Yname\" : \"RoG\", \n", " \"zlabel\" : \"-RT ln(P) (kcal/mol)\",\n", " \"p_units\" : \"kcal\",\n", " \"xlabel\" : \"Heavy Atom RMSD ($\\AA$)\",\n", " \"ylabel\" : \"Radius of Gyration ($\\AA$)\",\n", " \"contour_interval\" : 0.2,\n", " \"proj3d\" : True,\n", " }\n", "# default None mpl style\n", "plt.style.use('default')\n", "wedap.H5_Plot(**plot_options).plot()\n", "plt.tight_layout()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "4fdb76c6", "metadata": {}, "source": [ "### Example 8: Joint Plot" ] }, { "attachments": {}, "cell_type": "markdown", "id": "4f5eebdc", "metadata": {}, "source": [ "Here, I want to demonstrate some of the additional features available by making a more complicated joint plot. This is using a contour plot instead of a histogram, as set by `--plot-mode contour` || `plot_mode='contour'`, there is also custom colormapping (`--cmap`), probability units (`--p-units`), iteration ranges (`--first-iter`, `--last-iter`), probability limits (`--pmin`, `--pmax`), plot style (`--style`), data smoothing (`--smoothing-level`), and plot limits (`--xlim`, `--ylim`)." ] }, { "attachments": {}, "cell_type": "markdown", "id": "88533ebd", "metadata": {}, "source": [ "```\n", "$ wedap -W west.h5 -dt average -pm contour_f -x pcoord -y RoG --xlabel \"Heavy Atom RMSD ($\\AA$)\" --ylabel \"Radius of Gyration ($\\AA$)\" --joint-plot -pm contour_f --cmap gnuplot_r --style ggplot --p-units kcal --first-iter 3 --last-iter 200 --pmin 0.5 --pmax 17.5 --smoothing-level 1 --xlim 2 6.5 --ylim 17 20.5\n", "```" ] }, { "cell_type": "code", "execution_count": 34, "id": "fac65425", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b8aac847300c4e05a62aea7a5a448587", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 2D: 0%| | 0/198 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# if there is alot of plotting choices, it can be easier to just put it all into a dictionary\n", "plot_options = {\"h5\" : \"west.h5\",\n", " \"data_type\" : \"average\", \n", " \"plot_mode\" : \"contour_f\", \n", " \"Xname\" : \"pcoord\", \n", " \"Yname\" : \"RoG\", \n", " \"cmap\" : \"gnuplot_r\",\n", " \"jointplot\" : True, \n", " \"p_units\" : \"kcal\",\n", " \"first_iter\" : 3, \n", " \"last_iter\" : 200, \n", " \"p_min\" : 0.5, \n", " \"p_max\" : 17.5,\n", " \"smoothing_level\" :1,\n", " # the input plot_options kwarg dict is also parsed for matplotlib formatting keywords\n", " \"xlabel\" : \"Heavy Atom RMSD ($\\AA$)\",\n", " \"ylabel\" : \"Radius of Gyration ($\\AA$)\",\n", " \"xlim\" : (2, 6.5),\n", " \"ylim\" : (17, 20.5),\n", " \"style\" : \"ggplot\",\n", " }\n", "# set style\n", "plt.style.use(\"ggplot\")\n", "# change size since joint plots take more space\n", "plt.rcParams[\"figure.figsize\"] = (6,4)\n", "wedap.H5_Plot(**plot_options).plot()\n", "\n", "# save the resulting figure\n", "plt.tight_layout()\n", "plt.savefig(\"e6.png\", transparent=False)" ] }, { "cell_type": "code", "execution_count": 11, "id": "3e4a5f3f", "metadata": {}, "outputs": [], "source": [ "# change style back to wedap default\n", "import matplotlib as mpl\n", "mpl.rcParams.update(mpl.rcParamsDefault)\n", "plt.style.use(\"default.mplstyle\")" ] }, { "attachments": {}, "cell_type": "markdown", "id": "505e5d28-aa7d-4b22-9fff-ba108d19494e", "metadata": {}, "source": [ "### Example 9: 4D Scatter Plot" ] }, { "cell_type": "markdown", "id": "47ee53bc-8f18-4293-bd9b-50dc9fb09c0f", "metadata": {}, "source": [ "```\n", "$ wedap -h5 west.h5 -dt average -pm scatter3d -X Total_SASA -Y RoG -Z pcoord -C Num_Inter_NC --cmap gnuplot_r --p-units kcal --xlabel \"SASA ($\\AA^2$)\" --ylabel \"Radius of Gyration ($\\AA$)\" --zlabel \"Heavy Atom RMSD ($\\AA$)\" --cbar-label \"Number of Native Contacts\" -4d --style None\n", "```" ] }, { "cell_type": "code", "execution_count": 13, "id": "24dbd232-454b-4584-9d4c-13695b838fc5", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a665480cc6ec43d39fdc440eee101543", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Data 4D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# if there is alot of plotting choices, it can be easier to just put it all into a dictionary\n", "plot_options = {\"h5\" : \"west.h5\",\n", " \"data_type\" : \"average\", \n", " \"plot_mode\" : \"scatter3d\",\n", " \"Xname\" : \"Total_SASA\",\n", " \"Yname\" : \"RoG\",\n", " \"Zname\" : \"pcoord\", \n", " \"Cname\" : \"Num_Inter_NC\",\n", " \"cmap\" : \"gnuplot_r\",\n", " \"p_units\" : \"kcal\",\n", " \"xlabel\" : \"SASA ($\\AA^2$)\",\n", " \"ylabel\" : \"Radius of Gyration ($\\AA$)\",\n", " \"zlabel\" : \"Heavy Atom RMSD ($\\AA$)\",\n", " \"cbar_label\" : \"Number of Native Contacts\",\n", " \"proj4d\" : True,\n", " }\n", "wedap.H5_Plot(**plot_options).plot()\n", "plt.tight_layout()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "f8fc5e44", "metadata": {}, "source": [ "### Example 10: Tracing Trajectories" ] }, { "attachments": {}, "cell_type": "markdown", "id": "795f6de5", "metadata": {}, "source": [ "We often want to see how a single continuous trajectory evolves as the WE simulation progresses. \n", "\n", "If we want to trace the path to get to iteration 200 and segment 1:" ] }, { "attachments": {}, "cell_type": "markdown", "id": "34850206", "metadata": {}, "source": [ "```\n", "$ wedap -W west.h5 --xlabel \"Heavy Atom RMSD ($\\AA$)\" -dt average -y RoG --ylabel \"Radius of Gyration ($\\AA$)\" --trace-seg 200 20\n", "```" ] }, { "cell_type": "code", "execution_count": 5, "id": "36b9b30d", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f18809d6602449d0a51fea1b85d39cd8", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 2D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap_obj = wedap.H5_Plot(h5=\"west.h5\", data_type=\"average\", Xindex=0, Yname=\"RoG\")\n", "wedap_obj.plot()\n", "wedap_obj.plot_trace((200,20), ax=wedap_obj.ax)\n", "plt.xlabel(\"Heavy Atom RMSD ($\\AA$)\")\n", "plt.ylabel(\"Radius of Gyration ($\\AA$)\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 53, "id": "bd0e9dfb", "metadata": {}, "outputs": [], "source": [ "# save the resulting figure\n", "wedap_obj.fig.tight_layout()\n", "wedap_obj.fig.savefig(\"trace-seg.pdf\")" ] }, { "attachments": {}, "cell_type": "markdown", "id": "fe60555b", "metadata": {}, "source": [ "Or we can trace by values, let's say we want to find a walker that goes to a pcoord value of 5.5 and an aux value of 19.5:" ] }, { "attachments": {}, "cell_type": "markdown", "id": "415df9d3-b6c4-44ef-87ec-308f47e427aa", "metadata": {}, "source": [ "```\n", "$ wedap -W west.h5 --xlabel \"Heavy Atom RMSD ($\\AA$)\" -dt average -y RoG --ylabel \"Radius of Gyration ($\\AA$)\" --trace-val 5.5 19.5\n", "```" ] }, { "cell_type": "code", "execution_count": 3, "id": "c6b74f74-a8d0-47ac-8233-d9a0521a96f9", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "8f58478bc6984069a7dec105685c7108", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 2D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap_obj = wedap.H5_Plot(h5=\"west.h5\", data_type=\"average\", Xindex=0, Yname=\"RoG\")\n", "wedap_obj.plot()\n", "wedap_obj.plot_trace((5.5, 19.5), ax=wedap_obj.ax, find_iter_seg=True)\n", "plt.xlabel(\"Heavy Atom RMSD ($\\AA$)\")\n", "plt.ylabel(\"Radius of Gyration ($\\AA$)\")\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "0a18f7fa", "metadata": {}, "source": [ "We also get an output line of which iteration and segment the trace corresponds to." ] }, { "cell_type": "code", "execution_count": 57, "id": "2fbb0d9f", "metadata": {}, "outputs": [], "source": [ "# save the resulting figure\n", "wedap_obj.fig.tight_layout()\n", "wedap_obj.fig.savefig(\"trace-val.pdf\")" ] }, { "cell_type": "markdown", "id": "92caa46d-cbf7-4ea8-89a4-081ae449dde4", "metadata": {}, "source": [ "Next, a hexbin plot with multiple traces on top (inspired by Lorenzo Casalino)." ] }, { "cell_type": "code", "execution_count": 4, "id": "bedede50-c50a-4f92-8b6b-7e7b40060b9f", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "fd9c6fb2fe144883b2dd330768a1039c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Data 3D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap_obj = wedap.H5_Plot(h5=\"west.h5\", data_type=\"average\", plot_mode=\"hexbin3d\", \n", " Xname=\"RMS_Backbone\", Yname=\"RoG\", Zname=\"Num_Inter_NC\",\n", " xlabel=\"Backbone RMSD ($\\AA$)\", hexbin_grid=25, color=\"white\", linewidth=0.2,\n", " ylabel=\"Radius of Gyration ($\\AA$)\", cbar_label=\"Native Contacts\")\n", "wedap_obj.plot()\n", "\n", "wedap_obj.plot_trace((5.5, 19.5), ax=wedap_obj.ax, color=\"gold\", linewidth=0.5, find_iter_seg=True)\n", "wedap_obj.plot_trace((200, 20), ax=wedap_obj.ax, color=\"snow\", linewidth=0.5)\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 5, "id": "0bc08140-4798-424b-ac83-655cf600f848", "metadata": {}, "outputs": [], "source": [ "# save the resulting figure\n", "wedap_obj.fig.tight_layout()\n", "wedap_obj.fig.savefig(\"e10.png\")" ] }, { "attachments": {}, "cell_type": "markdown", "id": "7d462f5a", "metadata": {}, "source": [ "### Example 11: Data Extraction for Machine Learning" ] }, { "attachments": {}, "cell_type": "markdown", "id": "07af95cc", "metadata": {}, "source": [ "In this example, I will go through how to extract data from a `west.h5` file using `wedap` and then we can directly pass the data to other Python libraries such as `scikit-learn` to do some clustering and pca." ] }, { "cell_type": "code", "execution_count": 12, "id": "d45074c6", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "6303f0057ca94ff6a392b9edccdaa7ca", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Getting Data Array: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from sklearn.cluster import KMeans\n", "from sklearn.decomposition import PCA\n", "from sklearn.preprocessing import MinMaxScaler\n", "import numpy as np\n", "\n", "# load h5 file into pdist class\n", "data = wedap.H5_Pdist(\"west.h5\", data_type=\"average\")\n", "\n", "# extract weights\n", "weights = data.get_all_weights()\n", "\n", "# extract data arrays (can be pcoord or any aux data name)\n", "X = data.get_total_data_array(\"pcoord\", 0)\n", "Y = data.get_total_data_array(\"RoG\", 0)\n", "Z = data.get_total_data_array(\"Total_SASA\", 0)\n", "A = data.get_total_data_array(\"Num_Inter_NC\", 0)\n", "\n", "# put data together column wise\n", "features = np.hstack((X,Y,Z,A))\n", "\n", "# scale data\n", "scaler = MinMaxScaler()\n", "features = scaler.fit_transform(features)\n", "\n", "# do PCA\n", "pca = PCA(n_components=2)\n", "PCs = pca.fit_transform(features)\n", "\n", "# -ln(W/W(max)) weights\n", "weights_expanded = -np.log(weights/np.max(weights))\n", "\n", "# cluster pdist using weighted k-means\n", "clust = KMeans(n_clusters=4).fit(PCs, sample_weight=weights_expanded)\n", "\n", "# create plot base\n", "fig, ax = plt.subplots()\n", "\n", "# plot\n", "ax.scatter(PCs[:,0], PCs[:,1], c=clust.labels_, cmap=\"viridis\", s=1, alpha=0.5)\n", "\n", "# labels\n", "ax.set_xlabel(\"PC1\")\n", "ax.set_ylabel(\"PC2\")\n", "\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "0bf95c48-0b95-488b-953a-30c9b2df2269", "metadata": {}, "source": [ "Now we have a plot along the first two principal components with cluster labels as the colors. Note that this isn't necessarily the most rigorous example, but more of a demonstration of how to use `wedap` with a library like `sklearn`." ] }, { "cell_type": "code", "execution_count": 13, "id": "a412d8e7", "metadata": {}, "outputs": [], "source": [ "# save the resulting figure\n", "fig.tight_layout()\n", "fig.savefig(\"e11.png\")" ] }, { "cell_type": "markdown", "id": "a72cd2af-5fa4-4ee0-a554-dfdb1c09ba9a", "metadata": {}, "source": [ "We can also input the arrays for PC1 and PC2 and plot the 2D pdist." ] }, { "cell_type": "code", "execution_count": 36, "id": "6bb8bbc9-264c-4de0-a96e-a5fad863933c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(87516, 2)" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "PCs.shape" ] }, { "cell_type": "code", "execution_count": 37, "id": "a12b7b52-5e80-4e1e-9d6a-b3b9fb421f8f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(87516, 1)" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.shape" ] }, { "cell_type": "code", "execution_count": 9, "id": "8e83b5e8-0f28-49f0-91e8-17879ea0931d", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9ff5cf90d3f441339b8fd35d0f379f33", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 2D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap_obj = wedap.H5_Plot(h5=\"west.h5\", data_type=\"average\", Xname=PCs[:,0], Yname=PCs[:,1], xlabel=\"PC1\", ylabel=\"PC2\")\n", "wedap_obj.plot()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 10, "id": "e25f6f67-144b-4e74-be8d-466eae751410", "metadata": {}, "outputs": [], "source": [ "# save the resulting figure\n", "wedap_obj.fig.tight_layout()\n", "wedap_obj.fig.savefig(\"e11-2.png\")" ] }, { "cell_type": "markdown", "id": "e3bc0421-b0f9-406c-8f6e-d9328930ead3", "metadata": {}, "source": [ "We can also make a 3D plot to look at what may relate to the PCs that were calculated:" ] }, { "cell_type": "code", "execution_count": 61, "id": "c8f4fac2-bbe5-4c56-9790-9faeaa465a41", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(87516, 1)" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "clust.labels_.reshape(-1,1).shape" ] }, { "cell_type": "code", "execution_count": 6, "id": "1f5e61e1-bd03-4732-a85e-da9595234670", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "4241f725b1af40d8bd33c1796f845dd5", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Data 3D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap_obj = wedap.H5_Plot(h5=\"west.h5\", plot_mode=\"hexbin3d\", data_type=\"average\", hexbin_grid=50,\n", " Xname=PCs[:,0], Yname=PCs[:,1], Zname=\"pcoord\", cbar_label=\"Heavy Atom RMSD ($\\AA$)\", xlabel=\"PC1\", ylabel=\"PC2\")\n", "wedap_obj.plot()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "a9aab188-3cba-4e15-a933-fd9ac8f060f1", "metadata": {}, "source": [ "What if we want to make a new h5 file with PCs as aux data? Well we can just include some extra args:" ] }, { "cell_type": "code", "execution_count": 17, "id": "e9e645af-2896-49fd-97d6-c7d95502a934", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a58ed6027897458a8a6b0b2daecc4007", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Creating new h5 dataset(s): 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap_obj = wedap.H5_Plot(h5=\"west.h5\", plot_mode=\"hexbin3d\", data_type=\"average\", hexbin_grid=50, \n", " H5save_out=\"west-new.h5\", Xsave_name=\"PC1\",\n", " Xname=PCs[:,0], Yname=PCs[:,1], Zname=\"pcoord\", cbar_label=\"Heavy Atom RMSD ($\\AA$)\", xlabel=\"PC1\", ylabel=\"PC2\")\n", "wedap_obj.plot()" ] }, { "cell_type": "markdown", "id": "1839f366-51d8-481b-b406-7a003274325a", "metadata": {}, "source": [ "Now we can just plot using PC1 and any of the CLI/API plotting options." ] }, { "cell_type": "markdown", "id": "59152a60-4bc4-4f50-aa21-df774800a620", "metadata": {}, "source": [ "```\n", "$ wedap -W west-new.h5 -pm line -dt average -X PC1 --xlabel PC1\n", "```" ] }, { "cell_type": "code", "execution_count": 18, "id": "3d2b1b58-509d-4877-bf51-2a2c6ffaaf87", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "cf636e4e68ab44539f49fbb6238d2d06", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 1D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wedap.H5_Plot(h5=\"west-new.h5\", plot_mode=\"line\", data_type=\"average\", Xname=\"PC1\", Xlabel=\"PC1\").plot()" ] }, { "cell_type": "markdown", "id": "a00d2c67-1b6b-48c5-b055-362179edca18", "metadata": {}, "source": [ "### Example 12: Plotting flux evolutions" ] }, { "cell_type": "markdown", "id": "142821a4-fa74-4cce-9157-f755ffe51115", "metadata": {}, "source": [ "We can also plot the rate constant analysis dataset from WESTPA, which is output in a direct.h5 file." ] }, { "cell_type": "markdown", "id": "80625114-0571-46e9-88a7-fb31a8b5aedf", "metadata": {}, "source": [ "First we can write a Python script to demonstrate the WEDAP post processing function, which allows for highly custom plot formatting and post processing using an additional Python script input. This example plots a horizontal line after the rate constant plot is generated." ] }, { "cell_type": "markdown", "id": "7cdd9abb-efbc-412a-ad29-95f6bcf56d33", "metadata": {}, "source": [ "The following script is named `ppf.py`:\n", "``` Python\n", "import matplotlib.pyplot as plt\n", "\n", "def adjust():\n", " plt.axhline(100000, linestyle=\"--\", color=\"k\")\n", "```" ] }, { "cell_type": "markdown", "id": "ca7c1403-0828-4da9-85a7-e95a1204754c", "metadata": {}, "source": [ "We can then run `wedap`, `mdap`, or `wekap` with the `--postprocess` arg, calling a Python module:" ] }, { "cell_type": "markdown", "id": "e23a3f48-a452-4708-b23a-f1814cfecb80", "metadata": {}, "source": [ "```\n", "$ wekap -d ANALYSIS/TEST/direct.h5 --postprocess ppf.adjust\n", "```" ] }, { "cell_type": "markdown", "id": "a6c0ab04-e910-451c-9e1a-505b25c926a6", "metadata": {}, "source": [ "Alternatively using the API:" ] }, { "cell_type": "code", "execution_count": 14, "id": "b08f01d6-8bc8-4521-ab04-89a20afc29e6", "metadata": {}, "outputs": [], "source": [ "import wekap" ] }, { "cell_type": "code", "execution_count": 16, "id": "dcda8300-4bb2-4ee5-b81b-1a789ec8e494", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wekap.Kinetics(direct=\"ANALYSIS/TEST/direct.h5\").plot_rate()\n", "plt.axhline(100000, linestyle=\"--\", color=\"k\")\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "id": "c1250436-be9a-4ca0-b8ef-8eb1cde27624", "metadata": {}, "source": [ "### Example 13: Making a GIF" ] }, { "attachments": {}, "cell_type": "markdown", "id": "1d3bd881-64a6-474d-8b7a-c64fd2ea7813", "metadata": {}, "source": [ "Here we can observe the time evolution of a 2D pdist using a gif. The avg_plus arg is used to select the range of iterations to average (so for a value of 10, we average n+10 iterations per frame of the gif)." ] }, { "cell_type": "markdown", "id": "27c3b348-7ec8-495d-9b36-2dd4ad17e5af", "metadata": {}, "source": [ "```\n", "$ wedap -h5 west.h5 -x pcoord -y RoG -dt average --pmax 17.5 -pu kcal -li 190 --step-iter 2 --avg-plus 2 --gif-out example.gif --xlim 2 6.5 --ylim 17 20.5 --grid --cmap gnuplot_r --ylabel \"Radius of Gyration ($\\AA$)\" --xlabel \"Heavy Atom RMSD ($\\AA$)\"\n", "```" ] }, { "cell_type": "code", "execution_count": 93, "id": "8226b5cf-fb63-4bd5-a9ab-dcbca32c64ff", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "2bb69ed486364add911d773e0a1b9d50", "version_major": 2, "version_minor": 0 }, "text/plain": [ " 0%| | 0/95 [00:00\n", " \"example\n", "

" ] }, { "cell_type": "markdown", "id": "e5e0178f-96d7-4a45-a9d9-d61b4e9eb813", "metadata": {}, "source": [ "### Other WEDAP features not demonstrated:\n", "* multiple h5 inputs (just input a list or multiple h5 files in the command line)\n", " * these are automatically normalized and plotted as long as the dataset specified exisits in all h5 files input\n", "* Input for `X/Y/Z/Cname` can be a dataset in the west.h5 file (as seen here), but also an numpy array (seen in the ML example) or the name of a file (with a `.dat`, `.txt`, `.pkl`, `.npz`, `.npy` ending).\n", "* trajectory filtering for only successfull events (set `succ_only=True`)\n", "* basis state filtering for trajectories from a specific basis state(s) (`skip_basis`)\n", "* the commands and usage for `MDAP` were not demonstrated here, but examples can be found on the [wedap demo jupyter notebook](https://github.com/darianyang/wedap/blob/main/docs/notebook/wedap_demo.ipynb).\n", " * besides the WE evolution plot, most other `WEDAP` plots can be made using standard MD data instead of a `west.h5` file from `WESTPA`." ] }, { "cell_type": "markdown", "id": "e90165c7-5226-40dd-8ed6-80e4e53503dc", "metadata": {}, "source": [ "### TOC Figure" ] }, { "cell_type": "code", "execution_count": 89, "id": "b696d9d9-b139-4410-9c4f-f008894564ab", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e357d13f200e46a2a38fdde4fd1c22d5", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Average 2D: 0%| | 0/200 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# if there is alot of plotting choices, it can be easier to just put it all into a dictionary\n", "plot_options = {\"h5\" : \"west.h5\",\n", " \"data_type\" : \"average\", \n", " \"plot_mode\" : \"contour_f\", \n", " \"contour_interval\" : 1,\n", " \"Xname\" : \"pcoord\", \n", " \"Yname\" : \"RoG\", \n", " \"jointplot\" : True, \n", " \"p_units\" : \"kcal\", \n", " \"p_max\" : 17.5,\n", " #\"smoothing_level\" : 1,\n", " # the input plot_options kwarg dict is also parsed for matplotlib formatting keywords\n", " \"xlabel\" : \"Heavy Atom RMSD ($\\AA$)\",\n", " \"ylabel\" : \"Radius of Gyration ($\\AA$)\",\n", " \"histrange_x\" : (2, 6.5),\n", " \"histrange_y\" : (17, 20.5),\n", " #\"grid\" : True,\n", " #\"color\" : \"k\",\n", " }\n", "# change size since joint plots take more space\n", "plt.rcParams[\"figure.figsize\"] = (6,4)\n", "wedap_obj = wedap.H5_Plot(**plot_options)\n", "with plt.xkcd():\n", " wedap_obj.plot()\n", "wedap_obj.fig[\"c\"].set_ylabel(r\"-RT ln P (kcal mol$^{-1}$)\")\n", "\n", "#wedap_obj.plot_trace((5.5, 19.5), ax=wedap_obj.ax, linewidth=0.5, find_iter_seg=True)\n", "#wedap_obj.plot_trace((200, 20), ax=wedap_obj.ax, color=\"snow\", linewidth=0.5)\n", "\n", "# save the resulting figure\n", "plt.tight_layout()\n", "plt.savefig(\"toc.pdf\", transparent=True)" ] }, { "cell_type": "code", "execution_count": 90, "id": "affe6ff9-1d64-4d20-91ee-32a5c7146268", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "d84224988d3445a4a72cdcd522ce499c", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Evolution: 0%| | 0/19 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#plt.rcParams[\"figure.figsize\"] = (4.5,3)\n", "plt.rcParams[\"figure.figsize\"] = (5,3.8)\n", "with plt.xkcd():\n", " wedap_obj = wedap.H5_Plot(h5=\"../notebook/p53.h5\", data_type=\"evolution\")\n", " wedap_obj.plot()\n", " wedap_obj.plot_trace((4.2, 17), ax=wedap_obj.ax, linewidth=0.5, find_iter_seg=True)\n", "wedap_obj.ax.set_xlabel(\"Progress Coordinate\")\n", "wedap_obj.ax.set_ylabel(\"Weighted Ensemble Iteration\")\n", "wedap_obj.cbar.set_label(\"-ln P(x)\")\n", "wedap_obj.cbar.frac = 1\n", "\n", "plt.tight_layout()\n", "wedap_obj.fig.savefig(\"toc2.pdf\")" ] }, { "cell_type": "code", "execution_count": null, "id": "305a3541-10f5-4083-bcf3-fc1b9f7425f6", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "wedap", "language": "python", "name": "wedap" }, "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.16" } }, "nbformat": 4, "nbformat_minor": 5 }