/// <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); }
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); } }
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); }
/// <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); }
// 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); }
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); }
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)); }
/// <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); }
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(); }
/// <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); }
/// <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); }
/// <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); }
/// <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)); }
/// <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); }
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); }
//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, ""); }