示例#1
0
        /// <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);
        }