v1.0.0-rc.160 (#70)
Build Packages / Unit tests (push) Skipped
Build Packages / build:windows:cuda (push) Successful in 18m44s
Build Packages / build:viewer-tgz:cpu (push) Successful in 6m11s
Build Packages / build:viewer-tgz:cuda (push) Successful in 6m54s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m40s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m41s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m10s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 10m4s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 11m5s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 12m23s
Build Packages / build:rpm (rocky8) (push) Successful in 11m30s
Build Packages / build:rpm (rocky9) (push) Successful in 12m51s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m8s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m21s
Build Packages / DIALS test (push) Successful in 13m22s
Build Packages / XDS test (durin plugin) (push) Successful in 9m2s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m55s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m57s
Build Packages / Generate python client (push) Successful in 23s
Build Packages / Build documentation (push) Successful in 57s
Build Packages / Create release (push) Skipped
Build Packages / build:windows:nocuda (push) Successful in 10m24s
Build Packages / Unit tests (push) Skipped
Build Packages / build:windows:cuda (push) Successful in 18m44s
Build Packages / build:viewer-tgz:cpu (push) Successful in 6m11s
Build Packages / build:viewer-tgz:cuda (push) Successful in 6m54s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 9m40s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 10m41s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 10m10s
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 10m4s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 11m5s
Build Packages / build:rpm (rocky9_sls9) (push) Successful in 12m23s
Build Packages / build:rpm (rocky8) (push) Successful in 11m30s
Build Packages / build:rpm (rocky9) (push) Successful in 12m51s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 12m8s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 11m21s
Build Packages / DIALS test (push) Successful in 13m22s
Build Packages / XDS test (durin plugin) (push) Successful in 9m2s
Build Packages / XDS test (JFJoch plugin) (push) Successful in 7m55s
Build Packages / XDS test (neggia plugin) (push) Successful in 5m57s
Build Packages / Generate python client (push) Successful in 23s
Build Packages / Build documentation (push) Successful in 57s
Build Packages / Create release (push) Skipped
Build Packages / build:windows:nocuda (push) Successful in 10m24s
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: Add `--model model.pdb` - score the merged data against an atomic model and compute initial maps. It reports R-work/R-free (scaling the model to the observed amplitudes with an overall scale, an anisotropic B and a flat bulk solvent - the standard few-parameter model, so a batch of maps stays directly comparable) and writes 2Fo-Fc / Fo-Fc electron-density maps (CCP4) plus a map-coefficient MTZ. The structure itself is not refined; the model is only re-fractionalised into the data cell. * rugnux: The merged reflection output now carries French-Wilson amplitudes (|F| and its sigma) next to the intensities - MTZ `F`/`SIGF`, mmCIF `_refln.F_meas_au`, and the text HKL - computed with the correct centric/acentric Wilson prior and epsilon multiplicity, so a downstream program (e.g. phenix.refine) can refine against amplitudes. The intensity columns are unchanged. * rugnux: R-free test-set flags are now assigned deterministically and consistently across symmetry - a Bijvoet pair I(+)/I(-) is never split between the work and free sets, and the assignment is a reproducible per-hkl hash that depends only on the reflection index, so every dataset of one crystal form gets the same ~5% free set (what a multi-dataset campaign such as PanDDA needs). On small data the fraction is floored so the test set stays large enough for a stable R-free (~500 reflections, capped at 10%); it stays flat at 5% on ordinary data. When a reference MTZ carries a `FreeR_flag` column its test set is imported instead, letting a whole campaign inherit one shared free set. * rugnux: A reference MTZ (`--reference-mtz`) can now fix the space group and cell for rotation data too (previously rejected), without being used to scale - the rotation merge stays self-consistent. When the crystal has an indexing (merohedral) ambiguity - a lattice symmetry higher than its Laue symmetry, e.g. P3/P4/P6/C2 - the reference also resolves it: each candidate reindexing (identity plus the twin-law cosets of the metric symmetry) is scored by its intensity correlation against the reference and the data are re-merged in the best-correlating one. This is a metric-preserving relabelling of hkl (the cell is unchanged) and a no-op for a holohedral crystal such as lysozyme. * rugnux: `--model` validation now aligns the data to the model before scoring - the observed reflections are reindexed into the model's enantiomorph when the two differ only by hand (indistinguishable from merged intensities). A merohedral indexing ambiguity is resolved against the reference MTZ when one is given (so a whole campaign shares one indexing convention); only with a model and no reference does validation fall back to fitting each candidate reindexing and keeping the lowest R-free. * rugnux: De-novo symmetry - recover a genuine high-symmetry group whose data are imperfectly scaled. Such a merge's within-orbit chi² lands just past the self-consistency bound (each real symmetry step adds a little systematic scatter), right where a merohedral twin also lands, so the chi² ratio alone cannot separate them. The candidate is now rescued when the extra intensity-proportional systematic error it invokes stays small relative to the confirmed subgroup - a genuine symmetry step gains multiplicity without inflating the merge error model's b, whereas a twin forces non-equivalent reflections together and b balloons. Fixes cubic insulin (I23 instead of I222) with no change to any other crystal in the test battery, including the twins that must stay in their lower symmetry. * Docs: Document the French-Wilson amplitude estimation, R-free flagging, reference-based space-group/ambiguity resolution, and model-based validation/maps in CPU_DATA_ANALYSIS.md. * Frontend: The status-bar pill now shows a progress bar during detector calibration (previously only during measurement), and the calibration state and its button are labelled "Calibration"/"CALIBRATE" (the internal `Pedestal` state name is unchanged for back-compatibility).Reviewed-on: #70 Co-authored-by: Filip Leonarski <filip.leonarski@psi.ch>
This commit was merged in pull request #70.
This commit is contained in:
1 parent
dd0bffb283
commit
67dca388bd
246 files changed
+5275
-5155
No files matched your search
@@ -182,6 +182,47 @@ int JFJochProcessingJobsWindow::askJob(const ReprocessingInputs &inputs, JobSpec
|
||||
scaling->setChecked(true);
|
||||
scaling->setEnabled(!azint);
|
||||
|
||||
// Stills geometry-refinement two-pass: an extra first pass bundle-adjusts the shared beam/distance/
|
||||
// cell from the strongest indexed frames, then the main pass re-indexes with it. It is stills-only
|
||||
// and anchors on a known cell, so offer it only for a stills-with-cell run; default it on there, to
|
||||
// match the rugnux CLI (a no-op for rotation / de-novo stills). Stills mode = rotation indexing off.
|
||||
const bool stills_with_cell = !azint
|
||||
&& !inputs.experiment.GetIndexingSettings().GetRotationIndexing()
|
||||
&& inputs.experiment.GetUnitCell().has_value();
|
||||
auto *refine_geometry = new QCheckBox("Refine geometry (stills)", &dlg);
|
||||
refine_geometry->setChecked(stills_with_cell);
|
||||
refine_geometry->setEnabled(stills_with_cell);
|
||||
refine_geometry->setToolTip(
|
||||
"Stills only: an extra first pass bundle-adjusts the shared beam / detector distance / cell from "
|
||||
"the strongest indexed frames, then re-indexes every frame with it (lifts weak/sparse-stills "
|
||||
"indexing). Needs a known unit cell; a no-op for rotation data.");
|
||||
auto *refine_frames = new QSpinBox(&dlg);
|
||||
refine_frames->setRange(10, 100000);
|
||||
refine_frames->setValue(200);
|
||||
refine_frames->setEnabled(stills_with_cell);
|
||||
refine_frames->setToolTip("Number of strongly-indexed frames fed to the joint bundle adjustment.");
|
||||
connect(refine_geometry, &QCheckBox::toggled, refine_frames, &QWidget::setEnabled);
|
||||
auto *refineRow = new QWidget(&dlg);
|
||||
auto *refineRowLayout = new QHBoxLayout(refineRow);
|
||||
refineRowLayout->setContentsMargins(0, 0, 0, 0);
|
||||
refineRowLayout->addWidget(refine_geometry);
|
||||
refineRowLayout->addWidget(new QLabel("frames:", &dlg));
|
||||
refineRowLayout->addWidget(refine_frames);
|
||||
refineRowLayout->addStretch();
|
||||
|
||||
// Rotation two-pass geometry post-refine: a first pass post-refines the detector distance / beam /
|
||||
// cell + rotation axis from the whole sweep, then re-integrates at that geometry (the refined pass is the
|
||||
// canonical <prefix>_* output, the header-geometry pass is kept as <prefix>_01_*). Rotation-only;
|
||||
// default on there, to match the rugnux CLI.
|
||||
const bool rotation_run = !azint && inputs.experiment.GetIndexingSettings().GetRotationIndexing();
|
||||
auto *postrefine = new QCheckBox("Post-refine geometry (rotation, two-pass)", &dlg);
|
||||
postrefine->setChecked(rotation_run);
|
||||
postrefine->setEnabled(rotation_run);
|
||||
postrefine->setToolTip(
|
||||
"Rotation only: a first pass post-refines the detector distance / beam centre / cell / rotation "
|
||||
"axis from the whole sweep, then re-integrates at the refined geometry. The refined pass is the "
|
||||
"canonical <prefix> output; the header-geometry pass is kept as <prefix>_01. Default on; a no-op for stills.");
|
||||
|
||||
auto *form = new QFormLayout;
|
||||
form->addRow("Start image", start_image);
|
||||
form->addRow("End image", end_image);
|
||||
@@ -190,6 +231,8 @@ int JFJochProcessingJobsWindow::askJob(const ReprocessingInputs &inputs, JobSpec
|
||||
form->addRow(save_merged);
|
||||
form->addRow("Output prefix", prefixRow);
|
||||
form->addRow(scaling);
|
||||
form->addRow(refineRow);
|
||||
form->addRow(postrefine);
|
||||
|
||||
int result = 0;
|
||||
auto *run = new QPushButton("Run locally", &dlg);
|
||||
@@ -220,6 +263,9 @@ int JFJochProcessingJobsWindow::askJob(const ReprocessingInputs &inputs, JobSpec
|
||||
spec.save_merged = save_merged->isEnabled() && save_merged->isChecked();
|
||||
spec.prefix = prefix->text();
|
||||
spec.scaling = scaling->isEnabled() && scaling->isChecked();
|
||||
spec.refine_geometry = refine_geometry->isEnabled() && refine_geometry->isChecked();
|
||||
spec.refine_geometry_frames = refine_frames->value();
|
||||
spec.rotation_postrefine = postrefine->isEnabled() && postrefine->isChecked();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -245,6 +291,12 @@ ProcessConfig JFJochProcessingJobsWindow::buildConfig(const JobSpec &spec, const
|
||||
config.rotation_indexing_image_count = 60;
|
||||
config.run_scaling = spec.scaling;
|
||||
config.reference_data = inputs.reference_data; // enables CCref / reference-based scaling
|
||||
// Stills geometry-refinement two-pass. The dialog only offers it for a stills-with-cell run
|
||||
// (Rugnux no-ops it otherwise), so honour it whenever set; unset leaves the pass off.
|
||||
if (spec.refine_geometry)
|
||||
config.refine_geometry = spec.refine_geometry_frames;
|
||||
// Rotation two-pass geometry post-refine (rotation-only; the dialog defaults it on for rotation).
|
||||
config.rotation_postrefine_geometry = spec.rotation_postrefine;
|
||||
}
|
||||
return config;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user