molSimplify 1.7.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. docs/source/conf.py +224 -0
  2. molSimplify/Classes/__init__.py +6 -0
  3. molSimplify/Classes/atom3D.py +235 -0
  4. molSimplify/Classes/dft_obs.py +130 -0
  5. molSimplify/Classes/globalvars.py +827 -0
  6. molSimplify/Classes/helpers.py +161 -0
  7. molSimplify/Classes/ligand.py +2330 -0
  8. molSimplify/Classes/mGUI.py +2493 -0
  9. molSimplify/Classes/mWidgets.py +438 -0
  10. molSimplify/Classes/miniGUI.py +41 -0
  11. molSimplify/Classes/mol2D.py +260 -0
  12. molSimplify/Classes/mol3D.py +5846 -0
  13. molSimplify/Classes/monomer3D.py +253 -0
  14. molSimplify/Classes/partialcharges.py +226 -0
  15. molSimplify/Classes/protein3D.py +1178 -0
  16. molSimplify/Classes/rundiag.py +151 -0
  17. molSimplify/Data/ML.dat +212 -0
  18. molSimplify/Data/MLS_FSR_for_inter.dat +23 -0
  19. molSimplify/Data/MLS_FSR_for_inter2.dat +23 -0
  20. molSimplify/Data/MLS_angle_for_click.dat +8 -0
  21. molSimplify/Data/MLS_angle_for_inter.dat +23 -0
  22. molSimplify/Data/MLS_angle_for_inter2.dat +48 -0
  23. molSimplify/Data/MLS_angle_for_intra.dat +10 -0
  24. molSimplify/Data/MLS_angle_for_intra2.dat +6 -0
  25. molSimplify/Data/MLS_angle_for_oa.dat +18 -0
  26. molSimplify/Data/ML_FSR_for_inter.dat +112 -0
  27. molSimplify/Data/ML_FSR_for_inter2.dat +110 -0
  28. molSimplify/Data/ML_bond_for_cat.dat +8 -0
  29. molSimplify/Data/ML_bond_for_click.dat +8 -0
  30. molSimplify/Data/ML_bond_for_inter.dat +48 -0
  31. molSimplify/Data/ML_bond_for_inter2.dat +48 -0
  32. molSimplify/Data/ML_bond_for_intra.dat +10 -0
  33. molSimplify/Data/ML_bond_for_intra2.dat +6 -0
  34. molSimplify/Data/ML_bond_for_oa.dat +18 -0
  35. molSimplify/Data/bp1.dat +21 -0
  36. molSimplify/Data/li.dat +3 -0
  37. molSimplify/Data/no.dat +2 -0
  38. molSimplify/Data/oct.dat +7 -0
  39. molSimplify/Data/pbp.dat +8 -0
  40. molSimplify/Data/spy.dat +6 -0
  41. molSimplify/Data/sqap.dat +9 -0
  42. molSimplify/Data/sqp.dat +5 -0
  43. molSimplify/Data/tbp.dat +6 -0
  44. molSimplify/Data/tdhd.dat +9 -0
  45. molSimplify/Data/thd.dat +5 -0
  46. molSimplify/Data/tpl.dat +4 -0
  47. molSimplify/Data/tpr.dat +7 -0
  48. molSimplify/Informatics/HFXsensitivity/__init__.py +0 -0
  49. molSimplify/Informatics/HFXsensitivity/measure_HFX_sensitivity_oxo_hat_reb_rel.py +443 -0
  50. molSimplify/Informatics/HFXsensitivity/measure_HFX_stable.py +346 -0
  51. molSimplify/Informatics/MOF/Linker_rotation.py +179 -0
  52. molSimplify/Informatics/MOF/MOF_descriptors.py +1299 -0
  53. molSimplify/Informatics/MOF/MOF_descriptors_alternate_functional.py +589 -0
  54. molSimplify/Informatics/MOF/MOF_functionalizer.py +1648 -0
  55. molSimplify/Informatics/MOF/PBC_functions.py +1347 -0
  56. molSimplify/Informatics/MOF/__init__.py +0 -0
  57. molSimplify/Informatics/MOF/atomic.py +267 -0
  58. molSimplify/Informatics/MOF/cluster_extraction.py +388 -0
  59. molSimplify/Informatics/MOF/fragment_MOFs_for_pormake.py +895 -0
  60. molSimplify/Informatics/MOF/monofunctionalized_BDC/index_information.py +10 -0
  61. molSimplify/Informatics/Mol2Parser.py +46 -0
  62. molSimplify/Informatics/RACassemble.py +408 -0
  63. molSimplify/Informatics/__init__.py +0 -0
  64. molSimplify/Informatics/active_learning/__init__.py +0 -0
  65. molSimplify/Informatics/active_learning/expected_improvement.py +269 -0
  66. molSimplify/Informatics/autocorrelation.py +1930 -0
  67. molSimplify/Informatics/clean_autocorrelation.py +778 -0
  68. molSimplify/Informatics/coulomb_analyze.py +67 -0
  69. molSimplify/Informatics/decoration_manager.py +193 -0
  70. molSimplify/Informatics/geo_analyze.py +88 -0
  71. molSimplify/Informatics/geometrics.py +56 -0
  72. molSimplify/Informatics/graph_analyze.py +163 -0
  73. molSimplify/Informatics/graph_racs.py +288 -0
  74. molSimplify/Informatics/jupyter_vis.py +172 -0
  75. molSimplify/Informatics/lacRACAssemble.py +2192 -0
  76. molSimplify/Informatics/lacRACAssemble_bisdithiolenes.py +236 -0
  77. molSimplify/Informatics/misc_descriptors.py +198 -0
  78. molSimplify/Informatics/organic_fingerprints.py +61 -0
  79. molSimplify/Informatics/partialcharges.py +345 -0
  80. molSimplify/Informatics/protein/activesite.py +53 -0
  81. molSimplify/Informatics/protein/pymol_add_hs.py +33 -0
  82. molSimplify/Informatics/rac155_geo.py +48 -0
  83. molSimplify/Ligands/(1_methylbenzimidazol_2_yl)pyridine.xyz +45 -0
  84. molSimplify/Ligands/1-4-dimethyl-1-2-3-triazole.xyz +15 -0
  85. molSimplify/Ligands/12crown4.mol +62 -0
  86. molSimplify/Ligands/Antipyrine.mol +58 -0
  87. molSimplify/Ligands/BPAbipy.mol +106 -0
  88. molSimplify/Ligands/Hpyrrole.mol +26 -0
  89. molSimplify/Ligands/N-quinolinylbutyramidate.xyz +31 -0
  90. molSimplify/Ligands/N-quinolinylmethylmethinylacetamidate.xyz +30 -0
  91. molSimplify/Ligands/NMe2_-1.xyz +11 -0
  92. molSimplify/Ligands/PCy3.mol +111 -0
  93. molSimplify/Ligands/PMe3.xyz +15 -0
  94. molSimplify/Ligands/PPh3.mol +76 -0
  95. molSimplify/Ligands/Propyphenazone.mol +77 -0
  96. molSimplify/Ligands/acac.mol +33 -0
  97. molSimplify/Ligands/acacen.mol +76 -0
  98. molSimplify/Ligands/acetate.smi +1 -0
  99. molSimplify/Ligands/acetate.xyz +9 -0
  100. molSimplify/Ligands/aceticacidbipyridine.mol +70 -0
  101. molSimplify/Ligands/acetonitrile.mol +17 -0
  102. molSimplify/Ligands/alanine.mol +30 -0
  103. molSimplify/Ligands/alphabetizer.py +21 -0
  104. molSimplify/Ligands/amine.mol +11 -0
  105. molSimplify/Ligands/ammonia.mol +12 -0
  106. molSimplify/Ligands/arginine.mol +58 -0
  107. molSimplify/Ligands/asparagine.mol +38 -0
  108. molSimplify/Ligands/aspartic_acid.mol +35 -0
  109. molSimplify/Ligands/azide.mol +11 -0
  110. molSimplify/Ligands/benzene.mol +28 -0
  111. molSimplify/Ligands/benzene_pi.mol +30 -0
  112. molSimplify/Ligands/benzenedithiol.mol +30 -0
  113. molSimplify/Ligands/benzenethiol.mol +30 -0
  114. molSimplify/Ligands/benzylisocy.mol +38 -0
  115. molSimplify/Ligands/bidiazine.mol +42 -0
  116. molSimplify/Ligands/bidiazole.mol +38 -0
  117. molSimplify/Ligands/bifuran.mol +38 -0
  118. molSimplify/Ligands/bihydrodiazine.mol +58 -0
  119. molSimplify/Ligands/bihydrodiazole.mol +46 -0
  120. molSimplify/Ligands/bihydrooxazine.mol +54 -0
  121. molSimplify/Ligands/bihydrooxazole.mol +42 -0
  122. molSimplify/Ligands/bihydrothiazine.mol +54 -0
  123. molSimplify/Ligands/bihydrothiazole.mol +42 -0
  124. molSimplify/Ligands/biimidazole.mol +38 -0
  125. molSimplify/Ligands/bioxazole.mol +34 -0
  126. molSimplify/Ligands/bipy.mol +46 -0
  127. molSimplify/Ligands/bipyrazine.xyz +20 -0
  128. molSimplify/Ligands/bipyrimidine.mol +42 -0
  129. molSimplify/Ligands/bipyrrole.mol +42 -0
  130. molSimplify/Ligands/bisnapthyridylpyridine.mol +111 -0
  131. molSimplify/Ligands/bithiazole.mol +34 -0
  132. molSimplify/Ligands/bromide.mol +7 -0
  133. molSimplify/Ligands/bromide.smi +1 -0
  134. molSimplify/Ligands/c2.mol +9 -0
  135. molSimplify/Ligands/caprolactone.mol +41 -0
  136. molSimplify/Ligands/carbonyl.mol +8 -0
  137. molSimplify/Ligands/carboxyl.mol +13 -0
  138. molSimplify/Ligands/cat.mol +30 -0
  139. molSimplify/Ligands/chloride.mol +7 -0
  140. molSimplify/Ligands/chloride.smi +1 -0
  141. molSimplify/Ligands/chloropyridine.mol +27 -0
  142. molSimplify/Ligands/co2.mol +10 -0
  143. molSimplify/Ligands/corrolazine.mol +72 -0
  144. molSimplify/Ligands/cs.mol +8 -0
  145. molSimplify/Ligands/cyanate.xyz +5 -0
  146. molSimplify/Ligands/cyanide.mol +9 -0
  147. molSimplify/Ligands/cyanoaceticporphyrin.mol +114 -0
  148. molSimplify/Ligands/cyanopyridine.mol +29 -0
  149. molSimplify/Ligands/cyclam.mol +81 -0
  150. molSimplify/Ligands/cyclen.mol +69 -0
  151. molSimplify/Ligands/cyclopentadienyl.mol +26 -0
  152. molSimplify/Ligands/cysteine.mol +32 -0
  153. molSimplify/Ligands/diaminomethyl.mol +19 -0
  154. molSimplify/Ligands/diazine.mol +25 -0
  155. molSimplify/Ligands/diazole.mol +23 -0
  156. molSimplify/Ligands/dicyanamide.mol +15 -0
  157. molSimplify/Ligands/dihydrofuran.mol +27 -0
  158. molSimplify/Ligands/dmap.xyz +35 -0
  159. molSimplify/Ligands/dmf.mol +28 -0
  160. molSimplify/Ligands/dmi.mol +41 -0
  161. molSimplify/Ligands/dmpe.mol +52 -0
  162. molSimplify/Ligands/dpmu.mol +47 -0
  163. molSimplify/Ligands/dppe.mol +112 -0
  164. molSimplify/Ligands/edta.mol +69 -0
  165. molSimplify/Ligands/en.mol +28 -0
  166. molSimplify/Ligands/ethanethiol.mol +21 -0
  167. molSimplify/Ligands/ethanolamine.mol +26 -0
  168. molSimplify/Ligands/ethbipy.mol +70 -0
  169. molSimplify/Ligands/ethyl.mol +19 -0
  170. molSimplify/Ligands/ethylamine.mol +24 -0
  171. molSimplify/Ligands/ethylene.mol +16 -0
  172. molSimplify/Ligands/ethylesteracac.mol +57 -0
  173. molSimplify/Ligands/fluoride.mol +7 -0
  174. molSimplify/Ligands/fluoride.smi +1 -0
  175. molSimplify/Ligands/formaldehyde.mol +12 -0
  176. molSimplify/Ligands/formamidate.xyz +8 -0
  177. molSimplify/Ligands/formate.xyz +6 -0
  178. molSimplify/Ligands/furan.mol +23 -0
  179. molSimplify/Ligands/glutamic_acid.mol +42 -0
  180. molSimplify/Ligands/glutamine.mol +44 -0
  181. molSimplify/Ligands/glycinate.mol +23 -0
  182. molSimplify/Ligands/glycine.mol +24 -0
  183. molSimplify/Ligands/h2s.mol +10 -0
  184. molSimplify/Ligands/helium.mol +6 -0
  185. molSimplify/Ligands/histidine.mol +45 -0
  186. molSimplify/Ligands/hmpa.mol +62 -0
  187. molSimplify/Ligands/hs-.mol +9 -0
  188. molSimplify/Ligands/hydride.mol +7 -0
  189. molSimplify/Ligands/hydrocarboxyacetylide.xyz +8 -0
  190. molSimplify/Ligands/hydrocyanide.mol +10 -0
  191. molSimplify/Ligands/hydrodiazine.mol +33 -0
  192. molSimplify/Ligands/hydrodiazole.mol +27 -0
  193. molSimplify/Ligands/hydrogensulfide.mol +10 -0
  194. molSimplify/Ligands/hydroisocyanide.mol +11 -0
  195. molSimplify/Ligands/hydrooxazine.mol +31 -0
  196. molSimplify/Ligands/hydrooxazole.mol +25 -0
  197. molSimplify/Ligands/hydrothiazine.mol +31 -0
  198. molSimplify/Ligands/hydrothiazole.mol +25 -0
  199. molSimplify/Ligands/hydroxyl.mol +9 -0
  200. molSimplify/Ligands/imidazole.mol +23 -0
  201. molSimplify/Ligands/imidazolidinone.mol +29 -0
  202. molSimplify/Ligands/imine.mol +13 -0
  203. molSimplify/Ligands/iminodiacetic.mol +33 -0
  204. molSimplify/Ligands/iodide.mol +7 -0
  205. molSimplify/Ligands/iodobenzene.xyz +14 -0
  206. molSimplify/Ligands/isoleucine.mol +48 -0
  207. molSimplify/Ligands/isothiocyanate.mol +11 -0
  208. molSimplify/Ligands/leucine.mol +48 -0
  209. molSimplify/Ligands/ligands.dict +257 -0
  210. molSimplify/Ligands/lysine.mol +54 -0
  211. molSimplify/Ligands/mebenzenedithiol.mol +36 -0
  212. molSimplify/Ligands/mebim_py.xyz +29 -0
  213. molSimplify/Ligands/mebim_pz.xyz +28 -0
  214. molSimplify/Ligands/mebipy.mol +58 -0
  215. molSimplify/Ligands/mecat.mol +36 -0
  216. molSimplify/Ligands/methanal.mol +11 -0
  217. molSimplify/Ligands/methanethiol.mol +15 -0
  218. molSimplify/Ligands/methanol.mol +16 -0
  219. molSimplify/Ligands/methionine.mol +44 -0
  220. molSimplify/Ligands/methyl.mol +13 -0
  221. molSimplify/Ligands/methylacetylide.xyz +8 -0
  222. molSimplify/Ligands/methylamine.mol +19 -0
  223. molSimplify/Ligands/methylazide.xyz +9 -0
  224. molSimplify/Ligands/methylisocy.mol +17 -0
  225. molSimplify/Ligands/methylpyridine.mol +33 -0
  226. molSimplify/Ligands/n2.mol +8 -0
  227. molSimplify/Ligands/n4py.xyz +51 -0
  228. molSimplify/Ligands/nch.mol +10 -0
  229. molSimplify/Ligands/nco-.mol +11 -0
  230. molSimplify/Ligands/nethanolamine.mol +26 -0
  231. molSimplify/Ligands/nitrate.mol +14 -0
  232. molSimplify/Ligands/nitrite.mol +11 -0
  233. molSimplify/Ligands/nitro.mol +11 -0
  234. molSimplify/Ligands/nitrobipy.mol +54 -0
  235. molSimplify/Ligands/nitroso.mol +8 -0
  236. molSimplify/Ligands/nme3.mol +30 -0
  237. molSimplify/Ligands/no-.mol +10 -0
  238. molSimplify/Ligands/no2-.mol +11 -0
  239. molSimplify/Ligands/noxygen.mol +8 -0
  240. molSimplify/Ligands/ns-.mol +10 -0
  241. molSimplify/Ligands/o-pyridylbenzene.xyz +23 -0
  242. molSimplify/Ligands/o-pyridylphenylanion.xyz +22 -0
  243. molSimplify/Ligands/o2-.mol +9 -0
  244. molSimplify/Ligands/o2.xyz +4 -0
  245. molSimplify/Ligands/och2.mol +12 -0
  246. molSimplify/Ligands/oethanolamine.mol +26 -0
  247. molSimplify/Ligands/ome2.mol +22 -0
  248. molSimplify/Ligands/ooh.xyz +5 -0
  249. molSimplify/Ligands/oxalate.mol +17 -0
  250. molSimplify/Ligands/oxalate.smi +1 -0
  251. molSimplify/Ligands/oxygen.mol +7 -0
  252. molSimplify/Ligands/pentacyanocyclopentadienide.mol +36 -0
  253. molSimplify/Ligands/ph2-.mol +11 -0
  254. molSimplify/Ligands/ph3.mol +12 -0
  255. molSimplify/Ligands/phen.mol +51 -0
  256. molSimplify/Ligands/phenacac.mol +63 -0
  257. molSimplify/Ligands/phenalalanine.mol +51 -0
  258. molSimplify/Ligands/phendione.mol +51 -0
  259. molSimplify/Ligands/phenphen.mol +75 -0
  260. molSimplify/Ligands/phenylbenzoxazole.mol +54 -0
  261. molSimplify/Ligands/phenylcyc.mol +99 -0
  262. molSimplify/Ligands/phenylenediamine.mol +37 -0
  263. molSimplify/Ligands/phenylisocy.mol +32 -0
  264. molSimplify/Ligands/phosacidbipy.mol +66 -0
  265. molSimplify/Ligands/phosphine.mol +13 -0
  266. molSimplify/Ligands/phosphorine.mol +27 -0
  267. molSimplify/Ligands/phosphorustrifluoride.mol +12 -0
  268. molSimplify/Ligands/phthalocyanine.mol +126 -0
  269. molSimplify/Ligands/pme3o.mol +32 -0
  270. molSimplify/Ligands/porphyrin.mol +82 -0
  271. molSimplify/Ligands/pph3o.mol +77 -0
  272. molSimplify/Ligands/proline.mol +39 -0
  273. molSimplify/Ligands/propdiol.mol +21 -0
  274. molSimplify/Ligands/propylene.mol +23 -0
  275. molSimplify/Ligands/pyridine.mol +27 -0
  276. molSimplify/Ligands/pyrimidone.mol +27 -0
  277. molSimplify/Ligands/pyrrole.mol +24 -0
  278. molSimplify/Ligands/quinoxalinedithiol.mol +39 -0
  279. molSimplify/Ligands/s2-.mol +9 -0
  280. molSimplify/Ligands/salen.mol +75 -0
  281. molSimplify/Ligands/salphen.mol +84 -0
  282. molSimplify/Ligands/serine.mol +32 -0
  283. molSimplify/Ligands/simple_ligands.dict +14 -0
  284. molSimplify/Ligands/sulfacidbipy.mol +63 -0
  285. molSimplify/Ligands/tbucat.mol +54 -0
  286. molSimplify/Ligands/tbuphisocy.mol +56 -0
  287. molSimplify/Ligands/tbutylcyclen.mol +166 -0
  288. molSimplify/Ligands/tbutylisocy.mol +35 -0
  289. molSimplify/Ligands/tbutylthiol.mol +33 -0
  290. molSimplify/Ligands/tcnoet.mol +43 -0
  291. molSimplify/Ligands/tcnoetOH.mol +45 -0
  292. molSimplify/Ligands/terpy.mol +65 -0
  293. molSimplify/Ligands/tetrahydrofuran.mol +31 -0
  294. molSimplify/Ligands/thiane.mol +37 -0
  295. molSimplify/Ligands/thiazole.mol +21 -0
  296. molSimplify/Ligands/thiocyanate.mol +11 -0
  297. molSimplify/Ligands/thiol.mol +9 -0
  298. molSimplify/Ligands/thiophene.mol +23 -0
  299. molSimplify/Ligands/thiopyridine.mol +29 -0
  300. molSimplify/Ligands/threonine.mol +38 -0
  301. molSimplify/Ligands/tpp.mol +165 -0
  302. molSimplify/Ligands/tricyanomethyl.mol +19 -0
  303. molSimplify/Ligands/trifluoromethyl.mol +13 -0
  304. molSimplify/Ligands/tryptophan.mol +60 -0
  305. molSimplify/Ligands/tyrosine.mol +53 -0
  306. molSimplify/Ligands/uthiol.mol +11 -0
  307. molSimplify/Ligands/uthiolme2.mol +23 -0
  308. molSimplify/Ligands/valine.mol +42 -0
  309. molSimplify/Ligands/water.mol +10 -0
  310. molSimplify/Ligands/x.mol +6 -0
  311. molSimplify/Scripts/__init__.py +0 -0
  312. molSimplify/Scripts/addtodb.py +308 -0
  313. molSimplify/Scripts/cellbuilder.py +1592 -0
  314. molSimplify/Scripts/cellbuilder_tools.py +701 -0
  315. molSimplify/Scripts/chains.py +342 -0
  316. molSimplify/Scripts/convert_2to3.py +23 -0
  317. molSimplify/Scripts/dbinteract.py +631 -0
  318. molSimplify/Scripts/distgeom.py +617 -0
  319. molSimplify/Scripts/findcorrelations.py +287 -0
  320. molSimplify/Scripts/generator.py +267 -0
  321. molSimplify/Scripts/geometry.py +1224 -0
  322. molSimplify/Scripts/grabguivars.py +845 -0
  323. molSimplify/Scripts/in_b3lyp_usetc.py +141 -0
  324. molSimplify/Scripts/inparse.py +1673 -0
  325. molSimplify/Scripts/io.py +1149 -0
  326. molSimplify/Scripts/isomers.py +415 -0
  327. molSimplify/Scripts/jobgen.py +247 -0
  328. molSimplify/Scripts/krr_prep.py +1262 -0
  329. molSimplify/Scripts/molSimplify_io.py +18 -0
  330. molSimplify/Scripts/molden2psi4wfn.py +166 -0
  331. molSimplify/Scripts/namegen.py +32 -0
  332. molSimplify/Scripts/nn_prep.py +561 -0
  333. molSimplify/Scripts/oct_check_mols.py +782 -0
  334. molSimplify/Scripts/periodic_QE.py +97 -0
  335. molSimplify/Scripts/postmold.py +304 -0
  336. molSimplify/Scripts/postmwfn.py +709 -0
  337. molSimplify/Scripts/postparse.py +488 -0
  338. molSimplify/Scripts/postproc.py +139 -0
  339. molSimplify/Scripts/qcgen.py +1450 -0
  340. molSimplify/Scripts/rmsd.py +489 -0
  341. molSimplify/Scripts/rungen.py +670 -0
  342. molSimplify/Scripts/structgen.py +3040 -0
  343. molSimplify/Scripts/tf_nn_prep.py +894 -0
  344. molSimplify/Scripts/tsgen.py +295 -0
  345. molSimplify/Scripts/uq_calibration.py +69 -0
  346. molSimplify/__init__.py +0 -0
  347. molSimplify/__main__.py +197 -0
  348. molSimplify/icons/chemdb.png +0 -0
  349. molSimplify/icons/hjklogo.png +0 -0
  350. molSimplify/icons/icon.png +0 -0
  351. molSimplify/icons/logo.png +0 -0
  352. molSimplify/icons/logo_old.png +0 -0
  353. molSimplify/icons/petachem.png +0 -0
  354. molSimplify/icons/petachem2.png +0 -0
  355. molSimplify/icons/petachem_full.png +0 -0
  356. molSimplify/icons/pythonlogo.png +0 -0
  357. molSimplify/icons/sge copy.png +0 -0
  358. molSimplify/icons/sge.png +0 -0
  359. molSimplify/icons/slurm.png +0 -0
  360. molSimplify/icons/wft1.png +0 -0
  361. molSimplify/icons/wft2.png +0 -0
  362. molSimplify/icons/wft3.png +0 -0
  363. molSimplify/ml/__init__.py +0 -0
  364. molSimplify/ml/kernels.py +36 -0
  365. molSimplify/ml/layers.py +29 -0
  366. molSimplify/molscontrol/__init__.py +14 -0
  367. molSimplify/molscontrol/_version.py +521 -0
  368. molSimplify/molscontrol/clf_tools.py +144 -0
  369. molSimplify/molscontrol/data/README.md +21 -0
  370. molSimplify/molscontrol/data/look_and_say.dat +15 -0
  371. molSimplify/molscontrol/dynamic_classifier.py +514 -0
  372. molSimplify/molscontrol/io_tools.py +363 -0
  373. molSimplify/molscontrol/molscontrol.py +49 -0
  374. molSimplify/molscontrol/terachem/jobscript_control.sh +31 -0
  375. molSimplify/molscontrol/terachem/terachem_input +22 -0
  376. molSimplify/python_krr/X_train_TS.csv +535 -0
  377. molSimplify/python_krr/__init__.py +0 -0
  378. molSimplify/python_krr/hat2_X_mean_std.csv +3 -0
  379. molSimplify/python_krr/hat2_feature_names.csv +1 -0
  380. molSimplify/python_krr/hat2_y_mean_std.csv +2 -0
  381. molSimplify/python_krr/hat_X_mean_std.csv +6 -0
  382. molSimplify/python_krr/hat_feature_names.csv +1 -0
  383. molSimplify/python_krr/hat_krr_X_train.csv +5205 -0
  384. molSimplify/python_krr/hat_krr_dual_coef.csv +1 -0
  385. molSimplify/python_krr/hat_y_mean_std.csv +2 -0
  386. molSimplify/python_krr/sklearn_models.py +34 -0
  387. molSimplify/python_krr/y_train_TS.csv +535 -0
  388. molSimplify/python_nn/ANN.py +198 -0
  389. molSimplify/python_nn/__init__.py +0 -0
  390. molSimplify/python_nn/clf_analysis_tool.py +125 -0
  391. molSimplify/python_nn/dictionary_toolbox.py +49 -0
  392. molSimplify/python_nn/ensemble_test.py +309 -0
  393. molSimplify/python_nn/hs_center.csv +26 -0
  394. molSimplify/python_nn/hs_scale.csv +26 -0
  395. molSimplify/python_nn/ls_center.csv +26 -0
  396. molSimplify/python_nn/ls_scale.csv +26 -0
  397. molSimplify/python_nn/ms_hs_b1.csv +50 -0
  398. molSimplify/python_nn/ms_hs_b2.csv +50 -0
  399. molSimplify/python_nn/ms_hs_b3.csv +1 -0
  400. molSimplify/python_nn/ms_hs_w1.csv +50 -0
  401. molSimplify/python_nn/ms_hs_w2.csv +50 -0
  402. molSimplify/python_nn/ms_hs_w3.csv +1 -0
  403. molSimplify/python_nn/ms_ls_b1.csv +50 -0
  404. molSimplify/python_nn/ms_ls_b2.csv +50 -0
  405. molSimplify/python_nn/ms_ls_b3.csv +1 -0
  406. molSimplify/python_nn/ms_ls_w1.csv +50 -0
  407. molSimplify/python_nn/ms_ls_w2.csv +50 -0
  408. molSimplify/python_nn/ms_ls_w3.csv +1 -0
  409. molSimplify/python_nn/ms_slope_b1.csv +50 -0
  410. molSimplify/python_nn/ms_slope_b2.csv +50 -0
  411. molSimplify/python_nn/ms_slope_b3.csv +1 -0
  412. molSimplify/python_nn/ms_slope_w1.csv +50 -0
  413. molSimplify/python_nn/ms_slope_w2.csv +50 -0
  414. molSimplify/python_nn/ms_slope_w3.csv +1 -0
  415. molSimplify/python_nn/ms_split_b1.csv +50 -0
  416. molSimplify/python_nn/ms_split_b2.csv +50 -0
  417. molSimplify/python_nn/ms_split_b3.csv +1 -0
  418. molSimplify/python_nn/ms_split_w1.csv +50 -0
  419. molSimplify/python_nn/ms_split_w2.csv +50 -0
  420. molSimplify/python_nn/ms_split_w3.csv +1 -0
  421. molSimplify/python_nn/slope_center.csv +25 -0
  422. molSimplify/python_nn/slope_scale.csv +25 -0
  423. molSimplify/python_nn/split_center.csv +26 -0
  424. molSimplify/python_nn/split_scale.csv +26 -0
  425. molSimplify/python_nn/tf_ANN.py +762 -0
  426. molSimplify/python_nn/train_data.csv +1211 -0
  427. molSimplify/tf_nn/__init__.py +0 -0
  428. molSimplify/tf_nn/geo_static_clf/geo_static_clf_model.h5 +0 -0
  429. molSimplify/tf_nn/geo_static_clf/geo_static_clf_train_name.csv +1591 -0
  430. molSimplify/tf_nn/geo_static_clf/geo_static_clf_train_x.csv +2790 -0
  431. molSimplify/tf_nn/geo_static_clf/geo_static_clf_train_y.csv +2790 -0
  432. molSimplify/tf_nn/geo_static_clf/geo_static_clf_vars.csv +154 -0
  433. molSimplify/tf_nn/geos/hs_ii_bl_x.csv +1577 -0
  434. molSimplify/tf_nn/geos/hs_ii_bl_y.csv +1577 -0
  435. molSimplify/tf_nn/geos/hs_ii_model.h5 +0 -0
  436. molSimplify/tf_nn/geos/hs_ii_model.json +1 -0
  437. molSimplify/tf_nn/geos/hs_ii_vars.csv +154 -0
  438. molSimplify/tf_nn/geos/hs_iii_bl_x.csv +1659 -0
  439. molSimplify/tf_nn/geos/hs_iii_bl_y.csv +1659 -0
  440. molSimplify/tf_nn/geos/hs_iii_model.h5 +0 -0
  441. molSimplify/tf_nn/geos/hs_iii_model.json +1 -0
  442. molSimplify/tf_nn/geos/hs_iii_vars.csv +154 -0
  443. molSimplify/tf_nn/geos/ls_ii_bl_x.csv +1374 -0
  444. molSimplify/tf_nn/geos/ls_ii_bl_y.csv +1374 -0
  445. molSimplify/tf_nn/geos/ls_ii_model.h5 +0 -0
  446. molSimplify/tf_nn/geos/ls_ii_model.json +1 -0
  447. molSimplify/tf_nn/geos/ls_ii_vars.csv +154 -0
  448. molSimplify/tf_nn/geos/ls_iii_bl_x.csv +1364 -0
  449. molSimplify/tf_nn/geos/ls_iii_bl_y.csv +1364 -0
  450. molSimplify/tf_nn/geos/ls_iii_model.h5 +0 -0
  451. molSimplify/tf_nn/geos/ls_iii_model.json +1 -0
  452. molSimplify/tf_nn/geos/ls_iii_vars.csv +154 -0
  453. molSimplify/tf_nn/homolumo/gap_model.h5 +0 -0
  454. molSimplify/tf_nn/homolumo/gap_model.json +1 -0
  455. molSimplify/tf_nn/homolumo/gap_test_names.csv +175 -0
  456. molSimplify/tf_nn/homolumo/gap_test_x.csv +176 -0
  457. molSimplify/tf_nn/homolumo/gap_test_y.csv +176 -0
  458. molSimplify/tf_nn/homolumo/gap_train_names.csv +699 -0
  459. molSimplify/tf_nn/homolumo/gap_train_x.csv +700 -0
  460. molSimplify/tf_nn/homolumo/gap_train_y.csv +700 -0
  461. molSimplify/tf_nn/homolumo/gap_vars.csv +153 -0
  462. molSimplify/tf_nn/homolumo/homo_model.h5 +0 -0
  463. molSimplify/tf_nn/homolumo/homo_model.json +126 -0
  464. molSimplify/tf_nn/homolumo/homo_test_names.csv +175 -0
  465. molSimplify/tf_nn/homolumo/homo_test_x.csv +176 -0
  466. molSimplify/tf_nn/homolumo/homo_test_y.csv +176 -0
  467. molSimplify/tf_nn/homolumo/homo_train_names.csv +699 -0
  468. molSimplify/tf_nn/homolumo/homo_train_x.csv +700 -0
  469. molSimplify/tf_nn/homolumo/homo_train_y.csv +700 -0
  470. molSimplify/tf_nn/homolumo/homo_vars.csv +153 -0
  471. molSimplify/tf_nn/oxoandhomo/homo_empty_info.json +7 -0
  472. molSimplify/tf_nn/oxoandhomo/homo_empty_model.h5 +0 -0
  473. molSimplify/tf_nn/oxoandhomo/homo_empty_model.json +1 -0
  474. molSimplify/tf_nn/oxoandhomo/homo_empty_test_names.csv +143 -0
  475. molSimplify/tf_nn/oxoandhomo/homo_empty_test_x.csv +144 -0
  476. molSimplify/tf_nn/oxoandhomo/homo_empty_test_y.csv +144 -0
  477. molSimplify/tf_nn/oxoandhomo/homo_empty_train_names.csv +513 -0
  478. molSimplify/tf_nn/oxoandhomo/homo_empty_train_x.csv +514 -0
  479. molSimplify/tf_nn/oxoandhomo/homo_empty_train_y.csv +514 -0
  480. molSimplify/tf_nn/oxoandhomo/homo_empty_val_names.csv +143 -0
  481. molSimplify/tf_nn/oxoandhomo/homo_empty_val_x.csv +58 -0
  482. molSimplify/tf_nn/oxoandhomo/homo_empty_val_y.csv +58 -0
  483. molSimplify/tf_nn/oxoandhomo/homo_empty_vars.csv +155 -0
  484. molSimplify/tf_nn/oxoandhomo/oxo20_info.json +7 -0
  485. molSimplify/tf_nn/oxoandhomo/oxo20_model.h5 +0 -0
  486. molSimplify/tf_nn/oxoandhomo/oxo20_model.json +1 -0
  487. molSimplify/tf_nn/oxoandhomo/oxo20_test_names.csv +143 -0
  488. molSimplify/tf_nn/oxoandhomo/oxo20_test_x.csv +144 -0
  489. molSimplify/tf_nn/oxoandhomo/oxo20_test_y.csv +144 -0
  490. molSimplify/tf_nn/oxoandhomo/oxo20_train_names.csv +513 -0
  491. molSimplify/tf_nn/oxoandhomo/oxo20_train_x.csv +514 -0
  492. molSimplify/tf_nn/oxoandhomo/oxo20_train_y.csv +514 -0
  493. molSimplify/tf_nn/oxoandhomo/oxo20_val_names.csv +143 -0
  494. molSimplify/tf_nn/oxoandhomo/oxo20_val_x.csv +58 -0
  495. molSimplify/tf_nn/oxoandhomo/oxo20_val_y.csv +58 -0
  496. molSimplify/tf_nn/oxoandhomo/oxo20_vars.csv +154 -0
  497. molSimplify/tf_nn/oxocatalysis/hat_model.h5 +0 -0
  498. molSimplify/tf_nn/oxocatalysis/hat_model.json +1 -0
  499. molSimplify/tf_nn/oxocatalysis/hat_test_names.csv +419 -0
  500. molSimplify/tf_nn/oxocatalysis/hat_test_x.csv +420 -0
  501. molSimplify/tf_nn/oxocatalysis/hat_test_y.csv +420 -0
  502. molSimplify/tf_nn/oxocatalysis/hat_train_names.csv +1507 -0
  503. molSimplify/tf_nn/oxocatalysis/hat_train_x.csv +1508 -0
  504. molSimplify/tf_nn/oxocatalysis/hat_train_y.csv +1508 -0
  505. molSimplify/tf_nn/oxocatalysis/hat_val_x.csv +169 -0
  506. molSimplify/tf_nn/oxocatalysis/hat_val_y.csv +169 -0
  507. molSimplify/tf_nn/oxocatalysis/hat_vars.csv +162 -0
  508. molSimplify/tf_nn/oxocatalysis/oxo_model.h5 +0 -0
  509. molSimplify/tf_nn/oxocatalysis/oxo_model.json +1 -0
  510. molSimplify/tf_nn/oxocatalysis/oxo_test_names.csv +527 -0
  511. molSimplify/tf_nn/oxocatalysis/oxo_test_x.csv +528 -0
  512. molSimplify/tf_nn/oxocatalysis/oxo_test_y.csv +528 -0
  513. molSimplify/tf_nn/oxocatalysis/oxo_train_names.csv +1897 -0
  514. molSimplify/tf_nn/oxocatalysis/oxo_train_x.csv +1898 -0
  515. molSimplify/tf_nn/oxocatalysis/oxo_train_y.csv +1898 -0
  516. molSimplify/tf_nn/oxocatalysis/oxo_val_x.csv +212 -0
  517. molSimplify/tf_nn/oxocatalysis/oxo_val_y.csv +212 -0
  518. molSimplify/tf_nn/oxocatalysis/oxo_vars.csv +162 -0
  519. molSimplify/tf_nn/rescaling_data/gap_mean_x.csv +153 -0
  520. molSimplify/tf_nn/rescaling_data/gap_mean_y.csv +1 -0
  521. molSimplify/tf_nn/rescaling_data/gap_var_x.csv +153 -0
  522. molSimplify/tf_nn/rescaling_data/gap_var_y.csv +1 -0
  523. molSimplify/tf_nn/rescaling_data/geo_static_clf_mean_x.csv +154 -0
  524. molSimplify/tf_nn/rescaling_data/geo_static_clf_mean_y.csv +1 -0
  525. molSimplify/tf_nn/rescaling_data/geo_static_clf_var_x.csv +154 -0
  526. molSimplify/tf_nn/rescaling_data/geo_static_clf_var_y.csv +1 -0
  527. molSimplify/tf_nn/rescaling_data/hat_mean_x.csv +162 -0
  528. molSimplify/tf_nn/rescaling_data/hat_mean_y.csv +1 -0
  529. molSimplify/tf_nn/rescaling_data/hat_var_x.csv +162 -0
  530. molSimplify/tf_nn/rescaling_data/hat_var_y.csv +1 -0
  531. molSimplify/tf_nn/rescaling_data/homo_empty_mean_x.csv +155 -0
  532. molSimplify/tf_nn/rescaling_data/homo_empty_mean_y.csv +1 -0
  533. molSimplify/tf_nn/rescaling_data/homo_empty_var_x.csv +155 -0
  534. molSimplify/tf_nn/rescaling_data/homo_empty_var_y.csv +1 -0
  535. molSimplify/tf_nn/rescaling_data/homo_mean_x.csv +153 -0
  536. molSimplify/tf_nn/rescaling_data/homo_mean_y.csv +1 -0
  537. molSimplify/tf_nn/rescaling_data/homo_var_x.csv +153 -0
  538. molSimplify/tf_nn/rescaling_data/homo_var_y.csv +1 -0
  539. molSimplify/tf_nn/rescaling_data/hs_ii_mean_x.csv +154 -0
  540. molSimplify/tf_nn/rescaling_data/hs_ii_mean_y.csv +3 -0
  541. molSimplify/tf_nn/rescaling_data/hs_ii_var_x.csv +154 -0
  542. molSimplify/tf_nn/rescaling_data/hs_ii_var_y.csv +3 -0
  543. molSimplify/tf_nn/rescaling_data/hs_iii_mean_x.csv +154 -0
  544. molSimplify/tf_nn/rescaling_data/hs_iii_mean_y.csv +3 -0
  545. molSimplify/tf_nn/rescaling_data/hs_iii_var_x.csv +154 -0
  546. molSimplify/tf_nn/rescaling_data/hs_iii_var_y.csv +3 -0
  547. molSimplify/tf_nn/rescaling_data/ls_ii_mean_x.csv +154 -0
  548. molSimplify/tf_nn/rescaling_data/ls_ii_mean_y.csv +3 -0
  549. molSimplify/tf_nn/rescaling_data/ls_ii_var_x.csv +154 -0
  550. molSimplify/tf_nn/rescaling_data/ls_ii_var_y.csv +3 -0
  551. molSimplify/tf_nn/rescaling_data/ls_iii_mean_x.csv +154 -0
  552. molSimplify/tf_nn/rescaling_data/ls_iii_mean_y.csv +3 -0
  553. molSimplify/tf_nn/rescaling_data/ls_iii_var_x.csv +154 -0
  554. molSimplify/tf_nn/rescaling_data/ls_iii_var_y.csv +3 -0
  555. molSimplify/tf_nn/rescaling_data/oxo20_mean_x.csv +154 -0
  556. molSimplify/tf_nn/rescaling_data/oxo20_mean_y.csv +1 -0
  557. molSimplify/tf_nn/rescaling_data/oxo20_var_x.csv +154 -0
  558. molSimplify/tf_nn/rescaling_data/oxo20_var_y.csv +1 -0
  559. molSimplify/tf_nn/rescaling_data/oxo_mean_x.csv +162 -0
  560. molSimplify/tf_nn/rescaling_data/oxo_mean_y.csv +1 -0
  561. molSimplify/tf_nn/rescaling_data/oxo_var_x.csv +162 -0
  562. molSimplify/tf_nn/rescaling_data/oxo_var_y.csv +1 -0
  563. molSimplify/tf_nn/rescaling_data/sc_static_clf_mean_x.csv +154 -0
  564. molSimplify/tf_nn/rescaling_data/sc_static_clf_mean_y.csv +1 -0
  565. molSimplify/tf_nn/rescaling_data/sc_static_clf_var_x.csv +154 -0
  566. molSimplify/tf_nn/rescaling_data/sc_static_clf_var_y.csv +1 -0
  567. molSimplify/tf_nn/rescaling_data/split_mean_x.csv +155 -0
  568. molSimplify/tf_nn/rescaling_data/split_mean_y.csv +1 -0
  569. molSimplify/tf_nn/rescaling_data/split_var_x.csv +155 -0
  570. molSimplify/tf_nn/rescaling_data/split_var_y.csv +1 -0
  571. molSimplify/tf_nn/sc_static_clf/sc_static_clf_model.h5 +0 -0
  572. molSimplify/tf_nn/sc_static_clf/sc_static_clf_train_name.csv +1591 -0
  573. molSimplify/tf_nn/sc_static_clf/sc_static_clf_train_x.csv +1592 -0
  574. molSimplify/tf_nn/sc_static_clf/sc_static_clf_train_y.csv +1592 -0
  575. molSimplify/tf_nn/sc_static_clf/sc_static_clf_vars.csv +154 -0
  576. molSimplify/tf_nn/split/split_model.h5 +0 -0
  577. molSimplify/tf_nn/split/split_model.json +1 -0
  578. molSimplify/tf_nn/split/split_vars.csv +155 -0
  579. molSimplify/tf_nn/split/split_x.csv +1902 -0
  580. molSimplify/tf_nn/split/split_y.csv +1902 -0
  581. molSimplify/tf_nn/split/train_names.csv +1901 -0
  582. molSimplify/utils/__init__.py +0 -0
  583. molSimplify/utils/decorators.py +16 -0
  584. molSimplify/utils/metaclasses.py +12 -0
  585. molSimplify/utils/tensorflow.py +23 -0
  586. molSimplify/utils/timer.py +16 -0
  587. molSimplify-1.7.4.dist-info/LICENSE +674 -0
  588. molSimplify-1.7.4.dist-info/METADATA +821 -0
  589. molSimplify-1.7.4.dist-info/RECORD +651 -0
  590. molSimplify-1.7.4.dist-info/WHEEL +5 -0
  591. molSimplify-1.7.4.dist-info/entry_points.txt +3 -0
  592. molSimplify-1.7.4.dist-info/top_level.txt +4 -0
  593. tests/generateTests.py +122 -0
  594. tests/helperFuncs.py +658 -0
  595. tests/informatics/test_MOF_descriptors.py +128 -0
  596. tests/informatics/test_active_learning.py +113 -0
  597. tests/informatics/test_coulomb_analyze.py +24 -0
  598. tests/informatics/test_graph_racs.py +193 -0
  599. tests/ml/test_kernels.py +20 -0
  600. tests/ml/test_layers.py +47 -0
  601. tests/runtest.py +10 -0
  602. tests/test_Mol2D.py +128 -0
  603. tests/test_basic_imports.py +62 -0
  604. tests/test_bidentate.py +25 -0
  605. tests/test_cli.py +20 -0
  606. tests/test_distgeom.py +106 -0
  607. tests/test_example_1.py +29 -0
  608. tests/test_example_3.py +31 -0
  609. tests/test_example_5.py +43 -0
  610. tests/test_example_7.py +28 -0
  611. tests/test_example_8.py +15 -0
  612. tests/test_example_tbp.py +15 -0
  613. tests/test_ff_xtb.py +111 -0
  614. tests/test_geocheck_oct.py +26 -0
  615. tests/test_geocheck_one_empty.py +15 -0
  616. tests/test_geometry.py +44 -0
  617. tests/test_inparse.py +76 -0
  618. tests/test_io.py +84 -0
  619. tests/test_jobgen.py +84 -0
  620. tests/test_joption_pythonic.py +27 -0
  621. tests/test_ligand_assign.py +58 -0
  622. tests/test_ligand_assign_consistent.py +60 -0
  623. tests/test_ligand_class.py +26 -0
  624. tests/test_ligand_from_mol_file.py +35 -0
  625. tests/test_ligands.py +86 -0
  626. tests/test_mol3D.py +337 -0
  627. tests/test_molcas_caspt2.py +15 -0
  628. tests/test_molcas_casscf.py +15 -0
  629. tests/test_old_ANNs.py +68 -0
  630. tests/test_orca_ccsdt.py +15 -0
  631. tests/test_orca_dft.py +15 -0
  632. tests/test_qcgen.py +50 -0
  633. tests/test_racs.py +124 -0
  634. tests/test_rmsd.py +68 -0
  635. tests/test_structgen_functions.py +198 -0
  636. tests/test_tetrahedral.py +29 -0
  637. tests/test_tutorial_10_part_one.py +16 -0
  638. tests/test_tutorial_10_part_two.py +15 -0
  639. tests/test_tutorial_2.py +11 -0
  640. tests/test_tutorial_3.py +15 -0
  641. tests/test_tutorial_4.py +57 -0
  642. tests/test_tutorial_6.py +10 -0
  643. tests/test_tutorial_8.py +29 -0
  644. tests/test_tutorial_9_part_one.py +15 -0
  645. tests/test_tutorial_9_part_two.py +15 -0
  646. tests/test_tutorial_qm9_part_one.py +6 -0
  647. tests/testresources/refs/racs/generate_references.py +85 -0
  648. workflows/NandyJACSAu2022/bridge_functionalizer.py +253 -0
  649. workflows/NandyJACSAu2022/frag_functionalizer.py +242 -0
  650. workflows/NandyJACSAu2022/fragment_classes.py +586 -0
  651. workflows/NandyJACSAu2022/macrocycle_synthesis.py +179 -0
@@ -0,0 +1,894 @@
1
+ # @file nn_prep.py
2
+ # Helper routines for ANN integration
3
+ #
4
+ # Written by JP Janet for HJK Group
5
+ #
6
+ # Dpt of Chemical Engineering, MIT
7
+
8
+ import time
9
+ import os
10
+ from typing import Tuple, List, Dict, Any, Union
11
+ from molSimplify.Classes.ligand import ligand
12
+ from molSimplify.Classes.mol3D import mol3D
13
+ from molSimplify.Classes.atom3D import atom3D
14
+ from molSimplify.Scripts.io import lig_load
15
+ from molSimplify.Informatics.RACassemble import (assemble_connectivity_from_parts,
16
+ create_OHE)
17
+ from molSimplify.Informatics.lacRACAssemble import get_descriptor_vector
18
+ from molSimplify.Informatics.decoration_manager import (decorate_ligand)
19
+ from molSimplify.utils.tensorflow import tensorflow_silence
20
+ from molSimplify.utils.timer import DebugTimer
21
+ from molSimplify.python_nn.clf_analysis_tool import lse_trust
22
+ from molSimplify.python_nn.tf_ANN import (ANN_supervisor,
23
+ find_ANN_10_NN_normalized_latent_dist,
24
+ find_ANN_latent_dist,
25
+ find_true_min_eu_dist)
26
+
27
+
28
+ def spin_classify(metal: str, spin: Union[int, str], ox: int) -> Tuple[bool, List[int]]:
29
+ metal_spin_dictionary = {'co': {2: 4, 3: 5},
30
+ 'cr': {2: 5, 3: 4},
31
+ 'fe': {2: 5, 3: 6},
32
+ 'mn': {2: 6, 3: 5},
33
+ 'ni': {2: 3}}
34
+
35
+ suggest_spin_dictionary = {'co': {2: [2, 4], 3: [1, 5]},
36
+ 'cr': {2: [1, 5], 3: [2, 4]},
37
+ 'fe': {2: [1, 5], 3: [2, 6]},
38
+ 'mn': {2: [2, 6], 3: [1, 5]},
39
+ 'ni': {2: [1, 3]}}
40
+
41
+ high_spin = False
42
+ if (int(spin) >= int(metal_spin_dictionary[metal][ox])):
43
+ high_spin = True
44
+ spin_ops = suggest_spin_dictionary[metal][ox]
45
+ return high_spin, spin_ops
46
+
47
+
48
+ # wrapper to get ANN predictions from a known mol3D()
49
+ # generally unsafe
50
+ def invoke_ANNs_from_mol3d(mol: mol3D, oxidation_state: int,
51
+ alpha: float = 0.2, debug: bool = False) -> dict:
52
+
53
+ tensorflow_silence()
54
+
55
+ # check input
56
+ if not oxidation_state == 2 and not oxidation_state == 3:
57
+ print('Error, oxidation state must be 2 or 3')
58
+ return {}
59
+
60
+ # find the metal from RACs
61
+ metal = mol.getAtom(mol.findMetal()[0]).symbol()
62
+ # get RACs
63
+ descriptor_names, descriptors = get_descriptor_vector(
64
+ mol, ox_modifier={metal: oxidation_state})
65
+ # get one-hot-encoding (OHE)
66
+ ohe_names, ohe_values = create_OHE(metal.capitalize(), oxidation_state)
67
+ descriptor_names += ohe_names
68
+ descriptors += ohe_values
69
+ # set exchange fraction
70
+ descriptor_names += ['alpha']
71
+ descriptors += [alpha]
72
+
73
+ # call ANN for splitting
74
+ split, latent_split = ANN_supervisor(
75
+ 'split', descriptors, descriptor_names, debug)
76
+
77
+ # call ANN for bond lengths
78
+ to_roman = {2: 'ii', 3: 'iii'}
79
+ r_ls, latent_r_ls = ANN_supervisor(
80
+ f'ls_{to_roman[oxidation_state]}', descriptors, descriptor_names, debug)
81
+ r_hs, latent_r_hs = ANN_supervisor(
82
+ f'hs_{to_roman[oxidation_state]}', descriptors, descriptor_names, debug)
83
+
84
+ # ANN distance for splitting
85
+ split_dist = find_true_min_eu_dist("split", descriptors, descriptor_names)
86
+
87
+ # compile results and return
88
+ results_dictionary = {"ls_bl": r_ls,
89
+ "hs_bl": r_hs,
90
+ "split": split,
91
+ "distance": split_dist}
92
+ return (results_dictionary)
93
+
94
+
95
+ def tf_check_ligands(ligs: List[str], batslist: List[List[int]],
96
+ dents: List[int], tcats: List[List[Union[int, str]]],
97
+ occs: List[int], debug: bool):
98
+ # tests if ligand combination
99
+ # is compatible with the ANN
100
+ # INPUT:
101
+ # - ligs: list of mol3D class, ligands
102
+ # - batslist: list of int, occupations
103
+ # - dents: list of int, denticity
104
+ # - tcats: list of int/bool
105
+ # OUTPUT:
106
+ # - valid: bool
107
+ # tcats controls
108
+ # manual override
109
+ # of connection atoms
110
+
111
+ n_ligs = len(ligs)
112
+ if debug:
113
+ print(('nligs ' + str(n_ligs)))
114
+ print(('ligs ' + str(ligs)))
115
+ print(('occs in function ' + str(occs)))
116
+ print(('tcats in function ' + str(tcats)))
117
+
118
+ axial_ind_list = []
119
+ equatorial_ind_list = []
120
+ axial_ligs = []
121
+ equatorial_ligs = []
122
+ ax_dent = 0
123
+ eq_dent = 0
124
+ eq_tcat = []
125
+ ax_tcat = []
126
+ pentadentate = False
127
+ ax_occs = []
128
+ eq_occs = []
129
+ valid = True
130
+ if (set(dents) == set([2])):
131
+ print('triple bidentate case')
132
+ unique_ligs = []
133
+ ucats = []
134
+ unique_dict = {}
135
+ if not (n_ligs) == 3:
136
+ # something unexpected happened!
137
+ valid = False
138
+ for i in range(0, n_ligs):
139
+ this_lig = ligs[i]
140
+ # mulitple points
141
+ if not (this_lig in unique_ligs):
142
+ unique_ligs.append(this_lig)
143
+ ucats.append(tcats[i])
144
+ unique_dict.update({this_lig: 1})
145
+ elif (this_lig in unique_ligs):
146
+ unique_dict.update({this_lig: unique_dict[this_lig] + 1})
147
+
148
+ if len(unique_ligs) == 1:
149
+ axial_ligs.append(ligs[0])
150
+ ax_dent = 2
151
+ ax_tcat = tcats[0]
152
+ ax_occs.append(1)
153
+ equatorial_ligs.append(ligs[0])
154
+ eq_dent = 2
155
+ eq_tcat = tcats[0]
156
+ eq_occs.append(2)
157
+ elif len(unique_ligs) == 2:
158
+ for key in list(unique_dict.keys()):
159
+ if unique_dict[key] == 1:
160
+ axial_ligs.append(key)
161
+ ax_dent = 2
162
+ ax_occs.append(1)
163
+ ax_tcat = tcats[ligs.index(key)]
164
+ elif unique_dict[key] == 2:
165
+ equatorial_ligs.append(key)
166
+ eq_dent = 2
167
+ eq_occs.append(2)
168
+ eq_tcat = tcats[ligs.index(key)]
169
+ else:
170
+ valid = False
171
+ elif (set(dents) == set([1, 5])):
172
+ print('THIS IS A PENTADENTATE!')
173
+ pentadentate = True
174
+ for i in range(0, n_ligs):
175
+ this_bat = batslist[i]
176
+ this_lig = ligs[i]
177
+ this_dent = dents[i]
178
+ this_occ = occs[i]
179
+ if debug:
180
+ print('\n')
181
+ print(('iteration ' + str(i)))
182
+ print(('this_lig ' + str(this_lig)))
183
+ print(('this_dent ' + str(this_dent)))
184
+ print(('this_occ ' + str(this_occ)))
185
+ print(('this backbone atom ' +
186
+ str(this_bat) + ' from ' + str(batslist)))
187
+ # mulitple points
188
+ if len(this_bat) > 1:
189
+ if debug:
190
+ print(('adding ' + str(this_lig) + ' to equatorial'))
191
+ equatorial_ligs.append(this_lig)
192
+ eq_dent = 4
193
+ eq_tcat = tcats[i]
194
+ eq_occs.append(1)
195
+ equatorial_ind_list.append(i)
196
+ if debug:
197
+ print(('adding ' + str(this_lig) + ' to axial'))
198
+ axial_ligs.append(this_lig)
199
+ ax_dent = 1
200
+ ax_tcat = tcats[i]
201
+ ax_occs.append(1)
202
+ axial_ind_list.append(i)
203
+
204
+ else:
205
+ for i in range(0, n_ligs):
206
+ this_bat = batslist[i]
207
+ this_lig = ligs[i]
208
+ this_dent = dents[i]
209
+ this_occ = occs[i]
210
+ if debug:
211
+ print('\n')
212
+ print(('iteration ' + str(i)))
213
+ print(('this_lig ' + str(this_lig)))
214
+ print(('this_dent ' + str(this_dent)))
215
+ print(('this_occ ' + str(this_occ)))
216
+ print(('this backbone atom ' +
217
+ str(this_bat) + ' from ' + str(batslist)))
218
+ # mulitple points
219
+ if len(this_bat) == 1:
220
+ if (5 in this_bat) or (6 in this_bat):
221
+ if debug:
222
+ print(('adding ' + str(this_lig) + ' to axial'))
223
+ axial_ligs.append(this_lig)
224
+ ax_dent = this_dent
225
+ if this_lig not in ['x', 'oxo', 'hydroxyl']:
226
+ ax_tcat = tcats[i]
227
+ ax_occs.append(occs[i])
228
+ axial_ind_list.append(i)
229
+ else:
230
+ if debug:
231
+ print(('adding ' + str(this_lig) + ' to equatorial'))
232
+ equatorial_ligs.append(this_lig)
233
+ eq_dent = this_dent
234
+ eq_tcat = tcats[i]
235
+ eq_occs.append(occs[i])
236
+ equatorial_ind_list.append(i)
237
+ else:
238
+ equatorial_ligs.append(this_lig)
239
+ eq_dent = this_dent
240
+ eq_tcat = tcats[i]
241
+ eq_occs.append(occs[i])
242
+ equatorial_ind_list.append(i)
243
+ if (len(axial_ligs) > 2):
244
+ print('ANN setup error: axial lig error : ',
245
+ axial_ligs, ax_dent, ax_tcat, ax_occs)
246
+ valid = False
247
+ if debug:
248
+ print(('eq occupations ' + str(eq_occs)))
249
+ print(('eq dent ' + str(eq_dent)))
250
+ if not (4.0 / (float(eq_dent) * sum(eq_occs)) == 1):
251
+ print('ANN setup error: equatorial ligs error: ',
252
+ equatorial_ligs, eq_dent, eq_tcat)
253
+ valid = False
254
+ if valid and len(axial_ind_list) == 0: # get the index position in ligs
255
+ axial_ind_list = [ligs.index(ax_lig) for ax_lig in axial_ligs]
256
+ if valid and len(equatorial_ind_list) == 0: # get the index position in ligs
257
+ equatorial_ind_list = [ligs.index(eq_lig)
258
+ for eq_lig in equatorial_ligs]
259
+
260
+ return (valid, axial_ligs, equatorial_ligs, ax_dent, eq_dent, ax_tcat, eq_tcat,
261
+ axial_ind_list, equatorial_ind_list, ax_occs, eq_occs, pentadentate)
262
+
263
+
264
+ def check_metal(metal: str, oxidation_state: str) -> Tuple[bool, str]:
265
+ supported_metal_dict = {"fe": [2, 3], "mn": [2, 3], "cr": [2, 3],
266
+ "co": [2, 3], "ni": [2]}
267
+ romans = {'I': '1', 'II': '2', 'III': '3', 'IV': '4', 'V': '5', 'VI': '6'}
268
+ if oxidation_state in list(romans.keys()):
269
+ oxidation_state = romans[oxidation_state]
270
+ outcome = False
271
+ if metal in list(supported_metal_dict):
272
+ # print('metal in',supported_metal_dict[metal])
273
+ if int(oxidation_state) in supported_metal_dict[metal]:
274
+ outcome = True
275
+ return outcome, oxidation_state
276
+
277
+
278
+ def tf_ANN_preproc(metal: str, oxstate, spin, ligs: List[str], occs: List[int], dents: List[int],
279
+ batslist: List[List[int]], tcats: List[List[Union[int, str]]],
280
+ licores: dict, decoration, decoration_index, exchange, geometry: str = "oct",
281
+ debug: bool = False) -> Tuple[bool, str, dict, bool]:
282
+ # prepares and runs ANN calculation
283
+
284
+ start_time = time.perf_counter()
285
+
286
+ ######################
287
+ ANN_reason = 'None'
288
+ ANN_attributes: Dict[str, Any] = {}
289
+ ######################
290
+
291
+ emsg = list()
292
+ valid = True
293
+ catalysis = False
294
+ # Set default oxidation state variables
295
+ ox = 0
296
+ this_metal = metal.lower()
297
+ if len(this_metal) > 2:
298
+ this_metal = this_metal[0:2]
299
+ newligs = []
300
+ newcats = []
301
+ newdents = []
302
+ newoccs = []
303
+ newdecs = [False] * 6
304
+ newdec_inds = [[0]] * 6
305
+ count = -1
306
+ for i, lig in enumerate(ligs):
307
+ this_occ = occs[i]
308
+ if debug:
309
+ print(('working on lig: ' + str(lig)))
310
+ print(('occ is ' + str(this_occ)))
311
+ for j in range(0, int(this_occ)):
312
+ count += 1
313
+ newligs.append(lig)
314
+ newdents.append(dents[i])
315
+ newcats.append(tcats[i])
316
+ newoccs.append(1)
317
+ if decoration:
318
+ newdecs[count] = (decoration[i])
319
+ newdec_inds[count] = (decoration_index[i])
320
+
321
+ ligs = newligs
322
+ dents = newdents
323
+ tcats = newcats
324
+ occs = newoccs
325
+ if debug:
326
+ print('tf_nn has finished prepping ligands')
327
+
328
+ if not geometry == "oct":
329
+ emsg.append(
330
+ "[ANN] Geometry is not supported at this time, MUST give -geometry = oct if you want an ANN prediction.")
331
+ valid = False
332
+ ANN_reason = 'geometry not octahedral'
333
+ return valid, ANN_reason, ANN_attributes, catalysis
334
+ if not oxstate:
335
+ emsg.append("\n oxidation state must be given for an ANN prediction.")
336
+ valid = False
337
+ ANN_reason = 'oxstate not given'
338
+ return valid, ANN_reason, ANN_attributes, catalysis
339
+ if valid:
340
+ oxidation_state = oxstate
341
+ valid, oxidation_state = check_metal(this_metal, oxidation_state)
342
+ if debug:
343
+ print(f'valid after running check_metal? {valid}')
344
+ if int(oxidation_state) in [3, 4, 5]:
345
+ catalytic_moieties = ['oxo', 'x', 'hydroxyl', '[O--]', '[OH-]']
346
+ if debug:
347
+ print(('the ligands are', ligs))
348
+ print((set(ligs).intersection(set(catalytic_moieties))))
349
+ if len(set(ligs).intersection(set(catalytic_moieties))) > 0:
350
+ catalysis = True
351
+ # generate key in descriptor space
352
+ ox = int(oxidation_state)
353
+ if debug:
354
+ print(('metal is ' + str(this_metal)))
355
+ print(('metal validity', valid))
356
+ if not valid and not catalysis:
357
+ emsg.append("\n The only metals that are supported are Fe, Mn, Cr, Co, and Ni")
358
+ emsg.append("\n Oxidation state not available for this metal")
359
+ ANN_reason = 'metal / oxidation state combination not available'
360
+ return valid, ANN_reason, ANN_attributes, catalysis
361
+ if valid:
362
+ try:
363
+ spin_classify(this_metal, spin, ox)
364
+ except KeyError:
365
+ valid = False
366
+
367
+ if emsg:
368
+ print((str(" ".join(["ANN messages:"] + [str(i) for i in emsg]))))
369
+
370
+ if not valid and not catalysis:
371
+ emsg.append("\n this spin state not available for this metal")
372
+ ANN_reason = 'spin state not available for metal'
373
+ return valid, ANN_reason, ANN_attributes, catalysis
374
+ # Else, i.e. valid or catalysis
375
+ (valid, axial_ligs, equatorial_ligs, ax_dent, eq_dent, ax_tcat, eq_tcat, axial_ind_list,
376
+ equatorial_ind_list, ax_occs, eq_occs, pentadentate) = tf_check_ligands(
377
+ ligs, batslist, dents, tcats, occs, debug)
378
+
379
+ if debug:
380
+ print(("ligand validity is " + str(valid)))
381
+ print(('Occs', occs))
382
+ print(('Ligands', ligs))
383
+ print(('Dents', dents))
384
+ print(('Bats (backbone atoms)', batslist))
385
+ print(('lig validity', valid))
386
+ print(('ax ligs', axial_ligs))
387
+ print(('eq ligs', equatorial_ligs))
388
+ print(('spin is', spin))
389
+
390
+ if catalysis:
391
+ valid = False
392
+ if debug:
393
+ print('tf_nn detects catalytic')
394
+ ANN_reason = 'catalytic structure presented'
395
+
396
+ net_lig_charge = 0
397
+ if not valid and not catalysis:
398
+ ANN_reason = 'found incorrect ligand symmetry'
399
+ # or, an invalid metal, oxidation state, spin state combination was used
400
+ return valid, ANN_reason, ANN_attributes, catalysis
401
+ # Else, i.e. valid or catalysis
402
+ ax_ligands_list = list()
403
+ eq_ligands_list = list()
404
+ if debug:
405
+ print('loading axial ligands')
406
+ for ii, axl in enumerate(axial_ligs):
407
+ ax_lig3D, r_emsg = lig_load(axl, licores) # load ligand
408
+ net_lig_charge += ax_lig3D.charge
409
+ if r_emsg:
410
+ emsg += r_emsg
411
+ if ax_tcat:
412
+ ax_lig3D.cat = ax_tcat
413
+ if debug:
414
+ print(('custom ax connect atom given (0-ind) ' + str(ax_tcat)))
415
+ if pentadentate and len(ax_lig3D.cat) > 1:
416
+ ax_lig3D.cat = [ax_lig3D.cat[-1]]
417
+ this_lig = ligand(mol3D(), [], ax_dent)
418
+ this_lig.mol = ax_lig3D
419
+
420
+ # check decoration index
421
+ if newdecs:
422
+ if newdecs[axial_ind_list[ii]]:
423
+ print(('decorating ' + str(axl) + ' with ' + str(newdecs[axial_ind_list[ii]]) + ' at sites ' + str(
424
+ newdec_inds[axial_ind_list[ii]])))
425
+ ax_lig3D = decorate_ligand(
426
+ axl, newdecs[axial_ind_list[ii]], newdec_inds[axial_ind_list[ii]], debug)
427
+ ax_lig3D.convert2mol3D() # mol3D representation of ligand
428
+ for jj in range(0, ax_occs[ii]):
429
+ ax_ligands_list.append(this_lig)
430
+ if debug:
431
+ print(f'Obtained the net ligand charge, which is... {net_lig_charge}')
432
+ print('ax_ligands_list:')
433
+ print(ax_ligands_list)
434
+ print([h.mol.cat for h in ax_ligands_list])
435
+
436
+ if debug:
437
+ print(('loading equatorial ligands ' + str(equatorial_ligs)))
438
+ for ii, eql in enumerate(equatorial_ligs):
439
+ eq_lig3D, r_emsg = lig_load(eql, licores) # load ligand
440
+ net_lig_charge += eq_lig3D.charge
441
+ if r_emsg:
442
+ emsg += r_emsg
443
+ if eq_tcat:
444
+ eq_lig3D.cat = eq_tcat
445
+ if debug:
446
+ print(('custom eq connect atom given (0-ind) ' + str(eq_tcat)))
447
+ if pentadentate and len(eq_lig3D.cat) > 1:
448
+ eq_lig3D.cat = eq_lig3D.cat[0:4]
449
+
450
+ if newdecs:
451
+ if debug:
452
+ print(('newdecs' + str(newdecs)))
453
+ print(('equatorial_ind_list is ' + str(equatorial_ind_list)))
454
+ c = 0
455
+ if newdecs[equatorial_ind_list[ii]]:
456
+ if debug:
457
+ print(('decorating ' + str(eql) + ' with ' + str(
458
+ newdecs[equatorial_ind_list[ii]]) + ' at sites ' + str(newdec_inds[equatorial_ind_list[ii]])))
459
+ eq_lig3D = decorate_ligand(eql, newdecs[equatorial_ind_list[ii]],
460
+ newdec_inds[equatorial_ind_list[ii]], debug)
461
+ c += 1
462
+
463
+ eq_lig3D.convert2mol3D() # mol3D representation of ligand
464
+ this_lig = ligand(mol3D(), [], eq_dent)
465
+ this_lig.mol = eq_lig3D
466
+
467
+ for jj in range(0, eq_occs[ii]):
468
+ eq_ligands_list.append(this_lig)
469
+ if debug:
470
+ print('eq_ligands_list:')
471
+ print(eq_ligands_list)
472
+ print(
473
+ ('writing copies of ligands as used in ANN to currrent dir : ' + os.getcwd()))
474
+ for kk, l in enumerate(ax_ligands_list):
475
+ l.mol.writexyz('axlig-' + str(kk) + '.xyz')
476
+ for kk, l in enumerate(eq_ligands_list):
477
+ l.mol.writexyz('eqlig-' + str(kk) + '.xyz')
478
+ # make description of complex
479
+ custom_ligand_dict = {"eq_ligand_list": eq_ligands_list,
480
+ "ax_ligand_list": ax_ligands_list,
481
+ "eq_con_int_list": [h.mol.cat for h in eq_ligands_list],
482
+ "ax_con_int_list": [h.mol.cat for h in ax_ligands_list]}
483
+
484
+ # placeholder for metal
485
+ metal_mol = mol3D()
486
+ metal_mol.addAtom(atom3D(metal))
487
+ this_complex = assemble_connectivity_from_parts(
488
+ metal_mol, custom_ligand_dict)
489
+
490
+ if debug:
491
+ print('custom_ligand_dict is : ')
492
+ print(custom_ligand_dict)
493
+
494
+ if debug:
495
+ print(('finished checking ligands, valid is ' + str(valid)))
496
+ print('assembling RAC custom ligand configuration dictionary')
497
+
498
+ if valid:
499
+ ANN_attributes = evaluate_tmc_anns(this_complex, this_metal, ox, spin,
500
+ custom_ligand_dict, net_lig_charge,
501
+ exchange, ligs, equatorial_ind_list,
502
+ eq_occs, axial_ind_list, ax_occs,
503
+ debug=debug)
504
+ total_ANN_time = time.perf_counter() - start_time
505
+ print(f'Total ML functions took {total_ANN_time:.2f} seconds')
506
+
507
+ if catalysis:
508
+ print('-----In Catalysis Mode-----')
509
+ ANN_attributes = evaluate_catalytic_anns(this_complex, this_metal, ox, spin,
510
+ custom_ligand_dict, net_lig_charge,
511
+ exchange, debug=debug)
512
+ total_ANN_time = time.perf_counter() - start_time
513
+ print(f'Total Catalysis ML functions took {total_ANN_time:.2f} seconds')
514
+
515
+ if not valid and not ANN_reason and not catalysis:
516
+ ANN_reason = ' uncaught rejection (see sdout/stderr)'
517
+
518
+ return valid, ANN_reason, ANN_attributes, catalysis
519
+
520
+
521
+ def evaluate_tmc_anns(this_complex: mol3D, metal: str, ox: int, spin: int,
522
+ custom_ligand_dict: Dict[str, list],
523
+ net_lig_charge: int, exchange: Union[str, float, int],
524
+ ligs, equatorial_ind_list, eq_occs, axial_ind_list, ax_occs,
525
+ debug: bool = False) -> Dict[str, Any]:
526
+ ANN_attributes: Dict[str, Any] = {}
527
+ high_spin, spin_ops = spin_classify(metal, spin, ox)
528
+ # =====Classifiers:=====
529
+ _descriptor_names = ["oxstate", "spinmult", "charge_lig"]
530
+ _descriptors = [ox, spin, net_lig_charge]
531
+ descriptor_names, descriptors = get_descriptor_vector(
532
+ this_complex, custom_ligand_dict, ox_modifier={metal: ox})
533
+ descriptor_names = _descriptor_names + descriptor_names
534
+ descriptors = _descriptors + descriptors
535
+ flag_oct, geo_lse = ANN_supervisor(
536
+ "geo_static_clf", descriptors, descriptor_names, debug=debug)
537
+ # Test for scikit-learn models
538
+ # flag_oct, geo_lse = sklearn_supervisor("geo_static_clf", descriptors, descriptor_names, debug=False)
539
+ sc_pred, sc_lse = ANN_supervisor(
540
+ "sc_static_clf", descriptors, descriptor_names, debug=debug)
541
+ ANN_attributes.update({"geo_label": 0 if flag_oct[0, 0] <= 0.5 else 1,
542
+ "geo_prob": flag_oct[0, 0],
543
+ "geo_LSE": geo_lse[0],
544
+ "geo_label_trust": lse_trust(geo_lse),
545
+ "sc_label": 0 if sc_pred[0, 0] <= 0.5 else 1,
546
+ "sc_prob": sc_pred[0, 0],
547
+ "sc_LSE": sc_lse[0],
548
+ "sc_label_trust": lse_trust(sc_lse)})
549
+
550
+ # build RACs without geo
551
+ with DebugTimer('getting RACs', debug):
552
+ descriptor_names, descriptors = get_descriptor_vector(
553
+ this_complex, custom_ligand_dict, ox_modifier={metal: ox})
554
+
555
+ # get one-hot-encoding (OHE)
556
+ ohe_names, ohe_values = create_OHE(metal.capitalize(), ox)
557
+ descriptor_names += ohe_names
558
+ descriptors += ohe_values
559
+
560
+ # get alpha
561
+ alpha = 0.2 # default for B3LYP
562
+ if exchange:
563
+ try:
564
+ if float(exchange) > 1:
565
+ alpha = float(exchange) / 100 # if given as %
566
+ elif float(exchange) <= 1:
567
+ alpha = float(exchange)
568
+ except ValueError:
569
+ print('cannot cast exchange argument as a float, using 20%')
570
+ descriptor_names += ['alpha']
571
+ descriptors += [alpha]
572
+ descriptor_names += ['ox']
573
+ descriptors += [ox]
574
+ descriptor_names += ['spin']
575
+ descriptors += [spin]
576
+
577
+ # get spin splitting:
578
+ with DebugTimer('split ANN', debug):
579
+ split, latent_split = ANN_supervisor(
580
+ 'split', descriptors, descriptor_names, debug)
581
+
582
+ # get bond lengths:
583
+ with DebugTimer('GEO ANN', debug):
584
+ if ox == 2:
585
+ r_ls, latent_r_ls = ANN_supervisor(
586
+ 'ls_ii', descriptors, descriptor_names, debug)
587
+ r_hs, latent_r_hs = ANN_supervisor(
588
+ 'hs_ii', descriptors, descriptor_names, debug)
589
+ elif ox == 3:
590
+ r_ls, latent_r_ls = ANN_supervisor(
591
+ 'ls_iii', descriptors, descriptor_names, debug)
592
+ r_hs, latent_r_hs = ANN_supervisor(
593
+ 'hs_iii', descriptors, descriptor_names, debug)
594
+ else:
595
+ raise ValueError(f'Oxidation state {ox} not available')
596
+ if high_spin:
597
+ r = r_hs[0]
598
+ else:
599
+ r = r_ls[0]
600
+
601
+ with DebugTimer('homo ANN', debug):
602
+ homo, latent_homo = ANN_supervisor(
603
+ 'homo', descriptors, descriptor_names, debug)
604
+
605
+ with DebugTimer('gap ANN', debug):
606
+ gap, latent_gap = ANN_supervisor(
607
+ 'gap', descriptors, descriptor_names, debug)
608
+
609
+ # get minimum distance to train (for splitting)
610
+ with DebugTimer('min dist', debug):
611
+ split_dist = find_true_min_eu_dist(
612
+ "split", descriptors, descriptor_names)
613
+
614
+ with DebugTimer('min HOMO dist', debug):
615
+ homo_dist = find_true_min_eu_dist(
616
+ "homo", descriptors, descriptor_names)
617
+ homo_dist = find_ANN_latent_dist("homo", latent_homo, debug)
618
+
619
+ with DebugTimer('min GAP dist', debug):
620
+ gap_dist = find_true_min_eu_dist("gap", descriptors, descriptor_names)
621
+ gap_dist = find_ANN_latent_dist("gap", latent_gap, debug)
622
+
623
+ # save attributes for return
624
+ ANN_attributes.update({'split': split[0][0]})
625
+ ANN_attributes.update({'split_dist': split_dist})
626
+ ANN_attributes.update({'This spin': spin})
627
+ if split[0][0] < 0 and (abs(split[0]) > 5):
628
+ ANN_attributes.update({'ANN_ground_state': spin_ops[1]})
629
+ elif split[0][0] > 0 and (abs(split[0]) > 5):
630
+ ANN_attributes.update({'ANN_ground_state': spin_ops[0]})
631
+ else:
632
+ ANN_attributes.update(
633
+ {'ANN_ground_state': 'dgen ' + str(spin_ops)})
634
+
635
+ ANN_attributes.update({'homo': homo[0][0]})
636
+ ANN_attributes.update({'gap': gap[0][0]})
637
+ ANN_attributes.update({'homo_dist': homo_dist})
638
+ ANN_attributes.update({'gap_dist': gap_dist})
639
+
640
+ # now that we have bond predictions, we need to map these
641
+ # back to a length of equal size as the original ligand request
642
+ # in order for molSimplify to understand it
643
+ ANN_bondl = len(ligs) * [0.]
644
+ added = 0
645
+ for ii, eql in enumerate(equatorial_ind_list):
646
+ for jj in range(0, eq_occs[ii]):
647
+ ANN_bondl[added] = r[2]
648
+ added += 1
649
+
650
+ for ii, axl in enumerate(axial_ind_list):
651
+ if debug:
652
+ print((ii, axl, added, ax_occs))
653
+ for jj in range(0, ax_occs[ii]):
654
+ if debug:
655
+ print((jj, axl, added, r[ii]))
656
+ ANN_bondl[added] = r[ii]
657
+ added += 1
658
+
659
+ ANN_attributes.update({'ANN_bondl': 4 * [r[2]] + [r[0], r[1]]})
660
+
661
+ HOMO_ANN_trust = 'not set'
662
+ HOMO_ANN_trust_message = ""
663
+ # Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
664
+ if float(homo_dist) < 3:
665
+ HOMO_ANN_trust_message = 'ANN results should be trustworthy for this complex '
666
+ HOMO_ANN_trust = 'high'
667
+ elif float(homo_dist) < 5:
668
+ HOMO_ANN_trust_message = 'ANN results are probably useful for this complex '
669
+ HOMO_ANN_trust = 'medium'
670
+ elif float(homo_dist) <= 10:
671
+ HOMO_ANN_trust_message = 'ANN results are fairly far from training data, be cautious '
672
+ HOMO_ANN_trust = 'low'
673
+ elif float(homo_dist) > 10:
674
+ HOMO_ANN_trust_message = 'ANN results are too far from training data, be cautious '
675
+ HOMO_ANN_trust = 'very low'
676
+ ANN_attributes.update({'homo_trust': HOMO_ANN_trust})
677
+ ANN_attributes.update({'gap_trust': HOMO_ANN_trust})
678
+
679
+ ANN_trust = 'not set'
680
+ ANN_trust_message = ""
681
+ if float(split_dist / 3) < 0.25:
682
+ ANN_trust_message = 'ANN results should be trustworthy for this complex '
683
+ ANN_trust = 'high'
684
+ elif float(split_dist / 3) < 0.75:
685
+ ANN_trust_message = 'ANN results are probably useful for this complex '
686
+ ANN_trust = 'medium'
687
+ elif float(split_dist / 3) < 1.0:
688
+ ANN_trust_message = 'ANN results are fairly far from training data, be cautious '
689
+ ANN_trust = 'low'
690
+ elif float(split_dist / 3) > 1.0:
691
+ ANN_trust_message = 'ANN results are too far from training data, be cautious '
692
+ ANN_trust = 'very low'
693
+ ANN_attributes.update({'split_trust': ANN_trust})
694
+
695
+ # print text to std out
696
+ print("******************************************************************")
697
+ print("************** ANN is engaged and advising on spin ***************")
698
+ print("************** and metal-ligand bond distances ****************")
699
+ print("******************************************************************")
700
+ if high_spin:
701
+ print(f'You have selected a high-spin state, multiplicity = {spin}')
702
+ else:
703
+ print(f'You have selected a low-spin state, multiplicity = {spin}')
704
+ # report to stdout
705
+ if split[0] < 0 and not high_spin:
706
+ if abs(split[0]) > 5:
707
+ print('warning, ANN predicts a high spin ground state for this complex')
708
+ else:
709
+ print(
710
+ 'warning, ANN predicts a near degenerate ground state for this complex')
711
+ elif split[0] >= 0 and high_spin:
712
+ if abs(split[0]) > 5:
713
+ print('warning, ANN predicts a low spin ground state for this complex')
714
+ else:
715
+ print(
716
+ 'warning, ANN predicts a near degenerate ground state for this complex')
717
+ # print(f'delta is {float(split[0]):.2f} spin is {high_spin}')
718
+ print(f"ANN predicts a spin splitting (HS - LS) of {float(split[0]):.2f} kcal/mol at {100 * alpha:.0f}% HFX")
719
+ print(('ANN low spin bond length (ax1/ax2/eq) is predicted to be: ' + " /".join(
720
+ ["{0:.2f}".format(float(i)) for i in r_ls[0]]) + ' angstrom'))
721
+ print(('ANN high spin bond length (ax1/ax2/eq) is predicted to be: ' + " /".join(
722
+ ["{0:.2f}".format(float(i)) for i in r_hs[0]]) + ' angstrom'))
723
+ print(f'distance to splitting energy training data is {split_dist:.2f}')
724
+ print(ANN_trust_message)
725
+ print(f"ANN predicts a HOMO value of {float(homo[0]):.2f} eV at {100 * alpha:.0f}% HFX")
726
+ print(f"ANN predicts a LUMO-HOMO energetic gap value of {float(gap[0]):.2f} eV at {100 * alpha:.0f}% HFX")
727
+ print(HOMO_ANN_trust_message)
728
+ print(f'distance to HOMO training data is {homo_dist:.2f}')
729
+ print(f'distance to GAP training data is {gap_dist:.2f}')
730
+ print("*******************************************************************")
731
+ print("************** ANN complete, saved in record file *****************")
732
+ print("*******************************************************************")
733
+ from tensorflow.keras import backend as K
734
+ # This is done to get rid of the attribute error that is a bug in tensorflow.
735
+ K.clear_session()
736
+ return ANN_attributes
737
+
738
+
739
+ def evaluate_catalytic_anns(this_complex: mol3D, metal: str, ox: int, spin: int,
740
+ custom_ligand_dict: Dict[str, list],
741
+ net_lig_charge: int, exchange: Union[str, float, int],
742
+ debug: bool = False) -> Dict[str, Any]:
743
+ ANN_attributes: Dict[str, Any] = {}
744
+ # build RACs without geo
745
+ with DebugTimer('getting RACs', debug):
746
+ descriptor_names, descriptors = get_descriptor_vector(
747
+ this_complex, custom_ligand_dict, ox_modifier={metal: ox})
748
+ # get alpha
749
+ alpha = 20.0 # default for B3LYP
750
+ if exchange:
751
+ try:
752
+ if float(exchange) < 1:
753
+ alpha = float(exchange) * 100 # if given as %
754
+ elif float(exchange) >= 1:
755
+ alpha = float(exchange)
756
+ except ValueError:
757
+ print('cannot cast exchange argument to float, using 20%')
758
+ descriptor_names += ['alpha', 'ox', 'spin', 'charge_lig']
759
+ descriptors += [alpha, ox, spin, net_lig_charge]
760
+
761
+ with DebugTimer('split ANN', debug):
762
+ oxo, latent_oxo = ANN_supervisor('oxo', descriptors, descriptor_names, debug)
763
+
764
+ with DebugTimer('min oxo dist', debug):
765
+ oxo_dist, avg_10_NN_dist, avg_traintrain = find_ANN_10_NN_normalized_latent_dist("oxo", latent_oxo, debug)
766
+
767
+ ANN_attributes.update({'oxo': oxo[0][0]})
768
+ ANN_attributes.update({'oxo_dist': oxo_dist})
769
+
770
+ with DebugTimer('HAT ANN', debug):
771
+ hat, latent_hat = ANN_supervisor('hat', descriptors, descriptor_names, debug)
772
+
773
+ with DebugTimer('min hat dist', debug):
774
+ hat_dist, avg_10_NN_dist, avg_traintrain = find_ANN_10_NN_normalized_latent_dist("hat", latent_hat, debug)
775
+
776
+ ANN_attributes.update({'hat': hat[0][0]})
777
+ ANN_attributes.update({'hat_dist': hat_dist})
778
+
779
+ # ######### for Oxo and HOMO optimization ##########
780
+ with DebugTimer('oxo20 ANN', debug):
781
+ oxo20, latent_oxo20 = ANN_supervisor('oxo20', descriptors, descriptor_names, debug)
782
+
783
+ with DebugTimer('min oxo20 dist', debug):
784
+ oxo20_dist, avg_10_NN_dist, avg_traintrain = find_ANN_10_NN_normalized_latent_dist("oxo20", latent_oxo20, debug)
785
+
786
+ ANN_attributes.update({'oxo20': oxo20[0][0]})
787
+ ANN_attributes.update({'oxo20_dist': oxo20_dist})
788
+ # _ = find_ANN_latent_dist("oxo20", latent_oxo20, debug)
789
+ # _ = find_true_min_eu_dist("oxo20", descriptors, descriptor_names, latent_space_vector=latent_oxo20)
790
+
791
+ with DebugTimer('home_empty ANN', debug):
792
+ homo_empty, latent_homo_empty = ANN_supervisor('homo_empty', descriptors, descriptor_names, debug)
793
+
794
+ with DebugTimer('min homo_empty_dist', debug):
795
+ homo_empty_dist, _, _ = find_ANN_10_NN_normalized_latent_dist("homo_empty", latent_homo_empty, debug)
796
+
797
+ ANN_attributes.update({'homo_empty': homo_empty[0][0]})
798
+ ANN_attributes.update({'homo_empty_dist': homo_empty_dist})
799
+ # _ = find_ANN_latent_dist("homo_empty", latent_homo_empty, debug)
800
+ # _ = find_true_min_eu_dist("homo_empty", descriptors, descriptor_names, latent_space_vector=latent_homo_empty)
801
+
802
+ Oxo20_ANN_trust = 'not set'
803
+ Oxo20_ANN_trust_message = ""
804
+ # Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
805
+ if float(oxo20_dist) < 0.75:
806
+ Oxo20_ANN_trust_message = 'Oxo20 ANN results should be trustworthy for this complex '
807
+ Oxo20_ANN_trust = 'high'
808
+ elif float(oxo20_dist) < 1:
809
+ Oxo20_ANN_trust_message = 'Oxo20 ANN results are probably useful for this complex '
810
+ Oxo20_ANN_trust = 'medium'
811
+ elif float(oxo20_dist) <= 1.25:
812
+ Oxo20_ANN_trust_message = 'Oxo20 ANN results are fairly far from training data, be cautious '
813
+ Oxo20_ANN_trust = 'low'
814
+ elif float(oxo20_dist) > 1.25:
815
+ Oxo20_ANN_trust_message = 'Oxo20 ANN results are too far from training data, be cautious '
816
+ Oxo20_ANN_trust = 'very low'
817
+ ANN_attributes.update({'oxo20_trust': Oxo20_ANN_trust})
818
+
819
+ homo_empty_ANN_trust = 'not set'
820
+ homo_empty_ANN_trust_message = ""
821
+ # Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
822
+ if float(homo_empty_dist) < 0.75:
823
+ homo_empty_ANN_trust_message = 'homo_empty ANN results should be trustworthy for this complex '
824
+ homo_empty_ANN_trust = 'high'
825
+ elif float(homo_empty_dist) < 1:
826
+ homo_empty_ANN_trust_message = 'homo_empty ANN results are probably useful for this complex '
827
+ homo_empty_ANN_trust = 'medium'
828
+ elif float(homo_empty_dist) <= 1.25:
829
+ homo_empty_ANN_trust_message = 'homo_empty ANN results are fairly far from training data, be cautious '
830
+ homo_empty_ANN_trust = 'low'
831
+ elif float(homo_empty_dist) > 1.25:
832
+ homo_empty_ANN_trust_message = 'homo_empty ANN results are too far from training data, be cautious '
833
+ homo_empty_ANN_trust = 'very low'
834
+ ANN_attributes.update({'homo_empty_trust': homo_empty_ANN_trust})
835
+
836
+ ####################################################
837
+
838
+ Oxo_ANN_trust = 'not set'
839
+ Oxo_ANN_trust_message = ""
840
+ # Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
841
+ if float(oxo_dist) < 3:
842
+ Oxo_ANN_trust_message = 'Oxo ANN results should be trustworthy for this complex '
843
+ Oxo_ANN_trust = 'high'
844
+ elif float(oxo_dist) < 5:
845
+ Oxo_ANN_trust_message = 'Oxo ANN results are probably useful for this complex '
846
+ Oxo_ANN_trust = 'medium'
847
+ elif float(oxo_dist) <= 10:
848
+ Oxo_ANN_trust_message = 'Oxo ANN results are fairly far from training data, be cautious '
849
+ Oxo_ANN_trust = 'low'
850
+ elif float(oxo_dist) > 10:
851
+ Oxo_ANN_trust_message = 'Oxo ANN results are too far from training data, be cautious '
852
+ Oxo_ANN_trust = 'very low'
853
+ ANN_attributes.update({'oxo_trust': Oxo_ANN_trust})
854
+
855
+ HAT_ANN_trust = 'not set'
856
+ HAT_ANN_trust_message = ""
857
+ # Not quite sure if this should be divided by 3 or not, since RAC-155 descriptors
858
+ if float(hat_dist) < 3:
859
+ HAT_ANN_trust_message = 'HAT ANN results should be trustworthy for this complex '
860
+ HAT_ANN_trust = 'high'
861
+ elif float(hat_dist) < 5:
862
+ HAT_ANN_trust_message = 'HAT ANN results are probably useful for this complex '
863
+ HAT_ANN_trust = 'medium'
864
+ elif float(hat_dist) <= 10:
865
+ HAT_ANN_trust_message = 'HAT ANN results are fairly far from training data, be cautious '
866
+ HAT_ANN_trust = 'low'
867
+ elif float(hat_dist) > 10:
868
+ HAT_ANN_trust_message = 'HAT ANN results are too far from training data, be cautious '
869
+ HAT_ANN_trust = 'very low'
870
+ ANN_attributes.update({'hat_trust': HAT_ANN_trust})
871
+ print("*******************************************************************")
872
+ print("************** CATALYTIC ANN ACTIVATED! ****************")
873
+ print("*********** Currently advising on Oxo and HAT energies ************")
874
+ print("*******************************************************************")
875
+ print(f"ANN predicts a Oxo20 energy of {float(oxo20[0]):.2f} kcal/mol at {alpha:.2f}% HFX")
876
+ print(Oxo20_ANN_trust_message)
877
+ print(f'Distance to Oxo20 training data in the latent space is {oxo20_dist:.2f}')
878
+ print(f"ANN predicts a empty site beta HOMO level of {float(homo_empty[0]):.2f} eV at {alpha:.2f} % HFX")
879
+ print(homo_empty_ANN_trust_message)
880
+ print(f'Distance to empty site beta HOMO level training data in the latent space is {homo_empty_dist:.2f}')
881
+ print('-------------------------------------------------------------------')
882
+ print(f"ANN predicts a oxo formation energy of {float(oxo[0]):.2f} kcal/mol at {alpha:.2f}% HFX")
883
+ print(Oxo_ANN_trust_message)
884
+ print(f'Distance to oxo training data in the latent space is {oxo_dist:.2f}')
885
+ print(f"ANN predicts a HAT energy of {float(hat[0]):.2f} kcal/mol at {alpha:.2f}% HFX")
886
+ print(HAT_ANN_trust_message)
887
+ print(f'Distance to HAT training data in the latent space is {hat_dist:.2f}')
888
+ print("*******************************************************************")
889
+ print("************** ANN complete, saved in record file *****************")
890
+ print("*******************************************************************")
891
+ from tensorflow.keras import backend as K
892
+ # This is done to get rid of the attribute error that is a bug in tensorflow.
893
+ K.clear_session()
894
+ return ANN_attributes