plip icon indicating copy to clipboard operation
plip copied to clipboard

-SO2 in the ligand group makes interaction (Salt bridge/Hbond) with protein but not captured by plip.

Open aniketsh opened this issue 3 years ago • 4 comments

Describe the bug A clear and concise description of what the bug is.

To Reproduce Steps to reproduce the behavior:

  1. Go to '...'
  2. Click on '....'
  3. Scroll down to '....'
  4. 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.

aniketsh avatar Jun 22 '21 08:06 aniketsh

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.

fkaiserbio avatar Jun 28 '21 14:06 fkaiserbio

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.

ljmartin avatar Jul 04 '21 23:07 ljmartin

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

ljmartin avatar Jul 05 '21 01:07 ljmartin

Thanks for pointing this out and your detailed investigation! Might be even something to include as a command line option for advanced users.

fkaiserbio avatar Jul 06 '21 06:07 fkaiserbio