Two experiment properties the panel could not state, both of which the analysis it
drives has an opinion about anyway.
The polarization factor is one number that corrects both communities' output - the
azimuthal profile through AzimuthalIntegrationMapping and the integrated intensities
through BraggIntegrationEngine - so it goes in the Geometry section, which the MX and
AzInt pages already share. Files carry no polarization factor at all, so before this
the interactive analysis integrated with none while "Analyze dataset" applied 0.99
from the rugnux defaults: the panel showed nothing and the two front ends disagreed.
The viewer's starting experiment now takes the same rugnux defaults, so the panel
shows what the analysis actually uses, and a processing job takes the panel's value
over the default - as it already did for the scaling fields.
The Goniometer section states which of the three things a dataset is - a still, a
rotation, or a grid scan - which is exactly the choice a file makes at
/entry/sample/transformations/omega vs /entry/sample/grid_scan vs neither. That
choice IS the rotation/stills switch, so "Process as stills" is gone from the
Indexing section rather than sitting beside it as a second control. It is not tied
to what the file says: a still file can be given an axis or a grid, and a rotation
file can be processed as stills. The inactive modes grey out but keep their values,
so switching away and back does not lose an axis; a file that names none offers
omega / -1 0 0 / 0.1 deg and a 10-point, 20 um raster.
Only the fast axis of a grid gets a count field, because that is all there is:
GridScanSettings derives the slow one from the image count, and the file stores
n_fast alone. The grid the settings make is spelled out under them instead. The
steps are signed - the sign is the direction the scan runs in - so only zero is
rejected, and a half-typed entry falls back to the default rather than throwing out
of a widget signal, which would abort the viewer.
JFJochReader::UpdateGeomMetadata carries a fixed whitelist of the fields a panel edit
may change, and it grew by three. Without them the new controls reset themselves on
the next dataset refresh, since a non-whitelisted field comes back as the file's.
The function has two call sites, both in the viewer's reading worker, and it is not
virtual: objdump on the rugnux binary shows the code linked in and never called, so
offline processing is untouched.
RugnuxCommandLine emits --force-still from the axis the experiment carries, which the
panel now clears when the mode is not Rotation - so the worker remembers the axis the
file was opened with, and the copied command line is built with that put back. rugnux
has no flag for the axis itself, so an axis edited or invented in the panel still
cannot be expressed on a command line; the in-process run gets the experiment object
and is unaffected.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use.
* rugnux: Rebrand the offline data-processing subsystem as `rugnux` and consolidate all offline analysis into the single `rugnux` binary - `jfjoch_process` is now `rugnux`, the former `jfjoch_azint` is now `rugnux --azint-only`, and `jfjoch_scale` is now `rugnux --scale` (see the new docs/NAMING.md and docs/RUGNUX.md). Scaling and merging are on by default for rotation and stills (`--no-merge` disables them), replacing the previous opt-in `-M, --scale-merge`.
* rugnux: CLI fixes - default `-N` to all hardware threads, parse numeric option arguments strictly (reject non-numeric or trailing input instead of silently yielding 0), require `--wavelength > 0`, and correct the reproduced command line and `--scale` reference-cell handling.
* rugnux: De-novo space-group improvements - recover genuine high symmetry and centred Bravais lattices from intensities, add an automatic CC1/2 high-resolution cutoff, and report L-test twinning statistics.
* rugnux: Index weakly-diffracting low-resolution rotation data that previously failed (e.g. F-cubic crystals that diffract only to ~4 A on a detector reaching ~1.5 A). The per-frame indexing gate now measures the indexed fraction only within the resolution range the lattice actually diffracts to, so the many sub-diffraction ice/noise spots no longer make the fraction floor unreachable; the two-pass first pass tries several image-sampling schemes (spread across the whole rotation vs a consecutive wedge whose native stride keeps a reflection's rocking curve continuous, letting the FFT resolve a long axis) and keeps the one that indexes the most frames; and the de-novo space-group search no longer discards all reflections (and crashes) when every resolution shell falls below <I/sigma> = 1.
* rugnux: Lower the low-resolution R-meas for strongly-diffracting rotation data - drop edge-of-sweep truncated fulls whose rocking curve was captured below `--min-captured-fraction` (default 0.7 for rotation), and report R-meas only over the observations kept by outlier rejection (matching XDS). The 0.7 default also strips the partiality-extrapolated fulls that dominate the intensity second moment on weakly-diffracting crystals, so the de-novo space-group search is no longer starved by the error-model I/sigma floor and recovers the correct symmetry (e.g. the F-cubic Benas crystals: Benas_3 -> F432, Benas_7 -> P6122, instead of P4/P1); on the reference battery every other crystal keeps its space group.
* rugnux: Write the refined geometry (beam, tilt, axis) to _process.h5 and place non-standard mmCIF items under a reserved `jfjoch` prefix.
* jfjoch_broker: Ordinary acquisition failures (receiver/writer/analysis problems, missed packets, writer disconnect) now return to the Idle state with an Error-severity message, so a run can be retried without an expensive re-initialisation; only failures that leave the detector in an undefined state (new JFJochCriticalException, e.g. PCIe/FPGA faults) go to the Error state and force re-initialisation.
* jfjoch_broker: A synchronous /start now reports its failure to the HTTP caller instead of returning HTTP 200, and an incomplete or truncated dataset (missing packets, writer disconnect) is reported as an error rather than a "reduce frame rate" warning.
* jfjoch_broker: Drop uncollected placeholder rows (number = -1) from the scan_result REST endpoint.
* jfjoch_broker: Fix the inverted per-image compression ratio reported by the Lite receiver (was compressed/uncompressed instead of uncompressed/compressed).
* jfjoch_broker: Bragg integration adds a quantization-noise variance floor with a box-sum fallback, and treats the type-maximum marker as an invalid pixel for unsigned image types.
* jfjoch_writer: Detect file-overwrite conflicts at start for back-channel transports, and reset the writer when end-of-collection finalisation fails.
* jfjoch_viewer: Preview overlays follow the geometry (resolution/ROI arcs, true beam centre, predictions, coral secondary-lattice spots, legend), add save-as-JPEG, and fix an HTTP live-follow memory leak.
* Frontend: Improved aesthetics and usability, and added in-browser pixel-mask and JUNGFRAU-pedestal visualisation.
* CI: Name the Windows installer jfjoch-viewer-* instead of jfjoch-*.Reviewed-on: #67
Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
This is an UNSTABLE release. The release has significant modifications for data processing - in case of troubles go back to 1.0.0-rc.144.
* jfjoch_viewer: Add reciprocal space viewer
* jfjoch_process: Two pass algorithm that does spot finding/indexing + integration of full dataset
* jfjoch_process: Improve logic for rotation indexer, to make execution more deterministic (still work in progress)
Reviewed-on: #57
Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
Co-committed-by: Filip Leonarski <filip.leonarski@psi.ch>
This is an UNSTABLE release and not recommended for production use (please use rc.111 instead).
* jfjoch_viewer: Fix issue when HTTP sync silently disconnected when it was enabled when the broker was starting measurement.
* jfjoch_broker: Add protections on time of geometry optimization and reduce rotation recalculations
Reviewed-on: #25
Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
Co-committed-by: Filip Leonarski <filip.leonarski@psi.ch>