public void TestTaxols() { var filename = "NCDK.Data.ASN.PubChem.taxols.xml"; Trace.TraceInformation("Testing: " + filename); int modelCount = 0; IChemSequence set; using (var ins = ResourceLoader.GetAsStream(filename)) using (var sr = new StreamReader(ins)) using (var reader = new EnumerablePCSubstancesXMLReader(sr, ChemObjectBuilder.Instance)) { set = ChemObjectBuilder.Instance.NewChemSequence(); foreach (var obj in reader) { Assert.IsNotNull(obj); Assert.IsTrue(obj is IChemModel); set.Add((IChemModel)obj); modelCount++; } } Assert.AreEqual(77, modelCount); IChemModel first = set[0]; Assert.AreEqual(63, ChemModelManipulator.GetAtomCount(first)); Assert.AreEqual(69, ChemModelManipulator.GetBondCount(first)); }
private static void CreateIDsForChemModel(IChemModel model, List <string> tabuList) { if (tabuList == null) { tabuList = ChemModelManipulator.GetAllIDs(model).ToList(); } if (null == model.Id) { chemModelCount = SetId(CHEMMODEL_PREFIX, chemModelCount, model, tabuList); } var crystal = model.Crystal; if (crystal != null) { if (policy == UniquePolicy.Object) { atomCount = 0; bondCount = 0; } CreateIDsForAtomContainer(crystal, tabuList); } var moleculeSet = model.MoleculeSet; if (moleculeSet != null) { if (policy == UniquePolicy.Object) { atomContainerSetCount = 0; atomContainerCount = 0; } CreateIDsForAtomContainerSet(moleculeSet, tabuList); } var reactionSet = model.ReactionSet; if (reactionSet != null) { if (policy == UniquePolicy.Object) { reactionSetCount = 0; reactionCount = 0; } CreateIDsForReactionSet(reactionSet, tabuList); } }
public override void Write(IChemObject obj) { if (obj is ICrystal) { WriteCrystal((ICrystal)obj); } else if (obj is IAtomContainer) { WriteMolecule((IAtomContainer)obj); } else if (obj is IChemFile chemFile) { IChemSequence sequence = chemFile[0]; if (sequence != null) { IChemModel model = sequence[0]; if (model != null) { ICrystal crystal = model.Crystal; if (crystal != null) { Write(crystal); } else { var containers = ChemModelManipulator.GetAllAtomContainers(model); foreach (var container in containers) { WriteMolecule(model.Builder.NewAtomContainer(container)); } } } } } else { throw new CDKException("Only supported is writing of Molecule, Crystal and ChemFile objects."); } }
void AssertBondCount(int expectedBondCount, IChemObject chemObject) { if (expectedBondCount != -1) { if (chemObject is IChemFile) { Assert.AreEqual(expectedBondCount, ChemFileManipulator.GetBondCount((IChemFile)chemObject)); } else if (chemObject is IChemModel) { Assert.AreEqual(expectedBondCount, ChemModelManipulator.GetBondCount((IChemModel)chemObject)); } else if (chemObject is IAtomContainer) { Assert.AreEqual(expectedBondCount, ((IAtomContainer)chemObject).Bonds.Count); } else if (chemObject is IReaction) { Assert.AreEqual(expectedBondCount, ReactionManipulator.GetBondCount((IReaction)chemObject)); } } }
/// <summary> /// Reads NMR nuclear shieldings. /// </summary> /// <param name="model"></param> /// <param name="labelLine"></param> private void ReadNMRData(IChemModel model, string labelLine) { var containers = ChemModelManipulator.GetAllAtomContainers(model).ToReadOnlyList(); if (containers.Count == 0) { // nothing to store the results into return; } // otherwise insert in the first AC IAtomContainer ac = containers[0]; // Determine label for properties string label; if (labelLine.Contains("Diamagnetic")) { label = "Diamagnetic Magnetic shielding (Isotropic)"; } else if (labelLine.Contains("Paramagnetic")) { label = "Paramagnetic Magnetic shielding (Isotropic)"; } else { label = "Magnetic shielding (Isotropic)"; } int atomIndex = 0; for (int i = 0; i < atomCount; ++i) { try { string line = input.ReadLine().Trim(); while (!line.Contains("Isotropic")) { if (line == null) { return; } line = input.ReadLine().Trim(); } var st1 = Strings.Tokenize(line).GetEnumerator(); // Find Isotropic label while (st1.MoveNext()) { if (string.Equals(st1.Current, "Isotropic", StringComparison.Ordinal)) { break; } } // Find Isotropic value while (st1.MoveNext()) { if (string.Equals(st1.Current, "=", StringComparison.Ordinal)) { break; } } st1.MoveNext(); double shielding = double.Parse(st1.Current, NumberFormatInfo.InvariantInfo); Trace.TraceInformation("Type of shielding: " + label); ac.Atoms[atomIndex].SetProperty(CDKPropertyName.IsotropicShielding, shielding); ++atomIndex; } catch (Exception exc) { if (!(exc is IOException || exc is FormatException)) { throw; } Debug.WriteLine("failed to read line from gaussian98 file where I expected one."); } } }
/// <summary> Reads a set of vibrations into ChemFrame. /// /// </summary> /// <param name="model"> Description of the Parameter /// </param> /// <exception cref="IOException"> if an I/O error occurs /// </exception> // private void readFrequencies(IChemModel model) throws IOException // { /* * FIXME: this is yet to be ported * String line; * line = input.readLine(); * line = input.readLine(); * line = input.readLine(); * line = input.readLine(); * line = input.readLine(); * while ((line != null) && line.startsWith(" Frequencies --")) { * Vector currentVibs = new Vector(); * StringReader vibValRead = new StringReader(line.substring(15)); * StreamTokenizer token = new StreamTokenizer(vibValRead); * while (token.nextToken() != StreamTokenizer.TT_EOF) { * Vibration vib = new Vibration(Double.toString(token.nval)); * currentVibs.addElement(vib); * } * line = input.readLine(); * line = input.readLine(); * line = input.readLine(); * line = input.readLine(); * line = input.readLine(); * line = input.readLine(); * for (int i = 0; i < frame.getAtomCount(); ++i) { * line = input.readLine(); * StringReader vectorRead = new StringReader(line); * token = new StreamTokenizer(vectorRead); * token.nextToken(); * / ignore first token * token.nextToken(); * / ignore second token * for (int j = 0; j < currentVibs.size(); ++j) { * double[] v = new double[3]; * if (token.nextToken() == StreamTokenizer.TT_NUMBER) { * v[0] = token.nval; * } else { * throw new IOException("Error reading frequency"); * } * if (token.nextToken() == StreamTokenizer.TT_NUMBER) { * v[1] = token.nval; * } else { * throw new IOException("Error reading frequency"); * } * if (token.nextToken() == StreamTokenizer.TT_NUMBER) { * v[2] = token.nval; * } else { * throw new IOException("Error reading frequency"); * } * ((Vibration) currentVibs.elementAt(j)).addAtomVector(v); * } * } * for (int i = 0; i < currentVibs.size(); ++i) { * frame.addVibration((Vibration) currentVibs.elementAt(i)); * } * line = input.readLine(); * line = input.readLine(); * line = input.readLine(); * } */ // } /// <summary> Reads NMR nuclear shieldings. /// /// </summary> /// <param name="model"> Description of the Parameter /// </param> /// <param name="labelLine">Description of the Parameter /// </param> /// <throws> CDKException Description of the Exception </throws> private void readNMRData(IChemModel model, System.String labelLine) { IAtomContainer ac = ChemModelManipulator.getAllInOneContainer(model); // Determine label for properties System.String label; if (labelLine.IndexOf("Diamagnetic") >= 0) { label = "Diamagnetic Magnetic shielding (Isotropic)"; } else if (labelLine.IndexOf("Paramagnetic") >= 0) { label = "Paramagnetic Magnetic shielding (Isotropic)"; } else { label = "Magnetic shielding (Isotropic)"; } int atomIndex = 0; for (int i = 0; i < atomCount; ++i) { try { System.String line = input.ReadLine().Trim(); while (line.IndexOf("Isotropic") < 0) { if (line == null) { return; } line = input.ReadLine().Trim(); } SupportClass.Tokenizer st1 = new SupportClass.Tokenizer(line); // Find Isotropic label while (st1.HasMoreTokens()) { if (st1.NextToken().Equals("Isotropic")) { break; } } // Find Isotropic value while (st1.HasMoreTokens()) { if (st1.NextToken().Equals("=")) { break; } } double shielding = System.Double.Parse(st1.NextToken()); //logger.info("Type of shielding: " + label); ac.getAtomAt(atomIndex).setProperty(CDKConstants.ISOTROPIC_SHIELDING, (System.Object)shielding); ++atomIndex; } catch (System.Exception exc) { //logger.debug("failed to read line from gaussian98 file where I expected one."); } } }
private static void ProcessChemModel(IChemModel chemModel, ISettings settings, FileUsage usage, MoleculeLoadingResults results, MoleculeProcessingProgress progress, float sectionSz) { //if (ChemModelManipulator.getAllInOneContainer(chemModel).getBondCount() == 0) //{ // return; //} // check for coordinates if ((GeometryTools.has2DCoordinatesNew(ChemModelManipulator.getAllInOneContainer(chemModel)) != 0))// { results.Num2DCoords++; } // usage == FileUsage.TwoD) //{ // throw new UserLevelException("File has no 2D coords", UserLevelException.ExceptionType.FileLoading, // typeof(MoleculeLoader), null); //} if ((GeometryTools.has2DCoordinatesNew(ChemModelManipulator.getAllInOneContainer(chemModel)) != 0))// && { results.Num3DCoords++; } // usage == FileUsage.ThreeD) //{ // throw new UserLevelException("File has no 3D coords", UserLevelException.ExceptionType.FileLoading, // typeof(MoleculeLoader), null); //} ElementPTFactory elements = ElementPTFactory.Instance; // calc item sz int numItems = 0; if (chemModel.SetOfMolecules != null) { results.NumMolecules += chemModel.SetOfMolecules.MoleculeCount; for (int mol = 0; mol < chemModel.SetOfMolecules.MoleculeCount; mol++) { numItems += chemModel.SetOfMolecules.Molecules[mol].Atoms.Length; //numItems += chemModel.SetOfMolecules.Molecules[mol].Bonds.Length; } } float itemSz = sectionSz / (float)numItems; if (chemModel.SetOfMolecules != null) { results.NumMolecules += chemModel.SetOfMolecules.MoleculeCount; for (int mol = 0; mol < chemModel.SetOfMolecules.MoleculeCount; mol++) { IMolecule molecule = chemModel.SetOfMolecules.Molecules[mol]; results.NumAtoms += molecule.Atoms.Length; results.NumBonds += molecule.Bonds.Length; foreach (IAtom atom in molecule.Atoms) { PeriodicTableElement pe = elements.getElement(atom.Symbol); if (pe != null) { atom.AtomicNumber = pe.AtomicNumber; atom.Properties["PeriodicTableElement"] = pe; atom.Properties["Period"] = int.Parse(pe.Period); } else { progress.Log(string.Format("Failed to find periodic element: {0}", atom.Symbol), LogItem.ItemLevel.Failure); } progress.UpdateProgress(itemSz); } progress.Log(string.Format("Processed {0} atoms", molecule.Atoms.Length), LogItem.ItemLevel.Info); } } progress.Log("Processed Model", LogItem.ItemLevel.Success); }
public void TestBug1714794() { var problematicMol2 = "@<TRIPOS>MOLECULE\n" + "mol_197219.smi\n" + " 129 135 0 0 0\n" + "SMALL\n" + "GASTEIGER\n" + "Energy = 0\n" + "\n" + "@<TRIPOS>ATOM\n" + " 1 N1 0.0000 0.0000 0.0000 N.am 1 <1> -0.2782\n" + " 2 H1 0.0000 0.0000 0.0000 H 1 <1> 0.1552\n" + " 3 C1 0.0000 0.0000 0.0000 C.ar 1 <1> 0.0886\n" + " 4 C2 0.0000 0.0000 0.0000 C.ar 1 <1> 0.1500\n" + " 5 C3 0.0000 0.0000 0.0000 C.ar 1 <1> 0.0714\n" + " 6 C4 0.0000 0.0000 0.0000 C.ar 1 <1> 0.0456\n" + " 7 C5 0.0000 0.0000 0.0000 C.ar 1 <1> 0.0788\n" + " 8 C6 0.0000 0.0000 0.0000 C.ar 1 <1> 0.1435\n" + " 9 C7 0.0000 0.0000 0.0000 C.ar 1 <1> 0.0342\n" + " 10 C8 0.0000 0.0000 0.0000 C.ar 1 <1> 0.1346\n" + " 11 O1 0.0000 0.0000 0.0000 O.3 1 <1> -0.5057\n" + " 12 H2 0.0000 0.0000 0.0000 H 1 <1> 0.2922\n" + " 13 C9 0.0000 0.0000 0.0000 C.3 1 <1> -0.0327\n" + " 14 H3 0.0000 0.0000 0.0000 H 1 <1> 0.0280\n" + " 15 H4 0.0000 0.0000 0.0000 H 1 <1> 0.0280\n" + " 16 H5 0.0000 0.0000 0.0000 H 1 <1> 0.0280\n" + " 17 O2 0.0000 0.0000 0.0000 O.3 1 <1> -0.4436\n" + " 18 C10 0.0000 0.0000 0.0000 C.3 1 <1> 0.3143\n" + " 19 O3 0.0000 0.0000 0.0000 O.2 1 <1> -0.4528\n" + " 20 C11 0.0000 0.0000 0.0000 C.2 1 <1> 0.0882\n" + " 21 H6 0.0000 0.0000 0.0000 H 1 <1> 0.1022\n" + " 22 C12 0.0000 0.0000 0.0000 C.2 1 <1> -0.0208\n" + " 23 H7 0.0000 0.0000 0.0000 H 1 <1> 0.0628\n" + " 24 C13 0.0000 0.0000 0.0000 C.3 1 <1> 0.0854\n" + " 25 H8 0.0000 0.0000 0.0000 H 1 <1> 0.0645\n" + " 26 C14 0.0000 0.0000 0.0000 C.3 1 <1> 0.0236\n" + " 27 H9 0.0000 0.0000 0.0000 H 1 <1> 0.0362\n" + " 28 C15 0.0000 0.0000 0.0000 C.3 1 <1> 0.1131\n" + " 29 H10 0.0000 0.0000 0.0000 H 1 <1> 0.0741\n" + " 30 C16 0.0000 0.0000 0.0000 C.3 1 <1> 0.0200\n" + " 31 H11 0.0000 0.0000 0.0000 H 1 <1> 0.0359\n" + " 32 C17 0.0000 0.0000 0.0000 C.3 1 <1> 0.0661\n" + " 33 H12 0.0000 0.0000 0.0000 H 1 <1> 0.0600\n" + " 34 C18 0.0000 0.0000 0.0000 C.3 1 <1> 0.0091\n" + " 35 H13 0.0000 0.0000 0.0000 H 1 <1> 0.0348\n" + " 36 C19 0.0000 0.0000 0.0000 C.3 1 <1> 0.0661\n" + " 37 H14 0.0000 0.0000 0.0000 H 1 <1> 0.0602\n" + " 38 C20 0.0000 0.0000 0.0000 C.3 1 <1> 0.0009\n" + " 39 H15 0.0000 0.0000 0.0000 H 1 <1> 0.0365\n" + " 40 C21 0.0000 0.0000 0.0000 C.2 1 <1> -0.0787\n" + " 41 H16 0.0000 0.0000 0.0000 H 1 <1> 0.0576\n" + " 42 C22 0.0000 0.0000 0.0000 C.2 1 <1> -0.0649\n" + " 43 H17 0.0000 0.0000 0.0000 H 1 <1> 0.0615\n" + " 44 C23 0.0000 0.0000 0.0000 C.2 1 <1> -0.0542\n" + " 45 H18 0.0000 0.0000 0.0000 H 1 <1> 0.0622\n" + " 46 C24 0.0000 0.0000 0.0000 C.2 1 <1> 0.0115\n" + " 47 C25 0.0000 0.0000 0.0000 C.2 1 <1> 0.2441\n" + " 48 O4 0.0000 0.0000 0.0000 O.2 1 <1> -0.2702\n" + " 49 C26 0.0000 0.0000 0.0000 C.3 1 <1> -0.0348\n" + " 50 H19 0.0000 0.0000 0.0000 H 1 <1> 0.0279\n" + " 51 H20 0.0000 0.0000 0.0000 H 1 <1> 0.0279\n" + " 52 H21 0.0000 0.0000 0.0000 H 1 <1> 0.0279\n" + " 53 C27 0.0000 0.0000 0.0000 C.3 1 <1> -0.0566\n" + " 54 H22 0.0000 0.0000 0.0000 H 1 <1> 0.0236\n" + " 55 H23 0.0000 0.0000 0.0000 H 1 <1> 0.0236\n" + " 56 H24 0.0000 0.0000 0.0000 H 1 <1> 0.0236\n" + " 57 O5 0.0000 0.0000 0.0000 O.3 1 <1> -0.3909\n" + " 58 H25 0.0000 0.0000 0.0000 H 1 <1> 0.2098\n" + " 59 C28 0.0000 0.0000 0.0000 C.3 1 <1> -0.0577\n" + " 60 H26 0.0000 0.0000 0.0000 H 1 <1> 0.0234\n" + " 61 H27 0.0000 0.0000 0.0000 H 1 <1> 0.0234\n" + " 62 H28 0.0000 0.0000 0.0000 H 1 <1> 0.0234\n" + " 63 O6 0.0000 0.0000 0.0000 O.3 1 <1> -0.3910\n" + " 64 H29 0.0000 0.0000 0.0000 H 1 <1> 0.2098\n" + " 65 C29 0.0000 0.0000 0.0000 C.3 1 <1> -0.0567\n" + " 66 H30 0.0000 0.0000 0.0000 H 1 <1> 0.0234\n" + " 67 H31 0.0000 0.0000 0.0000 H 1 <1> 0.0234\n" + " 68 H32 0.0000 0.0000 0.0000 H 1 <1> 0.0234\n" + " 69 O7 0.0000 0.0000 0.0000 O.3 1 <1> -0.4608\n" + " 70 C30 0.0000 0.0000 0.0000 C.2 1 <1> 0.3042\n" + " 71 O8 0.0000 0.0000 0.0000 O.2 1 <1> -0.2512\n" + " 72 C31 0.0000 0.0000 0.0000 C.3 1 <1> 0.0332\n" + " 73 H33 0.0000 0.0000 0.0000 H 1 <1> 0.0342\n" + " 74 H34 0.0000 0.0000 0.0000 H 1 <1> 0.0342\n" + " 75 H35 0.0000 0.0000 0.0000 H 1 <1> 0.0342\n" + " 76 C32 0.0000 0.0000 0.0000 C.3 1 <1> -0.0564\n" + " 77 H36 0.0000 0.0000 0.0000 H 1 <1> 0.0234\n" + " 78 H37 0.0000 0.0000 0.0000 H 1 <1> 0.0234\n" + " 79 H38 0.0000 0.0000 0.0000 H 1 <1> 0.0234\n" + " 80 O9 0.0000 0.0000 0.0000 O.3 1 <1> -0.3753\n" + " 81 C33 0.0000 0.0000 0.0000 C.3 1 <1> 0.0372\n" + " 82 H39 0.0000 0.0000 0.0000 H 1 <1> 0.0524\n" + " 83 H40 0.0000 0.0000 0.0000 H 1 <1> 0.0524\n" + " 84 H41 0.0000 0.0000 0.0000 H 1 <1> 0.0524\n" + " 85 C34 0.0000 0.0000 0.0000 C.2 1 <1> 0.2505\n" + " 86 O10 0.0000 0.0000 0.0000 O.2 1 <1> -0.2836\n" + " 87 C35 0.0000 0.0000 0.0000 C.3 1 <1> 0.0210\n" + " 88 H42 0.0000 0.0000 0.0000 H 1 <1> 0.0309\n" + " 89 H43 0.0000 0.0000 0.0000 H 1 <1> 0.0309\n" + " 90 H44 0.0000 0.0000 0.0000 H 1 <1> 0.0309\n" + " 91 C36 0.0000 0.0000 0.0000 C.ar 1 <1> 0.1361\n" + " 92 C37 0.0000 0.0000 0.0000 C.ar 1 <1> 0.0613\n" + " 93 C38 0.0000 0.0000 0.0000 C.2 1 <1> 0.0580\n" + " 94 H45 0.0000 0.0000 0.0000 H 1 <1> 0.0853\n" + " 95 N2 0.0000 0.0000 0.0000 N.2 1 <1> -0.1915\n" + " 96 N3 0.0000 0.0000 0.0000 N.pl3 1 <1> -0.2525\n" + " 97 C39 0.0000 0.0000 0.0000 C.3 1 <1> 0.0525\n" + " 98 C40 0.0000 0.0000 0.0000 C.3 1 <1> -0.0271\n" + " 99 H46 0.0000 0.0000 0.0000 H 1 <1> 0.0289\n" + " 100 H47 0.0000 0.0000 0.0000 H 1 <1> 0.0289\n" + " 101 C41 0.0000 0.0000 0.0000 C.3 1 <1> -0.0385\n" + " 102 H48 0.0000 0.0000 0.0000 H 1 <1> 0.0302\n" + " 103 C42 0.0000 0.0000 0.0000 C.3 1 <1> -0.0472\n" + " 104 H49 0.0000 0.0000 0.0000 H 1 <1> 0.0271\n" + " 105 H50 0.0000 0.0000 0.0000 H 1 <1> 0.0271\n" + " 106 C43 0.0000 0.0000 0.0000 C.3 1 <1> -0.0385\n" + " 107 H51 0.0000 0.0000 0.0000 H 1 <1> 0.0302\n" + " 108 C44 0.0000 0.0000 0.0000 C.3 1 <1> -0.0271\n" + " 109 H52 0.0000 0.0000 0.0000 H 1 <1> 0.0289\n" + " 110 H53 0.0000 0.0000 0.0000 H 1 <1> 0.0289\n" + " 111 C45 0.0000 0.0000 0.0000 C.3 1 <1> -0.0472\n" + " 112 H54 0.0000 0.0000 0.0000 H 1 <1> 0.0271\n" + " 113 H55 0.0000 0.0000 0.0000 H 1 <1> 0.0271\n" + " 114 C46 0.0000 0.0000 0.0000 C.3 1 <1> -0.0385\n" + " 115 H56 0.0000 0.0000 0.0000 H 1 <1> 0.0302\n" + " 116 C47 0.0000 0.0000 0.0000 C.3 1 <1> -0.0271\n" + " 117 H57 0.0000 0.0000 0.0000 H 1 <1> 0.0289\n" + " 118 H58 0.0000 0.0000 0.0000 H 1 <1> 0.0289\n" + " 119 C48 0.0000 0.0000 0.0000 C.3 1 <1> -0.0472\n" + " 120 H59 0.0000 0.0000 0.0000 H 1 <1> 0.0271\n" + " 121 H60 0.0000 0.0000 0.0000 H 1 <1> 0.0271\n" + " 122 C49 0.0000 0.0000 0.0000 C.3 1 <1> 0.0189\n" + " 123 H61 0.0000 0.0000 0.0000 H 1 <1> 0.0444\n" + " 124 H62 0.0000 0.0000 0.0000 H 1 <1> 0.0444\n" + " 125 H63 0.0000 0.0000 0.0000 H 1 <1> 0.0444\n" + " 126 O11 0.0000 0.0000 0.0000 O.3 1 <1> -0.5054\n" + " 127 H64 0.0000 0.0000 0.0000 H 1 <1> 0.2922\n" + " 128 O12 0.0000 0.0000 0.0000 O.3 1 <1> -0.5042\n" + " 129 H65 0.0000 0.0000 0.0000 H 1 <1> 0.2923\n" + "@<TRIPOS>BOND\n" + " 1 1 2 1\n" + " 2 1 3 1\n" + " 3 3 4 ar\n" + " 4 4 5 ar\n" + " 5 5 6 ar\n" + " 6 6 7 ar\n" + " 7 7 8 ar\n" + " 8 8 9 ar\n" + " 9 9 10 ar\n" + " 10 5 10 ar\n" + " 11 10 11 1\n" + " 12 11 12 1\n" + " 13 9 13 1\n" + " 14 13 14 1\n" + " 15 13 15 1\n" + " 16 13 16 1\n" + " 17 8 17 1\n" + " 18 17 18 1\n" + " 19 18 19 1\n" + " 20 19 20 1\n" + " 21 20 21 1\n" + " 22 20 22 2\n" + " 23 22 23 1\n" + " 24 22 24 1\n" + " 25 24 25 1\n" + " 26 24 26 1\n" + " 27 26 27 1\n" + " 28 26 28 1\n" + " 29 28 29 1\n" + " 30 28 30 1\n" + " 31 30 31 1\n" + " 32 30 32 1\n" + " 33 32 33 1\n" + " 34 32 34 1\n" + " 35 34 35 1\n" + " 36 34 36 1\n" + " 37 36 37 1\n" + " 38 36 38 1\n" + " 39 38 39 1\n" + " 40 38 40 1\n" + " 41 40 41 1\n" + " 42 40 42 2\n" + " 43 42 43 1\n" + " 44 42 44 1\n" + " 45 44 45 1\n" + " 46 44 46 2\n" + " 47 46 47 1\n" + " 48 1 47 am\n" + " 49 47 48 2\n" + " 50 46 49 1\n" + " 51 49 50 1\n" + " 52 49 51 1\n" + " 53 49 52 1\n" + " 54 38 53 1\n" + " 55 53 54 1\n" + " 56 53 55 1\n" + " 57 53 56 1\n" + " 58 36 57 1\n" + " 59 57 58 1\n" + " 60 34 59 1\n" + " 61 59 60 1\n" + " 62 59 61 1\n" + " 63 59 62 1\n" + " 64 32 63 1\n" + " 65 63 64 1\n" + " 66 30 65 1\n" + " 67 65 66 1\n" + " 68 65 67 1\n" + " 69 65 68 1\n" + " 70 28 69 1\n" + " 71 69 70 1\n" + " 72 70 71 2\n" + " 73 70 72 1\n" + " 74 72 73 1\n" + " 75 72 74 1\n" + " 76 72 75 1\n" + " 77 26 76 1\n" + " 78 76 77 1\n" + " 79 76 78 1\n" + " 80 76 79 1\n" + " 81 24 80 1\n" + " 82 80 81 1\n" + " 83 81 82 1\n" + " 84 81 83 1\n" + " 85 81 84 1\n" + " 86 18 85 1\n" + " 87 7 85 1\n" + " 88 85 86 2\n" + " 89 18 87 1\n" + " 90 87 88 1\n" + " 91 87 89 1\n" + " 92 87 90 1\n" + " 93 6 91 ar\n" + " 94 91 92 ar\n" + " 95 3 92 ar\n" + " 96 92 93 1\n" + " 97 93 94 1\n" + " 98 93 95 2\n" + " 99 95 96 1\n" + " 100 96 97 1\n" + " 101 97 98 1\n" + " 102 98 99 1\n" + " 103 98 100 1\n" + " 104 98 101 1\n" + " 105 101 102 1\n" + " 106 101 103 1\n" + " 107 103 104 1\n" + " 108 103 105 1\n" + " 109 103 106 1\n" + " 110 106 107 1\n" + " 111 106 108 1\n" + " 112 108 109 1\n" + " 113 108 110 1\n" + " 114 97 108 1\n" + " 115 106 111 1\n" + " 116 111 112 1\n" + " 117 111 113 1\n" + " 118 111 114 1\n" + " 119 114 115 1\n" + " 120 114 116 1\n" + " 121 116 117 1\n" + " 122 116 118 1\n" + " 123 97 116 1\n" + " 124 114 119 1\n" + " 125 119 120 1\n" + " 126 119 121 1\n" + " 127 101 119 1\n" + " 128 96 122 1\n" + " 129 122 123 1\n" + " 130 122 124 1\n" + " 131 122 125 1\n" + " 132 91 126 1\n" + " 133 126 127 1\n" + " 134 4 128 1\n" + " 135 128 129 1\n"; IChemModel model; using (var r = new Mol2Reader(new StringReader(problematicMol2))) { model = (IChemModel)r.Read(CDK.Builder.NewChemModel()); } Assert.IsNotNull(model); var containers = ChemModelManipulator.GetAllAtomContainers(model); Assert.AreEqual(1, containers.Count()); var molecule = containers.FirstOrDefault(); Assert.IsNotNull(molecule); Assert.AreEqual(129, molecule.Atoms.Count); Assert.AreEqual(135, molecule.Bonds.Count); foreach (var atom in molecule.Atoms) { Assert.IsNotNull(atom.AtomTypeName); } }