-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdials_scale_user_guide.html
344 lines (314 loc) · 27 KB
/
dials_scale_user_guide.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
<!DOCTYPE html>
<html lang="en" data-content_root="./">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<title>User guide for scaling data with DIALS — DIALS documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=03e43079" />
<link rel="stylesheet" type="text/css" href="_static/basic.css?v=686e5160" />
<link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
<link rel="stylesheet" href="_static/dials-styles.css" type="text/css" />
<script src="_static/documentation_options.js?v=5929fcd5"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<link rel="icon" href="_static/favicon.ico"/>
<link rel="author" title="About these documents" href="about.html" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="SSX processing guide" href="ssx_processing_guide.html" />
<link rel="prev" title="Processing Sequences with Missing Images" href="missing-images.html" />
<link rel="stylesheet" href="_static/custom.css" type="text/css" />
</head><body>
<div class="logoheader container">
<a href="index.html">
<img class="logoheader" alt="DIALS" src="_static/dials_header.png" />
</a>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="user-guide-for-scaling-data-with-dials">
<h1>User guide for scaling data with DIALS<a class="headerlink" href="#user-guide-for-scaling-data-with-dials" title="Link to this heading">¶</a></h1>
<p>This document aims to provide a guide to using <code class="samp docutils literal notranslate"><span class="pre">dials.scale</span></code>, at various levels
of depth. A new user is encouraged to read the Symmetry and Scaling sections of
the <a class="reference external" href="https://dials.github.io/documentation/tutorials/processing_in_detail_betalactamase.html">Processing in detail</a>
tutorial for a quick overview of scaling in DIALS.
For most users, it is likely to be sufficient to read only the
‘Guide to common scaling options’ below,
and return to the rest of the guide if further help is needed.</p>
<p>As a reminder, this is how to run routine data processing after integration to
obtain a merged MTZ file:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">dials</span><span class="o">.</span><span class="n">symmetry</span> <span class="n">integrated</span><span class="o">.</span><span class="n">refl</span> <span class="n">integrated</span><span class="o">.</span><span class="n">expt</span>
<span class="n">dials</span><span class="o">.</span><span class="n">scale</span> <span class="n">symmetrized</span><span class="o">.</span><span class="n">refl</span> <span class="n">symmetrized</span><span class="o">.</span><span class="n">expt</span>
<span class="n">dials</span><span class="o">.</span><span class="n">merge</span> <span class="n">scaled</span><span class="o">.</span><span class="n">refl</span> <span class="n">scaled</span><span class="o">.</span><span class="n">expt</span>
</pre></div>
</div>
<p>The user is also advised to familiarise themselves with the standard program
output, which may contain useful information, and the html report generated
by scaling, which provides numerous plots relating to the merging statistics.</p>
<section id="guide-to-common-scaling-options">
<h2>Guide to common scaling options<a class="headerlink" href="#guide-to-common-scaling-options" title="Link to this heading">¶</a></h2>
<p>These sections cover the most commonly used options (with example values)
for scaling routine macromolecular crystallography datasets.</p>
<p><strong>Cutting back data</strong>
After inspecting the statistics in the <code class="samp docutils literal notranslate"><span class="pre">dials.scale.html</span></code> file, such as
the R-merge vs batch plot, it is often the case that not all of the data are
suitable for merging, perhaps due to radiation damage or nonisomorphism.
This can be the case within a single sweep or across multiple sweeps in a
multi-sweep/multi-crystal experiment. These are example options to use:</p>
<ul class="simple">
<li><p><code class="samp docutils literal notranslate"><span class="pre">d_min=2.0</span></code> Applies a resolution cutoff at the given resolution (in Angstrom).</p></li>
<li><p><code class="samp docutils literal notranslate"><span class="pre">exclude_images="100:120"</span></code> Removes a section of images for a single
sweep dataset. Multiple commands like this can be used to exclude multiple ranges.
In the case of multiple-sweeps, one must also provide the experiment ID that
the exclusion should apply to, with the syntax <code class="samp docutils literal notranslate"><span class="pre">exclude_images="a:b:c"</span></code>
where <cite>a</cite> is the experiment ID (a number starting at <code class="samp docutils literal notranslate"><span class="pre">0</span></code>), <cite>b</cite> is the initial
image to exclude and <cite>c</cite> is the final image to exclude.</p></li>
<li><p><code class="samp docutils literal notranslate"><span class="pre">exclude_datasets="10</span> <span class="pre">50</span> <span class="pre">79"</span></code> Removes whole datasets, based on
the dataset number; useful for large multi-crystal datasets.</p></li>
</ul>
<p><strong>Anomalous data</strong>
During scaling, the option <code class="samp docutils literal notranslate"><span class="pre">anomalous=[True|False]</span></code> determines whether
anomalous pairs (I+/I-) are combined during scaling model minimisation and outlier
rejection. By default, <code class="samp docutils literal notranslate"><span class="pre">anomalous=False</span></code>, which is suitable for data with some anomalous signal, however for strongly anomalous data,
the anomalous signal strength may be enhanced when scaling with <code class="samp docutils literal notranslate"><span class="pre">anomalous=True</span></code></p>
<p><strong>Controlling the absorption correction</strong>
The default physical scaling model applies a relative absorption correction based
on the incoming and outgoing scattering vectors (this accounts for the relative
difference in absorption for different scattering paths through the crystal,
rather than absolute absorption of the beam by the crystal). This correction is
constrained, and the level of constraint and parameterisation can be changed
with the option <code class="samp docutils literal notranslate"><span class="pre">absorption_level=[low|medium|high]</span></code>. This aims to give
relative absorption corrections of around 1%, 5% and 25%, but will depend on
the dataset. To see the extent of the correction, check the ‘scaling models’
section in the <code class="samp docutils literal notranslate"><span class="pre">dials.scale.html</span></code> file.</p>
<p><strong>Generating MTZ files</strong>
For convenience, <code class="samp docutils literal notranslate"><span class="pre">dials.scale</span></code> can invoke the exporting and merging programs to
generate unmerged and merged MTZ files (you may want to use the individual
programs to have more extensive control over the program options):</p>
<ul class="simple">
<li><p><code class="samp docutils literal notranslate"><span class="pre">merged_mtz=scaled.mtz</span></code> Create a merged MTZ file, using the merging routines
available in cctbx.</p></li>
<li><p><code class="samp docutils literal notranslate"><span class="pre">unmerged_mtz=unmerged.mtz</span></code> Output the scaled data in unmerged MTZ format.</p></li>
</ul>
<p><strong>Choosing which integrated intensity to use</strong>
One choice that is made automatically during scaling is whether summation or
profile intensities seem give the best estimate of the integrated intensity
(or a combination of the two). To see the result of this combination, inspect the
table in the scaling log, which scores a set of Imid values on Rpim & CC1/2.
To specify which intensity choice to use, there are a couple of options:</p>
<ul class="simple">
<li><p><code class="samp docutils literal notranslate"><span class="pre">intensity_choice=[profile|sum|combine]</span></code> Choose from profile, sum or combine (default is combine)</p></li>
<li><p><code class="samp docutils literal notranslate"><span class="pre">combine.Imid=700.0</span></code> Specify the crossover value for profile-summation
intensity combination.</p></li>
</ul>
<p><strong>Adjusting the uncertainties/errors</strong>
All scaling programs adjust the uncertainties (sigmas) of the integrated data, to
account for additional systematic errors not sufficiently modelled during integration.
<code class="samp docutils literal notranslate"><span class="pre">dials.scale</span></code> adjusts the intensity errors by refining a two-component error model
(see the output log or <code class="samp docutils literal notranslate"><span class="pre">dials.scale.html</span></code> for the values). While this is
an important correction and should improve the data quality for typical
macromolecular crystallographic data, for poorer quality data the model parameters
may become overinflated.
If so, then this correction can be controlled with the parameters:</p>
<ul class="simple">
<li><p><code class="samp docutils literal notranslate"><span class="pre">error_model=None</span></code> Don’t apply an error model.</p></li>
<li><p><code class="samp docutils literal notranslate"><span class="pre">error_model.basic.minimisation=None</span></code> Don’t refine the error model in this
scaling run. Will keep the pre-existing error model parameters, or the default
error model (<code class="samp docutils literal notranslate"><span class="pre">a=1.0,</span> <span class="pre">b=0.02</span></code>) on a first scaling run.</p></li>
</ul>
<p>For the multi-sweep case, a single error model is applied to the combined dataset,
on the assumption that a similar systematic error is affecting all sweeps. This
approach may not be optimal for some datasets. As an alternative, a separate error
model can be refined on sweeps individually or as groups.</p>
<ul class="simple">
<li><p><code class="samp docutils literal notranslate"><span class="pre">error_model.grouping=[individual|grouped|combined]</span></code> If grouped is chosen,
then the groups must be specified as below.</p></li>
<li><p><code class="samp docutils literal notranslate"><span class="pre">error_model_group='0</span> <span class="pre">1'</span> <span class="pre">error_model_group='2</span> <span class="pre">3'</span></code> e.g. groups the sweeps
in pairs for error model refinement.</p></li>
</ul>
<p><strong>Controlling partials</strong>
By default, reflections with a partiality above 0.4 are included in the output
data files and merging statistics from dials.scale. This threshold can be changed
with the parameters:</p>
<ul class="simple">
<li><p><code class="samp docutils literal notranslate"><span class="pre">partiality_threshold=0.95</span></code> Disregard all measurements with partialities
below this value.</p></li>
</ul>
</section>
<section id="practicalities-for-large-datasets">
<h2>Practicalities for large datasets<a class="headerlink" href="#practicalities-for-large-datasets" title="Link to this heading">¶</a></h2>
<p>Depending on the computational resources available, scaling of large datasets
( > 1 million reflections) can become slow and memory intensive.
There are several options available for managing this.
The first option is separating the data in memory to allow blockwise calculations
and parallel processing, using the option <code class="samp docutils literal notranslate"><span class="pre">nproc=</span></code> (a value of 4 or 8 is
probably a reasonable choice).
One of the most computationally-intensive parts of the algorithm is the final
round of minimisation, which uses full-matrix methods. One can set
<code class="samp docutils literal notranslate"><span class="pre">full_matrix=False</span></code> to turn this off, however no errors for the scale
factors will be determined. A compromise is to set
<code class="samp docutils literal notranslate"><span class="pre">full_matrix_max_iterations=1</span></code> to do at least one iteration.
A third option is to reduce the number of reflections used by the scaling
algorithm during minimisation. If using <code class="samp docutils literal notranslate"><span class="pre">reflection_selection.method=auto</span></code>,
the number of reflections should be manageable even for very large datasets, but
this can always be controlled by the user. To get started, use the command
<code class="samp docutils literal notranslate"><span class="pre">dials.scale</span> <span class="pre">-ce2</span></code> to see the full set of available options in the section
<code class="samp docutils literal notranslate"><span class="pre">reflection_selection</span></code>. Try setting <code class="samp docutils literal notranslate"><span class="pre">reflection_selection.method=quasi_random</span></code>
alongside some of the <code class="samp docutils literal notranslate"><span class="pre">quasi_random</span></code> parameters.</p>
</section>
<section id="scaling-against-a-reference-dataset">
<h2>Scaling against a reference dataset<a class="headerlink" href="#scaling-against-a-reference-dataset" title="Link to this heading">¶</a></h2>
<p>DIALS contains functionality for scaling against a reference dataset, also
referred to as targeted scaling.
This reference can either be a dataset scaled with dials.scale, or an mtz file
containing a scaled dataset. The scaled data (excluding the reference) will
be output in a single .refl/.expt file.</p>
<p><strong>Scaling against a dials reference dataset.</strong>
In this example, reference.refl and reference.expt are from a dataset that has
already been scaled with dials.scale. To scale another dataset (datafiles
<code class="samp docutils literal notranslate"><span class="pre">integrated.refl</span> <span class="pre">integrated.expt</span></code>) against this reference, one should use the
following command:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">dials</span><span class="o">.</span><span class="n">scale</span> <span class="n">only_target</span><span class="o">=</span><span class="kc">True</span> <span class="n">integrated</span><span class="o">.</span><span class="n">refl</span> <span class="n">integrated</span><span class="o">.</span><span class="n">expt</span> <span class="n">reference</span><span class="o">.</span><span class="n">refl</span> <span class="n">reference</span><span class="o">.</span><span class="n">expt</span>
</pre></div>
</div>
<p>This will scale the intensities of the dataset to agree as closely as possible
with the intensities of the reference dataset. The <code class="samp docutils literal notranslate"><span class="pre">only_target=True</span></code>
command is important, else all the data will be scaled together and output in
a joint output file.</p>
<p><strong>Scaling against a reference mtz file.</strong>
In this case, it is assumed that the intensity and variance columns of the mtz
file have already been scaled. Reference scaling would be run with the following
command:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">dials</span><span class="o">.</span><span class="n">scale</span> <span class="n">integrated</span><span class="o">.</span><span class="n">refl</span> <span class="n">integrated</span><span class="o">.</span><span class="n">expt</span> <span class="n">reference</span><span class="o">=</span><span class="n">scaled</span><span class="o">.</span><span class="n">mtz</span>
</pre></div>
</div>
<p>The reference scaling algorithm is the same regardless of the target datafile type.</p>
</section>
<section id="advanced-use-controlling-the-scaling-models">
<h2>Advanced use - Controlling the scaling models<a class="headerlink" href="#advanced-use-controlling-the-scaling-models" title="Link to this heading">¶</a></h2>
<p>There are three available scaling models available in dials.scale, accessible
by the command line option <code class="samp docutils literal notranslate"><span class="pre">model</span> <span class="pre">=</span> <span class="pre">physical</span> <span class="pre">array</span> <span class="pre">KB</span> <span class="pre">*auto</span></code>.
The physical model is similar to the scaling model used in the program <a class="reference external" href="http://www.ccp4.ac.uk/html/aimless.html">aimless</a>,
the array model is based on the approach taken in <a class="reference external" href="http://xds.mpimf-heidelberg.mpg.de/html_doc/xscale_program.html">xscale</a>, while the KB model is
a simple two-component model suitable for still-image datasets or very small
rotation datasets (~ < 1 degree).</p>
<p>The auto option automatically chooses a default model and sensible parameterisation
based on the oscillation range of the experiment. This will choose the
physical model unless the oscillation range is < 1.0 degree, when the KB model
will be chosen. If the oscillation range is < 60 degrees, the absorption correction
of the physical model is disabled, as this may be poorly determined. The parameter
spacing as a function of rotation is also adjusted down from the defaults if the
oscillation range is below 90 degrees, to try to give a sensible automatic
parameterisation.</p>
<p>The physical model consists of up to three components; a smoothly varying
scale correction, a smoothly varying B-factor correction and an absorption surface
correction (all on by default). These are turned on/off with the command line options
<code class="samp docutils literal notranslate"><span class="pre">physical.scale_correction=True/False</span> <span class="pre">physical.decay_correction=True/False</span> <span class="pre">physical.absorption_correction=True/False</span></code>.
The smoothly varying terms have a parameter at regular intervals in rotation,
which can be specified with the <code class="samp docutils literal notranslate"><span class="pre">physical.scale_interval</span></code> and <code class="samp docutils literal notranslate"><span class="pre">physical.decay_interval</span></code>
options. The number of parameters in the absorption surface is determined by the
highest order of spherical harmonics function used, controlled by <code class="samp docutils literal notranslate"><span class="pre">physical.lmax</span></code>
(recommended to be no higher than 6, 4 by default). There is also a weak
<code class="samp docutils literal notranslate"><span class="pre">physical.decay_restraint</span></code> and strong <code class="samp docutils literal notranslate"><span class="pre">physical.surface_weight</span></code> to
restrain the parameters of the decay and absorption terms towards zero.
The physical model is suitable for most datasets, although the absorption correction
should be turned off for datasets with low reciprocal space coverage.</p>
<p>The KB model applies a single scale factor and single B-factor to the whole
dataset (B-factor can be turned off with <code class="samp docutils literal notranslate"><span class="pre">decay_term=False</span></code>). This is
only suitable for very thin wedge/single-image datasets. If the KB model is
used, it may be necessary to set <code class="samp docutils literal notranslate"><span class="pre">full_matrix=False</span></code>, as the full matrix
minimisation round can be unstable depending on the number of reflections per
dataset.</p>
<p>The array model consists of up to three components. The first (
<code class="samp docutils literal notranslate"><span class="pre">array.decay_correction</span></code>), consists of a smoothly varying correction
calculated over a 2D grid of parameters, as a function of rotation vs resolution
(d-value). The parameter interval in rotation is controlled by
<code class="samp docutils literal notranslate"><span class="pre">array.decay_interval</span></code>, while the number of resolution bins is
controlled by <code class="samp docutils literal notranslate"><span class="pre">array.n_resolution_bins</span></code>.
The second (<code class="samp docutils literal notranslate"><span class="pre">array.absorption_correction</span></code>) consists of a smoothly
varying correction calculated over a 3D grid of parameters, as a function of
rotation, x and y position of the measured reflection on the detector. The spacing
in rotation is the same as the decay correction, while the detector beginning is
controlled with <code class="samp docutils literal notranslate"><span class="pre">array.n_absorption_bins</span></code>.
Finally, an <code class="samp docutils literal notranslate"><span class="pre">array.modulation_correction</span></code> can be applied, which is a
smooth 2D correction as a function of x and y position, controlled with
<code class="samp docutils literal notranslate"><span class="pre">array.n_modulation_bins</span></code>, although this is off by default.
The array model is only suitable for wide-rotation datasets with a high
number of reflections and it should be tested whether the absorption
correction is suitable, as it may lead to overparameterisation.</p>
</section>
<section id="advanced-use-choosing-reflections-to-use-for-minimisation">
<h2>Advanced use - Choosing reflections to use for minimisation<a class="headerlink" href="#advanced-use-choosing-reflections-to-use-for-minimisation" title="Link to this heading">¶</a></h2>
<p>To minimise the scaling model, a subset of reflections are used for efficiency.
Four methods are available with the following command:
<code class="samp docutils literal notranslate"><span class="pre">reflection_selection.method=auto</span> <span class="pre">quasi_random</span> <span class="pre">intensity_ranges</span> <span class="pre">use_all</span></code>.</p>
<p>By default, the auto method uses the quasi_random selection algorithm, with
automatically determined parameters based on the dataset properties. If the
dataset is small (<20k reflections), the <code class="samp docutils literal notranslate"><span class="pre">use_all</span></code> option is selected.</p>
<p>For each dataset, the quasi_random algorithm chooses reflection groups that
have a high connectedness across different areas of reciprocal space,
across all resolution shells. In multi-dataset scaling, a separate selection
is also made to find reflection groups that have a high connectedness across
the datasets (choosing from groups with an average I/sigma above a cutoff).
The parameters of the algorithm are therefore controllable with the following
options, if one explicitly chooses <code class="samp docutils literal notranslate"><span class="pre">reflection_selection.method=quasi_random</span></code>:
<code class="samp docutils literal notranslate"><span class="pre">quasi_random.min_per_area</span></code>, <code class="samp docutils literal notranslate"><span class="pre">quasi_random.n_resolution_bins</span></code>,
<code class="samp docutils literal notranslate"><span class="pre">quasi_random.multi_dataset.min_per_dataset</span></code> and
<code class="samp docutils literal notranslate"><span class="pre">quasi_random.multi_dataset.Isigma_cutoff</span></code>. The <code class="samp docutils literal notranslate"><span class="pre">auto</span></code> option sets these
parameters in order to give sufficient connectedness across reciprocal space/datasets
depending on the size of the dataset, number or parameters and number of datasets.</p>
<p>The <code class="samp docutils literal notranslate"><span class="pre">intensity_ranges</span></code> option chooses intensities between a range of
normalised intensities (<code class="samp docutils literal notranslate"><span class="pre">E2_range</span></code>), between a range of I/sigma (<code class="samp docutils literal notranslate"><span class="pre">Isigma_range</span></code>)
and between a resolution range (<code class="samp docutils literal notranslate"><span class="pre">d_range</span></code>). This will typically select
around 1/3 of all reflections.</p>
<p>The <code class="samp docutils literal notranslate"><span class="pre">use_all</span></code> method simply uses all suitable reflections for scaling model
minimisation, but may be prohibitively slow and memory-intensive for large datasets.</p>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="Main">
<div class="sphinxsidebarwrapper"><!--<h3>Navigation</h3>-->
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="about.html">About</a></li>
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="documentation/index.html">Documentation</a></li>
<li class="toctree-l1"><a class="reference internal" href="documentation/tutorials/index.html">Tutorials</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="howto.html">How-to</a></li>
<li class="toctree-l1"><a class="reference external" href="https://dials.github.io/kb">Knowledge Base</a></li>
<li class="toctree-l1"><a class="reference internal" href="workshops/index.html">Workshops</a></li>
<li class="toctree-l1"><a class="reference internal" href="national_resource.html">US National Resource</a></li>
<li class="toctree-l1"><a class="reference internal" href="publications.html">Publications</a></li>
<li class="toctree-l1"><a class="reference internal" href="projects.html">Projects</a></li>
<li class="toctree-l1"><a class="reference internal" href="license.html">License</a></li>
</ul>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="footer container">
<a href="https://www.diamond.ac.uk/"><img class="logofooter" alt="Diamond" src="_static/diamond_logo.png" /></a>
<a href="https://www.ccp4.ac.uk/"><img class="logofooter" alt="CCP4" src="_static/CCP4-logo-plain.png" /></a>
<a href="https://www.stfc.ac.uk/"><img class="logofooter" alt="STFC" src="https://dials.github.io/images/logos/ukri-stfc.png" /></a>
<a href="https://www.lbl.gov/"><img class="logofooter" alt="LBL" src="https://dials.github.io/images/logos/lbl.png" /></a>
<a href="http://smb.slac.stanford.edu/"><img class="logofooter" alt="SSRL/SMB" src="https://dials.github.io/images/logos/smbssrl.jpg" /></a>
</div>
<script type="text/javascript">
$(document).ready(function() {
$(".toggle > *").hide();
$(".toggle .header").show();
$(".toggle .header").click(function() {
$(this).parent().children().not(".header").toggle(400);
$(this).parent().children(".header").toggleClass("open");
})
});
</script>
<div class="footer">
©2025, Diamond Light Source, Lawrence Berkeley National Laboratory and STFC.
</div>
</body>
</html>