Skip to content
Snippets Groups Projects
ISISPowderAbstractInstrumentTest.py 6.69 KiB
Newer Older
from __future__ import (absolute_import, division, print_function)

import mantid

from isis_powder.abstract_inst import AbstractInst
from isis_powder.routines.instrument_settings import InstrumentSettings
from isis_powder.routines.param_map_entry import ParamMapEntry
from isis_powder.routines import  common, run_details, yaml_parser
import random
import string
import tempfile
import unittest
import warnings


class ISISPowderAbstractInstrumentTest(unittest.TestCase):

    _folders_to_remove = set()
    CALIB_FILE_NAME = "ISISPowderRunDetailsTest.yaml"
    GROUPING_FILE_NAME = "hrpd_new_072_01.cal"

    def _create_temp_dir(self):
        temp_dir = tempfile.mkdtemp()
        self._folders_to_remove.add(temp_dir)
        return temp_dir

    def _find_file_or_die(self, name):
        full_path = mantid.api.FileFinder.getFullPath(name)
        if not full_path:
            self.fail("Could not find file \"{}\"".format(name))
        return full_path
    def _setup_mock_inst(self, yaml_file_path, calibration_dir, output_dir, suffix=None):
        calib_file_path = self._find_file_or_die(self.CALIB_FILE_NAME)
        grouping_file_path = self._find_file_or_die(self.GROUPING_FILE_NAME)
        test_configuration_path = mantid.api.FileFinder.getFullPath(yaml_file_path)
        if not test_configuration_path or len(test_configuration_path) <= 0:
            self.fail("Could not find the unit test input file called: " + str(yaml_file_path))
        return _MockInst(cal_file_path=test_configuration_path, group_file=grouping_file_path, cal_dir=calibration_dir,
                         out_dir=output_dir, cal_map=calib_file_path, suffix=suffix)

    def tearDown(self):
        for folder in self._folders_to_remove:
            try:
                os.rmdir(folder)
            except OSError as exc:
                warnings.warn("Could not remove folder at \"{}\"\n"
                              "Error message:\n{}".format(folder, exc))

    def test_generate_out_file_paths(self):
        cal_dir = self._create_temp_dir()
        out_dir = self._create_temp_dir()

        mock_inst = self._setup_mock_inst(suffix="-suf", yaml_file_path="ISISPowderRunDetailsTest.yaml",
                                          calibration_dir=cal_dir, output_dir=out_dir)
        run_number2 = common.get_first_run_number(run_number_string=run_number)
        cal_mapping_dict = yaml_parser.get_run_dictionary(run_number_string=run_number2,
                                                          file_path=mock_inst.cal_mapping_path)

        grouping_filename = _gen_random_string()
        empty_runs = common.cal_map_dictionary_key_helper(dictionary=cal_mapping_dict, key="empty_run_numbers")
        vanadium_runs = common.cal_map_dictionary_key_helper(dictionary=cal_mapping_dict, key="vanadium_run_numbers")

        run_details_obj = run_details.create_run_details_object(run_number_string=run_number,
                                                                inst_settings=mock_inst._inst_settings,
                                                                is_vanadium_run=False,
                                                                grouping_file_name=grouping_filename,
                                                                empty_run_number=empty_runs,
                                                                vanadium_string=vanadium_runs)

        output_paths = mock_inst._generate_out_file_paths(run_details=run_details_obj)

        expected_nxs_filename = os.path.join(out_dir,
                                             "16_4",
                                             "ISISPowderAbstractInstrumentTest",
                                             "MOCK15-suf.nxs")
        self.assertEquals(output_paths["nxs_filename"], expected_nxs_filename)
    def test_set_valid_beam_parameters(self):
        # Setup basic instrument mock
        cal_dir = self._create_temp_dir()
        out_dir = self._create_temp_dir()
        mock_inst = self._setup_mock_inst(calibration_dir=cal_dir, output_dir=out_dir,
                                          yaml_file_path="ISISPowderRunDetailsTest.yaml"
                                          )

        # Test valid parameters are retained
        mock_inst.set_beam_parameters(height=1.234, width=2)
        self.assertEqual(mock_inst._beam_parameters['height'], 1.234)
        self.assertEqual(mock_inst._beam_parameters['width'], 2)

    def test_set_invalid_beam_parameters(self):
        # Setup basic instrument mock
        cal_dir = self._create_temp_dir()
        out_dir = self._create_temp_dir()
        mock_inst = self._setup_mock_inst(calibration_dir=cal_dir, output_dir=out_dir,
                                          yaml_file_path="ISISPowderRunDetailsTest.yaml")

        # Test combination of positive / negative raise exceptions
        self.assertRaises(ValueError, mock_inst.set_beam_parameters, height=1.234, width=-2)
        self.assertRaises(ValueError, mock_inst.set_beam_parameters, height=-1.234, width=2)
        self.assertRaises(ValueError, mock_inst.set_beam_parameters, height=-1.234, width=-2)

        # Test non-numerical input
        self.assertRaises(ValueError, mock_inst.set_beam_parameters, height='height', width=-2)
        self.assertRaises(ValueError, mock_inst.set_beam_parameters, height=-1.234, width=True)

def _gen_random_string():
    return ''.join(random.choice(string.ascii_lowercase) for _ in range(10))


class _MockInst(AbstractInst):

    _param_map = [
        ParamMapEntry(ext_name="cal_dir",    int_name="calibration_dir"),
        ParamMapEntry(ext_name="cal_map",    int_name="cal_mapping_path"),
        ParamMapEntry(ext_name="file_ext",   int_name="file_extension", optional=True),
        ParamMapEntry(ext_name="group_file", int_name="grouping_file_name"),
        ParamMapEntry(ext_name="out_dir",    int_name="output_dir"),
        ParamMapEntry(ext_name="suffix",     int_name="suffix", optional=True),
        ParamMapEntry(ext_name="user_name",  int_name="user_name")
    _advanced_config = {"user_name": "ISISPowderAbstractInstrumentTest"}
    def __init__(self, cal_file_path, **kwargs):
        self._inst_settings = InstrumentSettings(param_map=self._param_map,
                                                 adv_conf_dict=self._advanced_config,
                                                 kwargs=kwargs)
        self.cal_mapping_path = cal_file_path

        super(_MockInst, self).__init__(user_name=self._inst_settings.user_name,
                                        calibration_dir=self._inst_settings.calibration_dir,
                                        output_dir=self._inst_settings.output_dir,
                                        inst_prefix=self.INST_PREFIX)