Exemplo n.º 1
0
        /// <summary>
        /// This method calculates occurrences of the Kier &amp; Hall E-state fragments.
        /// </summary>
        /// <returns>Counts of the fragments</returns>
        public Result Calculate(IAtomContainer container)
        {
            container = AtomContainerManipulator.RemoveHydrogens(container);

            var counts = new int[SMARTS.Count];

            SmartsPattern.Prepare(container);
            for (int i = 0; i < SMARTS.Count; i++)
            {
                counts[i] = SMARTS[i].MatchAll(container).CountUnique();
            }

            return(new Result(counts));
        }
Exemplo n.º 2
0
        /// <inheritdoc/>
        public override IBitFingerprint GetBitFingerprint(IAtomContainer atomContainer)
        {
            int      bitsetLength = PATTERNS.Count;
            BitArray fingerPrint  = new BitArray(bitsetLength);

            SmartsPattern.Prepare(atomContainer);
            for (int i = 0; i < PATTERNS.Count; i++)
            {
                if (PATTERNS[i].Matches(atomContainer))
                {
                    fingerPrint.Set(i, true);
                }
            }
            return(new BitSetFingerprint(fingerPrint));
        }
Exemplo n.º 3
0
        /// <inheritdoc/>
        public override ICountFingerprint GetCountFingerprint(IAtomContainer atomContainer)
        {
            if (!keys.Any())
            {
                throw new CDKException("No substructures were defined");
            }

            // init SMARTS invariants (connectivity, degree, etc)
            SmartsPattern.Prepare(atomContainer);

            var map = new SortedDictionary <int, int>();

            for (int i = 0; i < keys.Count; i++)
            {
                var ptrn = keys[i].Pattern;
                map[i] = ptrn.MatchAll(atomContainer).CountUnique();
            }
            return(new CountFingerprint(map));
        }
Exemplo n.º 4
0
        /// <inheritdoc/>
        public override IBitFingerprint GetBitFingerprint(IAtomContainer atomContainer)
        {
            if (!keys.Any())
            {
                throw new CDKException("No substructures were defined");
            }

            SmartsPattern.Prepare(atomContainer);
            var fingerPrint = new BitArray(keys.Count);

            for (int i = 0; i < keys.Count; i++)
            {
                if (keys[i].Pattern.Matches(atomContainer))
                {
                    fingerPrint[i] = true;
                }
            }
            return(new BitSetFingerprint(fingerPrint));
        }
Exemplo n.º 5
0
 private void PrepareInput(IAtomContainer input)
 {
     SmartsPattern.Prepare(input);
 }
Exemplo n.º 6
0
        /// <inheritdoc/>
        public override IBitFingerprint GetBitFingerprint(IAtomContainer container)
        {
            var keys = GetKeys(container.Builder);
            var fp   = new BitArray(keys.Count);

            // init SMARTS invariants (connectivity, degree, etc)
            SmartsPattern.Prepare(container);

            int numAtoms = container.Atoms.Count;

            var bmap    = EdgeToBondMap.WithSpaceFor(container);
            var adjlist = GraphUtil.ToAdjList(container, bmap);

            for (int i = 0; i < keys.Count; i++)
            {
                var key     = keys[i];
                var pattern = key.Pattern;

                switch (key.Smarts)
                {
                case "[!*]":
                    break;

                case "[!0]":
                    foreach (IAtom atom in container.Atoms)
                    {
                        if (atom.MassNumber != null)
                        {
                            fp.Set(i, true);
                            break;
                        }
                    }
                    break;

                // ring bits
                case "[R]1@*@*@1":           // 3M RING bit22
                case "[R]1@*@*@*@1":         // 4M RING bit11
                case "[R]1@*@*@*@*@1":       // 5M RING bit96
                case "[R]1@*@*@*@*@*@1":     // 6M RING bit163, x2=bit145
                case "[R]1@*@*@*@*@*@*@1":   // 7M RING, bit19
                case "[R]1@*@*@*@*@*@*@*@1": // 8M RING, bit101
                                             // handled separately
                    break;

                case "(*).(*)":
                    // bit 166 (*).(*) we can match this in SMARTS but it's faster to just
                    // count the number of components or in this case try to traverse the
                    // component, iff there are some atoms not visited we have more than
                    // one component
                    bool[] visit = new bool[numAtoms];
                    if (numAtoms > 1 && VisitPart(visit, adjlist, 0, -1) < numAtoms)
                    {
                        fp.Set(165, true);
                    }
                    break;

                default:
                    if (key.Count == 0)
                    {
                        if (pattern.Matches(container))
                        {
                            fp.Set(i, true);
                        }
                    }
                    else
                    {
                        // check if there are at least 'count' unique hits, key.count = 0
                        // means find at least one match hence we add 1 to out limit
                        if (pattern.MatchAll(container).GetUniqueAtoms().AtLeast(key.Count + 1))
                        {
                            fp.Set(i, true);
                        }
                    }
                    break;
                }
            }

            // Ring Bits

            // threshold=126, see AllRingsFinder.Threshold.PubChem_97
            if (numAtoms > 2)
            {
                AllCycles allcycles = new AllCycles(adjlist,
                                                    Math.Min(8, numAtoms),
                                                    126);
                int numArom = 0;
                foreach (int[] path in allcycles.GetPaths())
                {
                    // length is +1 as we repeat the closure vertex
                    switch (path.Length)
                    {
                    case 4:     // 3M bit22
                        fp.Set(21, true);
                        break;

                    case 5:     // 4M bit11
                        fp.Set(10, true);
                        break;

                    case 6:     // 5M bit96
                        fp.Set(95, true);
                        break;

                    case 7:     // 6M bit163->bit145, bit124 numArom > 1

                        if (numArom < 2)
                        {
                            if (IsAromPath(path, bmap))
                            {
                                numArom++;
                                if (numArom == 2)
                                {
                                    fp.Set(124, true);
                                }
                            }
                        }

                        if (fp[162])
                        {
                            fp.Set(144, true);     // >0
                        }
                        else
                        {
                            fp.Set(162, true);     // >1
                        }
                        break;

                    case 8:     // 7M bit19
                        fp.Set(18, true);
                        break;

                    case 9:     // 8M bit101
                        fp.Set(100, true);
                        break;
                    }
                }
            }

            return(new BitSetFingerprint(fp));
        }