plip
plip copied to clipboard
-SO2 in the ligand group makes interaction (Salt bridge/Hbond) with protein but not captured by plip.
Describe the bug A clear and concise description of what the bug is.
To Reproduce Steps to reproduce the behavior:
- Go to '...'
- Click on '....'
- Scroll down to '....'
- See error
Expected behavior A clear and concise description of what you expected to happen.
Screenshots If applicable, add screenshots to help explain your problem.
Desktop (please complete the following information):
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
Smartphone (please complete the following information):
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
Additional context Add any other context about the problem here.
Could you please give more details? Ideally the PDB file you used and the exact specification of the bond you are expecting PLIP to detect.
Sorry to hijack this issue but I came here for the same thing. Here's a repro (PDB: 4NIE). One might expect a hydrogen bond to arginine (ARG120) and or backbone nitrogen (of LEU40) from the sulfone, although maybe that's arguable? Both of these are present in the RCSB ligand interaction visualiser: https://www.rcsb.org/3d-view/4NIE?preset=ligandInteraction&sele=NBH
Happy to try contributing something myself if you could point me to the area of the code.
#imports:
from plip.structure.preparation import PDBComplex
from plip.exchange.report import BindingSiteReport
import prody
prody.confProDy(verbosity='none')
#load pdb using prody:
pdbid = '4NIE'
chA = prody.parsePDB(pdbid, chain='A',verbose=False)
prody.writePDB('temp.pdb', chA)
#analyse binding site of drug-like ligand:
my_mol = PDBComplex()
my_mol.load_pdb('./temp.pdb') # Load the PDB file into PLIP class
ligname = 'NBH'
my_mol.analyze()
for key, value in my_mol.interaction_sets.items():
if ligname in key:
intrxn = value
#print hbonds. Note, no interaction with arginine is present.
bsr = BindingSiteReport(intrxn)
print(bsr.hbond_info)
output. Notice no ARG or LEU:
[(377, 'PHE', 'A', 601, 'NBH', 'A', False, '2.07', '3.04', '168.46', False, 1988, 'Nam', 909, 'O2', (24.272, -4.851, -10.765), (27.161, -5.19, -11.658))]
Also thanks for PLIP! It's awesome!!
PS - note that if you put 4NIE into the web server, a different arginine will be shown. ARG120 is absent, even though the side chain is closer, because it is not recognised as a bonding residue.
apologies if this is a double post, I lost a post somewhere...
the 'simple' definition of HBA used by OpenBabel
is here: https://github.com/openbabel/openbabel/blob/08e23f39b0cc39b4eebd937a5a2ffc1a7bac3e1b/src/atom.cpp#L1730
this uses a blanket definition for all oxygens.
Arguably this is incorrect, and SO2 oxygens should not be hydrogen bond acceptors. The updated definition is here: https://github.com/openbabel/openbabel/blob/08e23f39b0cc39b4eebd937a5a2ffc1a7bac3e1b/src/atom.cpp#L1779
If anyone prefers to use the simple definition, then they need to swap at.OBAtom.IsHbondAcceptor
to at.OBAtom.IsHbondAcceptorSimple
in here https://github.com/pharmai/plip/blob/b481cf70870f6f100037551861cef32adef99105/plip/structure/preparation.py#L509
def find_hba(self, all_atoms):
"""Find all possible hydrogen bond acceptors"""
data = namedtuple('hbondacceptor', 'a a_orig_atom a_orig_idx type')
a_set = []
for atom in filter(lambda at: at.OBAtom.IsHbondAcceptor(), all_atoms):
if atom.atomicnum not in [9, 17, 35, 53] and atom.idx not in self.altconf: # Exclude halogen atoms
a_orig_idx = self.Mapper.mapid(atom.idx, mtype=self.mtype, bsid=self.bsid)
a_orig_atom = self.Mapper.id_to_atom(a_orig_idx)
a_set.append(data(a=atom, a_orig_atom=a_orig_atom, a_orig_idx=a_orig_idx, type='regular'))
a_set = sorted(a_set, key=lambda x: x.a_orig_idx)
return a_set
Thanks for pointing this out and your detailed investigation! Might be even something to include as a command line option for advanced users.