Commit e30034ea authored by Bharath Ramsundar's avatar Bharath Ramsundar
Browse files

Binding pocket specification

parent 6df39d4e
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ from subprocess import call
class Docker(object):
  """Abstract Class specifying API for Docking."""

  def dock(self, protein_file, ligand_file):
  def dock(self, protein_file, ligand_file, centroid=None, box_dims=None):
    raise NotImplementedError

class VinaGridRFDocker(Docker):
@@ -47,10 +47,10 @@ class VinaGridRFDocker(Docker):
    self.pose_generator = VinaPoseGenerator(
        exhaustiveness=exhaustiveness, detect_pockets=detect_pockets) 

  def dock(self, protein_file, ligand_file):
  def dock(self, protein_file, ligand_file, centroid=None, box_dims=None):
    """Docks using Vina and RF."""
    protein_docked, ligand_docked = self.pose_generator.generate_poses(
        protein_file, ligand_file)
        protein_file, ligand_file, centroid, box_dims)
    score = self.pose_scorer.score(protein_docked, ligand_docked)
    return (score, (protein_docked, ligand_docked))

@@ -78,9 +78,9 @@ class VinaGridDNNDocker(object):
    self.pose_generator = VinaPoseGenerator(
        exhaustiveness=exhaustiveness, detect_pockets=detect_pockets) 

  def dock(self, protein_file, ligand_file):
  def dock(self, protein_file, ligand_file, centroid=None, box_dims=None):
    """Docks using Vina and DNNs."""
    protein_docked, ligand_docked = self.pose_generator.generate_poses(
        protein_file, ligand_file)
        protein_file, ligand_file, centroid, box_dims)
    score = self.pose_scorer.score(protein_docked, ligand_docked)
    return (score, (protein_docked, ligand_docked))
+22 −18
Original line number Diff line number Diff line
@@ -85,7 +85,8 @@ class VinaPoseGenerator(PoseGenerator):
    self.vina_cmd = os.path.join(self.vina_dir, "bin/vina")
      

  def generate_poses(self, protein_file, ligand_file, out_dir=None):
  def generate_poses(self, protein_file, ligand_file,
                     centroid=None, box_dims=None, out_dir=None):
    """Generates the docked complex and outputs files for docked complex."""
    if out_dir is None:
      out_dir = tempfile.mkdtemp()
@@ -102,6 +103,9 @@ class VinaPoseGenerator(PoseGenerator):
    receptor_pybel = next(pybel.readfile(str("pdb"), str(protein_hyd)))
    # TODO(rbharath): Need to add some way to identify binding pocket, or this is
    # going to be extremely slow!
    if centroid is not None and box_dims is not None:
      protein_centroid = centroid
    else:
      if not self.detect_pockets:
        protein_centroid, protein_range = get_molecule_data(receptor_pybel)
        box_dims = protein_range + 5.0
+21 −0
Original line number Diff line number Diff line
@@ -68,6 +68,27 @@ class TestDocking(unittest.TestCase):
    assert os.path.exists(protein_docked)
    assert os.path.exists(ligand_docked)

  def test_vina_grid_rf_docker_specified_pocket(self):
    """Test that VinaGridRFDocker can dock into spec. pocket."""
    if sys.version_info >= (3,0):
      return
    
    current_dir = os.path.dirname(os.path.realpath(__file__))
    protein_file = os.path.join(current_dir, "1jld_protein.pdb")
    ligand_file = os.path.join(current_dir, "1jld_ligand.sdf")

    docker = dc.dock.VinaGridRFDocker(
        exhaustiveness=1, detect_pockets=False)
    (score, (protein_docked, ligand_docked)) = docker.dock(
        protein_file, ligand_file, centroid=(10, 10, 10),
        box_dims=(1,1,1))
  

    # Check returned files exist
    assert score.shape == (1,)
    assert os.path.exists(protein_docked)
    assert os.path.exists(ligand_docked)

  def test_pocket_vina_grid_rf_docker_dock(self):
    """Test that VinaGridRFDocker can dock."""
    if sys.version_info >= (3,0):