Exemple #1
0
        /// <summary>
        /// 读取SDF文件中的内容,并赋值给List<SDFSection>对象。该功能通过Openbabel开源项目实现
        /// </summary>
        /// <param name="fileName">SDF文件名</param>
        /// <returns></returns>
        public static List <SDFSection> ReadSDF(string fileName)
        {
            List <SDFSection> result = new List <SDFSection>();

            OBConversion conv = new OBConversion();
            OBMol        mol  = new OBMol();

            conv.SetInFormat("sdf");
            conv.ReadFile(mol, fileName);

            do //遍历SDF文件并赋值
            {
                SDFSection section = new SDFSection();
                conv.SetOutFormat("mol");
                section.MolFile = conv.WriteString(mol);
                var data = mol.GetAllData(1);
                foreach (var d in data)
                {
                    if (d.GetOrigin().ToString() == "fileformatInput")
                    {
                        section.Properties.Add(new SDFProperty
                        {
                            Name  = d.GetAttribute(),
                            Value = d.GetValue(),
                        });
                    }
                }
                result.Add(section);
            } while (conv.Read(mol));

            return(result);
        }
        /// <summary>
        /// Calculates Hall-Kier alpha value for a molecule
        /// </summary>
        /// <param name="mol"></param>
        /// <returns></returns>
        public static double HallKierAlpha(this OBMol mol)
        {
            var accum = 0.0;

            foreach (var atom in mol.Atoms())
            {
                uint atomicNumber;
                try
                {
                    atomicNumber = atom.GetAtomicNum();
                }
                catch (Exception)
                {
                    continue;
                }
                double alpha;
                var    hkAlphas = AtomicConstants.GetHallKierAlphas(atomicNumber);
                if (hkAlphas != null)
                {
                    var hyb    = atom.Hybridization() - 2;
                    var length = hkAlphas.Length;
                    alpha = hyb < length ? (hkAlphas[hyb].HasValue ? hkAlphas[hyb].Value : hkAlphas[length - 1].Value) : hkAlphas[length - 1].Value;
                }
                else
                {
                    alpha = AtomicConstants.GetrVdW(atomicNumber) / AtomicConstants.GetrVdW(6) - 1;
                }
                accum += alpha;
            }
            return(accum);
        }
Exemple #3
0
        public static bool pairwiseangle(OBMol mol, ref double pangle)
        {
            VectorVecInt mapping = new VectorVecInt();

            if (findcarboxylates(mol, ref mapping))
            {
                double        sum    = 0;
                List <double> angles = new List <double>();
                if (mapping.Count > 1)
                {
                    OBAtom c1 = mol.GetAtom(mapping[0][1]);
                    OBAtom a1 = mol.GetAtom(mapping[0][3]);
                    OBAtom c2 = mol.GetAtom(mapping[1][1]);
                    OBAtom a2 = mol.GetAtom(mapping[1][3]);

                    pangle = pairwiseangle(c1, a1, c2, a2);
                    return(true);
                }
                else
                {
                    return(false);
                }
            }
            else
            {
                return(false);
            }
        }
Exemple #4
0
        public MolDescriptor(OBMol mol)
        {
            var newMol = new OBMol(mol);

            newMol.DeleteHydrogens();
            this._mol = new OBMolExtended(newMol);
        }
        public static void moltoCML(OBMol mol, string file)
        {
            OBConversion obconv = new OBConversion();

            obconv.SetOutFormat("cml");
            obconv.WriteFile(mol, file);
        }
Exemple #6
0
        /// <summary>
        /// 从2D生成3D坐标,支持SMILES和Mol文件格式
        /// </summary>
        /// <param name="molString">Mol文件或者SMILES</param>
        /// <returns>含有3D坐标的Mol文件</returns>
        public static string Generate3D(string molString)
        {
            OBConversion conversion = new OBConversion();
            OBMol        mol        = new OBMol();

            if (molString.TrimEnd().EndsWith("M  END"))
            {
                conversion.SetInFormat("mol");
            }
            else if (!molString.Trim().Contains(" "))
            {
                conversion.SetInFormat("smi");
            }
            else
            {
                throw new Exception("Wrong chemical file format !!");
            }

            conversion.SetOutFormat("mol");

            conversion.ReadString(mol, molString);

            OBBuilder builder = new OBBuilder();

            builder.Build(mol);

            return(conversion.WriteString(mol));
        }
        private void OpenStructure(string StName)
        {
            // Создаём OpenBabel объекты
            OBConversion obconv = new OBConversion();
            OBMol        mol    = Functions.ReadMoleculeFromFile(StName);

            obconv.SetOutFormat("_png2");
            obconv.AddOption("w", OBConversion.Option_type.OUTOPTIONS, panel1.Width.ToString());
            obconv.AddOption("h", OBConversion.Option_type.OUTOPTIONS, panel1.Height.ToString());

            string TempPic = Functions.TempFile();

            obconv.WriteFile(mol, TempPic); // Пишем картинку в temp // Это такое колдунство // Мне стыдно, но по-другому не выходит
            obconv.CloseOutFile();


            Bitmap bmp = new Bitmap(panel1.Width, panel1.Height);

            // Рисуем на панели
            panel1.BackgroundImage = bmp;

            Image    IM = Image.FromFile(TempPic);
            Graphics g  = Graphics.FromImage(panel1.BackgroundImage);

            g.DrawImage(IM, 0, 0);
            IM.Dispose();
            g.Dispose();
            panel1.Invalidate();

            // Высчитываем параметры
            label3.Text = "Молярная масса: " + Math.Round(mol.GetExactMass(), 4);
            label4.Text = "Брутто-формула: " + mol.GetFormula();
        }
        /// <summary>
        /// Chi1v atomic valence connectivity index (order 0)
        /// </summary>
        /// <param name="mol"></param>
        /// <returns></returns>
        public static double Chi1v(this OBMol mol)
        {
            var deltas = mol.HkDeltas(false);

            return(mol.Bonds().Where(b => deltas[b.GetBeginAtomIdx() - 1] * deltas[b.GetEndAtomIdx() - 1] > 0)
                   .Select(b => Math.Sqrt(1 / (double)(deltas[b.GetBeginAtomIdx() - 1] * deltas[b.GetEndAtomIdx() - 1]))).Sum());
        }
        public static double EstimateProperty(OBMol mol, string propName)
        {
            if (!obDesc.Keys.Contains(propName))
                obDesc[propName] = OBDescriptor.FindType(propName);

            return obDesc[propName].Predict(mol);
        }
        public static OBMol obminimizeUFF(OBMol mol, double crit, int steps)
        {
            bool   sd        = false;
            bool   cut       = false;
            bool   newton    = false;
            bool   hydrogens = true;
            double rvdw      = 6.0;
            double rele      = 10.0;
            int    freq      = 10;
            //var watch = Stopwatch.StartNew();
            OBForceField ff = OBForceField.FindForceField("UFF");

            //watch.Stop();
            //watch.Start();
            ff.Setup(mol);
            ff.SetVDWCutOff(rvdw);
            ff.SetElectrostaticCutOff(rele);
            ff.SetUpdateFrequency(freq);
            ff.EnableCutOff(cut);
            ff.ConjugateGradientsInitialize(steps, crit);
            bool done = true;

            while (done)
            {
                done = ff.ConjugateGradientsTakeNSteps(1);
                //ff.GetCoordinates(mol);
            }

            ff.GetCoordinates(mol);
            //watch.Stop();//doesn't look like there is much I can do to optimize this, energy minimization just takes time
            return(mol);
        }
        public void DistanceMatrixTest()
        {
            var converter = new OBConversion();

            converter.SetInFormat("smi");
            var mol = new OBMol();

            converter.ReadString(mol, "CC=C");
            var dMat = new FloydWarshall(mol, false, false).DistanceMatrix;

            Assert.AreEqual(0d, dMat.Get(0, 0));
            Assert.AreEqual(1d, dMat.Get(0, 1));
            Assert.AreEqual(2d, dMat.Get(0, 2));
            Assert.AreEqual(1d, dMat.Get(1, 0));
            Assert.AreEqual(0d, dMat.Get(1, 1));
            Assert.AreEqual(1d, dMat.Get(1, 2));
            Assert.AreEqual(2d, dMat.Get(2, 0));
            Assert.AreEqual(1d, dMat.Get(2, 1));
            Assert.AreEqual(0d, dMat.Get(2, 2));

            dMat = new FloydWarshall(mol, true, false).DistanceMatrix;
            Assert.AreEqual(0d, dMat.Get(0, 0));
            Assert.AreEqual(1d, dMat.Get(0, 1));
            Assert.AreEqual(1.5, dMat.Get(0, 2));
            Assert.AreEqual(1d, dMat.Get(1, 0));
            Assert.AreEqual(0d, dMat.Get(1, 1));
            Assert.AreEqual(0.5, dMat.Get(1, 2));
            Assert.AreEqual(1.5, dMat.Get(2, 0));
            Assert.AreEqual(0.5, dMat.Get(2, 1));
            Assert.AreEqual(0d, dMat.Get(2, 2));
        }
        public OBMol quickMinimization(OBMol mol, string coeff, string lmpdat, bool periodic)
        {
            double etol    = 0.0;
            double ftol    = 1.0e-6;
            int    maxiter = 40000;
            int    maxeval = 20000;
            double padding = 50;

            lammps.LAMMPSsettings minSettings = new lammps.LAMMPSsettings();
            if (periodic)
            {
                minSettings.boundary = "p p p";
                padding = 0;
            }

            moltoUFF(mol, coeff, lmpdat, false, padding);

            ///graphconverter.designgraphtoUFF(child, iodir + coeff, iodir + lmpdat, false);

            //LAMMPSinstance lammps = new LAMMPSinstance(iodir + data, lmpSettings);//, &lmpptr);
            lammps lmps = new lammps(minSettings);

            lmps.runCommand("read_data " + lmpdat);

            lmps.openFile(coeff);
            lmps.minimize(etol, ftol, maxiter, maxeval, "cg");
            double[,] pos = lmps.getAtomPos();
            OBFunctions.updatexyz(mol, pos);
            return(mol);
        }
Exemple #13
0
//        public static bool isInCone(OBVector3 x, OBVector3 apex, OBVector3 axis, double aperture )
//        {
//            //got it from here:http://stackoverflow.com/questions/10768142/verify-if-point-is-inside-a-cone-in-3d-space
//            //test if point x is inside an infinite cone defined by apex point with normal vector axis and aperture angle(in radians)
//            double halfAperture=aperture/2;
//            OBVector3 apexToXVect = OBVector3(apex,x);
//            OBVector3.
//            bool insideCone = StarMath.dotProduct(apex,axis)/StarMath.norm2(apexToXVect)/StarMath.norm2(axis) > Math.Cos(aperture);
//            return insideCone;
//        }
        public static bool atomsInCarboxylateCone(OBAtom a, OBAtom carba, OBMol mol)
        {
            //angle should probably not be hardcoded
            double aperture = 120 * Math.PI / 180;

            double[] axis = obvec2dubs(OBVector3.Sub(carba.GetVector(), a.GetVector()));
            //axis = StarMath.divide (axis, StarMath.norm2 (axis));
            double[]    apex    = obvec2dubs(carba.GetVector());
            List <uint> exclude = new List <uint>();

            exclude.Add(carba.GetIdx());
            foreach (OBBond b in carba.Bonds())
            {
                OBAtom other = b.GetNbrAtom(carba);
                if (other != a)
                {
                    exclude.Add(other.GetIdx());
                }
            }
            foreach (OBAtom n in mol.Atoms())
            {
                if (!exclude.Contains(n.GetIdx()))
                {
                    double[] x = obvec2dubs(n.GetVector());
                    //if any point is found to be in the carboxylate's cone, return true
                    if (isInCone(x, apex, axis, aperture))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
Exemple #14
0
        public static bool carboxylatesBlocked(OBMol mol, OBAtom aA, OBAtom carbA, OBAtom aB, OBAtom carbB)
        {
            bool inCone = OBFunctions.atomsInCarboxylateCone(aA, carbA, mol);

            inCone = inCone || OBFunctions.atomsInCarboxylateCone(aB, carbB, mol);
            return(inCone);
        }
        /// <summary>
        /// Computes the number of fragments in molecule given a SMARTS pattern
        /// </summary>
        /// <param name="mol"></param>
        /// <param name="pattern">SMARTS pattern (string)</param>
        /// <returns></returns>
        public static int SmartPatternCount(this OBMol mol, string pattern)
        {
            var sp = new OBSmartsPattern();

            sp.Init(pattern);
            sp.Match(mol);
            return(sp.GetUMapList().Count);
        }
Exemple #16
0
        public static double radial_weight(OBMol mol, OBAtom carbon1, OBAtom a1)
        {
            OBVector3 compos = mol_com(mol);
            OBVector3 v2     = carbon1.GetVector();
            OBVector3 v3     = a1.GetVector();

            return(openbabel_csharp.Point2Line(compos, v2, v3));
        }
Exemple #17
0
        /// <summary>
        /// 从MolFile格式生成Openbabel的OBMol对象
        /// </summary>
        /// <param name="molfile">Mol文件格式的字符串</param>
        /// <returns>OBMol对象</returns>
        public static OBMol LoadMolFromMolfile(string molfile)
        {
            OBConversion conversion = new OBConversion();
            OBMol        mol        = new OBMol();

            conversion.SetInFormat("mol");
            conversion.ReadString(mol, molfile);
            return(mol);
        }
Exemple #18
0
 static void Main(string[] args)
 {
     OBConversion obconv = new OBConversion();
     obconv.SetInFormat("smi");
     OBMol mol = new OBMol();
     obconv.ReadString(mol, "CCC");
     System.Console.WriteLine(mol.GetMolWt());
     //System.Console.ReadKey();
 }
Exemple #19
0
        /// <summary>
        /// 从SMILES格式生成Openbabel的OBMol对象
        /// </summary>
        /// <param name="smiles">SMILES格式的字符串</param>
        /// <returns>OBMol对象</returns>
        public static OBMol LoadMolFromSmiles(string smiles)
        {
            OBConversion conversion = new OBConversion();
            OBMol        mol        = new OBMol();

            conversion.SetInFormat("smi");
            conversion.ReadString(mol, smiles);
            return(mol);
        }
Exemple #20
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);
        }
Exemple #21
0
        /// <summary>
        /// Проверка соответствия молекулы паттерну.
        /// </summary>
        /// <param name="Mol"></param>
        /// <param name="DB_Mol"></param>
        /// <returns></returns>
        private bool CheckMol(string Mol, string DB_Mol)
        {
            DataBase.Log($"Получены молекула {DB_Mol} и паттерн {Mol}");
            DataBase.Log($"Формирование объектов для сравнения");
            // Создаём объекты OpenBabel
            OBSmartsPattern SP     = null;
            OBConversion    obconv = null;
            OBMol           mol    = null;

            try
            {
                SP     = new OBSmartsPattern();
                obconv = new OBConversion();
                obconv.SetInFormat("smi");
                mol = new OBMol();
                obconv.ReadString(mol, Mol);
                obconv.SetOutFormat("smi");
                DataBase.Log($"Объекты сформированы");
            }
            catch (Exception e)
            {
                DataBase.Log($"Объекты не сформированы: причина {e.Message}");
            }


            string Temp = obconv.WriteString(mol);

            DataBase.Log($"Обработанный паттерн {Temp}");
            if (!mol.DeleteHydrogens())
            {
                Console.WriteLine("DeleteHidrogens() failed!");
            }
            ;                                                                                 //Убираем все водороды
            DataBase.Log($"Водороды убраны");

            string SubMol = System.Text.RegularExpressions.Regex.Replace(obconv.WriteString(mol), "[Hh ]", ""); //Убираем все водороды

            SP.Init(SubMol);                                                                                    //Задаём структуру поиска в SMARTS
            DataBase.Log($"Инициализация поиска по паттерну {SubMol}");

            obconv.SetInFormat("smi");
            obconv.ReadString(mol, DB_Mol); //Добавляем структуру из БД
            SP.Match(mol);                  //Сравниваем
            DataBase.Log($"Сравнение прошло");
            VectorVecInt Vec = SP.GetUMapList();

            DataBase.Log($"Число совпадений {Vec.Count}");
            if (Vec.Count > 0)
            {
                return(true);
            }
            else
            {
                return(false);
            };                                                          //Возвращаем результат
        }
        public List <int> moltoUFFPeriodic(OBMol mol, string coefficientfilename, string datafilename, int x_rep, int y_rep, int z_rep)
        {
            LAMMPSNow lammpssetup = new LAMMPSNow(parameters, atomtypes, periodictable);


            lammpssetup.setupUFFPeriodic(mol, coefficientfilename, datafilename, x_rep, y_rep, z_rep);
            List <int> esequence = lammpssetup.getesequence();

            return(esequence);
        }
        public List <int> moltoUFF_azo(OBMol mol, string coefficientfilename, string datafilename, double padding)
        {
            LAMMPSNow lammpssetup = new LAMMPSNow(parameters, atomtypes, periodictable);

            lammpssetup.setupUFF(mol, padding);
            lammpssetup.setupcalculationsUFF_azobenzene(mol, coefficientfilename, datafilename);
            List <int> esequence = lammpssetup.getesequence();

            return(esequence);
        }
        public void designgraphtoCML(designGraph host, string filename)
        {
            OBConversion obconv = new OBConversion();

            obconv.SetOutFormat("cml");
            OBMol mol = new OBMol();

            OBFunctions.designgraphtomol(host, ref mol);
            obconv.WriteFile(mol, filename);
        }
        public static OBMol contingencyminimization(OBMol mol)
        {
            OBForceField uff = OBForceField.FindForceField("UFF");

            //uff.ParseParamFile();
            uff.SetLogLevel(1);
            uff.Setup(mol);
            uff.ConjugateGradients(10);
            return(mol);
        }
        /// <summary>
        /// Performs a mol copy and adds explicit hydrogens to each heavy atom to the copy
        /// </summary>
        /// <param name="mol"></param>
        /// <returns>Copy of original mol with explicit hydrogens</returns>
        public static OBMol AddExplicitHydrogens(this OBMol mol)
        {
            var newMol = new OBMol(mol);

            foreach (var atom in newMol.Atoms())
            {
                newMol.AddHydrogens(atom);
            }
            return(newMol);
        }
Exemple #27
0
        /// <summary>
        /// Mol文件格式转换成SMILES格式
        /// </summary>
        /// <param name="molFile">Mol</param>
        /// <returns>SMILES</returns>
        public static string ConvertMolFileToSmiles(string molFile)
        {
            OBConversion conversion = new OBConversion();
            OBMol        mol        = new OBMol();

            conversion.SetInFormat("mol");
            conversion.ReadString(mol, molFile);
            conversion.SetOutFormat("smi");
            return(conversion.WriteString(mol));
        }
Exemple #28
0
        /// <summary>
        /// Calculate the angle between 2 carboxylates
        /// </summary>
        public static double CalAngle(OBMol mol)
        {
            var mapping = OBFunctions.findcarboxylates(mol);
            var carbA   = mol.GetAtom(mapping[0][1]); // carbon in carboxylate
            var aA      = mol.GetAtom(mapping[0][3]); // atom that the carbon connects to
            var carbB   = mol.GetAtom(mapping[1][1]);
            var aB      = mol.GetAtom(mapping[1][3]);
            var pAngle  = OBFunctions.pairwiseangle(carbA, aA, carbB, aB); // angle between carboxylates

            return(pAngle);
        }
        public static string moltoSMILES(OBMol mol)
        {
            OBConversion obconv = new OBConversion();

            obconv.SetOutFormat("can");
            string smi = obconv.WriteString(mol);

            smi = smi.Replace("\t", "");
            smi = smi.Replace("\n", "");
            return(smi);
        }
        /// <summary>
        /// Assigns Gasteiger partial charges to molecule
        /// </summary>
        /// <returns>OBMol with Gasteiger partial charges assigned</returns>
        public static OBMol AssignGasteigerCharges(this OBMol mol)
        {
            var newMol = mol.AddExplicitHydrogens();

            newMol.UnsetPartialChargesPerceived();
            foreach (var atom in newMol.Atoms())
            {
                atom.GetPartialCharge();
            }
            return(newMol);
        }
Exemple #31
0
        public static VectorVecInt findcarboxylates(OBMol mol)
        {
            //finds carboxylates and returns a mapping, mapping must be initialized
            OBSmartsPattern findcbxl = new OBSmartsPattern();

            findcbxl.Init("[#8]=[#6](-[#8])-*"); //find the carboxylate

            var mapping = new VectorVecInt();

            findcbxl.Match(mol, mapping, OBSmartsPattern.MatchType.AllUnique);
            return(mapping);
        }
Exemple #32
0
        //functions for evaluating

        public static bool findcarboxylates(OBMol mol, ref VectorVecInt mapping)
        {
            //finds carboxylates and returns a mapping, mapping must be initialized
            OBSmartsPattern
                  findcbxl =
                new OBSmartsPattern();           //initialization is sufficiently fast that we do not need to worry about initializing an obsmartspattern and keeping it around

            findcbxl.Init("[#8]=[#6](-[#8])-*"); //find the carboxylate


            return(findcbxl.Match(mol, mapping, OBSmartsPattern.MatchType.AllUnique));
        }
 public static string Estimate(OBMol mol, params string[] propNames)
 {
     return OBDescriptor.GetValues(mol, "");
 }