OECalcPMI

bool OECalcPMI(double* pmi, OEMolBase &mol)
bool OECalcPMI(double* pmi, const OEMolBase &mol)
bool OECalcPMI(double* pmi, const OEConfBase &mol);
bool OECalcPMI(double* pmi, const OEMCMolBase &mol);

Calculates the PMI (principal moment of inertia) of the given molecule. Units of the PMI calculated are \(\text{amu} \times A^2\), where amu stands for Atomic Mass Unit and \(A\) for Angstrom. If calling the OEMCMolBase overload, the PMI calculated corresponds to the active conformer.

Returns true if calculation is successful, false otherwise. The function returns false if the values for the PMI are all 0, or if the molecule is not centered before calling the overloads with a const molecule argument.

If using any of the constant molecule overloads of this function, you must center the molecule before calling the overload, otherwise the function will return an incorrect or invalid value. See the function OECenter for how to center a molecule.

pmi

This pointer is populated by the PMI of the given molecule in each dimension, X, Y, and Z.

mol

This is the molecule for which the PMI is calculated. It must have a set radius and set mass for the calculation to be valid.

Warning

These functions only work correctly with a molecule that has been centered using the function OECenter. If the molecule has not been centered, the function will return false.

See also

The following code snippet demonstrates how to calculate the PMI and radius of gyration for a molecule.

int main(int argc, char *argv[])
{
  if (argc < 2)
    OEThrow.Usage("%s <infile_1> [<infle2>...]", argv[0]);

  double pmi[3] = {0};
  double radiusOfGyration[3] = {0};

  for (int i = 1; i < argc; i++)
  {
    oemolistream ifs;
    if (!ifs.open(argv[i]))
      OEThrow.Fatal("Unable to open %s for reading", argv[1]);

    OEMol mol;
    while (OEReadMolecule(ifs, mol))
    {
      OECalcPMI(pmi, mol);
      std::cout << "PMI: ";
      for (int k = 0; k < 3; k++)
        std::cout << pmi[k] << " ";
      std::cout << std::endl;
      
      std::cout << "Radius Of Gyration: ";
      for (int j = 0; j < 3; j++)
        std::cout << radiusOfGyration[j] << " ";
      std::cout << std::endl;
    }
  }
  return 0;
}