APBS

Adaptive Poisson-Boltzmann Solver — the reference open-source tool for continuum electrostatics on biomolecules. Computes the electrostatic potential φ(r) around a protein by solving the nonlinear Poisson-Boltzmann equation on a finite-difference grid with ion-exclusion regions and dielectric discontinuity at the solvent boundary.

Reference: Jurrus E et al. 2018 Protein Science 27:112 (DOI 10.1002/pro.3280).

What It Does

  • Solves NLPBE / LPBE on a finite-difference grid around a molecule (PQR format with partial charges + radii)
  • Outputs 3D potential map .dx (OpenDX format) in units of kT/e at chosen temperature
  • Supports multigrid (mg-auto, mg-para), boundary methods (sdh, zero, focus), and solvation schemes (smooth molecular / spline-based charge mapping)
  • Companion: pdb2pqr — converts PDB → PQR with force-field charges + radii (PARSE, AMBER, CHARMM, swanson); handles protonation at user pH (propka) or default force-field rules

Install

conda create -n apbs -c conda-forge apbs pdb2pqr -y

Verified 2026-04-24: apbs 3.4.1 + pdb2pqr 3.6.1 install cleanly; propka 3.5 broken on Python 3.14 (AttributeError Parameters.__annotations__) — workaround: omit --titration-state-method=propka and use force-field default pKa rules for pH 7-8 work. For finer pKa prediction, patch propka or use older Python.

How to Use

pdb2pqr (prep)

pdb2pqr --ff=PARSE --keep-chain input.pdb output.pqr
# Add --with-ph=7.4 --titration-state-method=propka if propka works in env.

APBS (solve)

Requires a .in input file:

read
  mol pqr input.pqr
end
elec
  mg-auto
  dime 129 129 129
  cglen 120 120 120
  fglen 64 64 64
  cgcent 0 0 0
  fgcent 0 0 0
  mol 1
  npbe                  # nonlinear PBE (lpbe for linear)
  bcfl sdh              # single Debye-Hückel boundary
  pdie 2.0              # protein dielectric
  sdie 78.54            # water dielectric at 298 K (use 74.2 at 310 K if needed)
  srfm smol             # smooth molecular surface
  chgm spl2             # spline-2 charge mapping
  sdens 10.0            # surface density
  srad 1.4              # probe radius (Å)
  swin 0.3              # Å
  temp 310.0            # K
  ion charge  1 conc 0.150 radius 2.0
  ion charge -1 conc 0.150 radius 2.0
  calcenergy no
  calcforce no
  write pot dx out      # writes out.dx
end
quit

Then: apbs input.in. Output is out.dx — readable in VMD / PyMOL for isosurface, or parse directly with Python (see pharmacochaperone_apbs_wt_mut_pocket.py).

Python-side dx parser

Skeleton:

with dx_path.open() as f: lines = f.readlines()
# Parse: "object 1 ... counts NX NY NZ" → dims
# "origin X Y Z" → grid origin
# "delta X Y Z" → three lines, grid spacing
# "object 3 ... array" → dims[0]*dims[1]*dims[2] float values in row-major

Key Units & Conversions

  • Potential output is in kT/e at user temperature (not SI units)
  • At 310 K: 1 kT/e ≈ 0.616 kcal/mol per unit charge
  • For a point charge q (in e units) at location r: Coulomb energy contribution = q × φ(r)

STRC Research Usage

  • Phase 5j WT-vs-mutant pocket electrostatics (STRC h01 Phase 5j APBS WT vs Mutant Pocket Electrostatics 2026-04-24) — quantified +7.1 kT/e mean shift in E1659A pocket; explained Phase 4c-v3b Vina WT-bias as a Vina artefact at the force-field level.
  • Future Phase 5g holo-MD per-frame APBS — expected to give distribution of pocket potentials over an ensemble, tightening the pharmacochaperone mechanism prediction.

Known Limitations

  • Continuum solvent — does not capture discrete waters or specific H-bond networks
  • Implicit ions via Debye-Hückel — saturated-salt / high-valent-ion regimes require explicit ion models (APBS does have ionconc but the screening is mean-field)
  • propka 3.5 is broken on Python 3.14 in the conda-forge apbs channel (2026-04-24 verified) — use default force-field pKa until upstream fix
  • Requires PDB without waters / alt-confs / inconsistent chains — strip_water_ions_to_pdb or equivalent cleanup first
  • mg-auto performance is fine for <10k atoms; for larger complexes use mg-para (MPI) or focusing

Connections