\(\renewcommand\AA{\unicode{x212B}}\)
Table of Contents
Name | Direction | Type | Default | Description |
---|---|---|---|---|
InputWorkspace | Input | MatrixWorkspace | Mandatory | Name of the reference input workspace |
FirstGoodData | Input | number | Optional | First good data point in units of micro-seconds |
LastGoodData | Input | number | Optional | Last good data point in units of micro-seconds |
Frequency | Input | number | Optional | Starting hint for the frequency in MHz |
DetectorTable | Output | TableWorkspace | Mandatory | Name of the TableWorkspace in which to store the list of phases and asymmetries |
DataFitted | Output | WorkspaceGroup | Mandatory | Name of the output workspace holding fitting results |
ForwardSpectra | Input | int list | The spectra numbers of the forward group. If not specified will read from file. | |
BackwardSpectra | Input | int list | The spectra numbers of the backward group. If not specified will read from file. |
Calculates detector asymmetries and phases from a reference dataset. The algorithm fits each of the spectra in the input workspace to:
where \(\omega\) is shared across spectra and \(A_i\) and \(\phi_i\) are detector-dependent.
Before the spectra are fitted, \(\omega\) is determined by grouping the detectors, calculating the asymmetry and fitting this to get the frequency. This value of \(\omega\) is then treated as a fixed constant when fitting the spectra to the function above.
The algorithm outputs a table workspace containing the spectrum number, the asymmetry and the phase. This table is intended to be used as the input PhaseTable to PhaseQuad. Usually for muon instruments, each spectrum will correspond to one detector (spectrum number = detector ID).If a spectrum is empty (i.e. the detector is dead) then the phase and asymmetry are recorded as zero and \(999\) respectively.
In addition, the fitting results are returned in a workspace group, where each of the items stores the original data (after removing the exponential decay), the data simulated with the fitting function and the difference between data and fit as spectra 0, 1 and 2 respectively.
There are five optional input properties: FirstGoodData and LastGoodData define the fitting range. When left blank, FirstGoodData is set to the value stored in the input workspace and LastGoodData is set to the last available bin. The optional property Frequency allows the user to select an initial value for \(\omega\) (a starting value for the fit). If this property is not supplied, the algorithm takes this value from the sample_magn_field log multiplied by \(2\pi\cdot g_\mu\), where \(g_\mu\) is the muon gyromagnetic ratio (0.01355 MHz/G). Finally, the optional properties ForwardSpectra and BackwardSpectra are the sets of spectra in the forward and backward groups. If these are not supplied, the algorithm will find the instrument from the input workspace and use the default grouping for this instrument.
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 - CalMuonDetectorPhases
# Load four spectra from a muon nexus file
ws = Load(Filename='MUSR00022725.nxs', SpectrumMin=1, SpectrumMax=4)
# Calibrate the phases and amplitudes
detectorTable, fittingResults = CalMuonDetectorPhases(InputWorkspace='ws', LastGoodData=4, ForwardSpectra="1,2", BackwardSpectra="3,4")
# Print the result
for i in range(0,4):
print("Detector {} has phase {:.6f} and amplitude {:.6f}".format(detectorTable.cell(i,0), detectorTable.cell(i,2), detectorTable.cell(i,1)))
Output:
Detector 1 has phase 0.950498 and amplitude 0.133113
Detector 2 has phase 1.171793 and amplitude 0.134679
Detector 3 has phase 1.356717 and amplitude 0.149431
Detector 4 has phase 1.484481 and amplitude 0.152870
Example - CalMuonDetectorPhases with dead detector
import numpy as np
import random
def isItDead(phase,amplitude):
if phase == 0.0 and amplitude == 999.0:
return True
else:
return False
# create data
x=np.linspace(start=0,stop=20,num=4000)
xData = np.append(x,x)
xData = np.append(xData,xData)
#make y data
def genYData(x,phi):
return np.sin(5.0*x+phi)
yData = np.append(genYData(x, 0.0), genYData(x, 1.2))
yData = np.append(yData, np.zeros(len(x))) # dead detector
yData = np.append(yData, genYData(x, 3.4))
# create workspace
ws = CreateWorkspace(xData,yData,NSpec=4, UnitX="Time")
label=ws.getAxis(0).setUnit("Label")
label.setLabel("Time","microsecond")
detectorTable, fittingResults = CalMuonDetectorPhases(InputWorkspace='ws',FirstGoodData=0.1, LastGoodData=20,ForwardSpectra="1,2", BackwardSpectra="3,4",Frequency=5.0)
# Print the result
for i in range(0,4):
if isItDead(detectorTable.cell(i,2), detectorTable.cell(i,1)):
print("Detector {} is dead".format(detectorTable.cell(i,0)))
else:
print("Detector {} is working".format(detectorTable.cell(i,0)))
Output:
Detector 1 is working
Detector 2 is working
Detector 3 is dead
Detector 4 is working
Categories: AlgorithmIndex | Muon
C++ header: CalMuonDetectorPhases.h (last modified: 2021-03-31)
C++ source: CalMuonDetectorPhases.cpp (last modified: 2021-05-24)