\(\renewcommand\AA{\unicode{x212B}}\)
Table of Contents
Name | Direction | Type | Default | Description |
---|---|---|---|---|
InputWorkspace | Input | IMDHistoWorkspace | Mandatory | Input Workspace with HKL dimensions centered on zero. |
IntermediateWorkspace | Output | Workspace | The resulting workspace after reflection removal and filters applied. What is the input of the FFT. | |
OutputWorkspace | Output | Workspace | Mandatory | Output Workspace |
Method | Input | string | KAREN | Bragg peak removal method. Allowed values: [‘None’, ‘Punch and fill’, ‘KAREN’] |
WindowFunction | Input | string | Blackman | Apply a window function to the data. Allowed values: [‘None’, ‘Gaussian’, ‘Blackman’, ‘Tukey’, ‘Kaiser’] |
WindowParameter | Input | number | 0.5 | Parameter for window function, depends on window type, see algorithm docs |
Shape | Input | string | sphere | Shape to punch out reflections. Allowed values: [‘sphere’, ‘cube’] |
Size | Input | dbl list | 0.2 | Width of cube/diameter of sphere used to remove reflections, in (HKL) (one or three values) |
SpaceGroup | Input | string | Space group for reflection removal, either full name or number. If empty all HKL’s will be removed. | |
Convolution | Input | boolean | True | Apply convolution to fill in removed reflections |
ConvolutionWidth | Input | number | 2 | Width of gaussian convolution in pixels |
CropSphere | Input | boolean | False | Limit min/max q values. Can help with edge effects. |
SphereMin | Input | dbl list | Optional | HKL values below which will be removed (one or three values) |
SphereMax | Input | dbl list | Optional | HKL values above which will be removed (one or three values) |
FillValue | Input | number | Optional | Value to replace with outside sphere |
KARENWidth | Input | number | 7 | Size of filter window |
Calculates the 3D-ΔPDF [1] from a HKL MDHistoWorkspace. This algorithm can remove the Bragg peaks by either the punch-and-fill method [2] or the KAREN algorithm.
This algorithm is still in development and features may be added, removed or changed. The scale of the resulting 3D-ΔPDF is, as yet, not scaled correctly, so while the magnitude is not correct the sign should be.
The input workspace must be a MDHistoWorkspace with dimensions ‘[H,0,0]’, ‘[0,K,0]’ and ‘[0,0,L]’, The dimensions must be centered on zero.
Two method are available to remove the Bragg peaks.
The punch-and-fill method is described in [2]. Basically it will punch out a volume of reciprocal space of shape defined by the property Shape and Size. After punch-and-fill the removed Bragg peaks are filled back in by applying a Gaussian convolution.
The convolution option requires astropy to be installed as it uses astropy.convolution. The convolution can be very slow for large workspaces, it will attempt to use astropy.convolution.convolve_fft (which is fast but only works for small workspace) but will use astropy.convolution.convolve (which is slow) if the workspace is too large.
The KAREN (K-space Algorithmic REconstructioN) method [3], is a more advanced approach that applies a filter over the data removing any points that are outliers in a moving window, with width set by the property KARENWidth. Outliers are defined as values more than 3 sigma away from the median. Sigma is estimated using 1.4826*MAD (median absolute deviation). Outliers are replaced with a value of median+2.2*MAD of window.
A window function can be applied to the volume that will produce a smooth transition to zero and you approach the edge of the data.
Currently implemented functions are Blackman (numpy.blackman()
,
default), Gaussian (scipy.signal.windows.gaussian()
), Tukey
(scipy.signal.windows.tukey()
) and Kaiser (numpy.kaiser()
)
The WindowParameter allows you to define the Gaussian window sigma, the Tukey window alpha and the Kaiser window beta.
[1] | Weber, T and Simonov, A, The three-dimensional pair distribution function analysis of disordered single crystals: basic concepts. Zeitschrift für Kristallographie (2012), 227, 5, 238-247 doi: 10.1524/zkri.2012.1504 |
[2] | (1, 2) Kobas, M and Weber, T and Steurer, W, Structural disorder in the decagonal Al-Co-Ni. I. Patterson analysis of diffuse x-ray scattering data. Phys. Rev. B (2005), 71, 22, 224205 doi: 10.1103/PhysRevB.71.224205 |
[3] | Weng, J et al. K-space Algorithmic REconstructioN (KAREN): A robust statistical methodology to separate Bragg and diffuse scattering. J. Appl. Crystallogr. In-preparation. |
The example here is MDHistoWorkspace that corresponds to negative substitutional correlation in the [100] direction. If you just run it without any alterations to the workspace the 3D-ΔPDF will be dominated by the Bragg peaks and will just be a 3D-PDF instead.
DeltaPDF3D(InputWorkspace='DeltaPDF3D_MDH',OutputWorkspace='fft',
Method='None', WindowFunction='None')
print("The value at [1,0,0] is {:.4f}".format(mtd['fft'].signalAt(1866)))
print("The value at [0,1,0] is {:.4f}".format(mtd['fft'].signalAt(2226)))
The value at [1,0,0] is 4057.7079
The value at [0,1,0] is 5565.6700
The results 3D-ΔPDF workspace looks like
Starting workspace | Resulting 3D-PDF |
Removing Reflections
To get a Δ-PDF you need to remove the Bragg peaks. If we now remove the reflections you will see that negative value at [±1,0,0].
The IntermediateWorkspace shows the changes to the input workspace.
DeltaPDF3D(InputWorkspace='DeltaPDF3D_MDH',OutputWorkspace='fft2',IntermediateWorkspace='int2',
Method='Punch and fill',Size=0.3,Convolution=False, WindowFunction='None')
print("The value at [1,0,0] is {:.4f}".format(mtd['fft2'].signalAt(1866)))
print("The value at [0,1,0] is {:.4f}".format(mtd['fft2'].signalAt(2226)))
The value at [1,0,0] is -738.9594
The value at [0,1,0] is 769.0027
Intermediate workspace after reflections removed | Resulting 3D-ΔPDF |
Removing Reflections and crop to sphere
DeltaPDF3D(InputWorkspace='DeltaPDF3D_MDH',OutputWorkspace='fft3',IntermediateWorkspace='int3',
Method='Punch and fill',Size=0.3,CropSphere=True,SphereMax=3,Convolution=False, WindowFunction='None')
print("The value at [1,0,0] is {:.4f}".format(mtd['fft3'].signalAt(1866)))
print("The value at [0,1,0] is {:.4f}".format(mtd['fft3'].signalAt(2226)))
The value at [1,0,0] is -477.1737
The value at [0,1,0] is 501.0818
Intermediate workspace after reflections removed and crop to sphere | Resulting 3D-ΔPDF |
Removing Reflections and crop to sphere with fill value The fill value should be about the background level
DeltaPDF3D(InputWorkspace='DeltaPDF3D_MDH',OutputWorkspace='fft3',IntermediateWorkspace='int3',
Method='Punch and fill',Size=0.3,CropSphere=True,SphereMax=3,Convolution=False, WindowFunction='None')
print("The value at [1,0,0] is {:.4f}".format(mtd['fft3'].signalAt(1866)))
print("The value at [0,1,0] is {:.4f}".format(mtd['fft3'].signalAt(2226)))
The value at [1,0,0] is -477.1737
The value at [0,1,0] is 501.0818
Intermediate workspace after reflections removed and crop to sphere | Resulting 3D-ΔPDF |
Applying convolution
DeltaPDF3D(InputWorkspace='DeltaPDF3D_MDH',OutputWorkspace='fft4',IntermediateWorkspace='int4'
Method='Punch and fill',Size=0.3,CropSphere=True,SphereMax=3,Convolution=True, WindowFunction='None')
print("The value at [1,0,0] is {:.4f}".format(mtd['fft4'].signalAt(1866)))
print("The value at [0,1,0] is {:.4f}".format(mtd['fft4'].signalAt(2226)))
The value at [1,0,0] is -47.1984
The value at [0,1,0] is 44.3406
Intermediate workspace after convolution is applied | Resulting 3D-ΔPDF |
DeltaPDF3D(InputWorkspace='DeltaPDF3D_MDH',OutputWorkspace='fft',IntermediateWorkspace='int',KARENWidth=3)
print("The value at [1,0,0] is {:.4f}".format(mtd['fft'].signalAt(1866)))
print("The value at [0,1,0] is {:.4f}".format(mtd['fft'].signalAt(2226)))
The value at [1,0,0] is -18.4259
The value at [0,1,0] is 18.4204
Intermediate workspace after KAREN and window function applied | Resulting 3D-ΔPDF |
Categories: AlgorithmIndex | Diffraction\Utility
Python: DeltaPDF3D.py (last modified: 2020-04-24)