public void TestPirenperone_Bug3088164() { var sg = SmilesGenerator.Unique.Aromatic(); var mol = smilesParser.ParseSmiles("Fc1ccc(cc1)C(=O)C4CCN(CCC\\3=C(\\N=C2\\C=C/C=C\\N2C/3=O)C)CC4"); AtomContainerManipulator.ClearAtomConfigurations(mol); AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(mol); Aromaticity.CDKLegacy.Apply(mol); var fragmenter = new MurckoFragmenter(true, 6); fragmenter.GenerateFragments(mol); var f = fragmenter.GetFrameworks().ToReadOnlyList(); var fc = fragmenter.GetFrameworksAsContainers().ToReadOnlyList(); Assert.AreEqual(1, f.Count); Assert.AreEqual(f.Count, fc.Count); AtomContainerManipulator.ClearAtomConfigurations(mol); AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(mol); CDK.HydrogenAdder.AddImplicitHydrogens(mol); Aromaticity.CDKLegacy.Apply(mol); Assert.AreEqual("N=1C=C(CN2C=CC=CC12)CCN3CCC(Cc4ccccc4)CC3", f[0]); for (int i = 0; i < f.Count; i++) { string newsmiles = sg.Create(fc[i]); Assert.IsTrue(f[i].Equals(newsmiles), f[i] + " did not match the container, " + newsmiles); } }
private List <IAtomContainer> Run(IAtomContainer atomContainer) { var fragments = new List <IAtomContainer>(); if (atomContainer.Bonds.Count < 3) { return(fragments); } var splitableBonds = GetSplitableBonds(atomContainer); if (splitableBonds.Count == 0) { return(fragments); } Debug.WriteLine("Got " + splitableBonds.Count + " splittable bonds"); string tmpSmiles; foreach (var bond in splitableBonds) { var parts = FragmentUtils.SplitMolecule(atomContainer, bond); // make sure we don't add the same fragment twice foreach (var partContainer in parts) { AtomContainerManipulator.ClearAtomConfigurations(partContainer); foreach (var atom in partContainer.Atoms) { atom.ImplicitHydrogenCount = null; } AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(partContainer); CDK.HydrogenAdder.AddImplicitHydrogens(partContainer); Aromaticity.CDKLegacy.Apply(partContainer); tmpSmiles = smilesGenerator.Create(partContainer); if (partContainer.Atoms.Count >= MinimumFragmentSize && !fragMap.ContainsKey(tmpSmiles)) { fragments.Add(partContainer); fragMap[tmpSmiles] = partContainer; } } } // try and partition the fragments var tmp = new List <IAtomContainer>(fragments); foreach (var fragment in fragments) { if (fragment.Bonds.Count < 3 || fragment.Atoms.Count < MinimumFragmentSize) { continue; } if (GetSplitableBonds(fragment).Count == 0) { continue; } var frags = Run(fragment); if (frags.Count == 0) { continue; } foreach (var frag in frags) { if (frag.Bonds.Count < 3) { continue; } AtomContainerManipulator.ClearAtomConfigurations(frag); foreach (var atom in frag.Atoms) { atom.ImplicitHydrogenCount = null; } AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(frag); CDK.HydrogenAdder.AddImplicitHydrogens(frag); Aromaticity.CDKLegacy.Apply(frag); tmpSmiles = smilesGenerator.Create(frag); if (frag.Atoms.Count >= MinimumFragmentSize && !fragMap.ContainsKey(tmpSmiles)) { tmp.Add(frag); fragMap[tmpSmiles] = frag; } } } fragments = new List <IAtomContainer>(tmp); return(fragments); }