Analysis reference and server pages: state the behaviour, not the measurement campaign
The data-analysis reference keeps the rationale for each decision but no longer quotes battery arms, per-set counts and medians, or the history of how a default came to be. The deployment, repository, release-contents and writer pages describe the current packages and formats without the renames and removals of earlier versions. Co-Authored-By: Claude Fable <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HVeDQsU5a8AJUdJPgWevAK
This commit is contained in:
1 parent
d7f011e3fc
commit
220e88de8a
11 files changed
+54
-72
No files matched your search
@@ -172,12 +172,12 @@ reported — but before it is allowed to change anything about the reflections t
|
||||
data have to accept it. There are only two such things (§14.6); the same verdict also says whether the
|
||||
rigid body placed the model at all (below).
|
||||
|
||||
**No fixed threshold on R can decide that**, and this was measured three ways. The classical acentric
|
||||
**No fixed threshold on R can decide that.** The classical acentric
|
||||
random-structure value is $R = 0.586$ at unit scale, but the scale here is fitted to minimise the very
|
||||
sum the R is made of, which pulls it to about 0.550; observed nulls on real data land at 0.599–0.615;
|
||||
sum the R is made of, which pulls it to about 0.550; observed nulls on real data land at 0.60–0.62;
|
||||
and the value moves with the *model* — its atom count and its B-factors — as much as with the data, so
|
||||
a cut calibrated on one pair misjudges the next. In one measured arm an unrelated protein reached a
|
||||
*lower* raw R-free than the correct model did on other data.
|
||||
a cut calibrated on one pair misjudges the next: an unrelated protein can reach a *lower* raw R-free
|
||||
on one dataset than the correct model does on another.
|
||||
|
||||
The only null that fits both the model and the data is therefore **made out of them**: the same model
|
||||
is re-oriented at random about its own centroid and run through the identical path — the same scaling,
|
||||
@@ -206,8 +206,8 @@ therefore leaves the written files byte for byte what a run with no model would
|
||||
report says so beside the R it was rejected on: a negative result, not a failed run.
|
||||
|
||||
**The null is built for every model the rigid body is tried on.** A model already in the data's group,
|
||||
on a crystal with no merohedral ambiguity, claims nothing about the written reflections, and the null
|
||||
once skipped it. It no longer does, because its verdict has a second use: it is what says whether the
|
||||
on a crystal with no merohedral ambiguity, claims nothing about the written reflections, but the null
|
||||
is built for it too, because its verdict has a second use: it is what says whether the
|
||||
rigid body placed the model at all, and a model it did not place - a deposited structure of another
|
||||
crystal form, a model in a subgroup the data were merged above - is then searched for by molecular
|
||||
replacement, which may only relabel the enantiomorph of the answer (past the anomalous veto) and writes
|
||||
@@ -217,15 +217,13 @@ run with a model.
|
||||
The count is nine, and it is the *spread* that sets it rather than the mean: the verdict is
|
||||
(mean − real)/sd of the sample, the relative error on an sd from $n$ draws is $1/\sqrt{2(n-1)}$, and a
|
||||
sample that happens to come out narrow is what turns a model that does not fit into one that appears
|
||||
to. Measured on the case nearest the gate — an unrelated protein at 1.83σ against a threshold of 3 —
|
||||
the chance of reading over the gate on a different seed is 31 % at $n=3$, 17 % at $n=5$ and 6 % at
|
||||
$n=9$. The gate itself allows for it: the intended cut is 3σ of the null (one-sided, 0.135 %), and a
|
||||
to: for an unrelated protein near the gate, the chance of reading over it on a different seed falls
|
||||
from about a third at $n=3$ to a few percent at $n=9$. The gate itself allows for it: the intended cut is 3σ of the null (one-sided, 0.135 %), and a
|
||||
new draw from a null known only through $n$ draws lies $t_{n-1}\sqrt{1+1/n}$ sample sds above their
|
||||
mean at that probability — 4.51 for $n=9$. Read as if the sd were known, an unrelated helical protein
|
||||
on a helical crystal was accepted at +3.05 against nine draws; against 48 it read +2.09, and the best
|
||||
of the 48 random placements fitted as well as it did. The deposited models of the open arm read +7.0
|
||||
and up. The indexing lead (§14.6) stays at 3σ of its own null: it is only read for a model that has
|
||||
passed this gate, and the deposited models that settle an indexing lead by +4.2σ and up. Nine is affordable only because the replicates run at once: the null costs the slowest of them
|
||||
mean at that probability — 4.51 for $n=9$. Read as if the sd were known, an unrelated model can pass
|
||||
3σ against nine draws and fall to about 2σ against many more. Deposited models of their own crystal
|
||||
read +7σ and up. The indexing lead (§14.6) stays at 3σ of its own null: it is only read for a model that has
|
||||
passed this gate, and deposited models settle an indexing lead by +4σ and up. Nine is affordable only because the replicates run at once: the null costs the slowest of them
|
||||
rather than their sum, and the slowest of nine is barely above the slowest of five.
|
||||
|
||||
The null costs one full fit and one rigid-body placement per replicate. The replicates share nothing
|
||||
|
||||
@@ -264,8 +264,6 @@ every reflection is strong and a consistent merge reads close to 1. The measured
|
||||
Otherwise, or where the measured arm does not complete, the run keeps the file's centre. The log lines
|
||||
are `Beam centre check: running the first pass again at the measured centre …` followed by
|
||||
`… the run adopts the measured centre and the lattice it finds` or `the measured centre does not win`.
|
||||
Over the validation battery about one rotation run in ten runs this second arm, and about one in ten
|
||||
ends on the measured centre by one of the routes above.
|
||||
|
||||
**After a first pass that failed.** A rotation sweep leaves one further thing the input often cannot
|
||||
settle, decided on the same count the rest of the first pass uses — the right answer indexes and the
|
||||
@@ -398,13 +396,12 @@ absorption are functions of $2\theta$ alone, nearly enough, and the ring median
|
||||
What survives is then shaped into a region, and what makes it specific is **size**, not connection to
|
||||
the beam. A shadow is cast by something physical and is correspondingly large, while the background
|
||||
wanders a pixel or two at a time, so the connected components holding at least 2000 pixels, of which at least 200 deep (well below the
|
||||
ring's level, not merely dim), are kept and the rest dropped; measured on clean sweeps spanning 0.05 to 9.5 counts/px/frame of
|
||||
background, every one returns exactly one such component — the beam stop — and the largest spurious
|
||||
candidate anywhere is 74 pixels. Requiring the region to touch the direct beam instead is written for
|
||||
ring's level, not merely dim), are kept and the rest dropped; on a clean sweep that returns exactly one
|
||||
such component — the beam stop — and a spurious candidate is at most a few dozen pixels. Requiring the region to touch the direct beam instead is written for
|
||||
the stop and its holder arm; hardware standing in the beam further out — a pin, a loop — casts a
|
||||
shadow that begins some way out in radius, with lit detector between it and the stop and no bridge
|
||||
across the gap, and on one sweep that discarded 950 k correctly-found pixels and sent them into
|
||||
integration as measured-and-near-zero. The kept components are bridged across the module gaps the
|
||||
across the gap, and such a shadow would then go unmasked and be integrated as measured-and-near-zero.
|
||||
The kept components are bridged across the module gaps the
|
||||
holder arm crosses, grown outward through the partially shadowed penumbra — much wider for a pin than
|
||||
for a stop edge — closed, and with the interior of the disk filled; the rings found lying wholly
|
||||
inside the stop join the region after the size filter rather than being asked to be large themselves.
|
||||
@@ -644,8 +641,8 @@ and their spots are otherwise handed to the indexer as if they were this crystal
|
||||
therefore also **measured from the run's own pre-scan spots** — read off as what stands above the
|
||||
smooth fall-off of spot density with $q$ — on every run, and reported whether or not anything acted on
|
||||
them (`POWDER_*` in the results report: the ring count, the fraction of the pre-scan's spots they
|
||||
hold, and their $d$-spacings). The two lists are not the same list: on one such crystal 16 of the 24
|
||||
measured rings were ice and the rest were not. A measured ring is set aside from indexing only where a
|
||||
hold, and their $d$-spacings). The two lists are not the same list: a crystal can carry measured rings
|
||||
that are not ice beside those that are. A measured ring is set aside from indexing only where a
|
||||
first pass that found no lattice needs it set aside (§6); the fixed ice bands above are what the ice
|
||||
score, the scale fit and the resolution cut read.
|
||||
|
||||
|
||||
@@ -182,10 +182,8 @@ without moving the detector; the still's own spot resolution would understate th
|
||||
weak frames that mislead. The worst direction wins, and the directions scored are the strong
|
||||
in-window rows **and the normals of their pairs** — the normal to two lattice rows is itself a
|
||||
reciprocal-lattice row and a symmetry axis is parallel in both bases, so a lone 2-fold on an axis far
|
||||
beyond the length window (a long monoclinic unique axis) is still seen by direction: measured on a
|
||||
synthetic lone-diad crystal with a 300 Å unique axis, the fraction of severe mounts reported severe
|
||||
rises from 0.60 to 1.00 with the pair normals, at no extra engagement on that class's harmless
|
||||
mounts. Nothing about the goniometer enters: the number describes the problem and leaves the remedy —
|
||||
beyond the length window (a long monoclinic unique axis) is still seen by direction.
|
||||
Nothing about the goniometer enters: the number describes the problem and leaves the remedy —
|
||||
a second sweep, a reorientation — to the beamline.
|
||||
|
||||
**This is a worst-case bound under an assumption of no symmetry, not an estimate.** A still cannot
|
||||
@@ -293,7 +291,7 @@ the pass is run again once every frame is in, on a copy of the run taken as it b
|
||||
the rest of the sweep too, and only where that re-check ends elsewhere is the whole run made again with
|
||||
every near tie decided late; a run that found no lattice after carrying a near tie is made again
|
||||
likewise. Both give the answer that deciding late throughout gives; the live run pays for it with the
|
||||
re-checks (measured: a median of 0.9 s on the sets that had one). The checks taken on the
|
||||
re-checks, about a second each. The checks taken on the
|
||||
pre-pass frames - the geometry walk's refits, the metric-symmetry arm and the pre-pass spot-crowding count - stay on those frames
|
||||
in both modes, and their near ties are re-checked once every frame is in on both.
|
||||
|
||||
@@ -372,7 +370,7 @@ The loose first stage necessarily admits some spots that are not reflections of
|
||||
|
||||
So every round is scored on the **widest** gate — the population the first pass selects on and the last pass does not fit, which makes it the one a converged solve is not optimising — and the best-scoring round is committed. Two conditions keep that from acting on noise. The score is a *count* of spots, so a lead of fewer than $\sqrt{\text{count}}$ of them leaves the last round standing. And the round taken has to be the less distorted lattice as well as the better-fitting one: the lattice search (§6) is re-asked every round to **measure** how far the cell sits from the ideal metric of the class it matches (imposing that class is measured fatal — the snap puts almost everything outside the refinement's own gate), and an earlier round is taken only when it matched the *same* class and sits closer to it. Same class is a precondition and not a precaution: the deviation is a fraction of whichever class's tolerance admitted it, so two classes' deviations are not the same quantity, and a round that matched no class reports zero, which means "nothing was asserted" rather than "undistorted". A chain that has settled scores its rounds within a spot or two of each other and a symmetry-constrained solve holds its distortion at zero throughout, so the rule fires on neither: measured over 914 chains, an earlier round scores higher on 44 % of them and the committed round changes on 1 dataset in 54.
|
||||
|
||||
**A tilt no mounting can have has to prove itself.** The detector tilt is refined freely because on a sweep whose spots reach far enough in $2\theta$ it is a measurement, and restraining it costs those crystals resolution (measured: 0.13–0.16 Å and up to a quarter of ISa on the crystals whose fitted tilt is largest). What makes it a measurement is the *keystone* — a tilted plane puts one side of the detector nearer and the other further, so the spots move by an amount that grows with their distance from the beam — and a first pass made of spots reaching a few degrees of $2\theta$ sees a keystone of a pixel or two at most. To such a fit a tilt is a whole-pattern shift the beam centre imitates exactly, its size is whatever the centroids' own systematics happen to prefer, and the value it commits then mispredicts the far corner of the detector by tens of pixels against an integration disc of a few: a first pass seeded to $2\theta = 5°$ committed 2.5° and the run collapsed from 2.8 Å to 6.4 Å. For a tilt of a few tenths of a degree nothing in the spots says whether it is real — the held-out positional residual, the rocking angles and a re-fit at the header tilt were all measured unable to, at the same insignificance on crystals whose tilt is real and on the one whose tilt was the artefact — so below what a mounting can be off square by the fit is trusted as before: a detector is mounted square to the beam to a fraction of a degree, and over 211 datasets the fitted tilt left the file's by more than 0.56° on one. A chain that has walked more than 1° from the tilt it started at has either measured nothing or found a detector the file misdescribes (that one: a $2\theta$ arm swung out 12.8° that the file records as square), and at that size the spots *do* tell the two apart, because a real tilt of degrees has a keystone of tens of pixels over the spots the fit is made of and an artefact has none. So the candidate is refined again from where it started with the tilt held there — the beam centre takes the shift the tilt is equivalent to — and the two are judged as the rounds of one chain are, on the spots each indexes inside the wide gate: the walked tilt stands only when it leads by more than the count's own noise. Held, not bounded — a box the fit lands on is the same wrong answer at a smaller size. The log says what the walked tilt would have moved the far corner by and how the two counts came out; where it was refused, the report's `REFINED_DETECTOR_TILT` is the tilt the pass started at and `REFUSED_DETECTOR_TILT` the tilt the fit had walked to.
|
||||
**A tilt no mounting can have has to prove itself.** The detector tilt is refined freely because on a sweep whose spots reach far enough in $2\theta$ it is a measurement, and restraining it costs those crystals resolution and ISa. What makes it a measurement is the *keystone* — a tilted plane puts one side of the detector nearer and the other further, so the spots move by an amount that grows with their distance from the beam — and a first pass made of spots reaching a few degrees of $2\theta$ sees a keystone of a pixel or two at most. To such a fit a tilt is a whole-pattern shift the beam centre imitates exactly, its size is whatever the centroids' own systematics happen to prefer, and the value it commits then mispredicts the far corner of the detector by tens of pixels against an integration disc of a few, and the run can lose most of its resolution to it. For a tilt of a few tenths of a degree nothing in the spots says whether it is real — the held-out positional residual, the rocking angles and a re-fit at the header tilt are all equally insignificant on a crystal whose tilt is real and on one whose tilt is the artefact — so below what a mounting can be off square by the fit is trusted as before: a detector is mounted square to the beam to a fraction of a degree. A chain that has walked more than 1° from the tilt it started at has either measured nothing or found a detector the file misdescribes (a $2\theta$ arm swung out that the file records as square), and at that size the spots *do* tell the two apart, because a real tilt of degrees has a keystone of tens of pixels over the spots the fit is made of and an artefact has none. So the candidate is refined again from where it started with the tilt held there — the beam centre takes the shift the tilt is equivalent to — and the two are judged as the rounds of one chain are, on the spots each indexes inside the wide gate: the walked tilt stands only when it leads by more than the count's own noise. Held, not bounded — a box the fit lands on is the same wrong answer at a smaller size. The log says what the walked tilt would have moved the far corner by and how the two counts came out; where it was refused, the report's `REFINED_DETECTOR_TILT` is the tilt the pass started at and `REFUSED_DETECTOR_TILT` the tilt the fit had walked to.
|
||||
|
||||
### 7.5 Rotation geometry post-refinement (two-pass)
|
||||
|
||||
|
||||
@@ -100,9 +100,9 @@ With $k>0$ the **background ring becomes an ellipse**, elongated along the beam
|
||||
|
||||
where $\rho$ is the pixel's radial offset (its projection on the beam→reflection direction), $g=\min(k\sigma_\mathrm{bw},\,2r_3)$ is the capped growth, and $q=1-\big(r/(r+g)\big)^2$ for the boundary concerned. Written this way $k=0$ gives $q=0$ and both tests collapse onto $r^2$ **exactly in floating point**, so the default classifies every pixel exactly as the circular stencil did. The neighbour exclusion above follows: each neighbour's **inner ellipse**, taken in that neighbour's own radial frame, is what is masked out of this reflection's ring.
|
||||
|
||||
The width is the bandwidth streak alone, and deliberately **not** the profile's full radial variance of §9.3, which also carries the sensor parallax and weak-spot capture terms. Those two are the only terms there are on a monochromatic beam, and widening the ring by them was measured on the rotation battery: it neither helped the crystals with clean high-resolution shells nor left the weak ones alone. The bandwidth streak, by contrast, is a measured elongation of the recorded spot — principal axis along the radius to within a couple of degrees, and azimuth-independent. Keeping only it also makes the option exactly inert on a monochromatic beam, where $\sigma_\mathrm{bw}$ is zero.
|
||||
The width is the bandwidth streak alone, and deliberately **not** the profile's full radial variance of §9.3, which also carries the sensor parallax and weak-spot capture terms. Those two are the only terms there are on a monochromatic beam, and widening the ring by them neither helps the crystals with clean high-resolution shells nor leaves the weak ones alone. The bandwidth streak, by contrast, is a measured elongation of the recorded spot — principal axis along the radius to within a couple of degrees, and azimuth-independent. Keeping only it also makes the option exactly inert on a monochromatic beam, where $\sigma_\mathrm{bw}$ is zero.
|
||||
|
||||
Growing the ring also grows the neighbour exclusion, so on a crowded pattern fewer background pixels survive; a reflection left with too few is rejected outright. On the data this was measured on the loss is under 0.1% of reflections, but it is not structurally zero.
|
||||
Growing the ring also grows the neighbour exclusion, so on a crowded pattern fewer background pixels survive; a reflection left with too few is rejected outright. The loss is typically under 0.1% of reflections, but it is not structurally zero.
|
||||
|
||||
Only the ring moves. The signal disk $r_1$ stays circular, deliberately: it sets $n_S$, it sets $\mathrm{var}(\hat b)$, it is the domain the profile *width* is learned over (§9.3), and with `--integrator boxsum` it drives the all-or-nothing “every signal pixel valid” acceptance gate (§9.2), so growing it would reject any box sum carrying a single bad pixel anywhere along a long streak. In the default `gaussian` mode $r_1$ does not set the intensity at all — the fit grid, $\lceil r_2\rceil$, does.
|
||||
|
||||
@@ -158,7 +158,7 @@ The curve $\bar B(r)$ is the adaptive spot finder's peak-excluded background per
|
||||
**When it is applied.** `--background-radial` takes `on`, `off` or `auto`; in Rugnux it is **`auto` by default** (the broker keeps it off), and auto is decided **per run, in the pre-scan, on empty apertures** — the same measurement that, on stills, also chooses how far the ring reaches (the $r_3$, up to the one the run starts from, whose ring predicts the empty disk best). On a grid of apertures away from every found spot, the ring's prediction of the empty disk is taken twice: plain, and with the correction applied exactly as the integrator applies it (the clip following the curve, and the curve's mean over the ring pixels kept minus its mean over the disk). With nothing in the aperture each difference is the error the ring makes in a reflection's background, noise plus bias. Rotation measures every stencil the spot width can give it (and the one it starts from, which the geometry pre-pass and the starvation guard return to) and reads the one it gets.
|
||||
|
||||
- **Stills** have no other correction, so it is applied to every image of a run where it lowers the apertures' mean square error at all.
|
||||
- **Rotation** has one: under auto, each image whose peak-excluded ice score (§3.3) reaches `--ice-min-score` is corrected, with the frame's curve as on stills. (It used the curve of the reflections' own rings until it was measured to miss the narrow peak of a smooth ice ring: on a crystal with smooth ice the ring cores stayed 4–9 standard errors high and their flanks low, against the off-ring reflections, and the frame's curve brought all three low-resolution rings within 3.) Correcting **every** image instead is chosen only where it takes **at least 10 %** of the apertures' mean square error away. On photon-counting sweeps the apertures gain 0.1–5 % (statistically significant, $z\approx3$–4), and correcting every image there was measured to cost ISa and anomalous signal; where it pays — the rings of home-source CCD frames, a smooth ice ring — they gain 13–31 %. A run below the margin keeps the per-image ice correction, bit for bit.
|
||||
- **Rotation** has one: under auto, each image whose peak-excluded ice score (§3.3) reaches `--ice-min-score` is corrected, with the frame's curve as on stills (the curve of the reflections' own rings misses the narrow peak of a smooth ice ring). Correcting **every** image instead is chosen only where it takes **at least 10 %** of the apertures' mean square error away: on photon-counting sweeps the apertures gain only a few percent and correcting every image costs ISa and anomalous signal; where it pays — the rings of home-source CCD frames, a smooth ice ring — they gain tens of percent. A run below the margin keeps the per-image ice correction, bit for bit.
|
||||
|
||||
The model is a function of **radius alone**, so it is applied only where that is true of the background. The per-image ice gate rests on this: smooth powder ice *is* a radial feature and is corrected; ice made of discrete crystallite spots — which the profile channel is blind to and the spot channel catches — leaves no smooth ring to model, and correcting it makes matters worse. Measured against a fixed atomic model, comparing ice bands with resolution-matched decoy bands carrying no ice: on a crystal with pure smooth ice the correction removes **43 % of the bands' excess amplitude**, and the improvement is **7× larger inside the bands than outside**, which is its stated mechanism; on a crystal whose ice is textured the same correction *increased* the excess amplitude by half; on a clean crystal it is inert to four decimal places. A strongly polarised beam or panels of different response make the background non-radial too; the apertures see that as a ring the correction predicts *worse*, and a run where they do keeps it off. Auto engages only where a peak-excluded background exists (adaptive spot finding, §3.2) — a plain azimuthal profile carries the Bragg peaks and cannot support an absolute threshold, so without one auto leaves the correction off.
|
||||
|
||||
@@ -198,7 +198,7 @@ spot-width variance rather than as an intensity scale.
|
||||
|
||||
### 9.5 Choosing the signal radius from the crystal's own spots (rotation)
|
||||
|
||||
The three radii are one triple for the whole run, but on rotation data they are no longer a fixed constant: $r_1$ is measured from how wide *this* crystal's spots actually are (`--adaptive-integration-radius`, on by default, ignored when `--integration-radius` is given). On stills the same option measures instead how far the background ring should reach (§9.2, *When it is applied*).
|
||||
The three radii are one triple for the whole run, but on rotation data they are not a fixed constant: $r_1$ is measured from how wide *this* crystal's spots actually are (`--adaptive-integration-radius`, on by default, ignored when `--integration-radius` is given). On stills the same option measures instead how far the background ring should reach (§9.2, *When it is applied*).
|
||||
|
||||
**Why $r_1$ matters even though it does not set the intensity.** In the default `gaussian` mode the intensity is a profile-fit amplitude over the grid $\lceil r_2\rceil$ (§9.3), so $r_1$ is not the integration domain. It *is* the aperture the profile **width** is learned over, and a second moment taken over a disk of radius $a$ saturates at $a^2/4$. At $r_1 = 4$ the learned $\sigma$ can therefore never exceed 2 px, and a crystal whose spots are broader than that is fitted with a profile the model cannot represent.
|
||||
|
||||
@@ -218,7 +218,7 @@ The factor 2 is not fitted: for a Gaussian $r_{80} = 1.794\,\sigma$, so $r_1 = 2
|
||||
|
||||
**The density guard.** Widening $r_1$ pushes $r_2$, the ring's inner edge, into the neighbours; a reflection whose ring is left with five or fewer clean pixels has no background and is dropped whole. The integrator counts the rings the **neighbouring reflections** would starve — every predicted neighbour, the rocking-curve tails the background itself does not exclude included, so the count measures the pattern's density — apart from the ones the detector itself starves (module gaps, the beam stop, the resolution mask), a floor that reaches a couple of percent on some geometries and does not move with $r_1$. Where the neighbour-driven count exceeds 1.13 % of the predicted reflections, the pattern is too dense for the widened radius and the final pass is integrated again at the fixed $4,6,13$, reported as pass 3 of 3 with the reason in `PASS_DECISION`.
|
||||
|
||||
Every integration pass, adaptive or not, now logs the radii it used together with the fraction of predicted reflections that lost their background ring, the fraction of rings the neighbouring predictions crowd, and the profile-fit fallback rate.
|
||||
Every integration pass, adaptive or not, logs the radii it used together with the fraction of predicted reflections that lost their background ring, the fraction of rings the neighbouring predictions crowd, and the profile-fit fallback rate.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -110,8 +110,8 @@ as the B factors are refined.
|
||||
|
||||
With these three choices - riding hydrogens, the fine mask grid and the robust scale - the R-work and
|
||||
R-free of a model as given (`REFINE_R_WORK_START`, `REFINE_R_FREE_START`) agree with REFMAC 5.8's 0-cycle
|
||||
values on the same model and data within 0.002 on twelve of fourteen depositions from 1.1 to 3.6 Å, and
|
||||
within 0.006 on the other two (`tools/battery/refine_parity.py`).
|
||||
values on the same model and data within 0.006 on depositions from 1.1 to 3.6 Å
|
||||
(`tools/battery/refine_parity.py`).
|
||||
|
||||
**$D$ and $\Sigma$.** The two parameters of the likelihood are fitted by maximum likelihood in resolution
|
||||
bins of the free set (100 free reflections to a bin, at most 30 bins; where the free set has fewer than
|
||||
@@ -390,7 +390,7 @@ person at the density; they do not identify a compound.
|
||||
Every water and every single-atom ion of the refined model (and, with `--refine-score-only`, of the model as
|
||||
given) is measured in its surroundings and its density and scored as each of water, Mg²⁺, Na⁺, K⁺, Ca²⁺ and Cl⁻
|
||||
(NH₄⁺ is scored too, and only reported). The audit changes nothing; the solvent build below reads it to relabel
|
||||
sites. Both run only with `--refine-solvent` (off by default for now).
|
||||
sites. Both run only with `--refine-solvent` (off by default).
|
||||
|
||||
**What is measured.** The model's N and O atoms around the site, symmetry mates included, counted in the
|
||||
coordination bands of Cat_Wiz - 1.9-2.3 Å (Mg-like), 2.3-2.6 Å (Na, Ca), 2.6-3.2 Å (K, water) - and in the
|
||||
@@ -415,8 +415,8 @@ moderate resolution. The map's scale per model unit is the median, over the macr
|
||||
not the waters', whose occupancy is the model's guess (the depositions' waters show half the density their model
|
||||
gives). An **ion** - whose label's restraints may hold it off its density - is read where that fit puts it,
|
||||
within 0.6 Å of its modelled position (its shell, bands and bond valences are measured from there); a water where
|
||||
it is modelled. On the refine and open arms the depositions' ions read Mg 11, Na 10, Cl 19, K 21-23, Ca 22-26 and
|
||||
Zn 33 (median), the waters 4-6.
|
||||
it is modelled. On deposited models the ions typically read Mg 11, Na 10, Cl 19, K 21-23, Ca 22-26 and
|
||||
Zn 33, the waters 4-6.
|
||||
|
||||
**The anomalous signal a site would show.** For each species, f″ at the data's wavelength (Cromer-Liberman, with
|
||||
the corrections of Kissel & Pratt, as GEMMI computes it) at the environment's B, put on the scale of the anomalous
|
||||
@@ -458,19 +458,17 @@ trajectory (§15.7) ends, a round reads the maps and the audit of that model and
|
||||
alone - its waters and single-atom ions, the rest held - is refined at the weights the trajectory ended at (its B
|
||||
too, at its balanced weight where the trajectory held B, and 10 iterations a macro-cycle), and the round is kept
|
||||
where that lowers R-free; where it does not but the round as built does (refining the solvent alone can lose what its
|
||||
sites gained: on a deposited model 41 waters lowered R-free by 0.0016 as built and raised it by 0.0036 refined), it
|
||||
sites gained), it
|
||||
is kept as built; otherwise it is undone. The rest of the model goes on with its B factors held or refined as the
|
||||
trajectory had them. The rounds stop at one that changes nothing, at one undone, or after two (a third gained at most
|
||||
0.0004 in R-free where it was kept, on twelve sets, and was refused on the others); the final ladder of §15.7 then
|
||||
trajectory had them. The rounds stop at one that changes nothing, at one undone, or after two (a third gains
|
||||
nothing measurable); the final ladder of §15.7 then
|
||||
refines what they kept with the rest. The atom list of a refinement is fixed - its engines are made for it - so the
|
||||
waters a round may add are in the model from the start as placeholders: one water each (as many as a fifteenth of the
|
||||
model's heavy atoms, at least 64) at occupancy 0, which puts no density, no mask and no contact anywhere and is not
|
||||
refined until a round puts one at a peak; a water taken out goes to occupancy 0 the same way, and a relabelled site
|
||||
keeps its place. A round thus costs a map, an audit and a refinement of the solvent: on twelve refine-arm and
|
||||
open-arm depositions the build adds 0.2-0.9 times the refinement's time (median 0.7), where a refinement of its own
|
||||
per round added 1-3.7 times (median 2.3), at an R-free within 0.001 of that on eight of them (two 0.0016-0.0028
|
||||
higher, one 0.0016 lower). `--refine-score-only` builds nothing, and the build and the audit run only with `--refine-solvent`
|
||||
(off by default for now).
|
||||
keeps its place. A round thus costs a map, an audit and a refinement of the solvent, so the build adds
|
||||
somewhat less than the refinement's own time. `--refine-score-only` builds nothing, and the build and the audit run only with `--refine-solvent`
|
||||
(off by default).
|
||||
|
||||
- *Relabelled* is a water or a single-atom ion (no alternative conformer) whose best-supported species is another
|
||||
one, not ambiguously - a water becomes an ion, an ion water or another ion - once per site. It takes the
|
||||
@@ -500,14 +498,13 @@ higher, one 0.0016 lower). `--refine-score-only` builds nothing, and the build a
|
||||
does not), `HOH`
|
||||
residues numbered on from that chain's last, a water entity and subchain of their own in the mmCIF - with
|
||||
occupancy 1 and the mean B of its partners. The model's own waters stay where they were. A peak on a special position (§15.5) is placed exactly on it with
|
||||
occupancy 1 over the site's multiplicity, its coinciding copies one water (on the refine and open arms this was
|
||||
better or equal in R-free on all five sets with such peaks, against refusing them); one 0.5-2.2 Å from its own
|
||||
occupancy 1 over the site's multiplicity, its coinciding copies one water; one 0.5-2.2 Å from its own
|
||||
copy, which it would clash with, is refused.
|
||||
- *Removed* is any water whose mFo-DFc at its centre is -3 σ or lower (the cut Echols et al. use), and a water the
|
||||
build itself added that has no N, O or ion within 3.4 Å any more or whose B reached the refinement's ceiling.
|
||||
phenix.refine's other filter, 2mFo-DFc below 1 σ at a refined water, is not used: on the refine arm it raised
|
||||
R-free wherever it was tried, on the deposited waters (five sets of five) and on the waters built here, and so
|
||||
did taking out deposited waters without a partner. A weak water still explains density, and a deposited one
|
||||
phenix.refine's other filter, 2mFo-DFc below 1 σ at a refined water, is not used: it raises R-free, on
|
||||
deposited waters and on the waters built here, and so does taking out deposited waters without a
|
||||
partner. A weak water still explains density, and a deposited one
|
||||
carries its depositor's judgement.
|
||||
|
||||
`REFINE_SOLVENT_ADDED` and `REFINE_SOLVENT_REMOVED` count the waters added and still there and those of the model
|
||||
|
||||
+1
-3
@@ -99,9 +99,7 @@ Install the prebuilt `jfjoch-driver-dkms` package from the
|
||||
[PCIe driver](FPGA_PCIE_DRIVER.md).
|
||||
|
||||
DKMS builds the module for the kernel it is being installed for rather than the running one, so a
|
||||
module built during a kernel update loads correctly after the reboot. RHEL 9.5 and later — and their
|
||||
CentOS Stream, Rocky and AlmaLinux equivalents — build unaided; the `HAVE_VM_FLAGS_SET` workaround
|
||||
earlier releases needed is obsolete.
|
||||
module built during a kernel update loads correctly after the reboot.
|
||||
|
||||
NOTE: In case the driver is included in the init RAM-disk image, it is necessary to rebuild the RAM-disk when the driver is updated:
|
||||
```
|
||||
|
||||
@@ -190,10 +190,8 @@ If data collection was configured with a `header_appendix` containing a key `hdf
|
||||
JSON object of numbers and strings, those entries are written to `/entry/user`.
|
||||
|
||||
## Other formats (CBF and TIFF)
|
||||
Earlier versions could also write Crystallographic Binary File (CBF, miniCBF) and TIFF images. These
|
||||
writers have been removed: Jungfraujoch now writes only NXmx HDF5. The `CBF` and `TIFF` values are
|
||||
retained in the file-format enum for wire back-compatibility, but a request to write either format
|
||||
is rejected.
|
||||
Jungfraujoch writes only NXmx HDF5. The `CBF` and `TIFF` values remain in the file-format enum for
|
||||
compatibility, but a request to write either format is rejected.
|
||||
|
||||
## No file option(s)
|
||||
There are two options to disable writing of files by the writer:
|
||||
|
||||
@@ -33,8 +33,8 @@ otherwise.
|
||||
|
||||
## CPU instruction set
|
||||
|
||||
The architecture flags live in the CI configuration rather than in `CMakeLists.txt`, so a site
|
||||
building from source picks its own (`x86-64-v4` on an AVX-512 cluster, `-march=native`, or the plain
|
||||
The build system sets no architecture flags of its own, so a site building from source picks its
|
||||
own (`x86-64-v4` on an AVX-512 cluster, `-march=native`, or the plain
|
||||
baseline the compiler defaults to). The released binaries are compiled to a fixed floor:
|
||||
|
||||
| Release | Flags | Minimum CPU |
|
||||
@@ -113,9 +113,7 @@ is no CUDA-toolkit version requirement on the host.
|
||||
| aarch64 `rugnux` `.tgz` | 13.x | `sm_90` (GH200) and `sm_121` (DGX Spark) only | 580.65.06 |
|
||||
| any `cpu` / `nocuda` variant, and everything for macOS | — | — | none |
|
||||
|
||||
The aarch64 build is cross-compiled and verified in CI to be Arm, self-contained and to carry both
|
||||
GPU targets. CI has no Arm runner; rugnux itself is tested on a DGX Spark (GB10), where the timing
|
||||
benchmark passes with a native build of the same source.
|
||||
The aarch64 build is cross-compiled; Rugnux is tested on a DGX Spark (GB10).
|
||||
|
||||
**A V100 needs the CUDA 12 build.** CUDA 13 dropped offline compilation for Volta, and the PTX that a
|
||||
fatbin also carries only ever JIT-compiles *forwards*, so a CUDA 13 artefact contains nothing a V100
|
||||
|
||||
@@ -36,8 +36,7 @@ We provide the following packages in the repository:
|
||||
* Rugnux — [offline analysis CLI](RUGNUX.md), independent of the acquisition stack
|
||||
|
||||
Note that `rugnux` is named without the `jfjoch-` prefix, matching the program and the release
|
||||
archive. Up to 1.0.0-rc.163 it was part of `jfjoch-viewer`; the package declares that move, so
|
||||
installing it upgrades an older viewer rather than colliding with it.
|
||||
archive.
|
||||
|
||||
## Ubuntu based systems
|
||||
|
||||
@@ -52,7 +51,6 @@ sudo apt update
|
||||
Only slsDetectorPackage 8.0.2 is built for Ubuntu.
|
||||
|
||||
The same five packages as above are provided: `jfjoch`, `jfjoch-driver-dkms`, `jfjoch-writer`,
|
||||
`jfjoch-viewer` and `rugnux`. Up to 1.0.0-rc.160 the first of them was misnamed `jfjoch-jfjoch`; the current
|
||||
package replaces it, so `apt upgrade` handles the rename.
|
||||
`jfjoch-viewer` and `rugnux`.
|
||||
|
||||
Ubuntu packages currently undergo only very limited testing.
|
||||
+3
-3
@@ -25,9 +25,9 @@ Required:
|
||||
* C++20 compiler and C++20 standard library: GCC 11 or newer (checked at configure time; on RHEL/Rocky 8 use gcc-toolset-13), or clang 14+ (Intel OneAPI and AMD AOCC also work)
|
||||
* CMake version 3.26 or newer + a build tool (GNU make or Ninja)
|
||||
|
||||
HDF5, libtiff, zlib and Eigen used to be required system packages; they are now
|
||||
downloaded and built automatically by CMake (see the note below), so none of them needs to be
|
||||
installed. Beyond the optional dependencies listed below, no third-party library has to be provided by the host any more.
|
||||
HDF5, libtiff, zlib and Eigen are downloaded and built automatically by CMake (see the note below),
|
||||
so none of them needs to be installed. Beyond the optional dependencies listed below, no
|
||||
third-party library has to be provided by the host.
|
||||
|
||||
Optional:
|
||||
* CUDA compiler version 12.8 or newer - required for the MX fast feedback indexer and GPU analysis
|
||||
|
||||
@@ -68,7 +68,7 @@ There is no header field that changes this: if XDS is the target, consider colle
|
||||
### Which pixels are masked
|
||||
|
||||
The plugins do not all act on the same mask bits, so XDS and DIALS do not mask the same pixels.
|
||||
Measured with the Durin and Neggia builds used in Jungfraujoch CI:
|
||||
Measured with the Durin and Neggia builds Jungfraujoch is tested against:
|
||||
|
||||
| mask bit | meaning | jfjoch plugin | Durin | Neggia | DIALS |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
Reference in new issue
Block a user