示例#1
0
    def test_binning_commands_parsed(self):
        # Wavelength
        for bin_type in ["Lin", "Log"]:
            wavelength_dict = {"binning": {"wavelength": {"start": 1.1, "step": 0.1, "stop": 2.2, "type": bin_type}}}
            wavelength = self._setup_parser(wavelength_dict).get_state_wavelength()
            self.assertEqual((1.1, 2.2), wavelength.wavelength_interval.wavelength_full_range)
            self.assertEqual(0.1, wavelength.wavelength_interval.wavelength_step)
            self.assertEqual(RangeStepType(bin_type), wavelength.wavelength_step_type)

        one_d_reduction_q_dict = {"binning": {"1d_reduction": {"binning": "1.0, 0.1, 2.0, -0.2, 3.0",
                                                               "radius_cut": 12.3,
                                                               "wavelength_cut": 23.4}}}
        one_d_convert_to_q = self._setup_parser(one_d_reduction_q_dict).get_state_convert_to_q()
        self.assertEqual(1.0, one_d_convert_to_q.q_min)
        self.assertEqual(3.0, one_d_convert_to_q.q_max)
        self.assertEqual("1.0, 0.1, 2.0, -0.2, 3.0", one_d_convert_to_q.q_1d_rebin_string.strip())
        self.assertEqual(12.3, one_d_convert_to_q.radius_cutoff)
        self.assertEqual(23.4, one_d_convert_to_q.wavelength_cutoff)

        two_d_reduction_q_dict = {"binning": {"2d_reduction": {"step": 1.0, "stop": 5.0,
                                                               "type": "Lin", "interpolate": True}}}
        results = self._setup_parser(two_d_reduction_q_dict)
        two_d_convert_to_q = results.get_state_convert_to_q()
        self.assertEqual(5.0, two_d_convert_to_q.q_xy_max)
        self.assertEqual(1.0, two_d_convert_to_q.q_xy_step)
        self.assertTrue(two_d_convert_to_q.q_xy_step_type is RangeStepType.LIN)
        self.assertTrue(results.get_state_calculate_transmission().rebin_type is RebinType.INTERPOLATING_REBIN)
示例#2
0
    def _parse_binning(self):
        binning_dict = self._get_val(["binning"])

        def set_wavelength(state_obj):
            wavelength_start = self._get_val(["wavelength", "start"],
                                             binning_dict)
            # Weirdly start and stop in user file parser are lists whilst
            # step is a float val?
            if wavelength_start:
                state_obj.wavelength_low = [wavelength_start]
            wavelength_stop = self._get_val(["wavelength", "stop"],
                                            binning_dict)
            if wavelength_stop:
                state_obj.wavelength_high = [wavelength_stop]

            state_obj.wavelength_step = self._get_val(["wavelength", "step"],
                                                      binning_dict, 0.0)

            step_str = self._get_val(["wavelength", "type"], binning_dict)
            if step_str:
                state_obj.wavelength_step_type = RangeStepType(step_str)

        # For legacy reasons where information is duplicated across our
        # state objects we set the same thing in 4 different locations.
        set_wavelength(self.calculate_transmission)
        set_wavelength(self.normalize_to_monitor)
        set_wavelength(self.wavelength)
        set_wavelength(self.wavelength_and_pixel)

        one_d_dict = self._get_val("1d_reduction", binning_dict)
        if one_d_dict:
            one_d_binning = self._get_val(["1d_reduction", "binning"],
                                          binning_dict)
            q_min, q_max = self._get_1d_min_max(one_d_binning)
            self.convert_to_q.q_min = q_min
            self.convert_to_q.q_1d_rebin_string = one_d_binning
            self.convert_to_q.q_max = q_max
            self.convert_to_q.radius_cutoff = self._get_val("radius_cut",
                                                            one_d_dict,
                                                            default=0.0)
            self.convert_to_q.wavelength_cutoff = self._get_val(
                "wavelength_cut", one_d_dict, default=0.0)

        self.convert_to_q.q_xy_max = self._get_val(["2d_reduction", "stop"],
                                                   binning_dict)
        self.convert_to_q.q_xy_step = self._get_val(["2d_reduction", "step"],
                                                    binning_dict)
        two_d_step_type = self._get_val(["2d_reduction", "type"], binning_dict)
        if two_d_step_type:
            self.convert_to_q.q_xy_step_type = RangeStepType(two_d_step_type)

        rebin_type = self._get_val(["2d_reduction", "interpolate"],
                                   binning_dict,
                                   default=False)
        rebin_type = RebinType.INTERPOLATING_REBIN if rebin_type else RebinType.REBIN
        self.calculate_transmission.rebin_type = rebin_type
        self.normalize_to_monitor.rebin_type = rebin_type
示例#3
0
        def set_wavelength(state_obj):
            wavelength_start = self._get_val(["wavelength", "start"],
                                             binning_dict)
            # Weirdly start and stop in user file parser are lists whilst
            # step is a float val?
            if wavelength_start:
                state_obj.wavelength_low = [wavelength_start]
            wavelength_stop = self._get_val(["wavelength", "stop"],
                                            binning_dict)
            if wavelength_stop:
                state_obj.wavelength_high = [wavelength_stop]

            state_obj.wavelength_step = self._get_val(["wavelength", "step"],
                                                      binning_dict, 0.0)

            step_str = self._get_val(["wavelength", "type"], binning_dict)
            if step_str:
                state_obj.wavelength_step_type = RangeStepType(step_str)
示例#4
0
    def set_wavelength_details(self, state_objs: DuplicateWavelengthStates):
        binning_dict = self.get_val(["binning"])

        if not self.get_val("wavelength", binning_dict):
            return

        step_type = RangeStepType(self.get_mandatory_val(["binning", "wavelength", "type"]))

        wavelength_step = float(self.get_mandatory_val(["binning", "wavelength", "step"]))
        for i in state_objs.iterate_fields():
            i.wavelength_interval.wavelength_step = wavelength_step
            i.wavelength_step_type = step_type

        if step_type in (RangeStepType.RANGE_LIN, RangeStepType.RANGE_LOG):
            self._parse_range_wavelength(state_objs)
        else:
            assert step_type in (RangeStepType.LIN, RangeStepType.LOG)
            self._parse_linear_wavelength(state_objs)
    def _get_rebin_string(self, workspace, wavelength_low, wavelength_high):
        # If the wavelength has not been specified, then get it from the workspace. Only the first spectrum is checked
        # The lowest wavelength value is to be found in the spectrum located at workspaces index 0 is a very
        # strong assumption, but it existed in the previous implementation.
        if wavelength_low is None or wavelength_low == Property.EMPTY_DBL:
            wavelength_low = min(workspace.readX(0))

        if wavelength_high is None or wavelength_high == Property.EMPTY_DBL:
            wavelength_high = max(workspace.readX(0))

        wavelength_step = self.getProperty("WavelengthStep").value
        step_type = RangeStepType(self.getProperty("WavelengthStepType").value)
        pre_factor = -1 if step_type in [
            RangeStepType.LOG, RangeStepType.RANGE_LOG
        ] else 1
        wavelength_step *= pre_factor
        return str(wavelength_low) + "," + str(wavelength_step) + "," + str(
            wavelength_high)
示例#6
0
    def _parse_binning(self):
        binning_dict = self.get_val(["binning"])

        to_set = DuplicateWavelengthStates(
            transmission=self.calculate_transmission,
            normalize=self.normalize_to_monitor,
            wavelength=self.wavelength,
            pixel=self.wavelength_and_pixel)

        WavelengthTomlParser(toml_dict=self._input).set_wavelength_details(
            state_objs=to_set)

        one_d_dict = self.get_val("1d_reduction", binning_dict)
        if one_d_dict:
            one_d_binning = self.get_val(["1d_reduction", "binning"],
                                         binning_dict)
            q_min, q_max = self._get_1d_min_max(one_d_binning)
            self.convert_to_q.q_min = q_min
            self.convert_to_q.q_1d_rebin_string = one_d_binning
            self.convert_to_q.q_max = q_max
            self.convert_to_q.radius_cutoff = self.get_val("radius_cut",
                                                           one_d_dict,
                                                           default=0.0)
            self.convert_to_q.wavelength_cutoff = self.get_val(
                "wavelength_cut", one_d_dict, default=0.0)

        self.convert_to_q.q_xy_max = self.get_val(["2d_reduction", "stop"],
                                                  binning_dict)
        self.convert_to_q.q_xy_step = self.get_val(["2d_reduction", "step"],
                                                   binning_dict)
        two_d_step_type = self.get_val(["2d_reduction", "type"], binning_dict)
        if two_d_step_type:
            self.convert_to_q.q_xy_step_type = RangeStepType(two_d_step_type)

        rebin_type = self.get_val(["2d_reduction", "interpolate"],
                                  binning_dict,
                                  default=False)
        rebin_type = RebinType.INTERPOLATING_REBIN if rebin_type else RebinType.REBIN
        self.calculate_transmission.rebin_type = rebin_type
        self.normalize_to_monitor.rebin_type = rebin_type