I am using Rosetta to help design a protein to bind to another protein. Basically, I am taking a known protein/protein interaction, changing some of the residues on one partner, and then asking Rosetta to make compensatory changes on the other partner so that they still bind. Currently, I am basically creating a PackRotamersMover object, allowing the interface residues on the designable protein to be any AA, and then outputting a number of decoys, and examining the lowest scored decoys.
PackRotamersMover uses a simulated annealing approach to try to find a local minimum of the energy of the protein/protein complex. However, what might be more useful would be if I were able to try and find a local minimum of the energy of the complex - the sum of the energies of the two proteins separately - in other words try and find the local minimum of the free energy of binding. This should help to find binding partners with higher affinity.
I was thinking about trying to create a new PackRotamersMover object that used this criteria for minimization instead of simply minimizing the total energy score. I had a few questions before I begin that work though.
1) I know that there are other people working on interface design procedures. The descriptions I have read though are typically more complex than the one I am describing here. They often involve docking during the design process for instance. I'm thinking that these approaches might be a bit more robust, but much more computationally complex. My approach would be a simpler (and potentially less accurate) approach. I haven't seen full descriptions of the protocols other people are developing though, so perhaps they are also doing something similar to what I have described? Does anyone have any insight into whether this approach I am suggesting would be useful, or maybe it's already been done?
2) Looking through the Rosetta code, it looks like the slight change I am suggesting is non-trivial. I was thinking of basically creating a new PackRotamersInterfaceMover which would more or less mirror the PackRotamersMover. The PackRotamersMover currently creates a SimAnnealer object which handles the simulated annealing routine. This in turn calls a function on an InteractionGraph which calculates the current energy of the proposed substitution. So I am thinking that I would need to create a new InteractionGraph which would insert the new residue and/or rotamer, calculate the energy, then split the pose, calculate the energies on each of the new poses, and then return the difference as described above. I'm guessing there's a more efficient way though, rather than creating new poses each time the interaction graph is considering a substitution. Does anyone have any insight into a more efficient means of attack?
Thanks for any comments and or suggestions.