Why Frame#

CHILL, rings, cages, Steinhardt, and SOAP are per-snapshot. The handle is one configuration: neighbours, a bonded graph, and labels on that cloud. Frame.cages is the ice score (HC = Ih, DDC = Ic, neither = water).

Cutoff neighbour lists (neighbor_list, CHILL, cutoff-graph cages) go through vesin when the engine is built with it. The default ice score (cages(seeded=True)) uses linkcell k-NN. Those backends are not interchangeable.

Runtime knobs#

pydseams.config shares the engine twelve-factor table. Defaults live in the module. SEAMS_CONFIG or ./seams.env fills unset keys. The process environment wins the file. Function arguments win the environment. Frame reads SEAMS_FRAME and SEAMS_CUTOFF when those arguments are omitted.

One configuration#

Frame is that handle. Multi-frame work is explicit: read(path, frame=n) (1-indexed) or frame.load_frame(n) on a path-backed Frame. Arrays-only and ASE-built frames have no path and cannot load_frame.

Trajectory is an alias#

Trajectory is a compatibility alias of Frame (src/pydseams/__init__.py). It does not iterate a movie and does not own a campaign. The engine CLI that walks trajectories and writes output/ lives in seams-core. This package does not grow a second movie object.