Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
        }