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,1930 @@
1
+ import numpy as np
2
+ from molSimplify.Classes.mol3D import mol3D
3
+ from molSimplify.Classes.ligand import ligand_breakdown, ligand_assign
4
+ from molSimplify.Scripts.geometry import distance
5
+ from molSimplify.Classes.globalvars import globalvars
6
+
7
+ # ########## UNIT CONVERSION
8
+ HF_to_Kcal_mol = 627.503
9
+
10
+
11
+ def autocorrelation(mol, prop_vec, orig, d, oct=True, catoms=None, use_dist=False):
12
+ """Calculate and return the products autocorrelation for a single atom
13
+
14
+ Parameters
15
+ ----------
16
+ mol : mol3D
17
+ mol3D object to calculate autocorrelation over
18
+ prop_vec : list
19
+ property of atoms in mol in order of index
20
+ orig : int
21
+ zero-indexed starting atom
22
+ d : int
23
+ number of hops to travel
24
+ oct : bool, optional
25
+ Flag is octahedral complex, by default True
26
+ catoms: list, optional
27
+ List of connecting atoms, by default None (uses mol3D.getBondedAtomsSmart)
28
+ use_dist : bool, optional
29
+ Weigh autocorrelation by physical distance of atom from original, by default False
30
+
31
+ Returns
32
+ -------
33
+ result_vector : list
34
+ assembled products autocorrelations
35
+
36
+ """
37
+ result_vector = np.zeros(d + 1)
38
+ hopped = 0
39
+ active_set = set([orig])
40
+ historical_set = set()
41
+ if not use_dist:
42
+ result_vector[hopped] = prop_vec[orig] * prop_vec[orig]
43
+ else:
44
+ result_vector[hopped] = 0.5 * abs(prop_vec[orig]) ** 2.4 / mol.natoms
45
+ while hopped < (d):
46
+
47
+ hopped += 1
48
+ new_active_set = set()
49
+ for this_atom in active_set:
50
+ # prepare all atoms attached to this connection
51
+ # print('called in AC')
52
+ this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
53
+ for bound_atoms in this_atoms_neighbors:
54
+ if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
55
+ new_active_set.add(bound_atoms)
56
+ # print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
57
+ for inds in new_active_set:
58
+ if not use_dist:
59
+ result_vector[hopped] += prop_vec[orig] * prop_vec[inds]
60
+ else:
61
+ this_dist = distance(mol.getAtom(orig).coords(), mol.getAtom(inds).coords())
62
+ result_vector[hopped] += prop_vec[orig] * prop_vec[inds] / (this_dist * mol.natoms)
63
+ historical_set.update(active_set)
64
+ active_set = new_active_set
65
+ return (result_vector)
66
+
67
+
68
+ def autocorrelation_derivative(mol, prop_vec, orig, d, oct=True, catoms=None):
69
+ """Returns derivative vector of products autocorrelations
70
+
71
+ Parameters
72
+ ----------
73
+ mol : mol3D
74
+ mol3D object to calculate derivatives over
75
+ prop_vec : list
76
+ property of atoms in mol in order of index
77
+ orig : int
78
+ zero-indexed starting atom
79
+ d : int
80
+ number of hops to travel
81
+ oct : bool, optional
82
+ Flag is octahedral complex, by default True
83
+ catoms : list, optional
84
+ List of connecting atom, by default None (use mol3D.getBondedAtomsSmart)
85
+ Returns
86
+ -------
87
+ derivative_mat : list
88
+ RAC derivatives matrix
89
+
90
+ """
91
+ derivative_mat = np.zeros((d + 1, len(prop_vec)))
92
+
93
+ # loop for each atom
94
+
95
+ hopped = 0
96
+ active_set = set([orig])
97
+ historical_set = set()
98
+ for derivate_ind in range(0, len(prop_vec)):
99
+ if derivate_ind == orig:
100
+ derivative_mat[hopped, derivate_ind] = 2 * prop_vec[orig]
101
+ else:
102
+ derivative_mat[hopped, derivate_ind] = 0
103
+ while hopped < (d):
104
+
105
+ hopped += 1
106
+ new_active_set = set()
107
+ for this_atom in active_set:
108
+ # prepare all atoms attached to this connection
109
+ # print('called in AC')
110
+ this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
111
+ for bound_atoms in this_atoms_neighbors:
112
+ if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
113
+ new_active_set.add(bound_atoms)
114
+ # print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
115
+ for inds in new_active_set:
116
+ for derivate_ind in range(0, len(prop_vec)):
117
+ if derivate_ind == orig:
118
+ derivative_mat[hopped, derivate_ind] += prop_vec[inds]
119
+ elif derivate_ind == inds:
120
+ derivative_mat[hopped, derivate_ind] += prop_vec[orig]
121
+ historical_set.update(active_set)
122
+ active_set = new_active_set
123
+ return (derivative_mat)
124
+
125
+
126
+ def ratiometric(mol, prop_vec_num, prop_vec_den, orig, d, oct=True, catoms=None):
127
+ """This function returns the ratiometrics for one atom
128
+
129
+ Parameters
130
+ ----------
131
+ mol : mol3D class
132
+ prop_vec : vector, property of atoms in mol in order of index
133
+ orig : int, zero-indexed starting atom
134
+ d : int, number of hops to travel
135
+ oct : bool, if complex is octahedral, will use better bond checks
136
+
137
+ Returns
138
+ -------
139
+ result_vector : vector of prop_vec_num / prop_vec_den
140
+
141
+ """
142
+ result_vector = np.zeros(d + 1)
143
+ hopped = 0
144
+ active_set = set([orig])
145
+ historical_set = set()
146
+ result_vector[hopped] = prop_vec_num[orig] / prop_vec_den[orig]
147
+ """
148
+ if oct:
149
+ print('using OCT autocorrelation')
150
+ else:
151
+ print('NOT using OCT autocorrelation')
152
+ """
153
+ while hopped < (d):
154
+
155
+ hopped += 1
156
+ new_active_set = set()
157
+ for this_atom in active_set:
158
+ # prepare all atoms attached to this connection
159
+ # print('called in AC')
160
+ this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
161
+ for bound_atoms in this_atoms_neighbors:
162
+ if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
163
+ new_active_set.add(bound_atoms)
164
+ # print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
165
+ for inds in new_active_set:
166
+ result_vector[hopped] += prop_vec_num[orig] / prop_vec_den[inds]
167
+ historical_set.update(active_set)
168
+ active_set = new_active_set
169
+ return (result_vector)
170
+
171
+
172
+ def summetric(mol, prop_vec, orig, d, oct=True, catoms=None):
173
+ """This function returns the summetrics for one atom
174
+
175
+ Parameters
176
+ ----------
177
+ mol : mol3D class
178
+ prop_vec : vector, property of atoms in mol in order of index
179
+ orig : int, zero-indexed starting atom
180
+ d : int, number of hops to travel
181
+ oct : bool, if complex is octahedral, will use better bond checks
182
+
183
+ Returns
184
+ -------
185
+ result_vector : vector of prop_vec_num / prop_vec_den
186
+
187
+ """
188
+ result_vector = np.zeros(d + 1)
189
+ hopped = 0
190
+ active_set = set([orig])
191
+ historical_set = set()
192
+ result_vector[hopped] = prop_vec[orig] + prop_vec[orig]
193
+ """
194
+ if oct:
195
+ print('using OCT autocorrelation')
196
+ else:
197
+ print('NOT using OCT autocorrelation')
198
+ """
199
+ while hopped < (d):
200
+
201
+ hopped += 1
202
+ new_active_set = set()
203
+ for this_atom in active_set:
204
+ # prepare all atoms attached to this connection
205
+ # print('called in AC')
206
+ this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
207
+ for bound_atoms in this_atoms_neighbors:
208
+ if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
209
+ new_active_set.add(bound_atoms)
210
+ # print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
211
+ for inds in new_active_set:
212
+ result_vector[hopped] += prop_vec[orig] + prop_vec[inds]
213
+ historical_set.update(active_set)
214
+ active_set = new_active_set
215
+ return (result_vector)
216
+
217
+
218
+ def deltametric(mol: mol3D, prop_vec, orig, d: int, oct=True, catoms=None):
219
+ # # this function returns the deltametric
220
+ # # over the whole molecule
221
+ # Inputs:
222
+ # mol - mol3D class
223
+ # prop_vec - vector, property of atoms in mol in order of index
224
+ # orig - int, zero-indexed starting atom
225
+ # d - int, number of hops to travel
226
+ # oct - bool, if complex is octahedral, will use better bond checks
227
+ # if oct:
228
+ # print('using OCT delta autocorrelation')
229
+ # else:
230
+ # print('NOT using OCT delta autocorrelation')
231
+ result_vector = np.zeros(d + 1)
232
+ hopped = 0
233
+ active_set = set([orig])
234
+ historical_set = set()
235
+ result_vector[hopped] = 0.00
236
+ while hopped < (d):
237
+ hopped += 1
238
+ new_active_set = set()
239
+ for this_atom in active_set:
240
+ # prepare all atoms attached to this connection
241
+ # print('called in DAC')
242
+ this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
243
+ for bound_atoms in this_atoms_neighbors:
244
+ if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
245
+ new_active_set.add(bound_atoms)
246
+ # print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
247
+ for inds in new_active_set:
248
+ result_vector[hopped] += prop_vec[orig] - prop_vec[inds]
249
+ historical_set.update(active_set)
250
+ active_set = new_active_set
251
+ return (result_vector)
252
+
253
+
254
+ def autocorrelation_catoms(mol, prop_vec, orig, d, oct=True, catoms=None):
255
+ # Calculate the autocorrelation for the orig to certain connecting atoms.
256
+ result_vector = np.zeros(d + 1)
257
+ hopped = 0
258
+ active_set = set([orig])
259
+ historical_set = set()
260
+ result_vector[hopped] = prop_vec[orig] * prop_vec[orig]
261
+ # if oct:
262
+ # print('using OCT autocorrelation')
263
+ # else:
264
+ # print('NOT using OCT autocorrelation')
265
+ while hopped < (d):
266
+
267
+ hopped += 1
268
+ new_active_set = set()
269
+ for this_atom in active_set:
270
+ # prepare all atoms attached to this connection
271
+ # print('called in AC')
272
+ this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
273
+ # print('--1--:', this_atoms_neighbors)
274
+ if this_atom == orig and (catoms is not None):
275
+ this_atoms_neighbors = catoms
276
+ # print('--2--:', this_atoms_neighbors)
277
+ for bound_atoms in this_atoms_neighbors:
278
+ if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
279
+ new_active_set.add(bound_atoms)
280
+ # print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
281
+ for inds in new_active_set:
282
+ result_vector[hopped] += prop_vec[orig] * prop_vec[inds]
283
+ historical_set.update(active_set)
284
+ active_set = new_active_set
285
+ return (result_vector)
286
+
287
+
288
+ def deltametric_derivative(mol, prop_vec, orig, d, oct=True, catoms=None):
289
+ # # this function returns the derivative vector
290
+ # # of the scalar autocorrelation
291
+ # # starting at orig with depth d,
292
+ # # with respect to the atomic properties
293
+ # # in prop_vec, for all atoms.
294
+ # # The return type is np.array for
295
+ # # Be sure to read this carefully!
296
+ # Inputs:
297
+ # mol - mol3D class
298
+ # prop_vec - vector, property of atoms in mol in order of index
299
+ # orig - int, zero-indexed starting atom
300
+ # d - int, number of hops to travel
301
+ # oct - bool, if complex is octahedral, will use better bond checks
302
+ # if oct:
303
+ # print('using OCT delta autocorrelation')
304
+ # else:
305
+ # print('NOT using OCT delta autocorrelation')
306
+
307
+ derivative_mat = np.zeros((d + 1, len(prop_vec)))
308
+
309
+ hopped = 0
310
+ active_set = set([orig])
311
+ historical_set = set()
312
+
313
+ # the zero-depth element is always zero
314
+ for derivate_ind in range(0, len(prop_vec)):
315
+ derivative_mat[hopped, derivate_ind] = 0.0
316
+
317
+ while hopped < (d):
318
+ hopped += 1
319
+ new_active_set = set()
320
+ for this_atom in active_set:
321
+ # prepare all atoms attached to this connection
322
+ # print('called in DAC')
323
+ this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
324
+ for bound_atoms in this_atoms_neighbors:
325
+ if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
326
+ new_active_set.add(bound_atoms)
327
+ # print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
328
+ for inds in new_active_set:
329
+
330
+ for derivate_ind in range(0, len(prop_vec)):
331
+ if derivate_ind == orig:
332
+ derivative_mat[hopped, derivate_ind] += 1
333
+ elif derivate_ind == inds:
334
+ derivative_mat[hopped, derivate_ind] += -1
335
+
336
+ historical_set.update(active_set)
337
+ active_set = new_active_set
338
+ return (derivative_mat)
339
+
340
+
341
+ def deltametric_catoms(mol, prop_vec, orig, d, oct=True, catoms=None):
342
+ # Calculate the deltametrics for the orig to certain connecting atoms.
343
+ result_vector = np.zeros(d + 1)
344
+ hopped = 0
345
+ active_set = set([orig])
346
+ historical_set = set()
347
+ result_vector[hopped] = 0.00
348
+ # metal_idx = mol.findMetal()[0]
349
+ while hopped < (d):
350
+ hopped += 1
351
+ new_active_set = set()
352
+ for this_atom in active_set:
353
+ # prepare all atoms attached to this connection
354
+ # print('called in DAC')
355
+ this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
356
+ # print('--1--:', this_atoms_neighbors)
357
+ if this_atom == orig and (catoms is not None):
358
+ this_atoms_neighbors = catoms
359
+ # print('--2--:', this_atoms_neighbors)
360
+ for bound_atoms in this_atoms_neighbors:
361
+ if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
362
+ new_active_set.add(bound_atoms)
363
+ # print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
364
+ for inds in new_active_set:
365
+ result_vector[hopped] += prop_vec[orig] - prop_vec[inds]
366
+ historical_set.update(active_set)
367
+ active_set = new_active_set
368
+ return (result_vector)
369
+
370
+
371
+ def full_autocorrelation(mol, prop, d, oct=oct, modifier=False, use_dist=False, transition_metals_only=True):
372
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier, transition_metals_only=transition_metals_only)
373
+ index_set = list(range(0, mol.natoms))
374
+ autocorrelation_vector = np.zeros(d + 1)
375
+ for centers in index_set:
376
+ autocorrelation_vector += autocorrelation(mol, w, centers, d, oct=oct, use_dist=use_dist)
377
+ return (autocorrelation_vector)
378
+
379
+
380
+ def full_autocorrelation_derivative(mol, prop, d, oct=oct, modifier=False):
381
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
382
+ index_set = list(range(0, mol.natoms))
383
+ autocorrelation_derivative_mat = np.zeros((d + 1, mol.natoms))
384
+ for centers in index_set:
385
+ autocorrelation_derivative_mat += autocorrelation_derivative(mol, w, centers, d, oct=oct)
386
+ return (autocorrelation_derivative_mat)
387
+
388
+
389
+ def atom_only_autocorrelation(mol, prop, d, atomIdx, oct=True):
390
+ # atomIdx must be either a list of indicies
391
+ # or a single index
392
+ w = construct_property_vector(mol, prop, oct)
393
+ autocorrelation_vector = np.zeros(d + 1)
394
+ if hasattr(atomIdx, "__len__"): # Indicative of a list of indices
395
+ for elements in atomIdx:
396
+ autocorrelation_vector += autocorrelation(mol, w, elements, d, oct=oct)
397
+ autocorrelation_vector = np.divide(autocorrelation_vector, len(atomIdx)) # averaging
398
+ else: # Single index
399
+ autocorrelation_vector += autocorrelation(mol, w, atomIdx, d, oct=oct)
400
+ return (autocorrelation_vector)
401
+
402
+
403
+ def atom_only_autocorrelation_derivative(mol, prop, d, atomIdx, oct=True):
404
+ # atomIdx must b either a list of indicies
405
+ # or a single index
406
+ w = construct_property_vector(mol, prop, oct)
407
+ autocorrelation_derivative_mat = np.zeros((d + 1, mol.natoms))
408
+ if hasattr(atomIdx, "__len__"):
409
+ for elements in atomIdx:
410
+ autocorrelation_derivative_mat += autocorrelation_derivative(mol, w, elements, d, oct=oct)
411
+ autocorrelation_derivative_mat = np.divide(autocorrelation_derivative_mat, len(atomIdx))
412
+ else:
413
+ autocorrelation_derivative_mat += autocorrelation_derivative(mol, w, atomIdx, d, oct=oct)
414
+ return (autocorrelation_derivative_mat)
415
+
416
+
417
+ def metal_only_autocorrelation(mol, prop, d, oct=True, catoms=None,
418
+ func=autocorrelation, modifier=False):
419
+ try:
420
+ metal_ind = mol.findMetal()[0]
421
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
422
+ autocorrelation_vector = func(mol, w, metal_ind, d, oct=oct,
423
+ catoms=catoms)
424
+ except IndexError:
425
+ print('Error, no metal found in mol object!')
426
+ return False
427
+ return (autocorrelation_vector)
428
+
429
+
430
+ def metal_only_autocorrelation_derivative(mol, prop, d, oct=True, catoms=None,
431
+ func=autocorrelation_derivative, modifier=False):
432
+ try:
433
+ metal_ind = mol.findMetal()[0]
434
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
435
+ autocorrelation_vector_derivative = func(mol, w, metal_ind, d, oct=oct,
436
+ catoms=catoms)
437
+ except IndexError:
438
+ print('Error, no metal found in mol object!')
439
+ return False
440
+ return (autocorrelation_vector_derivative)
441
+
442
+
443
+ def multimetal_only_autocorrelation(mol, prop, d, oct=True, catoms=None,
444
+ func=autocorrelation, modifier=False):
445
+ autocorrelation_vector = np.zeros(d + 1)
446
+ n_met = len(mol.findMetal())
447
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
448
+ for metal_ind in mol.findMetal():
449
+ autocorrelation_vector += func(mol, w, metal_ind, d, oct=oct, catoms=catoms)
450
+ autocorrelation_vector = np.divide(autocorrelation_vector, n_met)
451
+ return (autocorrelation_vector)
452
+
453
+
454
+ def multiatom_only_autocorrelation(mol, prop, d, oct=True, catoms=None,
455
+ func=autocorrelation, modifier=False,
456
+ additional_elements=False):
457
+ autocorrelation_vector = np.zeros(d + 1)
458
+ metal_list = mol.findMetal()
459
+ if additional_elements:
460
+ for element in additional_elements:
461
+ metal_list += mol.findAtomsbySymbol(element)
462
+ n_met = len(metal_list)
463
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
464
+ for metal_ind in metal_list:
465
+ autocorrelation_vector += func(mol, w, metal_ind, d, oct=oct, catoms=catoms)
466
+ autocorrelation_vector = np.divide(autocorrelation_vector, n_met)
467
+ return (autocorrelation_vector)
468
+
469
+
470
+ def atom_only_ratiometric(mol, prop_num, prop_den, d, atomIdx, oct=True):
471
+ # atomIdx must b either a list of indicies
472
+ # or a single index
473
+ w_num = construct_property_vector(mol, prop_num, oct)
474
+ w_den = construct_property_vector(mol, prop_den, oct)
475
+ autocorrelation_vector = np.zeros(d + 1)
476
+ if hasattr(atomIdx, "__len__"):
477
+ for elements in atomIdx:
478
+ autocorrelation_vector += ratiometric(mol, w_num, w_den, elements, d, oct=oct)
479
+ autocorrelation_vector = np.divide(autocorrelation_vector, len(atomIdx))
480
+ else:
481
+ autocorrelation_vector += ratiometric(mol, w_num, w_den, atomIdx, d, oct=oct)
482
+ return (autocorrelation_vector)
483
+
484
+
485
+ def atom_only_summetric(mol, prop, d, atomIdx, oct=True):
486
+ # atomIdx must b either a list of indicies
487
+ # or a single index
488
+ w = construct_property_vector(mol, prop, oct)
489
+ autocorrelation_vector = np.zeros(d + 1)
490
+ if hasattr(atomIdx, "__len__"):
491
+ for elements in atomIdx:
492
+ autocorrelation_vector += summetric(mol, w, elements, d, oct=oct)
493
+ autocorrelation_vector = np.divide(autocorrelation_vector, len(atomIdx))
494
+ else:
495
+ autocorrelation_vector += summetric(mol, w, atomIdx, d, oct=oct)
496
+ return (autocorrelation_vector)
497
+
498
+
499
+ def atom_only_deltametric(mol, prop, d, atomIdx, oct=True, modifier=False):
500
+ # atomIdx must b either a list of indicies
501
+ # or a single index
502
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
503
+
504
+ deltametric_vector = np.zeros(d + 1)
505
+ if hasattr(atomIdx, "__len__"):
506
+ for elements in atomIdx:
507
+ deltametric_vector += deltametric(mol, w, elements, d, oct=oct)
508
+ deltametric_vector = np.divide(deltametric_vector, len(atomIdx))
509
+ else:
510
+ deltametric_vector += deltametric(mol, w, atomIdx, d, oct=oct)
511
+ return (deltametric_vector)
512
+
513
+
514
+ def atom_only_deltametric_derivative(mol, prop, d, atomIdx, oct=True, modifier=False):
515
+ # atomIdx must b either a list of indicies
516
+ # or a single index
517
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
518
+
519
+ deltametric_derivative_mat = np.zeros((d + 1, mol.natoms))
520
+ if hasattr(atomIdx, "__len__"):
521
+ for elements in atomIdx:
522
+ deltametric_derivative_mat += deltametric_derivative(mol, w, elements, d, oct=oct)
523
+ deltametric_derivative_mat = np.divide(deltametric_derivative_mat, len(atomIdx))
524
+ else:
525
+
526
+ deltametric_derivative_mat += deltametric_derivative(mol, w, atomIdx, d, oct=oct)
527
+ return (deltametric_derivative_mat)
528
+
529
+
530
+ def metal_only_deltametric_derivative(mol, prop, d, oct=True, catoms=None,
531
+ func=deltametric_derivative, modifier=False):
532
+ try:
533
+ metal_ind = mol.findMetal()[0]
534
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
535
+ deltametric_vector_derivative = func(mol, w, metal_ind, d, oct=oct,
536
+ catoms=catoms)
537
+ except IndexError:
538
+ print('Error, no metal found in mol object!')
539
+ return False
540
+ return (deltametric_vector_derivative)
541
+
542
+
543
+ def metal_only_deltametric(mol, prop, d, oct=True, catoms=None,
544
+ func=deltametric, modifier=False):
545
+ try:
546
+ metal_ind = mol.findMetal()[0]
547
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
548
+ deltametric_vector = func(mol, w, metal_ind, d, oct=oct,
549
+ catoms=catoms)
550
+ except IndexError:
551
+ print('Error, no metal found in mol object!')
552
+ return False
553
+ return (deltametric_vector)
554
+
555
+
556
+ def multimetal_only_deltametric(mol, prop, d, oct=True, catoms=None,
557
+ func=deltametric, modifier=False):
558
+ deltametric_vector = np.zeros(d + 1)
559
+ n_met = len(mol.findMetal())
560
+
561
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
562
+ for metal_ind in mol.findMetal():
563
+ deltametric_vector += func(mol, w, metal_ind, d, oct=oct,
564
+ catoms=catoms)
565
+ deltametric_vector = np.divide(deltametric_vector, n_met)
566
+ return (deltametric_vector)
567
+
568
+
569
+ def multiatom_only_deltametric(mol, prop, d, oct=True, catoms=None,
570
+ func=deltametric, modifier=False,
571
+ additional_elements=False):
572
+ deltametric_vector = np.zeros(d + 1)
573
+ metal_list = mol.findMetal()
574
+ if additional_elements:
575
+ for element in additional_elements:
576
+ metal_list += mol.findAtomsbySymbol(element)
577
+ n_met = len(metal_list)
578
+ w = construct_property_vector(mol, prop, oct=oct, modifier=modifier)
579
+ for metal_ind in mol.findMetal():
580
+ deltametric_vector += func(mol, w, metal_ind, d, oct=oct,
581
+ catoms=catoms)
582
+ deltametric_vector = np.divide(deltametric_vector, n_met)
583
+ return (deltametric_vector)
584
+
585
+
586
+ def metal_only_layer_density(mol, prop, d, oct=True):
587
+ try:
588
+ metal_ind = mol.findMetal()[0]
589
+ print(('metal_index is: %d' % metal_ind))
590
+ w = construct_property_vector(mol, prop, oct=oct)
591
+ density_vector = layer_density_in_3D(mol, w, metal_ind, d, oct=oct)
592
+ except IndexError:
593
+ print('Error, no metal found in mol object!')
594
+ return False
595
+ return density_vector
596
+
597
+
598
+ def layer_density_in_3D(mol, prop_vec, orig, d, oct=True):
599
+ # # this function returns the density (prop^3/(d+1)^3)
600
+ # # for one atom
601
+ # Inputs:
602
+ # mol - mol3D class
603
+ # prop_vec - vector, property of atoms in mol in order of index
604
+ # orig - int, zero-indexed starting atom
605
+ # d - int, number of hops to travel
606
+ # oct - bool, if complex is octahedral, will use better bond checks
607
+ result_vector = np.zeros(d + 1)
608
+ hopped = 0
609
+ active_set = set([orig])
610
+ historical_set = set()
611
+ result_vector[hopped] = prop_vec[orig] ** 3 / (hopped + 1) ** 3
612
+ # if oct:
613
+ # print('using OCT autocorrelation')
614
+ # else:
615
+ # print('NOT using OCT autocorrelation')
616
+ while hopped < (d):
617
+
618
+ hopped += 1
619
+ new_active_set = set()
620
+ for this_atom in active_set:
621
+ # prepare all atoms attached to this connection
622
+ # print('called in AC')
623
+ this_atoms_neighbors = mol.getBondedAtomsSmart(this_atom, oct=oct)
624
+ for bound_atoms in this_atoms_neighbors:
625
+ if (bound_atoms not in historical_set) and (bound_atoms not in active_set):
626
+ new_active_set.add(bound_atoms)
627
+ # print('new active set at hop = ' +str(hopped) + ' is ' +str(new_active_set))
628
+ for inds in new_active_set:
629
+ result_vector[hopped] += prop_vec[inds] ** 3 / (hopped + 1) ** 3
630
+ historical_set.update(active_set)
631
+ active_set = new_active_set
632
+ return result_vector
633
+
634
+
635
+ def construct_property_vector(mol: mol3D, prop: str, oct=True, modifier=False, transition_metals_only=True):
636
+ # # assigns the value of property
637
+ # # for atom i (zero index) in mol
638
+ # # to position i in returned vector
639
+ # # can be used to create weighted
640
+ # # graph representations
641
+ # # oct - bool, if complex is octahedral, will use better bond checks
642
+ # # modifier - dict, used to modify prop vector (e.g. for adding
643
+ # # ONLY used with ox_nuclear_charge ox or charge)
644
+ # # {"Fe":2, "Co": 3} etc
645
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology',
646
+ 'ox_nuclear_charge', 'size', 'vdwrad', 'group_number', 'polarizability',
647
+ 'bondvalence', 'num_bonds', 'bondvalence_devi', 'bodavrg', 'bodstd', 'charge']
648
+ # # note that ident just codes every atom as one, this gives
649
+ # # a purely toplogical index. coord gives the number of
650
+ # # connecting atom to attom i (similar to Randic index)
651
+ # if not oct:
652
+ # print('NOT using octahedral bonding pattern')
653
+ globs = globalvars()
654
+ prop_dict = dict()
655
+ w = np.zeros(mol.natoms)
656
+ done = False
657
+ if prop not in allowed_strings:
658
+ print(('error, property ' + str(prop) + ' is not a vaild choice'))
659
+ print((' options are ' + str(allowed_strings)))
660
+ return False
661
+ if prop == 'electronegativity':
662
+ prop_dict = globs.endict()
663
+ elif prop == 'size':
664
+ at_keys = list(globs.amass().keys())
665
+ for keys in at_keys:
666
+ values = globs.amass()[keys][2]
667
+ prop_dict.update({keys: values})
668
+ elif prop == 'nuclear_charge':
669
+ at_keys = list(globs.amass().keys())
670
+ for keys in at_keys:
671
+ values = globs.amass()[keys][1]
672
+ prop_dict.update({keys: values})
673
+ elif prop == 'group_number': # Uses number of valence electrons
674
+ # if not modifier:
675
+ at_keys = list(globs.amass().keys())
676
+ for keys in at_keys:
677
+ values = globs.amass()[keys][-1]
678
+ prop_dict.update({keys: values})
679
+ # ###### 11/06/2019 -- Adjusted Gval RACs to not adjust on oxidation state. Confounded with O RACs. #####
680
+ # # else:
681
+ # at_keys = globs.amass().keys()
682
+ # for keys in at_keys:
683
+ # values = globs.amass()[keys][3]
684
+ # if keys in modifier.keys():
685
+ # values -= float(modifier[keys]) # assumes oxidation state provided (i.e. Fe(IV))
686
+ # prop_dict.update({keys: values})
687
+ elif prop == 'ox_nuclear_charge':
688
+ if not modifier:
689
+ print('Error, must give modifier with ox_nuclear_charge')
690
+ return False
691
+ else:
692
+ at_keys = list(globs.amass().keys())
693
+ for keys in at_keys:
694
+ values = globs.amass()[keys][1]
695
+ if keys in list(modifier.keys()):
696
+ values -= float(modifier[keys]) # assumes oxidation state provided (i.e. Fe(IV))
697
+ prop_dict.update({keys: values})
698
+ elif prop == 'polarizability':
699
+ prop_dict = globs.polarizability()
700
+ for i, atoms in enumerate(mol.getAtoms()):
701
+ atom_type = atoms.symbol()
702
+ w[i] = prop_dict[atom_type]
703
+ elif prop == 'ident':
704
+ at_keys = list(globs.amass().keys())
705
+ for keys in at_keys:
706
+ prop_dict.update({keys: 1})
707
+ elif prop == 'topology':
708
+ for i, atoms in enumerate(mol.getAtoms()):
709
+ # print('atom # ' + str(i) + " symbol = " + str(atoms.symbol()))
710
+ w[i] = len(mol.getBondedAtomsSmart(i, oct=oct))
711
+ done = True
712
+ elif prop == 'vdwrad':
713
+ prop_dict = globs.vdwrad()
714
+ for i, atoms in enumerate(mol.getAtoms()):
715
+ atom_type = atoms.symbol()
716
+ if atom_type in globs.metalslist():
717
+ w[i] = globs.amass()[atoms.symbol()][2]
718
+ else:
719
+ w[i] = prop_dict[atoms.symbol()]
720
+ done = True
721
+ # for keys in at_keys:
722
+ # prop_dict.update({keys: 1})
723
+ elif prop == 'bondvalence':
724
+ assert len(mol.getAtoms()) == len(mol.bv_dict)
725
+ for i, atoms in enumerate(mol.getAtoms()):
726
+ w[i] = mol.bv_dict[i]
727
+ done = True
728
+ elif prop == 'num_bonds':
729
+ for i, atom in enumerate(mol.getAtoms()):
730
+ if not atom.ismetal(transition_metals_only):
731
+ w[i] = globs.bondsdict()[atom.symbol()]
732
+ else:
733
+ w[i] = len(mol.getBondedAtomsSmart(i, oct=oct))
734
+ done = True
735
+ elif prop == 'bondvalence_devi':
736
+ assert len(mol.getAtoms()) == len(mol.bvd_dict)
737
+ for i, atoms in enumerate(mol.getAtoms()):
738
+ w[i] = mol.bvd_dict[i]
739
+ done = True
740
+ elif prop == 'bodavrg':
741
+ assert len(mol.getAtoms()) == len(mol.bodavrg_dict)
742
+ for i, atoms in enumerate(mol.getAtoms()):
743
+ w[i] = mol.bodavrg_dict[i]
744
+ done = True
745
+ elif prop == 'bodstd':
746
+ assert len(mol.getAtoms()) == len(mol.bodstd_dict)
747
+ for i, atoms in enumerate(mol.getAtoms()):
748
+ w[i] = mol.bodstd_dict[i]
749
+ done = True
750
+ elif prop == 'charge':
751
+ assert len(mol.getAtoms()) == len(mol.charge_dict)
752
+ for i, atoms in enumerate(mol.getAtoms()):
753
+ w[i] = mol.charge_dict[i]
754
+ done = True
755
+ if not done:
756
+ for i, atoms in enumerate(mol.getAtoms()):
757
+ # print('atom # ' + str(i) + " symbol = " + str(atoms.symbol()))
758
+ w[i] = prop_dict[atoms.symbol()]
759
+ return (w)
760
+
761
+
762
+ def find_ligand_autocorrelations_oct(mol, prop, loud, depth, name=False,
763
+ oct=True, custom_ligand_dict=False):
764
+ # # this function takes a
765
+ # # symmetric (axial == axial,
766
+ # # equatorial == equatorial)
767
+ # # octahedral complex
768
+ # # and returns autocorrelations for
769
+ # # the axial an equatorial ligands
770
+ # # custom_ligand_dict allows the user to skip the breakdown
771
+ # # in cases where 3D geo is not correct/formed
772
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
773
+ # # ax_con_int_list ,eq_con_int_list
774
+ # # with types: eq/ax_ligand_list list of mol3D
775
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
776
+ if not custom_ligand_dict:
777
+ liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
778
+ (ax_ligand_list, eq_ligand_list, ax_natoms_list,
779
+ eq_natoms_list, ax_con_int_list, eq_con_int_list,
780
+ ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
781
+ mol, liglist, ligdents, ligcons, loud, name=False)
782
+ else:
783
+ ax_ligand_list = custom_ligand_dict["ax_ligand_list"]
784
+ eq_ligand_list = custom_ligand_dict["eq_ligand_list"]
785
+ ax_con_int_list = custom_ligand_dict["ax_con_int_list"]
786
+ eq_con_int_list = custom_ligand_dict["eq_con_int_list"]
787
+ # count ligands
788
+ n_ax = len(ax_ligand_list)
789
+ n_eq = len(eq_ligand_list)
790
+ # get full ligand AC
791
+ ax_ligand_ac_full = []
792
+ eq_ligand_ac_full = []
793
+ for i in range(0, n_ax):
794
+ if not list(ax_ligand_ac_full):
795
+ ax_ligand_ac_full = full_autocorrelation(ax_ligand_list[i].mol, prop, depth)
796
+ else:
797
+ ax_ligand_ac_full += full_autocorrelation(ax_ligand_list[i].mol, prop, depth)
798
+ ax_ligand_ac_full = np.divide(ax_ligand_ac_full, n_ax)
799
+ for i in range(0, n_eq):
800
+ if not list(eq_ligand_ac_full):
801
+ eq_ligand_ac_full = full_autocorrelation(eq_ligand_list[i].mol, prop, depth)
802
+ else:
803
+ eq_ligand_ac_full += full_autocorrelation(eq_ligand_list[i].mol, prop, depth)
804
+ eq_ligand_ac_full = np.divide(eq_ligand_ac_full, n_eq)
805
+
806
+ # get partial ligand AC
807
+ ax_ligand_ac_con = []
808
+ eq_ligand_ac_con = []
809
+
810
+ for i in range(0, n_ax):
811
+ if not list(ax_ligand_ac_con):
812
+ ax_ligand_ac_con = atom_only_autocorrelation(ax_ligand_list[i].mol, prop, depth, ax_con_int_list[i])
813
+ else:
814
+ ax_ligand_ac_con += atom_only_autocorrelation(ax_ligand_list[i].mol, prop, depth, ax_con_int_list[i])
815
+ ax_ligand_ac_con = np.divide(ax_ligand_ac_con, n_ax)
816
+ for i in range(0, n_eq):
817
+ if not list(eq_ligand_ac_con):
818
+ eq_ligand_ac_con = atom_only_autocorrelation(eq_ligand_list[i].mol, prop, depth, eq_con_int_list[i])
819
+ else:
820
+ eq_ligand_ac_con += atom_only_autocorrelation(eq_ligand_list[i].mol, prop, depth, eq_con_int_list[i])
821
+ eq_ligand_ac_con = np.divide(eq_ligand_ac_con, n_eq)
822
+
823
+ # ax_ligand_ac_con = atom_only_autocorrelation(ax_ligand.mol,prop,depth,ax_con_int)
824
+ # eq_ligand_ac_con = atom_only_autocorrelation(eq_ligand.mol,prop,depth,eq_con_int)
825
+ return ax_ligand_ac_full, eq_ligand_ac_full, ax_ligand_ac_con, eq_ligand_ac_con
826
+
827
+
828
+ def find_ligand_autocorrelation_derivatives_oct(mol, prop, loud, depth, name=False,
829
+ oct=True, custom_ligand_dict=False):
830
+ # # this function takes a
831
+ # # symmetric (axial == axial,
832
+ # # equatorial == equatorial)
833
+ # # octahedral complex
834
+ # # and returns autocorrelations for
835
+ # # the axial an equatorial ligands
836
+ # # custom_ligand_dict allows the user to skip the breakdown
837
+ # # in cases where 3D geo is not correct/formed
838
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
839
+ # # ax_con_int_list ,eq_con_int_list
840
+ # # with types: eq/ax_ligand_list list of mol3D
841
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
842
+ if not custom_ligand_dict:
843
+ liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
844
+ (ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
845
+ eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
846
+ mol, liglist, ligdents, ligcons, loud, name=False)
847
+ else:
848
+ ax_ligand_list = custom_ligand_dict["ax_ligand_list"]
849
+ eq_ligand_list = custom_ligand_dict["eq_ligand_list"]
850
+ ax_con_int_list = custom_ligand_dict["ax_con_int_list"]
851
+ eq_con_int_list = custom_ligand_dict["eq_con_int_list"]
852
+ # count ligands
853
+ n_ax = len(ax_ligand_list)
854
+ n_eq = len(eq_ligand_list)
855
+ # get full ligand AC
856
+ ax_ligand_ac_full_derivative = None
857
+ eq_ligand_eq_full_derivative = None
858
+
859
+ # allocate the full jacobian matrix
860
+ ax_full_j = np.zeros([depth + 1, mol.natoms])
861
+ eq_full_j = np.zeros([depth + 1, mol.natoms])
862
+ ax_con_j = np.zeros([depth + 1, mol.natoms])
863
+ eq_con_j = np.zeros([depth + 1, mol.natoms])
864
+
865
+ # full ligand ACs
866
+ for i in range(0, n_ax): # for each ax ligand
867
+ ax_ligand_ac_full_derivative = full_autocorrelation_derivative(ax_ligand_list[i].mol, prop, depth)
868
+ # now we need to map back to full positions
869
+ for ii, row in enumerate(ax_ligand_ac_full_derivative):
870
+ for original_ids in list(ax_ligand_list[i].ext_int_dict.keys()):
871
+ ax_full_j[ii, original_ids] += np.divide(row[ax_ligand_list[i].ext_int_dict[original_ids]], n_ax)
872
+
873
+ for i in range(0, n_eq): # for each eq ligand
874
+ # now we need to map back to full positions
875
+ eq_ligand_eq_full_derivative = full_autocorrelation_derivative(eq_ligand_list[i].mol, prop, depth)
876
+ for ii, row in enumerate(eq_ligand_eq_full_derivative):
877
+ for original_ids in list(eq_ligand_list[i].ext_int_dict.keys()):
878
+ eq_full_j[ii, original_ids] += np.divide(row[eq_ligand_list[i].ext_int_dict[original_ids]], n_eq)
879
+
880
+ # ligand connection ACs
881
+ for i in range(0, n_ax):
882
+ ax_ligand_ac_con_derivative = atom_only_autocorrelation_derivative(ax_ligand_list[i].mol, prop, depth,
883
+ ax_con_int_list[i])
884
+ # now we need to map back to full positions
885
+ for ii, row in enumerate(ax_ligand_ac_con_derivative):
886
+ for original_ids in list(ax_ligand_list[i].ext_int_dict.keys()):
887
+ ax_con_j[ii, original_ids] += np.divide(row[ax_ligand_list[i].ext_int_dict[original_ids]], n_ax)
888
+
889
+ for i in range(0, n_eq):
890
+ eq_ligand_ac_con_derivative = atom_only_autocorrelation_derivative(eq_ligand_list[i].mol, prop, depth,
891
+ eq_con_int_list[i])
892
+ # now we need to map back to full positions
893
+ for ii, row in enumerate(eq_ligand_ac_con_derivative):
894
+ for original_ids in list(eq_ligand_list[i].ext_int_dict.keys()):
895
+ eq_con_j[ii, original_ids] += np.divide(row[eq_ligand_list[i].ext_int_dict[original_ids]], n_eq)
896
+
897
+ return ax_full_j, eq_full_j, ax_con_j, eq_con_j
898
+
899
+
900
+ def find_ligand_autocorrs_and_deltametrics_oct_dimers(mol, prop, loud, depth, name=False,
901
+ oct=True, custom_ligand_dict=False):
902
+ # # this function takes a
903
+ # # symmetric (axial == axial,
904
+ # # equatorial == equatorial)
905
+ # # octahedral complex
906
+ # # and returns autocorrelations for
907
+ # # the axial an equatorial ligands
908
+ # # custom_ligand_dict allows the user to skip the breakdown
909
+ # # in cases where 3D geo is not correct/formed
910
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
911
+ # # ax_con_int_list ,eq_con_int_list
912
+ # # with types: eq/ax_ligand_list list of mol3D
913
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
914
+ if not custom_ligand_dict:
915
+ raise ValueError('No custom ligand dict provided!')
916
+ # liglist, ligdents, ligcons = ligand_breakdown(mol)
917
+ # ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list, eq_con_int_list,
918
+ # ax_con_list, eq_con_list, built_ligand_list = ligand_assign(
919
+ # mol, liglist, ligdents, ligcons, loud, name=False)
920
+ else:
921
+ ax1_ligand_list = custom_ligand_dict["ax1_ligand_list"]
922
+ ax2_ligand_list = custom_ligand_dict["ax2_ligand_list"]
923
+ ax3_ligand_list = custom_ligand_dict["ax3_ligand_list"]
924
+ ax1_con_int_list = custom_ligand_dict["ax1_con_int_list"]
925
+ ax2_con_int_list = custom_ligand_dict["ax2_con_int_list"]
926
+ ax3_con_int_list = custom_ligand_dict["ax3_con_int_list"]
927
+ axligs = [ax1_ligand_list, ax2_ligand_list, ax3_ligand_list]
928
+ axcons = [ax1_con_int_list, ax2_con_int_list, ax3_con_int_list]
929
+ n_axs = [len(i) for i in axligs]
930
+
931
+ # get full ligand AC
932
+ ax_ligand_ac_fulls = [False, False, False]
933
+
934
+ for axnum in range(3):
935
+ ax_ligand_ac_full = list()
936
+ for i in range(0, n_axs[axnum]):
937
+ if not list(ax_ligand_ac_full):
938
+ ax_ligand_ac_full = full_autocorrelation(axligs[axnum][i].mol, prop, depth)
939
+ else:
940
+ ax_ligand_ac_full += full_autocorrelation(axligs[axnum][i].mol, prop, depth)
941
+ ax_ligand_ac_full = np.divide(ax_ligand_ac_full, n_axs[axnum])
942
+ ax_ligand_ac_fulls[axnum] = ax_ligand_ac_full
943
+
944
+ # get partial ligand AC
945
+ ax_ligand_ac_cons = [False, False, False]
946
+
947
+ for axnum in range(3):
948
+ ax_ligand_ac_con = list()
949
+ for i in range(0, n_axs[axnum]):
950
+ if not list(ax_ligand_ac_con):
951
+ ax_ligand_ac_con = atom_only_autocorrelation(axligs[axnum][i].mol, prop, depth, axcons[axnum][i])
952
+ else:
953
+ ax_ligand_ac_con += atom_only_autocorrelation(axligs[axnum][i].mol, prop, depth, axcons[axnum][i])
954
+ ax_ligand_ac_con = np.divide(ax_ligand_ac_con, n_axs[axnum])
955
+ ax_ligand_ac_cons[axnum] = ax_ligand_ac_con
956
+
957
+ # get deltametrics
958
+ ax_delta_cons = [False, False, False]
959
+
960
+ for axnum in range(3):
961
+ ax_delta_con = list()
962
+ for i in range(0, n_axs[axnum]):
963
+ if not list(ax_delta_con):
964
+ ax_delta_con = atom_only_deltametric(axligs[axnum][i].mol, prop, depth, axcons[axnum][i])
965
+ else:
966
+ ax_delta_con += atom_only_deltametric(axligs[axnum][i].mol, prop, depth, axcons[axnum][i])
967
+ ax_delta_con = np.divide(ax_delta_con, n_axs[axnum])
968
+ ax_delta_cons[axnum] = ax_delta_con
969
+
970
+ return ax_ligand_ac_fulls + ax_ligand_ac_cons + ax_delta_cons
971
+
972
+
973
+ def find_ligand_deltametrics_oct(mol, prop, loud, depth, name=False, oct=True, custom_ligand_dict=False):
974
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
975
+ # # ax_con_int_list ,eq_con_int_list
976
+ # # with types: eq/ax_ligand_list list of mol3D
977
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
978
+ # # this function takes a
979
+ # # octahedral complex
980
+ # # and returns deltametrics for
981
+ # # the axial an equatorial ligands
982
+ if not custom_ligand_dict:
983
+ liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
984
+ (ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
985
+ eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
986
+ mol, liglist, ligdents, ligcons, loud, name=False)
987
+ else:
988
+ ax_ligand_list = custom_ligand_dict["ax_ligand_list"]
989
+ eq_ligand_list = custom_ligand_dict["eq_ligand_list"]
990
+ ax_con_int_list = custom_ligand_dict["ax_con_int_list"]
991
+ eq_con_int_list = custom_ligand_dict["eq_con_int_list"]
992
+ # count ligands
993
+ n_ax = len(ax_ligand_list)
994
+ n_eq = len(eq_ligand_list)
995
+
996
+ # get partial ligand AC
997
+ ax_ligand_ac_con = []
998
+ eq_ligand_ac_con = []
999
+
1000
+ for i in range(0, n_ax):
1001
+ if not list(ax_ligand_ac_con):
1002
+ ax_ligand_ac_con = atom_only_deltametric(ax_ligand_list[i].mol, prop, depth, ax_con_int_list[i])
1003
+ else:
1004
+ ax_ligand_ac_con += atom_only_deltametric(ax_ligand_list[i].mol, prop, depth, ax_con_int_list[i])
1005
+ ax_ligand_ac_con = np.divide(ax_ligand_ac_con, n_ax)
1006
+ for i in range(0, n_eq):
1007
+ if not list(eq_ligand_ac_con):
1008
+ eq_ligand_ac_con = atom_only_deltametric(eq_ligand_list[i].mol, prop, depth, eq_con_int_list[i])
1009
+ else:
1010
+ eq_ligand_ac_con += atom_only_deltametric(eq_ligand_list[i].mol, prop, depth, eq_con_int_list[i])
1011
+ eq_ligand_ac_con = np.divide(eq_ligand_ac_con, n_eq)
1012
+
1013
+ return ax_ligand_ac_con, eq_ligand_ac_con
1014
+
1015
+
1016
+ def find_ligand_deltametric_derivatives_oct(mol, prop, loud, depth, name=False, oct=True, custom_ligand_dict=False):
1017
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
1018
+ # # ax_con_int_list ,eq_con_int_list
1019
+ # # with types: eq/ax_ligand_list list of mol3D
1020
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
1021
+ # # this function takes a
1022
+ # # octahedral complex
1023
+ # # and returns deltametrics for
1024
+ # # the axial an equatorial ligands
1025
+ if not custom_ligand_dict:
1026
+ liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
1027
+ (ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
1028
+ eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
1029
+ mol, liglist, ligdents, ligcons, loud, name=False)
1030
+ else:
1031
+ ax_ligand_list = custom_ligand_dict["ax_ligand_list"]
1032
+ eq_ligand_list = custom_ligand_dict["eq_ligand_list"]
1033
+ ax_con_int_list = custom_ligand_dict["ax_con_int_list"]
1034
+ eq_con_int_list = custom_ligand_dict["eq_con_int_list"]
1035
+
1036
+ # count ligands
1037
+ n_ax = len(ax_ligand_list)
1038
+ n_eq = len(eq_ligand_list)
1039
+
1040
+ # allocate the full jacobian matrix
1041
+ ax_con_j = np.zeros([depth + 1, mol.natoms])
1042
+ eq_con_j = np.zeros([depth + 1, mol.natoms])
1043
+
1044
+ for i in range(0, n_ax):
1045
+ ax_ligand_ac_con_derivative = atom_only_deltametric_derivative(ax_ligand_list[i].mol, prop, depth,
1046
+ ax_con_int_list[i])
1047
+ # now we need to map back to full positions
1048
+ for ii, row in enumerate(ax_ligand_ac_con_derivative):
1049
+ for original_ids in list(ax_ligand_list[i].ext_int_dict.keys()):
1050
+ ax_con_j[ii, original_ids] += np.divide(row[ax_ligand_list[i].ext_int_dict[original_ids]], n_ax)
1051
+
1052
+ for i in range(0, n_eq):
1053
+ eq_ligand_ac_con_derivative = atom_only_deltametric_derivative(eq_ligand_list[i].mol, prop, depth,
1054
+ eq_con_int_list[i])
1055
+ for ii, row in enumerate(eq_ligand_ac_con_derivative):
1056
+ for original_ids in list(eq_ligand_list[i].ext_int_dict.keys()):
1057
+ eq_con_j[ii, original_ids] += np.divide(row[eq_ligand_list[i].ext_int_dict[original_ids]], n_eq)
1058
+
1059
+ return ax_con_j, eq_con_j
1060
+
1061
+
1062
+ def find_mc_eq_ax_deltametrics_oct(mol, prop, loud, depth, name=False, oct=True,
1063
+ func=deltametric_catoms):
1064
+ # For octahedral complexes only.
1065
+ # Calculate mc/ax, mc/eq deltametrics.
1066
+ liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
1067
+ (ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
1068
+ eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
1069
+ mol, liglist, ligdents, ligcons, loud, name=False)
1070
+ # shape reduce
1071
+ ax_con_list = [x[0] for x in ax_con_list]
1072
+ eq_con_list = [x[0] for x in eq_con_list]
1073
+ ax_ligand_del_mc = metal_only_deltametric(mol, prop, depth, catoms=ax_con_list, func=func)
1074
+ eq_ligand_del_mc = metal_only_deltametric(mol, prop, depth, catoms=eq_con_list, func=func)
1075
+ ax_ligand_del_mc = np.divide(ax_ligand_del_mc, len(ax_con_list))
1076
+ eq_ligand_del_mc = np.divide(eq_ligand_del_mc, len(eq_con_list))
1077
+ return ax_ligand_del_mc, eq_ligand_del_mc
1078
+
1079
+
1080
+ def find_mc_eq_ax_autocorrelation_oct(mol, prop, loud, depth, name=False, oct=True,
1081
+ func=autocorrelation_catoms, modifier=False):
1082
+ # For octahedral complexes only.
1083
+ # Calculate mc/ax, mc/eq deltametrics.
1084
+ liglist, ligdents, ligcons = ligand_breakdown(mol, BondedOct=oct)
1085
+ (ax_ligand_list, eq_ligand_list, ax_natoms_list, eq_natoms_list, ax_con_int_list,
1086
+ eq_con_int_list, ax_con_list, eq_con_list, built_ligand_list) = ligand_assign(
1087
+ mol, liglist, ligdents, ligcons, loud, name=False)
1088
+ # shape reduce
1089
+ ax_con_list = [x[0] for x in ax_con_list]
1090
+ eq_con_list = [x[0] for x in eq_con_list]
1091
+ ax_ligand_ac_mc = metal_only_autocorrelation(mol, prop, depth, catoms=ax_con_list, func=func, modifier=modifier)
1092
+ eq_ligand_ac_mc = metal_only_autocorrelation(mol, prop, depth, catoms=eq_con_list, func=func, modifier=modifier)
1093
+ ax_ligand_ac_mc = np.divide(ax_ligand_ac_mc, len(ax_con_list))
1094
+ eq_ligand_ac_mc = np.divide(eq_ligand_ac_mc, len(eq_con_list))
1095
+ return ax_ligand_ac_mc, eq_ligand_ac_mc
1096
+
1097
+
1098
+ def generate_mc_eq_ax_deltametrics(mol, loud, depth=4, name=False,
1099
+ func=deltametric_catoms, NumB=False, Gval=False):
1100
+ result_ax_mc = list()
1101
+ result_eq_mc = list()
1102
+ colnames = []
1103
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1104
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1105
+ if Gval:
1106
+ allowed_strings += ['group_number']
1107
+ labels_strings += ['Gval']
1108
+ if NumB:
1109
+ allowed_strings += ["num_bonds"]
1110
+ labels_strings += ["NumB"]
1111
+ for ii, properties in enumerate(allowed_strings):
1112
+ ax_ligand_ac_con, eq_ligand_ac_con = find_mc_eq_ax_deltametrics_oct(mol, properties, loud, depth, name,
1113
+ func=func)
1114
+ this_colnames = []
1115
+ for i in range(0, depth + 1):
1116
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1117
+ colnames.append(this_colnames)
1118
+ result_ax_mc.append(ax_ligand_ac_con)
1119
+ result_eq_mc.append(eq_ligand_ac_con)
1120
+ results_dictionary = {'colnames': colnames, 'result_mc_ax_del': result_ax_mc,
1121
+ 'result_mc_eq_del': result_eq_mc}
1122
+ return results_dictionary
1123
+
1124
+
1125
+ def generate_mc_eq_ax_autocorrelation(mol, loud, depth=4, name=False,
1126
+ func=autocorrelation_catoms, NumB=False, Gval=False):
1127
+ result_ax_mc = list()
1128
+ result_eq_mc = list()
1129
+ colnames = []
1130
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1131
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1132
+ if Gval:
1133
+ allowed_strings += ['group_number']
1134
+ labels_strings += ['Gval']
1135
+ if NumB:
1136
+ allowed_strings += ["num_bonds"]
1137
+ labels_strings += ["NumB"]
1138
+ for ii, properties in enumerate(allowed_strings):
1139
+ ax_ligand_ac_con, eq_ligand_ac_con = find_mc_eq_ax_autocorrelation_oct(mol, properties, loud, depth, name,
1140
+ func=func)
1141
+ this_colnames = []
1142
+ for i in range(0, depth + 1):
1143
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1144
+ colnames.append(this_colnames)
1145
+ result_ax_mc.append(ax_ligand_ac_con)
1146
+ result_eq_mc.append(eq_ligand_ac_con)
1147
+ results_dictionary = {'colnames': colnames, 'result_mc_ax_ac': result_ax_mc,
1148
+ 'result_mc_eq_ac': result_eq_mc}
1149
+ return results_dictionary
1150
+
1151
+
1152
+ def generate_all_ligand_autocorrelations(mol, loud, depth=4, name=False, flag_name=False,
1153
+ custom_ligand_dict=False, NumB=False, Gval=False):
1154
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
1155
+ # # ax_con_int_list ,eq_con_int_list
1156
+ # # with types: eq/ax_ligand_list list of mol3D
1157
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
1158
+ result_ax_full = list()
1159
+ result_eq_full = list()
1160
+ result_ax_con = list()
1161
+ result_eq_con = list()
1162
+ colnames = []
1163
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1164
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1165
+ if Gval:
1166
+ allowed_strings += ['group_number']
1167
+ labels_strings += ['Gval']
1168
+ if NumB:
1169
+ allowed_strings += ["num_bonds"]
1170
+ labels_strings += ["NumB"]
1171
+ for ii, properties in enumerate(allowed_strings):
1172
+ (ax_ligand_ac_full,
1173
+ eq_ligand_ac_full,
1174
+ ax_ligand_ac_con,
1175
+ eq_ligand_ac_con) = find_ligand_autocorrelations_oct(
1176
+ mol,
1177
+ properties,
1178
+ loud=loud,
1179
+ depth=depth,
1180
+ name=name,
1181
+ oct=True,
1182
+ custom_ligand_dict=custom_ligand_dict)
1183
+ this_colnames = []
1184
+ for i in range(0, depth + 1):
1185
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1186
+ colnames.append(this_colnames)
1187
+ result_ax_full.append(ax_ligand_ac_full)
1188
+ result_eq_full.append(eq_ligand_ac_full)
1189
+ result_ax_con.append(ax_ligand_ac_con)
1190
+ result_eq_con.append(eq_ligand_ac_con)
1191
+ if flag_name:
1192
+ results_dictionary = {'colnames': colnames,
1193
+ 'result_ax_full_ac': result_ax_full,
1194
+ 'result_eq_full_ac': result_eq_full,
1195
+ 'result_ax_con_ac': result_ax_con,
1196
+ 'result_eq_con_ac': result_eq_con}
1197
+ else:
1198
+ results_dictionary = {'colnames': colnames,
1199
+ 'result_ax_full': result_ax_full,
1200
+ 'result_eq_full': result_eq_full,
1201
+ 'result_ax_con': result_ax_con,
1202
+ 'result_eq_con': result_eq_con}
1203
+ return results_dictionary
1204
+
1205
+
1206
+ def generate_all_ligand_autocorrelation_derivatives(mol, loud, depth=4, name=False, flag_name=False,
1207
+ custom_ligand_dict=False, NumB=False, Gval=False):
1208
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
1209
+ # # ax_con_int_list ,eq_con_int_list
1210
+ # # with types: eq/ax_ligand_list list of mol3D
1211
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
1212
+ result_ax_full = None
1213
+ result_eq_full = None
1214
+ result_ax_con = None
1215
+ result_eq_con = None
1216
+
1217
+ colnames = []
1218
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1219
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1220
+ if Gval:
1221
+ allowed_strings += ['group_number']
1222
+ labels_strings += ['Gval']
1223
+ if NumB:
1224
+ allowed_strings += ["num_bonds"]
1225
+ labels_strings += ["NumB"]
1226
+ for ii, properties in enumerate(allowed_strings):
1227
+ ax_ligand_ac_full, eq_ligand_ac_full, ax_ligand_ac_con, eq_ligand_ac_con = find_ligand_autocorrelation_derivatives_oct(
1228
+ mol,
1229
+ properties,
1230
+ loud=loud,
1231
+ depth=depth,
1232
+ name=name,
1233
+ oct=True,
1234
+ custom_ligand_dict=custom_ligand_dict)
1235
+ for i in range(0, depth + 1):
1236
+ colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
1237
+ range(0, mol.natoms)])
1238
+ if result_ax_full is None:
1239
+ result_ax_full = ax_ligand_ac_full
1240
+ else:
1241
+ result_ax_full = np.row_stack([result_ax_full, ax_ligand_ac_full])
1242
+
1243
+ if result_eq_full is None:
1244
+ result_eq_full = eq_ligand_ac_full
1245
+ else:
1246
+ result_eq_full = np.row_stack([result_eq_full, eq_ligand_ac_full])
1247
+
1248
+ if result_ax_con is None:
1249
+ result_ax_con = ax_ligand_ac_con
1250
+ else:
1251
+ result_ax_con = np.row_stack([result_ax_con, ax_ligand_ac_con])
1252
+
1253
+ if result_eq_con is None:
1254
+ result_eq_con = eq_ligand_ac_con
1255
+ else:
1256
+ result_eq_con = np.row_stack([result_eq_con, eq_ligand_ac_con])
1257
+
1258
+ if flag_name:
1259
+ results_dictionary = {'colnames': colnames, 'result_ax_full_ac': result_ax_full,
1260
+ 'result_eq_full_ac': result_eq_full,
1261
+ 'result_ax_con_ac': result_ax_con, 'result_eq_con_ac': result_eq_con}
1262
+ else:
1263
+ results_dictionary = {'colnames': colnames, 'result_ax_full': result_ax_full, 'result_eq_full': result_eq_full,
1264
+ 'result_ax_con': result_ax_con, 'result_eq_con': result_eq_con}
1265
+ return results_dictionary
1266
+
1267
+
1268
+ def generate_all_ligand_autocorrs_and_deltametrics_dimers(mol, loud, depth=4, name=False, flag_name=False,
1269
+ custom_ligand_dict=False, NumB=False, Gval=False):
1270
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
1271
+ # # ax_con_int_list ,eq_con_int_list
1272
+ # # with types: eq/ax_ligand_list list of mol3D
1273
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
1274
+ result_ax1_full = list()
1275
+ result_ax2_full = list()
1276
+ result_ax3_full = list()
1277
+ result_ax1_con = list()
1278
+ result_ax2_con = list()
1279
+ result_ax3_con = list()
1280
+ result_delta_ax1_con = list()
1281
+ result_delta_ax2_con = list()
1282
+ result_delta_ax3_con = list()
1283
+
1284
+ colnames = []
1285
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1286
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1287
+ if Gval:
1288
+ allowed_strings += ['group_number']
1289
+ labels_strings += ['Gval']
1290
+ if NumB:
1291
+ allowed_strings += ["num_bonds"]
1292
+ labels_strings += ["NumB"]
1293
+ for ii, properties in enumerate(allowed_strings):
1294
+ # lig_autocorrs is a list of length 6 (ax{i}_ligand_ac_fulls, ax{i}_ligand_ac_cons)
1295
+ lig_autocorrs = find_ligand_autocorrs_and_deltametrics_oct_dimers(mol,
1296
+ properties,
1297
+ loud=loud,
1298
+ depth=depth,
1299
+ name=name,
1300
+ oct=True,
1301
+ custom_ligand_dict=custom_ligand_dict)
1302
+ this_colnames = []
1303
+ assert all([len(i) > 0 for i in lig_autocorrs]), 'Some ligand autocorrelations are empty! %s' % lig_autocorrs
1304
+ for i in range(0, depth + 1):
1305
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1306
+ colnames.append(this_colnames)
1307
+ result_ax1_full.append(lig_autocorrs[0])
1308
+ result_ax2_full.append(lig_autocorrs[1])
1309
+ result_ax3_full.append(lig_autocorrs[2])
1310
+ result_ax1_con.append(lig_autocorrs[3])
1311
+ result_ax2_con.append(lig_autocorrs[4])
1312
+ result_ax3_con.append(lig_autocorrs[5])
1313
+ result_delta_ax1_con.append(lig_autocorrs[6])
1314
+ result_delta_ax2_con.append(lig_autocorrs[7])
1315
+ result_delta_ax3_con.append(lig_autocorrs[8])
1316
+
1317
+ results_dictionary = {'colnames': colnames,
1318
+ 'result_ax1_full': result_ax1_full,
1319
+ 'result_ax2_full': result_ax2_full,
1320
+ 'result_ax3_full': result_ax3_full,
1321
+ 'result_ax1_con': result_ax1_con,
1322
+ 'result_ax2_con': result_ax2_con,
1323
+ 'result_ax3_con': result_ax3_con,
1324
+ 'result_delta_ax1_con': result_delta_ax1_con,
1325
+ 'result_delta_ax2_con': result_delta_ax2_con,
1326
+ 'result_delta_ax3_con': result_delta_ax3_con}
1327
+ # if flag_name:
1328
+ # results_dictionary = {'colnames': colnames, 'result_ax_full_ac': result_ax_full,
1329
+ # 'result_eq_full_ac': result_eq_full,
1330
+ # 'result_ax_con_ac': result_ax_con, 'result_eq_con_ac': result_eq_con}
1331
+ # else:
1332
+ # results_dictionary = {'colnames': colnames, 'result_ax_full': result_ax_full, 'result_eq_full': result_eq_full,
1333
+ # 'result_ax_con': result_ax_con, 'result_eq_con': result_eq_con}
1334
+ return results_dictionary
1335
+
1336
+
1337
+ def generate_all_ligand_deltametrics(mol, loud, depth=4, name=False, flag_name=False,
1338
+ custom_ligand_dict=False, NumB=False, Gval=False):
1339
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
1340
+ # # ax_con_int_list ,eq_con_int_list
1341
+ # # with types: eq/ax_ligand_list list of mol3D
1342
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
1343
+
1344
+ result_ax_con = list()
1345
+ result_eq_con = list()
1346
+ colnames = []
1347
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1348
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1349
+ if Gval:
1350
+ allowed_strings += ['group_number']
1351
+ labels_strings += ['Gval']
1352
+ if NumB:
1353
+ allowed_strings += ["num_bonds"]
1354
+ labels_strings += ["NumB"]
1355
+ for ii, properties in enumerate(allowed_strings):
1356
+ ax_ligand_ac_con, eq_ligand_ac_con = find_ligand_deltametrics_oct(mol, properties, loud, depth, name, oct=True,
1357
+ custom_ligand_dict=custom_ligand_dict)
1358
+ this_colnames = []
1359
+ for i in range(0, depth + 1):
1360
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1361
+ colnames.append(this_colnames)
1362
+ result_ax_con.append(ax_ligand_ac_con)
1363
+ result_eq_con.append(eq_ligand_ac_con)
1364
+ if flag_name:
1365
+ results_dictionary = {'colnames': colnames, 'result_ax_con_del': result_ax_con,
1366
+ 'result_eq_con_del': result_eq_con}
1367
+ else:
1368
+ results_dictionary = {'colnames': colnames, 'result_ax_con': result_ax_con, 'result_eq_con': result_eq_con}
1369
+ return results_dictionary
1370
+
1371
+
1372
+ def generate_all_ligand_deltametric_derivatives(mol, loud, depth=4, name=False, flag_name=False,
1373
+ custom_ligand_dict=False, NumB=False, Gval=False):
1374
+ # # custom_ligand_dict.keys() must be eq_ligands_list, ax_ligand_list
1375
+ # # ax_con_int_list ,eq_con_int_list
1376
+ # # with types: eq/ax_ligand_list list of mol3D
1377
+ # # eq/ax_con_int_list list of list/tuple of int e.g, [[1,2] [1,2]]
1378
+
1379
+ result_ax_con = None
1380
+ result_eq_con = None
1381
+ colnames = []
1382
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1383
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1384
+ if Gval:
1385
+ allowed_strings += ['group_number']
1386
+ labels_strings += ['Gval']
1387
+ if NumB:
1388
+ allowed_strings += ["num_bonds"]
1389
+ labels_strings += ["NumB"]
1390
+ for ii, properties in enumerate(allowed_strings):
1391
+ ax_ligand_ac_con, eq_ligand_ac_con = find_ligand_deltametric_derivatives_oct(mol, properties, loud, depth, name,
1392
+ oct=True,
1393
+ custom_ligand_dict=custom_ligand_dict)
1394
+
1395
+ for i in range(0, depth + 1):
1396
+ colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
1397
+ range(0, mol.natoms)])
1398
+ if result_ax_con is None:
1399
+ result_ax_con = ax_ligand_ac_con
1400
+ else:
1401
+ result_ax_con = np.row_stack([result_ax_con, ax_ligand_ac_con])
1402
+ if result_eq_con is None:
1403
+ result_eq_con = eq_ligand_ac_con
1404
+ else:
1405
+ result_eq_con = np.row_stack([result_eq_con, eq_ligand_ac_con])
1406
+ if flag_name:
1407
+ results_dictionary = {'colnames': colnames, 'result_ax_con_del': result_ax_con,
1408
+ 'result_eq_con_del': result_eq_con}
1409
+ else:
1410
+ results_dictionary = {'colnames': colnames, 'result_ax_con': result_ax_con, 'result_eq_con': result_eq_con}
1411
+ return results_dictionary
1412
+
1413
+
1414
+ def generate_metal_autocorrelations(mol, loud, depth=4, oct=True, flag_name=False,
1415
+ modifier=False, NumB=False, Gval=False):
1416
+ # oct - bool, if complex is octahedral, will use better bond checks
1417
+ result = list()
1418
+ colnames = []
1419
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1420
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1421
+ if Gval:
1422
+ allowed_strings += ['group_number']
1423
+ labels_strings += ['Gval']
1424
+ if NumB:
1425
+ allowed_strings += ["num_bonds"]
1426
+ labels_strings += ["NumB"]
1427
+ for ii, properties in enumerate(allowed_strings):
1428
+ metal_ac = metal_only_autocorrelation(mol, properties, depth, oct=oct, modifier=modifier)
1429
+ this_colnames = []
1430
+ for i in range(0, depth + 1):
1431
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1432
+ colnames.append(this_colnames)
1433
+ result.append(metal_ac)
1434
+ if flag_name:
1435
+ results_dictionary = {'colnames': colnames, 'results_mc_ac': result}
1436
+ else:
1437
+ results_dictionary = {'colnames': colnames, 'results': result}
1438
+ return results_dictionary
1439
+
1440
+
1441
+ def generate_metal_autocorrelation_derivatives(mol, loud, depth=4, oct=True, flag_name=False,
1442
+ modifier=False, NumB=False, Gval=False):
1443
+ # oct - bool, if complex is octahedral, will use better bond checks
1444
+ result = None
1445
+ colnames = []
1446
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1447
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1448
+ if Gval:
1449
+ allowed_strings += ['group_number']
1450
+ labels_strings += ['Gval']
1451
+ if NumB:
1452
+ allowed_strings += ["num_bonds"]
1453
+ labels_strings += ["NumB"]
1454
+ for ii, properties in enumerate(allowed_strings):
1455
+ metal_ac_der = metal_only_autocorrelation_derivative(mol, properties, depth, oct=oct, modifier=modifier)
1456
+ for i in range(0, depth + 1):
1457
+ colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
1458
+ range(0, mol.natoms)])
1459
+
1460
+ if result is None:
1461
+ result = metal_ac_der
1462
+ else:
1463
+ result = np.row_stack([result, metal_ac_der])
1464
+ if flag_name:
1465
+ results_dictionary = {'colnames': colnames, 'results_mc_ac': result}
1466
+ else:
1467
+ results_dictionary = {'colnames': colnames, 'results': result}
1468
+ return results_dictionary
1469
+
1470
+
1471
+ def generate_multimetal_autocorrelations(mol, loud, depth=4, oct=True, flag_name=False, polarizability=False, Gval=False):
1472
+ # oct - bool, if complex is octahedral, will use better bond checks
1473
+ result = list()
1474
+ colnames = []
1475
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1476
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1477
+ if Gval:
1478
+ allowed_strings += ['group_number']
1479
+ labels_strings += ['Gval']
1480
+ if polarizability:
1481
+ allowed_strings += ['polarizability']
1482
+ labels_strings += ['alpha']
1483
+ for ii, properties in enumerate(allowed_strings):
1484
+ metal_ac = multimetal_only_autocorrelation(mol, properties, depth, oct=oct)
1485
+ this_colnames = []
1486
+ for i in range(0, depth + 1):
1487
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1488
+ colnames.append(this_colnames)
1489
+ result.append(metal_ac)
1490
+ if flag_name:
1491
+ results_dictionary = {'colnames': colnames, 'results_mc_ac': result}
1492
+ else:
1493
+ results_dictionary = {'colnames': colnames, 'results': result}
1494
+ return results_dictionary
1495
+
1496
+
1497
+ def generate_multiatom_autocorrelations(mol, loud, depth=4, oct=True, flag_name=False, additional_elements=False):
1498
+ # oct - bool, if complex is octahedral, will use better bond checks
1499
+ result = list()
1500
+ colnames = []
1501
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1502
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1503
+ for ii, properties in enumerate(allowed_strings):
1504
+ metal_ac = multiatom_only_autocorrelation(mol, properties, depth, oct=oct, additional_elements=additional_elements)
1505
+ this_colnames = []
1506
+ for i in range(0, depth + 1):
1507
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1508
+ colnames.append(this_colnames)
1509
+ result.append(metal_ac)
1510
+ if flag_name:
1511
+ results_dictionary = {'colnames': colnames, 'results_mc_ac': result}
1512
+ else:
1513
+ results_dictionary = {'colnames': colnames, 'results': result}
1514
+ return results_dictionary
1515
+
1516
+
1517
+ def generate_metal_ox_autocorrelations(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
1518
+ # # oxmodifier - dict, used to modify prop vector (e.g. for adding
1519
+ # # ONLY used with ox_nuclear_charge ox or charge)
1520
+ # # {"Fe":2, "Co": 3} etc, normally only 1 metal...
1521
+ # oct - bool, if complex is octahedral, will use better bond checks
1522
+ result = list()
1523
+ colnames = []
1524
+ metal_ox_ac = metal_only_autocorrelation(mol, 'ox_nuclear_charge', depth, oct=oct, modifier=oxmodifier)
1525
+ this_colnames = []
1526
+ for i in range(0, depth + 1):
1527
+ this_colnames.append('O' + '-' + str(i))
1528
+ colnames.append(this_colnames)
1529
+ result.append(metal_ox_ac)
1530
+ results_dictionary = {'colnames': colnames, 'results': result}
1531
+ return results_dictionary
1532
+
1533
+
1534
+ def generate_metal_ox_autocorrelation_derivatives(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
1535
+ # # oxmodifier - dict, used to modify prop vector (e.g. for adding
1536
+ # # ONLY used with ox_nuclear_charge ox or charge)
1537
+ # # {"Fe":2, "Co": 3} etc, normally only 1 metal...
1538
+ # oct - bool, if complex is octahedral, will use better bond checks
1539
+ result = None
1540
+ colnames = []
1541
+ metal_ox_ac = metal_only_autocorrelation_derivative(mol, 'ox_nuclear_charge', depth, oct=oct, modifier=oxmodifier)
1542
+ for i in range(0, depth + 1):
1543
+ colnames.append(['d' + 'O' + '-' + str(i) + '/d' + 'O' + str(j) for j in range(0, mol.natoms)])
1544
+ result = metal_ox_ac
1545
+ results_dictionary = {'colnames': colnames, 'results': result}
1546
+ return results_dictionary
1547
+
1548
+
1549
+ def generate_metal_ox_deltametrics(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
1550
+ # # oxmodifier - dict, used to modify prop vector (e.g. for adding
1551
+ # # ONLY used with ox_nuclear_charge ox or charge)
1552
+ # # {"Fe":2, "Co": 3} etc, normally only 1 metal...
1553
+ # oct - bool, if complex is octahedral, will use better bond checks
1554
+ result = list()
1555
+ colnames = []
1556
+ metal_ox_ac = metal_only_deltametric(mol, 'ox_nuclear_charge', depth, oct=oct, modifier=oxmodifier)
1557
+ this_colnames = []
1558
+ for i in range(0, depth + 1):
1559
+ this_colnames.append('O' + '-' + str(i))
1560
+ colnames.append(this_colnames)
1561
+ result.append(metal_ox_ac)
1562
+ results_dictionary = {'colnames': colnames, 'results': result}
1563
+ return results_dictionary
1564
+
1565
+
1566
+ def generate_metal_ox_deltametric_derivatives(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
1567
+ # # oxmodifier - dict, used to modify prop vector (e.g. for adding
1568
+ # # ONLY used with ox_nuclear_charge ox or charge)
1569
+ # # {"Fe":2, "Co": 3} etc, normally only 1 metal...
1570
+ # oct - bool, if complex is octahedral, will use better bond checks
1571
+ result = list()
1572
+ colnames = []
1573
+ metal_ox_ac = metal_only_deltametric_derivative(mol, 'ox_nuclear_charge', depth, oct=oct, modifier=oxmodifier)
1574
+ for i in range(0, depth + 1):
1575
+ colnames.append(['d' + 'O' + '-' + str(i) + '/d' + 'O' + str(j) for j in range(0, mol.natoms)])
1576
+
1577
+ result = metal_ox_ac
1578
+ results_dictionary = {'colnames': colnames, 'results': result}
1579
+ return results_dictionary
1580
+
1581
+
1582
+ def generate_metal_ox_eff_autocorrelations(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
1583
+ # # oxmodifier - dict, used to modify prop vector (e.g. for adding
1584
+ # # ONLY used with ox_nuclear_charge ox or charge)
1585
+ # # {"Fe":2, "Co": 3} etc, normally only 1 metal...
1586
+ # oct - bool, if complex is octahedral, will use better bond checks
1587
+ result = list()
1588
+ colnames = []
1589
+ metal_ox_ac = metal_only_autocorrelation(mol, 'group_number', depth, oct=oct, modifier=oxmodifier)
1590
+ this_colnames = []
1591
+ for i in range(0, depth + 1):
1592
+ this_colnames.append('Gval' + '-' + str(i))
1593
+ colnames.append(this_colnames)
1594
+ result.append(metal_ox_ac)
1595
+ results_dictionary = {'colnames': colnames, 'results': result}
1596
+ return results_dictionary
1597
+
1598
+
1599
+ def generate_metal_ox_eff_deltametrics(oxmodifier, mol, loud, depth=4, oct=True, flag_name=False):
1600
+ # # oxmodifier - dict, used to modify prop vector (e.g. for adding
1601
+ # # ONLY used with ox_nuclear_charge ox or charge)
1602
+ # # {"Fe":2, "Co": 3} etc, normally only 1 metal...
1603
+ # oct - bool, if complex is octahedral, will use better bond checks
1604
+ result = list()
1605
+ colnames = []
1606
+ metal_ox_ac = metal_only_deltametric(mol, 'group_number', depth, oct=oct, modifier=oxmodifier)
1607
+ this_colnames = []
1608
+ for i in range(0, depth + 1):
1609
+ this_colnames.append('Gval' + '-' + str(i))
1610
+ colnames.append(this_colnames)
1611
+ result.append(metal_ox_ac)
1612
+ results_dictionary = {'colnames': colnames, 'results': result}
1613
+ return results_dictionary
1614
+
1615
+
1616
+ def generate_metal_deltametrics(mol, loud, depth=4, oct=True, flag_name=False,
1617
+ modifier=False, NumB=False, Gval=False):
1618
+ # oct - bool, if complex is octahedral, will use better bond checks
1619
+ result = list()
1620
+ colnames = []
1621
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1622
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1623
+ if Gval:
1624
+ allowed_strings += ['group_number']
1625
+ labels_strings += ['Gval']
1626
+ if NumB:
1627
+ allowed_strings += ["num_bonds"]
1628
+ labels_strings += ["NumB"]
1629
+ for ii, properties in enumerate(allowed_strings):
1630
+ metal_ac = metal_only_deltametric(mol, properties, depth, oct=oct, modifier=modifier)
1631
+ this_colnames = []
1632
+ for i in range(0, depth + 1):
1633
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1634
+ colnames.append(this_colnames)
1635
+ result.append(metal_ac)
1636
+ if flag_name:
1637
+ results_dictionary = {'colnames': colnames, 'results_mc_del': result}
1638
+ else:
1639
+ results_dictionary = {'colnames': colnames, 'results': result}
1640
+ return results_dictionary
1641
+
1642
+
1643
+ def generate_metal_deltametric_derivatives(mol, loud, depth=4, oct=True, flag_name=False,
1644
+ modifier=False, NumB=False, Gval=False):
1645
+ # oct - bool, if complex is octahedral, will use better bond checks
1646
+ result = None
1647
+ colnames = []
1648
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1649
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1650
+ if Gval:
1651
+ allowed_strings += ['group_number']
1652
+ labels_strings += ['Gval']
1653
+ if NumB:
1654
+ allowed_strings += ["num_bonds"]
1655
+ labels_strings += ["NumB"]
1656
+ for ii, properties in enumerate(allowed_strings):
1657
+ metal_ac_der = metal_only_deltametric_derivative(mol, properties, depth, oct=oct, modifier=modifier)
1658
+ for i in range(0, depth + 1):
1659
+ colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
1660
+ range(0, mol.natoms)])
1661
+ if result is None:
1662
+ result = metal_ac_der
1663
+ else:
1664
+ result = np.row_stack([result, metal_ac_der])
1665
+ if flag_name:
1666
+ results_dictionary = {'colnames': colnames, 'results_mc_del': result}
1667
+ else:
1668
+ results_dictionary = {'colnames': colnames, 'results': result}
1669
+ return results_dictionary
1670
+
1671
+
1672
+ def generate_multimetal_deltametrics(mol, loud, depth=4, oct=True, flag_name=False, polarizability=False, Gval=False):
1673
+ # oct - bool, if complex is octahedral, will use better bond checks
1674
+ result = list()
1675
+ colnames = []
1676
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1677
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1678
+ if Gval:
1679
+ allowed_strings += ['group_number']
1680
+ labels_strings += ['Gval']
1681
+ if polarizability:
1682
+ allowed_strings += ['polarizability']
1683
+ labels_strings += ['alpha']
1684
+ for ii, properties in enumerate(allowed_strings):
1685
+ metal_ac = multimetal_only_deltametric(mol, properties, depth, oct=oct)
1686
+ this_colnames = []
1687
+ for i in range(0, depth + 1):
1688
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1689
+ colnames.append(this_colnames)
1690
+ result.append(metal_ac)
1691
+ if flag_name:
1692
+ results_dictionary = {'colnames': colnames, 'results_mc_del': result}
1693
+ else:
1694
+ results_dictionary = {'colnames': colnames, 'results': result}
1695
+ return results_dictionary
1696
+
1697
+
1698
+ def generate_multiatom_deltametrics(mol, loud, depth=4, oct=True, flag_name=False, additional_elements=False):
1699
+ # oct - bool, if complex is octahedral, will use better bond checks
1700
+ result = list()
1701
+ colnames = []
1702
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1703
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1704
+ for ii, properties in enumerate(allowed_strings):
1705
+ metal_ac = multiatom_only_deltametric(mol, properties, depth, oct=oct, additional_elements=additional_elements)
1706
+ this_colnames = []
1707
+ for i in range(0, depth + 1):
1708
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1709
+ colnames.append(this_colnames)
1710
+ result.append(metal_ac)
1711
+ if flag_name:
1712
+ results_dictionary = {'colnames': colnames, 'results_mc_del': result}
1713
+ else:
1714
+ results_dictionary = {'colnames': colnames, 'results': result}
1715
+ return results_dictionary
1716
+
1717
+
1718
+ def generate_full_complex_autocorrelations(mol, loud,
1719
+ depth=4, oct=True,
1720
+ flag_name=False, modifier=False,
1721
+ use_dist=False, NumB=False, Gval=False, polarizability=False):
1722
+ result = list()
1723
+ colnames = []
1724
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1725
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1726
+ if Gval:
1727
+ allowed_strings += ['group_number']
1728
+ labels_strings += ['Gval']
1729
+ if NumB:
1730
+ allowed_strings += ["num_bonds"]
1731
+ labels_strings += ["NumB"]
1732
+ if polarizability:
1733
+ allowed_strings += ["polarizability"]
1734
+ labels_strings += ["alpha"]
1735
+ for ii, properties in enumerate(allowed_strings):
1736
+ metal_ac = full_autocorrelation(mol, properties, depth,
1737
+ oct=oct, modifier=modifier,
1738
+ use_dist=use_dist)
1739
+ this_colnames = []
1740
+ for i in range(0, depth + 1):
1741
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1742
+ colnames.append(this_colnames)
1743
+ result.append(metal_ac)
1744
+ if flag_name:
1745
+ results_dictionary = {'colnames': colnames, 'results_f_all': result}
1746
+ else:
1747
+ results_dictionary = {'colnames': colnames, 'results': result}
1748
+ return results_dictionary
1749
+
1750
+
1751
+ def generate_full_complex_coulomb_autocorrelations(mol, loud,
1752
+ depth=3, oct=True,
1753
+ flag_name=False, modifier=False,
1754
+ use_dist=False, transition_metals_only=True):
1755
+ result = list()
1756
+ colnames = []
1757
+ # allowed_strings = ['ident', 'topology', 'bondvalence', 'valenceelectron', 'bondvalence_devi', 'bodavrg', 'bodstd',
1758
+ # 'charge']
1759
+ # labels_strings = ['I', 'T', 'BV', 'VE', 'BVD', "BODavrg", "BODstd", "Ch"]
1760
+ allowed_strings = ['ident', 'topology', 'group_number', "num_bonds"]
1761
+ labels_strings = ['I', 'T', 'Gval', "NumB"]
1762
+ for ii, properties in enumerate(allowed_strings):
1763
+ metal_ac = full_autocorrelation(mol, properties, depth,
1764
+ oct=oct, modifier=modifier,
1765
+ use_dist=use_dist,
1766
+ transition_metals_only=transition_metals_only)
1767
+ this_colnames = []
1768
+ for i in range(0, depth + 1):
1769
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1770
+ colnames.append(this_colnames)
1771
+ result.append(metal_ac)
1772
+ if flag_name:
1773
+ results_dictionary = {'colnames': colnames, 'results_f_all': result}
1774
+ else:
1775
+ results_dictionary = {'colnames': colnames, 'results': result}
1776
+ return results_dictionary
1777
+
1778
+
1779
+ def generate_full_complex_autocorrelation_derivatives(mol, loud, depth=4, oct=True, flag_name=False,
1780
+ modifier=False, NumB=False, Gval=False):
1781
+ result = None
1782
+ colnames = []
1783
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1784
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1785
+ if Gval:
1786
+ allowed_strings += ['group_number']
1787
+ labels_strings += ['Gval']
1788
+ if NumB:
1789
+ allowed_strings += ["num_bonds"]
1790
+ labels_strings += ["NumB"]
1791
+ for ii, properties in enumerate(allowed_strings):
1792
+ f_ac_der = full_autocorrelation_derivative(mol, properties, depth, oct=oct, modifier=modifier)
1793
+ for i in range(0, depth + 1):
1794
+ colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
1795
+ range(0, mol.natoms)])
1796
+ if result is None:
1797
+ result = f_ac_der
1798
+ else:
1799
+ result = np.row_stack([result, f_ac_der])
1800
+ if flag_name:
1801
+ results_dictionary = {'colnames': colnames, 'results_f_all': result}
1802
+ else:
1803
+ results_dictionary = {'colnames': colnames, 'results': result}
1804
+ return results_dictionary
1805
+
1806
+
1807
+ def generate_atomonly_autocorrelations(mol, atomIdx, loud, depth=4, oct=True, NumB=False, Gval=False, polarizability=False):
1808
+ # # this function gets autocorrelations for a molecule starting
1809
+ # # in one single atom only
1810
+ # Inputs:
1811
+ # mol - mol3D class
1812
+ # atomIdx - int, index of atom3D class; or list of indices
1813
+ # loud - bool, print output
1814
+ result = list()
1815
+ colnames = []
1816
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1817
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1818
+ if Gval:
1819
+ allowed_strings += ['group_number']
1820
+ labels_strings += ['Gval']
1821
+ if NumB:
1822
+ allowed_strings += ["num_bonds"]
1823
+ labels_strings += ["NumB"]
1824
+ if polarizability:
1825
+ allowed_strings += ['polarizability']
1826
+ labels_strings += ['alpha']
1827
+ # print('The selected connection type is ' + str(mol.getAtom(atomIdx).symbol()))
1828
+ for ii, properties in enumerate(allowed_strings):
1829
+ atom_only_ac = atom_only_autocorrelation(mol, properties, depth, atomIdx, oct=oct)
1830
+ this_colnames = []
1831
+ for i in range(0, depth + 1):
1832
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1833
+ colnames.append(this_colnames)
1834
+ result.append(atom_only_ac)
1835
+ results_dictionary = {'colnames': colnames, 'results': result}
1836
+ return results_dictionary
1837
+
1838
+
1839
+ def generate_atomonly_autocorrelation_derivatives(mol, atomIdx, loud, depth=4, oct=True, NumB=False, Gval=False):
1840
+ # # this function gets the d/dx for autocorrelations for a molecule starting
1841
+ # # in one single atom only
1842
+ # Inputs:
1843
+ # mol - mol3D class
1844
+ # atomIdx - int, index of atom3D class
1845
+ # loud - bool, print output
1846
+ result = None
1847
+ colnames = []
1848
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1849
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1850
+ if Gval:
1851
+ allowed_strings += ['group_number']
1852
+ labels_strings += ['Gval']
1853
+ if NumB:
1854
+ allowed_strings += ["num_bonds"]
1855
+ labels_strings += ["NumB"]
1856
+ # print('The selected connection type is ' + str(mol.getAtom(atomIdx).symbol()))
1857
+ for ii, properties in enumerate(allowed_strings):
1858
+ atom_only_ac = atom_only_autocorrelation_derivative(mol, properties, depth, atomIdx, oct=oct)
1859
+ for i in range(0, depth + 1):
1860
+ colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
1861
+ range(0, mol.natoms)])
1862
+ if result is None:
1863
+ result = atom_only_ac
1864
+ else:
1865
+ result = np.row_stack([result, atom_only_ac])
1866
+ results_dictionary = {'colnames': colnames, 'results': result}
1867
+ return results_dictionary
1868
+
1869
+
1870
+ def generate_atomonly_deltametrics(mol, atomIdx, loud, depth=4, oct=True, NumB=False, Gval=False, polarizability=False):
1871
+ # # this function gets deltametrics for a molecule starting
1872
+ # # in one single atom only
1873
+ # Inputs:
1874
+ # mol - mol3D class
1875
+ # atomIdx - int, index of atom3D class
1876
+ # loud - bool, print output
1877
+ result = list()
1878
+ colnames = []
1879
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1880
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1881
+ if Gval:
1882
+ allowed_strings += ['group_number']
1883
+ labels_strings += ['Gval']
1884
+ if NumB:
1885
+ allowed_strings += ["num_bonds"]
1886
+ labels_strings += ["NumB"]
1887
+ if polarizability:
1888
+ allowed_strings += ["polarizability"]
1889
+ labels_strings += ["alpha"]
1890
+ # print('The selected connection type is ' + str(mol.getAtom(atomIdx).symbol()))
1891
+ for ii, properties in enumerate(allowed_strings):
1892
+ atom_only_ac = atom_only_deltametric(mol, properties, depth, atomIdx, oct=oct)
1893
+ this_colnames = []
1894
+ for i in range(0, depth + 1):
1895
+ this_colnames.append(labels_strings[ii] + '-' + str(i))
1896
+ colnames.append(this_colnames)
1897
+ result.append(atom_only_ac)
1898
+ results_dictionary = {'colnames': colnames, 'results': result}
1899
+ return results_dictionary
1900
+
1901
+
1902
+ def generate_atomonly_deltametric_derivatives(mol, atomIdx, loud, depth=4, oct=True, NumB=False, Gval=False):
1903
+ # # this function gets deltametrics for a molecule starting
1904
+ # # in one single atom only
1905
+ # Inputs:
1906
+ # mol - mol3D class
1907
+ # atomIdx - int, index of atom3D class
1908
+ # loud - bool, print output
1909
+ result = None
1910
+ colnames = []
1911
+ allowed_strings = ['electronegativity', 'nuclear_charge', 'ident', 'topology', 'size']
1912
+ labels_strings = ['chi', 'Z', 'I', 'T', 'S']
1913
+ if Gval:
1914
+ allowed_strings += ['group_number']
1915
+ labels_strings += ['Gval']
1916
+ if NumB:
1917
+ allowed_strings += ["num_bonds"]
1918
+ labels_strings += ["NumB"]
1919
+ # print('The selected connection type is ' + str(mol.getAtom(atomIdx).symbol()))
1920
+ for ii, properties in enumerate(allowed_strings):
1921
+ atom_only_ac_der = atom_only_deltametric_derivative(mol, properties, depth, atomIdx, oct=oct)
1922
+ for i in range(0, depth + 1):
1923
+ colnames.append(['d' + labels_strings[ii] + '-' + str(i) + '/d' + labels_strings[ii] + str(j) for j in
1924
+ range(0, mol.natoms)])
1925
+ if result is None:
1926
+ result = atom_only_ac_der
1927
+ else:
1928
+ result = np.row_stack([result, atom_only_ac_der])
1929
+ results_dictionary = {'colnames': colnames, 'results': result}
1930
+ return results_dictionary