def get_distortion_residuals(self, mask_radius, spread): """Obtain residuals for experimental data and distortion corrected data with respect to a simulated symmetric ring pattern. Parameters ---------- mask_radius : int Radius, in pixels, for a mask over the direct beam disc. spread : float Gaussian spread of each ring in the simulated pattern. Returns ------- diff_init : ElectronDiffraction2D Difference between experimental data and simulated symmetric ring pattern. diff_end : ElectronDiffraction2D Difference between distortion corrected data and simulated symmetric ring pattern. """ # Check all required parameters are defined as attributes if self.calibration_data.au_x_grating_dp is None: raise ValueError( "This method requires an Au X-grating diffraction " "pattern to be provided. Please update the " "CalibrationDataLibrary." ) if self.affine_matrix is None: raise ValueError( "This method requires a distortion matrix to have " "been determined. Use get_elliptical_distortion " "to determine this matrix." ) # Set name for experimental data pattern dpeg = self.calibration_data.au_x_grating_dp ringP = self.ring_params size = dpeg.data.shape[0] dpref = generate_ring_pattern( image_size=size, mask=True, mask_radius=mask_radius, scale=ringP[0], amplitude=ringP[1], spread=spread, direct_beam_amplitude=ringP[3], asymmetry=1, rotation=ringP[5], ) # Apply distortion corrections to experimental data dpegs = stack_method([dpeg, dpeg, dpeg, dpeg]) dpegs = ElectronDiffraction2D(dpegs.data.reshape((2, 2, size, size))) dpegs.apply_affine_transformation( self.affine_matrix, preserve_range=True, inplace=True ) # Calculate residuals to be returned diff_init = ElectronDiffraction2D(dpeg.data - dpref.data) diff_end = ElectronDiffraction2D(dpegs.inav[0, 0].data - dpref.data) residuals = stack_method([diff_init, diff_end]) return ElectronDiffraction2D(residuals)
def ring_pattern(input_parameters): x0 = input_parameters ring_data = generate_ring_pattern(image_size=256, mask=True, mask_radius=10, scale=x0[0], amplitude=x0[1], spread=x0[2], direct_beam_amplitude=x0[3], asymmetry=x0[4], rotation=x0[5]) return ElectronDiffraction2D(ring_data)
def test_generate_ring_pattern(input_parameters, known_values, reference_indices): x0 = input_parameters rings = generate_ring_pattern(image_size=256, mask=True, mask_radius=10, scale=x0[0], amplitude=x0[1], spread=x0[2], direct_beam_amplitude=x0[3], asymmetry=x0[4], rotation=x0[5]) assert np.allclose(known_values, rings[reference_indices[:, 0], reference_indices[:, 1]])