Hi
I struggle for getting OBFF parameters again.
In the following example code, a OBForceField instance (pFF) was
down-casted on a new-defined class (ffpGaff)
making an instance (pP).
This works well in some cases, but an exception is thrown in other cases.
Any idea instead of this would be greatly appreciated.
Thanks in advance.
// *****************************************************
// an example code
#include <openbabel/base.h>
#include <openbabel/mol.h>
#include <openbabel/obconversion.h>
#include <openbabel/forcefield.h>
#include <openbabel/forcefields/forcefieldgaff.h>
using namespace std;
using namespace OpenBabel;
// bond parameter
struct bondKind
{
char aT1[3]; // atom Type 1,
char aT2[3]; // atom Type 2,
double Kb; // force constant (kcal/mol).
double req; // equibrium distance (A).
};
// angle parameter
struct angleKind
{
char aT1[3]; // atom Type 1
char aT2[3]; // atom Type 2
char aT3[3]; // atom Type 3
double Kth; // constant of bending motion (kcal/(mol radian^2))
double theq; // equibrium angle (degree)
};
// torsion parameter
struct torKind
{
char aT1[3];
char aT2[3];
char aT3[3];
char aT4[3];
int m; // number of bond paths. ignoired.
double vn2;
double gamma; // phase
double n; // the periodicity of torsion (multiplicity)
};
// out-of-plane motion parameter
struct oopKind
{
char aT1[3];
char aT2[3];
char aT3[3];
char aT4[3];
double vn2; // equals to Kchi for charmm pot (kcal/mol)
double gamma; // equals to delta for charmm pot (degree)
double n; // the periodicity of torsion
};
// non-bonding (vdW) parameter
struct nbKind
{
char aT[3];
double R;
double eps;
};
// a new-defined class
class ffpGaff : public OBForceFieldGaff
{
public:
vector<bondKind> bkmol;
vector<angleKind> akmol;
vector<torKind> tkmol;
vector<oopKind> okmol;
vector<nbKind> nkmol;
void getBkmol( void )
{
if( &( _bondcalculations ) == NULL) return;
bkmol.clear();
vector<OBFFBondCalculationGaff>::iterator i;
for (i = _bondcalculations.begin(); i != _bondcalculations.end(); ++i)
{
bondKind tempBk;
strcpy( tempBk.aT1, (*i).a->GetType() );
strcpy( tempBk.aT2, (*i).b->GetType() );
tempBk.Kb = (*i).kr / KCAL_TO_KJ ;
tempBk.req = (*i).r0;
bkmol.push_back( tempBk );
}
}
void getAkmol( void )
{
if( &( _anglecalculations ) == NULL ) return;
akmol.clear();
vector<OBFFAngleCalculationGaff>::iterator i;
for (i = _anglecalculations.begin(); i != _anglecalculations.end(); ++i)
{
angleKind tempAk;
strcpy( tempAk.aT1, (*i).a->GetType() );
strcpy( tempAk.aT2, (*i).b->GetType() );
strcpy( tempAk.aT3, (*i).c->GetType() );
tempAk.Kth = (*i).kth / KCAL_TO_KJ;
tempAk.theq = (*i).theta0;
akmol.push_back( tempAk );
}
}
void getTkmol( void )
{
if( &( _torsioncalculations ) == NULL ) return;
tkmol.clear();
vector<OBFFTorsionCalculationGaff>::iterator i;
for (i = _torsioncalculations.begin(); i != _torsioncalculations.end();
++i)
{
torKind tempTk;
strcpy( tempTk.aT1, (*i).a->GetType() );
strcpy( tempTk.aT2, (*i).b->GetType() );
strcpy( tempTk.aT3, (*i).c->GetType() );
strcpy( tempTk.aT4, (*i).d->GetType() );
tempTk.m = 0;
tempTk.vn2 = (*i).vn_half / KCAL_TO_KJ;
tempTk.gamma = (*i).gamma;
tempTk.n = (*i).n;
tkmol.push_back( tempTk );
}
}
void getOkmol( void )
{
if( &( _oopcalculations ) == NULL ) return;
okmol.clear();
vector<OBFFOOPCalculationGaff>::iterator i;
for (i = _oopcalculations.begin(); i != _oopcalculations.end(); ++i)
{
oopKind tempOk;
strcpy( tempOk.aT1, (*i).a->GetType() );
strcpy( tempOk.aT2, (*i).b->GetType() );
strcpy( tempOk.aT3, (*i).c->GetType() );
strcpy( tempOk.aT4, (*i).d->GetType() );
tempOk.vn2 = (*i).vn_half / KCAL_TO_KJ;
tempOk.gamma = (*i).gamma;
tempOk.n = (*i).n;
okmol.push_back( tempOk );
}
}
void getNkmol( void )
{
if( &( _ffvdwparams ) == NULL ) return;
nkmol.clear();
for (int i = 0; i < _ffvdwparams.size() ; i++ )
{
nbKind tempNk;
strcpy( tempNk.aT, _ffvdwparams[i]._a.c_str() );
FOR_ATOMS_OF_MOL( a, _mol )
{
char* aType = a->GetType();
if( aType != NULL && strcmp( aType, tempNk.aT ) == 0)
{
tempNk.R = _ffvdwparams[i]._dpar[0];
tempNk.eps = _ffvdwparams[i]._dpar[1];
nkmol.push_back( tempNk );
}
}
}
}
};
// Execute as >program_name molecular_file_name
int main( int argc, char* argv[] )
{
char *program_name= argv[0];
string basename, filename = "", ff = "GAFF";
basename = filename = argv[1];
size_t extPos = filename.rfind('.');
if (extPos != string::npos)
{ basename = filename.substr(0, extPos); }
// Find Input filetype
OBConversion conv;
OBFormat *format_in = conv.FormatFromExt(filename.c_str());
if (!format_in || !conv.SetInFormat(format_in))
{
cout << program_name << ": cannot read input/output format!" << endl;
return -1;
}
ifstream ifs;
// Read the file
ifs.open(filename.c_str());
if (!ifs)
{
cout << program_name << ": cannot read input file!" << endl;
return -1;
}
OBMol mol;
mol.Clear();
if (!conv.Read(&mol, &ifs))
return -1;
if (mol.Empty())
return -1;
OBForceField* pFF = OBForceField::FindForceField(ff);
if (!pFF)
{
cout << program_name << ": could not find forcefield '" << ff << "'." <<
endl;
return -1;
}
mol.AddHydrogens(false, true); // hydrogens must be added before Setup(mol)
is called
if (!pFF->Setup(mol))
{
cout << program_name << ": could not setup force field." << endl;
return -1;
}
ffpGaff* pP = static_cast<ffpGaff*>(pFF); // down-casting
// ffpGaff* pP = dynamic_cast<ffpGaff*>(pFF); // pP is always NULL for
dynamic_cast
if( pP == NULL ) return -1;
// bond stretching
pP->getBkmol();
if( pP->bkmol.empty() ) return -1;
cout << "GAFF bond stretching parameters" << endl;
for( int i = 0 ; i < pP->bkmol.size(); i++ )
{
cout << pP->bkmol[i].aT1 << " "
<< pP->bkmol[i].aT2 << " "
<< pP->bkmol[i].Kb << " "
<< pP->bkmol[i].req << endl;
}
// angle bending
pP->getAkmol();
if( pP->akmol.empty() ) return -1;
cout << "GAFF angle bending parameters" << endl;
for( int i = 0 ; i < pP->akmol.size(); i++ )
{
cout << pP->akmol[i].aT1 << " "
<< pP->akmol[i].aT2 << " "
<< pP->akmol[i].aT3 << " "
<< pP->akmol[i].Kth << " "
<< pP->akmol[i].theq << endl;
}
// torsional motion
pP->getTkmol();
if( pP->tkmol.empty() ) return -1;
cout << "GAFF torsional parameters" << endl;
for( int i = 0 ; i < pP->tkmol.size(); i++ )
{
cout << pP->tkmol[i].aT1 << " "
<< pP->tkmol[i].aT2 << " "
<< pP->tkmol[i].aT3 << " "
<< pP->tkmol[i].aT4 << " "
<< pP->tkmol[i].vn2 << " "
<< pP->tkmol[i].gamma << " "
<< pP->tkmol[i].n << endl;
}
// out-of-plane motion
pP->getOkmol();
if( pP->okmol.empty() ) return -1;
cout << "GAFF out-of-plane motion parameters" << endl;
for( int i = 0 ; i < pP->okmol.size(); i++ )
{
cout << pP->okmol[i].aT1 << " "
<< pP->okmol[i].aT2 << " "
<< pP->okmol[i].aT3 << " "
<< pP->okmol[i].aT4 << " "
<< pP->okmol[i].vn2 << " "
<< pP->okmol[i].gamma << " "
<< pP->okmol[i].n << endl;
}
// non-bonding interactions
pP->getNkmol();
if( pP->nkmol.empty() ) return -1;
cout << "GAFF non-bonding interaction parameters" << endl;
for( int i = 0 ; i < pP->nkmol.size(); i++ )
{
cout << pP->nkmol[i].aT << " "
<< pP->nkmol[i].R << " "
<< pP->nkmol[i].eps << endl;
}
return 0;
}
// end of an example code
// *****************************************************
An execution result (in a well-worked case) on MSVC for toluene is:
// *****************************************************
GAFF bond stretching parameters
c3 ca 323.5 1.513
ca ca 478.4 1.387
ca ca 478.4 1.387
ca ca 478.4 1.387
ca ca 478.4 1.387
ca ca 478.4 1.387
ca ca 478.4 1.387
c3 hc 337.3 1.092
c3 hc 337.3 1.092
c3 hc 337.3 1.092
ca ha 344.3 1.087
ca ha 344.3 1.087
ca ha 344.3 1.087
ca ha 344.3 1.087
ca ha 344.3 1.087
GAFF angle bending parameters
ca c3 hc 46.96 110.15
ca c3 hc 46.96 110.15
ca c3 hc 46.96 110.15
hc c3 hc 39.43 108.35
hc c3 hc 39.43 108.35
hc c3 hc 39.43 108.35
c3 ca ca 63.84 120.63
c3 ca ca 63.84 120.63
ca ca ca 67.18 119.97
ca ca ca 67.18 119.97
ca ca ha 48.46 120.01
ca ca ha 48.46 120.01
ca ca ca 67.18 119.97
ca ca ha 48.46 120.01
ca ca ha 48.46 120.01
ca ca ca 67.18 119.97
ca ca ha 48.46 120.01
ca ca ha 48.46 120.01
ca ca ca 67.18 119.97
ca ca ha 48.46 120.01
ca ca ha 48.46 120.01
ca ca ca 67.18 119.97
ca ca ha 48.46 120.01
ca ca ha 48.46 120.01
GAFF torsional parameters
hc c3 ca ca 0 0 2
hc c3 ca ca 0 0 2
hc c3 ca ca 0 0 2
hc c3 ca ca 0 0 2
hc c3 ca ca 0 0 2
hc c3 ca ca 0 0 2
c3 ca ca ca 3.625 180 2
c3 ca ca ha 3.625 180 2
ca ca ca ca 3.625 180 2
ca ca ca ha 3.625 180 2
ca ca ca ca 3.625 180 2
ca ca ca ha 3.625 180 2
ha ca ca ca 3.625 180 2
ha ca ca ha 3.625 180 2
ca ca ca ca 3.625 180 2
ca ca ca ha 3.625 180 2
ha ca ca ca 3.625 180 2
ha ca ca ha 3.625 180 2
ca ca ca ca 3.625 180 2
ca ca ca ha 3.625 180 2
ha ca ca ca 3.625 180 2
ha ca ca ha 3.625 180 2
ca ca ca ca 3.625 180 2
ca ca ca ha 3.625 180 2
ha ca ca ca 3.625 180 2
ha ca ca ha 3.625 180 2
c3 ca ca ca 3.625 180 2
c3 ca ca ha 3.625 180 2
ca ca ca ca 3.625 180 2
ca ca ca ha 3.625 180 2
GAFF out-of-plane motion parameters
ca ca ca c3 1.1 180 2
ca ca ca ha 1.1 180 2
ca ca ca ha 1.1 180 2
ca ca ca ha 1.1 180 2
ca ca ca ha 1.1 180 2
ca ca ca ha 1.1 180 2
GAFF non-bonding interaction parameters
ha 1.459 0.015
ha 1.459 0.015
ha 1.459 0.015
ha 1.459 0.015
ha 1.459 0.015
hc 1.487 0.0157
hc 1.487 0.0157
hc 1.487 0.0157
c3 1.908 0.1094
ca 1.908 0.086
ca 1.908 0.086
ca 1.908 0.086
ca 1.908 0.086
ca 1.908 0.086
ca 1.908 0.086
// *****************************************************
Used molecular file (toluene.cml) is:
<molecule>
<atomArray>
<atom id="a1" elementType="C" x3="0.932545" y3="-0.068050" z3="0.029397"/>
<atom id="a2" elementType="C" x3="2.429382" y3="-0.034585"
z3="-0.058760"/>
<atom id="a3" elementType="C" x3="3.122390" y3="1.181313" z3="-0.094235"/>
<atom id="a4" elementType="C" x3="4.515950" y3="1.197955" z3="-0.177582"/>
<atom id="a5" elementType="C" x3="5.227527" y3="0.000593" z3="-0.226551"/>
<atom id="a6" elementType="C" x3="4.546450" y3="-1.214677"
z3="-0.192359"/>
<atom id="a7" elementType="C" x3="3.153262" y3="-1.232774"
z3="-0.108991"/>
<atom id="a8" elementType="H" x3="0.509709" y3="0.941061" z3="0.072209"/>
<atom id="a9" elementType="H" x3="0.619747" y3="-0.601149" z3="0.932968"/>
<atom id="a10" elementType="H" x3="0.514468" y3="-0.570641"
z3="-0.848686"/>
<atom id="a11" elementType="H" x3="2.582472" y3="2.124526"
z3="-0.057180"/>
<atom id="a12" elementType="H" x3="5.046193" y3="2.146205"
z3="-0.204403"/>
<atom id="a13" elementType="H" x3="6.312108" y3="0.014698"
z3="-0.291477"/>
<atom id="a14" elementType="H" x3="5.099906" y3="-2.149094"
z3="-0.230715"/>
<atom id="a15" elementType="H" x3="2.633402" y3="-2.187764"
z3="-0.083315"/>
</atomArray>
<bondArray>
<bond atomRefs2="a1 a2" order="1"/>
<bond atomRefs2="a2 a3" order="2"/>
<bond atomRefs2="a3 a4" order="1"/>
<bond atomRefs2="a4 a5" order="2"/>
<bond atomRefs2="a5 a6" order="1"/>
<bond atomRefs2="a6 a7" order="2"/>
<bond atomRefs2="a2 a7" order="1"/>
<bond atomRefs2="a1 a8" order="1"/>
<bond atomRefs2="a1 a9" order="1"/>
<bond atomRefs2="a1 a10" order="1"/>
<bond atomRefs2="a3 a11" order="1"/>
<bond atomRefs2="a4 a12" order="1"/>
<bond atomRefs2="a5 a13" order="1"/>
<bond atomRefs2="a6 a14" order="1"/>
<bond atomRefs2="a7 a15" order="1"/>
</bondArray>
</molecule>
------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=267308311&iu=/4140
_______________________________________________
OpenBabel-Devel mailing list
OpenBabel-Devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openbabel-devel