Dear OpenBabel users,
I am trying to write a piece of C++ code to generate conformers using the
OpenBabel API. My current code is mostly based on OB tutorials... not
really a big deal.
Almost everything seems to be working. The problem is with memory
allocation. When my function gets out of scope, it gives me a mem leak:
malloc: *** error for object 0x103300350: pointer being freed was not
allocated
*** set a breakpoint in malloc_error_break to debug.
which seems to be related to the object mol (OBMol mol).
I tried the dynamic allocation with new/delete and got exactly the same
thing when trying to delete the object mol in the second function below. No
problems when deleting the ref_mol object.
My initial guess was that I had to clear the conformers generated before
deleting the object. I then tried to use DeleteConformer function with no
success.
Any clues/ideas? They are all very welcome!
My OB version is 3.0.0 and my current OS is MacOS Sierra 10.12.6:
$g++ -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr
--with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Thanks in advance,
-Alessandro
OBMol Conformer::GetMol(const std::string &molfile){
OBMol mol;
OBConversion conv;
OBFormat *format = conv.FormatFromExt(molfile.c_str());
if (!format || !conv.SetInFormat(format)) {
printf("Could not find input format for file\n");
return mol;
}
ifstream ifs(molfile.c_str());
if (!ifs) {
printf("Could not open %s for reading\n", molfile.c_str());
return mol;
}
if (!conv.Read(&mol, &ifs)) {
printf("Could not read molecule from file\n");
return mol;
}
return mol;
}
******************************************************************
bool file_read;
OBMol mol = this->GetMol(molfile);
OBMol ref_mol = this->GetMol(molfile);
OBForceField* OBff;
if (Input->ligand_energy_model == "GAFF" or
Input->ligand_energy_model == "gaff"){
OBff = OBForceField::FindForceField("GAFF");
}
else {
OBff = OBForceField::FindForceField("MMFF94");
}
if (!OBff){
printf("Could not find OpenBabel FF parameters!\n");
exit(1);
}
OBff->Setup(mol);
mol.SetTotalCharge(mol.GetTotalCharge()); // necessary?
double energy = OBff->Energy();
if (OBff->GetUnit() == "kJ/mol"){ // Converting to kcal/mol,
if needed.
energy = energy/4.18;
}
Lig->conformer_energies.push_back(energy);
Lig->mcoords.push_back(Lig->xyz);
// Conformer
OBff->DiverseConfGen(0.5, 1000, 50.0, false);
OBff->GetConformers(mol);
if (mol.NumConformers() > 0){
for (int i=0; i<mol.NumConformers(); i++){
double* xyz = new double[mol.NumAtoms()*3];
vector<double> v3;
vector<vector<double> > xyz_tmp;
mol.SetConformer(i);
OBff->Setup(mol);
OBff->GetCoordinates(mol);
energy = OBff->Energy();
if (OBff->GetUnit() == "kJ/mol"){ // Converting to
kcal/mol, if needed.
energy = energy/4.18;
}
Lig->conformer_energies.push_back(energy);
OBAlign* align = new OBAlign;
align->SetRefMol(ref_mol);
align->SetTargetMol(mol);
align->Align();
align->UpdateCoords(&mol);
delete align;
xyz = mol.GetCoordinates();
for (unsigned j=0; j<mol.NumAtoms(); j++){
v3.push_back(xyz[3*j]);
v3.push_back(xyz[(3*j)+1]);
v3.push_back(xyz[(3*j)+2]);
xyz_tmp.push_back(v3);
v3.clear();
}
Lig->mcoords.push_back(xyz_tmp);
xyz_tmp.clear();
delete[] xyz;
}
file_read = true;
}
else {
file_read = false;
}
ref_mol.Clear();
mol.Clear();
return file_read;
--
********************************************************
Alessandro S. Nascimento
Professor
São Carlos Institute of Physics (IFSC)
University of São Paulo (USP)
E-mail: [email protected]
Phone: +55-16-3373-8709
********************************************************
_______________________________________________
OpenBabel-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openbabel-discuss