Initialization Recommendations

Ptychodus provides a series of routines for generating the initial guesses and is recommended for general usage. If you prefer generating the initial guesses manually, you can refer to the following guidelines.

Object

The lateral size of the object should be the maximum extent of the probe positions in x and y, plus the size of the probe, and plus a small margin to accommodate for any probe position changes if position correction is enabled. You can get the suggested lateral size using ptychi.utils.get_suggested_object_size:

h, w = get_suggested_object_size(probe_positions, probe_size, extra=50)

Initialize the object to be a complex array of 1s perturbed by a small amount of Gaussian noise. For example:

object = torch.ones([1, h, w], dtype=torch.complex64)
object += torch.rand_like(object) * 1e-2

Note that the object should be a 3D tensor with the first dimension being the number of slices.

Multislice object

An object tensor with the length of the first dimension larger than 1 is automatically interpreted as a multislice object. If the multislice object reconstructed is started from scratch, you can use the similar random initialization as above. If you are initializing the multislice object from a previous single-slice reconstruction, we recommend using the n-slice-rooted magnitude for the initial guess’s magnitude and its unwrapped phase divided by the number of slices for the initial guess’s phase:

from ptychi.image_proc import unwrap_phase_2d

# o1 is the single-slice object
object = torch.abs(o1) ** (1 / n_slices) * torch.exp(1j * unwrap_phase_2d(o1) / n_slices)

Check the result of phase unwrapping before starting. You can try different settings of image_grad_method and image_integration_method in unwrap_phase_2d until the result is satisfactory.

Probe

The probe should be initialized to be a complex array of [n_opr_modes, n_incoherent_modes, h, w].

Incoherent probe modes

If you only have a single incoherent mode and want to extend it to multiple modes, you can use Hermite polynomials to generate the additional modes. See ptychi.utils.orthogonalize_initial_probe().

OPR modes

OPR modes can be initialized as random numbers normalized in such a way that the power of each mode is the number of pixels in a mode (since “backward” normalization is used for FFT by default). See ptychi.utils.add_additional_opr_probe_modes_to_probe().

Probe scaling

For far-field ptychography, the probe should be scaled so that the power of the FFT of the probe matches the maximum power of the diffraction patterns. Function ptychi.utils.get_probe_renormalization_factor() can be used to get the scaling factor.

OPR mode weights

The OPR mode weights should be initialized to be 1 for the main OPR mode and small random numbers for the other modes. Usually, the secondary modes’ weights are initialized to Gaussian random numbers centered at 0 with a standard deviation of 1e-6. You can use ptychi.utils.generate_initial_opr_mode_weights() to generate the initial OPR mode weights.