-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexamples.html
More file actions
467 lines (395 loc) · 50.4 KB
/
examples.html
File metadata and controls
467 lines (395 loc) · 50.4 KB
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
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
<!DOCTYPE html>
<html class="writer-html5" lang="en" data-content_root="./">
<head>
<meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Examples — CDTools 0.2.0 documentation</title>
<link rel="stylesheet" type="text/css" href="_static/pygments.css?v=fa44fd50" />
<link rel="stylesheet" type="text/css" href="_static/css/theme.css?v=19f00094" />
<!--[if lt IE 9]>
<script src="_static/js/html5shiv.min.js"></script>
<![endif]-->
<script src="_static/jquery.js?v=5d32c60e"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c"></script>
<script src="_static/documentation_options.js?v=938c9ccc"></script>
<script src="_static/doctools.js?v=9a2dae69"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/js/theme.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Tutorial" href="tutorial.html" />
<link rel="prev" title="Installation" href="installation.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home">
CDTools
</a>
<div class="version">
0.2
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="index.html">Introduction to CDTools</a></li>
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Examples</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#inspect-dataset">Inspect Dataset</a></li>
<li class="toctree-l2"><a class="reference internal" href="#simple-ptycho">Simple Ptycho</a></li>
<li class="toctree-l2"><a class="reference internal" href="#fancy-ptycho">Fancy Ptycho</a></li>
<li class="toctree-l2"><a class="reference internal" href="#gold-ball-ptycho">Gold Ball Ptycho</a></li>
<li class="toctree-l2"><a class="reference internal" href="#gold-ball-split">Gold Ball Split</a></li>
<li class="toctree-l2"><a class="reference internal" href="#gold-ball-synthesize">Gold Ball Synthesize</a></li>
<li class="toctree-l2"><a class="reference internal" href="#transmission-rpi">Transmission RPI</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="tutorial.html">Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="general.html">General Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="datasets.html">Datasets</a></li>
<li class="toctree-l1"><a class="reference internal" href="models.html">Models</a></li>
<li class="toctree-l1"><a class="reference internal" href="tools/index.html">Tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="indices_tables.html">Indices and tables</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">CDTools</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item active">Examples</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/examples.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="examples">
<h1>Examples<a class="headerlink" href="#examples" title="Link to this heading"></a></h1>
<p>Included with the repository are a number of example scripts that demonstrate how various aspects of CDTools work. It is recommended to read through at least a few of them before continuing to the tutorial.</p>
<p>All the datasets used in these example scripts are included in the repository, and the scripts should be runnable as soon as CDTools is installed</p>
<section id="inspect-dataset">
<h2>Inspect Dataset<a class="headerlink" href="#inspect-dataset" title="Link to this heading"></a></h2>
<p>The first example loads and visualizes ptychography data stored in a .cxi file.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">cdtools</span>
<span class="kn">from</span> <span class="nn">matplotlib</span> <span class="kn">import</span> <span class="n">pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="c1"># First, we load an example dataset from a .cxi file</span>
<span class="n">filename</span> <span class="o">=</span> <span class="s1">'example_data/AuBalls_700ms_30nmStep_3_6SS_filter.cxi'</span>
<span class="n">dataset</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">datasets</span><span class="o">.</span><span class="n">Ptycho2DDataset</span><span class="o">.</span><span class="n">from_cxi</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="c1"># And we take a look at the data</span>
<span class="n">dataset</span><span class="o">.</span><span class="n">inspect</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
<p>First, data is read into a Ptycho2DDataset object, which is a subclass of a pytorch dataset that knows a bit about the structure of ptychography data. Calling <code class="code docutils literal notranslate"><span class="pre">dataset.inspect</span></code> generates a plot showing an overview of the ptychography scan data. On the left is a scatter plot showing the integrated detector intensity at each probe location. On the right, raw detector images are shown. The dataset can be navigated by clicking around the scatter plot on the left.</p>
</section>
<section id="simple-ptycho">
<h2>Simple Ptycho<a class="headerlink" href="#simple-ptycho" title="Link to this heading"></a></h2>
<p>This script runs a ptychography reconstruction using the SimplePtycho model, a bare-bones ptychography model for the transmission geometry.</p>
<p>The purpose of the SimplePtycho model is pedagogical: there are very few situations where it would preferred to the FancyPtycho model which will be introduced later.</p>
<p>Because of it’s simplicity, the definition of this model is much simpler than the definition of FancyPtycho, and it is therefore a good first model to look at to learn how to implement a custom ptychography model in CDTools.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">cdtools</span>
<span class="kn">from</span> <span class="nn">matplotlib</span> <span class="kn">import</span> <span class="n">pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="c1"># We load an example dataset from a .cxi file</span>
<span class="n">filename</span> <span class="o">=</span> <span class="s1">'example_data/lab_ptycho_data.cxi'</span>
<span class="n">dataset</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">datasets</span><span class="o">.</span><span class="n">Ptycho2DDataset</span><span class="o">.</span><span class="n">from_cxi</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="c1"># We create a ptychography model from the dataset</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">models</span><span class="o">.</span><span class="n">SimplePtycho</span><span class="o">.</span><span class="n">from_dataset</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="c1"># We move the model to the GPU</span>
<span class="n">device</span> <span class="o">=</span> <span class="s1">'cuda'</span>
<span class="n">model</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">)</span>
<span class="n">dataset</span><span class="o">.</span><span class="n">get_as</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">)</span>
<span class="c1"># We run the actual reconstruction</span>
<span class="k">for</span> <span class="n">loss</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">Adam_optimize</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
<span class="c1"># We print a quick report of the optimization status</span>
<span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="c1"># And liveplot the updates to the model as they happen</span>
<span class="n">model</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="c1"># We study the results</span>
<span class="n">model</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="n">model</span><span class="o">.</span><span class="n">compare</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
<p>When reading this script, note the basic workflow. After the data is loaded, a model is created to match the geometry stored in the dataset with a sensible default initialization for all the parameters.</p>
<p>Next, the model is moved to the GPU using the <code class="code docutils literal notranslate"><span class="pre">model.to</span></code> function. Any device understood by <code class="code docutils literal notranslate"><span class="pre">torch.Tensor.to</span></code> can be specified here. The next line is a bit more subtle - the dataset is told to move patterns to the GPU before passing them to the model using the <code class="code docutils literal notranslate"><span class="pre">dataset.get_as</span></code> function. This function does not move the stored patterns to the GPU. If there is sufficient GPU memory, the patterns can also be pre-moved to the GPU using <code class="code docutils literal notranslate"><span class="pre">dataset.to</span></code>, but the speedup is empirically quite small.</p>
<p>Once the device is selected, a reconstruction is run using <code class="code docutils literal notranslate"><span class="pre">model.Adam_optimize</span></code>. This is a generator function which will yield at every epoch, to allow some monitoring code to be run.</p>
<p>Finally, the results can be studied using <code class="code docutils literal notranslate"><span class="pre">model.inspect(dataet)</span></code>, which creates or updates a set of plots showing the current state of the model parameters. <code class="code docutils literal notranslate"><span class="pre">model.compare(dataset)</span></code> is also called, which shows how the simulated diffraction patterns compare to the measured diffraction patterns in the dataset.</p>
</section>
<section id="fancy-ptycho">
<h2>Fancy Ptycho<a class="headerlink" href="#fancy-ptycho" title="Link to this heading"></a></h2>
<p>This script runs a reconstruction on the same data, but using the workhorse FancyPtycho model, demonstrating some of it’s more commonly used features</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">cdtools</span>
<span class="kn">from</span> <span class="nn">matplotlib</span> <span class="kn">import</span> <span class="n">pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="n">filename</span> <span class="o">=</span> <span class="s1">'example_data/lab_ptycho_data.cxi'</span>
<span class="n">dataset</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">datasets</span><span class="o">.</span><span class="n">Ptycho2DDataset</span><span class="o">.</span><span class="n">from_cxi</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="c1"># FancyPtycho is the workhorse model</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">models</span><span class="o">.</span><span class="n">FancyPtycho</span><span class="o">.</span><span class="n">from_dataset</span><span class="p">(</span>
<span class="n">dataset</span><span class="p">,</span>
<span class="n">n_modes</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="c1"># Use 3 incoherently mixing probe modes</span>
<span class="n">oversampling</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="c1"># Simulate the probe on a 2xlarger real-space array</span>
<span class="n">probe_support_radius</span><span class="o">=</span><span class="mi">120</span><span class="p">,</span> <span class="c1"># Force the probe to 0 outside a radius of 120 pix</span>
<span class="n">propagation_distance</span><span class="o">=</span><span class="mf">5e-3</span><span class="p">,</span> <span class="c1"># Propagate the initial probe guess by 5 mm</span>
<span class="n">units</span><span class="o">=</span><span class="s1">'mm'</span><span class="p">,</span> <span class="c1"># Set the units for the live plots</span>
<span class="n">obj_view_crop</span><span class="o">=-</span><span class="mi">50</span><span class="p">,</span> <span class="c1"># Expands the field of view in the object plot by 50 pix</span>
<span class="p">)</span>
<span class="n">device</span> <span class="o">=</span> <span class="s1">'cuda'</span>
<span class="n">model</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">)</span>
<span class="n">dataset</span><span class="o">.</span><span class="n">get_as</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">)</span>
<span class="c1"># The learning rate parameter sets the alpha for Adam.</span>
<span class="c1"># The beta parameters are (0.9, 0.999) by default</span>
<span class="c1"># The batch size sets the minibatch size</span>
<span class="k">for</span> <span class="n">loss</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">Adam_optimize</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.02</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="c1"># Plotting is expensive, so we only do it every tenth epoch</span>
<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">epoch</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">model</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="c1"># It's common to chain several different reconstruction loops. Here, we</span>
<span class="c1"># started with an aggressive refinement to find the probe, and now we</span>
<span class="c1"># polish the reconstruction with a lower learning rate and larger minibatch</span>
<span class="k">for</span> <span class="n">loss</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">Adam_optimize</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.005</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">50</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">epoch</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">model</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="c1"># This orthogonalizes the recovered probe modes</span>
<span class="n">model</span><span class="o">.</span><span class="n">tidy_probes</span><span class="p">()</span>
<span class="n">model</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="n">model</span><span class="o">.</span><span class="n">compare</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
<p>The <code class="code docutils literal notranslate"><span class="pre">FancyPtycho.from_dataset</span></code> factory function has many keyword arguments which can turn on or modify various mixins. In this case, we perform a reconstruction with:</p>
<ul class="simple">
<li><p>3 incoherently mixing probe modes (in the vein of doi:10.1038/nature11806)</p></li>
<li><p>A probe array expanded by a factor of 2 in real space, i.e. simulated on a 2x2 upsampled grid in Fourier space (in the vein of doi:10.1103/PhysRevA.87.053850)</p></li>
<li><p>A circular finite support constraint applied to the probe</p></li>
<li><p>An initial guess for the probe which has been propagated from its focus position</p></li>
</ul>
<p>By default, FancyPtycho will also optimize over the following model parameters, each of which corrects for a specific source of errror:</p>
<dl class="simple">
<dt><code class="code docutils literal notranslate"><span class="pre">model.background</span></code></dt><dd><p>A frame-independent detector background</p>
</dd>
<dt><code class="code docutils literal notranslate"><span class="pre">model.weights</span></code></dt><dd><p>A frame-to-frame variation in the incoming probe intensity</p>
</dd>
<dt><code class="code docutils literal notranslate"><span class="pre">model.translation_offsets</span></code></dt><dd><p>A frame-independent detector background</p>
</dd>
</dl>
<p>These corrections can be turned off (on) by calling <code class="code docutils literal notranslate"><span class="pre">model.<parameter>.requires_grad</span> <span class="pre">=</span> <span class="pre">False</span> <span class="pre">#(True)</span></code>.</p>
</section>
<section id="gold-ball-ptycho">
<h2>Gold Ball Ptycho<a class="headerlink" href="#gold-ball-ptycho" title="Link to this heading"></a></h2>
<p>This script shows how the FancyPtycho model might be used in a realistic situation, to perform a reconstruction on the classic <a class="reference external" href="http://www.cxidb.org/id-65.html">gold balls</a> dataset. This script also shows how to save results!</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">cdtools</span>
<span class="kn">from</span> <span class="nn">matplotlib</span> <span class="kn">import</span> <span class="n">pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">import</span> <span class="nn">torch</span> <span class="k">as</span> <span class="nn">t</span>
<span class="n">filename</span> <span class="o">=</span> <span class="s1">'example_data/AuBalls_700ms_30nmStep_3_6SS_filter.cxi'</span>
<span class="n">dataset</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">datasets</span><span class="o">.</span><span class="n">Ptycho2DDataset</span><span class="o">.</span><span class="n">from_cxi</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="c1"># We pad the dataset with 10 pixels of zeroes around the edge. This</span>
<span class="c1"># data gets masked off, so it is not used for the reconstruction. This padding</span>
<span class="c1"># helps prevent aliasing when the probe and object get multiplied. It's a</span>
<span class="c1"># helpful step when there is signal present out to the edge of the detector,</span>
<span class="c1"># and is usually set to the radius of the probe's Fourier transform (in pixels)</span>
<span class="n">pad</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">dataset</span><span class="o">.</span><span class="n">pad</span><span class="p">(</span><span class="n">pad</span><span class="p">)</span>
<span class="n">dataset</span><span class="o">.</span><span class="n">inspect</span><span class="p">()</span>
<span class="c1"># When the dataset is padded with zeroes and masked, the probe reconstruction</span>
<span class="c1"># becomes very unstable, and often develops noise at these high-frequency,</span>
<span class="c1"># masked off frequencies. To combat this, we simulate the probe at lower</span>
<span class="c1"># resolution, using the probe_fourier_crop argument. This is good practice</span>
<span class="c1"># in general when padding the dataset</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">models</span><span class="o">.</span><span class="n">FancyPtycho</span><span class="o">.</span><span class="n">from_dataset</span><span class="p">(</span>
<span class="n">dataset</span><span class="p">,</span>
<span class="n">n_modes</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
<span class="n">probe_support_radius</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span>
<span class="n">propagation_distance</span><span class="o">=</span><span class="mf">2e-6</span><span class="p">,</span>
<span class="n">units</span><span class="o">=</span><span class="s1">'um'</span><span class="p">,</span>
<span class="n">probe_fourier_crop</span><span class="o">=</span><span class="n">pad</span>
<span class="p">)</span>
<span class="c1"># This is a trick that my grandmother taught me, to combat the raster grid</span>
<span class="c1"># pathology: we randomze the our initial guess of the probe positions.</span>
<span class="c1"># The units here are pixels in the object array.</span>
<span class="c1"># Try running this script with and without this line to see the difference!</span>
<span class="n">model</span><span class="o">.</span><span class="n">translation_offsets</span><span class="o">.</span><span class="n">data</span> <span class="o">+=</span> <span class="mf">0.7</span> <span class="o">*</span> <span class="n">t</span><span class="o">.</span><span class="n">randn_like</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">translation_offsets</span><span class="p">)</span>
<span class="c1"># Not much probe intensity instability in this dataset, no need for this</span>
<span class="n">model</span><span class="o">.</span><span class="n">weights</span><span class="o">.</span><span class="n">requires_grad</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">device</span> <span class="o">=</span> <span class="s1">'cuda'</span>
<span class="n">model</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">)</span>
<span class="n">dataset</span><span class="o">.</span><span class="n">get_as</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">)</span>
<span class="c1"># This will save out the intermediate results if an exception is thrown</span>
<span class="c1"># during the reconstruction</span>
<span class="k">with</span> <span class="n">model</span><span class="o">.</span><span class="n">save_on_exception</span><span class="p">(</span>
<span class="s1">'example_reconstructions/gold_balls_earlyexit.h5'</span><span class="p">,</span> <span class="n">dataset</span><span class="p">):</span>
<span class="k">for</span> <span class="n">loss</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">Adam_optimize</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.005</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">50</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">epoch</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">model</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="k">for</span> <span class="n">loss</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">Adam_optimize</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.002</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">100</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">epoch</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">model</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="c1"># We can often reset our guess of the probe positions once we have a</span>
<span class="c1"># good guess of probe and object, but in this case it causes the</span>
<span class="c1"># raster grid pathology to return.</span>
<span class="c1"># model.translation_offsets.data[:] = 0</span>
<span class="c1"># Setting schedule=True automatically lowers the learning rate if</span>
<span class="c1"># the loss fails to improve after 10 epochs</span>
<span class="k">for</span> <span class="n">loss</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">Adam_optimize</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.001</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
<span class="n">schedule</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="k">if</span> <span class="n">model</span><span class="o">.</span><span class="n">epoch</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">model</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="n">model</span><span class="o">.</span><span class="n">tidy_probes</span><span class="p">()</span>
<span class="c1"># This saves the final result</span>
<span class="n">model</span><span class="o">.</span><span class="n">save_to_h5</span><span class="p">(</span><span class="s1">'example_reconstructions/gold_balls.h5'</span><span class="p">,</span> <span class="n">dataset</span><span class="p">)</span>
<span class="n">model</span><span class="o">.</span><span class="n">inspect</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="n">model</span><span class="o">.</span><span class="n">compare</span><span class="p">(</span><span class="n">dataset</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
<p>Note, in particular, the use of <code class="code docutils literal notranslate"><span class="pre">model.save_on_exception</span></code> and <code class="code docutils literal notranslate"><span class="pre">model.save_to_h5</span></code> to save the results of the reconstruction. If a different file format is required, <code class="code docutils literal notranslate"><span class="pre">model.save_results</span></code> will save to a pure-python dictionary.</p>
<p>Finally, note that there are several small adjustments made to the script to counteract particular sources of error that are present in this dataset, for example the raster grid pathology caused by the scan pattern used. Also note that not every mixin is needed every time - in this case, we turn off optimization of the <code class="code docutils literal notranslate"><span class="pre">weights</span></code> parameter.</p>
</section>
<section id="gold-ball-split">
<h2>Gold Ball Split<a class="headerlink" href="#gold-ball-split" title="Link to this heading"></a></h2>
<p>It is very common to run reconstructions on two disjoint subsets of the same dataset, as well as the full dataset. This is primarily done to estimate the resolution of a reconstruction via the Fourier ring correlation (FRC).</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">cdtools</span>
<span class="kn">import</span> <span class="nn">torch</span> <span class="k">as</span> <span class="nn">t</span>
<span class="n">filename</span> <span class="o">=</span> <span class="s1">'example_data/AuBalls_700ms_30nmStep_3_6SS_filter.cxi'</span>
<span class="n">dataset</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">datasets</span><span class="o">.</span><span class="n">Ptycho2DDataset</span><span class="o">.</span><span class="n">from_cxi</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
<span class="n">pad</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">dataset</span><span class="o">.</span><span class="n">pad</span><span class="p">(</span><span class="n">pad</span><span class="p">)</span>
<span class="c1"># This splits the dataset into a pseudorandomly chosen set of two disjoint</span>
<span class="c1"># datasets. The partitioning is drawn from a saved list, so the split is</span>
<span class="c1"># deterministic</span>
<span class="n">dataset_1</span><span class="p">,</span> <span class="n">dataset_2</span> <span class="o">=</span> <span class="n">dataset</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="n">datasets</span> <span class="o">=</span> <span class="p">[</span><span class="n">dataset_1</span><span class="p">,</span> <span class="n">dataset_2</span><span class="p">,</span> <span class="n">dataset</span><span class="p">]</span>
<span class="n">labels</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'half_1'</span><span class="p">,</span> <span class="s1">'half_2'</span><span class="p">,</span> <span class="s1">'full'</span><span class="p">]</span>
<span class="k">for</span> <span class="n">label</span><span class="p">,</span> <span class="n">dataset</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">labels</span><span class="p">,</span> <span class="n">datasets</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Working on dataset </span><span class="si">{</span><span class="n">label</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">models</span><span class="o">.</span><span class="n">FancyPtycho</span><span class="o">.</span><span class="n">from_dataset</span><span class="p">(</span>
<span class="n">dataset</span><span class="p">,</span>
<span class="n">n_modes</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
<span class="n">probe_support_radius</span><span class="o">=</span><span class="mi">50</span><span class="p">,</span>
<span class="n">propagation_distance</span><span class="o">=</span><span class="mf">2e-6</span><span class="p">,</span>
<span class="n">units</span><span class="o">=</span><span class="s1">'um'</span><span class="p">,</span>
<span class="n">probe_fourier_crop</span><span class="o">=</span><span class="n">pad</span>
<span class="p">)</span>
<span class="n">model</span><span class="o">.</span><span class="n">translation_offsets</span><span class="o">.</span><span class="n">data</span> <span class="o">+=</span> \
<span class="mf">0.7</span> <span class="o">*</span> <span class="n">t</span><span class="o">.</span><span class="n">randn_like</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">translation_offsets</span><span class="p">)</span>
<span class="n">model</span><span class="o">.</span><span class="n">weights</span><span class="o">.</span><span class="n">requires_grad</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">device</span> <span class="o">=</span> <span class="s1">'cuda'</span>
<span class="n">model</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">)</span>
<span class="n">dataset</span><span class="o">.</span><span class="n">get_as</span><span class="p">(</span><span class="n">device</span><span class="o">=</span><span class="n">device</span><span class="p">)</span>
<span class="c1"># For batched reconstructions like this, there's no need to live-plot</span>
<span class="c1"># the progress</span>
<span class="k">for</span> <span class="n">loss</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">Adam_optimize</span><span class="p">(</span><span class="mi">20</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.005</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">50</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="k">for</span> <span class="n">loss</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">Adam_optimize</span><span class="p">(</span><span class="mi">50</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.002</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">100</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="k">for</span> <span class="n">loss</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">Adam_optimize</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="n">dataset</span><span class="p">,</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.001</span><span class="p">,</span> <span class="n">batch_size</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
<span class="n">schedule</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="nb">print</span><span class="p">(</span><span class="n">model</span><span class="o">.</span><span class="n">report</span><span class="p">())</span>
<span class="n">model</span><span class="o">.</span><span class="n">tidy_probes</span><span class="p">()</span>
<span class="n">model</span><span class="o">.</span><span class="n">save_to_h5</span><span class="p">(</span><span class="sa">f</span><span class="s1">'example_reconstructions/gold_balls_</span><span class="si">{</span><span class="n">label</span><span class="si">}</span><span class="s1">.h5'</span><span class="p">,</span> <span class="n">dataset</span><span class="p">)</span>
</pre></div>
</div>
<p>This script simply divides the dataset in two, and then performs the same reconstruction on both halves of the dataset, as well as the full dataset.</p>
</section>
<section id="gold-ball-synthesize">
<h2>Gold Ball Synthesize<a class="headerlink" href="#gold-ball-synthesize" title="Link to this heading"></a></h2>
<p>Once we have a set of three reconstructions - two half data reconstructions and a full data reconstruction, we need to calculate the resolution metrics. This script shows how that is done.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">cdtools</span>
<span class="kn">from</span> <span class="nn">cdtools.tools</span> <span class="kn">import</span> <span class="n">plotting</span> <span class="k">as</span> <span class="n">p</span>
<span class="kn">from</span> <span class="nn">matplotlib</span> <span class="kn">import</span> <span class="n">pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="c1"># We load all three reconstructions</span>
<span class="n">half_1</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">tools</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">h5_to_nested_dict</span><span class="p">(</span>
<span class="sa">f</span><span class="s1">'example_reconstructions/gold_balls_half_1.h5'</span><span class="p">)</span>
<span class="n">half_2</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">tools</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">h5_to_nested_dict</span><span class="p">(</span>
<span class="sa">f</span><span class="s1">'example_reconstructions/gold_balls_half_2.h5'</span><span class="p">)</span>
<span class="n">full</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">tools</span><span class="o">.</span><span class="n">data</span><span class="o">.</span><span class="n">h5_to_nested_dict</span><span class="p">(</span>
<span class="sa">f</span><span class="s1">'example_reconstructions/gold_balls_full.h5'</span><span class="p">)</span>
<span class="c1"># This defines the region of recovered object to use for the analysis.</span>
<span class="n">pad</span> <span class="o">=</span> <span class="mi">260</span>
<span class="n">window</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">s_</span><span class="p">[</span><span class="n">pad</span><span class="p">:</span><span class="o">-</span><span class="n">pad</span><span class="p">,</span> <span class="n">pad</span><span class="p">:</span><span class="o">-</span><span class="n">pad</span><span class="p">]</span>
<span class="c1"># This brings all three reconstructions to a common basis, correcting for</span>
<span class="c1"># possible global phase offsets, position shifts, and phase ramps. It also</span>
<span class="c1"># calculates a Fourier ring correlation and spectral signal-to-noise ratio</span>
<span class="c1"># estimate from the two half reconstructions.</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">cdtools</span><span class="o">.</span><span class="n">tools</span><span class="o">.</span><span class="n">analysis</span><span class="o">.</span><span class="n">standardize_reconstruction_set</span><span class="p">(</span>
<span class="n">half_1</span><span class="p">,</span>
<span class="n">half_2</span><span class="p">,</span>
<span class="n">full</span><span class="p">,</span>
<span class="n">window</span><span class="o">=</span><span class="n">window</span><span class="p">,</span>
<span class="n">nbins</span><span class="o">=</span><span class="mi">40</span><span class="p">,</span> <span class="c1"># The number of bins to use for the FRC calculation</span>
<span class="p">)</span>
<span class="c1"># We plot the normalized object images</span>
<span class="n">p</span><span class="o">.</span><span class="n">plot_amplitude</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_half_1'</span><span class="p">][</span><span class="n">window</span><span class="p">],</span> <span class="n">basis</span><span class="o">=</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_basis'</span><span class="p">])</span>
<span class="n">p</span><span class="o">.</span><span class="n">plot_phase</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_half_1'</span><span class="p">][</span><span class="n">window</span><span class="p">],</span> <span class="n">basis</span><span class="o">=</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_basis'</span><span class="p">])</span>
<span class="n">p</span><span class="o">.</span><span class="n">plot_amplitude</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_half_2'</span><span class="p">][</span><span class="n">window</span><span class="p">],</span> <span class="n">basis</span><span class="o">=</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_basis'</span><span class="p">])</span>
<span class="n">p</span><span class="o">.</span><span class="n">plot_phase</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_half_2'</span><span class="p">][</span><span class="n">window</span><span class="p">],</span> <span class="n">basis</span><span class="o">=</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_basis'</span><span class="p">])</span>
<span class="n">p</span><span class="o">.</span><span class="n">plot_amplitude</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_full'</span><span class="p">][</span><span class="n">window</span><span class="p">],</span> <span class="n">basis</span><span class="o">=</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_basis'</span><span class="p">])</span>
<span class="n">p</span><span class="o">.</span><span class="n">plot_phase</span><span class="p">(</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_full'</span><span class="p">][</span><span class="n">window</span><span class="p">],</span> <span class="n">basis</span><span class="o">=</span><span class="n">results</span><span class="p">[</span><span class="s1">'obj_basis'</span><span class="p">])</span>
<span class="c1"># We plot the calculated Fourier ring correlation</span>
<span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="mf">1e-6</span><span class="o">*</span><span class="n">results</span><span class="p">[</span><span class="s1">'frc_freqs'</span><span class="p">],</span> <span class="n">results</span><span class="p">[</span><span class="s1">'frc'</span><span class="p">])</span>
<span class="n">plt</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="mf">1e-6</span><span class="o">*</span><span class="n">results</span><span class="p">[</span><span class="s1">'frc_freqs'</span><span class="p">],</span> <span class="n">results</span><span class="p">[</span><span class="s1">'frc_threshold'</span><span class="p">],</span> <span class="s1">'k--'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">'Frequency (cycles / um)'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">'Fourier Ring Correlation'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">legend</span><span class="p">([</span><span class="s1">'FRC'</span><span class="p">,</span> <span class="s1">'threshold'</span><span class="p">])</span>
<span class="c1"># We plot the calculated spectral signal-to-noise ratio</span>
<span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">()</span>
<span class="n">plt</span><span class="o">.</span><span class="n">semilogy</span><span class="p">(</span><span class="mf">1e-6</span><span class="o">*</span><span class="n">results</span><span class="p">[</span><span class="s1">'frc_freqs'</span><span class="p">],</span> <span class="n">results</span><span class="p">[</span><span class="s1">'ssnr'</span><span class="p">])</span>
<span class="n">plt</span><span class="o">.</span><span class="n">xlabel</span><span class="p">(</span><span class="s1">'Frequency (cycles / um)'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">ylabel</span><span class="p">(</span><span class="s1">'Spectral signal-to-noise ratio'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">grid</span><span class="p">(</span><span class="s1">'on'</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
</section>
<section id="transmission-rpi">
<h2>Transmission RPI<a class="headerlink" href="#transmission-rpi" title="Link to this heading"></a></h2>
<p>CDTools also contains a forward model for randomized probe imaging (RPI, doi:10.1364/OE.397421). This is currently not documented fully, but hopefully will be soon</p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="installation.html" class="btn btn-neutral float-left" title="Installation" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="tutorial.html" class="btn btn-neutral float-right" title="Tutorial" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>© Copyright 2019-2024, Abraham Levitan.</p>
</div>
Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
<a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>