Skip to content
Snippets Groups Projects
Unverified Commit b222f439 authored by Martyn Gigg's avatar Martyn Gigg Committed by GitHub
Browse files

Merge pull request #22389 from rosswhitfield/LoadWAND_MultipleFiles

Allow LoadWAND to load multiple file
parents cc7f7956 9790ccb1
No related branches found
No related tags found
No related merge requests found
from __future__ import absolute_import, division, print_function
from mantid.api import DataProcessorAlgorithm, AlgorithmFactory, FileProperty, FileAction, WorkspaceProperty
from mantid.kernel import Direction, UnitConversion, Elastic
from mantid.simpleapi import LoadEventNexus, Integration, mtd, SetGoniometer, DeleteWorkspace, AddSampleLog, MaskBTP
from mantid.api import DataProcessorAlgorithm, AlgorithmFactory, MultipleFileProperty, FileAction, WorkspaceProperty
from mantid.kernel import Direction, UnitConversion, Elastic, Property, IntArrayProperty
from mantid.simpleapi import (LoadEventNexus, Integration, mtd, SetGoniometer, DeleteWorkspace, AddSampleLog,
MaskBTP, RenameWorkspace, GroupWorkspaces)
from six.moves import range
......@@ -16,40 +17,68 @@ class LoadWAND(DataProcessorAlgorithm):
return 'Loads Event Nexus file, integrates events, sets wavelength, mask, and goniometer, and sets proton charge to monitor counts'
def PyInit(self):
self.declareProperty(FileProperty(name="Filename", defaultValue="", action=FileAction.Load, extensions=[".nxs.h5"]))
self.declareProperty(MultipleFileProperty(name="Filename", action=FileAction.OptionalLoad, extensions=[".nxs.h5"]), "Files to Load")
self.declareProperty('IPTS', Property.EMPTY_INT, "IPTS number to load from")
self.declareProperty(IntArrayProperty("RunNumbers", []), 'Run numbers to load')
self.declareProperty("Wavelength", 1.488, doc="Wavelength to set the workspace")
self.declareProperty("ApplyMask", True, "If True standard masking will be applied to the workspace")
self.declareProperty(WorkspaceProperty(name="OutputWorkspace", defaultValue="", direction=Direction.Output))
def validateInputs(self):
issues = dict()
if not self.getProperty("Filename").value:
if (self.getProperty("IPTS").value == Property.EMPTY_INT) or len(self.getProperty("RunNumbers").value) is 0:
issues["Filename"] = 'Must specify either Filename or IPTS AND RunNumbers'
return issues
def PyExec(self):
filename = self.getProperty("Filename").value
runs = self.getProperty("Filename").value
if not runs:
ipts = self.getProperty("IPTS").value
runs = ['/HFIR/HB2C/IPTS-{}/nexus/HB2C_{}.nxs.h5'.format(ipts, run) for run in self.getProperty("RunNumbers").value]
wavelength = self.getProperty("wavelength").value
outWS = self.getPropertyValue("OutputWorkspace")
group_names = []
LoadEventNexus(Filename=filename, OutputWorkspace=outWS, LoadMonitors=True, EnableLogging=False)
Integration(InputWorkspace=outWS, OutputWorkspace=outWS, EnableLogging=False)
for run in runs:
LoadEventNexus(Filename=run, OutputWorkspace='__tmp_load', LoadMonitors=True, EnableLogging=False)
Integration(InputWorkspace='__tmp_load', OutputWorkspace='__tmp_load', EnableLogging=False)
if self.getProperty("ApplyMask").value:
MaskBTP(outWS, Pixel='1,2,511,512', EnableLogging=False)
if mtd[outWS].getRunNumber() > 26600: # They changed pixel mapping and bank name order here
MaskBTP(outWS, Bank='1', Tube='479-480', EnableLogging=False)
MaskBTP(outWS, Bank='8', Tube='1-2', EnableLogging=False)
else:
MaskBTP(outWS, Bank='8', Tube='475-480', EnableLogging=False)
if self.getProperty("ApplyMask").value:
MaskBTP('__tmp_load', Pixel='1,2,511,512', EnableLogging=False)
if mtd['__tmp_load'].getRunNumber() > 26600: # They changed pixel mapping and bank name order here
MaskBTP('__tmp_load', Bank='1', Tube='479-480', EnableLogging=False)
MaskBTP('__tmp_load', Bank='8', Tube='1-2', EnableLogging=False)
else:
MaskBTP('__tmp_load', Bank='8', Tube='475-480', EnableLogging=False)
mtd[outWS].getAxis(0).setUnit("Wavelength")
w = [wavelength-0.001, wavelength+0.001]
for idx in range(mtd[outWS].getNumberHistograms()):
mtd[outWS].setX(idx, w)
mtd['__tmp_load'].getAxis(0).setUnit("Wavelength")
w = [wavelength-0.001, wavelength+0.001]
for idx in range(mtd['__tmp_load'].getNumberHistograms()):
mtd['__tmp_load'].setX(idx, w)
SetGoniometer(outWS, Axis0="HB2C:Mot:s1,0,1,0,1", EnableLogging=False)
AddSampleLog(outWS, LogName="gd_prtn_chrg", LogType='Number', NumberType='Double',
LogText=str(mtd[outWS+'_monitors'].getNumberEvents()), EnableLogging=False)
DeleteWorkspace(outWS+'_monitors', EnableLogging=False)
SetGoniometer('__tmp_load', Axis0="HB2C:Mot:s1,0,1,0,1", EnableLogging=False)
AddSampleLog('__tmp_load', LogName="gd_prtn_chrg", LogType='Number', NumberType='Double',
LogText=str(mtd['__tmp_load'+'_monitors'].getNumberEvents()), EnableLogging=False)
DeleteWorkspace('__tmp_load'+'_monitors', EnableLogging=False)
AddSampleLog('__tmp_load', LogName="Wavelength", LogType='Number', NumberType='Double',
LogText=str(wavelength), EnableLogging=False)
AddSampleLog('__tmp_load', LogName="Ei", LogType='Number', NumberType='Double',
LogText=str(UnitConversion.run('Wavelength', 'Energy', wavelength, 0, 0, 0, Elastic, 0)), EnableLogging=False)
if len(runs) == 1:
RenameWorkspace('__tmp_load', outWS, EnableLogging=False)
else:
outName = outWS+"_"+str(mtd['__tmp_load'].getRunNumber())
group_names.append(outName)
RenameWorkspace('__tmp_load', outName, EnableLogging=False)
AddSampleLog(outWS, LogName="Wavelength", LogType='Number', NumberType='Double', LogText=str(wavelength), EnableLogging=False)
AddSampleLog(outWS, LogName="Ei", LogType='Number', NumberType='Double',
LogText=str(UnitConversion.run('Wavelength', 'Energy', wavelength, 0, 0, 0, Elastic, 0)), EnableLogging=False)
if len(runs) > 1:
GroupWorkspaces(group_names, OutputWorkspace=outWS, EnableLogging=False)
self.setProperty('OutputWorkspace', outWS)
......
......@@ -20,11 +20,18 @@ last 6 columns for run numbers up to 26600 or the first and last 2
columns for larger run numbers.
After this algorithm loads the workspace it can be correctly converted
to Q sample or HKL using :ref:`algm-ConvertToMD`.
to Q sample or HKL using :ref:`algm-ConvertToMD`. If it's a powder
sample it can be reduced with :ref:`algm-WANDPowderReduction`.
If you need to do event filtering don't use this algorithm, simply use
:ref:`algm-LoadEventNexus` and convert to data manually.
You can specify multiple files in the filename property or set the
IPTS and RunNumbers, where RunNumbers can be a range or list of
numbers, see Usage example bellow. If multiple files are loaded they
will be named 'OutputWorkspace'+'_runnumber' and be grouped in
'OutputWorkspace'.
Usage
-----
......@@ -32,16 +39,51 @@ Usage
.. code-block:: python
ws = LoadWAND('HB2C_7000.nxs.h5')
print("ws has {0} spectrum and {1} point in units {2}".format(ws.getNumberHistograms(),
ws.blocksize(),
ws.getXDimension().name))
silicon = LoadWAND('/HFIR/HB2C/IPTS-7776/nexus/HB2C_26506.nxs.h5')
print("Workspace has {0} spectrum and {1} point in units {2}".format(silicon.getNumberHistograms(),
silicon.blocksize(),
silicon.getXDimension().name))
Output:
.. code-block:: none
Workspace has 1966080 spectrum and 1 point in units Wavelength
**Load using Multiple file**
.. code-block:: python
silicon = LoadWAND('/HFIR/HB2C/IPTS-7776/nexus/HB2C_26506.nxs.h5,/HFIR/HB2C/IPTS-7776/nexus/HB2C_26507.nxs.h5')
print("Workspace group {0} has {1} workspaces {2} and {3}".format(silicon.name(),
silicon.getNumberOfEntries(),
silicon.getNames()[0],
silicon.getNames()[1]))
Output:
.. code-block:: none
Workspace group silicon has 2 workspaces silicon_26506 and silicon_26507
**Load using IPTS and run numbers**
.. code-block:: python
# Comma-separated list
silicon = LoadWAND(IPTS=7776,RunNumbers='26506,26507')
# or range
silicon = LoadWAND(IPTS=7776,RunNumbers='26506-26507')
print("Workspace group {0} has {1} workspaces {2} and {3}".format(silicon.name(),
silicon.getNumberOfEntries(),
silicon.getNames()[0],
silicon.getNames()[1]))
Output:
.. code-block:: none
ws has 1966080 spectrum and 1 point in units Wavelength
Workspace group silicon has 2 workspaces silicon_26506 and silicon_26507
.. categories::
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment