/Testing/SystemTests/tests/framework/ISISDirectReductionComponents.py

https://github.com/mantidproject/mantid · Python · 320 lines · 202 code · 62 blank · 56 comment · 10 complexity · e0bae17d65ce3391b293360df3c324bc MD5 · raw file

  1. # Mantid Repository : https://github.com/mantidproject/mantid
  2. #
  3. # Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
  4. # NScD Oak Ridge National Laboratory, European Spallation Source,
  5. # Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
  6. # SPDX - License - Identifier: GPL - 3.0 +
  7. #pylint: disable=invalid-name
  8. import os
  9. import sys
  10. import systemtesting
  11. from mantid.simpleapi import *
  12. from mantid.api import Workspace,IEventWorkspace
  13. from Direct.PropertyManager import PropertyManager
  14. import ISIS_MariReduction as mr
  15. try:
  16. from importlib import reload
  17. except ImportError:
  18. pass
  19. #----------------------------------------------------------------------
  20. class ISIS_ReductionWebLike(systemtesting.MantidSystemTest):
  21. def __init__(self):
  22. systemtesting.MantidSystemTest.__init__(self)
  23. # prepare reduction variable
  24. self.rd = mr.ReduceMARIFromFile()
  25. self.rd.def_main_properties()
  26. self.rd.def_advanced_properties()
  27. save_folder = config['defaultsave.directory']
  28. self.rd.save_web_variables(os.path.join(save_folder,'reduce_vars.py'))
  29. def runTest(self):
  30. # run reduction using saved variables like web variables
  31. web_var_folder = config['defaultsave.directory']
  32. sys.path.insert(0,web_var_folder)
  33. reload(mr)
  34. # change these variables to save result as nxs workspace
  35. mr.web_var.advanced_vars['save_format']='nxs'
  36. # web services currently needs input file to be defined
  37. input_file = 'MAR11001.RAW'
  38. mr.main(input_file,web_var_folder)
  39. # verify if result was indeed written
  40. self.rd.reducer.sample_run = input_file
  41. saveFileName = self.rd.reducer.save_file_name
  42. oputputFile = os.path.join(web_var_folder,saveFileName+'.nxs')
  43. self.assertTrue(os.path.exists(oputputFile))
  44. web_var_file = os.path.join(web_var_folder,'reduce_vars')
  45. if os.path.exists(web_var_file+'.py'):
  46. os.remove(web_var_file+'.py')
  47. if os.path.exists(web_var_file+'.pyc'):
  48. os.remove(web_var_file+'.pyc')
  49. def get_result_workspace(self):
  50. """Returns the result workspace to be checked"""
  51. if 'outWS' in mtd:
  52. return 'outWS'
  53. saveFileName = self.rd.reducer.save_file_name
  54. Load(Filename=saveFileName+'.nxs', OutputWorkspace="outWS")
  55. #outWS *= 0.997979227566217
  56. fullRezPath =FileFinder.getFullPath(saveFileName+'.nxs')
  57. os.remove(fullRezPath)
  58. return 'outWS'
  59. def get_reference_file(self):
  60. return "MARIReduction.nxs"
  61. def validate(self):
  62. """Returns the name of the workspace & file to compare"""
  63. # tolerance defined outside of init
  64. #pylint: disable=W0201
  65. self.tolerance = 1e-6
  66. # tolerance_is_rel_err defined outside of init
  67. #pylint: disable=W0201
  68. self.tolerance_is_rel_err = True
  69. self.disableChecking.append('SpectraMap')
  70. self.disableChecking.append('Instrument')
  71. self.disableChecking.append('Sample')
  72. result = self.get_result_workspace()
  73. reference = self.get_reference_file()
  74. return result, reference
  75. class ISIS_ReductionWrapperValidate(systemtesting.MantidSystemTest):
  76. def __init__(self):
  77. systemtesting.MantidSystemTest.__init__(self)
  78. self.result = False
  79. def runTest(self):
  80. # prepare reduction variable
  81. # At the moment MARI reduction differs from it original by
  82. # less then 1% due to changes in the procedure. At the moment
  83. # we have to account for this but when we make it the same,
  84. # the code below should be commented. Meanwhile it tests workspace
  85. # workflow
  86. #------------------------------------------------------
  87. #ref_file = 'MARIReduction.nxs'
  88. #file = FileFinder.getFullPath(ref_file)
  89. #etalon_ws = Load(file)
  90. #etalon_ws/=0.997979227566217
  91. #------------------------------------------------------
  92. rd = mr.ReduceMARIFromFile()
  93. rd.def_main_properties()
  94. rd.def_advanced_properties()
  95. # this is correct workflow for the ref file
  96. #rd.reducer.prop_man.save_file_name = ref_file
  97. # temporary workflow, until we fix workspace adjustment
  98. # disable pylint -- access to protected member
  99. #pylint: disable=W0212
  100. rd._tolerr =1.e-6
  101. rd.reducer.prop_man.save_file_name = 'MARIReduction.nxs'
  102. rd.validate_run_number=11001
  103. try:
  104. rez,mess = rd.run_reduction()
  105. self.result=rez
  106. if not rez:
  107. print("*** Validation failed: {0}".format(mess))
  108. if mess.find('Created')>-1: # validation still failed due to missing validation file
  109. print("*** Validation failed: {0}".format(mess))
  110. self.result=False
  111. except RuntimeError as err:
  112. print("*** Validation failed with error: {0}".format(err.message))
  113. self.result=False
  114. rd.reducer.prop_man.save_file_name = None
  115. def validate(self):
  116. """Returns the name of the workspace & file to compare"""
  117. return self.result
  118. #----------------------------------------------------------------------
  119. class ISISLoadFilesRAW(systemtesting.MantidSystemTest):
  120. def __init__(self):
  121. systemtesting.MantidSystemTest.__init__(self)
  122. self.valid = False
  123. def runTest(self):
  124. propman = PropertyManager('MAR')
  125. propman.sample_run = 11001
  126. propman.load_monitors_with_workspace = True
  127. mon_ws = PropertyManager.sample_run.get_monitors_ws()
  128. ws = PropertyManager.sample_run.get_workspace()
  129. self.assertTrue(isinstance(ws,Workspace))
  130. self.assertEqual(ws.getNumberHistograms(),922)
  131. DeleteWorkspace(ws)
  132. propman.load_monitors_with_workspace = False
  133. propman.sample_run = 11001
  134. ws = PropertyManager.sample_run.get_workspace()
  135. mon_ws = PropertyManager.sample_run.get_monitors_ws()
  136. self.assertEqual(ws.getNumberHistograms(),919)
  137. self.assertEqual(mon_ws.getNumberHistograms(),3)
  138. #
  139. propman = PropertyManager('MAPS')
  140. propman.sample_run = 17186
  141. propman.load_monitors_with_workspace = False
  142. mon_ws = PropertyManager.sample_run.get_monitors_ws()
  143. ws = PropertyManager.sample_run.get_workspace()
  144. self.assertTrue(isinstance(ws,Workspace))
  145. self.assertEqual(ws.getNumberHistograms(),41472)
  146. self.assertEqual(mon_ws.getNumberHistograms(),4)
  147. #
  148. self.valid = True
  149. def validate(self):
  150. return self.valid
  151. class ISISLoadFilesMER(systemtesting.MantidSystemTest):
  152. def __init__(self):
  153. systemtesting.MantidSystemTest.__init__(self)
  154. self.valid = False
  155. def runTest(self):
  156. #
  157. propman = PropertyManager('MER')
  158. propman.sample_run = 6398 # (raw file)
  159. propman.det_cal_file = 6399
  160. propman.load_monitors_with_workspace = False
  161. propman.mon1_norm_spec = 69633
  162. propman.ei_mon1_spec = [ 69634,69635,69636,69637]
  163. propman.ei_mon2_spec = [ 69638,69639,69640,69641]
  164. mon_ws = PropertyManager.sample_run.get_monitors_ws()
  165. self.assertNotEqual(mon_ws, None)
  166. ws = PropertyManager.sample_run.get_workspace()
  167. self.assertTrue(isinstance(ws,Workspace))
  168. self.assertEqual(ws.getNumberHistograms(),69632)
  169. self.assertEqual(mon_ws.getNumberHistograms(),9)
  170. propman.sample_run = None # (clean things up)
  171. propman.load_monitors_with_workspace = True
  172. propman.sample_run = 6398
  173. mon_ws = PropertyManager.sample_run.get_monitors_ws()
  174. self.assertNotEqual(mon_ws, None)
  175. ws = PropertyManager.sample_run.get_workspace()
  176. self.assertTrue(isinstance(ws,Workspace))
  177. self.assertEqual(ws.getNumberHistograms(),69641)
  178. self.assertEqual(mon_ws.getNumberHistograms(),69641)
  179. propman.sample_run = 18492 # (histogram nxs file )
  180. propman.det_cal_file = None
  181. mon_ws = PropertyManager.sample_run.get_monitors_ws()
  182. self.assertTrue('SR_MER018492' in mtd)
  183. self.assertNotEqual(mon_ws, None)
  184. ws = PropertyManager.sample_run.get_workspace()
  185. self.assertTrue(isinstance(ws,Workspace))
  186. self.assertEqual(ws.getNumberHistograms(),69641)
  187. self.assertEqual(mon_ws.getNumberHistograms(),69641)
  188. self.assertEqual(mon_ws.getIndexFromSpectrumNumber(69638),69637)
  189. det = mon_ws.getDetector(69632)
  190. self.assertTrue(det.isMonitor())
  191. det = mon_ws.getDetector(69631)
  192. self.assertFalse(det.isMonitor())
  193. # enable when bug #10980 is fixed
  194. propman.sample_run = None # delete all
  195. self.assertFalse('SR_MER018492' in mtd)
  196. propman.sample_run = 18492 # (histogram nxs file )
  197. propman.load_monitors_with_workspace = False
  198. propman.det_cal_file = None
  199. mon_ws = PropertyManager.sample_run.get_monitors_ws()
  200. self.assertNotEqual(mon_ws, None)
  201. self.assertTrue('SR_MER018492_monitors' in mtd)
  202. ws = PropertyManager.sample_run.get_workspace()
  203. self.assertTrue(isinstance(ws,Workspace))
  204. self.assertEqual(ws.getNumberHistograms(),69632)
  205. self.assertEqual(mon_ws.getNumberHistograms(),9)
  206. self.assertEqual(mon_ws.getIndexFromSpectrumNumber(69633),0)
  207. det = mon_ws.getDetector(0)
  208. self.assertTrue(det.isMonitor())
  209. ei_ws = GetAllEi(mon_ws,69634,69638,IgnoreSecondMonitor=False)
  210. self.assertTrue(isinstance(ei_ws,Workspace))
  211. en_peaks = ei_ws.readX(0)
  212. self.assertAlmostEqual(len(en_peaks),1)
  213. self.assertAlmostEqual(en_peaks[0],108.94,2)
  214. self.valid = True
  215. def validate(self):
  216. return self.valid
  217. class ISISLoadFilesLET(systemtesting.MantidSystemTest):
  218. def __init__(self):
  219. systemtesting.MantidSystemTest.__init__(self)
  220. self.valid = False
  221. def runTest(self):
  222. #
  223. propman = PropertyManager('LET')
  224. propman.sample_run = 6278 #event nexus file
  225. propman.load_monitors_with_workspace = False
  226. # Here we have known problem of propman loading new IDF, and
  227. # workspace is written using old IDF. New IDF has mon1_norm_spec =73729
  228. # and ei_mon1_spec=73734 (on January 2015) and old
  229. # IDF -- mon1_norm_spec =40961 and 40966 (forever)
  230. # Normalized by monitor-1. -- need monitor1 and ei needs ei_mon1_spec
  231. # This problem is hopefully fixed in reduction now, but here
  232. # we have to specify these values manually to guard against
  233. # changes in a future. This issue should be now fixed through varions means
  234. propman.normalise_method='monitor-1'
  235. # Adjust old IDF to new changes. This may change when loader is modified.
  236. propman.ei_mon2_spec = [5506,5505,5507]
  237. propman.spectra_to_monitors_list=[5506,5505,5507]
  238. #
  239. ws = PropertyManager.sample_run.get_workspace()
  240. # apply IDF property, correspondent to this particular time interval
  241. propman.update_defaults_from_instrument(ws.getInstrument())
  242. self.assertEqual(int(propman.mon1_norm_spec),40961)
  243. self.assertEqual(propman.ei_mon1_spec,40966)
  244. mon_ws = PropertyManager.sample_run.get_monitors_ws()
  245. self.assertNotEqual(mon_ws, None)
  246. self.assertTrue(isinstance(ws,IEventWorkspace))
  247. self.assertEqual(ws.getNumberHistograms(),40960)
  248. self.assertTrue(isinstance(mon_ws,Workspace))
  249. #
  250. self.assertEqual(mon_ws.getNumberHistograms(),11)
  251. ei_ws = GetAllEi(mon_ws,40966,40967,IgnoreSecondMonitor=True)
  252. self.assertTrue(isinstance(ei_ws,Workspace))
  253. self.valid = True
  254. def validate(self):
  255. return self.valid
  256. if __name__=="__main__":
  257. tester = ISISLoadFilesMER()
  258. tester.runTest()