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
tests/helperFuncs.py ADDED
@@ -0,0 +1,658 @@
1
+ import json
2
+ import os
3
+ import random
4
+ import shutil
5
+ import numpy as np
6
+ from typing import List
7
+ from molSimplify.Scripts.geometry import kabsch, distance
8
+ from molSimplify.Scripts.generator import startgen
9
+ from molSimplify.Classes.globalvars import (dict_oneempty_check_st,
10
+ oneempty_angle_ref)
11
+ from molSimplify.Classes.mol3D import mol3D
12
+ from typing import Dict
13
+ from contextlib import contextmanager
14
+ from pathlib import Path
15
+
16
+
17
+ def is_number(s: str) -> bool:
18
+ """check whether the string is a integral/float/scientific"""
19
+ try:
20
+ float(s)
21
+ return True
22
+ except ValueError:
23
+ return False
24
+
25
+
26
+ @contextmanager
27
+ def working_directory(path: Path):
28
+ prev_cwd = os.getcwd()
29
+ try:
30
+ os.chdir(path)
31
+ yield
32
+ finally:
33
+ os.chdir(prev_cwd)
34
+
35
+
36
+ def fuzzy_equal(x1, x2, thresh: float) -> bool:
37
+ return np.fabs(float(x1) - float(x2)) < thresh
38
+
39
+
40
+ def fuzzy_compare_xyz(xyz1, xyz2, thresh: float) -> bool:
41
+ fuzzyEqual = False
42
+ mol1 = mol3D()
43
+ mol1.readfromxyz(xyz1)
44
+ mol2 = mol3D()
45
+ mol2.readfromxyz(xyz2)
46
+ mol1, U, d0, d1 = kabsch(mol1, mol2)
47
+ rmsd12 = mol1.rmsd(mol2)
48
+ print(('rmsd is ' + '{0:.2f}'.format(rmsd12)))
49
+ if rmsd12 < thresh:
50
+ fuzzyEqual = True
51
+ return fuzzyEqual
52
+
53
+
54
+ def getAllLigands(xyz):
55
+ mymol3d = mol3D()
56
+ mymol3d.readfromxyz(xyz)
57
+ # OUTPUT
58
+ # -mol3D: mol3D of all ligands
59
+ mm = mymol3d.findMetal()[0]
60
+ mbonded = mymol3d.getBondedAtoms(mm)
61
+ ligands = []
62
+ ligAtoms = []
63
+ # Get the 1st atom of one ligand
64
+ for iatom in mbonded:
65
+ if iatom not in ligAtoms:
66
+ lig = [iatom]
67
+ oldlig = []
68
+ while len(lig) > len(oldlig):
69
+ # make a copy of lig
70
+ oldlig = lig[:]
71
+ for i in oldlig:
72
+ lbonded = mymol3d.getBondedAtoms(i)
73
+ for j in lbonded:
74
+ if (j != mm) and (j not in lig):
75
+ lig.append(j)
76
+ newlig = mol3D()
77
+ for i in lig:
78
+ newlig.addAtom(mymol3d.atoms[i])
79
+ ligAtoms.append(i)
80
+ ligands.append(newlig)
81
+ print("Ligand analysis of xyz file: ", xyz)
82
+ print("There are ", len(ligands), " ligand(s) bonded with metal center\
83
+ ", mm, " in the complex")
84
+ for i in range(0, len(ligands)):
85
+ print("Number of atoms in ligand # ", i, " : ", ligands[i].natoms)
86
+ return ligands
87
+
88
+
89
+ def getMetalLigBondLength(mymol3d: mol3D) -> List[float]:
90
+ mm = mymol3d.findMetal()[0]
91
+ bonded = mymol3d.getBondedAtoms(mm)
92
+ blength = []
93
+ for i in bonded:
94
+ blength.append(
95
+ distance(mymol3d.atoms[mm].coords(), mymol3d.atoms[i].coords()))
96
+ return blength
97
+
98
+
99
+ def compareNumAtoms(xyz1, xyz2) -> bool:
100
+ """Compare number of atoms"""
101
+ print("Checking total number of atoms")
102
+ mol1 = mol3D()
103
+ mol1.readfromxyz(xyz1)
104
+ mol2 = mol3D()
105
+ mol2.readfromxyz(xyz2)
106
+ # Compare number of atoms
107
+ passNumAtoms = (mol1.natoms == mol2.natoms)
108
+ print("Pass total number of atoms check: ", passNumAtoms)
109
+ return passNumAtoms
110
+
111
+
112
+ def compareMLBL(xyz1, xyz2, thresh: float) -> bool:
113
+ """Compare Metal Ligand Bond Length"""
114
+ print("Checking metal-ligand bond length")
115
+ mol1 = mol3D()
116
+ mol1.readfromxyz(xyz1)
117
+ mol2 = mol3D()
118
+ mol2.readfromxyz(xyz2)
119
+ bl1 = getMetalLigBondLength(mol1)
120
+ bl2 = getMetalLigBondLength(mol2)
121
+ passMLBL = True
122
+ if len(bl1) != len(bl2):
123
+ print("Error! Number of metal-ligand bonds is different")
124
+ passMLBL = False
125
+ else:
126
+ for i in range(0, len(bl1)):
127
+ if not fuzzy_equal(bl1[i], bl2[i], thresh):
128
+ print("Error! Metal-Ligand bondlength mismatch for bond # ", i)
129
+ passMLBL = False
130
+ print("Pass metal-ligand bond length check: ", passMLBL)
131
+ print("Threshold for bondlength difference: ", thresh)
132
+ return passMLBL
133
+
134
+
135
+ def compareLG(xyz1, xyz2, thresh: float) -> bool:
136
+ """Compare Ligand Geometry"""
137
+ print("Checking the Ligand Geometries")
138
+ passLG = True
139
+ ligs1 = getAllLigands(xyz1)
140
+ ligs2 = getAllLigands(xyz2)
141
+ if len(ligs1) != len(ligs2):
142
+ passLG = False
143
+ return passLG
144
+ for i in range(0, len(ligs1)): # Iterate over the ligands
145
+ print("Checking geometry for ligand # ", i)
146
+ ligs1[i], U, d0, d1 = kabsch(ligs1[i], ligs2[i])
147
+ rmsd12 = ligs1[i].rmsd(ligs2[i])
148
+ print(('rmsd is ' + '{0:.2f}'.format(rmsd12)))
149
+ if rmsd12 > thresh:
150
+ passLG = False
151
+ return passLG
152
+ print("Pass ligand geometry check: ", passLG)
153
+ print("Threshold for ligand geometry RMSD difference: ", thresh)
154
+ return passLG
155
+
156
+
157
+ def compareOG(xyz1, xyz2, thresh: float) -> bool:
158
+ print("Checking the overall geometry")
159
+ passOG = fuzzy_compare_xyz(xyz1, xyz2, thresh)
160
+ print("Pass overall geometry check: ", passOG)
161
+ print("Threshold for overall geometry check: ", thresh)
162
+ return passOG
163
+
164
+
165
+ def runtest_num_atoms_in_xyz(tmpdir, resource_path_root, xyzfile):
166
+ file_path = resource_path_root / "refs" / f"{xyzfile}.xyz"
167
+ xyz_file1 = mol3D()
168
+ xyz_file1.readfromxyz(file_path)
169
+ xyz_file1.getNumAtoms()
170
+
171
+ with open(file_path, 'r') as f:
172
+ xyz_file2 = f.readlines()
173
+ num_atoms = int(xyz_file2[0])
174
+
175
+ if num_atoms != xyz_file1.getNumAtoms():
176
+ print('Something is wrong with the number of atoms read from the XYZ file!')
177
+
178
+
179
+ def compareGeo(xyz1, xyz2, threshMLBL, threshLG, threshOG, slab=False):
180
+ # Compare number of atoms
181
+ passNumAtoms = compareNumAtoms(xyz1, xyz2)
182
+ # Compare Metal ligand bond length
183
+ if not slab:
184
+ passMLBL = compareMLBL(xyz1, xyz2, threshMLBL)
185
+ # Compare Single ligand geometry
186
+ passLG = compareLG(xyz1, xyz2, threshLG)
187
+ # Compare gross match of overall complex
188
+ passOG = compareOG(xyz1, xyz2, threshOG)
189
+ # FF free test
190
+ # ANN set bond length test
191
+ # covalent radii test
192
+ if not slab:
193
+ return [passNumAtoms, passMLBL, passLG, passOG]
194
+ else:
195
+ return [passNumAtoms, passOG]
196
+
197
+
198
+ def comparedict(ref, gen, thresh):
199
+ passComp = True
200
+ if not set(ref.keys()) <= set(gen.keys()):
201
+ raise KeyError("Keys in the dictionay has been changed")
202
+ for key in ref:
203
+ try:
204
+ valref, valgen = float(ref[key]), float(gen[key])
205
+ if not abs(valref - valgen) < thresh:
206
+ passComp = False
207
+ except ValueError:
208
+ valref, valgen = str(ref[key]), str(gen[key])
209
+ if not valgen == valref:
210
+ passComp = False
211
+ return passComp
212
+
213
+
214
+ def jobname(infile: str) -> str:
215
+ name = os.path.basename(infile)
216
+ name = name.replace(".in", "")
217
+ return name
218
+
219
+
220
+ def jobdir(infile):
221
+ name = jobname(infile)
222
+ # homedir = os.path.expanduser("~")
223
+ homedir = os.getcwd()
224
+ mydir = homedir + '/Runs/' + name
225
+ return mydir
226
+
227
+
228
+ def parse4test(infile, tmpdir: Path, isMulti: bool = False, extra_args: Dict[str, str] = {}) -> str:
229
+ name = jobname(infile)
230
+ f = tmpdir.join(os.path.basename(infile))
231
+ newname = f.dirname + "/" + os.path.basename(infile)
232
+ print(newname)
233
+ print('&&&&&&&&&')
234
+ with open(infile, 'r') as f_in:
235
+ data = f_in.readlines()
236
+ newdata = ""
237
+ for line in data:
238
+ if line.split()[0] in extra_args.keys():
239
+ newdata += (line.split()[0] + ' ' + str(os.path.dirname(infile))
240
+ + '/' + str(extra_args[line.split()[0]]) + '\n')
241
+ continue
242
+ if not (("-jobdir" in line) or ("-name" in line)):
243
+ newdata += line
244
+ # Check if we need to parse the dir of smi file
245
+ if ("-lig " in line) and (".smi" in line):
246
+ smi = line.strip('\n').split()[1]
247
+ abs_smi = os.path.dirname(infile) + '/' + smi
248
+ newdata += "-lig " + abs_smi + "\n"
249
+ # fsmi = tmpdir.join(smi)
250
+ # oldsmi=os.path.dirname(infile)+"/"+smi
251
+ # with open(oldsmi) as f:
252
+ # smidata=f.read()
253
+ # fsmi.write(smidata)
254
+ # print "smi file is copied to the temporary running folder!"
255
+ newdata += f"-rundir {tmpdir}\n"
256
+ newdata += "-jobdir " + name + "\n"
257
+ print('=====')
258
+ print(newdata)
259
+ if not isMulti:
260
+ newdata += "-name " + name + "\n"
261
+ print(newdata)
262
+ f.write(newdata)
263
+ print("Input file parsed for test is located: ", newname)
264
+ jobdir = str(tmpdir / name)
265
+ return newname, jobdir
266
+
267
+
268
+ def parse4testNoFF(infile, tmpdir: Path, isMulti: bool = False) -> str:
269
+ name = jobname(infile)
270
+ newinfile = str(tmpdir / (name + "_noff.in"))
271
+ shutil.copyfile(infile, newinfile)
272
+ return parse4test(newinfile, tmpdir, isMulti, extra_args={"-ffoption": "N"})
273
+
274
+
275
+ def report_to_dict(lines):
276
+ """
277
+ create a dictionary from comma
278
+ separated files
279
+ """
280
+ d = dict()
281
+ for line in lines:
282
+ key, val = line.strip().split(',')[0:2]
283
+ try:
284
+ d[key] = float(val.strip('[]'))
285
+ except ValueError:
286
+ d[key] = str(val.strip('[]'))
287
+ # extra proc for ANN_bond list:
288
+ if 'ANN_bondl' in d.keys():
289
+ d['ANN_bondl'] = [float(i.strip('[]')) for i in d['ANN_bondl'].split()]
290
+ return (d)
291
+
292
+
293
+ # compare the report, split key and values, do
294
+ # fuzzy comparison on the values
295
+
296
+
297
+ def compare_report_new(report1, report2):
298
+ with open(report1, 'r') as f_in:
299
+ data1 = f_in.readlines()
300
+ with open(report2, 'r') as f_in:
301
+ data2 = f_in.readlines()
302
+ if data1 and data2:
303
+ Equal = True
304
+ dict1 = report_to_dict(data1)
305
+ dict2 = report_to_dict(data2)
306
+ else:
307
+ Equal = False
308
+ print('File not found:')
309
+ if not data1:
310
+ print(('missing: ' + str(report1)))
311
+ if not data2:
312
+ print(('missing: ' + str(report2)))
313
+ if Equal:
314
+
315
+ for k in dict1.keys():
316
+ if Equal:
317
+ val1 = dict1[k]
318
+ if k not in dict2.keys():
319
+ Equal = False
320
+ print("Report compare failed for ", report1, report2)
321
+ print("keys " + str(k) + " not present in " + str(report2))
322
+ else:
323
+ val2 = dict2[k]
324
+
325
+ if not k == "ANN_bondl":
326
+ # see whether the values are numbers or text
327
+ if is_number(val1) and is_number(val2):
328
+ Equal = fuzzy_equal(val1, val2, 1e-4)
329
+ else:
330
+ Equal = (val1 == val2)
331
+ if not Equal:
332
+ print("Report compare failed for ",
333
+ report1, report2)
334
+ print("Values don't match for key", k)
335
+ print([val1, val2])
336
+ else:
337
+ # loop over ANN bonds?
338
+ # see whether the values are numbers or text
339
+ for ii, v in enumerate(val1):
340
+ Equal = fuzzy_equal(v, val2[ii], 1e-4)
341
+ if not Equal:
342
+ print("Report compare failed for ",
343
+ report1, report2)
344
+ print("Values don't match for key", k)
345
+ print([val1, val2])
346
+ else:
347
+ break
348
+ return Equal
349
+
350
+
351
+ # When generating multiple files from the 1 input file
352
+ # Compare the test directory and reference directory for
353
+ # Number of xyz file, xyz file names
354
+
355
+
356
+ def checkMultiFileGen(myjobdir, refdir):
357
+ passMultiFileCheck = True
358
+ myfiles = [i for i in os.listdir(myjobdir) if ".xyz" in i]
359
+ reffiles = [i for i in os.listdir(refdir) if ".xyz" in i]
360
+ print("Run directory:", myjobdir)
361
+ print("Generated xyz:", myfiles)
362
+ print("Reference directory:", refdir)
363
+ print("Ref xyz:", reffiles)
364
+ print("Generated ", len(myfiles), " files, expecting ", len(reffiles))
365
+ if len(myfiles) != len(reffiles):
366
+ passMultiFileCheck = False
367
+ print("Error! Numbers don't match!")
368
+ else:
369
+ for ref in reffiles:
370
+ if ref not in myfiles:
371
+ print("xyz file ", ref, " is missing in generated file folder")
372
+ passMultiFileCheck = False
373
+ return [passMultiFileCheck, myfiles]
374
+
375
+
376
+ def compare_qc_input(inp, inp_ref):
377
+ passQcInputCheck = True
378
+ if not os.path.exists(inp_ref):
379
+ return passQcInputCheck
380
+ elif os.path.exists(inp_ref) and (not os.path.exists(inp)):
381
+ passQcInputCheck = False
382
+ print(inp + "not found")
383
+ return passQcInputCheck
384
+
385
+ with open(inp, 'r') as f_in:
386
+ data1 = f_in.read()
387
+ with open(inp_ref, 'r') as f_in:
388
+ data_ref = f_in.read()
389
+ if len(data1) != len(data_ref):
390
+ passQcInputCheck = False
391
+ return passQcInputCheck
392
+ for i in range(0, len(data1)):
393
+ if data1[i] != data_ref[i]:
394
+ passQcInputCheck = False
395
+ break
396
+ return passQcInputCheck
397
+
398
+
399
+ def runtest(tmpdir, resource_path_root, name, threshMLBL, threshLG, threshOG, seed=31415):
400
+ # Set seeds to eliminate randomness from test results
401
+ random.seed(seed)
402
+ np.random.seed(seed)
403
+ infile = resource_path_root / "inputs" / f"{name}.in"
404
+ newinfile, myjobdir = parse4test(infile, tmpdir)
405
+ args = ['main.py', '-i', newinfile]
406
+ with working_directory(tmpdir):
407
+ startgen(args, False, False)
408
+ output_xyz = myjobdir + '/' + name + '.xyz'
409
+ output_report = myjobdir + '/' + name + '.report'
410
+ output_qcin = myjobdir + '/terachem_input'
411
+ with open(newinfile, 'r') as f_in:
412
+ molsim_data = f_in.read()
413
+ if 'orca' in molsim_data.lower():
414
+ # if not '-name' in molsim_data.lower():
415
+ output_qcin = myjobdir + '/orca.in'
416
+
417
+ if 'molcas' in molsim_data.lower():
418
+ output_qcin = myjobdir + '/molcas.input'
419
+
420
+ ref_xyz = resource_path_root / "refs" / f"{name}.xyz"
421
+ ref_report = resource_path_root / "refs" / f"{name}.report"
422
+ ref_qcin = resource_path_root / "refs" / f"{name}.qcin"
423
+
424
+ print("Test input file: ", newinfile)
425
+ print("Test output files are generated in ", myjobdir)
426
+ print("Output xyz file: ", output_xyz)
427
+ pass_xyz = compareGeo(output_xyz, ref_xyz, threshMLBL, threshLG, threshOG)
428
+ [passNumAtoms, passMLBL, passLG, passOG] = pass_xyz
429
+ pass_report = compare_report_new(output_report, ref_report)
430
+ print("Reference xyz file: ", ref_xyz)
431
+ print("Test report file: ", output_report)
432
+ print("Reference report file: ", ref_report)
433
+ print("Reference xyz status: ", pass_xyz)
434
+ print("Reference report status: ", pass_report)
435
+ pass_qcin = compare_qc_input(output_qcin, ref_qcin)
436
+ print("Reference qc input file: ", ref_qcin)
437
+ print("Test qc input file:", output_qcin)
438
+ print("Qc input status:", pass_qcin)
439
+ return [passNumAtoms, passMLBL, passLG, passOG, pass_report, pass_qcin]
440
+
441
+
442
+ def runtest_slab(tmpdir, resource_path_root, name, threshOG, extra_files=None):
443
+ """
444
+ Performs test for slab builder.
445
+
446
+ Parameters
447
+ ----------
448
+ tmpdir : str
449
+ tmp folder to run the test
450
+ name : str
451
+ name of the test
452
+ axis : threshOG
453
+ tolerance for RMSD comparison of overall geometries.
454
+ """
455
+ infile = resource_path_root / "inputs" / f"{name}.in"
456
+ newinfile, _ = parse4test(infile, tmpdir)
457
+ if extra_files is not None:
458
+ for file_name in extra_files:
459
+ file_path = resource_path_root / "inputs" / f"{file_name}"
460
+ shutil.copyfile(file_path, tmpdir / file_name)
461
+ args = ['main.py', '-i', newinfile]
462
+ with working_directory(tmpdir):
463
+ startgen(args, False, False)
464
+ output_xyz = tmpdir / 'slab' / 'super332.xyz'
465
+ ref_xyz = resource_path_root / "refs" / f"{name}.xyz"
466
+ print("Output xyz file: ", output_xyz)
467
+ pass_xyz = compareGeo(output_xyz, ref_xyz, threshMLBL=0, threshLG=0,
468
+ threshOG=threshOG, slab=True)
469
+ [passNumAtoms, passOG] = pass_xyz
470
+ return [passNumAtoms, passOG]
471
+
472
+
473
+ def runtest_molecule_on_slab(tmpdir, resource_path_root, name, threshOG, extra_files=None):
474
+ """
475
+ Performs test for slab builder with a CO molecule adsorbed.
476
+
477
+ Parameters
478
+ ----------
479
+ tmpdir : str
480
+ tmp folder to run the test
481
+ name : str
482
+ name of the test
483
+ axis : threshOG
484
+ tolerance for RMSD comparison of overall geometries.
485
+ """
486
+ infile = resource_path_root / "inputs" / f"{name}.in"
487
+ newinfile, _ = parse4test(infile, tmpdir, extra_args={
488
+ '-unit_cell': 'slab.xyz', '-target_molecule': 'co.xyz'})
489
+ if extra_files is not None:
490
+ for file_name in extra_files:
491
+ file_path = resource_path_root / "inputs" / f"{file_name}"
492
+ shutil.copyfile(file_path, tmpdir / file_name)
493
+ args = ['main.py', '-i', newinfile]
494
+ with working_directory(tmpdir):
495
+ startgen(args, False, False)
496
+ output_xyz = tmpdir / 'loaded_slab' / 'loaded.xyz'
497
+ ref_xyz = resource_path_root / "refs" / f"{name}.xyz"
498
+ print("Output xyz file: ", output_xyz)
499
+ pass_xyz = compareGeo(output_xyz, ref_xyz, threshMLBL=0, threshLG=0,
500
+ threshOG=threshOG, slab=True)
501
+ [passNumAtoms, passOG] = pass_xyz
502
+ return [passNumAtoms, passOG]
503
+
504
+
505
+ def runtestgeo(tmpdir, resource_path_root, name, thresh, deleteH=True, geo_type="oct"):
506
+ initgeo = resource_path_root / "inputs" / "geocheck" / name / "init.xyz"
507
+ optgeo = resource_path_root / "inputs" / "geocheck" / name / "opt.xyz"
508
+ refjson = resource_path_root / "refs" / "geocheck" / name / "ref.json"
509
+ mymol = mol3D()
510
+ mymol.readfromxyz(optgeo)
511
+ init_mol = mol3D()
512
+ init_mol.readfromxyz(initgeo)
513
+ with working_directory(tmpdir):
514
+ if geo_type == "oct":
515
+ _, _, dict_struct_info = mymol.IsOct(
516
+ init_mol=init_mol, debug=False, flag_deleteH=deleteH)
517
+ elif geo_type == "one_empty":
518
+ _, _, dict_struct_info = mymol.IsStructure(
519
+ init_mol=init_mol, dict_check=dict_oneempty_check_st,
520
+ angle_ref=oneempty_angle_ref, num_coord=5, debug=False,
521
+ flag_deleteH=deleteH)
522
+ else:
523
+ raise ValueError(f"Invalid geo_type {geo_type}")
524
+ with open(refjson, "r") as fo:
525
+ dict_ref = json.load(fo)
526
+ # passGeo = (sorted(dict_ref.items()) == sorted(dict_struct_info.items()))
527
+ print("ref: ", dict_ref)
528
+ print("now: ", dict_struct_info)
529
+ passGeo = comparedict(dict_ref, dict_struct_info, thresh)
530
+ return passGeo
531
+
532
+
533
+ def runtestgeo_optonly(tmpdir, resource_path_root, name, thresh, deleteH=True, geo_type="oct"):
534
+ optgeo = resource_path_root / "inputs" / "geocheck" / name / "opt.xyz"
535
+ refjson = resource_path_root / "refs" / "geocheck" / name / "ref.json"
536
+ mymol = mol3D()
537
+ mymol.readfromxyz(optgeo)
538
+ if geo_type == "oct":
539
+ _, _, dict_struct_info = mymol.IsOct(debug=False,
540
+ flag_deleteH=deleteH)
541
+ with open(refjson, "r") as fo:
542
+ dict_ref = json.load(fo)
543
+ passGeo = comparedict(dict_ref, dict_struct_info, thresh)
544
+ return passGeo
545
+ else:
546
+ raise NotImplementedError('Only octahedral geometries supported for now')
547
+
548
+
549
+ def runtestNoFF(tmpdir, resource_path_root, name, threshMLBL, threshLG, threshOG):
550
+ infile = resource_path_root / "inputs" / f"{name}.in"
551
+ newinfile, myjobdir = parse4testNoFF(infile, tmpdir)
552
+ [passNumAtoms, passMLBL, passLG, passOG, pass_report,
553
+ pass_qcin] = [True, True, True, True, True, True]
554
+ if newinfile != "":
555
+ newname = jobname(newinfile)
556
+ args = ['main.py', '-i', newinfile]
557
+ with working_directory(tmpdir):
558
+ startgen(args, False, False)
559
+ output_xyz = myjobdir + '/' + newname + '.xyz'
560
+ output_report = myjobdir + '/' + newname + '.report'
561
+ with open(newinfile, 'r') as f_in:
562
+ molsim_data = f_in.read()
563
+ output_qcin = myjobdir + '/terachem_input'
564
+ if 'orca' in molsim_data.lower():
565
+ output_qcin = myjobdir + '/orca.in'
566
+ if 'molcas' in molsim_data.lower():
567
+ output_qcin = myjobdir + '/molcas.input'
568
+ ref_xyz = resource_path_root / "refs" / f"{newname}.xyz"
569
+ ref_report = resource_path_root / "refs" / f"{newname}.report"
570
+ ref_qcin = resource_path_root / "refs" / f"{name}.qcin"
571
+ print("Test input file: ", newinfile)
572
+ print("Test output files are generated in ", myjobdir)
573
+ print("Output xyz file: ", output_xyz)
574
+ pass_xyz = compareGeo(output_xyz, ref_xyz,
575
+ threshMLBL, threshLG, threshOG)
576
+ [passNumAtoms, passMLBL, passLG, passOG] = pass_xyz
577
+ pass_report = compare_report_new(output_report, ref_report)
578
+ print("Reference xyz file: ", ref_xyz)
579
+ print("Test report file: ", output_report)
580
+ print("Reference report file: ", ref_report)
581
+ print("Reference xyz status: ", pass_xyz)
582
+ print("Reference report status: ", pass_report)
583
+ pass_qcin = compare_qc_input(output_qcin, ref_qcin)
584
+ print("Reference qc input file: ", ref_qcin)
585
+ print("Test qc input file: ", output_qcin)
586
+ print("Qc input status: ", pass_qcin)
587
+ return [passNumAtoms, passMLBL, passLG, passOG, pass_report, pass_qcin]
588
+
589
+
590
+ def runtest_reportonly(tmpdir, resource_path_root, name, seed=31415):
591
+ # Set seeds to eliminate randomness from test results
592
+ random.seed(seed)
593
+ np.random.seed(seed)
594
+ infile = resource_path_root / "inputs" / f"{name}.in"
595
+ # Copy the input file to the temporary folder
596
+ shutil.copy(infile, tmpdir/f'{name}_reportonly.in')
597
+ # Add the report only flag
598
+ with open(tmpdir/f'{name}_reportonly.in', 'a') as f:
599
+ f.write('-reportonly True\n')
600
+ newinfile, myjobdir = parse4test(tmpdir/f'{name}_reportonly.in', tmpdir)
601
+ args = ['main.py', '-i', newinfile]
602
+ with open(newinfile, 'r') as f:
603
+ print(f.readlines())
604
+ with working_directory(tmpdir):
605
+ startgen(args, False, False)
606
+ output_report = myjobdir + '/' + name + '_reportonly.report'
607
+ ref_report = resource_path_root / "refs" / f"{name}.report"
608
+ # Copy the reference report to the temporary folder
609
+ shutil.copy(ref_report, tmpdir/f'{name}_ref.report')
610
+ with open(tmpdir/f'{name}_ref.report', 'r') as f:
611
+ lines = f.read()
612
+ lines = lines.replace('Min_dist (A), 1000', 'Min_dist (A), graph')
613
+ with open(tmpdir/f'{name}_ref.report', 'w') as f:
614
+ f.write(lines)
615
+
616
+ print("Test input file: ", newinfile)
617
+ print("Test output files are generated in ", myjobdir)
618
+ pass_report = compare_report_new(output_report, tmpdir/f'{name}_ref.report')
619
+ print("Test report file: ", output_report)
620
+ print("Reference report file: ", ref_report)
621
+ print("Reference report status: ", pass_report)
622
+ return pass_report
623
+
624
+
625
+ def runtestMulti(tmpdir, resource_path_root, name, threshMLBL, threshLG, threshOG):
626
+ infile = resource_path_root / "inputs" / f"{name}.in"
627
+ newinfile, myjobdir = parse4test(infile, tmpdir, True)
628
+ args = ['main.py', '-i', newinfile]
629
+ with working_directory(tmpdir):
630
+ startgen(args, False, False)
631
+ print("Test input file: ", newinfile)
632
+ print("Test output files are generated in ", myjobdir)
633
+ refdir = resource_path_root / "refs" / name
634
+ [passMultiFileCheck, myfiles] = checkMultiFileGen(myjobdir, refdir)
635
+ pass_structures = []
636
+ if not passMultiFileCheck:
637
+ print("Test failed for checking number and names of generated files. "
638
+ "Test ends")
639
+ else:
640
+ print("Checking each generated structure...")
641
+ for f in myfiles:
642
+ if ".xyz" in f:
643
+ r = f.replace(".xyz", ".report")
644
+ output_xyz = f"{myjobdir}/{f}"
645
+ ref_xyz = f"{refdir}/{f}"
646
+ output_report = f"{myjobdir}/{r}"
647
+ ref_report = f"{refdir}/{r}"
648
+ print("Output xyz file: ", output_xyz)
649
+ print("Reference xyz file: ", ref_xyz)
650
+ print("Test report file: ", output_report)
651
+ print("Reference report file: ", ref_report)
652
+ pass_xyz = compareGeo(
653
+ output_xyz, ref_xyz, threshMLBL, threshLG, threshOG)
654
+ [passNumAtoms, passMLBL, passLG, passOG] = pass_xyz
655
+ pass_report = compare_report_new(output_report, ref_report)
656
+ pass_structures.append(
657
+ [f, passNumAtoms, passMLBL, passLG, passOG, pass_report])
658
+ return [passMultiFileCheck, pass_structures]