\(\renewcommand\AA{\unicode{x212B}}\)

FindMultipleUMatrices v1

Summary

Finds multiple UB matrices using lattice parameters - can be used to find UBs in the presence of mutiple domains, crystallites or in the presence of spurious peaks.

See Also

FindUBUsingLatticeParameters, CalculateUMatrix

Properties

Name

Direction

Type

Default

Description

PeaksWorkspace

Input

IPeaksWorkspace

Mandatory

A PeaksWorkspace containing the peaks to integrate.

OutputWorkspace

Output

WorkspaceGroup

Mandatory

The output peak workspaces with UBs set - 1 per UB requested.

NumberOfUBs

Input

number

1

Number of UB matrices to find.

a

Input

number

1

Lattice parameter a

b

Input

number

1

Lattice parameter b

c

Input

number

1

Lattice parameter c

alpha

Input

number

90

Lattice angle alpha (in degrees)

beta

Input

number

90

Lattice angle beta (in degrees)

gamma

Input

number

90

Lattice angle gamma (in degrees)

HKLTolerance

Input

number

0.15

Tolerance to index peaks in in H,K and L - see IndexPeaks for details.

DSpacingTolerance

Input

number

0.05

Tolerance in d-spacing used to try and index peaks

AngleTolerance

Input

number

1

Tolerance (in degrees) of angle between peaks in QLab when identifying possible pairs of HKL.

MinAngleBetweenPeaks

Input

number

2

Minimum angle in QLab (in degrees) between pairs of peaks in when calculating U matrix.

MinAngleBetweenUB

Input

number

2

Minimum angle in degrees between u and v vectors (converted from HKL to QLab) of different UB.

MinDSpacing

Input

number

0

Min d-spacing of reflections to consider.

MaxDSpacing

Input

number

0

Max d-spacing of reflections to consider.

Spacegroup

Input

string

Spacegroup Hermann–Mauguin symbol used to determine the point group of the Laue class.

MaxOrder

Input

number

0

Maximum order to apply ModVectors. Default = 0

ModVector1

Input

string

0.0,0.0,0.0

Offsets for h, k, l directions

ModVector2

Input

string

0.0,0.0,0.0

Offsets for h, k, l directions

ModVector3

Input

string

0.0,0.0,0.0

Offsets for h, k, l directions

OptimiseFoundUBs

Input

boolean

True

Optimise final UBs using all peaks indexed best by that UB.

Description

FindMultipleUMatrices will use the lattice parameters and spacegroup provided to optimise a number (NumberOfUBs) of UB matrices (B is hard-coded due to the lattice parameters provided) and returns a group of peak workspaces one for each UB, containing the peaks that are indexed most accurately by that UB.

This algorithm is useful for finding a single UB in the presence of spurious peaks, or finding multiple UBs when there are multiple domains.

The algorithm proceeds by looping over each pair of peaks in PeaksWorkspace within the d-spacing limits (MinDSpacing and MaxDSpacing), trying to index them based on their d-spacing and angle between the peaks (within tolerances given by DSpacingTolerance and AngleTolerance). It then calculates the HKL errors (difference in HKL residuals squared) for all peaks in PeaksWorkspace and identifies the UBs that index the most peaks with the highest accuracy (i.e. better than any other UB found)

Note that although the user can provide modulation vectors, these are not currently used to index pairs of peaks but are indexed by each candidate UB found and used to determine the best UBs to return.

Peaks with relatively higher d-spacing are easier to index correctly, try using a smaller number of higher d-spacing peaks to start.

Useage

Example:

from mantid.simpleapi import *
from scipy.spatial.transform import Rotation as rot

ws = LoadEmptyInstrument(InstrumentName='SXD', OutputWorkspace='empty_SXD')
axis = ws.getAxis(0)
axis.setUnit("TOF")

# create a peak tables of orthorhombic domains with lattice parameters a=4, b=5, c=10
alatt = {'a': 4, 'b': 5, 'c': 10, 'alpha': 90, 'beta': 90, 'gamma': 90}
ubs = [np.diag([1/alatt['a'], 1/alatt['b'], 1/alatt['c']])]
ubs.append(rot.from_rotvec([0,0,90], degrees=True).as_matrix()  @ ubs[0])

peaks = CreatePeaksWorkspace(InstrumentWorkspace=ws, NumberOfPeaks=0, OutputWorkspace=f"peaks")
for iub, ub in enumerate(ubs):
    SetUB(peaks, UB=ub)
    for h in range(1, 3):
        for k in range(1, 3):
            for l in range(2,4):
                pk = peaks.createPeakHKL([h, k ,l])
                if pk.getDetectorID() > 0:
                    peaks.addPeak(pk)

peaks_out = FindMultipleUMatrices(PeaksWorkspace=peaks, OutputWorkspace='peaks_out', **alatt,
                                  MinDSpacing=1.25, MaxDSpacing=3.5, Spacegroup='P m m m',
                                  NumberOfUBs=2)

for ipk, pks in enumerate(peaks_out):
    print("HKL along x-axis of QLab = ", abs(np.round(pks.sample().getOrientedLattice().getvVector())))

Output:

HKL along x-axis of QLab =  [4. 0. 0.]
HKL along x-axis of QLab =  [0. 5. 0.]

Categories: AlgorithmIndex | Diffraction\Reduction | Crystal\UBMatrix

Source

Python: FindMultipleUMatrices.py