{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "a2af2e02-e228-40d3-a610-7bceed742dbf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Optimal model uaiqm_gfn2xtbstar@cc, version 20240106\n",
      "\n",
      "Optimized coordinates\n",
      "\n",
      "5\n",
      "\n",
      "C             0.0000000061260          -0.0000000030574          -0.0000000001556\n",
      "H             1.0871538643808           0.0000000030857          -0.0000000000055\n",
      "H            -0.3623846150166          -1.0249784870625           0.0000000005359\n",
      "H            -0.3623846108738           0.5124892411848          -0.8876574045314\n",
      "H            -0.3623846114315           0.5124892429459           0.8876574028322\n",
      "\n"
     ]
    },
    {
     "data": {
      "application/3dmoljs_load.v0": "<div id=\"3dmolviewer_1737022160166551\"  style=\"position: relative; width: 400px; height: 300px;\">\n        <p id=\"3dmolwarning_1737022160166551\" 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.1.0/3Dmol-min.js');\n}\n\nvar viewer_1737022160166551 = null;\nvar warn = document.getElementById(\"3dmolwarning_1737022160166551\");\nif(warn) {\n    warn.parentNode.removeChild(warn);\n}\n$3Dmolpromise.then(function() {\nviewer_1737022160166551 = $3Dmol.createViewer(document.getElementById(\"3dmolviewer_1737022160166551\"),{backgroundColor:\"white\"});\nviewer_1737022160166551.zoomTo();\n\tviewer_1737022160166551.addModel(\"5\\n\\nC             0.0000000061260          -0.0000000030574          -0.0000000001556\\nH             1.0871538643808           0.0000000030857          -0.0000000000055\\nH            -0.3623846150166          -1.0249784870625           0.0000000005359\\nH            -0.3623846108738           0.5124892411848          -0.8876574045314\\nH            -0.3623846114315           0.5124892429459           0.8876574028322\\n\",\"xyz\");\n\tviewer_1737022160166551.setStyle({\"stick\": {}, \"sphere\": {\"scale\": 0.25}});\nviewer_1737022160166551.render();\n});\n</script>",
      "text/html": [
       "<div id=\"3dmolviewer_1737022160166551\"  style=\"position: relative; width: 400px; height: 300px;\">\n",
       "        <p id=\"3dmolwarning_1737022160166551\" 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.1.0/3Dmol-min.js');\n",
       "}\n",
       "\n",
       "var viewer_1737022160166551 = null;\n",
       "var warn = document.getElementById(\"3dmolwarning_1737022160166551\");\n",
       "if(warn) {\n",
       "    warn.parentNode.removeChild(warn);\n",
       "}\n",
       "$3Dmolpromise.then(function() {\n",
       "viewer_1737022160166551 = $3Dmol.createViewer(document.getElementById(\"3dmolviewer_1737022160166551\"),{backgroundColor:\"white\"});\n",
       "viewer_1737022160166551.zoomTo();\n",
       "\tviewer_1737022160166551.addModel(\"5\\n\\nC             0.0000000061260          -0.0000000030574          -0.0000000001556\\nH             1.0871538643808           0.0000000030857          -0.0000000000055\\nH            -0.3623846150166          -1.0249784870625           0.0000000005359\\nH            -0.3623846108738           0.5124892411848          -0.8876574045314\\nH            -0.3623846114315           0.5124892429459           0.8876574028322\\n\",\"xyz\");\n",
       "\tviewer_1737022160166551.setStyle({\"stick\": {}, \"sphere\": {\"scale\": 0.25}});\n",
       "viewer_1737022160166551.render();\n",
       "});\n",
       "</script>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import mlatom as ml\n",
    "\n",
    "# Get the initial guess for the molecules to optimize\n",
    "initmol = ml.data.molecule.from_xyz_string('''5\n",
    "\n",
    "C         0.0000000000        0.0000000000        0.0000000000\n",
    "H         1.0870000000        0.0000000000        0.0000000000\n",
    "H        -0.3623333220       -1.0248334322       -0.0000000000\n",
    "H        -0.3623333220        0.5124167161       -0.8875317869\n",
    "H        -0.3623333220        0.5124167161        0.8875317869\n",
    "''')\n",
    "\n",
    "# define UAIQM method\n",
    "uaiqm_optimal = ml.models.uaiqm(method='uaiqm_optimal', verbose=False)\n",
    "# verbose = True in the above line requests to print the information about the model\n",
    "uaiqm_optimal.select_optimal(\n",
    "    molecule=initmol,\n",
    "    nCPUs=1,\n",
    "    time_budget='1s'\n",
    ")\n",
    "print(f'Optimal model {uaiqm_optimal.method}, version {uaiqm_optimal.version}')\n",
    "#uaiqm = ml.models.methods(method=uaiqm_optimal.method, version=uaiqm_optimal.version)\n",
    "\n",
    "# Optimize the geometry with the choosen optimizer:\n",
    "geomopt = ml.optimize_geometry(model=uaiqm_optimal, initial_molecule=initmol, program='geometric')\n",
    "\n",
    "# Get the final geometry\n",
    "final_mol = geomopt.optimized_molecule\n",
    "# and its XYZ coordinates\n",
    "print('\\nOptimized coordinates\\n')\n",
    "print(final_mol.get_xyz_string())\n",
    "\n",
    "# save the final geometry\n",
    "final_mol.write_file_with_xyz_coordinates(filename='final.xyz')\n",
    "\n",
    "# View the molecule\n",
    "final_mol.view()"
   ]
  }
 ],
 "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.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
