Skip to content

molpack — Python

Packmol-grade molecular packing in Rust, with Python bindings.

molpack produces a non-overlapping arrangement of \(N\) molecule types with user-specified copy counts under geometric restraints. The engine is a faithful port of Packmol's GENCAN-driven three-phase algorithm (Martínez et al. 2009); correctness is pinned against Packmol's reference output for five canonical workloads.

At a glance

import molrs
from molpack import InsideBoxRestraint, Molpack, Target

frame = molrs.read_pdb("water.pdb")

water = (
    Target(frame, count=100)
    .with_name("water")
    .with_restraint(InsideBoxRestraint([0.0, 0.0, 0.0], [40.0, 40.0, 40.0]))
)

packer = Molpack().with_tolerance(2.0).with_seed(42)
frame = packer.pack([water], max_loops=200)
print(f"packed {frame['atoms'].nrows} atoms")

Next steps

See also

  • Rust crate: molcrafts-molpack — the underlying engine. All algorithmic details are documented there.
  • molcrafts-molrs — companion package for file I/O (PDB, XYZ, …) and the Frame data model. Pass a molrs.Frame directly to Target; no manual array extraction needed. Molpack.pack() returns a Frame-compatible structure for the writer of your choice.