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,1149 @@
1
+ # @file io.py
2
+ # Input/output functions
3
+ #
4
+ # Written by Tim Ioannidis for HJK Group
5
+ #
6
+ # Dpt of Chemical Engineering, MIT
7
+
8
+ import copy
9
+ import random
10
+ import re
11
+ import shutil
12
+ import glob
13
+ import os
14
+ import time
15
+ import difflib
16
+
17
+ try:
18
+ from openbabel import openbabel # version 3 style import
19
+ except ImportError:
20
+ import openbabel # fallback to version 2
21
+ from typing import Any, List, Dict, Tuple, Union, Optional
22
+ from importlib_resources import files as resource_files
23
+
24
+ from molSimplify.Classes.globalvars import (globalvars,
25
+ romans)
26
+ from molSimplify.Classes.mol3D import mol3D
27
+
28
+
29
+ # Print available geometries
30
+
31
+
32
+ def printgeoms():
33
+ globs = globalvars()
34
+ if globs.custom_path:
35
+ f = globs.custom_path + "/Data/coordinations.dict"
36
+ else:
37
+ f = resource_files("molSimplify").joinpath("Data/coordinations.dict")
38
+ with open(f, 'r') as f:
39
+ s = f.read().splitlines()
40
+ s = [_f for _f in s if _f]
41
+ geomnames = []
42
+ geomshorts = []
43
+ coords = []
44
+ for line in s:
45
+ if (line[0] != '#'):
46
+ vals = [_f for _f in re.split(',| |:', line) if _f]
47
+ coords.append(vals[0])
48
+ geomnames.append(vals[1])
49
+ geomshorts.append(vals[2])
50
+ geomgroups = list([] for a in set(coords))
51
+ for i, g in enumerate(coords):
52
+ geomgroups[int(g)-1].append(geomshorts[i])
53
+ for i, g in enumerate(geomnames):
54
+ print(("Coordination: %s, geometry: %s,\t short name: %s " %
55
+ (coords[i], g, geomshorts[i])))
56
+ print('')
57
+
58
+ # Get available geometries
59
+
60
+
61
+ def getgeoms():
62
+ globs = globalvars()
63
+ if globs.custom_path:
64
+ f = globs.custom_path + "/Data/coordinations.dict"
65
+ else:
66
+ f = resource_files("molSimplify").joinpath("Data/coordinations.dict")
67
+ with open(f, 'r') as f:
68
+ s = f.read().splitlines()
69
+ s = [_f for _f in s if _f]
70
+ geomnames = []
71
+ geomshorts = []
72
+ coords = []
73
+ for line in s:
74
+ if (line[0] != '#'):
75
+ vals = [_f for _f in re.split(',| |:', line) if _f]
76
+ coords.append(vals[0]) # get coordination
77
+ geomnames.append(vals[1]) # get name of geometry
78
+ geomshorts.append(vals[2]) # get short names
79
+ geomgroups = list([] for a in set(coords)) # get unique coordinations
80
+ count = 0
81
+ geomgroups[count].append(geomshorts[0])
82
+ for i in range(1, len(coords)):
83
+ if coords[i-1] != coords[i]:
84
+ count += 1
85
+ geomgroups[count].append(geomshorts[i])
86
+ return coords, geomnames, geomshorts, geomgroups
87
+
88
+ # Read data into dictionary
89
+ # @param fname Filename containing dictionary data
90
+ # @return Dictionary
91
+
92
+
93
+ def readdict(fname):
94
+ d = dict()
95
+ with open(fname, 'r') as f:
96
+ lines = [_f for _f in f.readlines() if _f]
97
+ for line in lines:
98
+ if (line[0] != '#') and line.strip():
99
+ key = "".join([_f for _f in line.split(':')[0] if _f])
100
+ val = "".join([_f for _f in line.split(':')[1] if _f])
101
+ vals = [_f.strip() for _f in val.split(',') if _f]
102
+ vv = []
103
+ for i, val in enumerate(vals):
104
+ vvs = [_f for _f in val.split(' ') if _f]
105
+ if len(vvs) > 1 or i > 2:
106
+ vv.append(vvs)
107
+ else:
108
+ vv += vvs
109
+ d[key] = vv
110
+ return d
111
+
112
+ # Read data into dictionary for substrate
113
+ # @param fname Filename containing dictionary data
114
+ # @return Dictionary
115
+
116
+
117
+ def readdict_sub(fname):
118
+ d = dict()
119
+ with open(fname, 'r') as f:
120
+ txt = f.read()
121
+ lines = [_f for _f in txt.splitlines() if _f]
122
+ for line in lines:
123
+ if (line[0] != '#') and line.strip():
124
+ key = "".join([_f for _f in line.split(':')[0] if _f])
125
+ val = "".join([_f for _f in line.split(':')[1] if _f])
126
+ vals = [_f.strip() for _f in val.split(',') if _f]
127
+ vv = []
128
+ for i, val in enumerate(vals):
129
+ vvs = ([_f for _f in val.split(' ') if _f])
130
+ if len(vvs) > 1 or i > 2:
131
+ vv.append(vvs)
132
+ else:
133
+ vv += vvs
134
+ d[key] = vv
135
+ return d
136
+
137
+ # Get ligands in dictionary
138
+ # @return List of ligands in dictionary
139
+
140
+
141
+ def getligs() -> str:
142
+ licores = getlicores()
143
+ return ' '.join(sorted(licores.keys()))
144
+
145
+ # Get ligands cores
146
+ #
147
+ # This form of the function is used extensively in the GUI so it got it's own call.
148
+ # This is basically the same as getligs() but returns the full dictionary
149
+ # @param flip if we want to return flipped versions of bidentates
150
+ # @return Ligands dictionary
151
+
152
+
153
+ def getlicores(flip: bool = True) -> Dict[str, Any]:
154
+ globs = globalvars()
155
+ if globs.custom_path: # test if a custom path is used:
156
+ licores_path = str(globs.custom_path).rstrip('/') + "/Ligands/ligands.dict"
157
+ else:
158
+ licores_path = resource_files("molSimplify").joinpath("Ligands/ligands.dict")
159
+ licores = readdict(licores_path)
160
+ if flip:
161
+ for ligand in list(licores.keys()):
162
+ if len(licores[ligand][2]) == 2 and type(licores[ligand][2]) == list:
163
+ licores[ligand+'_flipped'] = copy.deepcopy(licores[ligand])
164
+ licores[ligand+'_flipped'][2].reverse()
165
+ return licores
166
+
167
+ # Get simple ligands in dictionary
168
+ # @return List of ligands in simple ligands dictionary
169
+
170
+
171
+ def getsimpleligs() -> str:
172
+ slicores = getslicores()
173
+ return ' '.join(sorted(slicores.keys()))
174
+
175
+ # Get simple ligands cores
176
+ #
177
+ # This form of the function is used extensively in the GUI so it got it's own call.
178
+ # This is basically the same as getsimpleligs() but returns the full dictionary
179
+ # @return Simple ligands dictionary
180
+
181
+
182
+ def getslicores() -> Dict[str, Any]:
183
+ globs = globalvars()
184
+ if globs.custom_path: # test if a custom path is used:
185
+ slicores_path = str(globs.custom_path).rstrip(
186
+ '/') + "/Ligands/simple_ligands.dict"
187
+ else:
188
+ slicores_path = resource_files("molSimplify").joinpath("Ligands/simple_ligands.dict")
189
+ slicores = readdict(slicores_path)
190
+ return slicores
191
+
192
+ # Get ligand groups
193
+ # @param licores Ligand dictionary
194
+ # @return Ligand groups
195
+
196
+
197
+ def getligroups(licores: dict) -> str:
198
+ groups = []
199
+ for entry in licores:
200
+ groups += licores[entry][3]
201
+ groups = sorted(list(set(groups)))
202
+ a = ' '.join(groups)
203
+ return a
204
+
205
+ # Enclose metal elements in SMILES string with square brackets
206
+ # @param smi SMILES string
207
+ # @return Processed SMILES string
208
+
209
+
210
+ def checkTMsmiles(smi: str) -> str:
211
+ g = globalvars()
212
+ for m in g.metalslist():
213
+ if m in smi:
214
+ smi = smi.replace(m, '['+m+']')
215
+ return smi
216
+
217
+ # Get binding species in dictionary
218
+ # @return List of binding species in dictionary
219
+
220
+
221
+ def getbinds() -> str:
222
+ bindcores = getbcores()
223
+ return ' '.join(sorted(bindcores.keys()))
224
+
225
+ # Get binding species cores
226
+ #
227
+ # This form of the function is used extensively in the GUI so it got it's own call.
228
+ # This is basically the same as getbinds() but returns the full dictionary
229
+ # @return Binding species dictionary
230
+
231
+
232
+ def getbcores() -> dict:
233
+ globs = globalvars()
234
+ if globs.custom_path: # test if a custom path is used:
235
+ bcores_path = str(globs.custom_path).rstrip('/') + "/Bind/bind.dict"
236
+ else:
237
+ bcores_path = resource_files("molSimplify").joinpath("Bind/bind.dict")
238
+ bcores = readdict(bcores_path)
239
+ return bcores
240
+
241
+ # Get cores in dictionary
242
+ # @return List of cores in dictionary
243
+
244
+
245
+ def getcores():
246
+ mcores = getmcores()
247
+ a = []
248
+ for key in mcores:
249
+ a.append(key)
250
+ a = sorted(a)
251
+ a = ' '.join(a)
252
+ return a
253
+
254
+ # Get core cores
255
+ #
256
+ # This form of the function is used extensively in the GUI so it got it's own call.
257
+ # This is basically the same as getcores() but returns the full dictionary
258
+ # @return Cores dictionary
259
+
260
+
261
+ def getmcores():
262
+ globs = globalvars()
263
+ if globs.custom_path: # test if a custom path is used:
264
+ mcores = str(globs.custom_path).rstrip('/') + "/Cores/cores.dict"
265
+ else:
266
+ mcores = resource_files("molSimplify").joinpath("Cores/cores.dict")
267
+ mcores = readdict(mcores)
268
+ return mcores
269
+
270
+ # Get substrates in dictionary
271
+ # @return List of substrates in dictionary
272
+
273
+
274
+ def getsubstrates():
275
+ subcores = getsubcores()
276
+ a = []
277
+ for key in subcores:
278
+ a.append(key)
279
+ a = sorted(a)
280
+ a = ' '.join(a)
281
+ return a
282
+
283
+ # Get substrate cores
284
+ #
285
+ # This form of the function is used extensively in the GUI so it got it's own call.
286
+ # This is basically the same as getsubstrates() but returns the full dictionary
287
+ # @return Substrates dictionary
288
+
289
+
290
+ def getsubcores():
291
+ globs = globalvars()
292
+ if globs.custom_path: # test if a custom path is used:
293
+ subcores = str(globs.custom_path).rstrip(
294
+ '/') + "/Substrates/substrates.dict"
295
+ else:
296
+ subcores = resource_files("molSimplify").joinpath("Substrates/substrates.dict")
297
+ subcores = readdict_sub(subcores)
298
+ return subcores
299
+
300
+ # Load M-L bond length dictionary from data
301
+ # @param path to data file
302
+ # @return M-L bond length dictionary
303
+
304
+
305
+ def loaddata(path: str) -> dict:
306
+ globs = globalvars()
307
+ # loads ML data from ML.dat file and
308
+ # store to dictionary
309
+ if globs.custom_path: # test if a custom path is used:
310
+ fname = str(globs.custom_path).rstrip('/') + path
311
+ else:
312
+ fname = resource_files("molSimplify").joinpath(path.strip('/'))
313
+ d = dict()
314
+
315
+ with open(fname) as f:
316
+ txt = f.read()
317
+ lines = [_f for _f in txt.splitlines() if _f]
318
+ for line in lines[1:]:
319
+ if '#' != line[0]: # skip comments
320
+ s = [_f for _f in line.split(None) if _f]
321
+ d[(s[0], s[1], s[2], s[3], s[4])] = s[5] # read dictionary
322
+ return d
323
+
324
+ # Load M-L bond length dictionary from data
325
+ # @param path to data file
326
+ # @return M-L bond length dictionary
327
+
328
+
329
+ def loaddata_ts(path: str) -> dict:
330
+ globs = globalvars()
331
+ # loads ML data from ML.dat file and
332
+ # store to dictionary
333
+ if globs.custom_path: # test if a custom path is used:
334
+ fname = str(globs.custom_path).rstrip('/') + path
335
+ else:
336
+ fname = resource_files("molSimplify").joinpath(path.strip('/'))
337
+ d = dict()
338
+
339
+ with open(fname) as f:
340
+ txt = f.read()
341
+ lines = [_f for _f in txt.splitlines() if _f]
342
+ for line in lines[1:]:
343
+ if '#' != line[0]: # skip comments
344
+ s = [_f for _f in line.split(None) if _f]
345
+ d[(s[0], s[1], s[2], s[3])] = s[4:] # read dictionary
346
+ return d
347
+
348
+ # Load a chemdraw cdxml file and write out xyz
349
+ # @param cdxml a cdxml file
350
+ # return fname the xyz fname for the read-in cdxml
351
+
352
+
353
+ def loadcdxml(cdxml: str) -> Tuple[str, str]:
354
+ # try importing pybel
355
+ try:
356
+ import pybel
357
+ except ImportError: # What is the purpose of excepting and then raising?
358
+ raise
359
+ fname = re.sub(r'.cdxml', '', cdxml) # file name for the new xyz
360
+ # check cdxml file for Dashed bonds
361
+ with open(cdxml, 'r') as f:
362
+ lines = f.read().splitlines()
363
+ signal = False
364
+ for i, line in enumerate(lines):
365
+ if 'Dash' in line:
366
+ lnum = i
367
+ signal = True
368
+ break
369
+ # remove the dash bond
370
+ if signal:
371
+ cdxml = cdxml.replace('.cdxml', '.temp.cdxml')
372
+ with open(cdxml, 'a') as f:
373
+ if signal:
374
+ for i, line in enumerate(lines):
375
+ if i not in list(range(lnum-5, lnum+2)):
376
+ f.write(line + '\n')
377
+ else:
378
+ for i, line in enumerate(lines):
379
+ f.write(line + '\n')
380
+ # load cdxml into obmol
381
+ obconv = openbabel.OBConversion() # ob Class
382
+ obmol = openbabel.OBMol() # ob Class
383
+ obconv.SetInFormat('cdxml') # ob Method to set cdxml
384
+ obconv.ReadFile(obmol, cdxml) # ob Method to reaad cdxml into a OBMol()
385
+ if signal:
386
+ os.remove(cdxml)
387
+ # substitute Si for metals
388
+ obmol.NumAtoms()
389
+ idx_list = []
390
+ atno_list = []
391
+ for idx in range(obmol.NumAtoms()):
392
+ if obmol.GetAtom(idx+1).IsMetal():
393
+ idx_list.append(idx)
394
+ atno_list.append(obmol.GetAtom(idx+1).GetAtomicNum())
395
+ obmol.GetAtom(idx+1).SetAtomicNum(14)
396
+ # convert 2D to 3D
397
+ pymol = pybel.Molecule(obmol)
398
+ pymol.make3D()
399
+ pymol.localopt()
400
+ # recover metal symbols
401
+ for i in range(len(idx_list)):
402
+ idx = idx_list[i]
403
+ atno = atno_list[i]
404
+ obmol.GetAtom(idx+1).SetAtomicNum(atno)
405
+ # determine the number of fragments in obmol
406
+ mol = mol3D()
407
+ mol.OBMol = obmol
408
+ mol.convert2mol3D()
409
+ fraglist = mol.getfragmentlists()
410
+ # write xyzfs
411
+ msg = ''
412
+ if len(fraglist) > 1:
413
+ for atidxes in fraglist:
414
+ frag = mol3D()
415
+ for atidx in atidxes:
416
+ atom = mol.getAtom(atidx)
417
+ frag.addAtom(atom)
418
+ if len(frag.findMetal()) > 0:
419
+ frag.writexyz(fname + '_cat.xyz')
420
+ else:
421
+ frag.writexyz(fname + '_sub.xyz')
422
+ msg = 'two fragments were saved individually as xyzf'
423
+ else:
424
+ mol.writexyz(fname + '.xyz')
425
+ msg = 'one molecule was saved as xyzf'
426
+
427
+ return fname, msg
428
+
429
+ # Load backbone coordinates
430
+ # @param coord Name of coordination geometry
431
+ # @return List of backbone coordinates
432
+
433
+
434
+ def loadcoord(coord: str) -> List[List[float]]:
435
+ globs = globalvars()
436
+ if globs.custom_path:
437
+ f = globs.custom_path + "/Data/" + coord + ".dat"
438
+ else:
439
+ f = resource_files("molSimplify").joinpath(f"Data/{coord}.dat")
440
+ with open(f) as f:
441
+ txt = [_f for _f in f.read().splitlines() if _f]
442
+ b = []
443
+ for line in txt:
444
+ s = [_f for _f in line.split(None) if _f]
445
+ b.append([float(s[0]), float(s[1]), float(s[2])])
446
+ return b
447
+
448
+ # Load core and convert to mol3D
449
+ # @param usercore Name of core
450
+ # @param mcores Cores dictionary (reloads if not specified - default, useful when using an externally modified dictionary)
451
+ # @return mol3D of core, error messages
452
+
453
+
454
+ def core_load(usercore: str, mcores: Optional[dict] = None) -> Tuple[Union[mol3D, None], str]:
455
+ if mcores is None:
456
+ mcores = getmcores()
457
+ globs = globalvars()
458
+ if '~' in usercore:
459
+ homedir = os.path.expanduser("~")
460
+ usercore = usercore.replace('~', homedir)
461
+ emsg = ''
462
+ core = mol3D() # initialize core molecule
463
+ # check if core exists in dictionary
464
+ if usercore.lower() in list(mcores.keys()):
465
+ # print('loading core from dictionary')
466
+ dbentry = mcores[usercore.lower()]
467
+ # load core mol file (with hydrogens
468
+ if globs.custom_path:
469
+ fcore = globs.custom_path + "/Cores/" + dbentry[0]
470
+ else:
471
+ fcore = str(resource_files("molSimplify").joinpath(f"Cores/{dbentry[0]}"))
472
+ # check if core xyz/mol file exists
473
+ if not glob.glob(fcore):
474
+ emsg = "We can't find the core structure file %s right now! Something is amiss. Exiting..\n" % fcore
475
+ print(emsg)
476
+ return None, emsg
477
+ if ('.xyz' in fcore):
478
+ core.OBMol = core.getOBMol(fcore, 'xyzf')
479
+ elif ('.mol' in fcore):
480
+ core.OBMol = core.getOBMol(fcore, 'molf')
481
+ elif ('.smi' in fcore):
482
+ core.OBMol = core.getOBMol(fcore, 'smif')
483
+ core.cat = [int(i) for i in [_f for _f in dbentry[1] if _f]]
484
+ core.denticity = dbentry[2]
485
+ core.ident = usercore
486
+ # load from file
487
+ elif ('.mol' in usercore or '.xyz' in usercore or '.smi' in usercore):
488
+ if glob.glob(usercore):
489
+ ftype = usercore.split('.')[-1]
490
+ print(('Core is a '+ftype+' file'))
491
+ # try and catch error if conversion doesn't work
492
+ try:
493
+ core.OBMol = core.getOBMol(
494
+ usercore, ftype+'f') # convert from file
495
+ print('Core successfully converted to OBMol')
496
+ except IOError:
497
+ emsg = 'Failed converting file ' + usercore+' to molecule..Check your file.\n'
498
+ print(emsg)
499
+ return None, emsg
500
+ core.ident = usercore.split('.')[0]
501
+ core.ident = core.ident.rsplit('/')[-1]
502
+ else:
503
+ emsg = 'Core file '+usercore+' does not exist. Exiting..\n'
504
+ print(emsg)
505
+ return None, emsg
506
+ # if not, try converting from SMILES
507
+ else:
508
+ # check for transition metals
509
+ usercore = checkTMsmiles(usercore)
510
+ # try and catch error if conversion doesn't work
511
+ try:
512
+ core.OBMol = core.getOBMol(
513
+ usercore, 'smistring', True) # convert from smiles
514
+ print('Core successfully interpreted as smiles')
515
+ except IOError:
516
+ emsg = "We tried converting the string '%s' to a molecule but it wasn't a valid SMILES string.\n" % usercore
517
+ emsg += "Furthermore, we couldn't find the core structure: '%s' in the cores dictionary. Try again!\n" % usercore
518
+ emsg += "\nAvailable cores are: %s\n" % getcores()
519
+ print(emsg)
520
+ return None, emsg
521
+ core.cat = [0]
522
+ core.denticity = 1
523
+ core.ident = 'core'
524
+ return core, emsg
525
+
526
+ # Load substrate and convert to mol3D
527
+ # @param usersubstrate Name of substrate
528
+ # @param subcores Substrates dictionary
529
+ # (reloads if not specified - default, useful when using an externally modified dictionary)
530
+ # @return mol3D of substrate, subscatom, error messages
531
+ # attributes of substrate: OBMol, denticity, ident (identity), charge,
532
+ # cat (connection atom index), and grps (substrate group)
533
+
534
+
535
+ def substr_load(usersubstrate: str,
536
+ sub_i: int,
537
+ subcatoms: List[int],
538
+ subcores: Optional[dict] = None) -> Tuple[Union[mol3D, None], List[int], str]:
539
+ # if not using a user-defined substrate dictionary
540
+ if subcores is None:
541
+ subcores = getsubcores()
542
+ # load global variables
543
+ globs = globalvars()
544
+ if '~' in usersubstrate:
545
+ homedir = os.path.expanduser("~")
546
+ usersubstrate = usersubstrate.replace('~', homedir)
547
+ emsg = ''
548
+ sub = mol3D() # initialize core molecule
549
+ # default attributes of the sub3D
550
+ sub.denticity = 1
551
+ sub.ident = None
552
+ sub.charge = 0
553
+ sub.cat = [0]
554
+ sub.grps = ['inter']
555
+ # check if substrate exists in dictionary
556
+ if usersubstrate.lower() in [i.subname for i in list(subcores.keys())]:
557
+ print('loading substrate from dictionary')
558
+ # create a list for each item column in the dictionary
559
+ var_list = []
560
+ for var in [subcores[i][0:] for i in list(subcores.keys()) if i.subname == usersubstrate.lower()]:
561
+ var_list.append(var)
562
+ var_list = sorted(var_list)
563
+ var_list_sub_i = var_list[sub_i]
564
+ if globs.custom_path:
565
+ fsubst = globs.custom_path + "/Substrates/" + var_list_sub_i[0]
566
+ else:
567
+ fsubst = str(resource_files("molSimplify").joinpath(f"Substrates/{var_list_sub_i[0]}"))
568
+ # check if substrate xyz/mol file exists
569
+ if not glob.glob(fsubst):
570
+ emsg = "We can't find the substrate structure file %s right now! Something is amiss. Exiting..\n" % fsubst
571
+ print(emsg)
572
+ return None, subcatoms, emsg
573
+ if ('.xyz' in fsubst):
574
+ sub.OBMol = sub.getOBMol(fsubst, 'xyzf')
575
+ elif ('.mol' in fsubst):
576
+ sub.OBMol = sub.getOBMol(fsubst, 'molf')
577
+ elif ('.smi' in fsubst):
578
+ sub.OBMol = sub.getOBMol(fsubst, 'smif')
579
+ # Parsing substrate denticity
580
+ # modified the check for length,
581
+ # as it parsing string length instead of
582
+ # list length!
583
+ if isinstance(var_list_sub_i[2], str):
584
+ sub.denticity = 1
585
+ else:
586
+ sub.denticity = len(var_list_sub_i[2])
587
+ # Parsing substrate identity
588
+ sub.ident = var_list_sub_i[1]
589
+ # Parsing substrate charge
590
+ sub.charge = sub.OBMol.GetTotalCharge()
591
+ # Parsing substrate connection atoms
592
+ if 'pi' in var_list_sub_i[2]:
593
+ sub.denticity = 1
594
+ sub.cat = [int(li) for li in var_list_sub_i[2][:-1]]
595
+ sub.cat.append('pi')
596
+ else:
597
+ sub.cat = [int(li) for li in var_list_sub_i[2]]
598
+ if not subcatoms:
599
+ subcatoms = sub.cat
600
+ # Parsing substrate group
601
+ sub.grps = [li for li in var_list_sub_i[3]]
602
+ if len(var_list_sub_i[4]) > 0:
603
+ sub.ffopt = var_list_sub_i[4]
604
+ # load from file
605
+ elif ('.mol' in usersubstrate or '.xyz' in usersubstrate or '.smi' in usersubstrate):
606
+ if glob.glob(usersubstrate):
607
+ ftype = usersubstrate.split('.')[-1]
608
+ print(('Substrate is a '+ftype+' file'))
609
+ # try and catch error if conversion doesn't work
610
+ try:
611
+ sub.OBMol = sub.getOBMol(
612
+ usersubstrate, ftype+'f') # convert from file
613
+ print('Substrate successfully converted to OBMol')
614
+
615
+ except IOError:
616
+ emsg = 'Failed converting file ' + usersubstrate + \
617
+ ' to molecule..Check your file.\n'
618
+ print(emsg)
619
+ return None, subcatoms, emsg
620
+ sub.ident = usersubstrate.split('/')[-1].split('.')[0]
621
+ else:
622
+ emsg = 'Substrate file '+usersubstrate+' does not exist. Exiting..\n'
623
+ print(emsg)
624
+ return None, subcatoms, emsg
625
+ # if not, try converting from SMILES
626
+ else:
627
+ # check for transition metals
628
+ usersubstrate = checkTMsmiles(usersubstrate)
629
+ # try and catch error if conversion doesn't work
630
+ try:
631
+ sub.OBMol = sub.getOBMol(
632
+ usersubstrate, 'smistring', True) # convert from smiles
633
+ print('Substrate successfully interpreted as smiles')
634
+ except IOError:
635
+ emsg = f"We tried converting the string '{usersubstrate}' to a molecule but it wasn't a valid SMILES string.\n"
636
+ emsg += f"Furthermore, we couldn't find the substrate structure: '{usersubstrate}' in the substrates dictionary. "
637
+ emsg += f"Try again!\n\nAvailable substrates are: {getsubstrates()}\n"
638
+ print(emsg)
639
+ return None, subcatoms, emsg
640
+ sub.cat = [0]
641
+ sub.denticity = 1
642
+ sub.ident = 'substrate'
643
+ return sub, subcatoms, emsg
644
+
645
+
646
+ # TODO: Output currently typed as any instead of Union[mol3D, None] because many other
647
+ # scripts depend on a mol3D as first return value.
648
+ def lig_load(userligand: str, licores: Optional[dict] = None) -> Tuple[Any, str]:
649
+
650
+ if licores is None:
651
+ licores = getlicores()
652
+ # @licores.pop("x", None)
653
+ globs = globalvars()
654
+ # ## get groups ###
655
+ groups = []
656
+ for entry in licores:
657
+ groups += licores[entry][3]
658
+ groups = sorted(list(set(groups)))
659
+ # check if user requested group
660
+ if userligand.lower() in groups:
661
+ subligs = [key for key in licores if userligand.lower()
662
+ in licores[key][3]]
663
+ # randomly select ligand
664
+ userligand = random.choice(subligs)
665
+ if '~' in userligand:
666
+ homedir = os.path.expanduser("~")
667
+ userligand = userligand.replace('~', homedir)
668
+ emsg = ''
669
+ lig = mol3D() # initialize ligand molecule
670
+ lig.needsconformer = False
671
+ # get similarity of userligand to ligands in dictionary, from the sequence point of view
672
+ text_similarities = [difflib.SequenceMatcher(None, userligand, i).ratio() for i in list(licores.keys())]
673
+ # check if ligand exists in dictionary
674
+ if userligand in list(licores.keys()) or max(text_similarities) > 0.6: # Two cases here
675
+ if userligand in list(licores.keys()): # Ligand is in the dictionary ligands.dict
676
+ print(('loading ligand from dictionary: ' + str(userligand)))
677
+ dbentry = licores[userligand]
678
+ else:
679
+ # max(text_similarities) > 0.6 --> It is likely the user made a typo in inputting a ligand that is in ligands.dict
680
+ max_similarity = max(text_similarities)
681
+ index_max = text_similarities.index(max_similarity)
682
+ desired_ligand = list(licores.keys())[index_max]
683
+ print(f'ligand was not in dictionary, but the sequence is very similar to a ligand that is: {str(desired_ligand)}')
684
+ print(('loading ligand from dictionary: ' + str(desired_ligand)))
685
+ dbentry = licores[desired_ligand] # Loading the typo-d ligand
686
+ # load lig mol file (with hydrogens)
687
+ if globs.custom_path:
688
+ flig = globs.custom_path + "/Ligands/" + dbentry[0]
689
+ else:
690
+ flig = str(resource_files("molSimplify").joinpath(f"Ligands/{dbentry[0]}"))
691
+ # check if ligand xyz/mol file exists
692
+ print(('looking for '+flig))
693
+ if not os.path.isfile(flig):
694
+ emsg = "We can't find the ligand structure file %s right now! Something is amiss. Exiting..\n" % flig
695
+ print(emsg)
696
+ return False, emsg
697
+ if ('.xyz' in flig):
698
+ lig.OBMol = lig.getOBMol(flig, 'xyzf')
699
+ # Set charge to last entry in ligands.dict
700
+ lig.OBMol.SetTotalCharge(int(dbentry[-1][0]))
701
+ elif ('.mol2' in flig):
702
+ lig.OBMol = lig.getOBMol(flig, 'mol2f')
703
+ elif ('.mol' in flig):
704
+ lig.OBMol = lig.getOBMol(flig, 'molf')
705
+ elif ('.smi' in flig):
706
+ print('SMILES conversion')
707
+ lig.OBMol = lig.getOBMol(flig, 'smif')
708
+ lig.needsconformer = True
709
+
710
+ # modified the check for length,
711
+ # as it parsing string length instead of
712
+ # list length!
713
+ if isinstance(dbentry[2], str):
714
+ lig.denticity = 1
715
+ else:
716
+ lig.denticity = len(dbentry[2])
717
+ lig.ident = dbentry[1]
718
+ lig.convert2mol3D()
719
+ lig.charge = lig.OBMol.GetTotalCharge()
720
+ if 'pi' in dbentry[2]:
721
+ lig.cat = [int(li) for li in dbentry[2][:-1]]
722
+ lig.cat.append('pi')
723
+ else:
724
+ if lig.denticity == 1:
725
+ lig.cat = [int(dbentry[2])]
726
+ else:
727
+ lig.cat = [int(li) for li in dbentry[2]]
728
+ if lig.denticity > 1:
729
+ lig.grps = dbentry[3]
730
+ else:
731
+ lig.grps = []
732
+ if len(dbentry) > 3:
733
+ lig.ffopt = dbentry[4][0]
734
+ # load from file
735
+ elif ('.mol' in userligand or '.xyz' in userligand or '.smi' in userligand or '.sdf' in userligand):
736
+ if glob.glob(userligand):
737
+ ftype = userligand.split('.')[-1]
738
+ # try and catch error if conversion doesn't work
739
+ try:
740
+ print(('ligand is an '+ftype+' file'))
741
+ lig.OBMol = lig.getOBMol(
742
+ userligand, ftype+'f') # convert from file
743
+ # generate coordinates if not existing
744
+ lig.charge = lig.OBMol.GetTotalCharge()
745
+ print('Ligand successfully converted to OBMol')
746
+ except IOError:
747
+ emsg = 'Failed converting file ' + userligand+' to molecule..Check your file.\n'
748
+ return False, emsg
749
+ lig.ident = userligand.rsplit('/')[-1]
750
+ lig.ident = lig.ident.split('.'+ftype)[0]
751
+ else:
752
+ emsg = 'Ligand file '+userligand+' does not exist. Exiting..\n'
753
+ print(emsg)
754
+ return False, emsg
755
+ # if not, try interpreting as SMILES string
756
+ else:
757
+ print(f'Interpreting ligand {userligand} as a SMILES string, as it was not in the ligands dictionary.')
758
+ print('Available ligands in the ligands dictionary can be found at molSimplify/molSimplify/Ligands/ligands.dict\n'
759
+ 'Or by running the command `molsimplify -h liganddict`')
760
+ try:
761
+ lig.getOBMol(userligand, 'smistring', True) # convert from smiles
762
+ lig.convert2mol3D()
763
+ assert lig.natoms
764
+ lig.charge = lig.OBMol.GetTotalCharge()
765
+ print('Ligand successfully interpreted as SMILES')
766
+ except IOError:
767
+ emsg = f"We tried converting the string '{userligand}' to a molecule but it wasn't a valid SMILES string.\n"
768
+ emsg += f"Furthermore, we couldn't find the ligand structure: '{userligand}' in the ligands dictionary. "
769
+ emsg += f"Try again!\n\nAvailable ligands are: {getligs()}\n"
770
+ emsg += f"\nAnd available groups are: {getligroups(licores)}\n"
771
+ print(emsg)
772
+ return False, emsg
773
+ lig.ident = 'smi'
774
+ lig.needsconformer = True
775
+ lig.name = userligand
776
+ return lig, emsg
777
+
778
+ # Load binding species and convert to mol3D
779
+ # @param userbind Name of binding species
780
+ # @param bindcores Binding species dictionary
781
+ # (reloads if not specified - default, useful when using an externally modified dictionary)
782
+ # @return mol3D of binding species, error messages
783
+
784
+
785
+ def bind_load(userbind: str, bindcores: dict) -> Tuple[Union[mol3D, None], bool, str]:
786
+ globs = globalvars()
787
+ if '~' in userbind:
788
+ homedir = os.path.expanduser("~")
789
+ userbind = userbind.replace('~', homedir)
790
+ emsg = ''
791
+ bind = mol3D() # initialize binding molecule
792
+ bsmi = False # flag for smiles
793
+ # check if binding molecule exists in dictionary
794
+ if userbind in list(bindcores.keys()):
795
+ # load bind mol file (with hydrogens)
796
+ # fbind = installdir+'Bind/'+bindcores[userbind][0]
797
+ if globs.custom_path:
798
+ fbind = globs.custom_path + "/Bind/" + bindcores[userbind][0]
799
+ else:
800
+ fbind = str(resource_files("molSimplify").joinpath(f"Bind/{bindcores[userbind][0]}"))
801
+ # check if bind xyz/mol file exists
802
+ if not glob.glob(fbind):
803
+ emsg = "We can't find the binding species structure file %s right now! Something is amiss. Exiting..\n" % fbind
804
+ print(emsg)
805
+ return None, False, emsg
806
+ if ('.xyz' in fbind):
807
+ bind.OBMol = bind.getOBMol(fbind, 'xyzf')
808
+ elif ('.mol' in fbind):
809
+ bind.OBMol = bind.getOBMol(fbind, 'molf')
810
+ elif ('.smi' in fbind):
811
+ bind.OBMol = bind.getOBMol(fbind, 'smif')
812
+ bind.charge = bind.OBMol.GetTotalCharge()
813
+ # load from file
814
+ elif ('.mol' in userbind or '.xyz' in userbind or '.smi' in userbind):
815
+ if glob.glob(userbind):
816
+ ftype = userbind.split('.')[-1]
817
+ # try and catch error if conversion doesn't work
818
+ try:
819
+ bind.OBMol = bind.getOBMol(
820
+ userbind, ftype+'f') # convert from file
821
+ bind.charge = bind.OBMol.GetTotalCharge()
822
+ except IOError:
823
+ emsg = 'Failed converting file ' + userbind+' to molecule..Check your file.\n'
824
+ return None, False, emsg
825
+ bind.ident = userbind.rsplit('/')[-1]
826
+ bind.ident = bind.ident.split('.'+ftype)[0]
827
+ else:
828
+ emsg = 'Binding species file '+userbind+' does not exist. Exiting..\n'
829
+ return None, False, emsg
830
+ # if not, try converting from SMILES
831
+ else:
832
+ # check for transition metals
833
+ userbind = checkTMsmiles(userbind)
834
+ # try and catch error if conversion doesn't work
835
+ try:
836
+ bind.OBMol = bind.getOBMol(userbind, 'smi') # convert from smiles
837
+ bind.charge = bind.OBMol.GetTotalCharge()
838
+ bsmi = True
839
+ bind.ident = 'smi'
840
+ except IOError:
841
+ emsg = "We tried converting the string '%s' to a molecule but it wasn't a valid SMILES string.\n" % userbind
842
+ emsg += "Furthermore, we couldn't find the binding species structure: "
843
+ emsg += "'%s' in the binding species dictionary. Try again!\n" % userbind
844
+ print(emsg)
845
+ return None, False, emsg
846
+ return bind, bsmi, emsg
847
+
848
+ # Write input file from arguments
849
+ # @param args Namespace of arguments
850
+ # @param fname File name
851
+
852
+
853
+ def getinputargs(args, fname: str):
854
+ # list with arguments
855
+ # write input args
856
+ with open(fname+'.molinp', 'w') as f:
857
+ f.write("# Input file generated from molSimplify at " +
858
+ time.strftime('%m/%d/%Y %H:%M')+'\n')
859
+ for arg in vars(args):
860
+ if 'nbind' not in arg and 'rgen' not in arg and 'i' != arg:
861
+ if getattr(args, arg):
862
+ f.write('-'+arg+' ')
863
+ if isinstance(getattr(args, arg), list):
864
+ for ii, iar in enumerate(getattr(args, arg)):
865
+ if isinstance(iar, list):
866
+ if ii < len(getattr(args, arg))-1:
867
+ f.write('/')
868
+ for jj, iiar in enumerate(iar):
869
+ f.write(str(iiar))
870
+ if jj < len(iar)-1:
871
+ f.write(',')
872
+ else:
873
+ f.write(str(iar))
874
+ if ii < len(getattr(args, arg))-1:
875
+ f.write(',')
876
+ else:
877
+ f.write(str(getattr(args, arg)))
878
+ f.write('\n')
879
+
880
+ # Load plugin definitions
881
+
882
+
883
+ def plugin_defs() -> str:
884
+ plugin_path = str(resource_files("molSimplify").joinpath("plugindefines_reference.txt"))
885
+ return plugin_path
886
+
887
+ # def get_name(args,rootdir,core,ligname,bind = False,bsmi = False):
888
+ # DEPRECIATED, USE NAME_COMPLEX instead
889
+ # reads in argument namespace
890
+ # and chooses an appropriate name
891
+ # bind_ident is used to pass binding
892
+ # species information
893
+ # print('the root directory for this calc is '+ (rootdir))
894
+ # check if smiles string in binding species
895
+ # if args.bind:
896
+ # if bsmi:
897
+ # if args.nambsmi: # if name specified use it in file
898
+ # fname = rootdir+'/'+core.ident[0:3]+ligname+args.nambsmi[0:2]
899
+ # if args.name:
900
+ # fname = rootdir+'/'+args.name+args.nambsmi[0:2]
901
+ # else: # else use default
902
+ # fname = rootdir+'/'+core.ident[0:3]+ligname+'bsm'
903
+ # if args.name:
904
+ # fname = rootdir+'/'+args.name+'bsm'
905
+ # else: # else use name from binding in dictionary
906
+ # fname = rootdir+'/'+core.ident[0:3]+ligname+bind.ident[0:2]
907
+ # if args.name:
908
+ # fname = rootdir+'/'+args.name + bind.ident[0:2]
909
+ # else:
910
+ # if globs.debug:
911
+ # print('the root calculation directory is' + str(rootdir))
912
+ # fname = rootdir+'/'+core.ident[0:3]+ligname
913
+ # if args.name:
914
+ # fname = rootdir+'/'+args.name
915
+
916
+ # return fname
917
+
918
+ # Generate complex name (this is actually used instead of namegen.py)
919
+ # @param rootdir Root directory
920
+ # @param core mol3D of core
921
+ # @param ligs List of ligand names
922
+ # @param ligoc List of ligand occurrences
923
+ # @param sernum Complex serial number
924
+ # @param args Namespace of arguments
925
+ # @param bind Flag for binding species (default False)
926
+ # @param bsmi Flag for SMILES binding species (default False)
927
+ # @return Complex name
928
+
929
+
930
+ def name_complex(rootdir: str, core, geometry, ligs, ligoc, sernum: int,
931
+ args, nconf=False, sanity=False, bind=False, bsmi=False) -> str:
932
+ # new version of the above, designed to
933
+ # produce more human and machine-readable formats
934
+ if args.name: # if set externerally
935
+ name = rootdir+'/'+args.name
936
+ else:
937
+ center = ''
938
+ if sanity:
939
+ center += 'badjob_'
940
+ try:
941
+ center += core.getAtom(0).symbol().lower()
942
+ except AttributeError:
943
+ if ('.xyz' in core):
944
+ core = core.split('.')[0]
945
+ center += str(core).lower()
946
+ name = rootdir + '/' + center
947
+ if args.oxstate:
948
+ if args.oxstate in list(romans.keys()):
949
+ ox = str(romans[args.oxstate])
950
+ else:
951
+ ox = str(args.oxstate)
952
+ else:
953
+ ox = "0"
954
+ name += "_" + str(geometry)
955
+ name += "_" + str(ox)
956
+ if args.spin:
957
+ spin = str(args.spin)
958
+ else:
959
+ spin = "0"
960
+ licores = getlicores()
961
+ sminum = 0
962
+ for i, lig in enumerate(ligs):
963
+ if lig not in licores: # indicative of a SMILES string, or a misspelled ligand
964
+ # Checking if it is likely a misspelling
965
+ text_similarities = [difflib.SequenceMatcher(None, lig, i).ratio() for i in list(licores.keys())]
966
+ if max(text_similarities) > 0.6: # likely a misspelling of a ligand that is in ligands.dict
967
+ max_similarity = max(text_similarities)
968
+ index_max = text_similarities.index(max_similarity)
969
+ desired_ligand = list(licores.keys())[index_max]
970
+ name += '_' + str(desired_ligand) + '_' + str(ligoc[i])
971
+ else: # SMILES string
972
+ lig = lig.split('\t')[0]
973
+ sminum += 1
974
+ name += '_smi' + str(int(sernum)+int(sminum)
975
+ ) + '_' + str(ligoc[i])
976
+ else: # ligand is in ligands.dict
977
+ name += '_' + str(lig) + '_' + str(ligoc[i])
978
+ name += "_s_"+str(spin)
979
+ if args.debug:
980
+ print([nconf, args.nconfs])
981
+ if nconf and int(args.nconfs) >= 1:
982
+ name += "_conf_"+str(nconf)
983
+ if args.bind:
984
+ if bsmi:
985
+ if args.nambsmi: # if name specified use it in file
986
+ name += "_" + +args.nambsmi[0:2]
987
+ if args.antigeoisomer:
988
+ name += '_antigeoisomer'
989
+ return name
990
+
991
+ # Generate complex name (this is actually used instead of namegen.py)
992
+ # @param rootdir Root directory
993
+ # @param core mol3D of core
994
+ # @param ligs List of ligand names
995
+ # @param ligoc List of ligand occurrences
996
+ # @param sernum Complex serial number
997
+ # @param args Namespace of arguments
998
+ # @param bind Flag for binding species (default False)
999
+ # @param bsmi Flag for SMILES binding species (default False)
1000
+ # @return Complex name
1001
+
1002
+
1003
+ def name_ts_complex(rootdir, core, geometry, ligs, ligoc, substrate, subcatoms,
1004
+ mlig, mligcatoms, sernum, args, nconf=False, sanity=False,
1005
+ bind=False, bsmi=False) -> str:
1006
+ # new version of the above, designed to
1007
+ # produce more human and machine-readable formats
1008
+ if args.name: # if set externerally
1009
+ name = rootdir+'/'+args.name
1010
+ else:
1011
+ center = ''
1012
+ if sanity:
1013
+ center += 'badjob_'
1014
+ try:
1015
+ center += core.getAtom(0).symbol().lower()
1016
+ except AttributeError:
1017
+ if ('.xyz' in core):
1018
+ core = core.split('.')[0]
1019
+ center += str(core).lower()
1020
+ name = rootdir + '/' + center
1021
+ if args.oxstate:
1022
+ if args.oxstate in list(romans.keys()):
1023
+ ox = str(romans[args.oxstate])
1024
+ else:
1025
+ ox = str(args.oxstate)
1026
+ else:
1027
+ ox = "0"
1028
+ name += "_" + str(geometry)
1029
+ name += "_" + str(ox)
1030
+ licores = getlicores()
1031
+ sminum = 0
1032
+ for i, lig in enumerate(ligs):
1033
+ if lig not in licores:
1034
+ # unused:
1035
+ # lig = lig.split('\t')[0]
1036
+ sminum += 1
1037
+ name += '_smi' + str(int(sernum)+int(sminum)
1038
+ ) + '_' + str(ligoc[i])
1039
+ else:
1040
+ name += '_' + str(lig) + '_' + str(ligoc[i])
1041
+ # for i,sub in enumerate(substrate):
1042
+ # name += "_" + str(sub)
1043
+ # for i,subcatom in enumerate(str(subcatoms))):
1044
+ # name += "_" + str(subcatom)
1045
+ for sub in substrate:
1046
+ if '.' in sub:
1047
+ sub = sub.split('.')[0]
1048
+ name += "_" + str(sub)
1049
+ for subcatom in subcatoms:
1050
+ name += "_" + str(subcatom)
1051
+ # for i,mlig_i in enumerate(mlig):
1052
+ # name += "_" + str(mlig)
1053
+ # for j,mligcatom in enumerate(mligcatoms):
1054
+ # name += "_" + str(mligcatom)
1055
+ if mlig:
1056
+ name += "_" + str(mlig[0])
1057
+ if mligcatoms:
1058
+ name += "_" + str(mligcatoms[0])
1059
+ if args.spin:
1060
+ spin = str(args.spin)
1061
+ else:
1062
+ spin = "0"
1063
+ name += "_s_"+str(spin)
1064
+ if nconf and int(args.nconfs) >= 1:
1065
+ name += "_conf_"+str(nconf)
1066
+ if args.bind:
1067
+ if bsmi:
1068
+ if args.nambsmi: # if name specified use it in file
1069
+ name += "_" + +args.nambsmi[0:2]
1070
+ return name
1071
+
1072
+ # ## Generate transition state name
1073
+ # # @param rootdir Root directory
1074
+ # # @param core mol3D of core
1075
+ # # @param subst mol3D of substrate
1076
+ # # @param args Namespace of arguments
1077
+ # # @param bind Flag for binding species (default False)
1078
+ # # @param bsmi Flag for SMILES binding species (default False)
1079
+ # # @return Transition state name
1080
+ # def name_TS(rootdir,core,subst,args,bind= False,bsmi=False):
1081
+ # ## new version of the above, designed to
1082
+ # ## produce more human and machine-readable formats
1083
+ # globs = globalvars()
1084
+ # if args.name: # if set externerally
1085
+ # name = rootdir+'/'+args.name
1086
+ # else:
1087
+ # try:
1088
+ # center = core.getAtom(0).symbol().lower()
1089
+ # except AttributeError:
1090
+ # center = str(core).lower()
1091
+ # name = rootdir + '/' + center
1092
+ # #if args.oxstate:
1093
+ # #if args.oxstate in romans.keys():
1094
+ # #ox = str(romans[args.oxstate])
1095
+ # #else:
1096
+ # #ox = str(args.oxstate)
1097
+ # #else:
1098
+ # #ox = "0"
1099
+ # #name += "_" + str(ox)
1100
+ # if args.spin:
1101
+ # spin = str(args.spin)
1102
+ # else:
1103
+ # spin = "0"
1104
+ # name += "_s_"+str(spin)
1105
+ # name += "_" + str(subst.ident) + "_TS"
1106
+ # if args.bind:
1107
+ # if bsmi:
1108
+ # if args.nambsmi: # if name specified use it in file
1109
+ # name += "_" + +args.nambsmi[0:2]
1110
+ # return name
1111
+
1112
+ # Copies ligands, binding species and cores to user-specified path
1113
+
1114
+
1115
+ def copy_to_custom_path():
1116
+ globs = globalvars()
1117
+ if not globs.custom_path:
1118
+ print('Error, custom path not set!')
1119
+ raise FileNotFoundError('Error, custom path not set!')
1120
+ # create folder
1121
+ if not os.path.exists(globs.custom_path):
1122
+ os.makedirs(globs.custom_path)
1123
+ # copytree cannot overwrite, need to enusre directory does not exist already
1124
+ core_dir = resource_files("molSimplify").joinpath("Cores")
1125
+ li_dir = resource_files("molSimplify").joinpath("Ligands")
1126
+ bind_dir = resource_files("molSimplify").joinpath("Bind")
1127
+ data_dir = resource_files("molSimplify").joinpath("Data")
1128
+ subs_dir = resource_files("molSimplify").joinpath("Substrates")
1129
+ if os.path.exists(str(globs.custom_path).rstrip("/")+"/Cores"):
1130
+ print('Note: removing old molSimplify data')
1131
+ shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Cores")
1132
+ if os.path.exists(str(globs.custom_path).rstrip("/")+"/Ligands"):
1133
+ print('Note: removing old molSimplify data')
1134
+ shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Ligands")
1135
+ if os.path.exists(str(globs.custom_path).rstrip("/")+"/Bind"):
1136
+ print('Note: removing old molSimplify data')
1137
+ shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Bind")
1138
+ if os.path.exists(str(globs.custom_path).rstrip("/")+"/Data"):
1139
+ print('Note: removing old molSimplify data')
1140
+ shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Data")
1141
+ if os.path.exists(str(globs.custom_path).rstrip("/")+"/Substrates"):
1142
+ print('Note: removing old molSimplify data')
1143
+ shutil.rmtree(str(globs.custom_path).rstrip("/")+"/Substrates")
1144
+
1145
+ shutil.copytree(core_dir, str(globs.custom_path).rstrip("/")+"/Cores")
1146
+ shutil.copytree(li_dir, str(globs.custom_path).rstrip("/")+"/Ligands")
1147
+ shutil.copytree(bind_dir, str(globs.custom_path).rstrip("/")+"/Bind")
1148
+ shutil.copytree(data_dir, str(globs.custom_path).rstrip("/")+"/Data")
1149
+ shutil.copytree(subs_dir, str(globs.custom_path).rstrip("/")+"/Substrates")