{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "623aa095-1977-40e1-a7f9-a85e5c823996",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting py3Dmol\n",
      "  Downloading py3Dmol-2.4.2-py2.py3-none-any.whl.metadata (1.9 kB)\n",
      "Downloading py3Dmol-2.4.2-py2.py3-none-any.whl (7.0 kB)\n",
      "Installing collected packages: py3Dmol\n",
      "Successfully installed py3Dmol-2.4.2\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install py3Dmol"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "e7b4f9cc-4236-419e-8dbf-72b5b542fc2d",
   "metadata": {
    "scrolled": true,
    "tags": []
   },
   "outputs": [],
   "source": [
    "import py3Dmol\n",
    "from pathlib import Path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "e95c4988-56f8-43bc-813e-cd399e533010",
   "metadata": {},
   "outputs": [],
   "source": [
    "def leggi_xyz(fn):\n",
    "    res=\"\"\n",
    "    with open(fn) as inp:\n",
    "        rn=inp.readline()\n",
    "        n=int(rn)\n",
    "        res+=rn\n",
    "        for i in range(n+1):\n",
    "            res+=inp.readline()\n",
    "    return res\n",
    "def visualizza(mol):\n",
    "    p=Path(mol)\n",
    "    modi=list(p.glob(\"mol.out.v*.xyz\"))\n",
    "    n=int(input(f\"{len(modi)} modi normali sono presenti, selezionane uno\"))-1\n",
    "    xyz=leggi_xyz(p/f\"mol.out.v{n:03}.xyz\")\n",
    "    vibr = py3Dmol.view(width=300, height=300)\n",
    "    vibr.addModel(xyz, \"xyz\", {\"vibrate\": {\"frames\": 10, \"amplitude\": 0.2}})\n",
    "    vibr.setBackgroundColor('0xeeeeee')\n",
    "    vibr.setStyle({\"stick\": {'radius': 0.15}, \"sphere\":{\"scale\":0.25}})\n",
    "    vibr.animate({\"loop\": \"backAndForth\"})\n",
    "    vibr.zoomTo()\n",
    "    vibr.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "80b71d35-ff13-4f60-a6db-246816e7f47c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdin",
     "output_type": "stream",
     "text": [
      "9 modi normali sono presenti, selezionane uno 8\n"
     ]
    },
    {
     "data": {
      "application/3dmoljs_load.v0": "<div id=\"3dmolviewer_17448829223174636\"  style=\"position: relative; width: 300px; height: 300px;\">\n        <p id=\"3dmolwarning_17448829223174636\" style=\"background-color:#ffcccc;color:black\">3Dmol.js failed to load for some reason.  Please check your browser console for error messages.<br></p>\n        </div>\n<script>\n\nvar loadScriptAsync = function(uri){\n  return new Promise((resolve, reject) => {\n    //this is to ignore the existence of requirejs amd\n    var savedexports, savedmodule;\n    if (typeof exports !== 'undefined') savedexports = exports;\n    else exports = {}\n    if (typeof module !== 'undefined') savedmodule = module;\n    else module = {}\n\n    var tag = document.createElement('script');\n    tag.src = uri;\n    tag.async = true;\n    tag.onload = () => {\n        exports = savedexports;\n        module = savedmodule;\n        resolve();\n    };\n  var firstScriptTag = document.getElementsByTagName('script')[0];\n  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n  $3Dmolpromise = loadScriptAsync('https://cdnjs.cloudflare.com/ajax/libs/3Dmol/2.4.2/3Dmol-min.js');\n}\n\nvar viewer_17448829223174636 = null;\nvar warn = document.getElementById(\"3dmolwarning_17448829223174636\");\nif(warn) {\n    warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_17448829223174636 = $3Dmol.createViewer(document.getElementById(\"3dmolviewer_17448829223174636\"),{backgroundColor:\"white\"});\nviewer_17448829223174636.zoomTo();\n\tviewer_17448829223174636.addModel(\"3\\n* (null), Energy   -1000.0000000\\nO     0.008466    0.382843    0.000000   -0.002234   -0.100978    0.000000\\nH    -0.754388   -0.174832    0.000000    1.180372    0.775646    0.000000\\nH     0.745922   -0.208010    0.000000   -1.144926    0.827066    0.000000\\n\",\"xyz\",{\"vibrate\": {\"frames\": 10, \"amplitude\": 0.2}});\n\tviewer_17448829223174636.setBackgroundColor(\"0xeeeeee\");\n\tviewer_17448829223174636.setStyle({\"stick\": {\"radius\": 0.15}, \"sphere\": {\"scale\": 0.25}});\n\tviewer_17448829223174636.animate({\"loop\": \"backAndForth\"});\n\tviewer_17448829223174636.zoomTo();\nviewer_17448829223174636.render();\n});\n</script>",
      "text/html": [
       "<div id=\"3dmolviewer_17448829223174636\"  style=\"position: relative; width: 300px; height: 300px;\">\n",
       "        <p id=\"3dmolwarning_17448829223174636\" style=\"background-color:#ffcccc;color:black\">3Dmol.js failed to load for some reason.  Please check your browser console for error messages.<br></p>\n",
       "        </div>\n",
       "<script>\n",
       "\n",
       "var loadScriptAsync = function(uri){\n",
       "  return new Promise((resolve, reject) => {\n",
       "    //this is to ignore the existence of requirejs amd\n",
       "    var savedexports, savedmodule;\n",
       "    if (typeof exports !== 'undefined') savedexports = exports;\n",
       "    else exports = {}\n",
       "    if (typeof module !== 'undefined') savedmodule = module;\n",
       "    else module = {}\n",
       "\n",
       "    var tag = document.createElement('script');\n",
       "    tag.src = uri;\n",
       "    tag.async = true;\n",
       "    tag.onload = () => {\n",
       "        exports = savedexports;\n",
       "        module = savedmodule;\n",
       "        resolve();\n",
       "    };\n",
       "  var firstScriptTag = document.getElementsByTagName('script')[0];\n",
       "  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n",
       "});\n",
       "};\n",
       "\n",
       "if(typeof $3Dmolpromise === 'undefined') {\n",
       "$3Dmolpromise = null;\n",
       "  $3Dmolpromise = loadScriptAsync('https://cdnjs.cloudflare.com/ajax/libs/3Dmol/2.4.2/3Dmol-min.js');\n",
       "}\n",
       "\n",
       "var viewer_17448829223174636 = null;\n",
       "var warn = document.getElementById(\"3dmolwarning_17448829223174636\");\n",
       "if(warn) {\n",
       "    warn.parentNode.removeChild(warn);\n",
       "}\n",
       "$3Dmolpromise.then(function() {\n",
       "viewer_17448829223174636 = $3Dmol.createViewer(document.getElementById(\"3dmolviewer_17448829223174636\"),{backgroundColor:\"white\"});\n",
       "viewer_17448829223174636.zoomTo();\n",
       "\tviewer_17448829223174636.addModel(\"3\\n* (null), Energy   -1000.0000000\\nO     0.008466    0.382843    0.000000   -0.002234   -0.100978    0.000000\\nH    -0.754388   -0.174832    0.000000    1.180372    0.775646    0.000000\\nH     0.745922   -0.208010    0.000000   -1.144926    0.827066    0.000000\\n\",\"xyz\",{\"vibrate\": {\"frames\": 10, \"amplitude\": 0.2}});\n",
       "\tviewer_17448829223174636.setBackgroundColor(\"0xeeeeee\");\n",
       "\tviewer_17448829223174636.setStyle({\"stick\": {\"radius\": 0.15}, \"sphere\": {\"scale\": 0.25}});\n",
       "\tviewer_17448829223174636.animate({\"loop\": \"backAndForth\"});\n",
       "\tviewer_17448829223174636.zoomTo();\n",
       "viewer_17448829223174636.render();\n",
       "});\n",
       "</script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "visualizza(\"acqua\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5ff7d289-7c11-4b90-86f3-1871a1b9ef72",
   "metadata": {},
   "source": [
    "### note sul codice"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "03e9edea-cea6-4087-8f0e-d6294998bc97",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "acqua/mol.out.v000.xyz\n",
      "acqua/mol.out.v001.xyz\n",
      "acqua/mol.out.v002.xyz\n",
      "acqua/mol.out.v003.xyz\n",
      "acqua/mol.out.v004.xyz\n",
      "acqua/mol.out.v005.xyz\n",
      "acqua/mol.out.v006.xyz\n",
      "acqua/mol.out.v007.xyz\n",
      "acqua/mol.out.v008.xyz\n"
     ]
    }
   ],
   "source": [
    "# pathlib è una libreria per la gestione avanzata dei pathname\n",
    "p=Path(\"acqua\")\n",
    "for pi in p.glob(\"mol.out.v*.xyz\"):\n",
    "    # una glob permette di identificare più pathname che corrispondono ad uno schema\n",
    "    # il carattere più comune nelle glob è *, che indica una sequenza di caratteri qualunque\n",
    "    print(pi)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "a53f4096-b198-4e26-8620-352860ee6611",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# è possibile usare l'operatore / sui pathname per discendere nelle cartelle\n",
    "p005=p/\"mol.out.v005.xyz\"\n",
    "p005.exists() # exists controlla se la risorsa corrispondente esiste"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "5800dcfb-c1a5-48d0-98ad-f389b99cf618",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "3\n",
      "* (null), Energy   -1000.0000000\n",
      "O     0.008466    0.382843    0.000000   -0.002234   -0.100978    0.000000\n",
      "H    -0.754388   -0.174832    0.000000    1.180372    0.775646    0.000000\n",
      "H     0.745922   -0.208010    0.000000   -1.144926    0.827066    0.000000\n",
      "3\n",
      "* Frequency(7) 3543.0500\n",
      "O     0.008212    0.371367    0.000000   -0.002234   -0.100978 \n"
     ]
    }
   ],
   "source": [
    "# posso usare open con un pathname per accedere ad una risorsa\n",
    "with open(p/\"mol.out.v007.xyz\") as inp:\n",
    "    print(inp.read()[:350]) # stampa i primi 300 caratteri del file"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "1e303933-a10d-4f93-9b30-d7b490ce1c0f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "application/3dmoljs_load.v0": "<div id=\"3dmolviewer_16808039436070063\"  style=\"position: relative; width: 640px; height: 480px\">\n        <p id=\"3dmolwarning_16808039436070063\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason).  You need to install the 3dmol extension: <br>\n        <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n        </div>\n<script>\n\nvar loadScriptAsync = function(uri){\n  return new Promise((resolve, reject) => {\n    //this is to ignore the existence of requirejs amd\n    var savedexports, savedmodule;\n    if (typeof exports !== 'undefined') savedexports = exports;\n    else exports = {}\n    if (typeof module !== 'undefined') savedmodule = module;\n    else module = {}\n\n    var tag = document.createElement('script');\n    tag.src = uri;\n    tag.async = true;\n    tag.onload = () => {\n        exports = savedexports;\n        module = savedmodule;\n        resolve();\n    };\n  var firstScriptTag = document.getElementsByTagName('script')[0];\n  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n});\n};\n\nif(typeof $3Dmolpromise === 'undefined') {\n$3Dmolpromise = null;\n  $3Dmolpromise = loadScriptAsync('https://cdnjs.cloudflare.com/ajax/libs/3Dmol/2.0.1/3Dmol-min.js');\n}\n\nvar viewer_16808039436070063 = null;\nvar warn = document.getElementById(\"3dmolwarning_16808039436070063\");\nif(warn) {\n    warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_16808039436070063 = $3Dmol.createViewer(document.getElementById(\"3dmolviewer_16808039436070063\"),{backgroundColor:\"white\"});\n$3Dmol.download(\"pdb:1ycr\", viewer_16808039436070063, {}, function() {\nviewer_16808039436070063.zoomTo();\n\tviewer_16808039436070063.setStyle({\"chain\": \"A\"},{\"cartoon\": {\"colorscheme\": \"shapely\"}});\n\tviewer_16808039436070063.addSurface(1,{\"opacity\": 0.5, \"color\": \"white\"},{\"chain\": \"A\"});\n\tviewer_16808039436070063.setStyle({\"chain\": \"B\"},{\"stick\": {}, \"sphere\": {\"scale\": 0.35}});\nviewer_16808039436070063.render();\n})\n});\n</script>",
      "text/html": [
       "<div id=\"3dmolviewer_16808039436070063\"  style=\"position: relative; width: 640px; height: 480px\">\n",
       "        <p id=\"3dmolwarning_16808039436070063\" style=\"background-color:#ffcccc;color:black\">You appear to be running in JupyterLab (or JavaScript failed to load for some other reason).  You need to install the 3dmol extension: <br>\n",
       "        <tt>jupyter labextension install jupyterlab_3dmol</tt></p>\n",
       "        </div>\n",
       "<script>\n",
       "\n",
       "var loadScriptAsync = function(uri){\n",
       "  return new Promise((resolve, reject) => {\n",
       "    //this is to ignore the existence of requirejs amd\n",
       "    var savedexports, savedmodule;\n",
       "    if (typeof exports !== 'undefined') savedexports = exports;\n",
       "    else exports = {}\n",
       "    if (typeof module !== 'undefined') savedmodule = module;\n",
       "    else module = {}\n",
       "\n",
       "    var tag = document.createElement('script');\n",
       "    tag.src = uri;\n",
       "    tag.async = true;\n",
       "    tag.onload = () => {\n",
       "        exports = savedexports;\n",
       "        module = savedmodule;\n",
       "        resolve();\n",
       "    };\n",
       "  var firstScriptTag = document.getElementsByTagName('script')[0];\n",
       "  firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);\n",
       "});\n",
       "};\n",
       "\n",
       "if(typeof $3Dmolpromise === 'undefined') {\n",
       "$3Dmolpromise = null;\n",
       "  $3Dmolpromise = loadScriptAsync('https://cdnjs.cloudflare.com/ajax/libs/3Dmol/2.0.1/3Dmol-min.js');\n",
       "}\n",
       "\n",
       "var viewer_16808039436070063 = null;\n",
       "var warn = document.getElementById(\"3dmolwarning_16808039436070063\");\n",
       "if(warn) {\n",
       "    warn.parentNode.removeChild(warn);\n",
       "}\n",
       "$3Dmolpromise.then(function() {\n",
       "viewer_16808039436070063 = $3Dmol.createViewer(document.getElementById(\"3dmolviewer_16808039436070063\"),{backgroundColor:\"white\"});\n",
       "$3Dmol.download(\"pdb:1ycr\", viewer_16808039436070063, {}, function() {\n",
       "viewer_16808039436070063.zoomTo();\n",
       "\tviewer_16808039436070063.setStyle({\"chain\": \"A\"},{\"cartoon\": {\"colorscheme\": \"shapely\"}});\n",
       "\tviewer_16808039436070063.addSurface(1,{\"opacity\": 0.5, \"color\": \"white\"},{\"chain\": \"A\"});\n",
       "\tviewer_16808039436070063.setStyle({\"chain\": \"B\"},{\"stick\": {}, \"sphere\": {\"scale\": 0.35}});\n",
       "viewer_16808039436070063.render();\n",
       "})\n",
       "});\n",
       "</script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "view = py3Dmol.view(query='pdb:1ycr')\n",
    "chA = {'chain':'A'}\n",
    "chB = {'chain':'B'}\n",
    "view.setStyle(chA,{'cartoon': {'colorscheme':'shapely'}})\n",
    "view.addSurface(py3Dmol.VDW,{'opacity':0.5,'color':'white'}, chA)\n",
    "view.setStyle(chB,{'stick':{}, 'sphere':{'scale':0.35}})\n",
    "view.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "eed53180-1bd6-4c55-931e-760331f33fa0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[PosixPath('acqua/mol.out.v000.xyz'),\n",
       " PosixPath('acqua/mol.out.v001.xyz'),\n",
       " PosixPath('acqua/mol.out.v002.xyz'),\n",
       " PosixPath('acqua/mol.out.v003.xyz'),\n",
       " PosixPath('acqua/mol.out.v004.xyz'),\n",
       " PosixPath('acqua/mol.out.v005.xyz'),\n",
       " PosixPath('acqua/mol.out.v006.xyz'),\n",
       " PosixPath('acqua/mol.out.v007.xyz'),\n",
       " PosixPath('acqua/mol.out.v008.xyz')]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(p.glob(\"mol.out.v*.xyz\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "28b7c934-2ee9-40ac-9936-84c9fe533286",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PosixPath('acqua/mol.inp')"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p/\"mol.inp\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "bb19ef64-8a99-4c44-b601-870ddd44d45a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'003'"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "i=3\n",
    "f\"{i:03}\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b5376914-fdca-4106-a1ba-a83ca98785e6",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "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.13.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
