def test8MatchParams(self): smis = ("CCC1NC1", "CCC1N(C)C1", "CCC1OC1") ms = [Chem.MolFromSmiles(x) for x in smis] mcs = rdFMCS.FindMCS(ms) self.assertEqual(mcs.numAtoms, 4) ps = rdFMCS.MCSParameters() ps.BondCompareParameters.CompleteRingsOnly = True mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 3) ps = rdFMCS.MCSParameters() ps.BondCompareParameters.MatchFusedRings = True mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 3) ps = rdFMCS.MCSParameters() ps.BondCompareParameters.MatchFusedRingsStrict = True mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 3) ps = rdFMCS.MCSParameters() ps.SetAtomTyper(rdFMCS.AtomCompare.CompareAny) mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 5)
def test18GitHub3693(self): mols = [Chem.MolFromSmiles(smi) for smi in [ "Nc1ccc(O)cc1c1ccc2ccccc2c1", "Oc1cnc(NC2CCC2)c(c1)c1ccc2ccccc2c1"]] params = rdFMCS.MCSParameters() res = rdFMCS.FindMCS(mols, params) self.assertEqual(res.numAtoms, 17) self.assertEqual(res.numBonds, 18) self.assertEqual(res.smartsString, "[#7]-,:[#6]:[#6](:[#6]:[#6](:[#6])-[#8])-[#6]1:[#6]:[#6]:[#6]2:[#6](:[#6]:1):[#6]:[#6]:[#6]:[#6]:2") params = rdFMCS.MCSParameters() params.BondCompareParameters.CompleteRingsOnly = True res = rdFMCS.FindMCS(mols, params) self.assertEqual(res.numAtoms, 11) self.assertEqual(res.numBonds, 12) self.assertEqual(res.smartsString, "[#6]-&!@[#6]1:&@[#6]:&@[#6]:&@[#6]2:&@[#6](:&@[#6]:&@1):&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@2") params = rdFMCS.MCSParameters() params.AtomCompareParameters.CompleteRingsOnly = True params.BondCompareParameters.CompleteRingsOnly = True res = rdFMCS.FindMCS(mols, params) self.assertEqual(res.numAtoms, 10) self.assertEqual(res.numBonds, 11) self.assertEqual(res.smartsString, "[#6]1:&@[#6]:&@[#6]:&@[#6]2:&@[#6](:&@[#6]:&@1):&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@2") params = rdFMCS.MCSParameters() params.AtomCompareParameters.CompleteRingsOnly = True # this will automatically be set to True params.BondCompareParameters.CompleteRingsOnly = False res = rdFMCS.FindMCS(mols, params) self.assertEqual(res.numAtoms, 10) self.assertEqual(res.numBonds, 11) self.assertEqual(res.smartsString, "[#6]1:&@[#6]:&@[#6]:&@[#6]2:&@[#6](:&@[#6]:&@1):&@[#6]:&@[#6]:&@[#6]:&@[#6]:&@2")
def draw_mols(x_list: list, y_list: list, names: list): error_names = [] error = [] for x, y, name in zip(x_list, y_list, names): e = abs(float(x) - float(y)) if e > 10: error_names.append(name) error.append(e) ps = rdFMCS.MCSParameters() ps.AtomCompareParameters.RingMatchesRingOnly = True ps.SetAtomTyper(rdFMCS.AtomCompare.CompareAny) for name in error_names: mol1, mol2 = ( Chem.MolFromSmiles(exp_results[name]["t1-smiles"]), Chem.MolFromSmiles(exp_results[name]["t2-smiles"]), ) mcs = Chem.MolFromSmarts( rdFMCS.FindMCS( [mol1, mol2], bondCompare=Chem.rdFMCS.BondCompare.CompareOrder.CompareAny, ).smartsString) AllChem.Compute2DCoords(mol1) match1 = mol1.GetSubstructMatch(mcs) match2 = mol2.GetSubstructMatch(mcs) coords = [mol1.GetConformer().GetAtomPosition(x) for x in match1] coords2D = [Geometry.Point2D(pt.x, pt.y) for pt in coords] coordDict = {} for i, coord in enumerate(coords2D): coordDict[match2[i]] = coord AllChem.Compute2DCoords(mol2, coordMap=coordDict) Draw.MolsToGridImage([mol1, mol2], subImgSize=(250, 250), molsPerRow=2)
def getParams(**kwargs): params = rdFMCS.MCSParameters() for kw in ("AtomTyper", "BondTyper"): v = kwargs.get(kw, None) if v is not None: v_instance = v() setattr(params, kw, v_instance) return params
def test16MCSProgressCallbackExceptions(self): ps = rdFMCS.MCSParameters() smis = ['CCCC(C)CC(CC)CC', 'OC(N)CC(C)CC(CC)CC'] ms = [Chem.MolFromSmiles(x) for x in smis] self.assertRaises(TypeError, lambda ps: setattr(ps, "ProgressCallback", ProgressCallbackCallbackIsInt())) self.assertRaises(TypeError, lambda ps: setattr(ps, "ProgressCallback", ProgressCallbackNoCallback()))
def test14MCSBondCompareExceptions(self): ps = rdFMCS.MCSParameters() smis = ['CCCCC', 'CCC1CCCCC1'] ms = [Chem.MolFromSmiles(x) for x in smis] self.assertRaises(TypeError, lambda ps: setattr(ps, "BondTyper", BondCompareCompareIsInt())) self.assertRaises(TypeError, lambda ps: setattr(ps, "BondTyper", BondCompareNoCompare()))
def test20AtomCompareCompleteRingsOnly(self): mols = [Chem.MolFromSmiles(smi) for smi in ["C1CCCC1C", "C1CCCC1C1CCCCC1"]] params = rdFMCS.MCSParameters() params.AtomCompareParameters.CompleteRingsOnly = True res = rdFMCS.FindMCS(mols, params) self.assertEqual(res.numAtoms, 5) self.assertEqual(res.numBonds, 5) self.assertEqual(res.smartsString, "[#6&R]1-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@1") params = rdFMCS.MCSParameters() params.AtomCompareParameters.CompleteRingsOnly = True # this will automatically be set to True params.BondCompareParameters.CompleteRingsOnly = False res = rdFMCS.FindMCS(mols, params) self.assertEqual(res.numAtoms, 5) self.assertEqual(res.numBonds, 5) self.assertEqual(res.smartsString, "[#6&R]1-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@[#6&R]-&@1")
def test12MCSAtomCompareExceptions(self): ps = rdFMCS.MCSParameters() smis = ['CCCCC', 'CCC1CCCCC1'] ms = [Chem.MolFromSmiles(x) for x in smis] self.assertRaises(TypeError, lambda ps: setattr(ps, "AtomTyper", AtomCompareCompareIsInt())) ps.AtomTyper = AtomCompareNoCompare() self.assertRaises(TypeError, lambda ms, ps: rdFMCS.FindMCS(ms, ps))
def test17MCSProgressCallbackCancel(self): ps = rdFMCS.MCSParameters() smis = ['CCCC(C)CC(CC)CC', 'OC(N)CC(C)CC(CC)CC'] ms = [Chem.MolFromSmiles(x) for x in smis] ps.AtomTyper = CompareElements() ps.ProgressCallback = ProgressCallback(self) mcs = rdFMCS.FindMCS(ms, ps) self.assertTrue(mcs.canceled) self.assertEqual(ps.ProgressCallback.callCount, 3)
def test13MCSAtomCompareUserData(self): smis = ['CCOCCOC', 'CCNCCCC'] ms = [Chem.MolFromSmiles(x) for x in smis] ps = rdFMCS.MCSParameters() ps.AtomTyper = AtomCompareUserData() ps.AtomTyper.setMatchAnyHet(False) mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 2) ps.AtomTyper.setMatchAnyHet(True) mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 5)
def test9MatchCharge(self): smis = ("CCNC", "CCN(C)C", "CC[N+](C)C") ms = [Chem.MolFromSmiles(x) for x in smis] mcs = rdFMCS.FindMCS(ms) self.assertEqual(mcs.numAtoms, 4) ps = rdFMCS.MCSParameters() ps.AtomCompareParameters.MatchFormalCharge = True mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 2)
def mcs_map(a, b, threshold: float = 0.5, timeout: int = 5, smarts: Optional[str] = None): """Find the MCS map of going from A to B""" params = rdFMCS.MCSParameters() params.BondCompareParameters.CompleteRingsOnly = 1 params.BondCompareParameters.RingMatchesRingOnly = 1 params.AtomCompareParameters.matchValences = 1 params.AtomTyper = CompareDist(threshold=threshold) params.Timeout = timeout if smarts is not None: params.InitialSeed = smarts return rdFMCS.FindMCS([a, b], params)
def test15MCSBondCompareUserData(self): smis = ['C1CC=CCC1', 'c1ccccc1'] ms = [Chem.MolFromSmiles(x) for x in smis] ps = rdFMCS.MCSParameters() ps.BondTyper = BondCompareUserData() ps.BondCompareParameters.CompleteRingsOnly = True ps.BondTyper.setIgnoreAromatization(False) mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 0) ps.BondTyper.setIgnoreAromatization(True) mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 6)
def getParams(**kwargs): have_kw = False params = rdFMCS.MCSParameters() for kw in ("AtomTyper", "BondTyper"): try: v = kwargs[kw] except KeyError: pass else: have_kw = True setattr(params, kw, v()) return params
def test11Github2034(self): smis = ("C1CC1N2CC2", "C1CC1N") ms = [Chem.MolFromSmiles(x) for x in smis] mcs = rdFMCS.FindMCS(ms) self.assertEqual(mcs.numAtoms, 4) self.assertEqual(mcs.numBonds, 4) mcs = rdFMCS.FindMCS(ms, ringMatchesRingOnly=True) self.assertEqual(mcs.numAtoms, 3) self.assertEqual(mcs.numBonds, 3) ps = rdFMCS.MCSParameters() ps.AtomCompareParameters.RingMatchesRingOnly = True mcs = rdFMCS.FindMCS(ms, ps) self.assertEqual(mcs.numAtoms, 3) self.assertEqual(mcs.numBonds, 3)
def test_setting_up_restraints_using_smarts(): seed = 814 mcs_params = rdFMCS.MCSParameters() mcs_params.AtomTyper = CompareDistNonterminal() mcs_params.BondTyper = rdFMCS.BondCompare.CompareAny smi_a = "CCCONNN" smi_b = "CCCNNN" mol_a = Chem.MolFromSmiles(smi_a) mol_a = Chem.AddHs(mol_a) mol_b = Chem.MolFromSmiles(smi_b) mol_b = Chem.AddHs(mol_b) for mol in [mol_a, mol_b]: AllChem.EmbedMolecule(mol, randomSeed=seed) result = rdFMCS.FindMCS([mol_a, mol_b], mcs_params) core = setup_relative_restraints_using_smarts(mol_a, mol_b, result.smartsString) assert core.shape == (2, 2)