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,782 @@
1
+ import copy
2
+ import os
3
+ import re
4
+ import sys
5
+ # import time
6
+ import numpy as np
7
+
8
+ from molSimplify.Classes.atom3D import (atom3D,
9
+ globalvars)
10
+ from molSimplify.Classes.globalvars import dict_oct_check_loose, dict_oct_check_st, dict_oneempty_check_st, \
11
+ oct_angle_ref, oneempty_angle_ref
12
+ from molSimplify.Classes.ligand import ligand_breakdown
13
+ from molSimplify.Classes.ligand import (mol3D)
14
+ from molSimplify.Informatics.graph_analyze import obtain_truncation_metal
15
+ from molSimplify.Scripts.geometry import vecangle, distance, kabsch
16
+
17
+
18
+ # from openpyxl import load_workbook
19
+ # from openpyxl import Workbook
20
+ # import json
21
+
22
+ # Check whether the complex form an octahedral.
23
+ # Written by Chenru Duan
24
+ ### upload: 3/7/2018
25
+ ### update: 4/5/2018
26
+
27
+
28
+ # input: a xyz file
29
+ # output: a mol3D object.
30
+ def create_mol_with_xyz(_file_in):
31
+ my_mol = mol3D()
32
+ my_mol.readfromxyz(_file_in)
33
+ return my_mol
34
+
35
+
36
+ def readfromtxt(mol, txt):
37
+ # print('!!!!', filename)
38
+ globs = globalvars()
39
+ en_dict = globs.endict()
40
+ mol.graph = []
41
+ for line in txt:
42
+ line_split = line.split()
43
+ if len(line_split) == 4 and line_split[0]:
44
+ # this looks for unique atom IDs in files
45
+ lm = re.search(r'\d+$', line_split[0])
46
+ # if the string ends in digits m will be a Match object, or None otherwise.
47
+ if lm is not None:
48
+ symb = re.sub(r'\d+', '', line_split[0])
49
+ # number = lm.group()
50
+ # # print('sym and number ' +str(symb) + ' ' + str(number))
51
+ # globs = globalvars()
52
+ atom = atom3D(symb, [float(line_split[1]), float(line_split[2]), float(line_split[3])],
53
+ name=line_split[0])
54
+ elif line_split[0] in list(en_dict.keys()):
55
+ atom = atom3D(line_split[0], [float(line_split[1]), float(
56
+ line_split[2]), float(line_split[3])])
57
+ else:
58
+ print('cannot find atom type')
59
+ sys.exit()
60
+ mol.addAtom(atom)
61
+ return mol
62
+
63
+
64
+ def find_nearest_ind(array, value):
65
+ array = np.asarray(array)
66
+ idx = (np.abs(array - value)).argmin()
67
+ return idx
68
+
69
+
70
+ # deprecated
71
+ def comp_two_angle_array_(input_angle, target_angle, catoms_map, picked):
72
+ _angs = input_angle[1][:]
73
+ angs = copy.copy(_angs)
74
+ # print("_angs: ", _angs)
75
+ # print('target_angle', input_angle, target_angle)
76
+ del_act = []
77
+ output_angle, output_ind = [], []
78
+ for idx, ele in enumerate(target_angle):
79
+ del_arr = []
80
+ for _idx, _ele in enumerate(_angs):
81
+ del_arr.append([abs(ele - _ele), _idx, _ele])
82
+ del_arr.sort()
83
+ posi = del_arr[0][1]
84
+ _angs.pop(posi)
85
+ # print('!!!input_a:', input_angle[1])
86
+ del_act.append(del_arr[0][0])
87
+ output_angle.append(del_arr[0][2])
88
+ # output_ind = [find_nearest_ind(angs, x) for x in output_angle]
89
+ output_ind = []
90
+ for x in output_angle:
91
+ ind = find_nearest_ind(angs, x)
92
+ output_ind.append(ind)
93
+ angs[ind] = -1
94
+ max_del_angle = max(del_act)
95
+ sum_del = sum(del_act) / len(target_angle)
96
+ return output_angle, output_ind, sum_del, max_del_angle
97
+
98
+
99
+ def comp_two_angle_array(input_angle, target_angle, catoms_map, picked_inds):
100
+ '''
101
+ input_angle: a list of angle (n_catom_candidates)
102
+ target_angle: a list of angle (n_catom, < n_catom_candidates)
103
+ catoms_map: a map of {atom_ind_in_mol, ind_in_angle_list}
104
+ picked_inds: atom indexes (in the angle list) that have been picked already.
105
+ '''
106
+ _angs = input_angle[1][:]
107
+ angs = copy.copy(_angs)
108
+ picked_angles = [angs[x] for x in picked_inds]
109
+ picked_inds_rev = [x for _, x in sorted(zip(picked_angles, picked_inds), reverse=True)]
110
+ _target_angle = copy.copy(target_angle)
111
+ # print("_angs: ", _angs)
112
+ # print('target_angle', target_angle)
113
+ del_act = []
114
+ output_angle, output_ind = [], []
115
+ for ind in picked_inds_rev:
116
+ target_ind = find_nearest_ind(_target_angle, input_angle[1][:][ind])
117
+ # print(_target_angle[target_ind], angs[ind])
118
+ del_act.append(abs(_target_angle[target_ind]-angs[ind]))
119
+ output_angle.append(angs[ind])
120
+ _target_angle.pop(target_ind)
121
+ for ind in sorted(picked_inds, reverse=True):
122
+ _angs.pop(ind)
123
+ for idx, ele in enumerate(_target_angle):
124
+ del_arr = []
125
+ for _idx, _ele in enumerate(_angs):
126
+ del_arr.append([abs(ele - _ele), _idx, _ele])
127
+ del_arr.sort()
128
+ posi = del_arr[0][1]
129
+ _angs.pop(posi)
130
+ # print('!!!input_a:', input_angle[1])
131
+ del_act.append(del_arr[0][0])
132
+ output_angle.append(del_arr[0][2])
133
+ # print("del_act: ", del_act)
134
+ # output_ind = [find_nearest_ind(angs, x) for x in output_angle]
135
+ output_ind = []
136
+ for x in output_angle:
137
+ ind = find_nearest_ind(angs, x)
138
+ output_ind.append(ind)
139
+ angs[ind] = -1
140
+ max_del_angle = max(del_act)
141
+ sum_del = sum(del_act) / len(target_angle)
142
+ return output_angle, output_ind, sum_del, max_del_angle
143
+
144
+
145
+ # description: Given the target_angle, choose the input_angle that has
146
+ # the smallest angle deviation in input_array. In this process,
147
+ # the input_angle has already been filtered.
148
+ # input: input_arr: array of input_angle, target_angle: array of angle you want.
149
+ # output: output_angle: the input_angle that has the smallest deviation compared
150
+ # to target_arr. del_angle: the deviation. catoms: the connecting antom for
151
+ # the output_angle.
152
+ def comp_angle_pick_one_best(input_arr, target_angle, catoms_map, picked):
153
+ '''
154
+ Given the target_angle, choose the input_angle that has the smallest angle deviation
155
+ in input_array.
156
+ input_arr: array of input angles.
157
+ target_angle: array of target angles.
158
+ catoms_map: a map of {atom_ind_in_mol, ind_in_angle_list}.
159
+ picked: atom indexes (in mol3D) that have been picked already.
160
+ '''
161
+ del_arr = []
162
+ picked_inds = [catoms_map[x] for x in picked]
163
+ # print("==============")
164
+ # print("picked: ", picked, picked_inds)
165
+ # print("input_arr", input_arr, len(input_arr))
166
+ for ii, input_angle in enumerate(input_arr):
167
+ out_angle, output_ind, sum_del, max_del_angle = comp_two_angle_array(
168
+ input_angle, target_angle, catoms_map, picked_inds)
169
+ del_arr.append([sum_del, ii, max_del_angle, out_angle, output_ind])
170
+ del_arr.sort()
171
+ # print("del_arr", del_arr)
172
+ idx = 0
173
+ posi = del_arr[idx][1]
174
+ del_angle = del_arr[idx][0]
175
+ output_angle = input_arr[posi][1]
176
+ catoms = input_arr[posi][0]
177
+ max_del_sig_angle = del_arr[idx][2]
178
+ # print('!!!!posi', input_arr[posi])
179
+ # print('!!!!out:', del_angle, del_arr[0][3])
180
+ input_arr.pop(posi)
181
+ return output_angle, del_angle, catoms, max_del_sig_angle
182
+
183
+
184
+ # description: Loop the target_angle in target_arr.
185
+ # output: three lists corresponding to the outputs of comp_angle_pick_one_best.
186
+ def loop_target_angle_arr(input_arr, target_arr, catoms_map):
187
+ output_arr = []
188
+ sum_del = []
189
+ catoms_arr = []
190
+ max_del_sig_angle_arr = []
191
+ for idx, ele in enumerate(target_arr):
192
+ output_angle, del_angle, catoms, max_del_sig_angle = comp_angle_pick_one_best(
193
+ input_arr, ele, catoms_map, picked=catoms_arr)
194
+ # print("catoms: ", catoms)
195
+ # print("max_del_sig_angle: ", max_del_sig_angle)
196
+ output_arr.append(output_angle)
197
+ sum_del.append(del_angle)
198
+ catoms_arr.append(catoms)
199
+ max_del_sig_angle_arr.append(max_del_sig_angle)
200
+ # print("!!!!", catoms_arr, target_arr)
201
+ return output_arr, sum_del, catoms_arr, max(max_del_sig_angle_arr)
202
+
203
+
204
+ def sort_sec_ele(ele):
205
+ return ele[1]
206
+
207
+
208
+ # standard 1: number of coordination for metal.
209
+ # For octehegral, if num_coord_metal < 6, it will be considered as
210
+ # problemetic. For num_coord_metal > 6, it might be caused by the
211
+ # ambiguity of C-N ring in the getBondedAtom function. We will use
212
+ # other metric (oct_comp) to see whether some of these catoms can
213
+ # construct an Oct.
214
+ # input: a xyz file
215
+ # output: coordination number for metal, and their indexes.
216
+ def get_num_coord_metal(file_in, debug=False):
217
+ my_mol = create_mol_with_xyz(_file_in=file_in)
218
+ metal_ind = my_mol.findMetal()[0]
219
+ metal_coord = my_mol.getAtomCoords(metal_ind)
220
+ catoms = my_mol.getBondedAtomsOct(ind=metal_ind)
221
+ if debug:
222
+ print(('metal coordinate:', metal_coord))
223
+ print(('coordinations: ', catoms, len(catoms)))
224
+ # standard 1: number of coordination for metal.
225
+ num_coord_metal = len(catoms)
226
+ return num_coord_metal, catoms
227
+
228
+
229
+ # standard 2: ligand changes (rmsd, max atom distance)
230
+ # for each ligand in the complex. Need input for
231
+ # original gemoetry.
232
+ # input: optimized and original xyz file.
233
+ # output: two scalar of maximum rmsd for ligands, and the
234
+ # maximum distance change in ligands.
235
+ def ligand_comp_org(file_in, file_init_geo, catoms_arr, flag_deleteH=True, flag_loose=False,
236
+ flag_lbd=True, debug=False, depth=3, BondedOct=False):
237
+ liglist, liglist_init, flag_match = match_lig_list(file_in, file_init_geo,
238
+ catoms_arr,
239
+ flag_loose, flag_lbd,
240
+ debug=debug, depth=depth,
241
+ BondedOct=BondedOct)
242
+ if debug:
243
+ print(('lig_list:', liglist, len(liglist)))
244
+ print(('lig_list_init:', liglist_init, len(liglist_init)))
245
+ if flag_lbd:
246
+ mymol_xyz = 'mymol_trunc_tmp.xyz'
247
+ initmol_xyz = 'init_trunc_tmp.xyz'
248
+ else:
249
+ mymol_xyz = file_in
250
+ initmol_xyz = file_init_geo
251
+ if flag_match:
252
+ rmsd_arr, max_atom_dist_arr = [], []
253
+ for idx, lig in enumerate(liglist):
254
+ lig_init = liglist_init[idx]
255
+ if debug:
256
+ print(('----This is %d th piece of ligand.' % (idx + 1)))
257
+ print(('ligand is:', lig, lig_init))
258
+ posi_shift = 2
259
+ # Create mol3D without a tmp file.
260
+ # _start = time.clock()
261
+ with open(mymol_xyz, 'r') as fo:
262
+ foo = []
263
+ for ii, line in enumerate(fo):
264
+ if (ii - posi_shift) in lig:
265
+ if debug:
266
+ print(('line is', line))
267
+ foo.append(line)
268
+ tmp_mol = mol3D()
269
+ tmp_mol = readfromtxt(tmp_mol, foo)
270
+ with open(initmol_xyz, 'r') as fo:
271
+ foo = []
272
+ for ii, line in enumerate(fo):
273
+ if (ii - posi_shift) in lig_init:
274
+ if debug:
275
+ print(('line is', line))
276
+ foo.append(line)
277
+ tmp_org_mol = mol3D()
278
+ tmp_org_mol = readfromtxt(tmp_org_mol, foo)
279
+ # _elapsed = (time.clock() - _start)
280
+ # print('-reading txt:', _elapsed)
281
+ if debug:
282
+ print(('# atoms: %d, init: %d' %
283
+ (tmp_mol.natoms, tmp_org_mol.natoms)))
284
+ print(('!!!!atoms:', [x.symbol() for x in tmp_mol.getAtoms()],
285
+ [x.symbol() for x in tmp_org_mol.getAtoms()]))
286
+ if flag_deleteH:
287
+ tmp_mol.deleteHs()
288
+ tmp_org_mol.deleteHs()
289
+ _ = kabsch(tmp_org_mol, tmp_mol)
290
+ rmsd = tmp_mol.rmsd(tmp_org_mol)
291
+ rmsd_arr.append(rmsd)
292
+ atom_dist_max = tmp_mol.maxatomdist(tmp_org_mol)
293
+ max_atom_dist_arr.append(atom_dist_max)
294
+ if debug:
295
+ print(('rmsd:', rmsd))
296
+ print(('atom_dist_max', atom_dist_max))
297
+ rmsd_max = max(rmsd_arr)
298
+ atom_dist_max = max(max_atom_dist_arr)
299
+ else:
300
+ rmsd_max, atom_dist_max = 'lig_mismatch', 'lig_mismatch'
301
+ return rmsd_max, atom_dist_max
302
+
303
+
304
+ # Match the ligend list generated by ligand_breakdown.
305
+ # useful for cases where the init geo and opt geo have the
306
+ # different ligands arrangement (when you only have the opt geo
307
+ # but still want init geo)
308
+ def match_lig_list(file_in, file_init_geo, catoms_arr,
309
+ flag_loose, flag_lbd=True, debug=False,
310
+ depth=3, BondedOct=False):
311
+ flag_match = True
312
+ my_mol = create_mol_with_xyz(_file_in=file_in)
313
+ init_mol = create_mol_with_xyz(_file_in=file_init_geo)
314
+ if flag_lbd: # Also do ligand breakdown for opt geo
315
+ my_mol_trunc = obtain_truncation_metal(my_mol, depth)
316
+ init_mol_trunc = obtain_truncation_metal(init_mol, depth)
317
+ my_mol_trunc.createMolecularGraph()
318
+ init_mol_trunc.createMolecularGraph()
319
+ init_mol_trunc.writexyz('init_trunc_tmp.xyz')
320
+ my_mol_trunc.writexyz('mymol_trunc_tmp.xyz')
321
+ liglist_init, ligdents_init, ligcons_init = ligand_breakdown(
322
+ init_mol_trunc, BondedOct=BondedOct)
323
+ liglist, ligdents, ligcons = ligand_breakdown(my_mol_trunc, BondedOct=BondedOct)
324
+ liglist_atom = [[my_mol_trunc.getAtom(x).symbol() for x in ele]
325
+ for ele in liglist]
326
+ liglist_init_atom = [[init_mol_trunc.getAtom(x).symbol() for x in ele]
327
+ for ele in liglist_init]
328
+ if debug:
329
+ print(('!!!!:', [x.symbol() for x in init_mol_trunc.getAtoms()]))
330
+ print(('liglist_init, ligdents_init, ligcons_init',
331
+ liglist_init, ligdents_init, ligcons_init))
332
+ # print('liglist, ligdents, ligcons', liglist, ligdents, ligcons)
333
+ else: # ceate/use the liglist, ligdents, ligcons of initial geo as we just wanna track them down
334
+ # _start = time.clock()
335
+ if debug:
336
+ print('Just inherit the ligand list from init structure.')
337
+ liglist_init, ligdents_init, ligcons_init = ligand_breakdown(init_mol,
338
+ BondedOct=BondedOct)
339
+ # _elapsed = (time.clock() - _start)
340
+ # print('time on lig_breakdoen:', _elapsed)
341
+ liglist = liglist_init[:]
342
+ liglist_atom = [[my_mol.getAtom(x).symbol() for x in ele]
343
+ for ele in liglist]
344
+ liglist_init_atom = [[init_mol.getAtom(x).symbol() for x in ele]
345
+ for ele in liglist_init]
346
+
347
+ if debug:
348
+ print(('ligand_list opt in symbols:', liglist_atom))
349
+ print(('ligand_list init in symbols: ', liglist_init_atom))
350
+ liglist_shifted = []
351
+ for ele in liglist_init_atom:
352
+ # posi = liglist_atom.index(ele)
353
+ # liglist_shifted.append(liglist[posi])
354
+ # liglist_atom.pop(posi)
355
+ try:
356
+ _flag = False
357
+ for idx, _ele in enumerate(liglist_atom):
358
+ if set(ele) == set(_ele) and len(ele) == len(_ele):
359
+ if debug:
360
+ print(('fragment in liglist_init', ele))
361
+ print(('fragment in liglist', _ele))
362
+ posi = idx
363
+ _flag = True
364
+ liglist_shifted.append(liglist[posi])
365
+ liglist_atom.pop(posi)
366
+ liglist.pop(posi)
367
+ if not _flag:
368
+ if debug:
369
+ print('Ligands cannot match!')
370
+ flag_match = False
371
+ except AssertionError:
372
+ # To whoever encounters this: Please replace AssertionError
373
+ # with whatever we are actually trying to except. RM 2022/02/17
374
+ print('Ligands cannot match!')
375
+ flag_match = False
376
+ if debug:
377
+ print(('!!!!!returns', liglist_shifted, liglist_init))
378
+ return liglist_shifted, liglist_init, flag_match
379
+
380
+
381
+ def find_the_other_ind(arr, ind):
382
+ arr.pop(arr.index(ind))
383
+ return arr[0]
384
+
385
+
386
+ # The linear ligand here ius defined as:
387
+ # 1) ligands that contains only two atoms. For example CO
388
+ # 2) ligands with more than two atoms and looks linear itself.
389
+ # For example: A-B-C-.... with the angle of A-B and B-C larger than 170.
390
+ def is_linear_ligand(mol, ind):
391
+ catoms = mol.getBondedAtomsSmart(ind)
392
+ metal_ind = mol.findMetal()[0]
393
+ flag = False
394
+ if metal_ind in catoms and len(catoms) == 2:
395
+ ind_next = find_the_other_ind(catoms[:], metal_ind)
396
+ _catoms = mol.getBondedAtomsSmart(ind_next)
397
+ if len(_catoms) == 1:
398
+ flag = True
399
+ elif len(_catoms) == 2:
400
+ ind_next2 = find_the_other_ind(_catoms[:], ind)
401
+ vec1 = (np.array(mol.getAtomCoords(ind))
402
+ - np.array(mol.getAtomCoords(ind_next)))
403
+ vec2 = (np.array(mol.getAtomCoords(ind_next2))
404
+ - np.array(mol.getAtomCoords(ind_next)))
405
+ ang = vecangle(vec1, vec2)
406
+ if ang > 170:
407
+ flag = True
408
+ # print(flag, catoms)
409
+ return flag, catoms
410
+
411
+
412
+ def get_linear_angle(mol, ind):
413
+ flag, catoms = is_linear_ligand(mol, ind)
414
+ if flag:
415
+ vec1 = np.array(mol.getAtomCoords(
416
+ catoms[0])) - np.array(mol.getAtomCoords(ind))
417
+ vec2 = np.array(mol.getAtomCoords(
418
+ catoms[1])) - np.array(mol.getAtomCoords(ind))
419
+ ang = vecangle(vec1, vec2)
420
+ else:
421
+ ang = 0
422
+ return flag, ang
423
+
424
+
425
+ def check_angle_linear(file_in, catoms_arr):
426
+ mol = create_mol_with_xyz(file_in)
427
+ dict_angle_linear = {}
428
+ for ind in catoms_arr:
429
+ flag, ang = get_linear_angle(mol, ind)
430
+ dict_angle_linear[str(ind)] = [flag, ang]
431
+ dict_orientation = {}
432
+ devi_linear_avrg, devi_linear_max = 0, 0
433
+ count = 0
434
+ for key in dict_angle_linear:
435
+ [flag, ang] = dict_angle_linear[key]
436
+ if flag:
437
+ count += 1
438
+ devi_linear_avrg += 180 - ang
439
+ if (180 - ang) > devi_linear_max:
440
+ devi_linear_max = 180 - ang
441
+ if count:
442
+ devi_linear_avrg /= count
443
+ else:
444
+ devi_linear_avrg = 0
445
+ dict_orientation['devi_linear_avrg'] = devi_linear_avrg
446
+ dict_orientation['devi_linear_max'] = devi_linear_max
447
+ return dict_angle_linear, dict_orientation
448
+
449
+
450
+ # standard 3: catoms structure compared to a perfect octahedral.
451
+ # Note: The same logic can be used to judge whether a complex is
452
+ # Tetrahedron or panor square.
453
+ # input: a xyz file.
454
+ # output: the summation for the angle deviation for the closest
455
+ # Oct structure. Candidates are from GetBondedAtom function
456
+ # for the metal. A metric for the distance deviation from the
457
+ # pefect Oct, including the diff in eq ligands, ax ligands and
458
+ # eq-ax ligands.
459
+ def oct_comp(file_in, angle_ref=oct_angle_ref, catoms_arr=None,
460
+ debug=False):
461
+ my_mol = create_mol_with_xyz(_file_in=file_in)
462
+ num_coord_metal, catoms = get_num_coord_metal(file_in=file_in)
463
+ # metal_ind = my_mol.findMetal()[0]
464
+ metal_coord = my_mol.getAtomCoords(my_mol.findMetal()[0])
465
+ catom_coord = []
466
+ if catoms_arr is not None:
467
+ catoms = catoms_arr
468
+ theta_arr, oct_dist = [], []
469
+ for atom in catoms:
470
+ coord = my_mol.getAtomCoords(atom)
471
+ catom_coord.append(coord)
472
+ th_input_arr = []
473
+ catoms_map = {}
474
+ for idx1, coord1 in enumerate(catom_coord):
475
+ delr1 = (np.array(coord1) - np.array(metal_coord)).tolist()
476
+ catoms_map.update({catoms[idx1]: idx1})
477
+ theta_tmp = []
478
+ for idx2, coord2 in enumerate(catom_coord):
479
+ if idx2 != idx1:
480
+ delr2 = (np.array(coord2) - np.array(metal_coord)).tolist()
481
+ theta = vecangle(delr1, delr2)
482
+ theta_tmp.append(theta)
483
+ th_input_arr.append([catoms[idx1], theta_tmp])
484
+ th_output_arr, sum_del_angle, catoms_arr, max_del_sig_angle = loop_target_angle_arr(
485
+ th_input_arr, angle_ref, catoms_map)
486
+ if debug:
487
+ print(('th:', th_output_arr))
488
+ print(('sum_del:', sum_del_angle))
489
+ print(('catoms_arr:', catoms_arr))
490
+ print(('catoms_type:', [my_mol.getAtom(x).symbol()
491
+ for x in catoms_arr]))
492
+ for idx, ele in enumerate(th_output_arr):
493
+ theta_arr.append([catoms_arr[idx], sum_del_angle[idx], ele])
494
+ # theta_arr.sort(key=sort_sec_ele)
495
+ # theta_trunc_arr = theta_arr[0:6]
496
+ theta_trunc_arr = theta_arr
497
+ # print('truncated theta array:', theta_trunc_arr)
498
+ theta_trunc_arr_T = list(map(list, list(zip(*theta_trunc_arr))))
499
+ oct_catoms = theta_trunc_arr_T[0]
500
+ oct_angle_devi = theta_trunc_arr_T[1]
501
+ oct_angle_all = theta_trunc_arr_T[2]
502
+ if debug:
503
+ print(('Summation of deviation angle for catoms:', oct_angle_devi))
504
+ print(('Angle for catoms:', oct_angle_all))
505
+ for atom in oct_catoms:
506
+ coord = catom_coord[catoms.index(atom)]
507
+ dist = distance(coord, metal_coord)
508
+ oct_dist.append(dist)
509
+ oct_dist.sort()
510
+ # print('!!!oct_dist:', oct_dist)
511
+ try: # For Oct
512
+ dist_del_arr = np.array(
513
+ [oct_dist[3] - oct_dist[0], oct_dist[4] - oct_dist[1], oct_dist[5] - oct_dist[2]])
514
+ min_posi = np.argmin(dist_del_arr)
515
+ if min_posi == 0:
516
+ dist_eq, dist_ax = oct_dist[:4], oct_dist[4:]
517
+ elif min_posi == 1:
518
+ dist_eq, dist_ax = oct_dist[1:5], [oct_dist[0], oct_dist[5]]
519
+ else:
520
+ dist_eq, dist_ax = oct_dist[2:], oct_dist[:2]
521
+ except IndexError: # For one empty site
522
+ if (oct_dist[3] - oct_dist[0]) > (oct_dist[4] - oct_dist[1]):
523
+ dist_ax, dist_eq = oct_dist[:1], oct_dist[1:] # ax dist is smaller
524
+ else:
525
+ dist_ax, dist_eq = oct_dist[4:], oct_dist[:4] # eq dist is smaller
526
+ dist_del_all = oct_dist[-1] - oct_dist[0]
527
+ if debug:
528
+ print(('dist:', dist_eq, dist_ax))
529
+ dist_del_eq = max(dist_eq) - min(dist_eq)
530
+ dist_del_ax = max(dist_ax) - min(dist_ax)
531
+ dist_del_eq_ax = max(abs(max(dist_eq) - min(dist_ax)),
532
+ abs(max(dist_ax) - min(dist_eq)))
533
+ oct_dist_del = [dist_del_eq, dist_del_ax, dist_del_eq_ax, dist_del_all]
534
+ if debug:
535
+ print(('distance difference for catoms to metal (eq, ax, eq_ax):', oct_dist_del))
536
+ return oct_angle_devi, oct_dist_del, max_del_sig_angle, catoms_arr
537
+
538
+
539
+ def dict_check_processing(dict_info, dict_check, std_not_use,
540
+ num_coord=6, debug=False):
541
+ if debug:
542
+ print(('dict_oct_info', dict_info))
543
+ for ele in std_not_use:
544
+ dict_info[ele] = 'banned_by_user'
545
+ flag_list = []
546
+ for key, values in list(dict_check.items()):
547
+ if not dict_info[key] == 'banned_by_user':
548
+ print((dict_info[key]))
549
+ print(values)
550
+ if dict_info[key] > values:
551
+ flag_list.append(key)
552
+ if dict_info['num_coord_metal'] < num_coord:
553
+ flag_list.append('num_coord_metal')
554
+ if flag_list == ['num_coord_metal'] and \
555
+ (dict_info['num_coord_metal'] == -1 or dict_info['num_coord_metal'] > num_coord):
556
+ dict_info['num_coord_metal'] = num_coord
557
+ flag_list.remove('num_coord_metal')
558
+ if not len(flag_list):
559
+ flag_oct = 1 # good structure
560
+ flag_list = 'None'
561
+ else:
562
+ flag_oct = 0
563
+ flag_list = ', '.join(flag_list)
564
+ print('------bad structure!-----')
565
+ print(('flag_list:', flag_list))
566
+ return flag_oct, flag_list, dict_info
567
+
568
+
569
+ def Oct_inspection(file_in, file_init_geo=None, catoms_arr=None, dict_check=dict_oct_check_st,
570
+ std_not_use=[], angle_ref=oct_angle_ref, flag_loose=True, flag_lbd=False,
571
+ dict_check_loose=dict_oct_check_loose, BondedOct=True, debug=False):
572
+ if catoms_arr is None:
573
+ print('Error, must have ctoms! If not, please use IsOct.')
574
+ quit()
575
+ elif len(catoms_arr) != 6:
576
+ print('Error, must have 6 connecting atoms for octahedral.')
577
+ quit()
578
+ num_coord_metal = 6
579
+ oct_angle_devi, oct_dist_del, max_del_sig_angle = [-1, -1], [-1, -1, -1, -1], -1
580
+ rmsd_max, atom_dist_max = -1, -1
581
+ if file_init_geo is not None:
582
+ # print('!!!Inspection,flag_loose:', flag_loose)
583
+ # _start = time.clock()
584
+ rmsd_max, atom_dist_max = ligand_comp_org(file_in, file_init_geo,
585
+ flag_loose=flag_loose,
586
+ flag_lbd=flag_lbd,
587
+ catoms_arr=catoms_arr,
588
+ debug=debug,
589
+ BondedOct=BondedOct)
590
+ # _elapsed = time.clock() - _start
591
+ # print('Time on ligand_comp_org:', _elapsed)
592
+ if not rmsd_max == 'lig_mismatch':
593
+ # _start = time.clock()
594
+ oct_angle_devi, oct_dist_del, max_del_sig_angle, catoms_arr = oct_comp(file_in, angle_ref, catoms_arr,
595
+ debug=debug)
596
+ # _elapsed = time.clock() - _start
597
+ # print('Time on oct_comp:', _elapsed)
598
+ else:
599
+ num_coord_metal = -1
600
+ rmsd_max, atom_dist_max = -1, -1
601
+ print('!!!!!Should always match. WRONG!!!!!')
602
+ quit()
603
+ dict_angle_linear, dict_orientation = check_angle_linear(
604
+ file_in, catoms_arr)
605
+ if debug:
606
+ print('-------This is for the linear ligand orientation test-----')
607
+ print(('!!!catoms_arr:', catoms_arr))
608
+ print(('!!!dict_angle_linear', dict_angle_linear))
609
+ print(('!!!dict_orientation', dict_orientation))
610
+ print('---------orientation end.------------')
611
+ dict_oct_info = {}
612
+ dict_oct_info['num_coord_metal'] = num_coord_metal
613
+ dict_oct_info['rmsd_max'] = rmsd_max
614
+ dict_oct_info['atom_dist_max'] = atom_dist_max
615
+ dict_oct_info['oct_angle_devi_max'] = max(oct_angle_devi)
616
+ dict_oct_info['max_del_sig_angle'] = max_del_sig_angle
617
+ dict_oct_info['dist_del_eq'] = oct_dist_del[0]
618
+ dict_oct_info['dist_del_ax'] = oct_dist_del[1]
619
+ dict_oct_info['dist_del_eq_ax'] = oct_dist_del[2]
620
+ dict_oct_info['dist_del_all'] = oct_dist_del[3]
621
+ dict_oct_info.update(dict_orientation)
622
+ flag_oct, flag_list, dict_oct_info = dict_check_processing(dict_oct_info,
623
+ dict_check=dict_check,
624
+ std_not_use=std_not_use,
625
+ num_coord=6, debug=debug)
626
+ flag_oct_loose, flag_list_loose, __ = dict_check_processing(dict_oct_info,
627
+ dict_check=dict_check_loose,
628
+ std_not_use=std_not_use,
629
+ num_coord=6, debug=debug)
630
+ return flag_oct, flag_list, dict_oct_info, flag_oct_loose, flag_list_loose
631
+
632
+
633
+ # See whether a complex is Oct or not.
634
+ # output: flag: 1 is good and 0 is bad
635
+ # flag_list: if structure is bad, which test it fails
636
+ # dict_oct_info: values for each metric we check.
637
+ def IsOct(file_in, file_init_geo=None, dict_check=dict_oct_check_st,
638
+ std_not_use=[], angle_ref=oct_angle_ref, flag_catoms=False,
639
+ catoms_arr=None, debug=False):
640
+ num_coord_metal, catoms = get_num_coord_metal(file_in, debug=debug)
641
+ if catoms_arr is not None:
642
+ catoms = catoms_arr
643
+ num_coord_metal = len(catoms_arr)
644
+
645
+ oct_angle_devi, oct_dist_del, max_del_sig_angle = [
646
+ -1, -1], [-1, -1, -1, -1], -1
647
+ rmsd_max, atom_dist_max = -1, -1
648
+ catoms_arr = catoms
649
+ dict_orientation = {'devi_linear_max': -1, 'devi_linear_avrg': -1}
650
+ if num_coord_metal >= 6:
651
+ if not rmsd_max == 'lig_mismatch':
652
+ num_coord_metal = 6
653
+ oct_angle_devi, oct_dist_del, max_del_sig_angle, catoms_arr = oct_comp(file_in, angle_ref,
654
+ catoms_arr, debug=debug)
655
+ if file_init_geo is not None:
656
+ rmsd_max, atom_dist_max = ligand_comp_org(
657
+ file_in, file_init_geo, catoms_arr, debug=debug)
658
+ else:
659
+ # num_coord_metal = -1
660
+ rmsd_max, atom_dist_max = -1, -1
661
+ dict_angle_linear, dict_orientation = check_angle_linear(
662
+ file_in, catoms_arr)
663
+ if debug:
664
+ print('-------This is for the linear ligand orientation test-----')
665
+ print(('!!!catoms_arr:', catoms_arr))
666
+ print(('!!!dict_angle_linear', dict_angle_linear))
667
+ print(('!!!dict_orientation', dict_orientation))
668
+ print('---------orientation end.------------')
669
+ dict_oct_info = {}
670
+ dict_oct_info['num_coord_metal'] = num_coord_metal
671
+ dict_oct_info['rmsd_max'] = rmsd_max
672
+ dict_oct_info['atom_dist_max'] = atom_dist_max
673
+ dict_oct_info['oct_angle_devi_max'] = max(oct_angle_devi)
674
+ dict_oct_info['max_del_sig_angle'] = max_del_sig_angle
675
+ dict_oct_info['dist_del_eq'] = oct_dist_del[0]
676
+ dict_oct_info['dist_del_all'] = oct_dist_del[3]
677
+ dict_oct_info.update(dict_orientation)
678
+ flag_oct, flag_list, dict_oct_info = dict_check_processing(dict_oct_info, dict_check,
679
+ std_not_use, num_coord=6,
680
+ debug=debug)
681
+ if not flag_catoms:
682
+ return flag_oct, flag_list, dict_oct_info
683
+ else:
684
+ return flag_oct, flag_list, dict_oct_info, catoms_arr
685
+
686
+
687
+ def IsStructure(file_in, file_init_geo=None, dict_check=dict_oneempty_check_st,
688
+ std_not_use=[], angle_ref=oneempty_angle_ref, num_coord=5,
689
+ flag_catoms=False, debug=False):
690
+ num_coord_metal, catoms = get_num_coord_metal(file_in, debug=debug)
691
+
692
+ struct_angle_devi, struct_dist_del, max_del_sig_angle = [
693
+ -1, -1], [-1, -1, -1, -1], -1
694
+ rmsd_max, atom_dist_max = -1, -1
695
+ dict_orientation = {'devi_linear_max': -1, 'devi_linear_avrg': -1}
696
+ if num_coord_metal >= num_coord:
697
+ struct_angle_devi, struct_dist_del, max_del_sig_angle, catoms_arr = oct_comp(file_in, angle_ref,
698
+ debug=debug)
699
+ if file_init_geo is not None:
700
+ rmsd_max, atom_dist_max = ligand_comp_org(
701
+ file_in, file_init_geo, catoms_arr, debug=debug)
702
+ else:
703
+ rmsd_max, atom_dist_max = -1, -1
704
+ dict_angle_linear, dict_orientation = check_angle_linear(
705
+ file_in, catoms_arr)
706
+ if debug:
707
+ print('-------This is for the linear ligand orientation test-----')
708
+ print(('!!!catoms_arr:', catoms_arr))
709
+ print(('!!!dict_angle_linear', dict_angle_linear))
710
+ print(('!!!dict_orientation', dict_orientation))
711
+ print('---------orientation end.------------')
712
+ dict_struct_info = {}
713
+ dict_struct_info['num_coord_metal'] = num_coord_metal
714
+ dict_struct_info['rmsd_max'] = rmsd_max
715
+ dict_struct_info['atom_dist_max'] = atom_dist_max
716
+ dict_struct_info['oct_angle_devi_max'] = max(struct_angle_devi)
717
+ dict_struct_info['max_del_sig_angle'] = max_del_sig_angle
718
+ dict_struct_info['dist_del_eq'] = struct_dist_del[0]
719
+ dict_struct_info['dist_del_all'] = struct_dist_del[3]
720
+ dict_struct_info.update(dict_orientation)
721
+ flag_struct, flag_list, dict_struct_info = dict_check_processing(dict_struct_info, dict_check,
722
+ std_not_use, num_coord=num_coord,
723
+ debug=debug)
724
+ if not flag_catoms:
725
+ return flag_struct, flag_list, dict_struct_info
726
+ else:
727
+ return flag_struct, flag_list, dict_struct_info, catoms_arr
728
+
729
+
730
+ # input: _path: path for opt geo
731
+ # path_init_geo: path for init geo
732
+ # output: list of info: ['unique_num', 'oxstate', 'spinmult', 'flag_oct', 'flag_list', 'dict_oct_info']
733
+ def loop_structure(_path, path_init_geo):
734
+ charac = ['unique_num', 'oxstate', 'spinmult', 'flag_oct', 'flag_list']
735
+ info_tot = []
736
+ for dirpath, dirs, files in sorted(os.walk(_path)):
737
+ for name in sorted(files):
738
+ if name.split('.')[1] == 'xyz':
739
+ unique_num, oxstate, spinmult = name.split('_')[0], name.split('_')[
740
+ 4][1:], name.split('_')[5][2:]
741
+ print((unique_num, oxstate, spinmult))
742
+ file_in = '%s/%s' % (dirpath, name)
743
+ # ---You may add the function to find initial geo here.
744
+ file_init_geo = find_file_with_unique_num(
745
+ path_init_geo, unique_num)
746
+ # file_init_geo = gen_file_with_name(path_init_geo, name)
747
+ print(('!!!!file info:!!!!!', file_in, file_init_geo))
748
+ if os.path.exists(file_init_geo):
749
+ flag_oct, flag_list, dict_oct_info = IsOct(
750
+ file_in, file_init_geo)
751
+ else:
752
+ print(('No init_geo!', name))
753
+ flag_oct, flag_list, dict_oct_info = IsOct(file_in)
754
+ # dict_oct_info = json.dumps(dict_oct_info) # dictionary to string
755
+ _c, _dict = [], []
756
+ for key, value in list(dict_oct_info.items()):
757
+ _c.append(key)
758
+ _dict.append(value)
759
+ info = [unique_num, oxstate, spinmult,
760
+ flag_oct, flag_list] + _dict
761
+ info_tot.append(info)
762
+ charac += _c # append dict_oct_info
763
+ # write_list_2_xlsx(charac, info_tot)
764
+ return charac, info_tot
765
+
766
+
767
+ # find the file name by matching unique_ID and spin mulplicity
768
+ def find_file_with_unique_num(_path, unique_num):
769
+ filename = None
770
+ for dirpath, dirs, files in sorted(os.walk(_path)):
771
+ for name in sorted(files):
772
+ if name.split('_')[0] == str(unique_num):
773
+ filename = '%s/%s' % (dirpath, name)
774
+ break
775
+ return filename
776
+
777
+
778
+ # Only use this function when they have roughly have the same naming.
779
+ def gen_file_with_name(path_init_geo, name_opt):
780
+ name_opt = name_opt.split('_')
781
+ name_opt = '_'.join(name_opt[:len(name_opt) - 1])
782
+ name_init = '%s/%s_mols.xyz' % (path_init_geo, name_opt) # noqa F841 (WIP)