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
File without changes
@@ -0,0 +1,267 @@
1
+ """
2
+ Elemental information.
3
+ """
4
+ MASS = {
5
+ "H": 1.00794,
6
+ "He": 4.002602,
7
+ "Li": 6.941,
8
+ "Be": 9.012182,
9
+ "B": 10.811,
10
+ "C": 12.0107,
11
+ "N": 14.0067,
12
+ "O": 15.9994,
13
+ "F": 18.9984032,
14
+ "Ne": 20.1797,
15
+ "Na": 22.98976928,
16
+ "Mg": 24.3050,
17
+ "Al": 26.9815386,
18
+ "Si": 28.0855,
19
+ "P": 30.973762,
20
+ "S": 32.065,
21
+ "Cl": 35.453,
22
+ "Ar": 39.948,
23
+ "K": 39.0983,
24
+ "Ca": 40.078,
25
+ "Sc": 44.955912,
26
+ "Ti": 47.867,
27
+ "V": 50.9415,
28
+ "Cr": 51.9961,
29
+ "Mn": 54.938045,
30
+ "Fe": 55.845,
31
+ "Co": 58.933195,
32
+ "Ni": 58.6934,
33
+ "Cu": 63.546,
34
+ "Zn": 65.38,
35
+ "Ga": 69.723,
36
+ "Ge": 72.64,
37
+ "As": 74.92160,
38
+ "Se": 78.96,
39
+ "Br": 79.904,
40
+ "Kr": 83.798,
41
+ "Rb": 85.4678,
42
+ "Sr": 87.62,
43
+ "Y": 88.90585,
44
+ "Zr": 91.224,
45
+ "Nb": 92.90638,
46
+ "Mo": 95.96,
47
+ "Tc": 98,
48
+ "Ru": 101.07,
49
+ "Rh": 102.90550,
50
+ "Pd": 106.42,
51
+ "Ag": 107.8682,
52
+ "Cd": 112.411,
53
+ "In": 114.818,
54
+ "Sn": 118.710,
55
+ "Sb": 121.760,
56
+ "Te": 127.60,
57
+ "I": 126.90447,
58
+ "Xe": 131.293,
59
+ "Cs": 132.9054519,
60
+ "Ba": 137.327,
61
+ "La": 138.90547,
62
+ "Ce": 140.116,
63
+ "Pr": 140.90765,
64
+ "Nd": 144.242,
65
+ "Pm": 145,
66
+ "Sm": 150.36,
67
+ "Eu": 151.964,
68
+ "Gd": 157.25,
69
+ "Tb": 158.92535,
70
+ "Dy": 162.500,
71
+ "Ho": 164.93032,
72
+ "Er": 167.259,
73
+ "Tm": 168.93421,
74
+ "Yb": 173.054,
75
+ "Lu": 174.9668,
76
+ "Hf": 178.49,
77
+ "Ta": 180.94788,
78
+ "W": 183.84,
79
+ "Re": 186.207,
80
+ "Os": 190.23,
81
+ "Ir": 192.217,
82
+ "Pt": 195.084,
83
+ "Au": 196.966569,
84
+ "Hg": 200.59,
85
+ "Tl": 204.3833,
86
+ "Pb": 207.2,
87
+ "Bi": 208.98040,
88
+ "Po": 209,
89
+ "At": 210,
90
+ "Rn": 222,
91
+ "Fr": 223,
92
+ "Ra": 226,
93
+ "Ac": 227,
94
+ "Th": 232.03806,
95
+ "Pa": 231.03588,
96
+ "U": 238.02891,
97
+ "Np": 237,
98
+ "Pu": 244,
99
+ "Am": 243,
100
+ "Cm": 247,
101
+ "Bk": 247,
102
+ "Cf": 251,
103
+ "Es": 252,
104
+ "Fm": 257,
105
+ "Md": 258,
106
+ "No": 259,
107
+ "Lr": 262,
108
+ "Rf": 265,
109
+ "Db": 268,
110
+ "Sg": 271,
111
+ "Bh": 272,
112
+ "Hs": 270,
113
+ "Mt": 276,
114
+ "Ds": 281,
115
+ "Rg": 280,
116
+ "Cn": 285,
117
+ "Uut": 284,
118
+ "Uuq": 289,
119
+ "Uup": 288,
120
+ "Uuh": 293,
121
+ "Uuo": 294}
122
+
123
+ # If this is a nice list we can just .index or [slice] to get atomic numbers
124
+ ATOMIC_NUMBER = [
125
+ "ZERO", "H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne", "Na", "Mg",
126
+ "Al", "Si", "P", "S", "Cl", "Ar", "K", "Ca", "Sc", "Ti", "V", "Cr", "Mn",
127
+ "Fe", "Co", "Ni", "Cu", "Zn", "Ga", "Ge", "As", "Se", "Br", "Kr", "Rb",
128
+ "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd", "In",
129
+ "Sn", "Sb", "Te", "I", "Xe", "Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm",
130
+ "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu", "Hf", "Ta",
131
+ "W", "Re", "Os", "Ir", "Pt", "Au", "Hg", "Tl", "Pb", "Bi", "Po", "At",
132
+ "Rn", "Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk",
133
+ "Cf", "Es", "Fm", "Md", "No", "Lr", "Rf", "Db", "Sg", "Bh", "Hs", "Mt",
134
+ "Ds", "Rg", "Cn", "Uut", "Uuq", "Uup", "Uuh", "Uuo"]
135
+
136
+
137
+ COVALENT_RADII = {
138
+ # Covalent radii revisited -- DOI:10.1039/B801115J
139
+ "H": 0.31,
140
+ "He": 0.28,
141
+ "Li": 1.28,
142
+ "Be": 0.96,
143
+ "B": 0.84,
144
+ "C": 0.76, # for sp3; sp2 = 0.73; sp = 0.69
145
+ "C_1": 0.69,
146
+ "C_2": 0.73,
147
+ "C_R": 0.73,
148
+ "C_3": 0.76,
149
+ "N": 0.71,
150
+ "O": 0.66,
151
+ "F": 0.57,
152
+ "Ne": 0.58,
153
+ "Na": 1.66,
154
+ "Mg": 1.41,
155
+ "Al": 1.21,
156
+ "Si": 1.11,
157
+ "P": 1.07,
158
+ "S": 1.05,
159
+ "Cl": 1.02,
160
+ "Ar": 1.06,
161
+ "K": 2.03,
162
+ "Ca": 1.76,
163
+ "Sc": 1.7,
164
+ "Ti": 1.6,
165
+ "V": 1.53,
166
+ "Cr": 1.39,
167
+ "Mn": 1.61, # low spin = 1.39
168
+ "Fe": 1.52, # low spin = 1.32
169
+ "Co": 1.5, # low spin = 1.26
170
+ "Ni": 1.24,
171
+ "Cu": 1.32,
172
+ "Zn": 1.22,
173
+ "Ga": 1.22,
174
+ "Ge": 1.2,
175
+ "As": 1.19,
176
+ "Se": 1.2,
177
+ "Br": 1.2,
178
+ "Kr": 1.16,
179
+ "Rb": 2.2,
180
+ "Sr": 1.95,
181
+ "Y": 1.9,
182
+ "Zr": 1.5, # 1.75 !! temporarily added to correct the UIO cluster bonding problem
183
+ "Nb": 1.64,
184
+ "Mo": 1.54,
185
+ "Tc": 1.47,
186
+ "Ru": 1.46,
187
+ "Rh": 1.42,
188
+ "Pd": 1.39,
189
+ "Ag": 1.45,
190
+ "Cd": 1.44,
191
+ "In": 1.42,
192
+ "Sn": 1.39,
193
+ "Sb": 1.39,
194
+ "Te": 1.38,
195
+ "I": 1.39,
196
+ "Xe": 1.4,
197
+ "Cs": 2.44,
198
+ "Ba": 2.15,
199
+ "La": 2.07,
200
+ "Ce": 2.04,
201
+ "Pr": 2.03,
202
+ "Nd": 2.01,
203
+ "Pm": 1.99,
204
+ "Sm": 1.98,
205
+ "Eu": 1.98,
206
+ "Gd": 1.96,
207
+ "Tb": 1.94,
208
+ "Dy": 1.92,
209
+ "Ho": 1.92,
210
+ "Er": 1.89,
211
+ "Tm": 1.9,
212
+ "Yb": 1.87,
213
+ "Lu": 1.87,
214
+ "Hf": 1.75,
215
+ "Ta": 1.7,
216
+ "W": 1.62,
217
+ "Re": 1.51,
218
+ "Os": 1.44,
219
+ "Ir": 1.41,
220
+ "Pt": 1.36,
221
+ "Au": 1.36,
222
+ "Hg": 1.32,
223
+ "Tl": 1.45,
224
+ "Pb": 1.46,
225
+ "Bi": 1.48,
226
+ "Po": 1.4,
227
+ "At": 1.5,
228
+ "Rn": 1.5,
229
+ "Fr": 2.6,
230
+ "Ra": 2.21,
231
+ "Ac": 2.15,
232
+ "Th": 2.06,
233
+ "Pa": 2,
234
+ "U": 1.96,
235
+ "Np": 1.9,
236
+ "Pu": 1.87,
237
+ "Am": 1.8,
238
+ "Cm": 1.69,
239
+ }
240
+ METALS = [3, 4, 11, 12, 13, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
241
+ 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 55, 56, 57,
242
+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
243
+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 87, 88, 89, 90, 91, 92, 93, 94,
244
+ 95, 96, 97, 98, 99, 100, 101, 102, 103]
245
+
246
+ # keeping track of some different groups of atoms.
247
+ organic = set(["H", "C", "N", "O", "S"])
248
+ non_metals = set(["H", "He", "C", "N", "O", "F", "Ne",
249
+ "P", "S", "Cl", "Ar", "Se", "Br", "Kr",
250
+ "I", "Xe", "Rn"])
251
+ noble_gases = set(["He", "Ne", "Ar", "Kr", "Xe", "Rn"])
252
+ metalloids = set(["B", "Si", "Ge", "As", "Sb", "Te", "At"])
253
+ lanthanides = set(["La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu",
254
+ "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu"])
255
+ actinides = set(["Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk",
256
+ "Cf", "Es", "Fm", "Md", "No", "Lr"])
257
+ transition_metals = set(["Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni",
258
+ "Cu", "Zn", "Y", "Zr", "Nb", "Mo", "Tc", "Ru",
259
+ "Rh", "Pd", "Ag", "Cd", "Hf", "Ta", "W", "Re",
260
+ "Os", "Ir", "Pt", "Ir", "Pt", "Au", "Hg", "Rf",
261
+ "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn"])
262
+ alkali = set(["Li", "Na", "K", "Rb", "Cs", "Fr"])
263
+ alkaline_earth = set(["Be", "Mg", "Ca", "Sr", "Ba", "Ra"])
264
+ main_group = set(["Al", "Ga", "Ge", "In", "Sn", "Sb", "Tl", "Pb", "Bi",
265
+ "Po", "At", "Cn", "Uut", "Fl", "Uup", "Lv", "Uus"])
266
+
267
+ metals = main_group | alkaline_earth | alkali | transition_metals | metalloids | lanthanides
@@ -0,0 +1,388 @@
1
+ from molSimplify.Scripts.cellbuilder_tools import import_from_cif
2
+ from molSimplify.Classes.mol3D import mol3D
3
+ import os
4
+ import copy
5
+ import numpy as np
6
+ from scipy import sparse
7
+ import molSimplify.Informatics.MOF.PBC_functions as pbc_funs
8
+ import networkx as nx
9
+
10
+ #### NOTE: In addition to molSimplify's dependencies, this portion requires
11
+ #### pymatgen to be installed. The RACs are intended to be computed
12
+ #### on the primitive cell of the material. You can compute them
13
+ #### using the commented out snippet of code if necessary.
14
+
15
+ # Example usage is given at the bottom of the script.
16
+
17
+ '''<<<< CODE TO COMPUTE PRIMITIVE UNIT CELLS >>>>'''
18
+ #########################################################################################
19
+ # This MOF RAC generator assumes that pymatgen is installed. #
20
+ # Pymatgen is used to get the primitive cell. #
21
+ #########################################################################################
22
+
23
+
24
+ def get_primitive(datapath, writepath):
25
+ from pymatgen.io.cif import CifParser
26
+ s = CifParser(datapath, occupancy_tolerance=1).get_structures()[0]
27
+ sprim = s.get_primitive_structure()
28
+ sprim.to("cif", writepath)
29
+
30
+
31
+ '''<<<< END OF CODE TO COMPUTE PRIMITIVE UNIT CELLS >>>>'''
32
+
33
+ #########################################################################################
34
+ # The RAC functions here average over the different SBUs or linkers present. This is #
35
+ # because one MOF could have multiple different linkers or multiple SBUs, and we need #
36
+ # the vector to be of constant dimension so we can correlate the output property. #
37
+ #########################################################################################
38
+
39
+ def make_MOF_SBU_RACs(SBUlist, SBU_subgraph, molcif, depth, name,cell,anchoring_atoms, sbupath=False, connections_list=False, connections_subgraphlist=False):
40
+ n_sbu = len(SBUlist)
41
+ print(SBUlist)
42
+ G=nx.from_numpy_matrix(molcif.graph)
43
+ cycles = nx.minimum_cycle_basis(G) # gets all closed rings in graph
44
+ subcycle_list = []
45
+ for cycle in cycles:
46
+ skip_row = False
47
+ for element in cycle:
48
+ if molcif.getAtom(element).ismetal():
49
+ skip_row = True
50
+ break
51
+ if not skip_row:
52
+ subcycle_list.append(cycle)
53
+
54
+ """""""""
55
+ Loop over all SBUs as identified by subgraphs. Then create the mol3Ds for each SBU.
56
+ """""""""
57
+ for i, SBU in enumerate(SBUlist):
58
+ atoms_in_sbu = []
59
+ SBU_mol = mol3D()
60
+ for val in SBU:
61
+ atoms_in_sbu.append(val)
62
+ SBU_mol.addAtom(molcif.getAtom(val))
63
+ # SBU_mol.graph = SBU_subgraph[i].todense()
64
+
65
+ """""""""
66
+ For each linker connected to the SBU, find the lc atoms for the lc-RACs.
67
+ """""""""
68
+ for j, linker in enumerate(connections_list):
69
+ if len(set(SBU).intersection(linker))>0:
70
+ #### This means that the SBU and linker are connected.
71
+ temp_mol = mol3D()
72
+ link_list = []
73
+ for jj, val2 in enumerate(linker):
74
+ if val2 in anchoring_atoms:
75
+ link_list.append(jj)
76
+ # This builds a mol object for the linker --> even though it is in the SBU section.
77
+ temp_mol.addAtom(molcif.getAtom(val2))
78
+
79
+ temp_mol.graph = connections_subgraphlist[j].todense()
80
+ """""""""
81
+ If heteroatom functional groups exist (anything that is not C or H, so methyl is missed, also excludes anything lc, so carboxylic metal-coordinating oxygens skipped),
82
+ compile the list of atoms
83
+ """""""""
84
+ functional_atoms = []
85
+ for jj in range(len(temp_mol.graph)):
86
+ if jj not in link_list:
87
+ if not set({temp_mol.atoms[jj].sym}) & set({"C","H"}):
88
+ functional_atoms.append(jj)
89
+ # At this point, we look at the cycles for the graph, then add atoms if they are part of a cycle
90
+ for cycle in subcycle_list:
91
+ if (len(set(SBU).intersection(cycle))>0) and (len(set(SBU_mol.findMetal()).intersection(cycle))==0):
92
+ for atom in cycle:
93
+ atoms_in_sbu.append(atom)
94
+ SBU_mol.addAtom(molcif.getAtom(atom))
95
+ for ringatom_connected_atoms in molcif.getBondedAtoms(atom):
96
+ if molcif.getAtom(int(ringatom_connected_atoms)).symbol()=='H':
97
+ atoms_in_sbu.append(ringatom_connected_atoms)
98
+ SBU_mol.addAtom(molcif.getAtom(ringatom_connected_atoms))
99
+
100
+ # This part gets the subgraph and reassigns it, because we added atoms to the SBU
101
+ tempgraph= molcif.graph[np.ix_(atoms_in_sbu,atoms_in_sbu)]
102
+ SBU_mol.graph = tempgraph
103
+ SBU_mol_cart_coords=np.array([atom.coords() for atom in SBU_mol.atoms])
104
+ SBU_mol_atom_labels=[atom.sym for atom in SBU_mol.atoms]
105
+ SBU_mol_adj_mat = np.array(SBU_mol.graph)
106
+ ###### WRITE THE SBU MOL TO THE PLACE
107
+ if sbupath and not os.path.exists(sbupath+"/"+str(name)+str(i)+'.xyz'):
108
+ xyzname = sbupath+"/"+str(name)+"_sbu_"+str(i)+".xyz"
109
+ SBU_mol_fcoords_connected = pbc_funs.XYZ_connected(cell , SBU_mol_cart_coords , SBU_mol_adj_mat )
110
+ pbc_funs.writeXYZandGraph(xyzname , SBU_mol_atom_labels , cell , SBU_mol_fcoords_connected,SBU_mol_adj_mat)
111
+ return None, None, None, None
112
+
113
+ def make_MOF_linker_RACs(linkerlist, linker_subgraphlist, molcif, depth, name, cell, linkerpath=False):
114
+ #### This function makes full scope linker RACs for MOFs ####
115
+ nlink = len(linkerlist)
116
+ for i, linker in enumerate(linkerlist):
117
+ linker_mol = mol3D()
118
+ for val in linker:
119
+ linker_mol.addAtom(molcif.getAtom(val))
120
+ linker_mol.graph = linker_subgraphlist[i].todense()
121
+ linker_mol_cart_coords=np.array([atom.coords() for atom in linker_mol.atoms])
122
+ linker_mol_atom_labels=[atom.sym for atom in linker_mol.atoms]
123
+ linker_mol_adj_mat = np.array(linker_mol.graph)
124
+ ###### WRITE THE LINKER MOL TO THE PLACE
125
+ if linkerpath and not os.path.exists(linkerpath+"/"+str(name)+str(i)+".xyz"):
126
+ xyzname = linkerpath+"/"+str(name)+"_linker_"+str(i)+".xyz"
127
+ linker_mol_fcoords_connected = pbc_funs.XYZ_connected(cell, linker_mol_cart_coords, linker_mol_adj_mat)
128
+ pbc_funs.writeXYZandGraph(xyzname, linker_mol_atom_labels, cell, linker_mol_fcoords_connected, linker_mol_adj_mat)
129
+ return None, None
130
+
131
+
132
+ def get_MOF_descriptors(data, depth, path=False, xyzpath = False):
133
+ if not path:
134
+ print('Need a directory to place all of the linker, SBU, and ligand objects. Exiting now.')
135
+ raise ValueError('Base path must be specified in order to write descriptors.')
136
+ else:
137
+ if path.endswith('/'):
138
+ path = path[:-1]
139
+ if not os.path.isdir(path+'/ligands'):
140
+ os.mkdir(path+'/ligands')
141
+ if not os.path.isdir(path+'/linkers'):
142
+ os.mkdir(path+'/linkers')
143
+ if not os.path.isdir(path+'/sbus'):
144
+ os.mkdir(path+'/sbus')
145
+ if not os.path.isdir(path+'/xyz'):
146
+ os.mkdir(path+'/xyz')
147
+ if not os.path.isdir(path+'/logs'):
148
+ os.mkdir(path+'/logs')
149
+ ligandpath = path+'/ligands'
150
+ linkerpath = path+'/linkers'
151
+ sbupath = path+'/sbus'
152
+ logpath = path+"/logs"
153
+
154
+ """""""""
155
+ Input cif file and get the cell parameters and adjacency matrix. If overlap, do not featurize.
156
+ Simultaneously prepare mol3D class for MOF for future RAC featurization (molcif)
157
+ """""""""
158
+
159
+ cpar, allatomtypes, fcoords = pbc_funs.readcif(data)
160
+ cell_v = pbc_funs.mkcell(cpar)
161
+ cart_coords = pbc_funs.fractional2cart(fcoords, cell_v)
162
+ name = os.path.basename(data).strip(".cif")
163
+ if len(cart_coords) > 2000:
164
+ print("Too large cif file, skipping it for now...")
165
+ tmpstr = "Failed to featurize %s: large primitive cell\n"%(name)
166
+ pbc_funs.write2file(path, "/FailedStructures.log", tmpstr)
167
+ return None, None
168
+ distance_mat = pbc_funs.compute_distance_matrix3(cell_v, cart_coords)
169
+ try:
170
+ adj_matrix, _ = pbc_funs.compute_adj_matrix(distance_mat, allatomtypes)
171
+ except NotImplementedError:
172
+ tmpstr = "Failed to featurize %s: atomic overlap\n" % (name)
173
+ pbc_funs.write2file(path, "/FailedStructures.log", tmpstr)
174
+ return None, None
175
+
176
+ pbc_funs.writeXYZandGraph(xyzpath, allatomtypes, cell_v, fcoords, adj_matrix.todense())
177
+ molcif, _, _, _, _ = import_from_cif(data, True)
178
+ molcif.graph = adj_matrix.todense()
179
+
180
+ """""""""
181
+ check number of connected components.
182
+ if more than 1: it checks if the structure is interpenetrated. Fails if no metal in one of the connected components (identified by the graph).
183
+ This includes floating solvent molecules.
184
+ """""""""
185
+
186
+ n_components, labels_components = sparse.csgraph.connected_components(csgraph=adj_matrix, directed=False, return_labels=True)
187
+ metal_list = set([at for at in molcif.findMetal(transition_metals_only=False)])
188
+ # print('##### METAL LIST', metal_list, [molcif.getAtom(val).symbol() for val in list(metal_list)])
189
+ # print('##### METAL LIST', metal_list, [val.symbol() for val in molcif.atoms])
190
+ if not len(metal_list) > 0:
191
+ tmpstr = "Failed to featurize %s: no metal found\n" % (name)
192
+ pbc_funs.write2file(path, "/FailedStructures.log", tmpstr)
193
+ return None, None
194
+
195
+ for comp in range(n_components):
196
+ inds_in_comp = [i for i in range(len(labels_components)) if labels_components[i] == comp]
197
+ if not set(inds_in_comp) & metal_list:
198
+ tmpstr = "Failed to featurize %s: solvent molecules\n" % (name)
199
+ pbc_funs.write2file(path, "/FailedStructures.log", tmpstr)
200
+ return None, None
201
+
202
+ if n_components > 1:
203
+ print("structure is interpenetrated")
204
+ tmpstr = "%s found to be an interpenetrated structure\n" % (name)
205
+ pbc_funs.write2file(logpath,"/%s.log" % name, tmpstr)
206
+
207
+ """""""""
208
+ step 1: metallic part
209
+ removelist = metals (1) + atoms only connected to metals (2) + H connected to (1+2)
210
+ SBUlist = removelist + 1st coordination shell of the metals
211
+ removelist = set()
212
+ Logs the atom types of the connecting atoms to the metal in logpath.
213
+ """""""""
214
+ SBUlist = set()
215
+ metal_list = set([at for at in molcif.findMetal(transition_metals_only=False)])
216
+ # print('##### METAL LIST2', metal_list, [molcif.getAtom(val).symbol() for val in list(metal_list)])
217
+ # print('##### all LIST2', metal_list, [val.symbol() for val in molcif.atoms])
218
+ [SBUlist.update(set([metal])) for metal in molcif.findMetal(transition_metals_only=False)] #Remove all metals as part of the SBU
219
+ [SBUlist.update(set(molcif.getBondedAtomsSmart(metal))) for metal in molcif.findMetal(transition_metals_only=False)]
220
+ removelist = set()
221
+ [removelist.update(set([metal])) for metal in molcif.findMetal(transition_metals_only=False)] #Remove all metals as part of the SBU
222
+ for metal in removelist:
223
+ bonded_atoms = set(molcif.getBondedAtomsSmart(metal))
224
+ bonded_atoms_types = set([str(allatomtypes[at]) for at in set(molcif.getBondedAtomsSmart(metal))])
225
+ cn = len(bonded_atoms)
226
+ cn_atom = ",".join([at for at in bonded_atoms_types])
227
+ tmpstr = "atom %i with type of %s found to have %i coordinates with atom types of %s\n" % (metal, allatomtypes[metal], cn, cn_atom)
228
+ pbc_funs.write2file(logpath, "/%s.log" % name, tmpstr)
229
+ [removelist.update(set([atom])) for atom in SBUlist if all((molcif.getAtom(val).ismetal() or molcif.getAtom(val).symbol().upper() == 'H') for val in molcif.getBondedAtomsSmart(atom))]
230
+ """""""""
231
+ adding hydrogens connected to atoms which are only connected to metals. In particular interstitial OH, like in UiO SBU.
232
+ """""""""
233
+ for atom in SBUlist:
234
+ for val in molcif.getBondedAtomsSmart(atom):
235
+ if molcif.getAtom(val).symbol().upper() == 'H':
236
+ removelist.update(set([val]))
237
+
238
+ """""""""
239
+ At this point:
240
+ The remove list only removes metals and things ONLY connected to metals or hydrogens.
241
+ Thus the coordinating atoms are double counted in the linker.
242
+
243
+ step 2: organic part
244
+ removelist = linkers are all atoms - the removelist (assuming no bond between
245
+ organiclinkers)
246
+ """""""""
247
+ allatoms = set(range(0, adj_matrix.shape[0]))
248
+ linkers = allatoms - removelist
249
+ linker_list, linker_subgraphlist = pbc_funs.get_closed_subgraph(linkers.copy(), removelist.copy(), adj_matrix)
250
+ connections_list = copy.deepcopy(linker_list)
251
+ connections_subgraphlist = copy.deepcopy(linker_subgraphlist)
252
+ linker_length_list = [len(linker_val) for linker_val in linker_list]
253
+ adjmat = adj_matrix.todense()
254
+ """""""""
255
+ find all anchoring atoms on linkers and ligands (lc identification)
256
+ """""""""
257
+ anc_atoms = set()
258
+ for linker in linker_list:
259
+ for atom_linker in linker:
260
+ bonded2atom = np.nonzero(adj_matrix[atom_linker,:])[1]
261
+ if set(bonded2atom) & metal_list:
262
+ anc_atoms.add(atom_linker)
263
+ """""""""
264
+ step 3: linker or ligand ?
265
+ checking to find the anchors and #SBUs that are connected to an organic part
266
+ anchor <= 1 -> ligand
267
+ anchor > 1 and #SBU > 1 -> linker
268
+ else: walk over the linker graph and count #crossing PBC
269
+ if #crossing is odd -> linker
270
+ else -> ligand
271
+ """""""""
272
+ initial_SBU_list, initial_SBU_subgraphlist = pbc_funs.get_closed_subgraph(removelist.copy(), linkers.copy(), adj_matrix)
273
+ templist = linker_list[:]
274
+ tempgraphlist = linker_subgraphlist[:]
275
+ long_ligands = False
276
+ max_min_linker_length, min_max_linker_length = (0, 100)
277
+ for ii, atoms_list in reversed(list(enumerate(linker_list))): # Loop over all linker subgraphs
278
+ linkeranchors_list = set()
279
+ linkeranchors_atoms = set()
280
+ sbuanchors_list = set()
281
+ sbu_connect_list = set()
282
+ """""""""
283
+ Here, we are trying to identify what is actually a linker and what is a ligand.
284
+ To do this, we check if something is connected to more than one SBU. Set to
285
+ handle cases where primitive cell is small, ambiguous cases are recorded.
286
+ """""""""
287
+ for iii, atoms in enumerate(atoms_list): #loop over all atoms in a linker
288
+ connected_atoms = np.nonzero(adj_matrix[atoms,:])[1]
289
+ for kk, sbu_atoms_list in enumerate(initial_SBU_list): #loop over all SBU subgraphs
290
+ for sbu_atoms in sbu_atoms_list: #Loop over SBU
291
+ if sbu_atoms in connected_atoms:
292
+ linkeranchors_list.add(iii)
293
+ linkeranchors_atoms.add(atoms)
294
+ sbuanchors_list.add(sbu_atoms)
295
+ sbu_connect_list.add(kk) #Add if unique SBUs
296
+ min_length, max_length = pbc_funs.linker_length(linker_subgraphlist[ii].todense(), linkeranchors_list)
297
+
298
+ if len(linkeranchors_list) >= 2: # linker, and in one ambigous case, could be a ligand.
299
+ if len(sbu_connect_list) >= 2: # Something that connects two SBUs is certain to be a linker
300
+ max_min_linker_length = max(min_length, max_min_linker_length)
301
+ min_max_linker_length = min(max_length, min_max_linker_length)
302
+ continue
303
+ else:
304
+ # check number of times we cross PBC :
305
+ # TODO: we still can fail in multidentate ligands!
306
+ linker_cart_coords = np.array([
307
+ at.coords() for at in [molcif.getAtom(val) for val in atoms_list]])
308
+ linker_adjmat = np.array(linker_subgraphlist[ii].todense())
309
+ pr_image_organic = pbc_funs.ligand_detect(cell_v,linker_cart_coords,linker_adjmat,linkeranchors_list)
310
+ sbu_temp = linkeranchors_atoms.copy()
311
+ sbu_temp.update({val for val in initial_SBU_list[list(sbu_connect_list)[0]]})
312
+ sbu_temp = list(sbu_temp)
313
+ sbu_cart_coords = np.array([
314
+ at.coords() for at in [molcif.getAtom(val) for val in sbu_temp]])
315
+ sbu_adjmat = pbc_funs.slice_mat(adj_matrix.todense(),sbu_temp)
316
+ pr_image_sbu = pbc_funs.ligand_detect(cell_v,sbu_cart_coords,sbu_adjmat,set(range(len(linkeranchors_list))))
317
+ if not (len(np.unique(pr_image_sbu, axis=0))==1 and len(np.unique(pr_image_organic, axis=0))==1): # linker
318
+ max_min_linker_length = max(min_length,max_min_linker_length)
319
+ min_max_linker_length = min(max_length,min_max_linker_length)
320
+ tmpstr = str(name)+','+' Anchors list: '+str(sbuanchors_list) \
321
+ +','+' SBU connectlist: '+str(sbu_connect_list)+' set to be linker\n'
322
+ pbc_funs.write2file(ligandpath,"/ambiguous.txt",tmpstr)
323
+ continue
324
+ else: # all anchoring atoms are in the same unitcell -> ligand
325
+ removelist.update(set(templist[ii])) # we also want to remove these ligands
326
+ SBUlist.update(set(templist[ii])) # we also want to remove these ligands
327
+ linker_list.pop(ii)
328
+ linker_subgraphlist.pop(ii)
329
+ tmpstr = str(name)+','+' Anchors list: '+str(sbuanchors_list) \
330
+ +','+' SBU connectlist: '+str(sbu_connect_list)+' set to be ligand\n'
331
+ pbc_funs.write2file(ligandpath,"/ambiguous.txt",tmpstr)
332
+ tmpstr = str(name)+str(ii)+','+' Anchors list: '+ \
333
+ str(sbuanchors_list)+','+' SBU connectlist: '+str(sbu_connect_list)+'\n'
334
+ pbc_funs.write2file(ligandpath,"/ligand.txt",tmpstr)
335
+ else: #definite ligand
336
+ pbc_funs.write2file(logpath,"/%s.log"%name,"found ligand\n")
337
+ removelist.update(set(templist[ii])) # we also want to remove these ligands
338
+ SBUlist.update(set(templist[ii])) # we also want to remove these ligands
339
+ linker_list.pop(ii)
340
+ linker_subgraphlist.pop(ii)
341
+ tmpstr = str(name)+','+' Anchors list: '+str(sbuanchors_list) \
342
+ +','+' SBU connectlist: '+str(sbu_connect_list)+'\n'
343
+ pbc_funs.write2file(ligandpath,"/ligand.txt",tmpstr)
344
+
345
+ tmpstr = str(name) + ", (min_max_linker_length,max_min_linker_length): " + \
346
+ str(min_max_linker_length) + " , " +str(max_min_linker_length) + "\n"
347
+ pbc_funs.write2file(logpath,"/%s.log"%name,tmpstr)
348
+ if min_max_linker_length < 3:
349
+ pbc_funs.write2file(linkerpath,"/short_ligands.txt",tmpstr)
350
+ if min_max_linker_length > 2:
351
+ # for N-C-C-N ligand ligand
352
+ if max_min_linker_length == min_max_linker_length:
353
+ long_ligands = True
354
+ elif min_max_linker_length > 3:
355
+ long_ligands = True
356
+
357
+ """""""""
358
+ In the case of long linkers, add second coordination shell without further checks. In the case of short linkers, start from metal
359
+ and grow outwards using the include_extra_shells function
360
+ """""""""
361
+ linker_length_list = [len(linker_val) for linker_val in linker_list]
362
+ if len(set(linker_length_list)) != 1:
363
+ pbc_funs.write2file(linkerpath,"/uneven.txt",str(name)+'\n')
364
+ if not min_max_linker_length < 2: # treating the 2 atom ligands differently! Need caution
365
+ if long_ligands:
366
+ tmpstr = "\nStructure has LONG ligand\n\n"
367
+ pbc_funs.write2file(logpath,"/%s.log"%name,tmpstr)
368
+ [[SBUlist.add(val) for val in molcif.getBondedAtomsSmart(zero_first_shell)] for zero_first_shell in SBUlist.copy()] #First account for all of the carboxylic acid type linkers, add in the carbons.
369
+ truncated_linkers = allatoms - SBUlist
370
+ SBU_list, SBU_subgraphlist = pbc_funs.get_closed_subgraph(SBUlist, truncated_linkers, adj_matrix)
371
+ if not long_ligands:
372
+ tmpstr = "\nStructure has SHORT ligand\n\n"
373
+ pbc_funs.write2file(logpath,"/%s.log"%name,tmpstr)
374
+ SBU_list , SBU_subgraphlist = pbc_funs.include_extra_shells(SBU_list,SBU_subgraphlist,molcif ,adj_matrix)
375
+ else:
376
+ tmpstr = "Structure %s has extreamly short ligands, check the outputs\n"%name
377
+ pbc_funs.write2file(ligandpath,"/ambiguous.txt",tmpstr)
378
+ tmpstr = "Structure has extreamly short ligands\n"
379
+ pbc_funs.write2file(logpath,"/%s.log"%name,tmpstr)
380
+ tmpstr = "Structure has extreamly short ligands\n"
381
+ pbc_funs.write2file(logpath,"/%s.log"%name,tmpstr)
382
+ truncated_linkers = allatoms - removelist
383
+ SBU_list, SBU_subgraphlist = pbc_funs.get_closed_subgraph(removelist, truncated_linkers, adj_matrix)
384
+ SBU_list, SBU_subgraphlist = pbc_funs.include_extra_shells(SBU_list,SBU_subgraphlist,molcif ,adj_matrix)
385
+ SBU_list, SBU_subgraphlist = pbc_funs.include_extra_shells(SBU_list,SBU_subgraphlist,molcif ,adj_matrix)
386
+ descriptor_names, descriptors, lc_descriptor_names, lc_descriptors = make_MOF_SBU_RACs(SBU_list, SBU_subgraphlist, molcif, depth, name , cell_v,anc_atoms, sbupath, connections_list, connections_subgraphlist)
387
+ lig_descriptor_names, lig_descriptors = make_MOF_linker_RACs(linker_list, linker_subgraphlist, molcif, depth, name, cell_v, linkerpath)
388
+ return None, None