Ejemplo n.º 1
0
def dock_molecules(receptor_filename, molecules, filename):
    """
    Dock the specified molecules, writing out to specified file

    Parameters
    ----------
    receptor_filename : str
        Receptor .oeb.gz filename
    molecules : list of openeye.oechem.OEMol
        The read molecules to dock
    filename : str
        The filename to stream docked molecules to

    """
    # Read the receptor
    print('Loading receptor...')
    from openeye import oechem, oedocking
    receptor = oechem.OEGraphMol()
    if not oedocking.OEReadReceptorFile(receptor, 'receptor.oeb.gz'):
        oechem.OEThrow.Fatal("Unable to read receptor")

    if oedocking.OEReceptorHasBoundLigand(receptor):
        print("Receptor has a bound ligand")
    else:
        print("Receptor does not have bound ligand")

    print('Initializing receptor...')
    dockMethod = oedocking.OEDockMethod_Hybrid2
    dockResolution = oedocking.OESearchResolution_High
    dock = oedocking.OEDock(dockMethod, dockResolution)
    success = dock.Initialize(receptor)

    # Set up Omega
    from openeye import oeomega
    omegaOpts = oeomega.OEOmegaOptions(oeomega.OEOmegaSampling_Dense)
    #omegaOpts = oeomega.OEOmegaOptions()
    omega = oeomega.OEOmega(omegaOpts)
    omega.SetStrictStereo(False)

    # Dock molecules
    with oechem.oemolostream(filename) as ofs:
        from tqdm import tqdm
        for mol in tqdm(molecules):
            dockedMol = oechem.OEGraphMol()

            # Expand conformers
            omega.Build(mol)

            # Dock molecule
            retCode = dock.DockMultiConformerMolecule(dockedMol, mol)
            if (retCode != oedocking.OEDockingReturnCode_Success):
                oechem.OEThrow.Fatal("Docking Failed with error code " + oedocking.OEDockingReturnCodeGetName(retCode))

            # Store docking data
            sdtag = oedocking.OEDockMethodGetName(dockMethod)
            oedocking.OESetSDScore(dockedMol, dock, sdtag)
            dock.AnnotatePose(dockedMol)

            # Write molecule
            oechem.OEWriteMolecule(ofs, dockedMol)
def get_receptor(receptor_file=None, use_hybrid=True, high_resolution=True):
    """

    :param receptor_file: file to .oeb or oeb.gz with prepared protein receptor
    :param use_hybrid: whether or not to override using hybrid docking method
    :param high_resolution: set resolution for search
    :return: docking objector from OE, the receptor oemol
    """
    from . import dock_conf
    from openeye import oedocking

    receptor = dock_conf.PrepareReceptorFromBinary(receptor_file)

    if oedocking.OEReceptorHasBoundLigand(receptor) and use_hybrid:
        dock_method = oedocking.OEDockMethod_Hybrid
    else:
        dock_method = oedocking.OEDockMethod_Chemgauss4

    if high_resolution:
        reso = oedocking.OESearchResolution_High
    else:
        reso = oedocking.OESearchResolution_Default

    dock = oedocking.OEDock(dock_method, reso)
    dock.Initialize(receptor)
    return dock, receptor
def dock_molecules_to_receptor(receptor_filename):
    """
    Dock the specified molecules, writing out to specified file

    Parameters
    ----------
    receptor_filename : str
        Receptor .oeb.gz filename
    fragment : str
        The fragment name to dock to

    """
    import os

    # Read the receptor
    from openeye import oechem, oedocking
    receptor = oechem.OEGraphMol()
    if not oedocking.OEReadReceptorFile(receptor, receptor_filename):
        oechem.OEThrow.Fatal("Unable to read receptor")

    if not oedocking.OEReceptorHasBoundLigand(receptor):
        raise Exception("Receptor does not have bound ligand")

    #print('Initializing receptor...')
    dockMethod = oedocking.OEDockMethod_Hybrid2
    dockResolution = oedocking.OESearchResolution_Default
    dock = oedocking.OEDock(dockMethod, dockResolution)
    success = dock.Initialize(receptor)

    # Set up Omega
    #print('Expanding conformers...')
    from openeye import oeomega
    #omegaOpts = oeomega.OEOmegaOptions(oeomega.OEOmegaSampling_Dense)
    omegaOpts = oeomega.OEOmegaOptions()
    omega = oeomega.OEOmega(omegaOpts)
    omega.SetStrictStereo(False)

    # Dock molecules
    docked_molecules = list()
    for mol in molecules:
        dockedMol = oechem.OEGraphMol()

        # Expand conformers
        omega.Build(mol)

        # Dock molecule
        #print(f'Docking {mol.NumConfs()} conformers...')
        retCode = dock.DockMultiConformerMolecule(dockedMol, mol)
        if (retCode != oedocking.OEDockingReturnCode_Success):
            print("Docking Failed with error code " + oedocking.OEDockingReturnCodeGetName(retCode))
            continue

        # Store docking data
        sdtag = oedocking.OEDockMethodGetName(dockMethod)
        oedocking.OESetSDScore(dockedMol, dock, sdtag)
        dock.AnnotatePose(dockedMol)

        docked_molecules.append( oechem.OEMol(dockedMol) )

    return docked_molecules
Ejemplo n.º 4
0
def dock_molecule(receptor, molecule_smiles, n_conformations=10, n_poses=1):
    """Run the multi-conformer docker.

    Parameters
    ----------
    receptor : openeye.oedocking.OEReceptor
        The openeye receptor.
    molecule_smiles : str
        The SMILES string of the molecule.
    n_conformations : int, optional
        The number of omega conformations to pass to the multi-conformer
        docker (default is 10).
    n_poses : int, optional
        Number of binding poses to return.

    Returns
    -------
    docked_oemol : openeye.oechem.OEMol
        The docked multi-conformer OpenEye molecule.

    """
    dock = oedocking.OEDock()
    dock.Initialize(receptor)

    molecule_oemol = moltools.openeye.smiles_to_oemol(molecule_smiles)
    molecule_oemol = moltools.openeye.get_charges(molecule_oemol,
                                                  keep_confs=n_conformations)

    docked_oemol = oechem.OEMol()
    dock.DockMultiConformerMolecule(docked_oemol, molecule_oemol, n_poses)

    return docked_oemol
def DockConf(pdb_file, mol, MAX_POSES = 5):
    receptor = oechem.OEGraphMol()
    oedocking.OEReadReceptorFile(receptor, pdb_file)
    dock = oedocking.OEDock()
    dock.Initialize(receptor)
    lig = oechem.OEMol()
    err = dock.DockMultiConformerMolecule(lig,mol,MAX_POSES)
    return dock, lig, receptor
Ejemplo n.º 6
0
def DockConf(receptor, mol, MAX_POSES=5):
    dock = oedocking.OEDock()
    dock.Initialize(receptor)
    lig = oechem.OEMol()
    err = dock.DockMultiConformerMolecule(lig, mol, MAX_POSES)
    # TODO: should do some sort of error checking here. outputs will both be empty molecules
    #       if it doesn't run properly.
    return dock, lig
Ejemplo n.º 7
0
 def __init__(self, receptor: utils.FilePath):
     self.receptor_file = receptor
     omegaOpts = oeomega.OEOmegaOptions()
     omegaOpts.SetStrictStereo(False)
     self.omega = oeomega.OEOmega(omegaOpts)
     oechem.OEThrow.SetLevel(10000)
     oereceptor = oechem.OEGraphMol()
     oedocking.OEReadReceptorFile(oereceptor, self.receptor_file)
     self.dock = oedocking.OEDock()
     self.dock.Initialize(oereceptor)
Ejemplo n.º 8
0
def init_oedock_from_receptor(receptor, oe_options=None):
    oe_options = oe_options or OEOptions()

    dockMethod = oedocking.OEDockMethod_Hybrid if oe_options.use_hybrid else oedocking.OEDockMethod_Chemgauss4
    dockResolution = oedocking.OESearchResolution_High if oe_options.high_resolution else oedocking.OESearchResolution_Default
    dock = oedocking.OEDock(dockMethod, dockResolution)
    assert (dock.Initialize(receptor))

    if (not oedocking.OEReceptorHasCachedScore(receptor)) and oe_options.cache_receptor:
        dock.CacheScoringSetup(receptor, clearOldData=oe_options.cache_receptor_clear)
    return dock
Ejemplo n.º 9
0
def DockConf(pdb_file, mol, MAX_POSES=1, dock=None):
    if dock is None:
        receptor = oechem.OEGraphMol()
        oedocking.OEReadReceptorFile(receptor, pdb_file)
        dock = oedocking.OEDock(oedocking.OEScoreType_Chemgauss4,
                                oedocking.OESearchResolution_High)
        dock.Initialize(receptor)
    else:
        receptor = None
    lig = DockConf_(dock, mol, MAX_POSES=MAX_POSES)
    return lig, receptor
Ejemplo n.º 10
0
def main(argv=[__name__]):
    if len(argv) != 3:
        oechem.OEThrow.Usage("%s <receptor> <conformers>" % argv[0])

    receptor = oechem.OEGraphMol()
    oedocking.OEReadReceptorFile(receptor, argv[1])
    dock = oedocking.OEDock()
    dock.Initialize(receptor)

    conformers = oechem.OEMol()
    imstr = oechem.oemolistream(argv[2])
    for conformers in imstr.GetOEMols():
        poses = oechem.OEMol()
        dock.DockMultiConformerMolecule(poses, conformers)
        TagPoses(dock, poses, dock.GetName())
Ejemplo n.º 11
0
    def begin(self):
        receptor = oechem.OEGraphMol()
        self.args.receptor = utils.download_dataset_to_file(self.args.receptor)
        if not oedocking.OEReadReceptorFile(receptor, str(self.args.receptor)):
            raise Exception("Unable to read receptor from {0}".format(self.args.receptor))

        # Initialize Docking
        dock_method = oedocking.OEDockMethod_Hybrid
        if not oedocking.OEReceptorHasBoundLigand(receptor):
            oechem.OEThrow.Warning("No bound ligand, switching OEDockMethod to ChemGauss4.")
            dock_method = oedocking.OEDockMethod_Chemgauss4
        dock_resolution = oedocking.OESearchResolution_Default
        self.sdtag = oedocking.OEDockMethodGetName(dock_method)
        self.dock = oedocking.OEDock(dock_method, dock_resolution)
        if not self.dock.Initialize(receptor):
            raise Exception("Unable to initialize Docking with {0}".format(self.args.receptor))
Ejemplo n.º 12
0
 def __init__(self, prefix: str, receptor_file: os.PathLike):
     """
     :param prefix: Prefix to identify scoring function instance (e.g., Risperidone)
     :param receptor_file: Path to receptor file (.oeb).
     """
     logger.warning("This code has not been tested (at all!)")
     self.prefix = prefix
     self.receptor_file = receptor_file
     omegaOpts = oeomega.OEOmegaOptions()
     omegaOpts.SetStrictStereo(False)
     self.omega = oeomega.OEOmega(omegaOpts)
     oechem.OEThrow.SetLevel(10000)
     oereceptor = oechem.OEGraphMol()
     oedocking.OEReadReceptorFile(oereceptor, self.receptor_file)
     self.oedock = oedocking.OEDock()
     self.oedock.Initialize(oereceptor)
Ejemplo n.º 13
0
 def __init__(self, prefix: str, receptor_file: str):
     """
     Scoring function class to perform OpenEye docking (FRED)
     :param prefix: Name (to help keep track metrics, if using a scoring function class more than once)
     :param receptor_file: Path to oe receptor file.
     """
     logger.warning("This code has not been tested (at all!)")
     self.prefix = prefix
     self.receptor_file = receptor_file
     omegaOpts = oeomega.OEOmegaOptions()
     omegaOpts.SetStrictStereo(False)
     self.omega = oeomega.OEOmega(omegaOpts)
     oechem.OEThrow.SetLevel(10000)
     oereceptor = oechem.OEGraphMol()
     oedocking.OEReadReceptorFile(oereceptor, self.receptor_file)
     self.oedock = oedocking.OEDock()
     self.oedock.Initialize(oereceptor)
Ejemplo n.º 14
0
def main(argv=[__name__]):
    itf = oechem.OEInterface(InterfaceData)
    # @ <SNIPPET-DOCK-MOLECULES-CONFIGURE>
    oedocking.OEDockMethodConfigure(itf, "-method")
    oedocking.OESearchResolutionConfigure(itf, "-resolution")
    # @ </SNIPPET-DOCK-MOLECULES-CONFIGURE>
    if not oechem.OEParseCommandLine(itf, argv):
        return 1

    imstr = oechem.oemolistream(itf.GetString("-in"))
    omstr = oechem.oemolostream(itf.GetString("-out"))

    receptor = oechem.OEGraphMol()
    if not oedocking.OEReadReceptorFile(receptor, itf.GetString("-receptor")):
        oechem.OEThrow.Fatal("Unable to read receptor")

    # @ <SNIPPET-DOCK-MOLECULES-GET-VALUE>
    dockMethod = oedocking.OEDockMethodGetValue(itf, "-method")
    dockResolution = oedocking.OESearchResolutionGetValue(itf, "-resolution")
    # @ </SNIPPET-DOCK-MOLECULES-GET-VALUE>
    # @ <SNIPPET-DOCK-MOLECULES-SETUP>
    dock = oedocking.OEDock(dockMethod, dockResolution)
    # @ </SNIPPET-DOCK-MOLECULES-SETUP>
    # @ <SNIPPET-DOCK-MOLECULES-INITIALIZE>
    dock.Initialize(receptor)
    # @ </SNIPPET-DOCK-MOLECULES-INITIALIZE>

    for mcmol in imstr.GetOEMols():
        print("docking", mcmol.GetTitle())
        dockedMol = oechem.OEGraphMol()
        # @ <SNIPPET-DOCK-MOLECULES-DOCK>
        retCode = dock.DockMultiConformerMolecule(dockedMol, mcmol)
        if (retCode != oedocking.OEDockingReturnCode_Success):
            oechem.OEThrow.Fatal("Docking Failed with error code " + oedocking.OEDockingReturnCodeGetName(retCode))

        # @ </SNIPPET-DOCK-MOLECULES-DOCK>
        sdtag = oedocking.OEDockMethodGetName(dockMethod)
        # @ <SNIPPET-DOCK-MOLECULES-ASSIGN-SCORE>
        oedocking.OESetSDScore(dockedMol, dock, sdtag)
        # @ </SNIPPET-DOCK-MOLECULES-ASSIGN-SCORE>
        # @ <SNIPPET-DOCK-MOLECULES-ANNOTATE>
        dock.AnnotatePose(dockedMol)
        # @ </SNIPPET-DOCK-MOLECULES-ANNOTATE>
        oechem.OEWriteMolecule(omstr, dockedMol)

    return 0
Ejemplo n.º 15
0
def dock_molecule(receptor, molecule_smiles, n_conformations=10, n_poses=2):
    """Run the multi-conformer docker.

    Parameters
    ----------
    receptor : openeye.oedocking.OEReceptor
        The openeye receptor.
    molecule_smiles : str
        The SMILES string of the molecule.
    n_conformations : int, optional
        The number of omega conformations to pass to the multi-conformer
        docker (default is 10).
    n_poses : int, optional
        Number of binding poses to return.

    Returns
    -------
    docked_oemol : openeye.oechem.OEMol
        The docked multi-conformer OpenEye molecule.
    """
    from openeye import oechem, oedocking
    import openmoltools as moltools

    if oedocking.OEReceptorHasBoundLigand(receptor):
        dock = oedocking.OEHybrid(oedocking.OEDockMethod_Hybrid2,
                                  oedocking.OESearchResolution_High)
    else:
        dock = oedocking.OEDock()

    dock.Initialize(receptor)

    molecule_oemol = moltools.openeye.smiles_to_oemol(molecule_smiles)
    molecule_oemol = moltools.openeye.get_charges(molecule_oemol,
                                                  keep_confs=n_conformations)

    docked_oemol = oechem.OEMol()

    dock.DockMultiConformerMolecule(docked_oemol, molecule_oemol, n_poses)

    return docked_oemol
def main(argv=[__name__]):
    itf = oechem.OEInterface()
    oedocking.OEDockMethodConfigure(itf, "-method")
    oedocking.OESearchResolutionConfigure(itf, "-resolution")
    receptors = []
    path = "receptor_oebs/*.oeb"  #input: receptor oebs
    files = glob.glob(path)
    for i in files:
        receptor = oechem.OEGraphMol()
        if not oedocking.OEReadReceptorFile(receptor, i):
            oechem.OEThrow.Fatal("Unable to read receptor from %s" % i)
        receptors.append(receptor)
    dockMethod = 5  #Set scoring function (5=Chemscore)
    dockResolution = 2  #set search resolution (2=Standard)
    dock = oedocking.OEDock(
        dockMethod,
        dockResolution)  #Selecting exhaustive search and scoring functions
    for receptor_idx, receptor in enumerate(receptors):
        Centroid_number = files[receptor_idx][-5:-4]
        omstr = oechem.oemolostream("Docking_Results/Receptor_%s.oeb" %
                                    (Centroid_number))
        dock.Initialize(receptor)  #initialize with receptor object
        imstr = oechem.oemolistream("lig.oeb.gz")
        for mcmol in imstr.GetOEMols():
            print("docking", mcmol.GetTitle())
            dockedMol = oechem.OEMol()
            dock.DockMultiConformerMolecule(dockedMol, mcmol)  #Docking
            sdtag = oedocking.OEDockMethodGetName(dockMethod)
            oedocking.OESetSDScore(dockedMol, dock, sdtag)
            dock.AnnotatePose(dockedMol)
            oechem.OEWriteMolecule(omstr, dockedMol)
            g = open("Docking_Results/score.txt", "a+")  #write scores to file
            g.write(
                str(files[receptor_idx]) + " " + str(mcmol.GetTitle()) + " " +
                str(oechem.OEMCMolBase.GetEnergy(dockedMol)) + "\r\n")
            g.close()
    return 0
Ejemplo n.º 17
0
def main(argv=[__name__]):
    if len(argv) != 3:
        oechem.OEThrow.Usage("%s <receptor> <ligand>" % argv[0])

    receptor = oechem.OEGraphMol()
    oedocking.OEReadReceptorFile(receptor, argv[1])

    dock = oedocking.OEDock(oedocking.OEDockMethod_PLP)
    dock.Initialize(receptor)

    mcmol = oechem.OEMol()
    imstr = oechem.oemolistream(argv[2])
    oechem.OEReadMolecule(imstr, mcmol)

    # @ <SNIPPET-DOCK-SCORING-3>
    numPoses = 10
    poses = oechem.OEMol()
    dock.DockMultiConformerMolecule(poses, mcmol, numPoses)
    # @ </SNIPPET-DOCK-SCORING-3>

    for pose in poses.GetConfs():
        PrintScore(dock, pose)
        for atom in pose.GetAtoms():
            PrintAtomScore(dock, pose, atom)
Ejemplo n.º 18
0
def run_docking(receptor,
                molecules,
                dock_method,
                num_poses=1,
                docking_poses_save_path=None):
    """
    Dock molecules into a prepared receptor.

    Parameters
    ----------
    receptor: oechem.OEGraphMol
        An oechem.OEGraphMol object holding the prepared receptor.

    molecules: list of oechem.OEGraphMol
        A list of oechem.OEGraphMol objects holding prepared molecules for docking.

    dock_method: int
        Constant defining the docking method.

    num_poses: int
        Number of docking poses to generate per molecule.

    docking_poses_save_path: str
        File path for saving docking poses. If docking_poses_save_path is not provided, docking poses will not be saved.

    Returns
    -------
    docked_molecules: list of oechem.OEGraphMol
        A list of oechem.OEGraphMol objects holding the docked molecules.
    """
    # Standard libraries
    import pathlib

    # External libraries
    from openeye import oechem, oedocking, oequacpac, oeomega

    # initialize receptor
    dock_resolution = oedocking.OESearchResolution_High
    dock = oedocking.OEDock(dock_method, dock_resolution)
    dock.Initialize(receptor)

    def score(molecule, dock=dock):
        """Return the docking score."""
        value = oechem.OEGetSDData(molecule, dock.GetName())
        return float(value)

    docked_molecules = list()

    # dock molecules
    for molecule in molecules:
        # enumerate tautomers
        tautomer_options = oequacpac.OETautomerOptions()
        tautomer_options.SetMaxTautomersGenerated(4096)
        tautomer_options.SetMaxTautomersToReturn(16)
        tautomer_options.SetCarbonHybridization(True)
        tautomer_options.SetMaxZoneSize(50)
        tautomer_options.SetApplyWarts(True)
        pKa_norm = True
        tautomers = [
            oechem.OEMol(tautomer)
            for tautomer in oequacpac.OEGetReasonableTautomers(
                molecule, tautomer_options, pKa_norm)
        ]

        # set up omega
        omega_options = oeomega.OEOmegaOptions()
        omega_options.SetMaxSearchTime(60.0)  # time out
        omega = oeomega.OEOmega(omega_options)
        omega.SetStrictStereo(False)  # enumerate stereochemistry if uncertain

        docked_tautomers = list()
        # dock tautomers
        for mol in tautomers:
            docked_mol = oechem.OEMol()
            # expand conformers
            omega.Build(mol)

            # dock molecule
            return_code = dock.DockMultiConformerMolecule(
                docked_mol, mol, num_poses)
            if return_code != oedocking.OEDockingReturnCode_Success:
                print(
                    f'Docking failed for molecule with title {mol.GetTitle()} with error code '
                    f'{oedocking.OEDockingReturnCodeGetName(return_code)}.')
                continue

            # store docking data
            oedocking.OESetSDScore(docked_mol, dock, dock.GetName())

            # expand conformations
            for conformation in docked_mol.GetConfs():
                docked_tautomers.append(oechem.OEGraphMol(conformation))

        # sort all conformations of all tautomers by score
        docked_tautomers.sort(key=score)

        # keep number of conformations as specified by num_poses
        docked_molecules += docked_tautomers[:num_poses]

    if len(docked_molecules) == 0:
        return None

    # save docking poses
    if docking_poses_save_path is not None:
        write_mols(docked_molecules,
                   str(pathlib.Path(docking_poses_save_path).absolute()))

    return docked_molecules
Ejemplo n.º 19
0
    def _execute(self, directory, available_resources):

        import mdtraj
        from openeye import oechem, oedocking
        from simtk import unit as simtk_unit

        if (len(self.ligand_substance.components) != 1
                or self.ligand_substance.components[0].role !=
                Component.Role.Ligand):

            raise ValueError(
                "The ligand substance must contain a single ligand component.")

        logger.info("Initializing the receptor molecule.")
        receptor_molecule = self._create_receptor()

        logger.info("Initializing the ligand molecule.")
        ligand_molecule = self._create_ligand()

        logger.info("Initializing the docking object.")

        # Dock the ligand to the receptor.
        dock = oedocking.OEDock()
        dock.Initialize(receptor_molecule)

        docked_ligand = oechem.OEGraphMol()

        logger.info("Performing the docking.")

        status = dock.DockMultiConformerMolecule(docked_ligand,
                                                 ligand_molecule)

        if status != oedocking.OEDockingReturnCode_Success:
            raise RuntimeError("The ligand could not be successfully docked", )

        docking_method = oedocking.OEDockMethodGetName(
            oedocking.OEDockMethod_Default)
        oedocking.OESetSDScore(docked_ligand, dock, docking_method)

        dock.AnnotatePose(docked_ligand)

        self.docked_ligand_coordinate_path = path.join(directory, "ligand.pdb")

        output_stream = oechem.oemolostream(self.docked_ligand_coordinate_path)
        oechem.OEWriteMolecule(output_stream, docked_ligand)
        output_stream.close()

        receptor_pdb_path = path.join(directory, "receptor.pdb")

        output_stream = oechem.oemolostream(receptor_pdb_path)
        oechem.OEWriteMolecule(output_stream, receptor_molecule)
        output_stream.close()

        ligand_trajectory = mdtraj.load(self.docked_ligand_coordinate_path)

        ligand_residue = ligand_trajectory.topology.residue(0)
        ligand_residue.name = self.ligand_residue_name

        # Save the ligand file with the correct residue name.
        ligand_trajectory.save(self.docked_ligand_coordinate_path)

        receptor_trajectory = mdtraj.load(receptor_pdb_path)

        receptor_residue = receptor_trajectory.topology.residue(0)
        receptor_residue.name = self.receptor_residue_name

        # Create a merged ligand-receptor topology.
        complex_topology = ligand_trajectory.topology.copy()

        atom_mapping = {}

        new_residue = complex_topology.add_residue(receptor_residue.name,
                                                   complex_topology.chain(0))

        for receptor_atom in receptor_residue.atoms:

            new_atom = complex_topology.add_atom(
                receptor_atom.name,
                receptor_atom.element,
                new_residue,
                serial=receptor_atom.serial,
            )

            atom_mapping[receptor_atom] = new_atom

        for bond in receptor_trajectory.topology.bonds:

            complex_topology.add_bond(
                atom_mapping[bond[0]],
                atom_mapping[bond[1]],
                type=bond.type,
                order=bond.order,
            )

        complex_positions = []

        complex_positions.extend(
            ligand_trajectory.openmm_positions(0).value_in_unit(
                simtk_unit.angstrom))
        complex_positions.extend(
            receptor_trajectory.openmm_positions(0).value_in_unit(
                simtk_unit.angstrom))

        complex_positions *= simtk_unit.angstrom

        self.docked_complex_coordinate_path = path.join(
            directory, "complex.pdb")

        with open(self.docked_complex_coordinate_path, "w+") as file:
            app.PDBFile.writeFile(complex_topology.to_openmm(),
                                  complex_positions, file)
Ejemplo n.º 20
0
def hybrid_docking(receptor_path,
                   molecules_path,
                   docked_molecules_path,
                   n_poses=10):
    """Automated hybrid docking of small molecules to a receptor.

    Parameters
    ----------
    receptor_path : str
        Path to PDB file containing receptor and reference ligand, or pre-prepared receptor for docking
    molecules_path : str
        Path to file containing one or more molecules (in OpenEye readable format) to be docked.
        (For example, list of SMILES)
    docked_molecules_path : str
        Path to output file to be created to contain docked molecules
        Uses OpenEye recognized file extension, such as .mol2 or .sdf
    n_poses : int, optional, default=1
        Number of docked poses to generate
    receptor_filename : str, optional, default=None
        If not None, the pre-prepared receptor is loaded

    TODO: How can this API be improved?

    """
    from .docking import create_receptor, load_receptor, pose_molecule
    from openeye import oedocking, oechem
    #import openmoltools as moltools # TODO: Bring these methods into this module

    # Try to load pre-prepared receptor from specified file
    receptor = oechem.OEGraphMol()
    print('Attempting to load receptor from {}...'.format(receptor_path))
    if not oedocking.OEReadReceptorFile(receptor, receptor_path):
        # Load complex of receptor and reference ligand
        complex_istream = oechem.oemolistream(receptor_path)
        complex = oechem.OEGraphMol()
        oechem.OEReadMolecule(complex_istream, complex)

        # Attempt to split into components and build receptor based on reference ligand
        print('Attempting to split complex into components...')
        ligand = oechem.OEGraphMol()
        protein = oechem.OEGraphMol()
        water = oechem.OEGraphMol()
        other = oechem.OEGraphMol()
        if oechem.OESplitMolComplex(ligand, protein, water, other, complex):
            # Create receptor using bound ligand reference
            print('Creating receptor using reference ligand...')
            oedocking.OEMakeReceptor(receptor, protein, ligand)
            # TODO: We can store prepared receptor file if desired
            oedocking.OEWriteReceptorFile(
                receptor,
                '/home/guoj1/projects/INSPIRE/kinomodel/kinomodel/data/docking/prepared_receptor.oeb'
            )

        else:
            raise Exception(
                'Could not split specified PDB file {} into receptor and reference ligand'
                .format(receptor_path))

    # Open file for writing docked molecules
    docked_molecules_ostream = oechem.oemolostream(docked_molecules_path)

    # Configure omega
    # From canonical recipe: https://docs.eyesopen.com/toolkits/cookbook/python/modeling/am1-bcc.html
    from openeye import oeomega
    omega = oeomega.OEOmega()
    omega.SetIncludeInput(False)
    omega.SetCanonOrder(False)
    omega.SetSampleHydrogens(True)
    eWindow = 15.0
    omega.SetEnergyWindow(eWindow)
    omega.SetMaxConfs(800)
    omega.SetRMSThreshold(1.0)

    # Dock all molecules requested
    dock_method = oedocking.OEDockMethod_Hybrid2
    dock_resolution = oedocking.OESearchResolution_Standard
    dock = oedocking.OEDock(dock_method, dock_resolution)
    dock.Initialize(receptor)
    molecules_istream = oechem.oemolistream(molecules_path)
    molecule = oechem.OEGraphMol()
    for molecule in molecules_istream.GetOEMols():
        print("docking", molecule.GetTitle())
        #docked_molecules = pose_molecule(receptor, molecule, n_poses=n_poses)
        #molecule = moltools.openeye.get_charges(molecule, keep_confs=10)

        # Generate conformers
        if not omega(molecule):
            continue

        # Apply charges
        from openeye import oequacpac
        oequacpac.OEAssignCharges(molecule, oequacpac.OEAM1BCCELF10Charges())

        # Dock
        docked_molecule = oechem.OEGraphMol()
        dock.DockMultiConformerMolecule(docked_molecule, molecule)
        sdtag = oedocking.OEDockMethodGetName(dock_method)
        oedocking.OESetSDScore(docked_molecule, dock, sdtag)
        dock.AnnotatePose(docked_molecule)
        oechem.OEWriteMolecule(docked_molecules_ostream, docked_molecule)
Ejemplo n.º 21
0
    def getscores(self,
                  actions,
                  gsmis,
                  prot,
                  lig,
                  num_returns=10,
                  return_docked_pose=False,
                  refmol=None):
        with self.logger("getscores") as logger:
            if num_returns <= 0:
                num_returns = len(actions) - 1
            logger.log("Action space is ", len(actions))
            idxs = list(
                np.random.choice(len(actions),
                                 min(num_returns,
                                     len(actions) - 1),
                                 replace=False).flatten())
            actions = [actions[idx] for idx in idxs]
            gsmis = [gsmis[idx] for idx in idxs]

            protein = oechem.OEMol(prot)
            receptor = oechem.OEGraphMol()

            if not (self.sort == 'iscores' and self.optimize):
                logger.log(
                    "Creating receptor from recent pdb, this might take awhile"
                )
                oedocking.OEMakeReceptor(receptor, protein, lig)
                dockobj = oedocking.OEDock(self.dockmethod)
                dockobj.Initialize(receptor)
                assert (dockobj.IsInitialized())
                logger.log("done")
            else:
                dockobj = None
                logger.log(
                    "Skipping receptor building as optimize is set and sort method is iscore."
                )

            pscores = []
            dscores = []
            ds_old_scores = []
            ds_start_scores = []

            data = []

            with multiprocessing.Pool() as p:
                imapiter = p.imap(
                    self.env.action.aligner.__class__.call_static,
                    zip(actions, gsmis,
                        [copy.deepcopy(refmol)] * len(actions)))

                for idx, res in enumerate(imapiter):
                    try:
                        if res is None:
                            logger.error(
                                "Alignment failed and returned none for ",
                                gsmis[idx])
                            continue
                        ps, ds, ds_start, ds_old = None, None, None, []
                        new_mol, new_mol2, gs, action = res

                        if dockobj is not None:
                            dockedpose = oechem.OEMol()
                            newmol2 = oechem.OEMol(new_mol)
                            dockobj.DockMultiConformerMolecule(
                                dockedpose, newmol2, 1)
                            ds = dockedpose.GetEnergy()
                            ps = dockobj.ScoreLigand(new_mol)
                            dscores.append(ds)
                            pscores.append(ps)
                            if return_docked_pose:
                                new_mol_ = oechem.OEMol(dockedpose)

                        if self.start_dobj is not None:
                            dockedpose2 = oechem.OEMol()
                            newmol2 = oechem.OEMol(new_mol)
                            self.start_dobj.DockMultiConformerMolecule(
                                dockedpose2, newmol2, 1)
                            ds_start = dockedpose2.GetEnergy()
                            ds_start_scores.append(ds_start)
                        if self.track_hscores:
                            for olddobj in self.past_dockobjs:
                                dockedpose2 = oechem.OEMol()
                                newmol2 = oechem.OEMol(new_mol)
                                olddobj.DockMultiConformerMolecule(
                                    dockedpose2, newmol2, 1)
                                ds_old.append(dockedpose2.GetEnergy())
                                ds_old_scores.append(ds_old)

                        if dockobj is not None and return_docked_pose:
                            new_mol = new_mol_
                        oechem.OEAssignAromaticFlags(new_mol)
                        oechem.OEAddExplicitHydrogens(new_mol)
                        oechem.OE3DToInternalStereo(new_mol)
                        new_mol2 = oechem.OEMol(new_mol)

                        gs = oechem.OECreateSmiString(
                            new_mol, oechem.OESMILESFlag_DEFAULT
                            | oechem.OESMILESFlag_Hydrogens
                            | oechem.OESMILESFlag_Isotopes
                            | oechem.OESMILESFlag_BondStereo
                            | oechem.OESMILESFlag_AtomStereo)

                        logger.log(
                            f"(idx / {len(idxs)}: Pose Score {ps}, Dock Score {ds}, Init Score {ds_start}"
                        )

                        data.append((new_mol, new_mol2, gs, action))
                    except Exception as p:
                        logger.error(p)
                        traceback.print_tb(p.__traceback__)

                        continue

            self.past_dockobjs.append(dockobj)
            self.past_receptors.append(receptor)
            logger.log("Sorting on", self.sort)
            if self.sort == 'dscores':
                order = np.argsort(dscores)
                logger.log([dscores[i] for i in order])
            elif self.sort == 'pscores':
                order = np.argsort(pscores)
                logger.log([pscores[i] for i in order])
            elif self.sort == 'iscores':
                order = np.argsort(ds_start_scores)
                logger.log([ds_start_scores[i] for i in order])
            elif self.sort == 'hscores':
                hscores = [
                    np.quantile(np.clip(scoreset, None, 0), 0.)
                    for scoreset in ds_old_scores
                ]
                order = np.argsort(hscores)
                logger.log([hscores[i] for i in order])
            else:
                assert (False)

            self.env.data['dscores'].append(dscores)
            self.env.data['pscores'].append(pscores)
            self.env.data['iscores'].append(ds_start_scores)
            self.env.data['hscores'].append(ds_old_scores)
            data = [data[i] for i in order]
        return data
Ejemplo n.º 22
0
def _run_docking(
    receptor: oechem.OEGraphMol,
    molecules: List[oechem.OEGraphMol],
    dock_method: int,
    num_poses: int = 1,
) -> Union[List[oechem.OEGraphMol], None]:
    """
    Dock molecules into a prepared receptor.
    Parameters
    ----------
    receptor: oechem.OEGraphMol
        An OpenEye molecule holding the prepared receptor.
    molecules: list of oechem.OEGraphMol
        A list of OpenEye molecules holding prepared molecules for docking.
    dock_method: int
        Constant defining the docking method.
    num_poses: int
        Number of docking poses to generate per molecule.
    Returns
    -------
    docked_molecules: list of oechem.OEGraphMol or None
        A list of OpenEye molecules holding the docked molecules.
    """
    from openeye import oedocking
    from ..modeling.OEModeling import generate_reasonable_conformations

    # initialize receptor
    dock_resolution = oedocking.OESearchResolution_High
    dock = oedocking.OEDock(dock_method, dock_resolution)
    dock.Initialize(receptor)

    def score(molecule: oechem.OEGraphMol, dock: oedocking.OEDock = dock):
        """Return the docking score."""
        value = oechem.OEGetSDData(molecule, dock.GetName())
        return float(value)

    docked_molecules = list()

    # dock molecules
    for molecule in molecules:
        # tautomers, enantiomers, conformations
        conformations_ensemble = generate_reasonable_conformations(molecule, dense=True)

        docked_conformations = list()
        # dock tautomers
        for conformations in conformations_ensemble:
            docked_mol = oechem.OEMol()

            # dock molecule
            return_code = dock.DockMultiConformerMolecule(docked_mol, conformations, num_poses)
            if return_code != oedocking.OEDockingReturnCode_Success:
                # TODO: Maybe something for logging
                print(
                    f"Docking failed for molecule with title {conformations.GetTitle()} with error code "
                    f"{oedocking.OEDockingReturnCodeGetName(return_code)}."
                )
                continue

            # store docking data
            oedocking.OESetSDScore(docked_mol, dock, dock.GetName())

            # expand conformations
            for conformation in docked_mol.GetConfs():
                docked_conformations.append(oechem.OEGraphMol(conformation))

        # sort all conformations of all tautomers and enantiomers by score
        docked_conformations.sort(key=score)

        # keep number of conformations as specified by num_poses
        docked_molecules += docked_conformations[:num_poses]

    if len(docked_molecules) == 0:
        # TODO: returning None when something goes wrong
        return None

    return docked_molecules
Ejemplo n.º 23
0
    def __init__(self,
                 env,
                 sort='dscores',
                 return_docked_pose=False,
                 num_returns=-1,
                 orig_pdb=None,
                 useHybrid=False,
                 trackHScores=True,
                 optimize=False):
        self.logger = make_message_writer(env.verbose, self.__class__.__name__)
        with self.logger("__init__") as logger:
            self.sort = sort
            if self.sort not in ['iscores', 'dscores', 'hscores', 'pscores']:
                logger.failure(
                    f"{self.sort} is not a valid sorting method. Exiting",
                    exit_all=True)
            self.return_docked_pose = return_docked_pose
            self.num_returns = num_returns
            self.env = env

            self.orig_pdb = orig_pdb
            self.start_dobj = None
            self.start_receptor = None
            self.track_hscores = trackHScores
            if not self.track_hscores and self.sort == 'hscores':
                logger.error(
                    "Track hscores is set to false but the sorting method desired is hscores. Assuming this was error, continuing  by setting track_hscores to True"
                )
                self.track_hscores = True

            self.past_receptors = []
            self.past_dockobjs = []
            self.past_coordinates = []
            self.optimize = optimize

            self.dockmethod = oedocking.OEDockMethod_Hybrid if useHybrid else oedocking.OEDockMethod_Chemgauss4
            if (not (self.sort != 'iscores'
                     and self.optimize)) and self.orig_pdb is not None:
                pdb = oechem.OEMol()
                prot = oechem.OEMol()
                lig = oechem.OEMol()
                wat = oechem.OEGraphMol()
                other = oechem.OEGraphMol()
                ifs = oechem.oemolistream(self.orig_pdb)
                oechem.OEReadMolecule(ifs, pdb)
                ifs.close()
                if not oechem.OESplitMolComplex(lig, prot, wat, other, pdb):
                    logger.failure("Could not split complex", exit_all=True)

                self.start_receptor = oechem.OEGraphMol()
                logger.log("Building initial receptor file...")
                oedocking.OEMakeReceptor(self.start_receptor, prot, lig)

                self.start_dobj = oedocking.OEDock(self.dockmethod)
                self.start_dobj.Initialize(self.start_receptor)
                assert (self.start_dobj.IsInitialized())
                logger.log("done")
            elif self.sort != 'iscores' and self.optimize:
                logger.log(
                    "Skipping building inital receptor because optmize is set and sorting method is not iscore"
                )
            else:
                logger.log(
                    "Skipping building inital receptor because orig_pdb was not provided."
                )
Ejemplo n.º 24
0
def dock_molecule_to_receptor(molecule, receptor_filename, covalent=False):
    """
    Dock the specified molecules, writing out to specified file

    Parameters
    ----------
    molecule : oechem.OEMol
        The molecule to dock
    receptor_filename : str
        Receptor to dock to
    covalent : bool, optional, default=False
        If True, try to place covalent warheads in proximity to CYS145

    Returns
    -------
    docked_molecule : openeye.oechem.OEMol
        Returns the best tautomer/protomer in docked geometry, annotated with docking score
        None is returned if no viable docked pose found
    """
    import os

    # Extract the fragment name for the receptor
    fragment = extract_fragment_from_filename(receptor_filename)

    # Read the receptor
    from openeye import oechem, oedocking
    receptor = oechem.OEGraphMol()
    if not oedocking.OEReadReceptorFile(receptor, receptor_filename):
        oechem.OEThrow.Fatal("Unable to read receptor")
    #print(f'Receptor has {receptor.NumAtoms()} atoms')

    if not oedocking.OEReceptorHasBoundLigand(receptor):
        raise Exception("Receptor does not have bound ligand")

    #print('Initializing receptor...')
    dockMethod = oedocking.OEDockMethod_Hybrid2
    dockResolution = oedocking.OESearchResolution_High
    dock = oedocking.OEDock(dockMethod, dockResolution)
    success = dock.Initialize(receptor)

    # Add covalent restraint if specified
    warheads_found = find_warheads(molecule)
    if covalent and len(warheads_found) > 0:
        warheads_found = set(warheads_found.keys())

        # Initialize covalent constraints
        customConstraints = oedocking.OEReceptorGetCustomConstraints(receptor)

        # Find CYS145 SG atom
        hv = oechem.OEHierView(receptor)
        hres = hv.GetResidue("A", "CYS", 145)
        proteinHeavyAtom = None
        for atom in hres.GetAtoms():
            if atom.GetName().strip() == 'SG':
                proteinHeavyAtom = atom
                break
        if proteinHeavyAtom is None:
            raise Exception('Could not find CYS145 SG')

        # Add the constraint
        feature = customConstraints.AddFeature()
        feature.SetFeatureName("CYS145 proximity")
        for warhead_type in warheads_found:
            smarts = covalent_warhead_smarts[warhead_type]
            print(f'Adding constraint for SMARTS pattern {smarts}')
            feature.AddSmarts(smarts)
        sphereRadius = 4.0 # Angstroms
        sphereCenter = oechem.OEFloatArray(3)
        receptor.GetCoords(proteinHeavyAtom, sphereCenter)
        sphere = feature.AddSphere()
        sphere.SetRad(sphereRadius)
        sphere.SetCenter(sphereCenter[0], sphereCenter[1], sphereCenter[2])
        oedocking.OEReceptorSetCustomConstraints(receptor, customConstraints)

    # Enumerate tautomers
    from openeye import oequacpac
    tautomer_options = oequacpac.OETautomerOptions()
    tautomer_options.SetMaxTautomersGenerated(4096)
    tautomer_options.SetMaxTautomersToReturn(16)
    tautomer_options.SetCarbonHybridization(True)
    tautomer_options.SetMaxZoneSize(50)
    tautomer_options.SetApplyWarts(True)
    pKa_norm = True
    tautomers = [ oechem.OEMol(tautomer) for tautomer in oequacpac.OEGetReasonableTautomers(molecule, tautomer_options, pKa_norm) ]

    # Set up Omega
    #print('Expanding conformers...')
    from openeye import oeomega
    #omegaOpts = oeomega.OEOmegaOptions(oeomega.OEOmegaSampling_Dense)
    omegaOpts = oeomega.OEOmegaOptions()
    #omegaOpts.SetMaxConfs(5000)
    omegaOpts.SetMaxSearchTime(60.0) # time out
    omega = oeomega.OEOmega(omegaOpts)
    omega.SetStrictStereo(False) # enumerate sterochemistry if uncertain

    # Dock tautomers
    docked_molecules = list()
    from tqdm import tqdm
    for mol in tautomers:
        dockedMol = oechem.OEGraphMol()

        # Expand conformers
        omega.Build(mol)

        # Dock molecule
        retCode = dock.DockMultiConformerMolecule(dockedMol, mol)
        if (retCode != oedocking.OEDockingReturnCode_Success):
            #print("Docking Failed with error code " + oedocking.OEDockingReturnCodeGetName(retCode))
            continue

        # Store docking data
        sdtag = oedocking.OEDockMethodGetName(dockMethod)
        oedocking.OESetSDScore(dockedMol, dock, sdtag)
        oechem.OESetSDData(dockedMol, "docked_fragment", fragment)
        dock.AnnotatePose(dockedMol)

        docked_molecules.append( dockedMol.CreateCopy() )

    if len(docked_molecules) == 0:
        return None

    # Select the best-ranked molecule and pose
    # Note that this ignores protonation state and tautomer penalties
    docked_molecules.sort(key=score)
    best_molecule = docked_molecules[0]

    return best_molecule