def get_image_variance(self, dqe): """Calculates the variance in scattered intensity as a function of scattering vector. The calculated variance is normalised by the mean squared, as is appropriate for the distribution of intensities. This causes a problem if Poisson noise is significant in the data, resulting in a divergence of the Poisson noise term. To in turn remove this effect, we subtract a dqe/mean_dp term (although it is suggested that dqe=1) from the data, creating a "poisson noise-free" corrected variance pattern. DQE is fitted to make this pattern flat. Parameters ---------- dqe : float Detective quantum efficiency of the detector for Poisson noise correction. Returns ------- varims : ImageVariance A two dimensional Signal class object containing the mean DP, mean squared DP, and variance DP, and a Poisson noise-corrected variance DP. """ im = self.signal.T mean_im = im.mean((0, 1)) meansq_im = Signal2D(np.square(im.data)).mean((0, 1)) normvar = (meansq_im.data / np.square(mean_im.data)) - 1.0 var_im = Signal2D(normvar) corr_var_array = normvar - (np.divide(dqe, mean_im.data)) corr_var_array[np.invert(np.isfinite(corr_var_array))] = 0 corr_var = Signal2D(corr_var_array) varims = stack((mean_im, meansq_im, var_im, corr_var)) sig_x = varims.data.shape[1] sig_y = varims.data.shape[2] iv = ImageVariance(varims.data.reshape((2, 2, sig_x, sig_y))) iv = transfer_navigation_axes_to_signal_axes(iv, self.signal) return iv
def test_get_image_variance_signal(self, diffraction_pattern): imvar = ImageVariance(diffraction_pattern) assert isinstance(imvar, ImageVariance)