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); }
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); }
/// <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); }