The following example demonstrates how to use OEChem's periodic table functions to perform the common task of determining the molecular weight of a compound. Average molecular weight is commonly used in filtering (Lipinski's Rules) and as a descriptor in QSAR. The use of inaccurate values for molecular weight in these applications may help explain their limited success.
#include "oechem.h"
#include <iostream>
using namespace OEChem;
using namespace OESystem;
using namespace std;
double CalculateMolecularWeight(const OEMolBase &mol,bool isotopic=false)
{
OEIter<OEAtomBase> atom;
unsigned int elemno = 0;
unsigned int isotope = 0;
unsigned int impH = 0;
double result = 0.0;
if(isotopic)
{
for (atom=mol.GetAtoms(); atom; ++atom)
{
elemno = atom->GetAtomicNum();
isotope = atom->GetIsotope();
impH += atom->GetImplicitHCount();
if ((elemno!=0) && (isotope!=0) && OEIsCommonIsotope(elemno,isotope))
{
result += OEGetIsotopicWeight(elemno,isotope);
}
else result += OEGetAverageWeight(elemno);
}
}
else //non-isotopic
{
for(atom = mol.GetAtoms();atom; ++atom)
{
elemno = atom->GetAtomicNum();
impH += atom->GetImplicitHCount();
result += OEGetAverageWeight(elemno);
}
}
result += (impH * OEGetAverageWeight(1));
return result;
}
int main()
{
oemolistream ims;
OEIter<OEMolBase> mol;
for (mol = ims.GetMolBases();mol;++mol)
{
cerr << mol->GetTitle() << " mw= "
<< CalculateMolecularWeight(mol,true) << endl;
}
return 0;
}