Experiment: GTP to GDP

This experiment is based on a question I received —thank you <ask permission first>.

Given a protein bound to ATP or GTP convert it to ADP+Pi and GDP+Pi. This seems easy, i.e. Victor(hits=['GTP']).place(gdp_smiles). However, there are two complication:

  • PyRosetta knows about nucleotide polymers

  • the GTP is bonded to the magnesium ion via a donor bond.

In (Py)Rosetta, there are four levels of residues types (what the code calls params files, called topology files in other communities)

  1. The core ones you cannot overwrite (ALA, NME etc.)

  2. The ones you provide

  3. The regular “database” folder ones (NTPs, but not NDP or PO4)

  4. The PDB component database —autogenerated with occasional nasty protonations and that blow up easily

Download HRAS GTP

The model I chose is HRas as it has been solved bound to different forms:

  • 1AA9 GDP + MG no Pi

  • 1XD2 GDP + MG + Pi

  • 1QRA GTP + MG

So I’ll get 1QRA and make it into GDP+PO4 and compare it to 1QRA’s GDP.

Download

I’ll clean up the structure in PyRosetta. The first step has the caveat that toolbox rcsb strips ligands and stuff, so it needs to be done differently.

import pyrosetta_help as ph
pdb_filename = ph.download_pdb('1QRA')
pose = pyrosetta.pose_from_pdb(pdb_filename)

Save the apo structure

In a first pass I did:

pyrosetta.rosetta.core.pose.remove_nonprotein_residues(pose)
apo_filename = 'apo.pdb'
pose.dump_pdb(apo_filename)

The remove_nonprotein_residues removes the magnesium, which is bad. So a more convoluted way is required, i.e. select and delete the GTP:

pr_rs = pyrosetta.rosetta.core.select.residue_selector
gtp_sele = pr_rs.ResidueNameSelector()
gtp_sele.set_residue_name3('GTP')
gtp_idx = pr_rs.ResidueVector(  gtp_sele.apply(pose)  )[1]
pose.delete_residue_slow(gtp_idx)
assert len(pr_rs.ResidueVector(  gtp_sele.apply(pose)  )) == 0

and the waters:

hoh_sele = pr_rs.ResidueNameSelector()
hoh_sele.set_residue_name3('HOH')
for hoh_idx in reversed(list(pr_rs.ResidueVector(  hoh_sele.apply(pose)  ))):
    pose.delete_residue_slow(hoh_idx)
assert len(pr_rs.ResidueVector(  hoh_sele.apply(pose)  )) == 0

before saving:

apo_filename = 'apo.pdb'
pose.dump_pdb(apo_filename)

Just to make sure it worked, let’s have a gander:

import nglview as nv

view = nv.show_rosetta(pose)
view.add_hyperball(sele='not polymer')
view

Migration to be continued.