|
11 | 11 | from phaser.plan import ConventionalEnginePlan, LSQMLSolverPlan, EPIESolverPlan |
12 | 12 | from phaser.execute import Observer |
13 | 13 | from phaser.engines.common.simulation import ( |
14 | | - stream_patterns, SimulationState, cutout_group, slice_forwards, slice_backwards |
| 14 | + stream_patterns, SimulationState, cutout_group, tilt_propagators, slice_forwards, slice_backwards |
15 | 15 | ) |
16 | 16 |
|
17 | 17 |
|
@@ -151,10 +151,11 @@ def run_slice(slice_i: int, prop: t.Optional[NDArray[numpy.complexfloating]], st |
151 | 151 | ) |
152 | 152 |
|
153 | 153 | if prop is not None: |
154 | | - psi = ifft2(fft2(psi * group_obj[:, slice_i, None]) * prop) |
| 154 | + psi = ifft2(fft2(psi * group_obj[:, slice_i, None]) * prop[:, None]) |
155 | 155 |
|
156 | 156 | return (probe_mag, psi) |
157 | 157 |
|
| 158 | + props = tilt_propagators(sim.ky, sim.kx, sim.state, props, sim.state.tilt[tuple(group)]) |
158 | 159 | (probe_mag, psi) = slice_forwards(props, (probe_mag, psi), run_slice) |
159 | 160 |
|
160 | 161 | # modeled and experimental intensity |
@@ -214,11 +215,12 @@ def sim_slice(slice_i: int, prop: t.Optional[NDArray[numpy.complexfloating]], st |
214 | 215 |
|
215 | 216 | if prop is not None: |
216 | 217 | psi = at(psi, slice_i + 1).set( |
217 | | - ifft2(fft2(psi[slice_i] * group_obj[:, slice_i, None]) * prop) |
| 218 | + ifft2(fft2(psi[slice_i] * group_obj[:, slice_i, None]) * prop[:, None]) |
218 | 219 | ) |
219 | 220 |
|
220 | 221 | return (group_probe_mag, psi) |
221 | 222 |
|
| 223 | + props = tilt_propagators(sim.ky, sim.kx, sim.state, props, sim.state.tilt[tuple(group)]) |
222 | 224 | (group_probe_mag, psi) = slice_forwards(props, (group_probe_mag, psi), sim_slice) |
223 | 225 |
|
224 | 226 | new_obj_mag += group_obj_mag |
@@ -253,7 +255,7 @@ def update_slice(slice_i: int, prop: t.Optional[NDArray[numpy.complexfloating]], |
253 | 255 | sim.state.object.data = at(sim.state.object.data, slice_i).add(obj_update) |
254 | 256 |
|
255 | 257 | if prop is not None: |
256 | | - chi = ifft2(fft2(delta_P) * prop.conj()) |
| 258 | + chi = ifft2(fft2(delta_P) * prop.conj()[:, None]) |
257 | 259 | elif update_probe: |
258 | 260 | delta_P_avg = ifft2(xp.sum(fft2(delta_P) * subpx_filters.conj(), axis=0)) |
259 | 261 | delta_P_avg /= (group_obj_mag + illum_reg_probe) |
@@ -392,10 +394,11 @@ def epie_dry_run( |
392 | 394 |
|
393 | 395 | def run_slice(slice_i: int, prop: t.Optional[NDArray[numpy.complexfloating]], psi): |
394 | 396 | if prop is not None: |
395 | | - psi = ifft2(fft2(psi * group_obj[:, slice_i, None]) * prop) |
| 397 | + psi = ifft2(fft2(psi * group_obj[:, slice_i, None]) * prop[:, None]) |
396 | 398 |
|
397 | 399 | return psi |
398 | 400 |
|
| 401 | + props = tilt_propagators(sim.ky, sim.kx, sim.state, props, sim.state.tilt[tuple(group)]) |
399 | 402 | psi = slice_forwards(props, psi, run_slice) |
400 | 403 |
|
401 | 404 | # modeled and experimental intensity |
@@ -431,11 +434,12 @@ def epie_run( |
431 | 434 | def sim_slice(slice_i: int, prop: t.Optional[NDArray[numpy.complexfloating]], psi): |
432 | 435 | if prop is not None: |
433 | 436 | psi = at(psi, slice_i + 1).set( |
434 | | - ifft2(fft2(psi[slice_i] * group_obj[:, slice_i, None]) * prop) |
| 437 | + ifft2(fft2(psi[slice_i] * group_obj[:, slice_i, None]) * prop[:, None]) |
435 | 438 | ) |
436 | 439 |
|
437 | 440 | return psi |
438 | 441 |
|
| 442 | + props = tilt_propagators(sim.ky, sim.kx, sim.state, props, sim.state.tilt[tuple(group)]) |
439 | 443 | psi = slice_forwards(props, psi, sim_slice) |
440 | 444 |
|
441 | 445 | model_wave = fft2(psi[-1] * group_obj[:, -1, None]) |
@@ -468,7 +472,7 @@ def update_slice(slice_i: int, prop: t.Optional[NDArray[numpy.complexfloating]], |
468 | 472 | ) |
469 | 473 |
|
470 | 474 | if prop is not None: |
471 | | - chi = ifft2(fft2(probe_update) * prop.conj()) |
| 475 | + chi = ifft2(fft2(probe_update) * prop.conj()[:, None]) |
472 | 476 | elif update_probe: |
473 | 477 | # average probe updates in group |
474 | 478 | probe_update = ifft2(xp.mean(fft2(probe_update) * subpx_filters.conj(), axis=0)) |
|
0 commit comments