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,586 @@
1
+ ### This part is dependent on RDKit. Requires RDkit dependency. Uncomment this section
2
+ # from rdkit import Chem
3
+ # from rdkit import RDLogger
4
+ # from rdkit.Chem.rdMolDescriptors import CalcMolFormula
5
+ # RDLogger.DisableLog('rdApp.*')
6
+
7
+ class fragment:
8
+ '''
9
+ This class takes in a name of a fragment
10
+ and stores in the different possibilities
11
+ for that fragment. This fragment then builds macrocycles
12
+ '''
13
+ def __init__(self, name, options, start_macrocycle=False, ring_closure_ind=1):
14
+ '''
15
+ Name is the name (i.e. pyrrole)
16
+ Options is a list of tuples that contain
17
+ the smiles string and metal coordination atom
18
+ The zeroeth element of the options list is what
19
+ will be picked if another possibility is not needed.
20
+ '''
21
+ self.name = name
22
+ self.options = options
23
+ if ring_closure_ind != 1:
24
+ new_options = []
25
+ for smiles_tuple in self.options:
26
+ new_smiles_tuple = self.adjust_ring_closure_index(
27
+ ring_closure_ind, smiles_tuple)
28
+ new_options.append(new_smiles_tuple)
29
+ self.options = new_options
30
+ if ((start_macrocycle is True)):
31
+ self.start_macrocycle = 9
32
+ new_options = []
33
+ for option in self.options:
34
+ smiles, connection_atom, func_positions = option[0], option[1], option[2]
35
+ new_smiles = self.start_macrocycle_ring(
36
+ smiles, 0, self.start_macrocycle)
37
+ new_options.append((new_smiles, connection_atom, func_positions))
38
+ self.options = new_options
39
+
40
+ def give_compatible_fragments(self, bridge, next_fragment):
41
+ '''
42
+ bridge is the bridging class
43
+ the next fragment is the fragment class for the coming fragment
44
+ '''
45
+ acceptable_fragments = []
46
+ acceptable_second_fragments = []
47
+ acceptable_bridges = []
48
+ possible_bridges = bridge.get_possible_motifs()
49
+ if any(['=' in val[0] for val in possible_bridges]):
50
+ first_fragment_options = self.options
51
+ second_fragment_options = next_fragment.options
52
+ else:
53
+ first_fragment_options = [self.options[0]]
54
+ second_fragment_options = [next_fragment.options[0]]
55
+ for fragment_val in first_fragment_options:
56
+ for second_fragment_val in second_fragment_options:
57
+ for bridge_val in possible_bridges:
58
+ left, center, right = self.split_smiles_at_lc_adjacent(
59
+ fragment_val)
60
+ left2, center2, right2 = self.split_smiles_at_lc_adjacent(
61
+ second_fragment_val)
62
+ test_fragment = left + center + \
63
+ '(' + bridge_val[0] + left2 + center2 + right2 + ')' + right
64
+ if ('=' in bridge_val[0]):
65
+ if (not ((bridge_val[0][0] == '=') or ((len(right) > 0) and (right[0] == '=')) or (center[-2] == '='))):
66
+ continue
67
+ # ignore the open ring closure for validity
68
+ test_fragment = test_fragment.replace('9', '')
69
+ m = Chem.MolFromSmiles(test_fragment)
70
+ if m is not None:
71
+ acceptable_bridges.append(bridge_val)
72
+ acceptable_fragments.append(fragment_val)
73
+ acceptable_second_fragments.append(second_fragment_val)
74
+ return_val = list(
75
+ set(zip(acceptable_bridges, acceptable_fragments, acceptable_second_fragments)))
76
+ return return_val
77
+
78
+ def adjust_ring_closure_index(self, new_index, smiles_tuple=False):
79
+ '''
80
+ This function only works on ring closures with one cycle.
81
+ It identifies the current ring closure and adjusts the index of
82
+ that ring closure based on the user input. If the smiles
83
+ does not actually have a ring in it, then it returns the
84
+ original smiles tuple.
85
+ '''
86
+ if not smiles_tuple:
87
+ new_options = []
88
+ for smiles_tuple in self.options:
89
+ new_smiles_tuple = self.adjust_ring_closure_index(
90
+ ring_closure_ind, smiles_tuple)
91
+ new_options.append(new_smiles_tuple)
92
+ self.options = new_options
93
+ else:
94
+ smiles, coordination_atom_idx, func_positions = (smiles_tuple[
95
+ 0], smiles_tuple[1], smiles_tuple[2])
96
+ digit_indices = [i for i, val in enumerate(smiles) if val.isdigit()]
97
+ new_smiles = ''
98
+ if len(digit_indices) > 2:
99
+ raise ValueError(
100
+ 'This ring closure function should only handle cases with one ring closure. You have more!')
101
+ else:
102
+ for i, val in enumerate(smiles):
103
+ if i not in digit_indices:
104
+ new_smiles += val
105
+ else:
106
+ new_smiles += str(new_index)
107
+ new_smiles_tuple = (new_smiles, coordination_atom_idx, func_positions)
108
+ return new_smiles_tuple
109
+
110
+ def start_macrocycle_ring(self, smiles, start_position=0, macro_ind=9):
111
+ '''
112
+ This function takes a smiles string for monodentate portions and
113
+ returns an adjusted smiles that incorporates the start of a macrocycle.
114
+ The default macrocycle ring index will be 9. If c1ncccc1 is handed in,
115
+ the returned smiles will be c19ncccc1. It simply starts the ring
116
+ opening of the macrocycle.
117
+ '''
118
+ digit_indices = [i for i, val in enumerate(smiles) if val.isdigit()]
119
+ alpha_indices = [i for i, val in enumerate(smiles) if val.isalpha()]
120
+ new_smiles = ''
121
+ started = False
122
+ if len(digit_indices) > 2:
123
+ raise ValueError(
124
+ 'We need a monodentate ligand to start the macrocycle. More than one ring closure present.')
125
+ elif len(digit_indices) == 0:
126
+ for i, val in enumerate(smiles):
127
+ if (i == start_position) and (not started):
128
+ new_smiles += val + str(macro_ind)
129
+ started = True
130
+ else:
131
+ new_smiles += val
132
+ else:
133
+ for i, val in enumerate(smiles):
134
+ if (i in digit_indices) and (start_position == 0):
135
+ if not started:
136
+ new_smiles += val + str(macro_ind)
137
+ started = True
138
+ else:
139
+ new_smiles += val
140
+ elif (start_position != 0) and (i == alpha_indices[start_position]):
141
+ new_smiles += val + str(macro_ind)
142
+ started = True
143
+ else:
144
+ new_smiles += val
145
+ return new_smiles
146
+
147
+ def check_allowed(self, left, center, right):
148
+ forbidden_end = ['=', '/', '\\', ')', '[']
149
+ if left[-1] in forbidden_end:
150
+ center = left[-1] + center
151
+ left = left[:-1]
152
+ if center[-1] in forbidden_end:
153
+ right = center[-1] + right
154
+ center = center[:-1]
155
+ return left, center, right
156
+
157
+ def split_smiles_at_lc_adjacent(self, smiles_tuple):
158
+ '''
159
+ This function takes a smiles string and splits it into its respective
160
+ parts that can be functionalized. We allow functionalizations at the
161
+ direct neighbors of the coordinating atom. Thus, this function returns
162
+ a list of substrings that make up the smiles string, so that we can
163
+ stitch together different substructures.
164
+
165
+ Takes in a smiles tuple and splits the string into three parts:
166
+ 1) between the left adjacent atom and the connection atom
167
+ 2) the connection atom itself
168
+ 3) between the connection atom and right adjacent atom
169
+ If the coordination atom is the zeroeth index, then by definition, the
170
+ string between the left adjacent atom and the connection atom is going
171
+ to be a blank string. In a similar fashion, if the coordination atom is
172
+ the final index, then by definition, the string between the right adjacent
173
+ atom and the connection atom is going to be a blank string.
174
+ '''
175
+ smiles, coordination_atom_idx = (smiles_tuple[
176
+ 0], smiles_tuple[1])
177
+ '''
178
+ The coordination atom index ignores everything except for the letters.
179
+ Thus, we first need to build the indices of letters. We then can get
180
+ the substrings that are constructed by these letters.
181
+ '''
182
+ alphabet_indices = [i for i, val in enumerate(smiles) if val.isalpha()]
183
+ forbidden_end = ['=', '/', '\\', ')']
184
+ if len(alphabet_indices) > 3:
185
+ if (coordination_atom_idx == 0):
186
+ left = smiles[alphabet_indices[0]:alphabet_indices[2]]
187
+ center = smiles[alphabet_indices[2]:]
188
+ right = ''
189
+ elif (coordination_atom_idx == 1):
190
+ left = smiles[alphabet_indices[0]:alphabet_indices[1]]
191
+ center = smiles[alphabet_indices[1]:alphabet_indices[3]]
192
+ right = smiles[alphabet_indices[3]:]
193
+ elif coordination_atom_idx == (len(alphabet_indices) - 1):
194
+ left = smiles[alphabet_indices[0]:alphabet_indices[1]]
195
+ center = smiles[alphabet_indices[1]:alphabet_indices[-1]]
196
+ right = smiles[alphabet_indices[-1]:]
197
+ else:
198
+ left = smiles[0:alphabet_indices[coordination_atom_idx]]
199
+ center = smiles[alphabet_indices[
200
+ coordination_atom_idx]:alphabet_indices[coordination_atom_idx + 2]]
201
+ right = smiles[alphabet_indices[coordination_atom_idx + 2]:]
202
+ else:
203
+ if (coordination_atom_idx == 0):
204
+ left = smiles[alphabet_indices[0]:alphabet_indices[2]]
205
+ center = smiles[alphabet_indices[2]:]
206
+ right = ''
207
+ else: # (coordination_atom_idx == 1):
208
+ left = smiles[alphabet_indices[0]:alphabet_indices[1]]
209
+ center = smiles[alphabet_indices[1]:]
210
+ right = ''
211
+ left, center, right = self.check_allowed(left, center, right)
212
+ return left, center, right
213
+
214
+
215
+ class bridge:
216
+ '''
217
+ The bridge class is what is used to determine
218
+ the bonding of the bridging atoms.
219
+ '''
220
+ def __init__(self, name, bonding, func=()):
221
+ '''
222
+ Name is the name (i.e. O) of the bridging atom
223
+ Bonding is a single tuple that defines how the bridging
224
+ atom bonds. For O, it should be (1, 1), which suggests
225
+ two single bonds can be made. For N, it can either be
226
+ (1, 1) which will construct an NH moiety, or (2, 1)
227
+ which will construct an =N- moiety.
228
+ '''
229
+ if name.lower() == 'x':
230
+ name = ''
231
+ self.name = name
232
+ self.bonding = bonding
233
+ self.func = func
234
+
235
+ def get_possible_motifs(self):
236
+ if self.bonding == (1, 1):
237
+ return [(self.name, (self.func,))]
238
+ elif (self.bonding == (2, 1)) or (self.bonding == (1, 2)):
239
+ return [(self.name + '=', (self.func,)), ('=' + self.name, (self.func,))]
240
+
241
+ def return_name(self):
242
+ if (self.name.lower() in ['x', '']):
243
+ return 'none'
244
+ else:
245
+ if self.bonding == (2, 1) or self.bonding == (1, 2):
246
+ return self.name + '='
247
+ else:
248
+ return self.name
249
+
250
+
251
+ class tetradentate:
252
+ def __init__(self, fragment1, fragment2, fragment3, fragment4, bridge1, bridge2, bridge3):
253
+ '''
254
+ The class takes in four fragments, (1 through 4) that are stitched together
255
+ with bridges. Bridge1 connects fragment1 and fragment2, bridge3 connects fragment2
256
+ and fragment3 as well as fragment4 and fragment1, and bridge2 connects fragment 3
257
+ and fragment4. Only three distinct bridges are allowed to provide
258
+ symmetry constraints. This can be generalized to some arbitrary size.
259
+ '''
260
+ self.fragment1 = fragment1
261
+ self.fragment2 = fragment2
262
+ self.fragment3 = fragment3
263
+ self.fragment4 = fragment4
264
+ self.bridge1 = bridge1
265
+ self.bridge2 = bridge2
266
+ self.bridge3 = bridge3
267
+ self.name = (fragment1.name+'_'+bridge1.return_name()+'_' +
268
+ fragment2.name+'_'+bridge3.return_name()+'_' +
269
+ fragment3.name+'_'+bridge2.return_name()+'_' +
270
+ fragment4.name+'_'+bridge3.return_name())
271
+
272
+ def cyclic_equiv(self, u, v):
273
+ n, i, j = len(u), 0, 0
274
+ if n != len(v):
275
+ return False
276
+ while i < n and j < n:
277
+ k = 1
278
+ while k <= n and u[(i + k) % n] == v[(j + k) % n]:
279
+ k += 1
280
+ if k > n:
281
+ return True
282
+ if u[(i + k) % n] > v[(j + k) % n]:
283
+ i += k
284
+ else:
285
+ j += k
286
+ return False
287
+
288
+ def check_allowed(self, left, center, right):
289
+ forbidden_end = ['=', '/', '\\', ')', '[']
290
+ if left[-1] in forbidden_end:
291
+ center = left[-1] + center
292
+ left = left[:-1]
293
+ if center[-1] in forbidden_end:
294
+ right = center[-1] + right
295
+ center = center[:-1]
296
+ return left, center, right
297
+
298
+ def split_smiles_at_lc_adjacent(self, smiles_tuple):
299
+ '''
300
+ This function takes a smiles string and splits it into its respective
301
+ parts that can be functionalized. We allow functionalizations at the
302
+ direct neighbors of the coordinating atom. Thus, this function returns
303
+ a list of substrings that make up the smiles string, so that we can
304
+ stitch together different substructures.
305
+
306
+ Takes in a smiles tuple and splits the string into three parts:
307
+ 1) between the left adjacent atom and the connection atom
308
+ 2) the connection atom itself
309
+ 3) between the connection atom and right adjacent atom
310
+ If the coordination atom is the zeroeth index, then by definition, the
311
+ string between the left adjacent atom and the connection atom is going
312
+ to be a blank string. In a similar fashion, if the coordination atom is
313
+ the final index, then by definition, the string between the right adjacent
314
+ atom and the connection atom is going to be a blank string.
315
+ '''
316
+ smiles, coordination_atom_idx = (smiles_tuple[
317
+ 0], smiles_tuple[1])
318
+ '''
319
+ The coordination atom index ignores everything except for the letters.
320
+ Thus, we first need to build the indices of letters. We then can get
321
+ the substrings that are constructed by these letters.
322
+ '''
323
+ alphabet_indices = [i for i, val in enumerate(smiles) if val.isalpha()]
324
+ forbidden_end = ['=', '/', '\\', ')']
325
+ if len(alphabet_indices) > 3:
326
+ if (coordination_atom_idx == 0):
327
+ left = smiles[alphabet_indices[0]:alphabet_indices[2]]
328
+ center = smiles[alphabet_indices[2]:]
329
+ right = ''
330
+ elif (coordination_atom_idx == 1):
331
+ left = smiles[alphabet_indices[0]:alphabet_indices[1]]
332
+ center = smiles[alphabet_indices[1]:alphabet_indices[3]]
333
+ right = smiles[alphabet_indices[3]:]
334
+ elif coordination_atom_idx == (len(alphabet_indices) - 1):
335
+ left = smiles[alphabet_indices[0]:alphabet_indices[1]]
336
+ center = smiles[alphabet_indices[1]:alphabet_indices[-1]]
337
+ right = smiles[alphabet_indices[-1]:]
338
+ else:
339
+ left = smiles[0:alphabet_indices[coordination_atom_idx]]
340
+ center = smiles[alphabet_indices[
341
+ coordination_atom_idx]:alphabet_indices[coordination_atom_idx + 2]]
342
+ right = smiles[alphabet_indices[coordination_atom_idx + 2]:]
343
+ else:
344
+ if (coordination_atom_idx == 0):
345
+ left = smiles[alphabet_indices[0]:alphabet_indices[2]]
346
+ center = smiles[alphabet_indices[2]:]
347
+ right = ''
348
+ else: # (coordination_atom_idx == 1):
349
+ left = smiles[alphabet_indices[0]:alphabet_indices[1]]
350
+ center = smiles[alphabet_indices[1]:]
351
+ right = ''
352
+ left, center, right = self.check_allowed(left, center, right)
353
+ return left, center, right
354
+
355
+ def sp3_hybridization_checker(self, left, prev_center, right, bridge):
356
+ '''
357
+ This hybridization checker is modeled off of the following:
358
+ full_macrocycle = (left1 + center1 + '(' + frag1[0][0] + left2 + center2 +
359
+ '(' + frag2[0][0] + left3 + center3 +
360
+ '(' + frag3[0][0] + left4 + center4 +
361
+ '(' + frag4[0][0] + str(9) + ')' +
362
+ right4 + ')' + right3 + ')' + right2 + ')' + right1)
363
+ This code checks the C hybridization where relevant. Only really relevant
364
+ for planar ligands. Else the code will continue as normal.
365
+ If a ligand is planar (as identified by the presence of a double bond,
366
+ This code then checks if the joining atom is a carbon. If it is a carbon,
367
+ it ensures that the carbon is SP2 hybridized, and not SP3 hybridized. Returns
368
+ true if SP3 hybridized carbon is found.
369
+ '''
370
+ if ('C' in left) and (('=' in left) or ('=' in right)):
371
+ if len(bridge) > 0:
372
+ if (bridge[-1] == '=') or (left[1] == '=') or (len(right) > 1 and right[-2]=='='):
373
+ returnval = False
374
+ else:
375
+ returnval = True
376
+ else:
377
+ if (prev_center[-1] == '=') or (left[1] == '=') or (len(right) > 1 and right[-2] == '='):
378
+ returnval = False
379
+ else:
380
+ returnval = True
381
+ else:
382
+ # All cases that are not planar (e.g. ethers) will go here.
383
+ returnval = False
384
+ return returnval
385
+
386
+ def non_planar(self, left, center, right, frag):
387
+ digits = [val for val in right if val.isdigit()]
388
+ if (len(frag[0][0]) > 0 and len(right) > 0) and ((frag[0][0][0] == '=') and not ((left[0] == '=') or (right[0] == '='))):
389
+ returnval = True
390
+ elif (len(frag[0][0]) == 0) and len(digits) > 0: # case of zero connection, connection atom must be doubly bonded for planarity
391
+ if '=' not in right[0]:
392
+ returnval = True
393
+ else:
394
+ returnval = False
395
+ else:
396
+ print('INHEA', frag)
397
+ if frag[1][0].count('=') > 0:
398
+ # In this case, we have a planar monodentate fragment. Split the
399
+ # ligand into parts and analyze
400
+ print(frag[1][0], frag[2][0])
401
+ returnval = True
402
+ else:
403
+ returnval = False
404
+ return returnval
405
+
406
+ def get_charge(self, smiles):
407
+ pos = smiles.count('+')
408
+ neg = -1*smiles.count('-')
409
+ return neg+pos
410
+
411
+ def get_atoms(self, smiles):
412
+ return [val for val in smiles if val.isalpha()]
413
+
414
+ def get_formula(self, smiles):
415
+ atoms = self.get_atoms(smiles)
416
+ unique_atoms = set(atoms)
417
+ formula_list = []
418
+ for atom in unique_atoms:
419
+ formula_list.append(atom+str(atoms.count(atom)))
420
+ formula = "".join(formula_list)
421
+ return formula
422
+
423
+ def count_atoms(self, smiles):
424
+ return len([val for val in smiles if val.isalpha()])
425
+
426
+ def stitch(self):
427
+ frag1_compatible = self.fragment1.give_compatible_fragments(
428
+ self.bridge1, self.fragment2)
429
+ frag2_compatible = self.fragment2.give_compatible_fragments(
430
+ self.bridge3, self.fragment3)
431
+ frag3_compatible = self.fragment3.give_compatible_fragments(
432
+ self.bridge2, self.fragment4)
433
+ frag4_compatible = self.fragment4.give_compatible_fragments(
434
+ self.bridge3, self.fragment1)
435
+ checked = []
436
+ good = []
437
+ checked_canonical = []
438
+ counter = 0
439
+ counta = 0
440
+ flag = False
441
+ results_dict_list = []
442
+ for f1, frag1 in enumerate(frag1_compatible):
443
+ for f2, frag2 in enumerate(frag2_compatible):
444
+ for f3, frag3 in enumerate(frag3_compatible):
445
+ for f4, frag4 in enumerate(frag4_compatible):
446
+ check_for_rotation = [
447
+ frag1[1][0], frag1[0][0], frag2[1][0], frag2[0][0],
448
+ frag3[1][0], frag3[0][0], frag4[1][0], frag4[0][0]]
449
+ if any([self.cyclic_equiv(check_for_rotation, val) for val in checked]):
450
+ continue
451
+ else:
452
+ checked.append(check_for_rotation)
453
+ counta += 1
454
+ left1, center1, right1 = self.split_smiles_at_lc_adjacent(frag1[1])
455
+ left2, center2, right2 = self.split_smiles_at_lc_adjacent(frag2[1])
456
+ left3, center3, right3 = self.split_smiles_at_lc_adjacent(frag3[1])
457
+ left4, center4, right4 = self.split_smiles_at_lc_adjacent(frag4[1])
458
+
459
+ if len(frag4[0][0]) == 0:
460
+ # This has to be a separate case because of the ring closure. We don't need parentheses in this case.
461
+ full_macrocycle = (left1 + center1 + '(' + frag1[0][0] + left2 + center2 +
462
+ '(' + frag2[0][0] + left3 + center3 +
463
+ '(' + frag3[0][0] + left4 + center4 + frag4[0][0] + str(9) +
464
+ right4 + ')' + right3 + ')' + right2 + ')' + right1)
465
+ else:
466
+ full_macrocycle = (left1 + center1 + '(' + frag1[0][0] + left2 + center2 +
467
+ '(' + frag2[0][0] + left3 + center3 +
468
+ '(' + frag3[0][0] + left4 + center4 +
469
+ '(' + frag4[0][0] + str(9) + ')' +
470
+ right4 + ')' + right3 + ')' + right2 + ')' + right1)
471
+
472
+ if self.sp3_hybridization_checker(left2, center1, right2, frag1[0][0]):
473
+ continue
474
+ if self.sp3_hybridization_checker(left3, center2, right3, frag2[0][0]):
475
+ continue
476
+ if self.sp3_hybridization_checker(left4, center3, right4, frag3[0][0]):
477
+ continue
478
+ if self.sp3_hybridization_checker(left1, center4, right1, frag4[0][0]):
479
+ continue
480
+ m = Chem.MolFromSmiles(full_macrocycle)
481
+ if m is not None:
482
+ test = Chem.MolToSmiles(m, canonical=True, isomericSmiles=False)
483
+ charge = self.get_charge(full_macrocycle)
484
+ if test in checked_canonical:
485
+ continue
486
+ else:
487
+ print(self.fragment1.name, self.fragment3.name,
488
+ self.bridge1.return_name(), self.bridge2.return_name(),
489
+ self.bridge3.return_name())
490
+ func_1, func_2, func_3, func_4 = False, False, False, False
491
+ bridge1_func, bridge2_func, bridge3_func = False, False, False
492
+ coord_2 = (frag1[1][1] +
493
+ self.count_atoms(center1) +
494
+ self.count_atoms(frag1[0][0]) +
495
+ self.count_atoms(left1))
496
+ coord_3 = (coord_2 + self.count_atoms(center2) +
497
+ self.count_atoms(frag2[0][0]) +
498
+ self.count_atoms(left3))
499
+ coord_4 = (coord_3 + self.count_atoms(center3) +
500
+ self.count_atoms(frag3[0][0]) +
501
+ self.count_atoms(left4))
502
+ if len(frag1[1][2]) > 0: # frag 1 has functionalizable positions
503
+ func_1 = [val + self.count_atoms(frag1[0][0] + left2 + center2 +
504
+ '(' + frag2[0][0] + left3 + center3 +
505
+ '(' + frag3[0][0] + left4 + center4 +
506
+ frag4[0][0] + str(9) + right4 + ')' +
507
+ right3 + ')' + right2)
508
+ for val in frag1[1][2]]
509
+ if len(frag2[1][2]) > 0:
510
+ func_2 = [val + self.count_atoms(frag1[0][0] + left2 + center2 +
511
+ frag2[0][0] + left3 + center3 +
512
+ '(' + frag3[0][0] + left4 + center4 +
513
+ frag4[0][0] + str(9) +
514
+ right4 + ')' + right3)
515
+ for val in frag2[1][2]]
516
+ if len(frag3[1][2]) > 0:
517
+ func_3 = [val + self.count_atoms(frag1[0][0] + left2 + center2 +
518
+ frag2[0][0] + left3 + center3 +
519
+ frag3[0][0] + left4 + center4 +
520
+ frag4[0][0] + str(9) + right4)
521
+ for val in frag3[1][2]]
522
+ if len(frag4[1][2]) > 0:
523
+ func_4 = [val + self.count_atoms(frag1[0][0] + left2 + center2 +
524
+ frag2[0][0] + left3 + center3 +
525
+ frag3[0][0] + left4 + center4 +
526
+ frag4[0][0] + str(9))
527
+ for val in frag4[1][2]]
528
+
529
+ if len(frag1[0][1]) > 0: # frag 1 has functionalizable positions
530
+ bridge1_func = [self.count_atoms(left1 + center1) for _ in frag1[0][1]]
531
+ if len(frag3[0][1]) > 0:
532
+ bridge2_func = [self.count_atoms(left1 + center1 + '(' + frag1[0][0] + left2 + center2 +
533
+ '(' + frag2[0][0] + left3 + center3) for _ in frag3[0][1]]
534
+
535
+ if len(frag2[0][1]) > 0:
536
+ # ## bridge 3 is symmetric
537
+ bridge3_func_1 = [self.count_atoms(left1 + center1 + '(' + frag1[0][0] + left2 + center2)
538
+ for _ in frag2[0][1]]
539
+ bridge3_func_2 = [self.count_atoms(left1 + center1 + '(' + frag1[0][0] + left2 + center2 +
540
+ '(' + frag2[0][0] + left3 + center3 +
541
+ '(' + frag3[0][0] + left4 + center4)for _ in frag2[0][1]]
542
+ bridge3_func = [bridge3_func_1, bridge3_func_2]
543
+
544
+ # At the end here we are adding back ones because smicat is 1 indexed
545
+ # instead of 0
546
+ coord_atoms_zero_index = [
547
+ frag1[1][1], coord_2, coord_3, coord_4]
548
+ coord_atoms_smicat = [
549
+ frag1[1][1] + 1, coord_2 + 1, coord_3 + 1, coord_4 + 1]
550
+ coord_elements = [self.get_atoms(frag1[1][0])[frag1[1][1]].strip('([/-+])'),
551
+ self.get_atoms(frag2[1][0])[frag2[1][1]].strip('([/-+])'),
552
+ self.get_atoms(frag3[1][0])[frag3[1][1]].strip('([/-+])'),
553
+ self.get_atoms(frag4[1][0])[frag4[1][1]].strip('([/-+])')]
554
+ temp_dict = {'name': self.name,
555
+ 'frag1': self.fragment1.name,
556
+ 'frag2': self.fragment2.name,
557
+ 'frag3': self.fragment3.name,
558
+ 'frag4': self.fragment4.name,
559
+ 'bridge1': self.bridge1.return_name(),
560
+ 'bridge2': self.bridge2.return_name(),
561
+ 'bridge3': self.bridge3.return_name(),
562
+ 'frag1_smiles': frag1[1][0],
563
+ 'frag2_smiles': frag2[1][0],
564
+ 'frag3_smiles': frag3[1][0],
565
+ 'frag4_smiles': frag4[1][0],
566
+ 'frag1_func': func_1,
567
+ 'frag2_func': func_2,
568
+ 'frag3_func': func_3,
569
+ 'frag4_func': func_4,
570
+ 'bridge1_func': bridge1_func,
571
+ 'bridge2_func': bridge2_func,
572
+ 'bridge3_func': bridge3_func,
573
+ 'macrocycle_smiles': full_macrocycle,
574
+ 'coord_atoms_zero_index': coord_atoms_zero_index,
575
+ 'coord_atoms_smicat': coord_atoms_smicat,
576
+ 'coord_elements': coord_elements,
577
+ 'formula': CalcMolFormula(m),
578
+ 'charge': charge,
579
+ 'size': self.count_atoms(full_macrocycle),
580
+ 'canonical_smiles': test
581
+ }
582
+ results_dict_list.append(temp_dict)
583
+ good.append((full_macrocycle, coord_atoms_smicat, charge))
584
+ checked_canonical.append(test)
585
+ counter += 1
586
+ return results_dict_list