3. Protein-protein interactions¶
This notebooks shows how to compute a fingerprint for protein-protein interactions.
Here we will investigate the interactions in a G-protein coupled receptor (GPCR) between a particular helix (called TM3) and the rest of the protein.
This can obviously be applied to proteins that don’t belong to the same chain/segment, as long as you can figure out an appropriate MDAnalysis selection
[1]:
import MDAnalysis as mda
import prolif as plf
[2]:
# load traj
u = mda.Universe(plf.datafiles.TOP, plf.datafiles.TRAJ)
tm3 = u.select_atoms("resid 119:152")
prot = u.select_atoms("protein and not group tm3", tm3=tm3)
tm3, prot
[2]:
(<AtomGroup with 531 atoms>, <AtomGroup with 4457 atoms>)
[3]:
# prot-prot interactions
fp = plf.Fingerprint(["HBDonor", "HBAcceptor", "PiStacking", "PiCation", "CationPi", "Anionic", "Cationic"])
fp.run(u.trajectory[::10], tm3, prot)
[3]:
<prolif.fingerprint.Fingerprint: 7 interactions: ['HBDonor', 'HBAcceptor', 'Cationic', 'Anionic', 'PiCation', 'CationPi', 'PiStacking'] at 0x7fba198588e0>
[4]:
df = fp.to_dataframe()
df.head()
[4]:
ligand | GLN119.A | ... | ALA150.A | ILE151.A | THR152.A | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
protein | GLN189.A | ALA190.A | ALA192.A | GLU194.A | VAL196.A | SER197.A | ... | ALA154.A | ARG238.A | ALA154.A | ARG238.A | ASN245.A | ASP153.A | GLU234.A | ARG238.A | LYS241.A | |||||
interaction | HBAcceptor | HBDonor | HBDonor | HBAcceptor | HBDonor | HBAcceptor | HBDonor | HBAcceptor | HBDonor | HBAcceptor | ... | HBAcceptor | HBAcceptor | HBAcceptor | HBAcceptor | HBAcceptor | HBDonor | HBAcceptor | HBDonor | HBAcceptor | HBAcceptor |
Frame | |||||||||||||||||||||
0 | False | False | True | False | False | True | False | False | False | False | ... | False | False | False | False | False | False | False | False | False | False |
10 | False | False | False | False | False | False | False | False | False | False | ... | False | False | False | True | False | False | False | False | False | False |
20 | False | False | False | False | False | False | False | False | False | True | ... | False | False | False | True | False | False | True | False | True | False |
30 | False | False | False | False | False | False | False | False | False | False | ... | False | False | False | False | False | False | False | False | False | False |
40 | False | False | False | False | True | False | False | True | False | False | ... | False | False | True | True | False | False | False | False | False | False |
5 rows × 55 columns
[5]:
# show interactions for a specific ligand residue
df.xs("ARG147.A", level="ligand", axis=1).head(5)
[5]:
protein | ALA84.A | GLU309.B | THR313.B | |
---|---|---|---|---|
interaction | HBDonor | HBDonor | Cationic | HBDonor |
Frame | ||||
0 | False | False | False | False |
10 | False | False | False | False |
20 | True | False | False | False |
30 | False | False | False | False |
40 | False | True | True | False |
[6]:
# same for a protein residue
df.xs("GLU309.B", level="protein", axis=1).head(5)
[6]:
ligand | ARG147.A | |
---|---|---|
interaction | HBDonor | Cationic |
Frame | ||
0 | False | False |
10 | False | False |
20 | False | False |
30 | False | False |
40 | True | True |
[7]:
# display a specific type of interaction
df.xs("Cationic", level="interaction", axis=1).head(5)
[7]:
ligand | ARG147.A |
---|---|
protein | GLU309.B |
Frame | |
0 | False |
10 | False |
20 | False |
30 | False |
40 | True |
[8]:
# calculate the occurence of each interaction on the trajectory
occ = df.mean()
# restrict to the frequent ones
occ.loc[occ > 0.3]
[8]:
ligand protein interaction
CYS122.A GLY118.A HBDonor 0.84
ASP123.A LYS191.A Anionic 0.32
TRP125.A VAL102.A HBDonor 0.60
TYR109.A PiStacking 0.48
TRP115.A PiStacking 0.80
SER127.A SER181.A HBDonor 0.32
ASP129.A TYR359.B HBAcceptor 0.96
HSD139.A TRP174.A PiStacking 0.36
ASP146.A TYR157.A HBAcceptor 0.88
ARG161.A HBAcceptor 0.48
Anionic 0.36
ARG147.A GLU309.B HBDonor 0.44
Cationic 0.44
TRP149.A ASP153.A HBAcceptor 0.36
dtype: float64
[9]:
# regroup all interactions together and do the same
g = (df.groupby(level=["ligand", "protein"], axis=1)
.sum()
.astype(bool)
.mean())
g.loc[g > 0.3]
[9]:
ligand protein
ARG147.A GLU309.B 0.44
ASP123.A LYS191.A 0.32
ASP129.A TYR359.B 0.96
ASP146.A ARG161.A 0.48
TYR157.A 0.88
CYS122.A GLY118.A 0.84
HSD139.A TRP174.A 0.36
SER127.A SER181.A 0.32
TRP125.A TRP115.A 0.80
TYR109.A 0.48
VAL102.A 0.60
TRP149.A ASP153.A 0.36
dtype: float64