Whether or not a molecule binds to a protein pocket depends not only on the interactions, but on the empty space surrounding the molecule. We need an algorithm for mapping out the empty space in a protein pocket. Here’s an outline of the python script we need:
- Load the coordinates of the protein and the coordinates of the ligand (Dr. Durrant will provide numpy arrays of these 3D coordinates).
- Calculate the convex hull of the alpha carbons of the atom. (Dr. Durrant will provide numpy array of the alpha-carbon coordinates.) I believe scipy has definitions for this purpose.
- Place “seed points” near the locations of the ligand atoms (coordinates snapped to the nearest 0.5 or 0.25 A, per user parameter).
- Recursively consider adjacent points on a 3D grid, spreading out from the seed points in all three cardinal directions. The recursion stops if the point goes outside the convex hull, or if it comes too close to one of the protein atoms.
- The function returns the 3D points that fill the negative space, as a numpy array.


In our lab, we often need to run independent python functions on multiple processors. By independent, I mean the functions don’t need to communicate with each other (embarrassingly parallel). Our current scripts divide the individual “tasks” evenly in the beginning and then run each “chunk” (i.e., subset of all tasks) on a separate processor. But occasionally one of these chunks will take much longer to finish than the others, so the processors aren’t all used optimally.