/// <summary> /// Private method that actually parses the input to read a <see cref="IChemFile"/> object. /// </summary> /// <param name="file">the file to read from</param> /// <returns>A ChemFile containing the data parsed from input.</returns> private IChemFile ReadChemFile(IChemFile file) { IChemSequence chemSequence = file.Builder.NewChemSequence(); int number_of_atoms; try { string line = input.ReadLine(); while (line.StartsWithChar('#')) { line = input.ReadLine(); } // while (input.Ready() && line != null) { // Debug.WriteLine("lauf"); // parse frame by frame string token = Strings.Tokenize(line, '\t', ' ', ',', ';')[0]; number_of_atoms = int.Parse(token, NumberFormatInfo.InvariantInfo); string info = input.ReadLine(); IChemModel chemModel = file.Builder.NewChemModel(); var setOfMolecules = file.Builder.NewAtomContainerSet(); IAtomContainer m = file.Builder.NewAtomContainer(); m.Title = info; string[] types = new string[number_of_atoms]; double[] d = new double[number_of_atoms]; int[] d_atom = new int[number_of_atoms]; // Distances double[] a = new double[number_of_atoms]; int[] a_atom = new int[number_of_atoms]; // Angles double[] da = new double[number_of_atoms]; int[] da_atom = new int[number_of_atoms]; // Diederangles //Vector3[] pos = new Vector3[number_of_atoms]; // calculated positions int i = 0; while (i < number_of_atoms) { line = input.ReadLine(); // Debug.WriteLine("line:\""+line+"\""); if (line == null) { break; } if (line.StartsWithChar('#')) { // skip comment in file } else { d[i] = 0d; d_atom[i] = -1; a[i] = 0d; a_atom[i] = -1; da[i] = 0d; da_atom[i] = -1; var tokens = Strings.Tokenize(line, '\t', ' ', ',', ';'); int fields = int.Parse(tokens[0], NumberFormatInfo.InvariantInfo); if (fields < Math.Min(i * 2 + 1, 7)) { // this is an error but cannot throw exception } else if (i == 0) { types[i] = tokens[1]; i++; } else if (i == 1) { types[i] = tokens[1]; d_atom[i] = int.Parse(tokens[2], NumberFormatInfo.InvariantInfo) - 1; d[i] = double.Parse(tokens[3], NumberFormatInfo.InvariantInfo); i++; } else if (i == 2) { types[i] = tokens[1]; d_atom[i] = int.Parse(tokens[2], NumberFormatInfo.InvariantInfo) - 1; d[i] = double.Parse(tokens[3], NumberFormatInfo.InvariantInfo); a_atom[i] = int.Parse(tokens[4], NumberFormatInfo.InvariantInfo) - 1; a[i] = double.Parse(tokens[5], NumberFormatInfo.InvariantInfo); i++; } else { types[i] = tokens[1]; d_atom[i] = int.Parse(tokens[2], NumberFormatInfo.InvariantInfo) - 1; d[i] = double.Parse(tokens[3], NumberFormatInfo.InvariantInfo); a_atom[i] = int.Parse(tokens[4], NumberFormatInfo.InvariantInfo) - 1; a[i] = double.Parse(tokens[5], NumberFormatInfo.InvariantInfo); da_atom[i] = int.Parse(tokens[6], NumberFormatInfo.InvariantInfo) - 1; da[i] = double.Parse(tokens[7], NumberFormatInfo.InvariantInfo); i++; } } } // calculate cartesian coordinates var cartCoords = ZMatrixTools.ZMatrixToCartesian(d, d_atom, a, a_atom, da, da_atom); for (i = 0; i < number_of_atoms; i++) { m.Atoms.Add(file.Builder.NewAtom(types[i], cartCoords[i])); } // Debug.WriteLine("molecule:"+m); setOfMolecules.Add(m); chemModel.MoleculeSet = setOfMolecules; chemSequence.Add(chemModel); line = input.ReadLine(); file.Add(chemSequence); } catch (IOException) { // should make some noise now file = null; } return(file); }