From 340e02072a5477a682ae3df09fccef47b4cd5053 Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Thu, 12 Nov 2026 13:46:02 +0100 Subject: [PATCH] rugnux: advice on the next collection keeps the two geometry rules only The dose rule (REDUCE_DOSE) is left out of the merge: it reads a threshold on the relative B, and the truncated-sweep witness found it wrong on one fired set in four. The two coverage rules are exact geometry and their forecasts matched the measured gains on every set checked. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01HVeDQsU5a8AJUdJPgWevAK --- docs/ACKNOWLEDGEMENT.md | 5 +---- docs/RUGNUX_REPORT.md | 9 --------- rugnux/ResultReport.cpp | 20 -------------------- 3 files changed, 1 insertion(+), 33 deletions(-) diff --git a/docs/ACKNOWLEDGEMENT.md b/docs/ACKNOWLEDGEMENT.md index 86ff545cd..ba9f14c24 100644 --- a/docs/ACKNOWLEDGEMENT.md +++ b/docs/ACKNOWLEDGEMENT.md @@ -482,10 +482,7 @@ comparison is local in resolution, where xtriage's is a z-score of a shell again **Advice on the next collection** - the rotation a sweep needs and the blind region about the spindle that a second, tilted sweep recovers are the data-collection geometry set out by Z. Dauter, -"Data-collection strategies" (1999), Acta Cryst. D55, 1703-1717 (DOI not verified here). Reading the dose -a sweep was past its optimum by from its relative B rests on B growing linearly with dose, as measured by -S. Kmetko, N. S. Husseini, M. Naides, Y. Kalinin and R. E. Thorne, "Quantifying X-ray radiation damage in -protein crystals at cryogenic temperatures" (2006), Acta Cryst. D62, 1030-1038 (DOI not verified here). +"Data-collection strategies" (1999), Acta Cryst. D55, 1703-1717 (DOI not verified here). ### Physical corrections and calibration diff --git a/docs/RUGNUX_REPORT.md b/docs/RUGNUX_REPORT.md index 0be9cedb8..8c7b6d6e6 100644 --- a/docs/RUGNUX_REPORT.md +++ b/docs/RUGNUX_REPORT.md @@ -357,15 +357,6 @@ sweeps only: a joint merge of several sweeps gets none. the first that leaves under 1 % of the reciprocal space to the signal limit blind to both sweeps. It counts no symmetry, so it is enough for any point group, and it is the same in every direction of tilt (kappa, chi, or a re-mount). -- **`REDUCE_DOSE`** - the sweep was damage-limited. Counting against background, with the relative B - growing linearly with dose, the merged I/sigma at resolution d grows with dose as - (1 - exp(-x)) / sqrt(x), x = dB / (2 d^2), which peaks at dB = 2.5 d^2. Advised when - `RADIATION_DAMAGE_RELATIVE_B=` reached three times that at `FITTED_RESOLUTION=`, where the same curve - has lost a fifth of the I/sigma at d; **`ADVICE_REDUCE_DOSE_FACTOR=`** is the ratio, the factor that - brings the whole sweep to the optimum (attenuation, a shorter exposure, or the dose spread over more - crystal). It is relative only: no absolute dose is modelled. Checked on the battery by merging only the - first 1/factor of each sweep: where the rule fires, that part resolves as far as the whole sweep on - most sets, while on undamaged sweeps a third of the data loses resolution. ## Several sweeps merged as one diff --git a/rugnux/ResultReport.cpp b/rugnux/ResultReport.cpp index 0165a538c..c5e1216d9 100644 --- a/rugnux/ResultReport.cpp +++ b/rugnux/ResultReport.cpp @@ -3027,26 +3027,6 @@ ReportDocument BuildReportDocument(const std::string &output_prefix, "{:.1f}% of the unique reflections, which no length of sweep about this spindle measures", tilt, 100.0 * *result.spindle_lost_unique_fraction)); } - // Dose: the relative B grew well past the dose at which the merged I/sigma at the fitted - // resolution d is largest. Counting against background, with B growing linearly in dose, - // I/sigma accumulated to a dose goes as (1 - exp(-x)) / sqrt(x) with x = dB / (2 d^2), which - // peaks at x = 1.26, i.e. dB = 2.5 d^2. Advised at three times that, where the same curve - // has lost a fifth of I/sigma at d; the factor brings the whole sweep to the optimum. - // B linear in dose: Kmetko et al. (2006) Acta Cryst. D62, 1030-1038 - const double db = result.merge_statistics.radiation_damage_delta_b; - if (fitted_resolution && std::isfinite(db)) { - const double factor = db / (2.5 * *fitted_resolution * *fitted_resolution); - if (factor >= 3.0) { - Add(s, KeyReal("ADVICE_REDUCE_DOSE_FACTOR", factor, "{:.1f}")); - const auto t = experiment.GetAttenuatorTransmission(); - advice.emplace_back("REDUCE_DOSE", fmt::format( - "reduce the dose per degree {:.1f}x{}, or spread it over more crystal: the relative B " - "grew by {:.0f} A^2 over the sweep, {:.1f}x the 2.5 d^2 at which the I/sigma at the " - "{:.2f} A limit stops growing with dose", - factor, t ? fmt::format(" (transmission {:.3g} -> {:.2g})", *t, *t / factor) : "", - db, factor, *fitted_resolution)); - } - } } // ---- anisotropy