From a6e17d8ba5fb392793a3b1b3e8c80fb753960232 Mon Sep 17 00:00:00 2001 From: Owen Arnold Date: Tue, 22 Oct 2013 09:32:26 +0100 Subject: [PATCH] refs #8171. Add methods for overwriting the UB. Overwrite the UB. Internal checks to verify that the correct information is being provided. Unit tests supplied. --- .../scripts/Horace/MantidHorace/Command.py | 15 +++++--- .../test/MantidHoraceCommandGenSQWTest.py | 36 +++++++++++++++++-- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/Code/Mantid/scripts/Horace/MantidHorace/Command.py b/Code/Mantid/scripts/Horace/MantidHorace/Command.py index 3ee905fbfe73..a295f99c9c16 100644 --- a/Code/Mantid/scripts/Horace/MantidHorace/Command.py +++ b/Code/Mantid/scripts/Horace/MantidHorace/Command.py @@ -5,7 +5,14 @@ def __possible_emodes(): return ['Elastic', 'Direct', 'Indirect'] -def __single_gen_sqw(input_workspace, emode): +def __single_gen_sqw(input_workspace, emode, alatt=[], angdeg=[], u=[], v=[]): + + ub_params = [alatt, angdeg, u, v] + if any(ub_params) and not all(ub_params): + raise ValueError("Either specify all of alatt, angledeg, u, v or none of them") + elif all(ub_params): + SetUB(Workspace=input_workspace, a=alatt[0], b=alatt[1], c=alatt[2], alpha=angdeg[0], beta=angdeg[1], gamma=angdeg[2], u=u, v=v) + input_unit = input_workspace.getAxis(0).getUnit() comparitor_unit = UnitFactory.create('DeltaE') if comparitor_unit.unitID() != input_unit.unitID(): @@ -15,7 +22,7 @@ def __single_gen_sqw(input_workspace, emode): out_ws = ConvertToMD(InputWorkspace=input_workspace, QDimensions='Q3D', QConversionScales='HKL',dEAnalysisMode=emode, MinValues=min, MaxValues=max) return out_ws -def gen_sqw(input_workspaces, emode='Elastic', alatt=None, angledeg=None, u=None, v=None, psi=None, omega=None, dpsi=None, gl=None, gs=None): +def gen_sqw(input_workspaces, emode='Elastic', alatt=[], angdeg=[], u=[], v=[], psi=None, omega=None, dpsi=None, gl=None, gs=None): if not emode in __possible_emodes(): raise ValueError("Unknown emode %s Allowed values are %s" % (emode, __possible_emodes())) @@ -23,10 +30,10 @@ def gen_sqw(input_workspaces, emode='Elastic', alatt=None, angledeg=None, u=None converted = list() if isinstance(input_workspaces, list): for ws in input_workspaces: - outws = __single_gen_sqw(input_workspace=ws, emode=emode) + outws = __single_gen_sqw(input_workspace=ws, emode=emode, alatt=alatt, angdeg=angdeg, u=u, v=v) list.append(outws) else: - outws = __single_gen_sqw(input_workspace=input_workspaces, emode=emode) + outws = __single_gen_sqw(input_workspace=input_workspaces, emode=emode, alatt=alatt, angdeg=angdeg, u=u, v=v) return outws diff --git a/Code/Mantid/scripts/test/MantidHoraceCommandGenSQWTest.py b/Code/Mantid/scripts/test/MantidHoraceCommandGenSQWTest.py index 1affae167a8c..7b90b1b9f5a1 100644 --- a/Code/Mantid/scripts/test/MantidHoraceCommandGenSQWTest.py +++ b/Code/Mantid/scripts/test/MantidHoraceCommandGenSQWTest.py @@ -1,6 +1,7 @@ import unittest from mantid.simpleapi import * from mantid.api import IMDEventWorkspace +from mantid.kernel import V3D class MantidHoraceCommandGenSQWTest(unittest.TestCase): @@ -37,7 +38,6 @@ def test_single_workspace(self): from MantidHorace.Command import gen_sqw source_ws = Load(Filename='CNCS_7860_event') - source_ws = ConvertUnits(InputWorkspace=source_ws, Target='DeltaE', EMode='Direct', EFixed=3) SetUB(Workspace=source_ws,a=1.4165,b=1.4165,c=1.4165,u=[1,0,0],v=[0,1,0]) AddSampleLog(Workspace=source_ws,LogName='Psi',LogText='0',LogType='Number Series') @@ -45,12 +45,44 @@ def test_single_workspace(self): out_ws = gen_sqw(input_workspaces=source_ws, emode='Direct') - print out_ws.getNEvents(), source_ws.getNEvents() self.assertTrue(isinstance(out_ws, IMDEventWorkspace), "OutputWorkspace should be an MDEventWorkspace") self.assertEqual(4, out_ws.getNumDims()) + lattice = out_ws.getExperimentInfo(0).sample().getOrientedLattice() + self.assertAlmostEqual(1.4165, lattice.a()) + self.assertAlmostEqual(90, lattice.alpha()) + + DeleteWorkspace(out_ws) + DeleteWorkspace(source_ws) + + def test_overwrite_ub(self): + from MantidHorace.Command import gen_sqw + + source_ws = Load(Filename='CNCS_7860_event') + source_ws = ConvertUnits(InputWorkspace=source_ws, Target='DeltaE', EMode='Direct', EFixed=3) + SetUB(Workspace=source_ws,a=1.4165,b=1.4165,c=1.4165,u=[1,0,0],v=[0,1,0]) + AddSampleLog(Workspace=source_ws,LogName='Psi',LogText='0',LogType='Number Series') + SetGoniometer(Workspace=source_ws, Axis0='Psi,0,1,0,1') + out_ws = gen_sqw(input_workspaces=source_ws, emode='Direct', alatt=[9.218, 9.218, 9.197], angdeg=[90, 90, 120], u=[1,0,0], v=[0,1,0]) + + self.assertTrue(isinstance(out_ws, IMDEventWorkspace), "OutputWorkspace should be an MDEventWorkspace") + self.assertEqual(4, out_ws.getNumDims()) + lattice = out_ws.getExperimentInfo(0).sample().getOrientedLattice() + self.assertAlmostEqual(9.218, lattice.a()) + self.assertAlmostEqual(120, lattice.gamma()) + DeleteWorkspace(out_ws) DeleteWorkspace(source_ws) + + def test_partial_ub_throws(self): + from MantidHorace.Command import gen_sqw + in_ws = CreateWorkspace(DataX=[1,2], DataY=[1],DataE=[1],UnitX='DeltaE') + try: + gen_sqw(input_workspaces=in_ws, emode='Direct', alatt=[1,1,1], angdeg=[90, 90, 90], u=[1,0,0]) # Note that no v parameter is given, so ub info is incomplete. + except ValueError: + pass + finally: + DeleteWorkspace(in_ws)