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,1224 @@
1
+ # @file geometry.py
2
+ # Contains many useful 3D Euclidean geometric manipulation routines.
3
+ #
4
+ # Unless otherwise stated, all "points" refer to 3-element lists.
5
+ #
6
+ # Written by Kulik Group
7
+ #
8
+ # Department of Chemical Engineering, MIT
9
+
10
+ import numpy as np
11
+ from typing import List
12
+
13
+
14
+ def norm(u):
15
+ """Get euclidean norm of vector.
16
+
17
+ Parameters
18
+ ----------
19
+ u : list
20
+ Vector of interest.
21
+
22
+ Returns
23
+ -------
24
+ norm : float
25
+ Norm of u.
26
+
27
+ """
28
+ d = 0.0
29
+ for u0 in u:
30
+ d += (u0 * u0)
31
+ d = np.sqrt(d)
32
+ return d
33
+
34
+
35
+ def normalize(u):
36
+ """Normalize a vector.
37
+
38
+ Parameters
39
+ ----------
40
+ u : list
41
+ Vector of interest.
42
+
43
+ Returns
44
+ -------
45
+ norm_vect : list
46
+ Normalized vector.
47
+
48
+ """
49
+ d = norm(u)
50
+ un = []
51
+ if d > 1.0e-13:
52
+ [un.append(ui / d) for ui in u]
53
+ return un
54
+
55
+
56
+ def distance(r1, r2):
57
+ """Euclidean distance between points.
58
+
59
+ Parameters
60
+ ----------
61
+ r1 : list
62
+ Coordinates of point 1.
63
+ r2 : list
64
+ Coordinates of point 2.
65
+
66
+ Returns
67
+ -------
68
+ dist : float
69
+ Euclidean distance between points 1 and 2.
70
+
71
+ """
72
+ dx = r1[0] - r2[0]
73
+ dy = r1[1] - r2[1]
74
+ dz = r1[2] - r2[2]
75
+ d = np.sqrt(dx ** 2 + dy ** 2 + dz ** 2)
76
+ return d
77
+
78
+
79
+ def vecdiff(r1, r2):
80
+ """Element-wise vector difference
81
+
82
+ Parameters
83
+ ----------
84
+ r1 : list
85
+ Vector 1.
86
+ r2 : list
87
+ Vector 2.
88
+
89
+ Returns
90
+ -------
91
+ diff : list
92
+ Vector difference between points 1 and 2.
93
+
94
+ """
95
+ dr = [a - b for a, b in zip(r1, r2)]
96
+ return dr
97
+
98
+
99
+ def midpt(r1, r2):
100
+ """Vector midpoint.
101
+
102
+ Parameters
103
+ ----------
104
+ r1 : list
105
+ Vector 1.
106
+ r2 : list
107
+ Vector 2.
108
+
109
+ Returns
110
+ -------
111
+ mid : list
112
+ Midpoint between vector 1 and 2.
113
+
114
+ """
115
+ m = [0.5 * (a + b) for a, b in zip(r1, r2)]
116
+ return m
117
+
118
+
119
+ def checkcolinear(r1, r2, r3):
120
+ """Checks if three points are collinear.
121
+
122
+ Parameters
123
+ ----------
124
+ r1 : list
125
+ Coordinates of point 1.
126
+ r2 : list
127
+ Coordinates of point 2.
128
+ r3 : list
129
+ Coordinates of point 3.
130
+
131
+ Returns
132
+ -------
133
+ collinear_flag : bool
134
+ Flag for collinearity. True if collinear.
135
+
136
+ """
137
+ dr1 = vecdiff(r2, r1)
138
+ dr2 = vecdiff(r1, r3)
139
+ dd = np.cross(np.array(dr1), np.array(dr2))
140
+ if norm(dd) < 1.e-01:
141
+ return True
142
+ else:
143
+ return False
144
+
145
+
146
+ def checkplanar(r1, r2, r3, r4):
147
+ """Checks if four points are coplanar.
148
+
149
+ Parameters
150
+ ----------
151
+ r1 : list
152
+ Coordinates of point 1.
153
+ r2 : list
154
+ Coordinates of point 2.
155
+ r3 : list
156
+ Coordinates of point 3.
157
+ r4 : list
158
+ Coordinates of point 4.
159
+
160
+ Returns
161
+ -------
162
+ coplanar_flag : bool
163
+ Flag for coplanarity. True if coplanarity.
164
+
165
+ """
166
+ r31 = vecdiff(r3, r1)
167
+ r21 = vecdiff(r2, r1)
168
+ r43 = vecdiff(r4, r3)
169
+ cr0 = np.cross(np.array(r21), np.array(r43))
170
+ dd = np.dot(r31, cr0)
171
+ if abs(dd) < 1.e-1:
172
+ return True
173
+ else:
174
+ return False
175
+
176
+
177
+ def vecangle(r1, r2):
178
+ """Computes angle between two vectors.
179
+
180
+ Parameters
181
+ ----------
182
+ r1 : list
183
+ Vector 1.
184
+ r2 : list
185
+ Vector 2.
186
+
187
+ Returns
188
+ -------
189
+ theta : float
190
+ Angle between two vectors in degrees.
191
+
192
+ """
193
+ if (norm(r2) * norm(r1) > 1e-16):
194
+ inner_prod = np.round(np.dot(r2, r1) / (norm(r2) * norm(r1)), 10)
195
+ theta = 180 * np.arccos(inner_prod) / np.pi
196
+ else:
197
+ theta = 0.0
198
+ return theta
199
+
200
+
201
+ def getPointu(Rr, dist, u):
202
+ """Gets point given reference point, direction vector and distance.
203
+
204
+ Parameters
205
+ ----------
206
+ Rr : list
207
+ Reference point.
208
+ dist : float
209
+ Distance in angstroms.
210
+ u : list
211
+ Direction vector.
212
+
213
+ Returns
214
+ -------
215
+ P : list
216
+ Final point.
217
+
218
+ """
219
+ # get float bond length
220
+ bl = float(dist)
221
+ # get unit vector through line r = r0 + t*u
222
+ t = bl / norm(u) # get t as t=bl/norm(r1-r0)
223
+ # get point
224
+ P = [0, 0, 0]
225
+ P[0] = t * u[0] + Rr[0]
226
+ P[1] = t * u[1] + Rr[1]
227
+ P[2] = t * u[2] + Rr[2]
228
+ return P
229
+
230
+
231
+ def rotation_params(r0, r1, r2):
232
+ """Gets angle between three points (r10 and r21) and the normal vector to the plane containing three points.
233
+
234
+ Parameters
235
+ ----------
236
+ r0 : list
237
+ Coordinates for point 1.
238
+ r1 : list
239
+ Coordinates for point 2.
240
+ r2 : list
241
+ Coordinates for point 3.
242
+
243
+ Returns
244
+ -------
245
+ theta : float
246
+ Angle in units of degrees.
247
+ u : list
248
+ Normal vector.
249
+
250
+ """
251
+ r10 = [a - b for a, b in zip(r1, r0)]
252
+ r21 = [a - b for a, b in zip(r2, r1)]
253
+ # print('r10 is ' +str(r10) )
254
+ # print('r21 is ' +str(r21) )
255
+ # angle between r10 and r21
256
+ # print('arg to arcos is ' +str(np.dot(r21,r10)/(norm(r21)*norm(r10))) )
257
+ arg = np.dot(r21, r10) / (norm(r21) * norm(r10))
258
+ if (norm(r21) * norm(r10) > 1e-16):
259
+ if arg < 0:
260
+ theta = 180 * np.arccos(max(-1, arg)) / np.pi
261
+ else:
262
+ theta = 180 * np.arccos(min(1, arg)) / np.pi
263
+ else:
264
+ theta = 0.0
265
+ # get normal vector to plane r0 r1 r2
266
+ u = np.cross(r21, r10)
267
+ # check for collinear case
268
+ if norm(u) < 1e-16:
269
+ # pick random perpendicular vector
270
+ if (abs(r21[0]) > 1e-16):
271
+ u = [(-r21[1] - r21[2]) / r21[0], 1, 1]
272
+ elif (abs(r21[1]) > 1e-16):
273
+ u = [1, (-r21[0] - r21[2]) / r21[1], 1]
274
+ elif (abs(r21[2]) > 1e-16):
275
+ u = [1, 1, (-r21[0] - r21[1]) / r21[2]]
276
+ return theta, u
277
+
278
+
279
+ def dihedral(mol, idx1, idx2, idx3, idx4):
280
+ """Computes dihedral angle for a set of four atom indices.
281
+
282
+ Parameters
283
+ ----------
284
+ mol0 : mol3D
285
+ mol3D class instance of molecule for which we compute dihedral angle.
286
+ idx1 : int
287
+ Index of atom 1.
288
+ idx2 : int
289
+ Index of atom 2.
290
+ idx3 : int
291
+ Index of atom 3.
292
+ idx4 : int
293
+ Index of atom 4.
294
+ """
295
+
296
+ r1 = mol.getAtom(idx1).coords()
297
+ r2 = mol.getAtom(idx2).coords()
298
+ r3 = mol.getAtom(idx3).coords()
299
+ r4 = mol.getAtom(idx4).coords()
300
+
301
+ v1 = np.array(r2)-np.array(r1) # vector formed between atoms 1 and 2
302
+ v2 = np.array(r3)-np.array(r2) # vector formed between atoms 2 and 3
303
+ v3 = np.array(r4)-np.array(r3) # vector formed between atoms 3 and 4
304
+
305
+ v1_x_v2 = np.cross(v1, v2) # cross product of v1 and v2
306
+ v2_x_v3 = np.cross(v2, v3) # cross product of v2 and v3
307
+
308
+ normal_1 = v1_x_v2/(np.linalg.norm(v1_x_v2)) # normal to the plane formed by 1,2,3
309
+ normal_2 = v2_x_v3/(np.linalg.norm(v2_x_v3)) # normal to the plane formed by 2,3,4
310
+
311
+ unit_1 = v2/(np.linalg.norm(v2))
312
+ unit_2 = np.cross(unit_1, normal_2)
313
+
314
+ cos_angle = np.dot(normal_1, normal_2)
315
+ sine_angle = np.dot(normal_1, unit_2)
316
+
317
+ dihedral_angle = round(np.degrees(-np.arctan2(sine_angle, cos_angle)), 3)
318
+ return dihedral_angle
319
+
320
+
321
+ def kabsch(mol0, mol1):
322
+ """Aligns (translates and rotates) two molecules to minimize RMSD using the Kabsch algorithm.
323
+
324
+ Parameters
325
+ ----------
326
+ mol0 : mol3D
327
+ mol3D class instance of molecule to be aligned. Will be translated and rotated.
328
+ mol1 : mol3D
329
+ mol3D class instance of reference molecule. Will be translated.
330
+
331
+ Returns
332
+ -------
333
+ mol0 : mol3D
334
+ mol3D class instance of aligned molecule.
335
+ U : list
336
+ Rotation matrix as list of lists.
337
+ d0 : list
338
+ Translation vector for mol0.
339
+ d1 : list
340
+ Translation vector for mol1.
341
+
342
+ """
343
+ if (mol0.getNumAtoms() != mol1.getNumAtoms()):
344
+ print(f'issue: {mol0.getNumAtoms()} != {mol1.getNumAtoms()}')
345
+ raise ValueError('The two molecules should have the same number of atoms.')
346
+
347
+ # translate to align centroids with origin
348
+ mol0, d0 = setPdistance(mol0, mol0.centersym(), [0, 0, 0], 0)
349
+ mol1, d1 = setPdistance(mol1, mol1.centersym(), [0, 0, 0], 0)
350
+ # get coordinates and matrices P,Q
351
+ P, Q = [], []
352
+ for atom0, atom1 in zip(mol0.getAtoms(), mol1.getAtoms()):
353
+ P.append(atom0.coords())
354
+ Q.append(atom1.coords())
355
+ # Computation of the covariance matrix
356
+ C = np.dot(np.transpose(P), Q)
357
+ # Computation of the optimal rotation matrix
358
+ # This can be done using singular value decomposition (SVD)
359
+ # Getting the sign of the det(V)*(W) to decide
360
+ # whether we need to correct our rotation matrix to ensure a
361
+ # right-handed coordinate system.
362
+ # And finally calculating the optimal rotation matrix U
363
+ # see http://en.wikipedia.org/wiki/Kabsch_algorithm
364
+ V, S, W = np.linalg.svd(C)
365
+ d = (np.linalg.det(V) * np.linalg.det(W)) < 0.0
366
+ # Create Rotation matrix U
367
+ if d:
368
+ S[-1] = -S[-1]
369
+ V[:, -1] = -V[:, -1]
370
+ U = np.dot(V, W)
371
+ # Rotate P
372
+ P = np.dot(P, U)
373
+ # write back coordinates
374
+ for i, atom in enumerate(mol0.getAtoms()):
375
+ atom.setcoords(P[i])
376
+ return mol0, U.tolist(), d0, d1
377
+
378
+
379
+ def ReflectPlane(u, r, Rp):
380
+ """Reflects point about plane defined by its normal vector and a point on the plane
381
+
382
+ Parameters
383
+ ----------
384
+ u : list
385
+ Normal vector to plane.
386
+ r : list
387
+ Point to be reflected.
388
+ Rp : list
389
+ Reference point on plane.
390
+
391
+ Returns
392
+ -------
393
+ rn : list
394
+ Reflected point.
395
+
396
+ """
397
+ un = norm(u)
398
+ if (un > 1e-16):
399
+ u[0] = u[0] / un
400
+ u[1] = u[1] / un
401
+ u[2] = u[2] / un
402
+ # construct augmented vector rr = [r;1]
403
+ d = -u[0] * Rp[0] - u[1] * Rp[1] - u[2] * Rp[2]
404
+ # reflection matrix
405
+ R = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
406
+ rn = [0, 0, 0]
407
+ R[0][0] = 1 - 2 * u[0] * u[0]
408
+ R[0][1] = -2 * u[0] * u[1]
409
+ R[0][2] = -2 * u[0] * u[2]
410
+ R[0][3] = -2 * u[0] * d
411
+ R[1][0] = -2 * u[1] * u[0]
412
+ R[1][1] = 1 - 2 * u[1] * u[1]
413
+ R[1][2] = -2 * u[1] * u[2]
414
+ R[1][3] = -2 * u[1] * d
415
+ R[2][0] = -2 * u[2] * u[0]
416
+ R[2][1] = -2 * u[1] * u[2]
417
+ R[2][2] = 1 - 2 * u[2] * u[2]
418
+ R[2][3] = -2 * u[2] * d
419
+ R[3][3] = 1
420
+ # get new point
421
+ rn[0] = R[0][0] * r[0] + R[0][1] * r[1] + R[0][2] * r[2] + R[0][3]
422
+ rn[1] = R[1][0] * r[0] + R[1][1] * r[1] + R[1][2] * r[2] + R[1][3]
423
+ rn[2] = R[2][0] * r[0] + R[2][1] * r[1] + R[2][2] * r[2] + R[2][3]
424
+ return rn
425
+
426
+
427
+ def PointRotateAxis(u, rp, r, theta):
428
+ """Rotates point about axis defined by direction vector and point on axis. Theta units in radians.
429
+
430
+ Parameters
431
+ ----------
432
+ u : list
433
+ Direction vector of axis.
434
+ rp : list
435
+ Reference point along axis
436
+ r : list
437
+ Point to be rotated
438
+ theta : float
439
+ Angle of rotation in RADIANS.
440
+
441
+ Returns
442
+ -------
443
+ rotated : list
444
+ Rotated point.
445
+
446
+ """
447
+ # construct augmented vector rr = [r;1]
448
+ rr = r
449
+ rr.append(1)
450
+ # rotation matrix about arbitrary line through rp
451
+ R = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
452
+ rn = [0, 0, 0]
453
+ R[0][0] = np.cos(theta) + u[0] ** 2 * (1 - np.cos(theta))
454
+ R[0][1] = u[0] * u[1] * (1 - np.cos(theta)) - u[2] * np.sin(theta)
455
+ R[0][2] = u[0] * u[2] * (1 - np.cos(theta)) + u[1] * np.sin(theta)
456
+ R[0][3] = (rp[0] * (u[1] ** 2 + u[2] ** 2) - u[0] *
457
+ (rp[1] * u[1] + rp[2] * u[2])) * (1 - np.cos(theta))
458
+ R[0][3] += (rp[1] * u[2] - rp[2] * u[1]) * np.sin(theta)
459
+ R[1][0] = u[1] * u[0] * (1 - np.cos(theta)) + u[2] * np.sin(theta)
460
+ R[1][1] = np.cos(theta) + u[1] ** 2 * (1 - np.cos(theta))
461
+ R[1][2] = u[1] * u[2] * (1 - np.cos(theta)) - u[0] * np.sin(theta)
462
+ R[1][3] = (rp[1] * (u[0] ** 2 + u[2] ** 2) - u[1] *
463
+ (rp[0] * u[0] + rp[2] * u[2])) * (1 - np.cos(theta))
464
+ R[1][3] += (rp[2] * u[0] - rp[0] * u[2]) * np.sin(theta)
465
+ R[2][0] = u[2] * u[0] * (1 - np.cos(theta)) - u[1] * np.sin(theta)
466
+ R[2][1] = u[2] * u[1] * (1 - np.cos(theta)) + u[0] * np.sin(theta)
467
+ R[2][2] = np.cos(theta) + u[2] ** 2 * (1 - np.cos(theta))
468
+ R[2][3] = (rp[2] * (u[0] ** 2 + u[1] ** 2) - u[2] *
469
+ (rp[0] * u[0] + rp[1] * u[1])) * (1 - np.cos(theta))
470
+ R[2][3] += (rp[0] * u[1] - rp[1] * u[0]) * np.sin(theta)
471
+ R[3][3] = 1
472
+ # get new point
473
+ rn[0] = R[0][0] * r[0] + R[0][1] * r[1] + R[0][2] * r[2] + R[0][3]
474
+ rn[1] = R[1][0] * r[0] + R[1][1] * r[1] + R[1][2] * r[2] + R[1][3]
475
+ rn[2] = R[2][0] * r[0] + R[2][1] * r[1] + R[2][2] * r[2] + R[2][3]
476
+ return rn
477
+
478
+
479
+ def PointRotateMat(r, R):
480
+ """Rotates point using arbitrary 3x3 rotation matrix
481
+
482
+ Parameters
483
+ ----------
484
+ r : list
485
+ Point to be rotated
486
+ R : list
487
+ List of lists for 3 by 3 rotation matrix.
488
+
489
+ Returns
490
+ -------
491
+ rotated : list
492
+ Rotated point.
493
+
494
+ """
495
+ rn = [0, 0, 0]
496
+ rn[0] = R[0][0] * r[0] + R[1][0] * r[1] + R[2][0] * r[2]
497
+ rn[1] = R[0][1] * r[0] + R[1][1] * r[1] + R[2][1] * r[2]
498
+ rn[2] = R[0][2] * r[0] + R[1][2] * r[1] + R[2][2] * r[2]
499
+ return rn
500
+
501
+
502
+ def PointTranslateSph(Rp, p0, D) -> List[float]:
503
+ """Translates point in spherical coordinates.
504
+
505
+ Parameters
506
+ ----------
507
+ Rp : list
508
+ Origin of sphere
509
+ p0 : list
510
+ Point to be translated
511
+ D : list
512
+ [final radial distance, change in polar phi, change in azimuthal theta]. Angles in RADIANS.
513
+
514
+ Returns
515
+ -------
516
+ p : list
517
+ Translated point.
518
+
519
+ """
520
+ # translate to origin
521
+ ps = [0., 0., 0.]
522
+ ps[0] = p0[0] - Rp[0]
523
+ ps[1] = p0[1] - Rp[1]
524
+ ps[2] = p0[2] - Rp[2]
525
+ # get initial spherical coords
526
+ r0 = norm(ps)
527
+ if (r0 < 1e-16):
528
+ phi0 = 0.5 * np.pi
529
+ theta0 = 0.
530
+ else:
531
+ phi0 = np.arccos(ps[2] / r0) # z/r
532
+ theta0 = np.arctan2(ps[1], ps[0]) # y/x
533
+ # get new point
534
+ p = [0., 0., 0.]
535
+ p[0] = (D[0]) * np.sin(phi0 + D[2]) * np.cos(theta0 + D[1]) + Rp[0]
536
+ p[1] = (D[0]) * np.sin(phi0 + D[2]) * np.sin(theta0 + D[1]) + Rp[1]
537
+ p[2] = (D[0]) * np.cos(phi0 + D[2]) + Rp[2]
538
+ return p
539
+
540
+
541
+ def PointTranslateSphgivenphi(Rp, p0, D):
542
+ """Translates point in spherical coordinates. Redundant with PointTranslateSph. Will be deprecated.
543
+
544
+ Parameters
545
+ ----------
546
+ Rp : list
547
+ Origin of sphere
548
+ p0 : list
549
+ Point to be translated
550
+ D : list
551
+ [final radial distance, change in polar phi, change in azimuthal theta]. Angles in RADIANS.
552
+
553
+ Returns
554
+ -------
555
+ p : list
556
+ Translated point.
557
+
558
+ """
559
+ # translate to origin
560
+ ps = [0, 0, 0]
561
+ ps[0] = p0[0] - Rp[0]
562
+ ps[1] = p0[1] - Rp[1]
563
+ ps[2] = p0[2] - Rp[2]
564
+ # get initial spherical coords
565
+ r0 = norm(ps)
566
+ if (r0 < 1e-16):
567
+ phi0 = 0.5 * np.pi
568
+ theta0 = 0
569
+ else:
570
+ phi0 = np.arccos(ps[2] / r0) # z/r
571
+ theta0 = np.arctan2(ps[1], ps[0]) # y/x
572
+ # get new point
573
+ p = [0, 0, 0]
574
+ p[0] = (D[0]) * np.sin(phi0 + D[1]) * np.cos(theta0) + Rp[0]
575
+ p[1] = (D[0]) * np.sin(phi0 + D[1]) * np.sin(theta0) + Rp[1]
576
+ p[2] = (D[0]) * np.cos(phi0 + D[1]) + Rp[2]
577
+ return p
578
+
579
+
580
+ def PointTranslateSphgivenr(Rp, p0, D, pref, r):
581
+ """Translates point in spherical coordinates given R.
582
+
583
+ Parameters
584
+ ----------
585
+ Rp : list
586
+ Origin of sphere
587
+ p0 : list
588
+ Point to be translated
589
+ D : list
590
+ [final radial distance, change in polar phi, change in azimuthal theta]. Angles in RADIANS.
591
+ pref : list
592
+ Coordinates of reference point.
593
+ r : float
594
+ Given radius.
595
+
596
+ Returns
597
+ -------
598
+ p : list
599
+ Translated point.
600
+
601
+ """
602
+ # translate to origin
603
+ ps = [0, 0, 0]
604
+ ps[0] = p0[0] - Rp[0]
605
+ ps[1] = p0[1] - Rp[1]
606
+ ps[2] = p0[2] - Rp[2]
607
+ # get initial spherical coords
608
+ r0 = norm(ps)
609
+ if (r0 < 1e-16):
610
+ phi0 = 0.5 * np.pi
611
+ theta0 = 0
612
+ else:
613
+ phi0 = np.arccos(ps[2] / r0) # z/r
614
+ theta0 = np.arctan2(ps[1], ps[0]) # y/x
615
+ # get new point
616
+ p = [0, 0, 0]
617
+ r0 = 0
618
+ theta0 = 0
619
+ while abs(1 - r0 / r) > 0.01 and theta0 < 2 * np.pi:
620
+ p[0] = (D[0]) * np.sin(phi0 + D[1]) * np.cos(theta0) + Rp[0]
621
+ p[1] = (D[0]) * np.sin(phi0 + D[1]) * np.sin(theta0) + Rp[1]
622
+ p[2] = (D[0]) * np.cos(phi0 + D[1]) + Rp[2]
623
+ r0 = distance(p, pref)
624
+ theta0 += 0.01
625
+ return p
626
+
627
+
628
+ def PointTranslatetoPSph(Rp, p0, D):
629
+ """Converts spherical translation vector into Cartesian translation vector
630
+
631
+ Parameters
632
+ ----------
633
+ Rp : list
634
+ Origin of sphere
635
+ p0 : list
636
+ Point to be translated
637
+ D : list
638
+ [final radial distance, change in polar phi, change in azimuthal theta]. Angles in RADIANS.
639
+
640
+ Returns
641
+ -------
642
+ p : list
643
+ Translation vector
644
+
645
+ """
646
+ # translate to origin
647
+ ps = [0, 0, 0]
648
+ ps[0] = p0[0] - Rp[0]
649
+ ps[1] = p0[1] - Rp[1]
650
+ ps[2] = p0[2] - Rp[2]
651
+ # get current spherical coords
652
+ r0 = norm(ps)
653
+ if (r0 < 1e-16):
654
+ phi0 = 0.5 * np.pi
655
+ theta0 = 0
656
+ else:
657
+ phi0 = np.arccos(ps[2] / r0) # z/r
658
+ theta0 = np.arctan2(ps[1], ps[0]) # y/x
659
+ # get translation vector
660
+ p = [0, 0, 0]
661
+ p[0] = D[0] * np.sin(phi0 + D[2]) * np.cos(theta0 + D[1])
662
+ p[1] = D[0] * np.sin(phi0 + D[2]) * np.sin(theta0 + D[1])
663
+ p[2] = D[0] * np.cos(phi0 + D[2])
664
+ return p
665
+
666
+
667
+ def PointRotateSph(Rp, p0, D):
668
+ """Rotates point about Cartesian axes defined relative to given origin.
669
+
670
+ Parameters
671
+ ----------
672
+ Rp : list
673
+ Cartesian origin
674
+ p0 : list
675
+ Point to be rotated
676
+ D : list
677
+ [theta-x, theta-y, theta-z] in RADIANS
678
+
679
+ Returns
680
+ -------
681
+ p : list
682
+ Rotated point
683
+
684
+ """
685
+ # translate to origin (reference)
686
+ ps = [0, 0, 0]
687
+ ps[0] = p0[0] - Rp[0]
688
+ ps[1] = p0[1] - Rp[1]
689
+ ps[2] = p0[2] - Rp[2]
690
+ # build 3D rotation matrices about x,y,z axes
691
+ Mx = [[1, 0, 0], [0, np.cos(D[0]), -np.sin(D[0])], [0, np.sin(D[0]), np.cos(D[0])]]
692
+ My = [[np.cos(D[1]), 0, np.sin(D[1])], [0, 1, 0], [-np.sin(D[1]), 0, np.cos(D[1])]]
693
+ Mz = [[np.cos(D[2]), -np.sin(D[2]), 0], [np.sin(D[2]), np.cos(D[2]), 0], [0, 0, 1]]
694
+ # get full rotation matrix
695
+ M = np.array(np.mat(Mx) * np.mat(My) * np.mat(Mz))
696
+ p = [0.0, 0.0, 0.0]
697
+ # rotate atom and translate it back from origin
698
+ p[0] = M[0][0] * ps[0] + M[0][1] * ps[1] + M[0][2] * ps[2] + Rp[0]
699
+ p[1] = M[1][0] * ps[0] + M[1][1] * ps[1] + M[1][2] * ps[2] + Rp[1]
700
+ p[2] = M[2][0] * ps[0] + M[2][1] * ps[1] + M[2][2] * ps[2] + Rp[2]
701
+ return p
702
+
703
+
704
+ def reflect_through_plane(mol, u, Rp):
705
+ """Reflects molecule about plane defined by its normal vector and a point on the plane.
706
+ Loops over ReflectPlane().
707
+
708
+ Parameters
709
+ ----------
710
+ mol : mol3D
711
+ mol3D class instance of molecule to be reflected.
712
+ u : list
713
+ Normal vector to plane.
714
+ Rp : list
715
+ Reference point on plane.
716
+
717
+ Returns
718
+ -------
719
+ mol : mol3D
720
+ mol3D class instance of reflected molecule.
721
+
722
+ """
723
+ un = norm(u)
724
+ if (un > 1e-16):
725
+ u[0] = u[0] / un
726
+ u[1] = u[1] / un
727
+ u[2] = u[2] / un
728
+ for atom in mol.atoms:
729
+ # Get new point after rotation
730
+ Rt = ReflectPlane(u, atom.coords(), Rp)
731
+ atom.setcoords(Rt)
732
+ return mol
733
+
734
+
735
+ def rotate_around_axis(mol, Rp, u, theta):
736
+ """Rotates molecule about axis defined by direction vector and point on axis.
737
+ Loops over PointRotateAxis().
738
+
739
+ Parameters
740
+ ----------
741
+ mol : mol3D
742
+ mol3D class instance of molecule to be rotated.
743
+ Rp : list
744
+ Reference point along axis.
745
+ u : list
746
+ Direction vector of axis.
747
+ theta : float
748
+ Angle of rotation in DEGREES.
749
+
750
+ Returns
751
+ -------
752
+ mol : mol3D
753
+ mol3D class instance of rotated molecule.
754
+
755
+ """
756
+ un = norm(u)
757
+ theta = (theta / 180.0) * np.pi
758
+ if (un > 1e-16):
759
+ u[0] = u[0] / un
760
+ u[1] = u[1] / un
761
+ u[2] = u[2] / un
762
+ for atom in mol.atoms:
763
+ # Get new point after rotation
764
+ Rt = PointRotateAxis(u, Rp, atom.coords(), theta)
765
+ atom.setcoords(Rt)
766
+ return mol
767
+
768
+
769
+ def rotate_mat(mol, R):
770
+ """Rotates molecule using arbitrary rotation matrix.
771
+ Loops over PointRotateMat().
772
+
773
+ Parameters
774
+ ----------
775
+ mol : mol3D
776
+ mol3D class instance of molecule to be rotated.
777
+ R : list
778
+ List of lists containing rotation matrix.
779
+
780
+ Returns
781
+ -------
782
+ mol : mol3D
783
+ mol3D class instance of rotated molecule.
784
+
785
+ """
786
+ for atom in mol.atoms:
787
+ # Get new point after rotation
788
+ Rt = PointRotateMat(atom.coords(), R)
789
+ atom.setcoords(Rt)
790
+ return mol
791
+
792
+
793
+ def setPdistance(mol, Rr, Rp, bond):
794
+ """Translates molecule such that a given point in the molecule is at a given distance from a reference point.
795
+ The molecule is moved along the axis given by the two points.
796
+
797
+ Parameters
798
+ ----------
799
+ mol : mol3D
800
+ mol3D class instance of molecule to be translated.
801
+ Rr : list
802
+ Point in molecule to be aligned.
803
+ Rp : list
804
+ Reference alignment point.
805
+ bond : float
806
+ Final distance of aligned point to alignment point
807
+
808
+ Returns
809
+ -------
810
+ mol : mol3D
811
+ mol3D class instance of translated molecule.
812
+ dxyz : np.array
813
+ The translation vector.
814
+
815
+ """
816
+ # get float bond length
817
+ bl = float(bond)
818
+ # get center of mass
819
+ # get unit vector through line r = r0 + t*u
820
+ dxyz = [0, 0, 0]
821
+ try:
822
+ u = [a - b for a, b in zip(Rr, Rp)]
823
+ t = bl / norm(u) # get t as t=bl/norm(r1-r0)
824
+ # get shift for centermass
825
+ dxyz[0] = Rp[0] + t * u[0] - Rr[0]
826
+ dxyz[1] = Rp[1] + t * u[1] - Rr[1]
827
+ dxyz[2] = Rp[2] + t * u[2] - Rr[2]
828
+ except ZeroDivisionError:
829
+ pass
830
+ # translate molecule
831
+ mol.translate(dxyz)
832
+ return mol, dxyz
833
+
834
+
835
+ def setPdistanceu(mol, Rr, Rp, bond, u):
836
+ """Translates molecule such that a given point in the molecule is at a given distance from a reference point.
837
+ The molecule is moved along an arbitrary axis.
838
+
839
+ Parameters
840
+ ----------
841
+ mol : mol3D
842
+ mol3D class instance of molecule to be translated.
843
+ Rr : list
844
+ Point in molecule to be aligned.
845
+ Rp : list
846
+ Reference alignment point.
847
+ bond : float
848
+ Final distance of aligned point to alignment point
849
+ u : list
850
+ Direction vector of axis
851
+
852
+ Returns
853
+ -------
854
+ mol : mol3D
855
+ mol3D class instance of translated molecule.
856
+
857
+ """
858
+ # get float bond length
859
+ bl = float(bond)
860
+ # get unit vector through line r = r0 + t*u
861
+ t = bl / norm(u) # get t as t=bl/norm(r1-r0)
862
+ # get shift for centermass
863
+ dxyz = [0, 0, 0]
864
+ dxyz[0] = Rp[0] + t * u[0] - Rr[0]
865
+ dxyz[1] = Rp[1] + t * u[1] - Rr[1]
866
+ dxyz[2] = Rp[2] + t * u[2] - Rr[2]
867
+ # translate molecule
868
+ mol.translate(dxyz)
869
+ return mol
870
+
871
+
872
+ def setcmdistance(mol, Rp, bond):
873
+ """Translates molecule such that its center of mass is at a given distance from a reference point.
874
+ The molecule is moved along the axis given by the two points.
875
+
876
+ Parameters
877
+ ----------
878
+ mol : mol3D
879
+ mol3D class instance of molecule to be translated.
880
+ Rp : list
881
+ Reference alignment point.
882
+ bond : float
883
+ Final distance of aligned point to alignment point
884
+
885
+ Returns
886
+ -------
887
+ mol : mol3D
888
+ mol3D class instance of translated molecule.
889
+
890
+ """
891
+ # get float bond length
892
+ bl = float(bond)
893
+ # get center of mass
894
+ cm = mol.centermass()
895
+ # get unit vector through line r = r0 + t*u
896
+ u = [a - b for a, b in zip(cm, Rp)]
897
+ t = bl / norm(u) # get t as t=bl/norm(r1-r0)
898
+ # get shift for centermass
899
+ dxyz = [0, 0, 0]
900
+ dxyz[0] = Rp[0] + t * u[0] - cm[0]
901
+ dxyz[1] = Rp[1] + t * u[1] - cm[1]
902
+ dxyz[2] = Rp[2] + t * u[2] - cm[2]
903
+ # translate molecule
904
+ mol.translate(dxyz)
905
+ return mol
906
+
907
+
908
+ def protate(mol, Rr, D):
909
+ """Translates molecule in spherical coordinates based on center of mass reference.
910
+ Loops over PointTranslateSph().
911
+
912
+ Parameters
913
+ ----------
914
+ mol : mol3D
915
+ mol3D class instance of molecule to be translated.
916
+ Rr : list
917
+ Origin of sphere.
918
+ D : list
919
+ [final radial distance, change in polar phi, change in azimuthal theta] in RADIANS
920
+
921
+ Returns
922
+ -------
923
+ mol : mol3D
924
+ mol3D class instance of translated molecule.
925
+
926
+ """
927
+ # convert to rad
928
+ D[0] = float(D[0])
929
+ D[1] = (float(D[1]) / 180.0) * np.pi
930
+ D[2] = (float(D[2]) / 180.0) * np.pi
931
+ # rotate/translate about reference point
932
+ # get center of mass
933
+ pmc = mol.centermass()
934
+ # get translation vector that corresponds to new coords
935
+ Rt = PointTranslateSph(Rr, pmc, D)
936
+ # translate molecule
937
+ mol.translate(Rt)
938
+ return mol
939
+
940
+
941
+ def protateref(mol, Rr, Rref, D):
942
+ """Translates molecule in spherical coordinates based on arbitrary reference.
943
+ Loops over PointTranslateSph().
944
+
945
+ Parameters
946
+ ----------
947
+ mol : mol3D
948
+ mol3D class instance of molecule to be translated.
949
+ Rr : list
950
+ Origin of sphere.
951
+ Rref : list
952
+ Reference point in molecule
953
+ D : list
954
+ [final radial distance, change in polar phi, change in azimuthal theta] in RADIANS
955
+
956
+ Returns
957
+ -------
958
+ mol : mol3D
959
+ mol3D class instance of translated molecule.
960
+
961
+ """
962
+ # rotate/translate about reference point
963
+ # convert to rad
964
+ D[0] = float(D[0])
965
+ D[1] = (float(D[1]) / 180.0) * np.pi
966
+ D[2] = (float(D[2]) / 180.0) * np.pi
967
+ # rotate/translate about reference point
968
+ # get translation vector that corresponds to new coords
969
+ Rt = PointTranslateSph(Rr, Rref, D)
970
+ # translate molecule
971
+ mol.translate(Rt)
972
+ return mol
973
+
974
+
975
+ def cmrotate(mol, D):
976
+ """Rotates molecule about its center of mass
977
+ Loops over PointRotateSph().
978
+
979
+ Parameters
980
+ ----------
981
+ mol : mol3D
982
+ mol3D class instance of molecule to be rotated.
983
+ D : list
984
+ [theta-x, theta-y, theta-z] in RADIANS
985
+
986
+ Returns
987
+ -------
988
+ mol : mol3D
989
+ mol3D class instance of rotated molecule.
990
+
991
+ """
992
+ # convert to rad
993
+ D[0] = (float(D[0]) / 180.0) * np.pi
994
+ D[1] = (float(D[1]) / 180.0) * np.pi
995
+ D[2] = (float(D[2]) / 180.0) * np.pi
996
+ # perform rotation
997
+ pmc = mol.centermass()
998
+ for atom in mol.atoms:
999
+ # Get new point after rotation
1000
+ Rt = PointRotateSph(pmc, atom.coords(), D)
1001
+ atom.setcoords(Rt)
1002
+ return mol
1003
+
1004
+
1005
+ def rotateRef(mol, Ref, D):
1006
+ """Rotates molecule about an arbitrary point
1007
+ Loops over PointRotateSph().
1008
+
1009
+ Parameters
1010
+ ----------
1011
+ mol : mol3D
1012
+ mol3D class instance of molecule to be rotated.
1013
+ Ref : list
1014
+ Reference point
1015
+ D : list
1016
+ [theta-x, theta-y, theta-z] in RADIANS
1017
+
1018
+ Returns
1019
+ -------
1020
+ mol : mol3D
1021
+ mol3D class instance of rotated molecule.
1022
+
1023
+ """
1024
+ # convert to rad
1025
+ D[0] = (float(D[0]) / 180.0) * np.pi
1026
+ D[1] = (float(D[1]) / 180.0) * np.pi
1027
+ D[2] = (float(D[2]) / 180.0) * np.pi
1028
+ # perform rotation
1029
+ for atom in mol.atoms:
1030
+ # Get new point after rotation
1031
+ Rt = PointRotateSph(Ref, atom.coords(), D)
1032
+ atom.setcoords(Rt)
1033
+ return mol
1034
+
1035
+
1036
+ def aligntoaxis(mol, Rr, Rp, u):
1037
+ """Translates molecule to align point to axis at constant distance.
1038
+
1039
+ Parameters
1040
+ ----------
1041
+ mol : mol3D
1042
+ mol3D class instance of molecule to be translated.
1043
+ Rr : list
1044
+ Point to be aligned
1045
+ Rp : list
1046
+ Reference point on axis
1047
+ u : list
1048
+ Target axis for alignment
1049
+
1050
+ Returns
1051
+ -------
1052
+ mol : mol3D
1053
+ mol3D class instance of aligned molecule.
1054
+
1055
+ """
1056
+ # get current distance
1057
+ d0 = distance(Rp, Rr)
1058
+ # normalize u
1059
+ t = d0 / norm(u) # get t as t=bl/norm(r1-r0)
1060
+ # get shift for point
1061
+ dxyz = [0, 0, 0]
1062
+ dxyz[0] = Rp[0] + t * u[0] - Rr[0]
1063
+ dxyz[1] = Rp[1] + t * u[1] - Rr[1]
1064
+ dxyz[2] = Rp[2] + t * u[2] - Rr[2]
1065
+ # translate molecule
1066
+ mol.translate(dxyz)
1067
+ return mol
1068
+
1069
+
1070
+ def aligntoaxis2(mol, Rr, Rp, u, d):
1071
+ """Translates molecule to align point to axis at arbitrary distance
1072
+
1073
+ Parameters
1074
+ ----------
1075
+ mol : mol3D
1076
+ mol3D class instance of molecule to be translated.
1077
+ Rr : list
1078
+ Point to be aligned
1079
+ Rp : list
1080
+ Reference point on axis
1081
+ u : list
1082
+ Target axis for alignment
1083
+ d : float
1084
+ Final distance from aligned point to axis
1085
+
1086
+ Returns
1087
+ -------
1088
+ mol : mol3D
1089
+ mol3D class instance of translated molecule.
1090
+
1091
+ """
1092
+ # normalize u
1093
+ t = d / norm(u) # get t as t=bl/norm(r1-r0)
1094
+ # get shift for point
1095
+ dxyz = [0, 0, 0]
1096
+ dxyz[0] = Rp[0] + t * u[0] - Rr[0]
1097
+ dxyz[1] = Rp[1] + t * u[1] - Rr[1]
1098
+ dxyz[2] = Rp[2] + t * u[2] - Rr[2]
1099
+ # translate molecule
1100
+ mol.translate(dxyz)
1101
+ return mol
1102
+
1103
+
1104
+ def alignPtoaxis(Rr, Rp, u, d):
1105
+ """Translates point and aligns to axis
1106
+
1107
+ Parameters
1108
+ ----------
1109
+ Rr : list
1110
+ Point to be aligned
1111
+ Rp : list
1112
+ Reference point on axis
1113
+ u : list
1114
+ Target axis for alignment. Direction vector.
1115
+ d : float
1116
+ Final distance from aligned point to axis
1117
+
1118
+ Returns
1119
+ -------
1120
+ dxyz : list
1121
+ Translation vector
1122
+
1123
+ """
1124
+ # normalize u
1125
+ t = d / norm(u) # get t as t=bl/norm(r1-r0)
1126
+ # get shift for point
1127
+ dxyz = [0, 0, 0]
1128
+ dxyz[0] = Rp[0] + t * u[0]
1129
+ dxyz[1] = Rp[1] + t * u[1]
1130
+ dxyz[2] = Rp[2] + t * u[2]
1131
+ return dxyz
1132
+
1133
+
1134
+ def pmrotate(mol, Rp, D):
1135
+ """Rotates molecule about Cartesian axes defined relative to given origin.
1136
+ Loops over PointRotateSph().
1137
+
1138
+ Parameters
1139
+ ----------
1140
+ mol : mol3D
1141
+ mol3D class instance of molecule to be rotated.
1142
+ Rp : list
1143
+ Cartesian origin.
1144
+ D : list
1145
+ [theta-x, theta-y, theta-z] in DEGREES
1146
+
1147
+ Returns
1148
+ -------
1149
+ mol : mol3D
1150
+ mol3D class instance of rotated molecule.
1151
+
1152
+ """
1153
+ # convert to rad
1154
+ D[0] = (float(D[0]) / 180.0) * np.pi
1155
+ D[1] = (float(D[1]) / 180.0) * np.pi
1156
+ D[2] = (float(D[2]) / 180.0) * np.pi
1157
+ # perform rotation
1158
+ for atom in mol.atoms:
1159
+ # Get new point after rotation
1160
+ Rt = PointRotateSph(Rp, atom.coords(), D)
1161
+ atom.setcoords(Rt)
1162
+ return mol
1163
+
1164
+
1165
+ def connectivity_match(inds1, inds2, mol1, mol2):
1166
+ """Check whether the connectivity of two fragments of mols match.
1167
+ Note: This will mark atom transfers between different ligands as False, which may not be correct mathmetically
1168
+ as the graph after atoms transfer can still be the same. We disallow these cases from chemical concerns and avoid
1169
+ the NP-hard porblem of comparing two adjecent matrix.
1170
+
1171
+ Parameters
1172
+ ----------
1173
+ inds1 : list
1174
+ List of atom inds in molecule 1.
1175
+ inds2 : list
1176
+ List of atom inds in molecule 2.
1177
+ mol1 : mol3D
1178
+ mol3D class instance for molecule 1.
1179
+ mol2 : mol3D
1180
+ mol3D class instance for molecule 2.
1181
+
1182
+ Returns
1183
+ -------
1184
+ match_flag : bool
1185
+ Flag for if connectivity matches. True if so.
1186
+
1187
+ """
1188
+ match = False
1189
+ if len(inds1) == len(inds2):
1190
+ inds1.sort()
1191
+ inds2.sort()
1192
+ _mol1 = mol1.create_mol_with_inds(inds1)
1193
+ _mol2 = mol2.create_mol_with_inds(inds2)
1194
+ _mol1.createMolecularGraph()
1195
+ _mol2.createMolecularGraph()
1196
+ match = np.array_equal(_mol1.graph, _mol2.graph)
1197
+ return match
1198
+
1199
+
1200
+ def best_fit_plane(coordinates):
1201
+ """Finds the best fitting plane to a set of atoms at the specified coordinates.
1202
+
1203
+ Parameters
1204
+ ----------
1205
+ corerefcoords : np.array
1206
+ Coordinates of atoms for which the best fitting plane is to be found. Shape is 3 x N.
1207
+
1208
+ Returns
1209
+ -------
1210
+ normal_vector_plane : np.array
1211
+ The vector perpendicular to the best fitting plane.
1212
+
1213
+ """
1214
+ # Solution from stack exchange
1215
+
1216
+ # subtract out the centroid and take the SVD
1217
+ svd = np.linalg.svd(coordinates - np.mean(coordinates, axis=1, keepdims=True))
1218
+
1219
+ # Extract the left singular vectors
1220
+ left = svd[0]
1221
+
1222
+ # the corresponding left singular vector is the normal vector of the best-fitting plane
1223
+ normal_vector_plane = left[:, -1]
1224
+ return normal_vector_plane