\(\renewcommand\AA{\unicode{x212B}}\)
Table of Contents
Convert wavelength to momentum transfer and calculate the Qz resolution for reflectometers at continuous beam sources.
Name | Direction | Type | Default | Description |
---|---|---|---|---|
InputWorkspace | Input | MatrixWorkspace | Mandatory | A reflectivity workspace with X units in wavelength. |
OutputWorkspace | Output | MatrixWorkspace | Mandatory | The input workspace with X units converted to Q and DX values set to the Q resolution. |
SummationType | Input | string | SumInLambda | The type of summation performed for the input workspace. Allowed values: [‘SumInLambda’, ‘SumInQ’] |
ReflectedForeground | Input | int list | Mandatory | A two element list [start, end] defining the reflected beam foreground region in workspace indices. |
PixelSize | Input | number | Mandatory | Detector pixel size, in meters. |
DetectorResolution | Input | number | Mandatory | Detector pixel resolution, in meters. |
ChopperSpeed | Input | number | Mandatory | Chopper speed, in rpm. |
ChopperOpening | Input | number | Mandatory | The opening angle between the two choppers, in degrees. |
ChopperRadius | Input | number | Mandatory | Chopper radius, in meters. |
ChopperPairDistance | Input | number | Mandatory | The gap between two choppers, in meters. |
FirstSlitName | Input | string | Mandatory | Name of the first slit component. |
FirstSlitSizeSampleLog | Input | string | Mandatory | The sample log entry for the first slit opening. |
SecondSlitName | Input | string | Mandatory | Name of the second slit component. |
SecondSlitSizeSampleLog | Input | string | Mandatory | The sample log entry for the second slit opening. |
TOFChannelWidth | Input | number | Mandatory | TOF bin width, in microseconds. |
This algorithm converts a reflectivity workspace from wavelength to momentum transfer \(Q_{z}\) and calculates the \(Q_{z}\) resolution. The resolution is added as the Dx (X Errors) field in the output workspace. This algorithms processes workspaces in which the pixels containing the reflectected line have been integrated into a single histogram. For conversion of a 2D workspace into \(Q_{x}, Q_{z}\) or equivalent momentum space, see ConvertToReflectometryQ.
The algorithm requires the presence of certain sample log entries for the \(Q_{z}\) resolution computation. These can be obtained by ReflectometryBeamStatistics. The log entries are: beam_stats.incident_angular_spread
, beam_stats.first_slit_angular_spread
, beam_stats.second_slit_angular_spread
and beam_stats.sample_waviness
. See the documentation of ReflectometryBeamStatistics for more detailed information on the sample logs.
The instrument of InputWorkspace is expected to contain two components representing the two slits in the beam before the sample. The names of these components are given to the algorithm as the FirstSlitName and SecondSlitName properties. The slit openings (width or height depending on reflectometer setup) should be written in the sample logs (units ‘m’ or ‘mm’). The log enties are named by FirstSlitSizeSampleLog and SecondSlitSizeSampleLog.
The SummationType property reflects the type of foreground summation used to obtain the reflectivity workspace.
The unit conversion from wavelength to \(Q_{z}\) is done by ConvertUnits.
The resolution calculation follows the procedure described in [1].
Note
To run these usage examples please first download the usage data, and add these to your path. In Mantid this is done using Manage User Directories.
Example - ReflectometryMomentumTransfer
# Load data.
reflectedWS = LoadILLReflectometry('ILL/D17/317370.nxs', XUnit='TimeOfFlight')
ConvertToDistribution(reflectedWS)
directWS = LoadILLReflectometry('ILL/D17/317369.nxs', XUnit='TimeOfFlight')
ConvertToDistribution(directWS)
# Extract some instrument parameters.
chopperPairDistance = 1e-2 * reflectedWS.run().getProperty('Distance.ChopperGap').value
chopperSpeed = reflectedWS.run().getProperty('VirtualChopper.chopper1_speed_average').value
chopper1Phase = reflectedWS.run().getProperty('VirtualChopper.chopper1_phase_average').value
chopper2Phase = reflectedWS.run().getProperty('VirtualChopper.chopper2_phase_average').value
openoffset = reflectedWS.run().getProperty('VirtualChopper.open_offset').value
# Normalize to time.
duration = reflectedWS.run().getProperty('duration').value
reflectedWS /= duration
duration = directWS.run().getProperty('duration').value
directWS /= duration
# Write statistics to sample logs.
ReflectometryBeamStatistics(
reflectedWS,
ReflectedForeground=[198, 204, 209],
DirectLineWorkspace=directWS,
DirectForeground=[190, 200, 210],
PixelSize=0.001195,
DetectorResolution=0.0022,
FirstSlitName='slit2',
FirstSlitSizeSampleLog='VirtualSlitAxis.s2w_actual_width',
SecondSlitName='slit3',
SecondSlitSizeSampleLog='VirtualSlitAxis.s3w_actual_width',
)
# Calculate reflectivity.
refForeground = SumSpectra(reflectedWS, 198, 209)
dirForeground = SumSpectra(directWS, 190, 210)
refForeground = RebinToWorkspace(WorkspaceToRebin=refForeground, WorkspaceToMatch=dirForeground)
R = refForeground / dirForeground
# Convert TOF to wavelength, crop.
R = ConvertUnits(R, 'Wavelength')
R = CropWorkspace(R, XMin=4.3, XMax=14.0, StoreInADS=False)
n = reflectedWS.getNumberHistograms()
reflectedWS = ConvertUnits(reflectedWS, 'Wavelength')
reflectedWS = CropWorkspaceRagged(reflectedWS, XMin=n*[4.3], XMax=n*[14.0], StoreInADS=False)
directWS = ConvertUnits(directWS, 'Wavelength')
directWS = CropWorkspaceRagged(directWS, XMin=n*[4.3], XMax=n*[14.0])
outws = ReflectometryMomentumTransfer(
R,
ReflectedForeground=[198, 209],
SummationType='SumInLambda',
PixelSize=0.001195,
DetectorResolution=0.0022,
ChopperRadius=0.36,
ChopperSpeed=chopperSpeed,
ChopperOpening=45. - (chopper2Phase - chopper1Phase) - openoffset,
ChopperPairDistance=chopperPairDistance,
FirstSlitName='slit2',
FirstSlitSizeSampleLog='VirtualSlitAxis.s2w_actual_width',
SecondSlitName='slit3',
SecondSlitSizeSampleLog='VirtualSlitAxis.s3w_actual_width',
TOFChannelWidth=57.
)
qs = outws.readX(0)
dqs = outws.readDx(0)
print('First refectivity point Qz = {:.4f} +- {:.4f} A-1'.format(qs[0], dqs[0]))
print('and last Qz = {:.4f} +- {:.4f} A-1'.format(qs[-1], dqs[-1]))
Output:
First refectivity point Qz = 0.0006 +- 0.0001 A-1
and last Qz = 0.0018 +- 0.0003 A-1
[1] | P. Gutfreund, T. Saerbeck, M. A. Gonzalez, E. Pellegrini, M. Laver, C. Dewhurst, R. Cubitt, arXiv:1710.04139 [physics.ins-det] |
Categories: AlgorithmIndex | ILL\Reflectometry | Reflectometry
C++ header: ReflectometryMomentumTransfer.h (last modified: 2021-03-31)
C++ source: ReflectometryMomentumTransfer.cpp (last modified: 2021-03-31)