I need to programmatically add Hydrogen atoms to a PDB file (say, 16PK.pdb) using BioPython.
What algorithm should I use for this?
Not actually and answer as you cannot do it with biopython.PDB
. But there are may other tools.
Several are online, for example: https://zhanggroup.org/HAAD/ by the folk who wrote I-Tasser.
Nearly every MD pipeline has their own protonation algorithm. The only hydrogens that are an issue are histidine protonation —HIE
vs. HID
— and protonation states of catalytic residues (CYZ
vs. CYS
etc).
The PyMOL python module is really good and can do a lot. Only issue is that the easiest way to install is via conda.
conda install -c conda-forge -c schrodinger pymol-bundle
with which one can:
import pymol2
pymol2.PyMOL() as pymol:
pymol.cmd.load('👾👾👾.pdb', 'myprotein') # file
# pymol.cmd.fetch('👾👾👾👾', 'myprotein') # PDB code
pymol.cmd.h_add()
pymol.cmd.save('👻👻👻.pdb')
One can find neighbours to a given atom too (see this Q&A), select by secondary structure, define secondary structure (pymol.cmd.dss()
) etc. A caveat is that, bar for some commands like pymol.cmd.get_model(selection).atom
, one does not interact directly with the atoms and everything is done via selections.
However, as this Q follows on from this unanswerable one and in turn from several others about SS. I am guessing it is to determine the hydrogen bond distances between different sheets. These have a backbone amide nitrogen (name N
) donating a hydrogen (H
, not HA
etc.) to an accepting backbone amide oxygen of another sheet (O
). Unless you want an exact distance, you could simply use the distance between these heavy atoms, which would be slightly larger than the H-N
bond plus the H•O
hydrogen bond and the oxygen may not be coplanar with the planar amide.
pymol2.PyMOL() as pymol:
should throw an error.
$\endgroup$
Commented
Oct 3, 2022 at 20:21
pymol
but an instance of multisession pymol2.PyMOL
which behaves like the module but is way better
$\endgroup$
Commented
Oct 4, 2022 at 20:24
conda install -c conda-forge openbabel
from openbabel import pybel as pb
babel_mol = pb.readfile(format="pdb", filename=path_to_pdb).__next__()
babel_mol.addh()
babel_mol.write(format='pdb', filename=path_to_babel_pdbh, overwrite=True)