bool OEGetRadiusOfGyration(double* radiusOfGyration, const double* pmi, const OEMolBase& mol)
bool OEGetRadiusOfGyration(double* radiusOfGyration, const double* pmi, const OEConfBase& mol)
bool OEGetRadiusOfGyration(double* radiusOfGyration, const double* pmi, const OEMCMolBase& mol)

Calculates the radius of gyration of the given molecule, using the given PMI that has already been calculated with the function OECalcPMI. Units of the calculated radius are the same as those used to set the radius of the molecule, which need to be the same radius units used to calculate the PMI.

The function returns true if calculation is successful, false otherwise. If the molecule is not centered, or radius of gyration values are all 0, the function will return false,

Note that for an OEMCMolBase, the OECalcPMI only calculates the PMI for the active conformer, and therefore this function similarly uses only the mass of the active conformer to calculate the radius of gyration.


This double array will be populated by the radius of gyration in each dimension, X, Y, and Z.


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


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.


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

  • OECalcPMI function to calculate principle moment of inertia.

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;