Пример #1
0
 private void SetCompareTable(IAtomContainer mol)
 {
     this.compare       = mol;
     this.compareTable  = MorganNumbersTools.GetMorganNumbers(compare);
     sortedCompareTable = new long[compareTable.Length];
     Array.Copy(compareTable, 0, sortedCompareTable, 0, compareTable.Length);
     Array.Sort(sortedCompareTable);
 }
Пример #2
0
 private void SetBaseTable(IAtomContainer mol)
 {
     this.base_      = mol;
     this.baseTable  = MorganNumbersTools.GetMorganNumbers(base_);
     sortedBaseTable = new long[baseTable.Length];
     Array.Copy(baseTable, 0, sortedBaseTable, 0, baseTable.Length);
     Array.Sort(sortedBaseTable);
 }
Пример #3
0
        /// <summary>
        /// Says if an atom as a center of any valid stereo configuration or not.
        /// This method uses wedge bonds. 3D coordinates are not taken into account. If there
        /// are no wedge bonds around a potential stereo center, it will not be found.
        /// </summary>
        /// <param name="stereoAtom">The atom which is the center</param>
        /// <param name="container">The atomContainer the atom is in</param>
        /// <returns>true=is a stereo atom, false=is not</returns>
        public static bool IsStereo(IAtomContainer container, IAtom stereoAtom)
        {
            var atoms = container.GetConnectedAtoms(stereoAtom).ToReadOnlyList();

            if (atoms.Count < 4 || atoms.Count > 6)
            {
                return(false);
            }
            var bonds  = container.GetConnectedBonds(stereoAtom);
            int stereo = 0;

            foreach (var bond in bonds)
            {
                if (bond.Stereo != BondStereo.None)
                {
                    stereo++;
                }
            }
            if (stereo == 0)
            {
                return(false);
            }
            int differentAtoms = 0;

            for (int i = 0; i < atoms.Count; i++)
            {
                bool isDifferent = true;
                for (int k = 0; k < i; k++)
                {
                    if (atoms[i].Symbol.Equals(atoms[k].Symbol, StringComparison.Ordinal))
                    {
                        isDifferent = false;
                        break;
                    }
                }
                if (isDifferent)
                {
                    differentAtoms++;
                }
            }
            if (differentAtoms != atoms.Count)
            {
                long[] morgannumbers    = MorganNumbersTools.GetMorganNumbers(container);
                var    differentSymbols = new List <string>();
                foreach (var atom in atoms)
                {
                    if (!differentSymbols.Contains(atom.Symbol))
                    {
                        differentSymbols.Add(atom.Symbol);
                    }
                }
                int[] onlyRelevantIfTwo = new int[2];
                if (differentSymbols.Count == 2)
                {
                    foreach (var atom in atoms)
                    {
                        if (differentSymbols.IndexOf(atom.Symbol) == 0)
                        {
                            onlyRelevantIfTwo[0]++;
                        }
                        else
                        {
                            onlyRelevantIfTwo[1]++;
                        }
                    }
                }
                bool[] symbolsWithDifferentMorganNumbers = new bool[differentSymbols.Count];
                var    symbolsMorganNumbers = new List <long> [symbolsWithDifferentMorganNumbers.Length];
                for (int i = 0; i < symbolsWithDifferentMorganNumbers.Length; i++)
                {
                    symbolsWithDifferentMorganNumbers[i] = true;
                    symbolsMorganNumbers[i] = new List <long>();
                }
                foreach (var atom in atoms)
                {
                    int elementNumber = differentSymbols.IndexOf(atom.Symbol);
                    if (symbolsMorganNumbers[elementNumber].Contains(morgannumbers[container.Atoms.IndexOf(atom)]))
                    {
                        symbolsWithDifferentMorganNumbers[elementNumber] = false;
                    }
                    else
                    {
                        symbolsMorganNumbers[elementNumber].Add(morgannumbers[container.Atoms.IndexOf(atom)]);
                    }
                }
                int numberOfSymbolsWithDifferentMorganNumbers = 0;
                foreach (var symbolWithDifferentMorganNumber in symbolsWithDifferentMorganNumbers)
                {
                    if (symbolWithDifferentMorganNumber)
                    {
                        numberOfSymbolsWithDifferentMorganNumbers++;
                    }
                }
                if (numberOfSymbolsWithDifferentMorganNumbers != differentSymbols.Count)
                {
                    if ((atoms.Count == 5 || atoms.Count == 6) &&
                        (numberOfSymbolsWithDifferentMorganNumbers + differentAtoms > 2 || (differentAtoms == 2 &&
                                                                                            onlyRelevantIfTwo[0] > 1 && onlyRelevantIfTwo[1] > 1)))
                    {
                        return(true);
                    }
                    return(IsSquarePlanar(container, stereoAtom) &&
                           (numberOfSymbolsWithDifferentMorganNumbers + differentAtoms > 2 || (differentAtoms == 2 &&
                                                                                               onlyRelevantIfTwo[0] > 1 && onlyRelevantIfTwo[1] > 1)));
                }
            }
            return(true);
        }