A hydrogen bond is formed when two electonegative atoms compete for the same hydrogen atom. While the hydrogen is covalently bound to one of the atoms, the donor, it interacts with the other atom, the acceptor. The possibility to interact with one atom, while covalently bound to another, is special for hydrogens. The electrostatic and covalent aspects of the bond cause the three atoms to stay mostly linear.
H-bonds in proteins most frequently involve the C=O and N-H groups of amino acids in the polypeptide chain. A single oxygen can simultaneously participate in two bonds.
Here again some example code that can calculate the energy of an H-bond between the N-H and C=O atoms of two amino acids using BioJava. It assumes that the coordinates for H-bonds were calculated as described in one of my earlier postings.
/** calculate HBond energy of two groups in cal/mol ...
* see Creighton page 147 f
*
* Jeffrey, George A., An introduction to hydrogen bonding, Oxford University Press, 1997.
* categorizes hbonds with donor-acceptor distances of
* 2.2-2.5 Å as "strong, mostly covalent",
* 2.5-3.2 Å as "moderate, mostly electrostatic",
* 3.2-4.0 Å as "weak, electrostatic".
* Energies are given as 40-14, 15-4, and <4 kcal/mol respectively.
*
*/
public double calculateHBondEnergy(AminoAcid one, AminoAcid two )
throws StructureException{
//System.out.println("calcHBondEnergy" + one + "|" + two);
Atom N = one.getN();
Atom H = one.getH();
Atom O = two.getO();
Atom C = two.getC();
double dno = Calc.getDistance(O,N);
double dhc = Calc.getDistance(C,H);
double dho = Calc.getDistance(O,H);
double dnc = Calc.getDistance(C,N);
double contact = MINDIST ;
// there seems to be a contact!
if ( (dno < contact) || (dhc < contact) || (dnc < contact) || (dno < contact)) {
//System.out.println("!!! contact " + one + " " + two);
return HBONDLOWENERGY ;
}
double e1 = Q / dho - Q / dhc ;
double e2 = Q / dnc - Q / dno ;
double energy = e1 + e2;
// bond too weak
if ( energy > HBONDHIGHENERGY)
return 0;
// test to avoid bond too strong
if ( energy > HBONDLOWENERGY)
return energy;
return HBONDLOWENERGY ;
}