コード例 #1
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestSingleAtomMatching2()
        {
            var sp      = CDK.SmilesParser;
            var target  = sp.ParseSmiles("CNC");
            var queryac = sp.ParseSmiles("C");
            var query   = QueryAtomContainerCreator.CreateSymbolAndBondOrderQueryContainer(queryac);

            var matches = CDKMCS.GetIsomorphMaps(target, query, true);

            Assert.AreEqual(2, matches.Count);
            Assert.AreEqual(1, matches[0].Count);
            Assert.AreEqual(1, matches[1].Count);
            var map1 = matches[0][0];
            var map2 = matches[1][0];

            Assert.AreEqual(0, map1.Id1);
            Assert.AreEqual(0, map1.Id2);

            Assert.AreEqual(2, map2.Id1);
            Assert.AreEqual(0, map2.Id2);

            var atomMappings = CDKMCS.MakeAtomsMapsOfBondsMaps(matches, target, query);

            Assert.AreEqual(matches, atomMappings);
        }
コード例 #2
0
ファイル: CDKRMapHandler.cs プロジェクト: roddickchen/NCDK
        /// <summary>
        /// This function calculates all the possible combinations of MCS
        /// </summary>
        /// <param name="molecule1"></param>
        /// <param name="molecule2"></param>
        /// <param name="shouldMatchBonds"></param>
        /// <exception cref="CDKException"></exception>
        public void CalculateOverlapsAndReduce(IAtomContainer molecule1, IAtomContainer molecule2, bool shouldMatchBonds)
        {
            Source = molecule1;
            Target = molecule2;

            Mappings = new List <IReadOnlyDictionary <int, int> >();

            if ((Source.Atoms.Count == 1) || (Target.Atoms.Count == 1))
            {
                List <CDKRMap> overlaps      = CDKMCS.CheckSingleAtomCases(Source, Target);
                int            nAtomsMatched = overlaps.Count;
                nAtomsMatched = (nAtomsMatched > 0) ? 1 : 0;
                if (nAtomsMatched > 0)
                {
                    /* UnComment this to get one Unique Mapping */
                    //List reducedList = RemoveRedundantMappingsForSingleAtomCase(overlaps);
                    //int counter = 0;
                    IdentifySingleAtomsMatchedParts(overlaps, Source, Target);
                }
            }
            else
            {
                var overlaps       = CDKMCS.Search(Source, Target, new BitArray(Source.Bonds.Count), new BitArray(Target.Bonds.Count), true, true, shouldMatchBonds);
                var reducedList    = RemoveSubGraph(overlaps);
                var allMaxOverlaps = GetAllMaximum(reducedList);
                while (allMaxOverlaps.Count != 0)
                {
                    var maxOverlapsAtoms = MakeAtomsMapOfBondsMap(allMaxOverlaps.Peek(), Source, Target);
                    IdentifyMatchedParts(maxOverlapsAtoms, Source, Target);
                    allMaxOverlaps.Pop();
                }
            }

            FinalMappings.Instance.Set(Mappings);
        }
コード例 #3
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestGetOverlaps_IAtomContainer_IAtomContainer()
        {
            var file1 = "NCDK.Data.MDL.5SD.mol";
            var file2 = "NCDK.Data.MDL.ADN.mol";
            var mol1  = builder.NewAtomContainer();
            var mol2  = builder.NewAtomContainer();

            var ins1 = ResourceLoader.GetAsStream(file1);

            new MDLV2000Reader(ins1, ChemObjectReaderMode.Strict).Read(mol1);
            var ins2 = ResourceLoader.GetAsStream(file2);

            new MDLV2000Reader(ins2, ChemObjectReaderMode.Strict).Read(mol2);

            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(mol1);
            var adder = CDK.HydrogenAdder;

            adder.AddImplicitHydrogens(mol1);
            Aromaticity.CDKLegacy.Apply(mol1);

            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(mol2);
            adder = CDK.HydrogenAdder;
            adder.AddImplicitHydrogens(mol2);
            Aromaticity.CDKLegacy.Apply(mol2);

            var list = CDKMCS.GetOverlaps(mol1, mol2, true);

            Assert.AreEqual(1, list.Count);
            Assert.AreEqual(11, list[0].Atoms.Count);

            list = CDKMCS.GetOverlaps(mol2, mol1, true);
            Assert.AreEqual(1, list.Count);
            Assert.AreEqual(11, list[0].Atoms.Count);
        }
コード例 #4
0
        /// <summary>
        /// </summary>
        /// <param name="mol"></param>
        /// <param name="mcss"></param>
        /// <param name="shouldMatchBonds"></param>
        /// <returns>IMolecule Set</returns>
        /// <exception cref="CDKException"></exception>
        private static IChemObjectSet <IAtomContainer> GetUncommon(IAtomContainer mol, IAtomContainer mcss, bool shouldMatchBonds)
        {
            List <int> atomSerialsToDelete = new List <int>();

            var matches = CDKMCS.GetSubgraphAtomsMaps(mol, mcss, shouldMatchBonds);
            var mapList = matches[0];

            foreach (var o in mapList)
            {
                CDKRMap rmap = (CDKRMap)o;
                atomSerialsToDelete.Add(rmap.Id1);
            }

            // at this point we have the serial numbers of the bonds to delete
            // we should get the actual bonds rather than delete by serial numbers
            List <IAtom> atomsToDelete = new List <IAtom>();

            foreach (var serial in atomSerialsToDelete)
            {
                atomsToDelete.Add(mol.Atoms[serial]);
            }

            // now lets get rid of the bonds themselves
            foreach (var atom in atomsToDelete)
            {
                mol.RemoveAtomAndConnectedElectronContainers(atom);
            }

            // now we probably have a set of disconnected components
            // so lets get a set of individual atom containers for
            // corresponding to each component
            return(ConnectivityChecker.PartitionIntoMolecules(mol));
        }
コード例 #5
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestGetSubgraphAtomsMaps_IAtomContainer()
        {
            int[] result1 = { 6, 5, 7, 8, 0 };
            int[] result2 = { 3, 4, 2, 1, 0 };

            var mol   = TestMoleculeFactory.MakeIndole();
            var frag1 = TestMoleculeFactory.MakePyrrole();

            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(mol);
            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(frag1);
            var adder = CDK.HydrogenAdder;

            adder.AddImplicitHydrogens(mol);
            adder = CDK.HydrogenAdder;
            adder.AddImplicitHydrogens(frag1);
            Aromaticity.CDKLegacy.Apply(mol);
            Aromaticity.CDKLegacy.Apply(frag1);

            var list  = CDKMCS.GetSubgraphAtomsMaps(mol, frag1, true);
            var first = list[0];

            for (int i = 0; i < first.Count; i++)
            {
                CDKRMap rmap = first[i];
                Assert.AreEqual(rmap.Id1, result1[i]);
                Assert.AreEqual(rmap.Id2, result2[i]);
            }
        }
コード例 #6
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestGetSubgraphMap_IAtomContainer_IAtomContainer()
        {
            string             molfile   = "NCDK.Data.MDL.decalin.mol";
            string             queryfile = "NCDK.Data.MDL.decalin.mol";
            var                mol       = builder.NewAtomContainer();
            var                temp      = builder.NewAtomContainer();
            QueryAtomContainer query1    = null;
            QueryAtomContainer query2    = null;

            var ins    = ResourceLoader.GetAsStream(molfile);
            var reader = new MDLV2000Reader(ins, ChemObjectReaderMode.Strict);

            reader.Read(mol);
            ins    = ResourceLoader.GetAsStream(queryfile);
            reader = new MDLV2000Reader(ins, ChemObjectReaderMode.Strict);
            reader.Read(temp);
            query1 = QueryAtomContainerCreator.CreateBasicQueryContainer(temp);

            var sp            = CDK.SmilesParser;
            var atomContainer = sp.ParseSmiles("C1CCCCC1");

            query2 = QueryAtomContainerCreator.CreateBasicQueryContainer(atomContainer);

            var list = CDKMCS.GetSubgraphMap(mol, query1, true);

            Assert.AreEqual(11, list.Count);

            list = CDKMCS.GetSubgraphMap(mol, query2, true);
            Assert.AreEqual(6, list.Count);
        }
コード例 #7
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestSetTimeManager()
        {
            var aTimeManager = new TimeManager();

            CDKMCS.SetTimeManager(aTimeManager);
            Assert.IsNotNull(CDKMCS.GetTimeManager().GetElapsedTimeInSeconds());
        }
コード例 #8
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestBasicQueryAtomContainer()
        {
            var sp            = CDK.SmilesParser;
            var atomContainer = sp.ParseSmiles("CC(=O)OC(=O)C"); // acetic acid anhydride
            var SMILESquery   = sp.ParseSmiles("CC");            // acetic acid anhydride
            var query         = QueryAtomContainerCreator.CreateBasicQueryContainer(SMILESquery);

            Assert.IsTrue(CDKMCS.IsSubgraph(atomContainer, query, true));
        }
コード例 #9
0
ファイル: CDKRGraph.cs プロジェクト: roddickchen/NCDK
 private bool CheckTimeOut()
 {
     if (CDKMCS.IsTimeOut())
     {
         IsStop = true;
         return(true);
     }
     return(false);
 }
コード例 #10
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestAnyAtomAnyBondCase()
        {
            var sp      = CDK.SmilesParser;
            var target  = sp.ParseSmiles("O1C=CC=C1");
            var queryac = sp.ParseSmiles("C1CCCC1");
            var query   = QueryAtomContainerCreator.CreateAnyAtomAnyBondContainer(queryac, false);

            Assert.IsTrue(CDKMCS.IsSubgraph(target, query, true), "C1CCCC1 should be a subgraph of O1C=CC=C1");
            Assert.IsTrue(CDKMCS.IsIsomorph(target, query, true), "C1CCCC1 should be a isomorph of O1C=CC=C1");
        }
コード例 #11
0
ファイル: CDKMCS_Example.cs プロジェクト: roddickchen/NCDK
 static void Main()
 {
     #region
     SmilesParser        sp            = new SmilesParser();
     IAtomContainer      atomContainer = sp.ParseSmiles("CC(=O)OC(=O)C"); // acetic acid anhydride
     IAtomContainer      SMILESquery   = sp.ParseSmiles("CC");            // acetic acid anhydride
     IQueryAtomContainer query         = QueryAtomContainerCreator.CreateBasicQueryContainer(SMILESquery);
     bool isSubstructure = CDKMCS.IsSubgraph(atomContainer, query, true);
     #endregion
 }
コード例 #12
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestIsIsomorph_IAtomContainer_IAtomContainer()
        {
            var ac1 = builder.NewAtomContainer();

            ac1.Atoms.Add(builder.NewAtom("C"));
            var ac2 = builder.NewAtomContainer();

            ac2.Atoms.Add(builder.NewAtom("C"));
            Assert.IsTrue(CDKMCS.IsIsomorph(ac1, ac2, true));
            Assert.IsTrue(CDKMCS.IsSubgraph(ac1, ac2, true));
        }
コード例 #13
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestFirstArgumentMustNotBeAnQueryAtomContainer()
        {
            var sp      = CDK.SmilesParser;
            var target  = sp.ParseSmiles("O1C=CC=C1");
            var queryac = sp.ParseSmiles("C1CCCC1");
            var query   = QueryAtomContainerCreator.CreateAnyAtomAnyBondContainer(queryac, false);

            try
            {
                CDKMCS.IsSubgraph(query, target, true);
                Assert.Fail("The UniversalIsomorphism should check when the first arguments is a QueryAtomContainer");
            }
            catch (Exception)
            {
                // OK, it must Assert.fail!
            }
        }
コード例 #14
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void Test2()
        {
            var mol   = TestMoleculeFactory.MakeAlphaPinene();
            var frag1 = TestMoleculeFactory.MakeCyclohexane(); // no double bond in ring

            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(mol);
            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(frag1);
            Aromaticity.CDKLegacy.Apply(mol);
            Aromaticity.CDKLegacy.Apply(frag1);

            if (standAlone)
            {
                Console.Out.WriteLine("Cyclohexane is a subgraph of alpha-Pinen: " + CDKMCS.IsSubgraph(mol, frag1, true));
            }
            else
            {
                Assert.IsTrue(!CDKMCS.IsSubgraph(mol, frag1, true));
            }
        }
コード例 #15
0
ファイル: CDKRMapHandler.cs プロジェクト: roddickchen/NCDK
        /// <summary>
        /// This function calculates only one solution (exact) because we are looking at the
        /// molecules which are exactly same in terms of the bonds and atoms determined by the
        /// Fingerprint
        /// </summary>
        /// <param name="molecule1"></param>
        /// <param name="molecule2"></param>
        /// <param name="shouldMatchBonds"></param>
        /// <exception cref="CDKException"></exception>
        public void CalculateOverlapsAndReduceExactMatch(IAtomContainer molecule1, IAtomContainer molecule2, bool shouldMatchBonds)
        {
            Source = molecule1;
            Target = molecule2;

            Mappings = new List <IReadOnlyDictionary <int, int> >();

            //Console.Out.WriteLine("Searching: ");
            //List overlaps = UniversalIsomorphismTesterBondTypeInSensitive.GetSubgraphAtomsMap(source, target);

            if ((Source.Atoms.Count == 1) || (Target.Atoms.Count == 1))
            {
                List <CDKRMap> overlaps      = CDKMCS.CheckSingleAtomCases(Source, Target);
                int            nAtomsMatched = overlaps.Count;
                nAtomsMatched = (nAtomsMatched > 0) ? 1 : 0;
                if (nAtomsMatched > 0)
                {
                    IdentifySingleAtomsMatchedParts(overlaps, Source, Target);
                }
            }
            else
            {
                var overlaps = CDKMCS.Search(Source, Target, new BitArray(Source.Bonds.Count), new BitArray(Target.Bonds.Count), true,
                                             true, shouldMatchBonds);

                var reducedList    = RemoveSubGraph(overlaps);
                var allMaxOverlaps = GetAllMaximum(reducedList);

                while (allMaxOverlaps.Count != 0)
                {
                    var maxOverlapsAtoms = MakeAtomsMapOfBondsMap(allMaxOverlaps.Peek(), Source,
                                                                  Target);
                    IdentifyMatchedParts(maxOverlapsAtoms, Source, Target);
                    allMaxOverlaps.Pop();
                }
            }
            FinalMappings.Instance.Set(Mappings);
        }
コード例 #16
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestItself()
        {
            var smiles = "C1CCCCCCC1CC";
            var query  = QueryAtomContainerCreator.CreateAnyAtomContainer(CDK.SmilesParser.ParseSmiles(smiles), true);
            var ac     = CDK.SmilesParser.ParseSmiles(smiles);

            if (standAlone)
            {
                Console.Out.WriteLine("AtomCount of query: " + query.Atoms.Count);
                Console.Out.WriteLine("AtomCount of target: " + ac.Atoms.Count);
            }

            bool matched = CDKMCS.IsSubgraph(ac, query, true);

            if (standAlone)
            {
                Console.Out.WriteLine("QueryAtomContainer matched: " + matched);
            }
            if (!standAlone)
            {
                Assert.IsTrue(matched);
            }
        }
コード例 #17
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestSFBug999330()
        {
            var file1 = "NCDK.Data.MDL.5SD.mol";
            var file2 = "NCDK.Data.MDL.ADN.mol";
            var mol1  = builder.NewAtomContainer();
            var mol2  = builder.NewAtomContainer();

            var ins1 = ResourceLoader.GetAsStream(file1);

            new MDLV2000Reader(ins1, ChemObjectReaderMode.Strict).Read(mol1);
            var ins2 = ResourceLoader.GetAsStream(file2);

            new MDLV2000Reader(ins2, ChemObjectReaderMode.Strict).Read(mol2);
            var permutor = new AtomContainerAtomPermutor(mol2);

            permutor.MoveNext();
            mol2 = builder.NewAtomContainer(permutor.Current);

            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(mol1);
            var adder = CDK.HydrogenAdder;

            adder.AddImplicitHydrogens(mol1);
            Aromaticity.CDKLegacy.Apply(mol1);

            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(mol2);
            adder = CDK.HydrogenAdder;
            adder.AddImplicitHydrogens(mol2);
            Aromaticity.CDKLegacy.Apply(mol2);

            var list1 = CDKMCS.GetOverlaps(mol1, mol2, true);
            var list2 = CDKMCS.GetOverlaps(mol2, mol1, true);

            Assert.AreEqual(1, list1.Count);
            Assert.AreEqual(1, list2.Count);
            Assert.AreEqual(list1[0].Atoms.Count, list2[0].Atoms.Count);
        }
コード例 #18
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void Test3()
        {
            var mol   = TestMoleculeFactory.MakeIndole();
            var frag1 = TestMoleculeFactory.MakePyrrole();

            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(mol);
            AtomContainerManipulator.PercieveAtomTypesAndConfigureAtoms(frag1);
            var adder = CDK.HydrogenAdder;

            adder.AddImplicitHydrogens(mol);
            adder = CDK.HydrogenAdder;
            adder.AddImplicitHydrogens(frag1);
            Aromaticity.CDKLegacy.Apply(mol);
            Aromaticity.CDKLegacy.Apply(frag1);

            if (standAlone)
            {
                Console.Out.WriteLine("Pyrrole is a subgraph of Indole: " + CDKMCS.IsSubgraph(mol, frag1, true));
            }
            else
            {
                Assert.IsTrue(CDKMCS.IsSubgraph(mol, frag1, true));
            }
        }
コード例 #19
0
ファイル: CDKMCSTest.cs プロジェクト: roddickchen/NCDK
        public void TestSFBug1708336()
        {
            var atomContainer = builder.NewAtomContainer();

            atomContainer.Atoms.Add(builder.NewAtom("C"));
            atomContainer.Atoms.Add(builder.NewAtom("C"));
            atomContainer.Atoms.Add(builder.NewAtom("N"));
            atomContainer.AddBond(atomContainer.Atoms[0], atomContainer.Atoms[1], BondOrder.Single);
            atomContainer.AddBond(atomContainer.Atoms[1], atomContainer.Atoms[2], BondOrder.Single);
            var query = new QueryAtomContainer();
            var a1    = new SymbolQueryAtom()
            {
                Symbol = "C"
            };

            var a2 = new Isomorphisms.Matchers.SMARTS.AnyAtom();
            var b1 = new OrderQueryBond(a1, a2, BondOrder.Single);

            var a3 = new SymbolQueryAtom()
            {
                Symbol = "C"
            };

            var b2 = new OrderQueryBond(a2, a3, BondOrder.Single);

            query.Atoms.Add(a1);
            query.Atoms.Add(a2);
            query.Atoms.Add(a3);

            query.Bonds.Add(b1);
            query.Bonds.Add(b2);

            var list = CDKMCS.GetSubgraphMaps(atomContainer, query, true);

            Assert.IsTrue(list.Count == 0);
        }