def test_that_inputs_saved_and_loaded_correctly(self):
     scriptElement2 = TOFTOFScriptElement()
     scriptElement2.from_xml(self.scriptElement.to_xml())
     scriptElement2.facility_name   = 'MLZ'
     scriptElement2.instrument_name = 'TOFTOF'
     for name in dir(self.scriptElement):
         if not name.startswith('__') and not hasattr(getattr(self.scriptElement, name), '__call__'):
             self.assertEqual(getattr(self.scriptElement, name), getattr(scriptElement2, name))
Beispiel #2
0
    def test_that_preserves_empty_data(self):
        scriptElement = TOFTOFScriptElement()
        scriptElement.reset()

        self.setupWidget.set_state(scriptElement)

        with mock.patch('reduction_gui.reduction.toftof.toftof_reduction.TOFTOFScriptElement.reset'):
            scriptElement2 = self.setupWidget.get_state()

        scriptElement.facility_name   = self.settingsMock.facility_name
        scriptElement.instrument_name = self.settingsMock.instrument_name
        for name in dir(scriptElement):
            attr1 = getattr(scriptElement, name)
            try:
                attr2 = getattr(scriptElement2, name)
            except AttributeError:
                self.fail("TOFTOFSetupWidget.get_state() doesn't set the attribute '{}'".format(name))

            if not name.startswith('__') and not hasattr(attr1, '__call__'):
                self.assertEqual(attr1, attr2, "TOFTOFSetupWidget doesn't preserve state of attribute '{}'".format(name))
Beispiel #3
0
    def test_that_preserves_empty_data(self):
        scriptElement = TOFTOFScriptElement()
        scriptElement.reset()

        self.setupWidget.set_state(scriptElement)

        with mock.patch(
                'reduction_gui.reduction.toftof.toftof_reduction.TOFTOFScriptElement.reset'
        ):
            scriptElement2 = self.setupWidget.get_state()

        scriptElement.facility_name = self.settingsMock.facility_name
        scriptElement.instrument_name = self.settingsMock.instrument_name
        for name in dir(scriptElement):
            attr1 = getattr(scriptElement, name)
            try:
                attr2 = getattr(scriptElement2, name)
            except AttributeError:
                self.fail(
                    "TOFTOFSetupWidget.get_state() doesn't set the attribute '{}'"
                    .format(name))

            if not name.startswith('__') and not hasattr(attr1, '__call__'):
                self.assertEqual(
                    attr1, attr2,
                    "TOFTOFSetupWidget doesn't preserve state of attribute '{}'"
                    .format(name))
 def test_that_inputs_saved_and_loaded_correctly(self):
     scriptElement2 = TOFTOFScriptElement()
     scriptElement2.from_xml(self.scriptElement.to_xml())
     scriptElement2.facility_name = 'MLZ'
     scriptElement2.instrument_name = 'TOFTOF'
     for name in dir(self.scriptElement):
         if not name.startswith('__') and not hasattr(getattr(self.scriptElement, name), '__call__'):
             self.assertEqual(getattr(self.scriptElement, name), getattr(scriptElement2, name))
Beispiel #5
0
    def test_that_preserves_data(self):
        scriptElement = TOFTOFScriptElement()
        scriptElement.reset()
        scriptElement.facility_name = 'nonsense'
        scriptElement.instrument_name = 'The 5th nonSense'

        # prefix of (some) workspace names
        scriptElement.prefix = 'ws'

        # data files are here
        scriptElement.dataDir = ''

        # vanadium runs & comment
        scriptElement.vanRuns = 'TOFTOFTestdata.nxs'
        scriptElement.vanCmnt = 'vanadium comment'
        scriptElement.vanTemp = OptionalFloat(None)

        # empty can runs, comment, and factor
        scriptElement.ecRuns = 'TOFTOFTestdata.nxs'
        scriptElement.ecTemp = OptionalFloat(21.0)
        scriptElement.ecFactor = 0.9

        # data runs: [(runs,comment, temperature), ...]
        scriptElement.dataRuns = [[
            unicode('TOFTOFTestdata.nxs'),
            unicode('H2O 21C'),
            OptionalFloat(None)
        ],
                                  [
                                      unicode('TOFTOFTestdata.nxs'),
                                      unicode('H2O 34C'),
                                      OptionalFloat(34.0)
                                  ]]

        # additional parameters
        scriptElement.binEon = True
        scriptElement.binEstart = -1.0
        scriptElement.binEstep = 0.4
        scriptElement.binEend = 1.8

        scriptElement.binQon = True
        scriptElement.binQstart = 0.4
        scriptElement.binQstep = 0.2
        scriptElement.binQend = 1.0

        scriptElement.maskDetectors = '1,2'

        # options
        scriptElement.subtractECVan = True
        scriptElement.normalise = TOFTOFScriptElement.NORM_MONITOR
        scriptElement.correctTof = TOFTOFScriptElement.CORR_TOF_VAN
        scriptElement.replaceNaNs = True
        scriptElement.createDiff = True
        scriptElement.keepSteps = True

        # save data
        scriptElement.saveDir = ''
        scriptElement.saveSofTWNxspe = False
        scriptElement.saveSofTWNexus = True
        scriptElement.saveSofTWAscii = True
        scriptElement.saveSofQWNexus = False
        scriptElement.saveSofQWAscii = True

        self.setupWidget.set_state(scriptElement)

        with mock.patch(
                'reduction_gui.reduction.toftof.toftof_reduction.TOFTOFScriptElement.reset'
        ):
            scriptElement2 = self.setupWidget.get_state()

        scriptElement.facility_name = self.settingsMock.facility_name
        scriptElement.instrument_name = self.settingsMock.instrument_name
        for name in dir(scriptElement):
            attr1 = getattr(scriptElement, name)
            try:
                attr2 = getattr(scriptElement2, name)
            except AttributeError:
                self.fail(
                    "TOFTOFSetupWidget.get_state() doesn't set the attribute '{}'"
                    .format(name))

            if not name.startswith('__') and not hasattr(attr1, '__call__'):
                self.assertEqual(
                    attr1, attr2,
                    "TOFTOFSetupWidget doesn't preserve state of attribute '{}'"
                    .format(name))
Beispiel #6
0
    def test_that_preserves_data(self):
        scriptElement = TOFTOFScriptElement()
        scriptElement.reset()
        scriptElement.facility_name   = 'nonsense'
        scriptElement.instrument_name = 'The 5th nonSense'

        # prefix of (some) workspace names
        scriptElement.prefix   = 'ws'

        # data files are here
        scriptElement.dataDir  = ''

        # vanadium runs & comment
        scriptElement.vanRuns  = 'TOFTOFTestdata.nxs'
        scriptElement.vanCmnt  = 'vanadium comment'
        scriptElement.vanTemp  = OptionalFloat(None)

        # empty can runs, comment, and factor
        scriptElement.ecRuns   = 'TOFTOFTestdata.nxs'
        scriptElement.ecTemp   = OptionalFloat(21.0)
        scriptElement.ecFactor = 0.9

        # data runs: [(runs,comment, temperature), ...]
        scriptElement.dataRuns = [
            [unicode('TOFTOFTestdata.nxs'), unicode('H2O 21C'), OptionalFloat(None)],
            [unicode('TOFTOFTestdata.nxs'), unicode('H2O 34C'), OptionalFloat(34.0)]
        ]

        # additional parameters
        scriptElement.binEon        = True
        scriptElement.binEstart     = -1.0
        scriptElement.binEstep      = 0.4
        scriptElement.binEend       = 1.8

        scriptElement.binQon        = True
        scriptElement.binQstart     = 0.4
        scriptElement.binQstep      = 0.2
        scriptElement.binQend       = 1.0

        scriptElement.maskDetectors = '1,2'

        # options
        scriptElement.subtractECVan = True
        scriptElement.normalise     = TOFTOFScriptElement.NORM_MONITOR
        scriptElement.correctTof    = TOFTOFScriptElement.CORR_TOF_VAN
        scriptElement.replaceNaNs   = True
        scriptElement.createDiff    = True
        scriptElement.keepSteps     = True

        # save data
        scriptElement.saveDir        = ''
        scriptElement.saveSofTWNxspe = False
        scriptElement.saveSofTWNexus = True
        scriptElement.saveSofTWAscii = True
        scriptElement.saveSofQWNexus = False
        scriptElement.saveSofQWAscii = True

        self.setupWidget.set_state(scriptElement)

        with mock.patch('reduction_gui.reduction.toftof.toftof_reduction.TOFTOFScriptElement.reset'):
            scriptElement2 = self.setupWidget.get_state()

        scriptElement.facility_name   = self.settingsMock.facility_name
        scriptElement.instrument_name = self.settingsMock.instrument_name
        for name in dir(scriptElement):
            attr1 = getattr(scriptElement, name)
            try:
                attr2 = getattr(scriptElement2, name)
            except AttributeError:
                self.fail("TOFTOFSetupWidget.get_state() doesn't set the attribute '{}'".format(name))

            if not name.startswith('__') and not hasattr(attr1, '__call__'):
                self.assertEqual(attr1, attr2, "TOFTOFSetupWidget doesn't preserve state of attribute '{}'".format(name))
Beispiel #7
0
class TOFTOFScriptElementTest(unittest.TestCase):
    @staticmethod
    def setMinimumValidInputs(scriptElement):
        scriptElement.reset()
        scriptElement.facility_name = 'MLZ'
        scriptElement.instrument_name = 'TOFTOF'

        # prefix of (some) workspace names
        scriptElement.prefix = 'ws'

        # data files are here
        scriptElement.dataDir = '/Somepath/somewhere/'

        # vanadium runs & comment
        scriptElement.vanRuns = ''
        scriptElement.vanCmnt = ''
        scriptElement.vanTemp = OptionalFloat(None)

        # empty can runs, comment, and factor
        scriptElement.ecRuns = ''
        scriptElement.ecTemp = OptionalFloat(None)
        scriptElement.ecFactor = 1

        # data runs: [(runs,comment, temperature), ...]
        scriptElement.dataRuns = [[
            unicode('0:5'),
            unicode('Comment for Run 0:5'),
            OptionalFloat(None)
        ]]

        # additional parameters
        scriptElement.binEon = False
        scriptElement.binEstart = 0.0
        scriptElement.binEstep = 0.0
        scriptElement.binEend = 0.0

        scriptElement.binQon = False
        scriptElement.binQstart = 0.0
        scriptElement.binQstep = 0.0
        scriptElement.binQend = 0.0

        scriptElement.maskDetectors = ''

        # options
        scriptElement.subtractECVan = False
        scriptElement.normalise = TOFTOFScriptElement.NORM_NONE
        scriptElement.correctTof = TOFTOFScriptElement.CORR_TOF_NONE
        scriptElement.replaceNaNs = False
        scriptElement.createDiff = False
        scriptElement.keepSteps = False

        # save data
        scriptElement.saveDir = ''
        scriptElement.saveSofTWNxspe = False
        scriptElement.saveSofTWNexus = False
        scriptElement.saveSofTWAscii = False
        scriptElement.saveSofQWNexus = False
        scriptElement.saveSofQWAscii = False

    @staticmethod
    def setValidInputs(scriptElement):
        scriptElement.reset()
        scriptElement.facility_name = 'MLZ'
        scriptElement.instrument_name = 'TOFTOF'

        # prefix of (some) workspace names
        scriptElement.prefix = 'ws'

        # data files are here
        scriptElement.dataDir = '/Somepath/somewhere/'

        # vanadium runs & comment
        scriptElement.vanRuns = '1:3'
        scriptElement.vanCmnt = 'vanadium comment'
        scriptElement.vanTemp = OptionalFloat(None)

        # empty can runs, comment, and factor
        scriptElement.ecRuns = ''
        scriptElement.ecTemp = OptionalFloat(None)
        scriptElement.ecFactor = 1

        # data runs: [(runs,comment, temperature), ...]
        scriptElement.dataRuns = [[
            unicode('0:5'),
            unicode('Comment for Run 0:5'),
            OptionalFloat(None)
        ]]

        # additional parameters
        scriptElement.binEon = True
        scriptElement.binEstart = 0.0
        scriptElement.binEstep = 0.1
        scriptElement.binEend = 1.0

        scriptElement.binQon = True
        scriptElement.binQstart = 0.0
        scriptElement.binQstep = 0.1
        scriptElement.binQend = 1.0

        scriptElement.maskDetectors = ''

        # options
        scriptElement.subtractECVan = False
        scriptElement.normalise = TOFTOFScriptElement.NORM_NONE
        scriptElement.correctTof = TOFTOFScriptElement.CORR_TOF_NONE
        scriptElement.replaceNaNs = False
        scriptElement.createDiff = False
        scriptElement.keepSteps = False

        # save data
        scriptElement.saveDir = ''
        scriptElement.saveSofTWNxspe = False
        scriptElement.saveSofTWNexus = False
        scriptElement.saveSofTWAscii = False
        scriptElement.saveSofQWNexus = False
        scriptElement.saveSofQWAscii = False

    def setUp(self):
        self.scriptElement = TOFTOFScriptElement()
        self.setValidInputs(self.scriptElement)

    def tearDown(self):
        self.scriptElement = None
        #done

    def test_that_inputs_saved_and_loaded_correctly(self):
        scriptElement2 = TOFTOFScriptElement()
        scriptElement2.from_xml(self.scriptElement.to_xml())
        scriptElement2.facility_name = 'MLZ'
        scriptElement2.instrument_name = 'TOFTOF'
        for name in dir(self.scriptElement):
            if not name.startswith('__') and not hasattr(
                    getattr(self.scriptElement, name), '__call__'):
                self.assertEqual(getattr(self.scriptElement, name),
                                 getattr(scriptElement2, name))

    # due to an issue with 'exec()' in functtions with nested functions in python 2.7 (2.7.8 and earlier),
    # this function has to stay outside of 'test_that_script_is_executable_in_mantid()'.
    # see https://bugs.python.org/issue21591
    # cannot be a @staticmethod for the same reasons
    def execScript(self, script):
        exec(script, dict(), dict())

    def test_that_script_is_executable_in_mantid(self):
        # data files are here
        self.scriptElement.dataDir = ''

        # vanadium runs & comment
        self.scriptElement.vanRuns = 'TOFTOFTestdata.nxs'

        # empty can runs, comment, and factor
        self.scriptElement.ecRuns = 'TOFTOFTestdata.nxs'
        self.scriptElement.ecTemp = OptionalFloat(21.0)
        self.scriptElement.ecFactor = 0.9

        # data runs: [(runs,comment, temperature), ...]
        self.scriptElement.dataRuns = [[
            unicode('TOFTOFTestdata.nxs'),
            unicode('H2O 21C'),
            OptionalFloat(None)
        ],
                                       [
                                           unicode('TOFTOFTestdata.nxs'),
                                           unicode('H2O 34C'),
                                           OptionalFloat(34.0)
                                       ]]

        self.scriptElement.maskDetectors = '1,2'

        # options
        self.scriptElement.subtractECVan = True
        self.scriptElement.normalise = TOFTOFScriptElement.NORM_MONITOR
        self.scriptElement.correctTof = TOFTOFScriptElement.CORR_TOF_VAN
        self.scriptElement.replaceNaNs = True
        self.scriptElement.createDiff = True
        self.scriptElement.keepSteps = True

        testhelpers.assertRaisesNothing(
            self, self.execScript, 'from mantid.simpleapi import *\n' +
            self.scriptElement.to_script())

    def test_that_script_has_correct_syntax(self):
        self.scriptElement.binEon = False
        self.scriptElement.binQon = False
        self.scriptElement.dataRuns = [('0:5', 'Comment for Run 0:5', None)]

        script = self.scriptElement.to_script()

        HasNullBytesError = TypeError
        if sys.version_info >= (3, 5):
            HasNullBytesError = ValueError
        try:
            compiledScript = compile(script, '<string>', 'exec')
        except SyntaxError as e:
            self.fail("generated script has a syntax error: '{}'".format(e))
        except HasNullBytesError as e:
            self.fail("generated script has null bytes: '{}'".format(e))
        self.assertIsNotNone(compiledScript)

    def test_that_inputs_are_validated_correctly(self):
        try:
            self.scriptElement.validate_inputs()
        except RuntimeError as e:
            self.fail(e)

        # some handy aliases:
        OptFloat = OptionalFloat

        # [(inputDict, causesException=True), ...]
        modifiedValues = [
            ({}, False),
            ({
                'correctTof': TOFTOFScriptElement.CORR_TOF_VAN
            }, True),
            ({
                'correctTof': TOFTOFScriptElement.CORR_TOF_VAN,
                'vanRuns': '0:2',
                'vanCmnt': 'vanComment'
            }, False),
            ({
                'subtractECVan': True,
                'vanRuns': '',
                'vanCmnt': 'vanComment',
                'ecRuns': '3:5'
            }, True),
            ({
                'subtractECVan': True,
                'vanRuns': '',
                'vanCmnt': '',
                'ecRuns': '3:5'
            }, True),
            ({
                'subtractECVan': True,
                'vanRuns': '0:2',
                'vanCmnt': 'vanComment',
                'ecRuns': ''
            }, True),
            ({
                'subtractECVan': True,
                'vanRuns': '0:2',
                'vanCmnt': 'vanComment',
                'ecRuns': '3:5'
            }, False),
            ({}, False),
            ({
                'binEon': True,
                'binEstart': 1.0,
                'binEstep': 0.1,
                'binEend': 1.0
            }, True),
            ({
                'binEon': True,
                'binEstart': 0.0,
                'binEstep': 2.0,
                'binEend': 1.0
            }, True),
            ({
                'binEon': True,
                'binEstart': 0.0,
                'binEstep': 0.0,
                'binEend': 1.0
            }, True),
            ({
                'binEon': True,
                'binEstart': 0.0,
                'binEstep': -0.1,
                'binEend': 1.0
            }, True),
            ({
                'binEon': False,
                'binEstart': 0.0,
                'binEstep': -0.1,
                'binEend': 1.0
            }, False),
            ({
                'binQon': True,
                'binQstart': 1.0,
                'binQstep': 0.1,
                'binQend': 1.0
            }, True),
            ({
                'binQon': True,
                'binQstart': 0.0,
                'binQstep': 2.0,
                'binQend': 1.0
            }, True),
            ({
                'binQon': True,
                'binQstart': 0.0,
                'binQstep': 0.0,
                'binQend': 1.0
            }, True),
            ({
                'binQon': True,
                'binQstart': 0.0,
                'binQstep': -0.1,
                'binQend': 1.0
            }, True),
            ({
                'binQon': False,
                'binQstart': 1.0,
                'binQstep': 0.1,
                'binQend': 1.0
            }, False),
            ({
                'dataRuns': []
            }, True),
            ({
                'dataRuns': [[unicode('0:5'),
                              unicode(''),
                              OptFloat(None)]]
            }, True),
            ({
                'dataRuns': [[
                    unicode('0:5'),
                    unicode('Comment for Run 0:5'),
                    OptFloat(None)
                ], [unicode('6:7'),
                    unicode(''), OptFloat(None)]]
            }, True),
            ({
                'dataRuns': [[unicode('0:5'),
                              unicode(''),
                              OptFloat(None)],
                             [
                                 unicode('6:7'),
                                 unicode('Comment for Run 6:7'),
                                 OptFloat(None)
                             ]]
            }, True),
            ({
                'vanRuns': '0:2',
                'vanCmnt': ''
            }, True),
            ({
                'vanRuns': '0:2',
                'vanCmnt': 'Comment for Vanadium'
            }, False),
            ({
                'saveSofTWNxspe': True,
                'saveSofTWAscii': True,
                'saveDir': ''
            }, True),
            ({
                'saveSofTWNexus': True,
                'saveSofQWNexus': False,
                'saveDir': ''
            }, True),
            ({
                'saveSofQWNexus': True,
                'saveSofQWAscii': True,
                'saveDir': '/some/SaveDir/'
            }, False),
        ]

        def executeSubTest(inputs, shouldThrow):
            self.setMinimumValidInputs(self.scriptElement)
            for name, value in inputs.items():
                setattr(self.scriptElement, name, value)

            try:
                self.scriptElement.validate_inputs()
            except RuntimeError as e:
                if not shouldThrow:
                    self.fail(
                        "Valid input did cause an exception: '{}'.\nThe input was: {}"
                        .format(e, inputs))
            else:
                if shouldThrow:
                    self.fail(
                        "Invalid input did NOT cause an exception!\nThe input was: {}"
                        .format(inputs))

        for inputs, shouldThrow in modifiedValues:
            if hasattr(self, 'subTest'):
                with self.subTest():
                    executeSubTest(inputs, shouldThrow)
            else:
                executeSubTest(inputs, shouldThrow)
Beispiel #8
0
 def setUp(self):
     self.scriptElement = TOFTOFScriptElement()
     self.setValidInputs(self.scriptElement)
Beispiel #9
0
    def get_state(self):
        elem = TOFTOFScriptElement()

        def line_text(lineEdit):
            return lineEdit.text().strip()

        elem.facility_name = self._settings.facility_name
        elem.instrument_name = self._settings.instrument_name

        elem.prefix = line_text(self.prefix)
        elem.dataDir = line_text(self.dataDir)

        elem.vanRuns = line_text(self.vanRuns)
        elem.vanCmnt = line_text(self.vanCmnt)
        elem.vanTemp = OptionalFloat(line_text(self.vanTemp))

        elem.ecRuns = line_text(self.ecRuns)
        elem.ecTemp = OptionalFloat(line_text(self.ecTemp))
        elem.ecFactor = self.ecFactor.value()

        elem.dataRuns = self.runDataModel.tableData

        elem.binEon = self.binEon.isChecked()
        elem.binEstart = self.binEstart.value()
        elem.binEstep = self.binEstep.value()
        elem.binEend = self.binEend.value()

        elem.binQon = self.binQon.isChecked()
        elem.binQstart = self.binQstart.value()
        elem.binQstep = self.binQstep.value()
        elem.binQend = self.binQend.value()

        elem.maskDetectors = line_text(self.maskDetectors)

        elem.subtractECVan = self.chkSubtractECVan.isChecked()
        elem.replaceNaNs = self.chkReplaceNaNs.isChecked()
        elem.createDiff = self.chkCreateDiff.isChecked()
        elem.keepSteps = self.chkKeepSteps.isChecked()

        elem.saveDir = line_text(self.saveDir)
        elem.saveSofQW = self.chkSofQW.isChecked()
        elem.saveSofTW = self.chkSofTW.isChecked()
        elem.saveNXSPE = self.chkNxspe.isChecked()
        elem.saveNexus = self.chkNexus.isChecked()
        elem.saveAscii = self.chkAscii.isChecked()

        elem.normalise     = elem.NORM_MONITOR    if self.rbtNormaliseMonitor.isChecked() else \
            elem.NORM_TIME       if self.rbtNormaliseTime.isChecked()    else \
            elem.NORM_NONE

        elem.correctTof    = elem.CORR_TOF_VAN    if self.rbtCorrectTOFVan.isChecked()    else \
            elem.CORR_TOF_SAMPLE if self.rbtCorrectTOFSample.isChecked() else \
            elem.CORR_TOF_NONE
        return elem
Beispiel #10
0
    def get_state(self):
        elem = TOFTOFScriptElement()

        def line_text(lineEdit):
            return lineEdit.text().strip()

        elem.facility_name = self._settings.facility_name
        elem.instrument_name = self._settings.instrument_name

        elem.prefix = line_text(self.prefix)
        elem.dataDir = line_text(self.dataDir)

        elem.vanRuns = line_text(self.vanRuns)
        elem.vanCmnt = line_text(self.vanCmnt)

        elem.ecRuns = line_text(self.ecRuns)
        elem.ecFactor = self.ecFactor.value()

        elem.dataRuns = self.runDataModel.dataRuns

        elem.binEon = self.binEon.isChecked()
        elem.binEstart = self.binEstart.value()
        elem.binEstep = self.binEstep.value()
        elem.binEend = self.binEend.value()

        elem.binQon = self.binQon.isChecked()
        elem.binQstart = self.binQstart.value()
        elem.binQstep = self.binQstep.value()
        elem.binQend = self.binQend.value()

        elem.maskDetectors = line_text(self.maskDetectors)

        elem.subtractECVan = self.chkSubtractECVan.isChecked()

        elem.normalise = (
            elem.NORM_MONITOR
            if self.rbtNormaliseMonitor.isChecked()
            else elem.NORM_TIME
            if self.rbtNormaliseTime.isChecked()
            else elem.NORM_NONE
        )

        elem.correctTof = (
            elem.CORR_TOF_VAN
            if self.rbtCorrectTOFVan.isChecked()
            else elem.CORR_TOF_SAMPLE
            if self.rbtCorrectTOFSample.isChecked()
            else elem.CORR_TOF_NONE
        )
        return elem
class TOFTOFScriptElementTest(unittest.TestCase):

    @staticmethod
    def setMinimumValidInputs(scriptElement):
        scriptElement.reset()
        scriptElement.facility_name   = 'MLZ'
        scriptElement.instrument_name = 'TOFTOF'

        # prefix of (some) workspace names
        scriptElement.prefix   = 'ws'

        # data files are here
        scriptElement.dataDir  = '/Somepath/somewhere/'

        # vanadium runs & comment
        scriptElement.vanRuns  = ''
        scriptElement.vanCmnt  = ''
        scriptElement.vanTemp  = OptionalFloat(None)

        # empty can runs, comment, and factor
        scriptElement.ecRuns   = ''
        scriptElement.ecTemp   = OptionalFloat(None)
        scriptElement.ecFactor = 1

        # data runs: [(runs,comment, temperature), ...]
        scriptElement.dataRuns = [[unicode('0:5'), unicode('Comment for Run 0:5'), OptionalFloat(None)]]

        # additional parameters
        scriptElement.binEon        = False
        scriptElement.binEstart     = 0.0
        scriptElement.binEstep      = 0.0
        scriptElement.binEend       = 0.0

        scriptElement.binQon        = False
        scriptElement.binQstart     = 0.0
        scriptElement.binQstep      = 0.0
        scriptElement.binQend       = 0.0

        scriptElement.maskDetectors = ''

        # options
        scriptElement.subtractECVan = False
        scriptElement.normalise     = TOFTOFScriptElement.NORM_NONE
        scriptElement.correctTof    = TOFTOFScriptElement.CORR_TOF_NONE
        scriptElement.replaceNaNs   = False
        scriptElement.createDiff    = False
        scriptElement.keepSteps     = False

        # save data
        scriptElement.saveDir        = ''
        scriptElement.saveSofTWNxspe = False
        scriptElement.saveSofTWNexus = False
        scriptElement.saveSofTWAscii = False
        scriptElement.saveSofQWNexus = False
        scriptElement.saveSofQWAscii = False

    @staticmethod
    def setValidInputs(scriptElement):
        scriptElement.reset()
        scriptElement.facility_name   = 'MLZ'
        scriptElement.instrument_name = 'TOFTOF'

        # prefix of (some) workspace names
        scriptElement.prefix   = 'ws'

        # data files are here
        scriptElement.dataDir  = '/Somepath/somewhere/'

        # vanadium runs & comment
        scriptElement.vanRuns  = '1:3'
        scriptElement.vanCmnt  = 'vanadium comment'
        scriptElement.vanTemp  = OptionalFloat(None)

        # empty can runs, comment, and factor
        scriptElement.ecRuns   = ''
        scriptElement.ecTemp   = OptionalFloat(None)
        scriptElement.ecFactor = 1

        # data runs: [(runs,comment, temperature), ...]
        scriptElement.dataRuns = [[unicode('0:5'), unicode('Comment for Run 0:5'), OptionalFloat(None)]]

        # additional parameters
        scriptElement.binEon        = True
        scriptElement.binEstart     = 0.0
        scriptElement.binEstep      = 0.1
        scriptElement.binEend       = 1.0

        scriptElement.binQon        = True
        scriptElement.binQstart     = 0.0
        scriptElement.binQstep      = 0.1
        scriptElement.binQend       = 1.0

        scriptElement.maskDetectors = ''

        # options
        scriptElement.subtractECVan = False
        scriptElement.normalise     = TOFTOFScriptElement.NORM_NONE
        scriptElement.correctTof    = TOFTOFScriptElement.CORR_TOF_NONE
        scriptElement.replaceNaNs   = False
        scriptElement.createDiff    = False
        scriptElement.keepSteps     = False

        # save data
        scriptElement.saveDir        = ''
        scriptElement.saveSofTWNxspe = False
        scriptElement.saveSofTWNexus = False
        scriptElement.saveSofTWAscii = False
        scriptElement.saveSofQWNexus = False
        scriptElement.saveSofQWAscii = False

    def setUp(self):
        self.scriptElement = TOFTOFScriptElement()
        self.setValidInputs(self.scriptElement)

    def tearDown(self):
        self.scriptElement = None
        #done

    def test_that_inputs_saved_and_loaded_correctly(self):
        scriptElement2 = TOFTOFScriptElement()
        scriptElement2.from_xml(self.scriptElement.to_xml())
        scriptElement2.facility_name   = 'MLZ'
        scriptElement2.instrument_name = 'TOFTOF'
        for name in dir(self.scriptElement):
            if not name.startswith('__') and not hasattr(getattr(self.scriptElement, name), '__call__'):
                self.assertEqual(getattr(self.scriptElement, name), getattr(scriptElement2, name))

    # due to an issue with 'exec()' in functtions with nested functions in python 2.7 (2.7.8 and earlier), 
    # this function has to stay outside of 'test_that_script_is_executable_in_mantid()'.
    # see https://bugs.python.org/issue21591
    # cannot be a @staticmethod for the same reasons
    def execScript(self, script):
        exec(script, dict(), dict())

    def test_that_script_is_executable_in_mantid(self):
        # data files are here
        self.scriptElement.dataDir  = ''

        # vanadium runs & comment
        self.scriptElement.vanRuns  = 'TOFTOFTestdata.nxs'

        # empty can runs, comment, and factor
        self.scriptElement.ecRuns   = 'TOFTOFTestdata.nxs'
        self.scriptElement.ecTemp   = OptionalFloat(21.0)
        self.scriptElement.ecFactor = 0.9

        # data runs: [(runs,comment, temperature), ...]
        self.scriptElement.dataRuns = [
            [unicode('TOFTOFTestdata.nxs'), unicode('H2O 21C'), OptionalFloat(None)],
            [unicode('TOFTOFTestdata.nxs'), unicode('H2O 34C'), OptionalFloat(34.0)]
        ]

        self.scriptElement.maskDetectors = '1,2'

        # options
        self.scriptElement.subtractECVan = True
        self.scriptElement.normalise     = TOFTOFScriptElement.NORM_MONITOR
        self.scriptElement.correctTof    = TOFTOFScriptElement.CORR_TOF_VAN
        self.scriptElement.replaceNaNs   = True
        self.scriptElement.createDiff    = True
        self.scriptElement.keepSteps     = True

        testhelpers.assertRaisesNothing(self, self.execScript, 
                                        self.scriptElement.to_script().replace('import matplotlib.pyplot as plt', ''))

    def test_that_script_has_correct_syntax(self):
        self.scriptElement.binEon = False
        self.scriptElement.binQon = False
        self.scriptElement.dataRuns = [('0:5', 'Comment for Run 0:5', None)]

        script = self.scriptElement.to_script()

        HasNullBytesError = TypeError
        if sys.version_info >= (3, 5):
            HasNullBytesError = ValueError
        try:
            compiledScript = compile(script, '<string>', 'exec')
        except SyntaxError as e:
            self.fail("generated script has a syntax error: '{}'".format(e))
        except HasNullBytesError as e:
                self.fail("generated script has null bytes: '{}'".format(e))
        self.assertIsNotNone(compiledScript)

    def test_that_inputs_are_validated_correctly(self):
        try:
            self.scriptElement.validate_inputs()
        except RuntimeError as e:
            self.fail(e)

        # some handy aliases:
        OptFloat = OptionalFloat

        # [(inputDict, causesException=True), ...]
        modifiedValues = [
            ({}, False),

            ({'correctTof': TOFTOFScriptElement.CORR_TOF_VAN},                   True),
            ({'correctTof': TOFTOFScriptElement.CORR_TOF_VAN, 'vanRuns': '0:2', 'vanCmnt': 'vanComment'}, False),

            ({'subtractECVan': True, 'vanRuns': '',    'vanCmnt': 'vanComment', 'ecRuns': '3:5'}, True),
            ({'subtractECVan': True, 'vanRuns': '',    'vanCmnt': '',           'ecRuns': '3:5'}, True),
            ({'subtractECVan': True, 'vanRuns': '0:2', 'vanCmnt': 'vanComment', 'ecRuns': ''},    True),
            ({'subtractECVan': True, 'vanRuns': '0:2', 'vanCmnt': 'vanComment', 'ecRuns': '3:5'}, False),

            ({}, False),
            ({'binEon': True,  'binEstart': 1.0, 'binEstep': 0.1, 'binEend': 1.0}, True),
            ({'binEon': True,  'binEstart': 0.0, 'binEstep': 2.0, 'binEend': 1.0}, True),
            ({'binEon': True,  'binEstart': 0.0, 'binEstep': 0.0, 'binEend': 1.0}, True),
            ({'binEon': True,  'binEstart': 0.0, 'binEstep':-0.1, 'binEend': 1.0}, True),
            ({'binEon': False, 'binEstart': 0.0, 'binEstep':-0.1, 'binEend': 1.0}, False),

            ({'binQon': True,  'binQstart': 1.0, 'binQstep': 0.1, 'binQend': 1.0}, True),
            ({'binQon': True,  'binQstart': 0.0, 'binQstep': 2.0, 'binQend': 1.0}, True),
            ({'binQon': True,  'binQstart': 0.0, 'binQstep': 0.0, 'binQend': 1.0}, True),
            ({'binQon': True,  'binQstart': 0.0, 'binQstep':-0.1, 'binQend': 1.0}, True),
            ({'binQon': False, 'binQstart': 1.0, 'binQstep': 0.1, 'binQend': 1.0}, False),

            ({'dataRuns'  : []}, True),

            ({'dataRuns'  : [[unicode('0:5'), unicode(''), OptFloat(None)]]}, True),
            ({'dataRuns'  : [
                [unicode('0:5'), unicode('Comment for Run 0:5'), OptFloat(None)],
                [unicode('6:7'), unicode(''), OptFloat(None)]
            ]}, True),
            ({'dataRuns'  : [
                [unicode('0:5'), unicode(''), OptFloat(None)],
                [unicode('6:7'), unicode('Comment for Run 6:7'), OptFloat(None)]
            ]}, True),

            ({'vanRuns': '0:2', 'vanCmnt': ''}, True),
            ({'vanRuns': '0:2', 'vanCmnt': 'Comment for Vanadium'}, False),

            ({'saveSofTWNxspe': True, 'saveSofTWAscii': True,  'saveDir': ''}, True),
            ({'saveSofTWNexus': True, 'saveSofQWNexus': False, 'saveDir': ''}, True),
            ({'saveSofQWNexus': True, 'saveSofQWAscii': True,  'saveDir': '/some/SaveDir/'}, False),
        ]

        def executeSubTest(inputs, shouldThrow):
            self.setMinimumValidInputs(self.scriptElement)
            for name, value in inputs.items():
                setattr(self.scriptElement, name, value)

            try:
                self.scriptElement.validate_inputs()
            except RuntimeError as e:
                if not shouldThrow:
                    self.fail("Valid input did cause an exception: '{}'.\nThe input was: {}".format(e, inputs))
            else:
                if shouldThrow:
                    self.fail("Invalid input did NOT cause an exception!\nThe input was: {}".format(inputs))

        for inputs, shouldThrow in modifiedValues:
            if hasattr(self, 'subTest'):
                with self.subTest():
                    executeSubTest(inputs, shouldThrow)
            else:
                executeSubTest(inputs, shouldThrow)
 def setUp(self):
     self.scriptElement = TOFTOFScriptElement()
     self.setValidInputs(self.scriptElement)
Beispiel #13
0
    def get_state(self):
        elem = TOFTOFScriptElement()

        def line_text(lineEdit):
            return lineEdit.text().strip()

        elem.facility_name = self._settings.facility_name
        elem.instrument_name = self._settings.instrument_name

        elem.prefix = line_text(self.prefix)
        elem.dataDir = line_text(self.dataDir)

        elem.vanRuns = line_text(self.vanRuns)
        elem.vanCmnt = line_text(self.vanCmnt)

        elem.ecRuns = line_text(self.ecRuns)
        elem.ecFactor = self.ecFactor.value()

        elem.dataRuns = self.runDataModel.dataRuns

        elem.binEon = self.binEon.isChecked()
        elem.binEstart = self.binEstart.value()
        elem.binEstep = self.binEstep.value()
        elem.binEend = self.binEend.value()

        elem.binQon = self.binQon.isChecked()
        elem.binQstart = self.binQstart.value()
        elem.binQstep = self.binQstep.value()
        elem.binQend = self.binQend.value()

        elem.maskDetectors = line_text(self.maskDetectors)

        elem.subtractECVan = self.chkSubtractECVan.isChecked()

        elem.normalise     = elem.NORM_MONITOR    if self.rbtNormaliseMonitor.isChecked() else \
            elem.NORM_TIME       if self.rbtNormaliseTime.isChecked()    else \
            elem.NORM_NONE

        elem.correctTof    = elem.CORR_TOF_VAN    if self.rbtCorrectTOFVan.isChecked()    else \
            elem.CORR_TOF_SAMPLE if self.rbtCorrectTOFSample.isChecked() else \
            elem.CORR_TOF_NONE
        return elem