Пример #1
0
        /// <summary>
        /// A variant which returns an OBMol based on host.
        /// </summary>
        /// <param name="host"></param>
        /// <returns></returns>
        public static OBMol designgraphtomol(designGraph host)
        {
            var mol = new OBMol();
            Dictionary <string, int> nodeatomlookup = new Dictionary <string, int>(); //dictionary for looking up which nodes go to which atoms by their names
            int i = 0;

            foreach (node n in host.nodes)
            {
                OBAtom atom = new OBAtom();
                double x    = scale * n.X;
                double y    = scale * n.Y;
                double z    = scale * n.Z; //set coordinates of atom
                atom.SetVector(x, y, z);
                n.localLabels.Sort();
                foreach (string label in n.localLabels)
                {
                    if (label.Length < 4)
                    {
                        if (label != "sp2" && label != "sp3")       ///so openbabel gets less crap
                        {
                            atom.SetAtomicNum(elementTabel[label]); //set atomic number
                            break;
                        }
                    }
                }
                i++;

                nodeatomlookup.Add(n.name, i); //add the atom to dictionary and mol
                mol.AddAtom(atom);
            }
            foreach (arc a in host.arcs)
            {
                int  bondorder = 0;
                bool hassingle = a.localLabels.Contains("s");
                bool hasdouble = a.localLabels.Contains("d");
                bool hastriple = a.localLabels.Contains("t"); //bonds will probably not be anything other than single, double, or triple
                //although we could have dative bonds
                if (hassingle ^ hasdouble ^ hastriple)        //we do not want more than one bond type
                {
                    if (hassingle)
                    {
                        bondorder = 1;
                    }
                    if (hasdouble)
                    {
                        bondorder = 2;
                    }
                    if (hastriple)
                    {
                        bondorder = 3;
                    }
                }
                mol.AddBond(nodeatomlookup[a.To.name], nodeatomlookup[a.From.name], bondorder);
            }
            return(mol);
        }
Пример #2
0
        public static void trajectoryFrameToCIF(string frame, string outFile, List <int> esequence,
                                                OBConversion obconv)
        {
            //converts a frame from the above function into a CIF file
            //lammps trajectory files have unit cell dimension data for every frame
            //requires an element sequence for identifying element type from lammps atom types
            OBUnitCell  uc  = new OBUnitCell();
            OBMol       mol = new OBMol();
            OBMatrix3x3 mat = new OBMatrix3x3();

            using (StringReader reader = new StringReader(frame)) {
                string line        = "";
                bool   foundMatrix = false;

                do
                {
                    line = reader.ReadLine();
                    if (line.Contains("BOX BOUNDS"))
                    {
                        //data from lammps is in this format
                        //ITEM: BOX BOUNDS xy xz yz
                        //xlo_bound xhi_bound xy
                        //ylo_bound yhi_bound xz
                        //zlo_bound zhi_bound yz
                        string row0 = reader.ReadLine();

                        double[] row0d = OBFunctions.spacedStringToDoubleArray(row0);
                        double   xlo   = row0d[0];

                        double xhi = row0d[1];
                        double xy  = row0d[2];

                        string   row1  = reader.ReadLine();
                        double[] row1d = OBFunctions.spacedStringToDoubleArray(row1);
                        double   ylo   = row1d[0];
                        double   yhi   = row1d[1];
                        double   xz    = row1d[2];


                        string   row2  = reader.ReadLine();
                        double[] row2d = OBFunctions.spacedStringToDoubleArray(row2);
                        double   zlo   = row2d[0];
                        double   zhi   = row2d[1];
                        double   yz    = row2d[2];


                        //adjust box bounds, taken from VMD's source for reading lammps files

                        double xdelta = Math.Min(0, xy);
                        xdelta = Math.Min(xdelta, xz);
                        xdelta = Math.Min(xdelta, xy + xz);
                        xlo    = xlo - xdelta;
                        xdelta = Math.Max(0, xy);
                        xdelta = Math.Max(xdelta, xz);
                        xdelta = Math.Max(xdelta, xy + xz);
                        xhi    = xhi - xdelta;
                        ylo    = ylo - Math.Min(0, yz);
                        yhi    = yhi - Math.Max(0, yz);
                        OBVector3 A = new OBVector3(xhi - xlo, 0, 0);
                        OBVector3 B = new OBVector3(xy, yhi - ylo, 0);
                        OBVector3 C = new OBVector3(xz, yz, zhi - zlo);
                        //OBVector3 A = new OBVector3 (xhi-xlo, xy, xz);
                        //OBVector3 B = new OBVector3 (0, yhi-ylo, yz);
                        //OBVector3 C= new OBVector3 (0, 0, zhi-zlo);
                        mat = new OBMatrix3x3(A, B, C);
                        uc.SetData(A, B, C);

                        foundMatrix = true;
                    }
                } while (!foundMatrix);
                //uc.SetData (mat);
                bool foundAtoms = false;
                do
                {
                    line = reader.ReadLine();
                    if (line.Contains("ITEM: ATOMS"))
                    {
                        foundAtoms = true;
                    }
                } while (!foundAtoms);

                while ((line = reader.ReadLine()) != null)
                {
                    string[] splitline  = line.Split((char[])null, StringSplitOptions.RemoveEmptyEntries);
                    int      lammpstype = Convert.ToInt32(splitline[1]) - 1;
                    int      atype      = esequence[lammpstype];
                    OBAtom   a          = new OBAtom();
                    a.SetAtomicNum(atype);
                    //position in fraction coordinates
                    OBVector3 fvec = new OBVector3(Convert.ToDouble(splitline[3]), Convert.ToDouble(splitline[4]),
                                                   Convert.ToDouble(splitline[5]));
                    //OBVector3 fvec = new OBVector3 (Convert.ToDouble (splitline [2]), Convert.ToDouble (splitline [3]), Convert.ToDouble (splitline [4]));
                    //convert to cartesian.
                    OBVector3 cvec = uc.FractionalToCartesian(fvec);
                    a.SetVector(cvec);
                    mol.AddAtom(a);
                }

                mol.CloneData(uc);
                obconv.SetOutFormat("cif");
                obconv.AddOption("b");
                obconv.WriteFile(mol, outFile);
            }
        }
        public static bool designgraphtomol(designGraph host, ref OBMol mol)
        {
            OBElementTable periodictable = new OBElementTable();

            //OBMol mol = new OBMol();
            Dictionary <string, int>
            nodeatomlookup =
                new Dictionary <string, int>();    //dictionary for looking up which nodes go to which atoms by their names
            int i = 0;

            foreach (node n in host.nodes)
            {
                OBAtom atom = new OBAtom();

                double x = scale * n.X;
                double y = scale * n.Y;
                double z = scale * n.Z; //set coordinates of atom
                atom.SetVector(x, y, z);
                int anum = 0;
                n.localLabels.Sort();
                foreach (string label in n.localLabels)
                {
                    if (label.Length < 4)
                    {
                        if (label != "sp2" && label != "sp3") ///so openbabel gets less crap
                        {
                            anum = periodictable.GetAtomicNum(label);
                            if (anum > 0)
                            {
                                break;
                            }
                        }
                    }
                }
                i++;
                atom.SetAtomicNum(anum);       //set atomic number
                nodeatomlookup.Add(n.name, i); //add the atom to dictionary and mol
                mol.AddAtom(atom);
            }
            foreach (arc a in host.arcs)
            {
                OBBond bond      = new OBBond();
                int    bondorder = 0;
                bool   hassingle = a.localLabels.Contains("s");
                bool   hasdouble = a.localLabels.Contains("d");
                bool   hastriple =
                    a.localLabels
                    .Contains("t");                    //bonds will probably not be anything other than single, double, or triple
                //although we could have dative bonds
                if (hassingle ^ hasdouble ^ hastriple) //we do not want more than one bond type
                {
                    if (hassingle)
                    {
                        bondorder = 1;
                    }
                    if (hasdouble)
                    {
                        bondorder = 2;
                    }
                    if (hastriple)
                    {
                        bondorder = 3;
                    }
                }
                mol.AddBond(nodeatomlookup[a.To.name], nodeatomlookup[a.From.name], bondorder);
//                OBAtom begin = nodeatomlookup[a.From.name];
//                OBAtom end = nodeatomlookup[a.To.name];
//                bond.SetBegin(begin);
//                bond.SetEnd(end);
//                bond.SetBondOrder(bondorder);
//                mol.AddBond(bond);
//                mol.Bonds();
            }

            //mol.FindRingAtomsAndBonds();

            return(true);
        }