Surface areaat proteomescale.
zsasa computes solvent accessible surface area for structures, complexes and MD trajectories. 23,586 human AlphaFold structures in 13.4 s on a laptop, in under 85 MiB.
E. coli AlphaFold proteome, 4,370 structures. zsasa 0.9.0, bitmask f32, 10 threads, Apple M4. Methods
Atoms 602
Probe 1.4 Å
Test points –
Scan –
One engine, from the shell or from Python.
The same Zig core backs a standalone CLI and NumPy-based Python bindings. Wheels ship for Linux, macOS and Windows.
CLI reference →Python API →
pip install zsasauv add zsasacurl -fsSL https://raw.githubusercontent.com/N283T/zsasa/main/install.sh | shnix run github:N283T/zsasa -- calc structure.cif output.json# One structure
zsasa calc 1ubq.pdb out.json
# A directory of structures
zsasa batch structures/ results/
# An MD trajectory
zsasa traj trajectory.xtc topology.pdb --stride=10Classifier 'CCD': 660 atoms classified, 0 fallback
Calculated SASA for 660 atoms
Total area: 5656.65 ŲOutput of the first command on examples/1ubq.pdb.
import numpy as np
from zsasa import calculate_sasa
coords = np.array([[0.0, 0.0, 0.0], [3.0, 0.0, 0.0]])
radii = np.array([1.5, 1.5])
result = calculate_sasa(coords, radii)
print(f"Total SASA: {result.total_area:.2f} Ų")
print(f"Per-atom: {result.atom_areas}")from zsasa.integrations.gemmi import calculate_sasa_from_structure
result = calculate_sasa_from_structure("protein.cif")
print(f"Total: {result.total_area:.1f} Ų")
print(f"Polar: {result.polar_area:.1f} Ų")
print(f"Apolar: {result.apolar_area:.1f} Ų")What gets measured.
Inflate every atom by the radius of a water-sized probe, 1.4 Å. The part of each inflated sphere that no neighbour covers is where solvent can reach. Shrake–Rupley estimates that area by testing points on each sphere.
The figure runs the same test live, on one plane through ubiquitin. Drag the ruler to move the plane.
Algorithms →Computed in your browser from the 602 heavy atoms of ubiquitin, with element radii for illustration.
Faster, in a fraction of the memory.
Whole AlphaFold proteomes, timed end to end: parsing, SASA and output. Exact f64 and f32 modes target matched Shrake–Rupley outputs; bitmask modes are a throughput-oriented approximation with a validated envelope.
Batch benchmarks →Batch throughput and memory at 10 threads
Data table
Built for whole datasets.
The same engine handles one structure, a proteome directory, or an MD trajectory.
Guides →Shrake–Rupley and Lee–Richards
Shrake–Rupley is fast and recommended; Lee–Richards is the precise alternative. Both run in f64 or f32.
mmCIF, PDB, JSON, XTC, DCD
Structure files in, JSON or CSV out. Trajectories with automatic unit conversion.
CCD-aware classification
Hybridization-based radii for any chemical component, plus ProtOr, NACCESS, OONS and custom TOML tables.
Per-residue, RSA, polarity
Residue aggregation, relative accessibility and polar / nonpolar partitioning without extra tooling.
Batch and trajectory native
Directory batch processing and streaming MD analysis are subcommands, not shell loops.
Linux, macOS, Windows
A CLI binary, a Python package on PyPI, and a Zig library with interactive autodoc.
Works with the parser you already use.
The integration modules share a consistent interface across libraries.
Integrations overview →Cite zsasa.
If zsasa is part of your research, please cite the bioRxiv preprint.
Read the preprintzsasa: a Zig-based engine for high-throughput solvent accessible surface area at proteome scale
@article{Nagae2026zsasa,
author = {Nagae, Tsubasa and Tomii, Kentaro},
title = {zsasa: a Zig-based engine for high-throughput solvent accessible surface area at proteome scale},
journal = {bioRxiv},
year = {2026},
doi = {10.64898/2026.06.29.733683}
}Something off? Say so.
Bugs and requests are tracked as GitHub issues, and the forms ask for what it takes to reproduce a problem. Questions go to Discussions.
Open issues