Repository navigation
Release v3.19.3
-
fix: the membrane fit guard checked the wrong box, and died opaquely when it had none.
make_membrane_system's pre-embed guard exists to catch an over-condensed quilt before the
protein is embedded into a box too small for it -- "turning a silent squeeze into a loud,
diagnosable failure", per its own comment. It did neither, from v3.15.0 (ca6c0b11) onward.It read
get_current_artifact('state'), but at that point indo()that key still holds the
protein's state; the membrane's isquilt_state(every path registers it there -- symmetric
grid, asymmetric grid, and prebuilt alike). Comparing the protein's box against the protein's
footprint is2 * xydistby construction and passes however far the membrane has condensed.
Mostly it did not get even that far: the orient step registers only psf and pdb, so there was no
xsc and the guard returned silently, having checked nothing.When a config did leave an xsc on the protein state -- a continuation, or a vacuum minimize --
the second defect fired.cell_from_xscis documented to return(None, None)for an xsc with
no periodic cell, and a run with no periodic boundaries writes exactly that: an origin-only
step o_x o_y o_z, 4 columns. The return was indexed unchecked, so the guard raised
TypeError: 'NoneType' object is not subscriptabletens of lines from its cause -- after a
3h52m quilt equilibration in the reported case.The guard now reads
quilt_state, logs the two boxes it compared (it was previously silent
unless it tripped, so there was no way to tell which box it had read), warns rather than passing
mutely when no membrane xsc is available, and routes everycell_from_xsccall in the task
through a helper that names the file and explains the 4-column case.cell_from_xscalso now
returns(None, None)for a truncated or header-only file instead of raisingEmptyDataError
through its caller. The other call sites --terminate.py,solvate.py,run_record.py,
ringcheck.py,ring_resolve.py-- were already guarded and are unchanged.Guarded by
tests/unit/test_tasks/test_make_membrane_decisions.py::TestMembraneSpansProteinGuard,
which pins the artifact the guard reads (a membrane condensed below the protein must raise even
when the protein's own state carries a comfortable box) and the cell-less failure message. All
six fail on the unfixed code.Reported by the pestifer-sweep session, found while debugging an unrelated user config.