Commit Graph
8 Commits
Author SHA1 Message Date
leonarski_fandClaude Opus 4.8 545ebdf868 Merge: per-crystal CC1/2-delta rejection (--reject-delta-cchalf)
CrystFEL deltaCChalf-style per-crystal quality filter for heterogeneous serial
data. Each image is assigned to one CC1/2 half, so removing it perturbs only that
half's per-reflection means; deltaCChalf_i = CC1/2(all) - CC1/2(without image i).
A negative value means dropping the image RAISES CC1/2 (it disagrees with the
consensus). Images whose deltaCChalf is a low-side statistical outlier
(< mean - N*stddev) are skipped when merging. Reference-free.

Two passes over the retained integration outcomes; per-image contributions are
re-derived rather than stored, so memory stays O(unique reflections + images) for
full 200k-frame runs. New CLI flag --reject-delta-cchalf <N> (default: off).

Validation (jet FFBIDX +C+S, sigma4): removing 17/4000 (3 sigma) raises CC1/2
95.1->96.1%, CCref 54.9->55.2; 2 sigma -> 96.1/55.3. Dataset-appropriate: it HELPS
heterogeneous serial data (some crystals genuinely bad) but slightly trims a
homogeneous single rotation crystal (c2 94.6->93.8 - no bad crystals, the relative
cut still removes the tail), so it is opt-in. R-free is the real test (user's full
200k). Note: the reported overall N_obs still counts all observations; the exported
merge (and CC1/2) correctly exclude the rejected images.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-16 12:32:52 +02:00
leonarski_fandClaude Opus 4.8 6f733d74c2 Merge: make outlier rejection a ScalingSettings parameter + CLI flag, default 6
Promote the per-observation merge outlier rejection from the temporary PR_REJECT
env knob to a real setting: ScalingSettings::OutlierRejectNsigma (default 6, <=0
disables), driven into MergeOnTheFly via the constructor, with a --reject-outliers
CLI flag in jfjoch_process. Default-on at 6 sigma matches XDS (MISFITS/REJECT) and
DIALS (normalised-deviation test); it validated on the full-jet R-free (0.2625 ->
0.2585). Applies to both the PixelRefine and classical merge paths.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-15 12:42:25 +02:00
leonarski_fandClaude Opus 4.8 a47b376dc3 Merge: per-observation outlier rejection (env-gated PR_REJECT)
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 24m50s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 26m45s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 26m58s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 28m30s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 29m47s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 30m59s
Build Packages / build:rpm (rocky8) (push) Successful in 25m11s
Build Packages / XDS test (durin plugin) (push) Successful in 20m7s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 24m53s
Build Packages / Generate python client (push) Successful in 26s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 23m52s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 1m28s
Build Packages / build:rpm (rocky9) (push) Successful in 27m58s
Build Packages / DIALS test (push) Successful in 32m4s
Build Packages / XDS test (neggia plugin) (push) Successful in 13m6s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 14m59s
Build Packages / Unit tests (push) Successful in 2h15m31s
At the jet's ~1000x multiplicity R-free is bias-limited, and the merge had NO
outlier rejection - serial data zingers/overlaps/mis-indexed frames bias every
merged mean. Add a robust per-observation cut: drop observations whose corrected
intensity lies > reject_nsigma error-model sigmas from the reflection's MEDIAN.
The error-model sigma already captures the genuine (partiality) scatter, and the
median is a robust centre, so only the tail beyond the real spread is removed -
not good partials. The median is computed in RefineErrorModel (which already pools
the observations per reflection); AddImage applies the cut.

Env-gated via PR_REJECT=<nsigma> (off by default); logs the count removed. On the
jet (CC proxy) it lifts CCref +8 (nsigma 6, 0.6% cut) to +11 (nsigma 3, 7.4% cut)
- the cut is vs the data's own median, not the reference, so the gain is real
cleaner means. R-free validation + the nsigma sweet spot (over-rejection risk at
low nsigma) are for Filip's full-jet R-free.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 20:56:53 +02:00
leonarski_fandClaude Opus 4.8 c93d381dc8 Error model: harden the fit against pathological inputs (code review)
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 25m44s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 29m14s
Build Packages / build:rpm (rocky8) (push) Successful in 30m58s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 31m34s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 31m40s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 32m5s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 33m52s
Build Packages / XDS test (durin plugin) (push) Successful in 19m26s
Build Packages / Generate python client (push) Successful in 38s
Build Packages / Build documentation (push) Successful in 1m30s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (neggia plugin) (push) Successful in 20m15s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 22m14s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 23m41s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 25m45s
Build Packages / build:rpm (rocky9) (push) Successful in 29m38s
Build Packages / DIALS test (push) Successful in 34m2s
Build Packages / Unit tests (push) Successful in 2h19m4s
Addresses code-review findings on RefineErrorModel:
- Floor the 1/dev^2 bin weight relative to the data scale (1e-3 of the median
  bin dev^2), not an absolute 1e-30: a near-zero-scatter bin could otherwise
  acquire a runaway weight and hijack the global (a,b) fit.
- Reject a near-collinear normal-equation system relatively (det > 1e-10*Ass*AII)
  instead of with an absolute threshold that an ill-conditioned fit can pass.
- Reset the model to identity at entry so any early return leaves it inactive
  rather than keeping a stale a/b alongside a freshly-cleared mean map (which
  would make CorrectedSigma fall back to the per-observation I).
- PixelRefine: correct the orient_prior comment - with the sweep on, the LSQ
  anchor is the swept orientation (intended), not the spot-centroid one.

Verified unchanged on the lyso test set (ISa 1.1, CC1/2 90.3%).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 18:53:02 +02:00
leonarski_fandClaude Opus 4.8 e6a50b45c7 Integration: mean background + global error model (trustworthy sigmas)
Background estimate: use the mean of the local ring, not the median. For a
right-skewed (Poisson) background the median sits below the mean, so subtracting
it under-subtracts and biases every weak intensity positive; over multiplicity
this becomes fake <I/sig> of a few in no-signal high-resolution shells. Fixed in
both PixelRefine and BraggIntegrate2D (the classical route had the same bug).
<I/sig> now tracks CC honestly and the true resolution limit is visible.

Error model: fit a global a, b (XDS form sigma'^2 = a*sigma^2 + (b*I)^2) from the
scatter of symmetry equivalents at the merge level (so both integrators benefit),
and print it with ISa = 1/b in jfjoch_process. The (b*I)^2 term uses the
reflection mean (not the per-observation I_i, which biases the weights and
collapses CC); a,b come from a relative-weighted bin regression. Replaces the
earlier per-resolution-shell variant, which was partly masking the background bias.

METHODS.md: document both (Sections 6-7), integrator-agnostic.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 18:39:32 +02:00
leonarski_f 5735302691 Merge: CC1/2 limit adjustment
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 9m57s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 11m51s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 12m47s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 13m10s
Build Packages / build:rpm (rocky8) (push) Successful in 13m10s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 13m27s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 14m16s
Build Packages / XDS test (durin plugin) (push) Successful in 8m36s
Build Packages / Generate python client (push) Successful in 22s
Build Packages / build:rpm (rocky9) (push) Successful in 12m22s
Build Packages / Create release (push) Skipped
Build Packages / XDS test (JFJoch plugin) (push) Successful in 8m58s
Build Packages / XDS test (neggia plugin) (push) Successful in 8m18s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 9m52s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 11m5s
Build Packages / Build documentation (push) Successful in 38s
Build Packages / DIALS test (push) Successful in 12m2s
Build Packages / Unit tests (push) Successful in 56m39s
2026-06-09 11:06:16 +02:00
leonarski_f 32e91f7287 Minor fixes
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m46s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 9m52s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m54s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 11m35s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 11m49s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m9s
Build Packages / build:rpm (rocky8) (push) Successful in 9m57s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m53s
Build Packages / build:rpm (rocky9) (push) Successful in 11m18s
Build Packages / Generate python client (push) Successful in 16s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 10m3s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 34s
Build Packages / XDS test (durin plugin) (push) Successful in 8m20s
Build Packages / DIALS test (push) Successful in 12m28s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 6m23s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m23s
Build Packages / Unit tests (push) Successful in 54m9s
2026-06-08 15:56:20 +02:00
leonarski_f fc68a9baed v1.0.0-rc.146 (#56)
Build Packages / Unit tests (push) Skipped
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 8m34s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m0s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 10m23s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 10m23s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 11m16s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 11m49s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 8m32s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 9m15s
Build Packages / XDS test (durin plugin) (push) Successful in 7m16s
Build Packages / Generate python client (push) Successful in 16s
Build Packages / build:rpm (rocky9) (push) Successful in 10m12s
Build Packages / Create release (push) Skipped
Build Packages / Build documentation (push) Successful in 47s
Build Packages / DIALS test (push) Successful in 10m18s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 5m46s
Build Packages / build:rpm (rocky8) (push) Successful in 1h41m2s
Build Packages / XDS test (neggia plugin) (push) Successful in 1h59m18s
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_process: Generate a dedicated file (_process.h5), which can be used as a replacement for the _master.h5 file for a reanalyzed dataset.
jfjoch_process: Improve the performance of scaling and merging, implement on the fly scaling.
jfjoch_writer: All final data analysis results are repopulated in the _master.h5 file.
jfjoch_scale: Dedicated tool for rescaling/merging existing data.
jfjoch_viewer: Fix bugs where pixel labels where displayed on a wrong pixel.

WARNING! Scaling and merging are experimental at the moment, and may not provide reasonable results for the time being.

Reviewed-on: #56
2026-05-28 18:48:35 +02:00