Пример #1
0
    def confab_conformers(self, forcefield="mmff94", freeze_atoms=None,
                          rmsd_cutoff=0.5, energy_cutoff=50.0,
                          conf_cutoff=100000, verbose=False):
        """
        Conformer generation based on Confab to generate all diverse low-energy
        conformers for molecules. This is different from rotor_conformer or
        gen3d_conformer as it aims to not simply to find a low energy
        conformation but to generate several different conformations.

        Args:
            forcefield (str): Default is mmff94. Options are 'gaff', 'ghemical',
                'mmff94', 'mmff94s', and 'uff'.
            freeze_atoms ([int]): index of atoms to be freezed when performing
                conformer search, default is None.
            rmsd_cutoff (float): rmsd_cufoff, default is 0.5 Angstrom.
            energy_cutoff (float): energy_cutoff, default is 50.0 kcal/mol.
            conf_cutoff (float): max number of conformers to test,
                default is 1 million.
            verbose (bool): whether to display information on torsions found,
                default is False.

        Returns:
             (list): list of pymatgen Molecule objects for generated conformers.
        """
        if self._obmol.GetDimension() != 3:
            self.make3d()
        else:
            self.add_hydrogen()

        ff = ob.OBForceField_FindType(forcefield)
        if ff == 0:
            print("Could not find forcefield {} in openbabel, the forcefield "
                  "will be reset as default 'mmff94'".format(forcefield))
            ff = ob.OBForceField_FindType("mmff94")

        if freeze_atoms:
            print('{} atoms will be freezed'.format(len(freeze_atoms)))
            constraints = ob.OBFFConstraints()

            for atom in ob.OBMolAtomIter(self._obmol):
                atom_id = atom.GetIndex() + 1
                if id in freeze_atoms:
                    constraints.AddAtomConstraint(atom_id)
            ff.SetConstraints(constraints)

        # Confab conformer generation
        ff.DiverseConfGen(rmsd_cutoff, conf_cutoff, energy_cutoff,
                          verbose)
        ff.GetConformers(self._obmol)

        # Number of conformers generated by Confab conformer generation
        conformer_num = self._obmol.NumConformers()

        conformers = []
        for i in range(conformer_num):
            self._obmol.SetConformer(i)
            conformer = copy.deepcopy(BabelMolAdaptor(self._obmol).pymatgen_mol)
            conformers.append(conformer)
        self._obmol.SetConformer(0)
        return conformers
Пример #2
0
    def rotor_conformer(self,
                        *rotor_args,
                        algo="WeightedRotorSearch",
                        forcefield="mmff94"):
        """
        Conformer search based on several Rotor Search algorithms of openbabel.
        If the input molecule is not 3D, make3d will be called (generate 3D
        structure, add hydrogen, a quick localopt). All hydrogen atoms need
        to be made explicit.

        Args:
            rotor_args: pass args to Rotor Search in openbabel.
                for "WeightedRotorSearch": (conformers, geomSteps,
                sampleRingBonds-default False)
                for "SystematicRotorSearch": (geomSteps-default 2500,
                sampleRingBonds-default False)
                for "RandomRotorSearch": (conformers, geomSteps-default 2500,
                sampleRingBonds-default False)
            algo (str): Default is "WeightedRotorSearch". Options are
                "SystematicRotorSearch", "RandomRotorSearch", and
                "WeightedRotorSearch".
            forcefield (str): Default is mmff94. Options are 'gaff', 'ghemical',
                'mmff94', 'mmff94s', and 'uff'.
        """
        if self._obmol.GetDimension() != 3:
            self.make3d()
        else:
            self.add_hydrogen()

        ff = ob.OBForceField_FindType(forcefield)
        if ff == 0:
            warnings.warn("This input forcefield {} is not supported "
                          "in openbabel. The forcefield will be reset as "
                          "default 'mmff94' for now.".format(forcefield))
            ff = ob.OBForceField_FindType("mmff94")

        try:
            rotor_search = getattr(ff, algo)
        except AttributeError:
            warnings.warn("This input conformer search algorithm {} is not "
                          "supported in openbabel. Options are "
                          "'SystematicRotorSearch', 'RandomRotorSearch' "
                          "and 'WeightedRotorSearch'. "
                          "The algorithm will be reset as default "
                          "'WeightedRotorSearch' for now.".format(algo))
            rotor_search = ff.WeightedRotorSearch
        rotor_search(*rotor_args)
        ff.GetConformers(self._obmol)
Пример #3
0
def run_confab(mol,
               rmsd_cutoff=0.5,
               conf_cutoff=100000,
               energy_cutoff=50.0,
               confab_verbose=False):
    """
    Generate ensemble of conformers to perform calculations on

    :param mol: initial molecule to generate conformers from
    :param rmsd_cutoff: similarity threshold for conformers, default: 0.5
    :param conf_cutoff: max number of conformers to generate, default: 100,000
    :param energy_cutoff: max relative energy between conformers, default: 50
    :param confab_verbose: whether confab should report on rotors
    :type mol: openbabel.OBMol
    :type rmsd_cutoff: float
    :type conf_cutoff: int
    :type energy_cutoff: float
    :type confab_verbose: bool
    :return: list of conformers for a given molecule
    :rtype: openbabel.OBMol
    """
    pff = ob.OBForceField_FindType("mmff94")
    pff.Setup(mol)

    pff.DiverseConfGen(rmsd_cutoff, conf_cutoff, energy_cutoff, confab_verbose)

    pff.GetConformers(mol)

    return mol