diff --git a/diffsims/sims/diffraction_simulation.py b/diffsims/sims/diffraction_simulation.py index a7192d10..8d377401 100644 --- a/diffsims/sims/diffraction_simulation.py +++ b/diffsims/sims/diffraction_simulation.py @@ -18,6 +18,7 @@ import matplotlib.pyplot as plt import numpy as np +from scipy import ndimage as ndi class DiffractionSimulation: @@ -113,7 +114,41 @@ def intensities(self): @intensities.setter def intensities(self, intensities): self._intensities = intensities + + def get_diffraction_pattern(self,size=512,sigma=10): + """Returns the diffraction data as a numpy array with + two-dimensional Gaussians representing each diffracted peak. Should only + be used for qualitative work. + Parameters + ---------- + size : int + The size of a side length (in pixels) + + sigma : float + Standard deviation of the Gaussian function to be plotted (in pixels). + + Returns + ------- + diffraction-pattern : numpy.array + The simulated electron diffraction pattern, normalised. + + Notes + ----- + If don't know the exact calibration of your diffraction signal using 1e-2 + produces reasonably good patterns when the lattice parameters are on + the order of 0.5nm and a the default size and sigma are used. + """ + side_length = np.min(np.multiply((size/2),self.calibration)) + mask_for_sides = np.any((np.abs(self.coordinates[:, 0:2]) < side_length),axis=1) + + spot_coords = np.add(self.calibrated_coordinates[mask_for_sides],size/2).astype(int) + spot_intens = self.intensities[mask_for_sides] + pattern = np.zeros([size, size]) + pattern[spot_coords[:,0],spot_coords[:,1]] = spot_intens + pattern = ndi.gaussian_filter(pattern,sigma) + + return np.divide(pattern,np.max(pattern)) class ProfileSimulation: """Holds the result of a given kinematic simulation of a diffraction profile diff --git a/diffsims/tests/test_sims/test_diffraction_simulation.py b/diffsims/tests/test_sims/test_diffraction_simulation.py index 87a8eca6..66e3b072 100644 --- a/diffsims/tests/test_sims/test_diffraction_simulation.py +++ b/diffsims/tests/test_sims/test_diffraction_simulation.py @@ -136,3 +136,10 @@ def test_calibrated_coordinates( diffraction_simulation.calibration = calibration diffraction_simulation.offset = offset assert np.allclose(diffraction_simulation.calibrated_coordinates, expected) + + def test_assertion_free_get_diffraction_pattern(self): + short_sim = DiffractionSimulation(coordinates=np.asarray([[0.3, 1.2, 0]]), + intensities=np.ones(1), + calibration=[1, 2]) + + z = short_sim.get_diffraction_pattern()