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.
- docs/source/conf.py +224 -0
- molSimplify/Classes/__init__.py +6 -0
- molSimplify/Classes/atom3D.py +235 -0
- molSimplify/Classes/dft_obs.py +130 -0
- molSimplify/Classes/globalvars.py +827 -0
- molSimplify/Classes/helpers.py +161 -0
- molSimplify/Classes/ligand.py +2330 -0
- molSimplify/Classes/mGUI.py +2493 -0
- molSimplify/Classes/mWidgets.py +438 -0
- molSimplify/Classes/miniGUI.py +41 -0
- molSimplify/Classes/mol2D.py +260 -0
- molSimplify/Classes/mol3D.py +5846 -0
- molSimplify/Classes/monomer3D.py +253 -0
- molSimplify/Classes/partialcharges.py +226 -0
- molSimplify/Classes/protein3D.py +1178 -0
- molSimplify/Classes/rundiag.py +151 -0
- molSimplify/Data/ML.dat +212 -0
- molSimplify/Data/MLS_FSR_for_inter.dat +23 -0
- molSimplify/Data/MLS_FSR_for_inter2.dat +23 -0
- molSimplify/Data/MLS_angle_for_click.dat +8 -0
- molSimplify/Data/MLS_angle_for_inter.dat +23 -0
- molSimplify/Data/MLS_angle_for_inter2.dat +48 -0
- molSimplify/Data/MLS_angle_for_intra.dat +10 -0
- molSimplify/Data/MLS_angle_for_intra2.dat +6 -0
- molSimplify/Data/MLS_angle_for_oa.dat +18 -0
- molSimplify/Data/ML_FSR_for_inter.dat +112 -0
- molSimplify/Data/ML_FSR_for_inter2.dat +110 -0
- molSimplify/Data/ML_bond_for_cat.dat +8 -0
- molSimplify/Data/ML_bond_for_click.dat +8 -0
- molSimplify/Data/ML_bond_for_inter.dat +48 -0
- molSimplify/Data/ML_bond_for_inter2.dat +48 -0
- molSimplify/Data/ML_bond_for_intra.dat +10 -0
- molSimplify/Data/ML_bond_for_intra2.dat +6 -0
- molSimplify/Data/ML_bond_for_oa.dat +18 -0
- molSimplify/Data/bp1.dat +21 -0
- molSimplify/Data/li.dat +3 -0
- molSimplify/Data/no.dat +2 -0
- molSimplify/Data/oct.dat +7 -0
- molSimplify/Data/pbp.dat +8 -0
- molSimplify/Data/spy.dat +6 -0
- molSimplify/Data/sqap.dat +9 -0
- molSimplify/Data/sqp.dat +5 -0
- molSimplify/Data/tbp.dat +6 -0
- molSimplify/Data/tdhd.dat +9 -0
- molSimplify/Data/thd.dat +5 -0
- molSimplify/Data/tpl.dat +4 -0
- molSimplify/Data/tpr.dat +7 -0
- molSimplify/Informatics/HFXsensitivity/__init__.py +0 -0
- molSimplify/Informatics/HFXsensitivity/measure_HFX_sensitivity_oxo_hat_reb_rel.py +443 -0
- molSimplify/Informatics/HFXsensitivity/measure_HFX_stable.py +346 -0
- molSimplify/Informatics/MOF/Linker_rotation.py +179 -0
- molSimplify/Informatics/MOF/MOF_descriptors.py +1299 -0
- molSimplify/Informatics/MOF/MOF_descriptors_alternate_functional.py +589 -0
- molSimplify/Informatics/MOF/MOF_functionalizer.py +1648 -0
- molSimplify/Informatics/MOF/PBC_functions.py +1347 -0
- molSimplify/Informatics/MOF/__init__.py +0 -0
- molSimplify/Informatics/MOF/atomic.py +267 -0
- molSimplify/Informatics/MOF/cluster_extraction.py +388 -0
- molSimplify/Informatics/MOF/fragment_MOFs_for_pormake.py +895 -0
- molSimplify/Informatics/MOF/monofunctionalized_BDC/index_information.py +10 -0
- molSimplify/Informatics/Mol2Parser.py +46 -0
- molSimplify/Informatics/RACassemble.py +408 -0
- molSimplify/Informatics/__init__.py +0 -0
- molSimplify/Informatics/active_learning/__init__.py +0 -0
- molSimplify/Informatics/active_learning/expected_improvement.py +269 -0
- molSimplify/Informatics/autocorrelation.py +1930 -0
- molSimplify/Informatics/clean_autocorrelation.py +778 -0
- molSimplify/Informatics/coulomb_analyze.py +67 -0
- molSimplify/Informatics/decoration_manager.py +193 -0
- molSimplify/Informatics/geo_analyze.py +88 -0
- molSimplify/Informatics/geometrics.py +56 -0
- molSimplify/Informatics/graph_analyze.py +163 -0
- molSimplify/Informatics/graph_racs.py +288 -0
- molSimplify/Informatics/jupyter_vis.py +172 -0
- molSimplify/Informatics/lacRACAssemble.py +2192 -0
- molSimplify/Informatics/lacRACAssemble_bisdithiolenes.py +236 -0
- molSimplify/Informatics/misc_descriptors.py +198 -0
- molSimplify/Informatics/organic_fingerprints.py +61 -0
- molSimplify/Informatics/partialcharges.py +345 -0
- molSimplify/Informatics/protein/activesite.py +53 -0
- molSimplify/Informatics/protein/pymol_add_hs.py +33 -0
- molSimplify/Informatics/rac155_geo.py +48 -0
- molSimplify/Ligands/(1_methylbenzimidazol_2_yl)pyridine.xyz +45 -0
- molSimplify/Ligands/1-4-dimethyl-1-2-3-triazole.xyz +15 -0
- molSimplify/Ligands/12crown4.mol +62 -0
- molSimplify/Ligands/Antipyrine.mol +58 -0
- molSimplify/Ligands/BPAbipy.mol +106 -0
- molSimplify/Ligands/Hpyrrole.mol +26 -0
- molSimplify/Ligands/N-quinolinylbutyramidate.xyz +31 -0
- molSimplify/Ligands/N-quinolinylmethylmethinylacetamidate.xyz +30 -0
- molSimplify/Ligands/NMe2_-1.xyz +11 -0
- molSimplify/Ligands/PCy3.mol +111 -0
- molSimplify/Ligands/PMe3.xyz +15 -0
- molSimplify/Ligands/PPh3.mol +76 -0
- molSimplify/Ligands/Propyphenazone.mol +77 -0
- molSimplify/Ligands/acac.mol +33 -0
- molSimplify/Ligands/acacen.mol +76 -0
- molSimplify/Ligands/acetate.smi +1 -0
- molSimplify/Ligands/acetate.xyz +9 -0
- molSimplify/Ligands/aceticacidbipyridine.mol +70 -0
- molSimplify/Ligands/acetonitrile.mol +17 -0
- molSimplify/Ligands/alanine.mol +30 -0
- molSimplify/Ligands/alphabetizer.py +21 -0
- molSimplify/Ligands/amine.mol +11 -0
- molSimplify/Ligands/ammonia.mol +12 -0
- molSimplify/Ligands/arginine.mol +58 -0
- molSimplify/Ligands/asparagine.mol +38 -0
- molSimplify/Ligands/aspartic_acid.mol +35 -0
- molSimplify/Ligands/azide.mol +11 -0
- molSimplify/Ligands/benzene.mol +28 -0
- molSimplify/Ligands/benzene_pi.mol +30 -0
- molSimplify/Ligands/benzenedithiol.mol +30 -0
- molSimplify/Ligands/benzenethiol.mol +30 -0
- molSimplify/Ligands/benzylisocy.mol +38 -0
- molSimplify/Ligands/bidiazine.mol +42 -0
- molSimplify/Ligands/bidiazole.mol +38 -0
- molSimplify/Ligands/bifuran.mol +38 -0
- molSimplify/Ligands/bihydrodiazine.mol +58 -0
- molSimplify/Ligands/bihydrodiazole.mol +46 -0
- molSimplify/Ligands/bihydrooxazine.mol +54 -0
- molSimplify/Ligands/bihydrooxazole.mol +42 -0
- molSimplify/Ligands/bihydrothiazine.mol +54 -0
- molSimplify/Ligands/bihydrothiazole.mol +42 -0
- molSimplify/Ligands/biimidazole.mol +38 -0
- molSimplify/Ligands/bioxazole.mol +34 -0
- molSimplify/Ligands/bipy.mol +46 -0
- molSimplify/Ligands/bipyrazine.xyz +20 -0
- molSimplify/Ligands/bipyrimidine.mol +42 -0
- molSimplify/Ligands/bipyrrole.mol +42 -0
- molSimplify/Ligands/bisnapthyridylpyridine.mol +111 -0
- molSimplify/Ligands/bithiazole.mol +34 -0
- molSimplify/Ligands/bromide.mol +7 -0
- molSimplify/Ligands/bromide.smi +1 -0
- molSimplify/Ligands/c2.mol +9 -0
- molSimplify/Ligands/caprolactone.mol +41 -0
- molSimplify/Ligands/carbonyl.mol +8 -0
- molSimplify/Ligands/carboxyl.mol +13 -0
- molSimplify/Ligands/cat.mol +30 -0
- molSimplify/Ligands/chloride.mol +7 -0
- molSimplify/Ligands/chloride.smi +1 -0
- molSimplify/Ligands/chloropyridine.mol +27 -0
- molSimplify/Ligands/co2.mol +10 -0
- molSimplify/Ligands/corrolazine.mol +72 -0
- molSimplify/Ligands/cs.mol +8 -0
- molSimplify/Ligands/cyanate.xyz +5 -0
- molSimplify/Ligands/cyanide.mol +9 -0
- molSimplify/Ligands/cyanoaceticporphyrin.mol +114 -0
- molSimplify/Ligands/cyanopyridine.mol +29 -0
- molSimplify/Ligands/cyclam.mol +81 -0
- molSimplify/Ligands/cyclen.mol +69 -0
- molSimplify/Ligands/cyclopentadienyl.mol +26 -0
- molSimplify/Ligands/cysteine.mol +32 -0
- molSimplify/Ligands/diaminomethyl.mol +19 -0
- molSimplify/Ligands/diazine.mol +25 -0
- molSimplify/Ligands/diazole.mol +23 -0
- molSimplify/Ligands/dicyanamide.mol +15 -0
- molSimplify/Ligands/dihydrofuran.mol +27 -0
- molSimplify/Ligands/dmap.xyz +35 -0
- molSimplify/Ligands/dmf.mol +28 -0
- molSimplify/Ligands/dmi.mol +41 -0
- molSimplify/Ligands/dmpe.mol +52 -0
- molSimplify/Ligands/dpmu.mol +47 -0
- molSimplify/Ligands/dppe.mol +112 -0
- molSimplify/Ligands/edta.mol +69 -0
- molSimplify/Ligands/en.mol +28 -0
- molSimplify/Ligands/ethanethiol.mol +21 -0
- molSimplify/Ligands/ethanolamine.mol +26 -0
- molSimplify/Ligands/ethbipy.mol +70 -0
- molSimplify/Ligands/ethyl.mol +19 -0
- molSimplify/Ligands/ethylamine.mol +24 -0
- molSimplify/Ligands/ethylene.mol +16 -0
- molSimplify/Ligands/ethylesteracac.mol +57 -0
- molSimplify/Ligands/fluoride.mol +7 -0
- molSimplify/Ligands/fluoride.smi +1 -0
- molSimplify/Ligands/formaldehyde.mol +12 -0
- molSimplify/Ligands/formamidate.xyz +8 -0
- molSimplify/Ligands/formate.xyz +6 -0
- molSimplify/Ligands/furan.mol +23 -0
- molSimplify/Ligands/glutamic_acid.mol +42 -0
- molSimplify/Ligands/glutamine.mol +44 -0
- molSimplify/Ligands/glycinate.mol +23 -0
- molSimplify/Ligands/glycine.mol +24 -0
- molSimplify/Ligands/h2s.mol +10 -0
- molSimplify/Ligands/helium.mol +6 -0
- molSimplify/Ligands/histidine.mol +45 -0
- molSimplify/Ligands/hmpa.mol +62 -0
- molSimplify/Ligands/hs-.mol +9 -0
- molSimplify/Ligands/hydride.mol +7 -0
- molSimplify/Ligands/hydrocarboxyacetylide.xyz +8 -0
- molSimplify/Ligands/hydrocyanide.mol +10 -0
- molSimplify/Ligands/hydrodiazine.mol +33 -0
- molSimplify/Ligands/hydrodiazole.mol +27 -0
- molSimplify/Ligands/hydrogensulfide.mol +10 -0
- molSimplify/Ligands/hydroisocyanide.mol +11 -0
- molSimplify/Ligands/hydrooxazine.mol +31 -0
- molSimplify/Ligands/hydrooxazole.mol +25 -0
- molSimplify/Ligands/hydrothiazine.mol +31 -0
- molSimplify/Ligands/hydrothiazole.mol +25 -0
- molSimplify/Ligands/hydroxyl.mol +9 -0
- molSimplify/Ligands/imidazole.mol +23 -0
- molSimplify/Ligands/imidazolidinone.mol +29 -0
- molSimplify/Ligands/imine.mol +13 -0
- molSimplify/Ligands/iminodiacetic.mol +33 -0
- molSimplify/Ligands/iodide.mol +7 -0
- molSimplify/Ligands/iodobenzene.xyz +14 -0
- molSimplify/Ligands/isoleucine.mol +48 -0
- molSimplify/Ligands/isothiocyanate.mol +11 -0
- molSimplify/Ligands/leucine.mol +48 -0
- molSimplify/Ligands/ligands.dict +257 -0
- molSimplify/Ligands/lysine.mol +54 -0
- molSimplify/Ligands/mebenzenedithiol.mol +36 -0
- molSimplify/Ligands/mebim_py.xyz +29 -0
- molSimplify/Ligands/mebim_pz.xyz +28 -0
- molSimplify/Ligands/mebipy.mol +58 -0
- molSimplify/Ligands/mecat.mol +36 -0
- molSimplify/Ligands/methanal.mol +11 -0
- molSimplify/Ligands/methanethiol.mol +15 -0
- molSimplify/Ligands/methanol.mol +16 -0
- molSimplify/Ligands/methionine.mol +44 -0
- molSimplify/Ligands/methyl.mol +13 -0
- molSimplify/Ligands/methylacetylide.xyz +8 -0
- molSimplify/Ligands/methylamine.mol +19 -0
- molSimplify/Ligands/methylazide.xyz +9 -0
- molSimplify/Ligands/methylisocy.mol +17 -0
- molSimplify/Ligands/methylpyridine.mol +33 -0
- molSimplify/Ligands/n2.mol +8 -0
- molSimplify/Ligands/n4py.xyz +51 -0
- molSimplify/Ligands/nch.mol +10 -0
- molSimplify/Ligands/nco-.mol +11 -0
- molSimplify/Ligands/nethanolamine.mol +26 -0
- molSimplify/Ligands/nitrate.mol +14 -0
- molSimplify/Ligands/nitrite.mol +11 -0
- molSimplify/Ligands/nitro.mol +11 -0
- molSimplify/Ligands/nitrobipy.mol +54 -0
- molSimplify/Ligands/nitroso.mol +8 -0
- molSimplify/Ligands/nme3.mol +30 -0
- molSimplify/Ligands/no-.mol +10 -0
- molSimplify/Ligands/no2-.mol +11 -0
- molSimplify/Ligands/noxygen.mol +8 -0
- molSimplify/Ligands/ns-.mol +10 -0
- molSimplify/Ligands/o-pyridylbenzene.xyz +23 -0
- molSimplify/Ligands/o-pyridylphenylanion.xyz +22 -0
- molSimplify/Ligands/o2-.mol +9 -0
- molSimplify/Ligands/o2.xyz +4 -0
- molSimplify/Ligands/och2.mol +12 -0
- molSimplify/Ligands/oethanolamine.mol +26 -0
- molSimplify/Ligands/ome2.mol +22 -0
- molSimplify/Ligands/ooh.xyz +5 -0
- molSimplify/Ligands/oxalate.mol +17 -0
- molSimplify/Ligands/oxalate.smi +1 -0
- molSimplify/Ligands/oxygen.mol +7 -0
- molSimplify/Ligands/pentacyanocyclopentadienide.mol +36 -0
- molSimplify/Ligands/ph2-.mol +11 -0
- molSimplify/Ligands/ph3.mol +12 -0
- molSimplify/Ligands/phen.mol +51 -0
- molSimplify/Ligands/phenacac.mol +63 -0
- molSimplify/Ligands/phenalalanine.mol +51 -0
- molSimplify/Ligands/phendione.mol +51 -0
- molSimplify/Ligands/phenphen.mol +75 -0
- molSimplify/Ligands/phenylbenzoxazole.mol +54 -0
- molSimplify/Ligands/phenylcyc.mol +99 -0
- molSimplify/Ligands/phenylenediamine.mol +37 -0
- molSimplify/Ligands/phenylisocy.mol +32 -0
- molSimplify/Ligands/phosacidbipy.mol +66 -0
- molSimplify/Ligands/phosphine.mol +13 -0
- molSimplify/Ligands/phosphorine.mol +27 -0
- molSimplify/Ligands/phosphorustrifluoride.mol +12 -0
- molSimplify/Ligands/phthalocyanine.mol +126 -0
- molSimplify/Ligands/pme3o.mol +32 -0
- molSimplify/Ligands/porphyrin.mol +82 -0
- molSimplify/Ligands/pph3o.mol +77 -0
- molSimplify/Ligands/proline.mol +39 -0
- molSimplify/Ligands/propdiol.mol +21 -0
- molSimplify/Ligands/propylene.mol +23 -0
- molSimplify/Ligands/pyridine.mol +27 -0
- molSimplify/Ligands/pyrimidone.mol +27 -0
- molSimplify/Ligands/pyrrole.mol +24 -0
- molSimplify/Ligands/quinoxalinedithiol.mol +39 -0
- molSimplify/Ligands/s2-.mol +9 -0
- molSimplify/Ligands/salen.mol +75 -0
- molSimplify/Ligands/salphen.mol +84 -0
- molSimplify/Ligands/serine.mol +32 -0
- molSimplify/Ligands/simple_ligands.dict +14 -0
- molSimplify/Ligands/sulfacidbipy.mol +63 -0
- molSimplify/Ligands/tbucat.mol +54 -0
- molSimplify/Ligands/tbuphisocy.mol +56 -0
- molSimplify/Ligands/tbutylcyclen.mol +166 -0
- molSimplify/Ligands/tbutylisocy.mol +35 -0
- molSimplify/Ligands/tbutylthiol.mol +33 -0
- molSimplify/Ligands/tcnoet.mol +43 -0
- molSimplify/Ligands/tcnoetOH.mol +45 -0
- molSimplify/Ligands/terpy.mol +65 -0
- molSimplify/Ligands/tetrahydrofuran.mol +31 -0
- molSimplify/Ligands/thiane.mol +37 -0
- molSimplify/Ligands/thiazole.mol +21 -0
- molSimplify/Ligands/thiocyanate.mol +11 -0
- molSimplify/Ligands/thiol.mol +9 -0
- molSimplify/Ligands/thiophene.mol +23 -0
- molSimplify/Ligands/thiopyridine.mol +29 -0
- molSimplify/Ligands/threonine.mol +38 -0
- molSimplify/Ligands/tpp.mol +165 -0
- molSimplify/Ligands/tricyanomethyl.mol +19 -0
- molSimplify/Ligands/trifluoromethyl.mol +13 -0
- molSimplify/Ligands/tryptophan.mol +60 -0
- molSimplify/Ligands/tyrosine.mol +53 -0
- molSimplify/Ligands/uthiol.mol +11 -0
- molSimplify/Ligands/uthiolme2.mol +23 -0
- molSimplify/Ligands/valine.mol +42 -0
- molSimplify/Ligands/water.mol +10 -0
- molSimplify/Ligands/x.mol +6 -0
- molSimplify/Scripts/__init__.py +0 -0
- molSimplify/Scripts/addtodb.py +308 -0
- molSimplify/Scripts/cellbuilder.py +1592 -0
- molSimplify/Scripts/cellbuilder_tools.py +701 -0
- molSimplify/Scripts/chains.py +342 -0
- molSimplify/Scripts/convert_2to3.py +23 -0
- molSimplify/Scripts/dbinteract.py +631 -0
- molSimplify/Scripts/distgeom.py +617 -0
- molSimplify/Scripts/findcorrelations.py +287 -0
- molSimplify/Scripts/generator.py +267 -0
- molSimplify/Scripts/geometry.py +1224 -0
- molSimplify/Scripts/grabguivars.py +845 -0
- molSimplify/Scripts/in_b3lyp_usetc.py +141 -0
- molSimplify/Scripts/inparse.py +1673 -0
- molSimplify/Scripts/io.py +1149 -0
- molSimplify/Scripts/isomers.py +415 -0
- molSimplify/Scripts/jobgen.py +247 -0
- molSimplify/Scripts/krr_prep.py +1262 -0
- molSimplify/Scripts/molSimplify_io.py +18 -0
- molSimplify/Scripts/molden2psi4wfn.py +166 -0
- molSimplify/Scripts/namegen.py +32 -0
- molSimplify/Scripts/nn_prep.py +561 -0
- molSimplify/Scripts/oct_check_mols.py +782 -0
- molSimplify/Scripts/periodic_QE.py +97 -0
- molSimplify/Scripts/postmold.py +304 -0
- molSimplify/Scripts/postmwfn.py +709 -0
- molSimplify/Scripts/postparse.py +488 -0
- molSimplify/Scripts/postproc.py +139 -0
- molSimplify/Scripts/qcgen.py +1450 -0
- molSimplify/Scripts/rmsd.py +489 -0
- molSimplify/Scripts/rungen.py +670 -0
- molSimplify/Scripts/structgen.py +3040 -0
- molSimplify/Scripts/tf_nn_prep.py +894 -0
- molSimplify/Scripts/tsgen.py +295 -0
- molSimplify/Scripts/uq_calibration.py +69 -0
- molSimplify/__init__.py +0 -0
- molSimplify/__main__.py +197 -0
- molSimplify/icons/chemdb.png +0 -0
- molSimplify/icons/hjklogo.png +0 -0
- molSimplify/icons/icon.png +0 -0
- molSimplify/icons/logo.png +0 -0
- molSimplify/icons/logo_old.png +0 -0
- molSimplify/icons/petachem.png +0 -0
- molSimplify/icons/petachem2.png +0 -0
- molSimplify/icons/petachem_full.png +0 -0
- molSimplify/icons/pythonlogo.png +0 -0
- molSimplify/icons/sge copy.png +0 -0
- molSimplify/icons/sge.png +0 -0
- molSimplify/icons/slurm.png +0 -0
- molSimplify/icons/wft1.png +0 -0
- molSimplify/icons/wft2.png +0 -0
- molSimplify/icons/wft3.png +0 -0
- molSimplify/ml/__init__.py +0 -0
- molSimplify/ml/kernels.py +36 -0
- molSimplify/ml/layers.py +29 -0
- molSimplify/molscontrol/__init__.py +14 -0
- molSimplify/molscontrol/_version.py +521 -0
- molSimplify/molscontrol/clf_tools.py +144 -0
- molSimplify/molscontrol/data/README.md +21 -0
- molSimplify/molscontrol/data/look_and_say.dat +15 -0
- molSimplify/molscontrol/dynamic_classifier.py +514 -0
- molSimplify/molscontrol/io_tools.py +363 -0
- molSimplify/molscontrol/molscontrol.py +49 -0
- molSimplify/molscontrol/terachem/jobscript_control.sh +31 -0
- molSimplify/molscontrol/terachem/terachem_input +22 -0
- molSimplify/python_krr/X_train_TS.csv +535 -0
- molSimplify/python_krr/__init__.py +0 -0
- molSimplify/python_krr/hat2_X_mean_std.csv +3 -0
- molSimplify/python_krr/hat2_feature_names.csv +1 -0
- molSimplify/python_krr/hat2_y_mean_std.csv +2 -0
- molSimplify/python_krr/hat_X_mean_std.csv +6 -0
- molSimplify/python_krr/hat_feature_names.csv +1 -0
- molSimplify/python_krr/hat_krr_X_train.csv +5205 -0
- molSimplify/python_krr/hat_krr_dual_coef.csv +1 -0
- molSimplify/python_krr/hat_y_mean_std.csv +2 -0
- molSimplify/python_krr/sklearn_models.py +34 -0
- molSimplify/python_krr/y_train_TS.csv +535 -0
- molSimplify/python_nn/ANN.py +198 -0
- molSimplify/python_nn/__init__.py +0 -0
- molSimplify/python_nn/clf_analysis_tool.py +125 -0
- molSimplify/python_nn/dictionary_toolbox.py +49 -0
- molSimplify/python_nn/ensemble_test.py +309 -0
- molSimplify/python_nn/hs_center.csv +26 -0
- molSimplify/python_nn/hs_scale.csv +26 -0
- molSimplify/python_nn/ls_center.csv +26 -0
- molSimplify/python_nn/ls_scale.csv +26 -0
- molSimplify/python_nn/ms_hs_b1.csv +50 -0
- molSimplify/python_nn/ms_hs_b2.csv +50 -0
- molSimplify/python_nn/ms_hs_b3.csv +1 -0
- molSimplify/python_nn/ms_hs_w1.csv +50 -0
- molSimplify/python_nn/ms_hs_w2.csv +50 -0
- molSimplify/python_nn/ms_hs_w3.csv +1 -0
- molSimplify/python_nn/ms_ls_b1.csv +50 -0
- molSimplify/python_nn/ms_ls_b2.csv +50 -0
- molSimplify/python_nn/ms_ls_b3.csv +1 -0
- molSimplify/python_nn/ms_ls_w1.csv +50 -0
- molSimplify/python_nn/ms_ls_w2.csv +50 -0
- molSimplify/python_nn/ms_ls_w3.csv +1 -0
- molSimplify/python_nn/ms_slope_b1.csv +50 -0
- molSimplify/python_nn/ms_slope_b2.csv +50 -0
- molSimplify/python_nn/ms_slope_b3.csv +1 -0
- molSimplify/python_nn/ms_slope_w1.csv +50 -0
- molSimplify/python_nn/ms_slope_w2.csv +50 -0
- molSimplify/python_nn/ms_slope_w3.csv +1 -0
- molSimplify/python_nn/ms_split_b1.csv +50 -0
- molSimplify/python_nn/ms_split_b2.csv +50 -0
- molSimplify/python_nn/ms_split_b3.csv +1 -0
- molSimplify/python_nn/ms_split_w1.csv +50 -0
- molSimplify/python_nn/ms_split_w2.csv +50 -0
- molSimplify/python_nn/ms_split_w3.csv +1 -0
- molSimplify/python_nn/slope_center.csv +25 -0
- molSimplify/python_nn/slope_scale.csv +25 -0
- molSimplify/python_nn/split_center.csv +26 -0
- molSimplify/python_nn/split_scale.csv +26 -0
- molSimplify/python_nn/tf_ANN.py +762 -0
- molSimplify/python_nn/train_data.csv +1211 -0
- molSimplify/tf_nn/__init__.py +0 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_model.h5 +0 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_train_name.csv +1591 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_train_x.csv +2790 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_train_y.csv +2790 -0
- molSimplify/tf_nn/geo_static_clf/geo_static_clf_vars.csv +154 -0
- molSimplify/tf_nn/geos/hs_ii_bl_x.csv +1577 -0
- molSimplify/tf_nn/geos/hs_ii_bl_y.csv +1577 -0
- molSimplify/tf_nn/geos/hs_ii_model.h5 +0 -0
- molSimplify/tf_nn/geos/hs_ii_model.json +1 -0
- molSimplify/tf_nn/geos/hs_ii_vars.csv +154 -0
- molSimplify/tf_nn/geos/hs_iii_bl_x.csv +1659 -0
- molSimplify/tf_nn/geos/hs_iii_bl_y.csv +1659 -0
- molSimplify/tf_nn/geos/hs_iii_model.h5 +0 -0
- molSimplify/tf_nn/geos/hs_iii_model.json +1 -0
- molSimplify/tf_nn/geos/hs_iii_vars.csv +154 -0
- molSimplify/tf_nn/geos/ls_ii_bl_x.csv +1374 -0
- molSimplify/tf_nn/geos/ls_ii_bl_y.csv +1374 -0
- molSimplify/tf_nn/geos/ls_ii_model.h5 +0 -0
- molSimplify/tf_nn/geos/ls_ii_model.json +1 -0
- molSimplify/tf_nn/geos/ls_ii_vars.csv +154 -0
- molSimplify/tf_nn/geos/ls_iii_bl_x.csv +1364 -0
- molSimplify/tf_nn/geos/ls_iii_bl_y.csv +1364 -0
- molSimplify/tf_nn/geos/ls_iii_model.h5 +0 -0
- molSimplify/tf_nn/geos/ls_iii_model.json +1 -0
- molSimplify/tf_nn/geos/ls_iii_vars.csv +154 -0
- molSimplify/tf_nn/homolumo/gap_model.h5 +0 -0
- molSimplify/tf_nn/homolumo/gap_model.json +1 -0
- molSimplify/tf_nn/homolumo/gap_test_names.csv +175 -0
- molSimplify/tf_nn/homolumo/gap_test_x.csv +176 -0
- molSimplify/tf_nn/homolumo/gap_test_y.csv +176 -0
- molSimplify/tf_nn/homolumo/gap_train_names.csv +699 -0
- molSimplify/tf_nn/homolumo/gap_train_x.csv +700 -0
- molSimplify/tf_nn/homolumo/gap_train_y.csv +700 -0
- molSimplify/tf_nn/homolumo/gap_vars.csv +153 -0
- molSimplify/tf_nn/homolumo/homo_model.h5 +0 -0
- molSimplify/tf_nn/homolumo/homo_model.json +126 -0
- molSimplify/tf_nn/homolumo/homo_test_names.csv +175 -0
- molSimplify/tf_nn/homolumo/homo_test_x.csv +176 -0
- molSimplify/tf_nn/homolumo/homo_test_y.csv +176 -0
- molSimplify/tf_nn/homolumo/homo_train_names.csv +699 -0
- molSimplify/tf_nn/homolumo/homo_train_x.csv +700 -0
- molSimplify/tf_nn/homolumo/homo_train_y.csv +700 -0
- molSimplify/tf_nn/homolumo/homo_vars.csv +153 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_info.json +7 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_model.h5 +0 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_model.json +1 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_test_names.csv +143 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_test_x.csv +144 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_test_y.csv +144 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_train_names.csv +513 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_train_x.csv +514 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_train_y.csv +514 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_val_names.csv +143 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_val_x.csv +58 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_val_y.csv +58 -0
- molSimplify/tf_nn/oxoandhomo/homo_empty_vars.csv +155 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_info.json +7 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_model.h5 +0 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_model.json +1 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_test_names.csv +143 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_test_x.csv +144 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_test_y.csv +144 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_train_names.csv +513 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_train_x.csv +514 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_train_y.csv +514 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_val_names.csv +143 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_val_x.csv +58 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_val_y.csv +58 -0
- molSimplify/tf_nn/oxoandhomo/oxo20_vars.csv +154 -0
- molSimplify/tf_nn/oxocatalysis/hat_model.h5 +0 -0
- molSimplify/tf_nn/oxocatalysis/hat_model.json +1 -0
- molSimplify/tf_nn/oxocatalysis/hat_test_names.csv +419 -0
- molSimplify/tf_nn/oxocatalysis/hat_test_x.csv +420 -0
- molSimplify/tf_nn/oxocatalysis/hat_test_y.csv +420 -0
- molSimplify/tf_nn/oxocatalysis/hat_train_names.csv +1507 -0
- molSimplify/tf_nn/oxocatalysis/hat_train_x.csv +1508 -0
- molSimplify/tf_nn/oxocatalysis/hat_train_y.csv +1508 -0
- molSimplify/tf_nn/oxocatalysis/hat_val_x.csv +169 -0
- molSimplify/tf_nn/oxocatalysis/hat_val_y.csv +169 -0
- molSimplify/tf_nn/oxocatalysis/hat_vars.csv +162 -0
- molSimplify/tf_nn/oxocatalysis/oxo_model.h5 +0 -0
- molSimplify/tf_nn/oxocatalysis/oxo_model.json +1 -0
- molSimplify/tf_nn/oxocatalysis/oxo_test_names.csv +527 -0
- molSimplify/tf_nn/oxocatalysis/oxo_test_x.csv +528 -0
- molSimplify/tf_nn/oxocatalysis/oxo_test_y.csv +528 -0
- molSimplify/tf_nn/oxocatalysis/oxo_train_names.csv +1897 -0
- molSimplify/tf_nn/oxocatalysis/oxo_train_x.csv +1898 -0
- molSimplify/tf_nn/oxocatalysis/oxo_train_y.csv +1898 -0
- molSimplify/tf_nn/oxocatalysis/oxo_val_x.csv +212 -0
- molSimplify/tf_nn/oxocatalysis/oxo_val_y.csv +212 -0
- molSimplify/tf_nn/oxocatalysis/oxo_vars.csv +162 -0
- molSimplify/tf_nn/rescaling_data/gap_mean_x.csv +153 -0
- molSimplify/tf_nn/rescaling_data/gap_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/gap_var_x.csv +153 -0
- molSimplify/tf_nn/rescaling_data/gap_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/geo_static_clf_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/geo_static_clf_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/geo_static_clf_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/geo_static_clf_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/hat_mean_x.csv +162 -0
- molSimplify/tf_nn/rescaling_data/hat_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/hat_var_x.csv +162 -0
- molSimplify/tf_nn/rescaling_data/hat_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/homo_empty_mean_x.csv +155 -0
- molSimplify/tf_nn/rescaling_data/homo_empty_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/homo_empty_var_x.csv +155 -0
- molSimplify/tf_nn/rescaling_data/homo_empty_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/homo_mean_x.csv +153 -0
- molSimplify/tf_nn/rescaling_data/homo_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/homo_var_x.csv +153 -0
- molSimplify/tf_nn/rescaling_data/homo_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/hs_ii_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/hs_ii_mean_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/hs_ii_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/hs_ii_var_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/hs_iii_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/hs_iii_mean_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/hs_iii_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/hs_iii_var_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/ls_ii_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/ls_ii_mean_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/ls_ii_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/ls_ii_var_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/ls_iii_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/ls_iii_mean_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/ls_iii_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/ls_iii_var_y.csv +3 -0
- molSimplify/tf_nn/rescaling_data/oxo20_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/oxo20_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/oxo20_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/oxo20_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/oxo_mean_x.csv +162 -0
- molSimplify/tf_nn/rescaling_data/oxo_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/oxo_var_x.csv +162 -0
- molSimplify/tf_nn/rescaling_data/oxo_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/sc_static_clf_mean_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/sc_static_clf_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/sc_static_clf_var_x.csv +154 -0
- molSimplify/tf_nn/rescaling_data/sc_static_clf_var_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/split_mean_x.csv +155 -0
- molSimplify/tf_nn/rescaling_data/split_mean_y.csv +1 -0
- molSimplify/tf_nn/rescaling_data/split_var_x.csv +155 -0
- molSimplify/tf_nn/rescaling_data/split_var_y.csv +1 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_model.h5 +0 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_train_name.csv +1591 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_train_x.csv +1592 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_train_y.csv +1592 -0
- molSimplify/tf_nn/sc_static_clf/sc_static_clf_vars.csv +154 -0
- molSimplify/tf_nn/split/split_model.h5 +0 -0
- molSimplify/tf_nn/split/split_model.json +1 -0
- molSimplify/tf_nn/split/split_vars.csv +155 -0
- molSimplify/tf_nn/split/split_x.csv +1902 -0
- molSimplify/tf_nn/split/split_y.csv +1902 -0
- molSimplify/tf_nn/split/train_names.csv +1901 -0
- molSimplify/utils/__init__.py +0 -0
- molSimplify/utils/decorators.py +16 -0
- molSimplify/utils/metaclasses.py +12 -0
- molSimplify/utils/tensorflow.py +23 -0
- molSimplify/utils/timer.py +16 -0
- molSimplify-1.7.4.dist-info/LICENSE +674 -0
- molSimplify-1.7.4.dist-info/METADATA +821 -0
- molSimplify-1.7.4.dist-info/RECORD +651 -0
- molSimplify-1.7.4.dist-info/WHEEL +5 -0
- molSimplify-1.7.4.dist-info/entry_points.txt +3 -0
- molSimplify-1.7.4.dist-info/top_level.txt +4 -0
- tests/generateTests.py +122 -0
- tests/helperFuncs.py +658 -0
- tests/informatics/test_MOF_descriptors.py +128 -0
- tests/informatics/test_active_learning.py +113 -0
- tests/informatics/test_coulomb_analyze.py +24 -0
- tests/informatics/test_graph_racs.py +193 -0
- tests/ml/test_kernels.py +20 -0
- tests/ml/test_layers.py +47 -0
- tests/runtest.py +10 -0
- tests/test_Mol2D.py +128 -0
- tests/test_basic_imports.py +62 -0
- tests/test_bidentate.py +25 -0
- tests/test_cli.py +20 -0
- tests/test_distgeom.py +106 -0
- tests/test_example_1.py +29 -0
- tests/test_example_3.py +31 -0
- tests/test_example_5.py +43 -0
- tests/test_example_7.py +28 -0
- tests/test_example_8.py +15 -0
- tests/test_example_tbp.py +15 -0
- tests/test_ff_xtb.py +111 -0
- tests/test_geocheck_oct.py +26 -0
- tests/test_geocheck_one_empty.py +15 -0
- tests/test_geometry.py +44 -0
- tests/test_inparse.py +76 -0
- tests/test_io.py +84 -0
- tests/test_jobgen.py +84 -0
- tests/test_joption_pythonic.py +27 -0
- tests/test_ligand_assign.py +58 -0
- tests/test_ligand_assign_consistent.py +60 -0
- tests/test_ligand_class.py +26 -0
- tests/test_ligand_from_mol_file.py +35 -0
- tests/test_ligands.py +86 -0
- tests/test_mol3D.py +337 -0
- tests/test_molcas_caspt2.py +15 -0
- tests/test_molcas_casscf.py +15 -0
- tests/test_old_ANNs.py +68 -0
- tests/test_orca_ccsdt.py +15 -0
- tests/test_orca_dft.py +15 -0
- tests/test_qcgen.py +50 -0
- tests/test_racs.py +124 -0
- tests/test_rmsd.py +68 -0
- tests/test_structgen_functions.py +198 -0
- tests/test_tetrahedral.py +29 -0
- tests/test_tutorial_10_part_one.py +16 -0
- tests/test_tutorial_10_part_two.py +15 -0
- tests/test_tutorial_2.py +11 -0
- tests/test_tutorial_3.py +15 -0
- tests/test_tutorial_4.py +57 -0
- tests/test_tutorial_6.py +10 -0
- tests/test_tutorial_8.py +29 -0
- tests/test_tutorial_9_part_one.py +15 -0
- tests/test_tutorial_9_part_two.py +15 -0
- tests/test_tutorial_qm9_part_one.py +6 -0
- tests/testresources/refs/racs/generate_references.py +85 -0
- workflows/NandyJACSAu2022/bridge_functionalizer.py +253 -0
- workflows/NandyJACSAu2022/frag_functionalizer.py +242 -0
- workflows/NandyJACSAu2022/fragment_classes.py +586 -0
- 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
|