Conformer Searching


class  OBConformerFilter
 Interface used by OBConformerSearch for filtering conformers. More...
class  OBConformerFilters
 Class for combining OBConformerFilter objects. More...
class  OBStericConformerFilter
 A steric conformer filter class. More...
class  OBConformerScore
 Interface used by OBConformerSearch for scoring conformers. More...
class  OBRMSDConformerScore
 A RMSD conformer scoring class. More...
class  OBEnergyConformerScore
 A lowest energy conformer scoring class. More...
class  OBMinimizingEnergyConformerScore
 A lowest energy conformer scoring class (after minimization). More...
class  OBConformerSearch
 Conformer searching using genetic algorithm. See Conformer Searching. More...


All conformer searching methods in OpenBabel are based on the concept of rotor keys. A rotor key is simply an array of values specifying the rotations around rotatable bonds. The number of possible values for a rotatable bond depends on the bond type. The classes implementing the rotor key concept are OBRotor, OBRotorList and OBRotamer.

Previous OpenBabel releases contained only methods for finding stable (low energy) conformers by using the force fields. The 2.3 release introduces a new flexible class (OBConformerSearch) implementing a genetic algorithm. The scoring or ranking of conformers is done by a seperate class derived from the abstract OBConformerScore class. Reimplementing this class allows for all sorts of scoring functions (e.g. RMSD, torson, energy, ... based).

Finding stable conformers

Systematic rotor search

This is the simplest of all conformer searching methods and only suitable when there are only a few rotatable bonds. Since the number of conformers grows exponentially with the number of bonds, enumerating all conformers for reasonably sized molecules quickly results in unacceptable performance. A systematic rotor search can be done with the OBForceField::SystematicRotorSearch method.

Random rotor search

The random rotor search generates random rotor keys and evaluates the energy. The lowest energy conformer is kept. All rotor keys are random and no attempt is made to improve good scoring keys. In most cases the weighted rotor search is a better choice. A random rotor search can be performed with the OBForceField::RandomRotorSearch method.

Weighted rotor search

The weighted rotor search uses the score (energy) from a generated and tries to optimize good scoring keys. This allows the global minimum energy conformer to be identified much faster compared to the random rotor search. However, finding the global minimum can be time consuming for large molecules and there is no guarantee that the found minimum is the global minimum. A weighted rotor search is performed with the OBForceField::WeightedRotorSearch method.

Genetic algorithm

The OBConformerSearch class introduced in OpenBabel 2.3 implements a genetic algorithm for finding conformers. The class is configurable and with the right scoring function (OBEnergyConformerScore), stable conformers can be found. Read the OBConformerSearch section for more details on how the genetic algorithm works.

Finding a diverse set of conformers

A divers set of conformers can be generated using the OBConformerSearch class with a scoring function like OBRMSDConformerScore. A diverse set of conformers is often useful when screening bioactive molecules since the interaction with the target can stabilize a higher conformational energy. See the next section for details.


The genetic algorithm starts by generating the initial population of rotor keys. The initial population contains up to numConformers, duplicate keys are ignored. OBConformerFilter objects are used to filter conformers before including them. A typical filter is a steric filter to ignore all conformers with atoms to close together.

For each generation, numChildren children are created by permuting the parent rotor keys. The mutability setting determines how frequent a permutation is made (e.g. 5 means 1/5 bonds are permuted, 10 means 1/10). Again, duplicated and filtered molecules are ignored. The population now contains up to numConformer * (1 + numChildren). All these rotor keys are scored using the specified OBConformerScore class. Next, all keys are ordered by their score and the best numConformers conformers are selected as parents for the next generation.

New generations are generated until the specified number of generations (i.e. convergence) don't improve the score.


Filters are used to exclude certain generated conformers. For example, the OBStericConformerFilter filters out all conformers with atoms to close together. Custom filters can be used to consider additional properties (e.g. electrostatic energy, distance between pharmacophore groups, ...). Filters can easily be combined using the OBConformerFilters class.


OBConformerScore derived classes compute the score for conformers. The scoring function is probably the most important part of the algorithm since it selects which conformers will be used as parents for the next generation. Derived classes also specify if the scores are descending or ascending and what convergence criteria should be used (i.e. lowest, highest, sum or average). There is no easy way to combine scoring functions since scores are not always additive. However, a custom scoring function could be used that combines several other scoring functions with weights for each score.

The scoring function determines what kind of conformers are selected. For example, the OBEnergyConformerScore class selects stable, low energy conformers. A simple variation to this would be to only use the non-bonded energy. The result for these two scoring functions should be similar.

The OBRMSDConformerScore scoring function can be used to generate a diverse set of conformers. A diverse set is often useful when screening bioactive molecules since the interaction with the target can stabilize a higher conformational energy. To calculate the RMSD between conformers, Kabsch alignment (OBAlign) is used. The alignment takes symmetry into account.


30 Conformers for methotrexate. top: OBEnergyConformerScore bottom: OBRMSDConformerScore

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines