Interaction - Dipole

An extensive tutorial on molecular dipoles for computer beginners, including Python exercises.

What is a Dipole?

Imagine a Tug-of-War. On one side, you have a very strong player (like an Oxygen atom), and on the other, a weaker player (like a Hydrogen atom).

In a molecule, atoms share electrons to stay bonded. However, some atoms are “greedier” than others—this is called electronegativity.

  • The Greedy Atom: Pulls the electrons closer to itself. It becomes slightly negative (δ\delta-).
  • The Giving Atom: Loses its grip on the electrons. It becomes slightly positive (δ+\delta+).

This separation of charge—a positive end and a negative end—is called a Dipole.

Tip

Think of a dipole like a battery or a compass needle. It has a “plus” side and a “minus” side, and this makes it react to electric fields and other molecules.

Why are Dipoles Important?

Dipoles are the reason why biological molecules interact the way they do:

  1. Water’s Stickiness: Water is a very strong dipole. This allows it to dissolve salts and hold proteins together.
  2. Protein Folding: Many parts of a protein (like the backbone) are dipoles. They line up like magnets to form structures like Alpha Helices.
  3. Molecular Recognition: Drugs often find their targets because their dipoles “click” into place with the dipoles of a protein.

Python Exercise: Calculating a Dipole Moment

In physics, we measure how “strong” a dipole is using a Dipole Moment vector. The formula is: μ=qiri\vec{\mu} = \sum q_i \vec{r}_i

Which basically means: “Multiply each charge by its position and add them all up.”

1. Setup

We will use ProDy and NumPy. If you haven’t set up your environment yet:

Terminal window
uv init dipole-project
cd dipole-project
uv add prody numpy

2. The Python Script

We will calculate the dipole moment of a peptide bond (the link between amino acids). The peptide bond is a famous dipole in biology!

calc_dipole.py
import numpy as np
from prody import parsePDB
# 1. Load a protein (Ubiquitin)
pdb = parsePDB('1ubq')
# 2. Focus on a single peptide bond (Residue 1 and 2)
# Specifically the C=O of residue 1 and N-H of residue 2
# For simplicity, let's just look at the Carbonyl group (C=O) of the first residue
carbonyl = pdb.select('resnum 1 and name C O')
if carbonyl:
# 3. Define approximate partial charges (from AMBER force field)
# Carbon is roughly +0.5, Oxygen is roughly -0.5
charges = {
'C': 0.51,
'O': -0.51
}
# 4. Calculate the center of mass (for reference)
coords = carbonyl.getCoords()
names = carbonyl.getNames()
# We'll calculate the dipole relative to the geometric center
center = np.mean(coords, axis=0)
dipole_vector = np.zeros(3)
print("Atom Contributions:")
for i, atom_name in enumerate(names):
q = charges.get(atom_name, 0)
pos = coords[i] - center # Position relative to center
contribution = q * pos
dipole_vector += contribution
print(f"- {atom_name}: Charge {q:>5}, Pos {pos}, Contrib {contribution}")
# 5. Magnitude of the dipole
# In units of e*Angstrom. (1 e*A ≈ 4.8 Debye)
magnitude_ea = np.linalg.norm(dipole_vector)
magnitude_debye = magnitude_ea * 4.8
print(f"\nDipole Vector: {dipole_vector}")
print(f"Magnitude: {magnitude_ea:.2f} e·Å")
print(f"Magnitude: {magnitude_debye:.2f} Debye")
else:
print("Could not find the Carbonyl group.")

3. Understanding the Code

  • partial charges: Atoms in a molecule don’t usually have full charges like +1 or -1. They have fractions, like +0.51. These are called “partial charges.”
  • coords[i] - center: We calculate the dipole relative to the center of the group.
  • Debye: This is the standard unit scientists use for dipoles. A single water molecule has a dipole of about 1.85 Debye.

Challenge for You

  1. Entire Residue: Modify the code to select an entire residue (like resnum 10). You will need to find a table of partial charges for all atoms (N, CA, C, O, etc.).
  2. Alpha Helix: If you select a whole Alpha Helix, do the dipoles add up? (Hint: Yes! Alpha helices have a massive “Macro-dipole” because all the small peptide dipoles point the same way).
  3. Distance: What happens to the magnitude if you artificially move the Oxygen further away from the Carbon in the pos calculation?

Further Reading