Table of Contents
An algorithm to mask a detector, or set of detectors, as not to be used. The workspace spectra associated with those detectors are zeroed.
Name | Direction | Type | Default | Description |
---|---|---|---|---|
Workspace | InOut | Workspace | Mandatory | The name of the input and output workspace on which to perform the algorithm. |
SpectraList | Input | int list | An ArrayProperty containing a list of spectra to mask | |
DetectorList | Input | int list | An ArrayProperty containing a list of detector ID’s to mask | |
WorkspaceIndexList | Input | unsigned int list | An ArrayProperty containing the workspace indices to mask | |
MaskedWorkspace | Input | MatrixWorkspace | If given but not as a SpecialWorkspace2D, the masking from this workspace will be copied. If given as a SpecialWorkspace2D, the masking is read from its Y values. | |
ForceInstrumentMasking | Input | boolean | False | Works when ‘MaskedWorkspace’ is provided and forces to use spectra-detector mapping even in case when number of spectra in ‘Workspace’ and ‘MaskedWorkspace’ are equal |
StartWorkspaceIndex | Input | number | 0 | If other masks fields are provided, it’s the first index of the target workspace to be allowed to be masked from by these masks, if not, its the first index of the target workspace to mask. Default value is 0 if other masking is present or ignored if not. |
EndWorkspaceIndex | Input | number | Optional | If other masks are provided, it’s the last index of the target workspace allowed to be masked to by these masks, if not, its the last index of the target workspace to mask. Default is number of histograms in target workspace if other masks are present or ignored if not. |
To understand the algorithms options, user should clearly understand the difference between WorkspaceIndex – the numbers, specified in WorkspaceIndexList and StartWorkspacIndex, EndWorkspaceIndex properties, the Spectra Number or according to other terminology Spectra ID – values of the SpectraList property and Detector ID – the numbers to provide for DetectorList property.
The WorkspaceIndex is the number a spectrum has in a workspace, e.g.
sp = ws.getSpectrum(0)
always returns first spectra present in the workspace.
The Spectra Number or spectra ID mean the number, assigned to a spectrum. This number is often equal to WorkspaceIndex+1, e.g.
print sp.getSpectrumNo()
from the sample above will often print 1 but not always. The simplest case when this number is different is when you load a second half of a workspace, when the first spectrum number still is NumTotalSpectraInWorkspace/2+1, while WorkspaceIndex of this spectra becomes 0, i.e.:
sp = ws.getSpectrum(0)
print sp.getSpectrumNo()
prints number equal to NumTotalSpectraInWorkspace/2+1. There are other ways to assign a random number to a spectrum.
And finally, the detector ID is the number assigned to a detector in an instrument definition file. Sometimes, a first detector corresponds to the first spectra of a workspace, but it is not in any way certain. For example the code:
ws = CreateSimulationWorkspace('MARI','-0.5,0.5,0.5')
sp=ws.getSpectrum(1)
print sp.getSpectrumNo(), sp.getDetectorIDs()
Will print:
2 set(1102)
but any ISIS MARI workspace obtained from experiment will produce different sequence, e.g. something like:
5 set(4101)
The algorithm zeros the data in the spectra of the input workspace defined as masked and flags as masked (can be verified by IDetector::isMasked() method) the detectors, corresponding to the masked spectra.
The first, the Workspace property specifies the workspace to mask and other algorithms properties provide various ways to define the spectra and detectors to mask.
If Workspace is PeaksWorkspaces, only the detectors listed are masked and the mask must be specified by a DetectorList or MaskedWorkspace.
All but the Workspace property are optional and at least one of them must be set. If several are set, the combination of them is used.
The set of spectra and detectors to be masked can be given as a list of either spectrum numbers, detector IDs, workspace indices or workspace indexes range.
Workspace index range (properties StartWorkspacIndex and EndWorkspaceIndex) change its actions depending on other masking properties being provided, namely:
If MaskedWorkspace is provided, both MaskedWorkspace and Workspace mask have the same instrument.
The algorithm works differently depending on MaskedWorkspace property being a Mask Workspace (SpecialWorkspace2D object) or Matrix Workspace.
If source MaskedWorkspace is a Mask Workspace and the number of spectra in the source MaskedWorkspace is equal to number of spectra in the target Workspace, the spectra numbers of the MaskedWorkspace are used as source of masking information for the target workspace.
If the numbers of spectra in Workspace and MaskedWorkspace are different, the algorithm extracts list of masked detector IDS from source workspace and used them to mask the correspondent spectra of the target workspace.
Setting property ForceInstrumentMasking to true forces algorithm to always use MaskedWorkspace detectors ID as the source of the masking information. If the detector is masked, then the corresponding detector will be masked in the input Workspace.
If the input MaskedWorkspace is a Matrix Workspace the MaskedWorkspace can only have the same number of spectra as the target Workspace and the information about masked spectra of the MaskedWorkspace is copied to the target Workspace
MaskDetectors v1 supports various format of input to mask detectors, including
Here are the rules for input information for masking
There are 2 operations to mask a detector and thus spectrum related
import numpy as np
# Create a workspace containing some data.
ws = CreateSampleWorkspace()
# Mask two detectors by specifying numbers 1 and 3
MaskDetectors(ws,SpectraList=[1,3])
# Check that spectra with spectrum numbers 1 and 3 are masked
# Get the 1st spectrum in the workspace
spec = ws.getSpectrum(0)
detid = spec.getDetectorIDs()[0]
print 'Spectrum number is',spec.getSpectrumNo()
print 'Detector of this spectrum is masked:',ws.getInstrument().getDetector(detid).isMasked()
y = ws.readY(0)
print 'All counts in the spectrum are 0: ',np.all( y == 0.0 )
# Get the 2nd spectrum in the workspace
spec = ws.getSpectrum(1)
detid = spec.getDetectorIDs()[0]
print 'Spectrum number is',spec.getSpectrumNo()
print 'Detector of this spectrum is masked:',ws.getInstrument().getDetector(detid).isMasked()
y = ws.readY(1)
print 'All counts in the spectrum are 0: ',np.all( y == 0.0 )
# Get the 3rd spectrum in the workspace
spec = ws.getSpectrum(2)
detid = spec.getDetectorIDs()[0]
print 'Spectrum number is',spec.getSpectrumNo()
print 'Detector of this spectrum is masked:',ws.getInstrument().getDetector(detid).isMasked()
y = ws.readY(2)
print 'All counts in the spectrum are 0: ',np.all( y == 0.0 )
# Get the 4th spectrum in the workspace
spec = ws.getSpectrum(3)
detid = spec.getDetectorIDs()[0]
print 'Spectrum number is',spec.getSpectrumNo()
print 'Detector of this spectrum is masked:',ws.getInstrument().getDetector(detid).isMasked()
y = ws.readY(3)
print 'All counts in the spectrum are 0: ',np.all( y == 0.0 )
Spectrum number is 1
Detector of this spectrum is masked: True
All counts in the spectrum are 0: True
Spectrum number is 2
Detector of this spectrum is masked: False
All counts in the spectrum are 0: False
Spectrum number is 3
Detector of this spectrum is masked: True
All counts in the spectrum are 0: True
Spectrum number is 4
Detector of this spectrum is masked: False
All counts in the spectrum are 0: False
# Create a workspace containing some data.
ws = CreateSampleWorkspace()
# Mask two detectors by specifying detector IDs 101 and 103
MaskDetectors(ws,DetectorList=[101,103])
# Check that spectra with spectrum numbers 1 and 3 are masked
# Check the 1st detector
det = ws.getInstrument().getDetector(101)
print 'Detector ',det.getID(),' is masked:',det.isMasked()
# Check the 2nd detector
det = ws.getInstrument().getDetector(103)
print 'Detector ',det.getID(),' is masked:',det.isMasked()
# Check some other detectors
det = ws.getInstrument().getDetector(100)
print 'Detector ',det.getID(),' is masked:',det.isMasked()
det = ws.getInstrument().getDetector(102)
print 'Detector ',det.getID(),' is masked:',det.isMasked()
det = ws.getInstrument().getDetector(105)
print 'Detector ',det.getID(),' is masked:',det.isMasked()
# Create a workspace containing some data.
ws = CreateSampleWorkspace()
# Mask two detectors by specifying workspace indices 0 and 2
MaskDetectors(ws,WorkspaceIndexList=[0,2])
# Check that spectra with workspace indices 0 and 2 are masked
# Check the 1st spectrum
workspaceIndex = 0
det = ws.getDetector( workspaceIndex )
print 'Detector in spectrum with workspace index ',workspaceIndex,' is masked:',det.isMasked()
# Check the 2nd spectrum
workspaceIndex = 2
det = ws.getDetector( workspaceIndex )
print 'Detector in spectrum with workspace index ',workspaceIndex,' is masked:',det.isMasked()
# Check some other spectra
workspaceIndex = 1
det = ws.getDetector( workspaceIndex )
print 'Detector in spectrum with workspace index ',workspaceIndex,' is masked:',det.isMasked()
workspaceIndex = 3
det = ws.getDetector( workspaceIndex )
print 'Detector in spectrum with workspace index ',workspaceIndex,' is masked:',det.isMasked()
workspaceIndex = 4
det = ws.getDetector( workspaceIndex )
print 'Detector in spectrum with workspace index ',workspaceIndex,' is masked:',det.isMasked()
Detector in spectrum with workspace index 0 is masked: True
Detector in spectrum with workspace index 2 is masked: True
Detector in spectrum with workspace index 1 is masked: False
Detector in spectrum with workspace index 3 is masked: False
Detector in spectrum with workspace index 4 is masked: False
# Create a masking workspace
# Create a intermediate workspace to help create the masking workspace
tmp = CreateSampleWorkspace()
# Mask two detectors
MaskDetectors(tmp,WorkspaceIndexList=[1,3])
# Extract created mask into specialised masking workspace
masking_ws,dummy = ExtractMask( tmp )
print 'A masking workspace has',masking_ws.blocksize(),'spectrum'
print 'Unmasked spectrum, value=',masking_ws.readY(0)[0]
print 'Masked spectrum, value=',masking_ws.readY(1)[0]
print 'Unmasked spectrum, value=',masking_ws.readY(2)[0]
print 'Masked spectrum, value=',masking_ws.readY(3)[0]
print 'Unmasked spectrum, value=',masking_ws.readY(4)[0]
print
# Create a data workspace
ws = CreateSampleWorkspace()
# Mask it using the mask in masking_ws
MaskDetectors(ws, MaskedWorkspace=masking_ws)
# Check masking of first 5 detectors
det = ws.getDetector(0)
print 'Detector',det.getID(),'is masked:',det.isMasked()
det = ws.getDetector(1)
print 'Detector',det.getID(),'is masked:',det.isMasked()
det = ws.getDetector(2)
print 'Detector',det.getID(),'is masked:',det.isMasked()
det = ws.getDetector(3)
print 'Detector',det.getID(),'is masked:',det.isMasked()
det = ws.getDetector(4)
print 'Detector',det.getID(),'is masked:',det.isMasked()
A masking workspace has 1 spectrum
Unmasked spectrum, value= 0.0
Masked spectrum, value= 1.0
Unmasked spectrum, value= 0.0
Masked spectrum, value= 1.0
Unmasked spectrum, value= 0.0
Detector 100 is masked: False
Detector 101 is masked: True
Detector 102 is masked: False
Detector 103 is masked: True
Detector 104 is masked: False
# Create a data workspace
ws = CreateSampleWorkspace()
# Mask 3 detectors using the masking range
MaskDetectors(ws, StartWorkspaceIndex=2, EndWorkspaceIndex=4)
# Check masking of first 6 detectors
for ind in xrange(0,6):
det = ws.getDetector(ind)
print 'Detector',det.getID(),'is masked:',det.isMasked()
# Create a masking workspace
# Create a intermediate workspace to help create the masking workspace
tmp = CreateSampleWorkspace()
# Mask four detectors:
MaskDetectors(tmp,StartWorkspaceIndex=2, EndWorkspaceIndex=5)
# Extract created mask into specialised masking workspace
masking_ws,_ = ExtractMask( tmp )
for ind in xrange(0,7):
val = masking_ws.readY(ind)[0]
if val>0:
print 'Unmasked spectrum, value=',val
else:
print 'Masked spectrum, value=',val
print
# Create a data workspace
ws = CreateSampleWorkspace()
# Mask it using the mask in masking_ws constraining masking range:
MaskDetectors(ws, MaskedWorkspace=masking_ws,StartWorkspaceIndex=4, EndWorkspaceIndex=5)
# Check masking of first 7 detectors
for ind in xrange(0,7):
det = ws.getDetector(ind)
print 'Detector',det.getID(),'is masked:',det.isMasked()
Masked spectrum, value= 0.0
Masked spectrum, value= 0.0
Unmasked spectrum, value= 1.0
Unmasked spectrum, value= 1.0
Unmasked spectrum, value= 1.0
Unmasked spectrum, value= 1.0
Masked spectrum, value= 0.0
Detector 100 is masked: False
Detector 101 is masked: False
Detector 102 is masked: False
Detector 103 is masked: False
Detector 104 is masked: True
Detector 105 is masked: True
Detector 106 is masked: False
Categories: Algorithms | Transforms\Masking