Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 35 additions & 0 deletions diffsims/sims/diffraction_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import matplotlib.pyplot as plt
import numpy as np
from scipy import ndimage as ndi


class DiffractionSimulation:
Expand Down Expand Up @@ -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
Expand Down
7 changes: 7 additions & 0 deletions diffsims/tests/test_sims/test_diffraction_simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()