You are here

Alternatives to DockMCMProtocol

5 posts / 0 new
Last post
Alternatives to DockMCMProtocol
#1

Hi all,

I have been writing a script with PyRosetta to investigate the interactions of mutant enzyme poses with a small molecule ligand. To dock the ligand into the enzyme's binding site, I've started with a pose where the ligand is placed in the vicinity of the binding position, and then I run the DockMCMProtocol.  However, this docking protocol seems to indiscriminately change the position of the ligand within the binding pocket. Very rarely does the ligand "lock" in to the catalytic residues, and every so often a tested mutation will cause a side chain to occlude the opening of the binding pocket and the subsequent docking runs shocklingly result in an improved interaction energy!

I was wondering if anyone knew of a more appropriate method for local small molecule ligand docking in PyRosetta -- perhaps one that includes more dynamics considerations for the ligand entering and traversing through the binding pocket. I know that in Autodock Vina, you define a cube-shaped region through which the ligand can be docked. Is there something that's somewhat similar in PyRosetta? Any input would be appreciated!

Category: 
Post Situation: 
Thu, 2021-01-28 17:37
swirt

So your placed ligand should be perfectly happy where it is?

This does not sound like a docking scenario.

If your ligand or a very close analogue is in crystal structures, FastRelax works fine, especially if constrained by crystal structure.
If you placed it and are certain of the interactions, then FastRelax constrained to starting positions should be fine.

Have some bonds been distored, say in Pymol to make it work?

If so, you have a repacking event messing things up.
Some movers perturb the ligand, while for other protocols the perturbing mover (RigidBodyRandomizeMovers, RigidBodyPerturbMover, RigidBodySpinMover) have to be called. However, DockMCMProtocol (unlike DockProtocol) does not do a perturbation IIRC. What however can happen in some snippets of code is that a packer is reverting the residue to a default rotamer —ocassionally randomising its location. FastRelax for example may do this and you can see why when looking at the commanding script (midway in doc for binary).

About DockMCMProtocol. It is simple to implement, so it very nice, but may require some customising

pyrosetta.rosetta.protocols.docking.setup_foldtree(pose, 'A_B', pyrosetta.Vector1([1]))
scorefxn = pyrosetta.create_score_function('ligand')
docking = pyrosetta.rosetta.protocols.docking.DockMCMProtocol()
docking.set_scorefxn(scorefxn)
docking.apply(pose)

This mover inherits DockingHighRes, which has a more verbose documentation, such as the protein-protein docking seen in https://graylab.jhu.edu/pyrosetta/downloads/scripts/demo/D100_Docking.py or in the 2-3 notebooks in the teaching material GitHub repo from the Gray lab is a better option.

Additionally, for didactic purposed I really skimming to the bottom of the old ligand_dock binary's documentation: https://www.rosettacommons.org/docs/latest/application_documentation/docking/ligand-dock and it explains what goes on rather verbosely.
Most of the commands don't translate, but one gets the feel for some of the cryptic paramters one may encounter.
 

 

 

 

Fri, 2021-02-05 06:54
matteoferla

Thank you so much for the response and insight! I apologize for not commenting sooner -- I forgot to subscribe to the page.

The ligand in my starting pdb file is not already situated in the "docked" position; it is merely placed in the long narrow binding pocket of my protein's pose. The pose I'm working with has already gone through a FastRelax protocol. I have done no editing in PyMol (however, I modified the structure of the ligand in Chimera). The ligand I'm studying is analogous to benzoate, so I doubt that I have a repacking issue regarding the ligand.

The DockMCMProtocol code you shared is precisely what I have done in my work (unless the 'ligand' score function is not the same as the 'ligand.wts' score function). Do you happen to know of a means by which I can dock in PyRosetta, knowing a particular 3-D region through which the ligand should enter, move through, and dock? Thanks.

Tue, 2021-02-09 19:23
swirt

Yes, 'ligand' uses 'ligand.wts'.

If it is not a repacking issue and you know what contact points, then constraints (restraints) are in order with the docking.
Here is a Q about Pyrosetta and constraints. The distances can be rough (large sigma). And a cool thing is that you can have a gander at what the contribution of each contraint is.

for con in pose.constraint_set().get_all_constraints():
    print(str(con.atom1()), str(con.atom2()), con.score(pose))

One thing to make sure of is that the params file (topology) is correct.
load_PDB_components=False during pyrosetta.init helps in some cases.
Also, your ligand may have an unexpected topology in the params file, say atom names that differ or a pesky proton:

# make pose
pose = pyrosetta.Pose()
params_paths = pyrosetta.rosetta.utility.vector1_string()
params_paths.extend([paramsfile])
resiset = pyrosetta.generate_nonstandard_residue_set(pose, params_paths)
lig = pyrosetta.rosetta.core.conformation.ResidueFactory.create_residue( resiset.name_map( name ) )
pose.append_residue_by_jump(lig, 1)
# minimise just to show it is fine.
cycles = 15
scorefxn = pyrosetta.get_fa_scorefxn()
relax = pyrosetta.rosetta.protocols.relax.FastRelax(scorefxn, cycles)
relax.apply(pose)
# check
import nglview
nglview.show_rosetta(pose)

If all is fine and there are no dodgy protonations, there could be some issues with exotic groups, like nitriles etc., for which you may want to check what the atomtype is in the top of the params file and check the definition of that atomtype in the database folder, specifically if the atom is a donor or acceptor.

> 3-D region through which the ligand should enter, move through, and dock.

Sound like you have an entranceway that controls specificity, which means that a ∆∆G score is more gibberish than normal as it's not the main contributor to the k_off and k_on, so if you were interesting to get something that better correlates with phys-chem data, "dynamic undocking" (tethered MD from binding pocket to solvent) may be something to look into.

 

 

Wed, 2021-02-17 04:57
matteoferla

Thank you so much for the response! The pointers on PyRosetta constraints and the params file topology are noted -- once I get some time this semester to investigate this matter again, I will report back.

Thu, 2021-02-25 21:54
swirt