Beispiel #1
0
    def test_for_single_and_sequential_handle_display_workspace_changed_updates_the_displayed_function(
            self):
        new_workspace_list = [
            'MUSR22725; Group; top; Asymmetry',
            'MUSR22725; Group; bottom; Asymmetry',
            'MUSR22725; Group; fwd; Asymmetry'
        ]
        fit_function = FunctionFactory.createInitialized(
            'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        fit_function_1 = FunctionFactory.createInitialized(
            'name=GausOsc,A=0.6,Sigma=0.6,Frequency=0.6,Phi=0')
        self.view.function_browser.setFunction(str(fit_function))
        self.presenter.selected_data = new_workspace_list
        self.presenter.manual_selection_made = True
        self.presenter._start_x = [0.15, 0.45, 0.67]
        self.presenter._end_x = [0.56, 0.78, 0.34]
        self.presenter._fit_status = [
            'success', 'failure with message', 'success'
        ]
        self.presenter._fit_chi_squared = [12.3, 3.4, 0.35]

        self.presenter._fit_function = [
            fit_function, fit_function_1, fit_function
        ]

        self.view.parameter_display_combo.setCurrentIndex(1)

        self.assertEqual(self.view.function_browser.getFitFunctionString(),
                         'name=GausOsc,A=0.6,Sigma=0.6,Frequency=0.6,Phi=0')
        self.assertEqual(self.view.fit_status_success_failure.text(),
                         'Failure: failure with message')
    def setUpClass(cls):
        delta = 0.33
        x = np.linspace(0., 15., 100)
        x_offset = np.linspace(delta / 2, 15. + delta / 2, 100)
        x_offset_neg = np.linspace(-delta / 2, 15. - delta / 2, 100)

        testFunction = GausOsc(Frequency=1.5, A=0.22)
        y1 = testFunction(x_offset_neg)
        y2 = testFunction(x_offset)
        y = y1 / 2 + y2 / 2
        ws = CreateWorkspace(x, y)

        convolution = FunctionFactory.createCompositeFunction('Convolution')
        innerFunction = FunctionFactory.createInitialized('name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0')
        deltaFunctions = FunctionFactory.createInitialized(
            '(name=DeltaFunction,Height=0.5,Centre={},ties=(Height=0.5,Centre={});name=DeltaFunction,Height=0.5,'
            'Centre={},ties=(Height=0.5,Centre={}))'.format(
                -delta / 2, -delta / 2, delta / 2, delta / 2))
        convolution.setAttributeValue('FixResolution', False)
        convolution.add(innerFunction)
        convolution.add(deltaFunctions)

        MultiDomainSingleFunction = FunctionFactory.createInitializedMultiDomainFunction(
            'name=GausOsc,A=0.2,Sigma=0.2,Frequency=1,Phi=0', 2)
        MultiDomainConvolutionFunction = FunctionFactory.createInitializedMultiDomainFunction(str(convolution), 2)

        DoublePulseFit(Function=MultiDomainSingleFunction, InputWorkspace=ws, InputWorkspace_1=ws, CreateOutput=True,
                       PulseOffset=delta, StartX=0.0, EndX=15.0, Output='DoublePulseFit', MaxIterations=1)
        Fit(Function=MultiDomainConvolutionFunction, InputWorkspace=ws, InputWorkspace_1=ws, CreateOutput=True,
            StartX=0.0, EndX=15.0, Output='Fit', MaxIterations=1)
Beispiel #3
0
 def test_members_can_be_added(self):
     func = CompositeFunction()
     f1 = FunctionFactory.createInitialized('name=FlatBackground,A0=1')
     f2 = FunctionFactory.createInitialized('name=FlatBackground,A0=2')
     f3 = FunctionFactory.createInitialized('name=FlatBackground,A0=3')
     func.add(f1)
     func.add(f2)
     func.add(f3)
     self.assertEqual(len(func), 3)
     self.assertEqual(str(func[0]), 'name=FlatBackground,A0=1')
     self.assertEqual(str(func[1]), 'name=FlatBackground,A0=2')
     self.assertEqual(str(func[2]), 'name=FlatBackground,A0=3')
 def test_members_can_be_added(self):
     func = CompositeFunction()
     f1 = FunctionFactory.createInitialized('name=FlatBackground,A0=1')
     f2 = FunctionFactory.createInitialized('name=FlatBackground,A0=2')
     f3 = FunctionFactory.createInitialized('name=FlatBackground,A0=3')
     func.add(f1)
     func.add(f2)
     func.add(f3)
     self.assertEqual(len(func), 3)
     self.assertEqual(str(func[0]), 'name=FlatBackground,A0=1')
     self.assertEqual(str(func[1]), 'name=FlatBackground,A0=2')
     self.assertEqual(str(func[2]), 'name=FlatBackground,A0=3')
    def test_handle_asymmetry_mode_correctly_updates_function_for_a_single_fit(self):
        new_workspace_list = ['MUSR22725; Group; top; Asymmetry']
        fit_function = FunctionFactory.createInitialized('name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        fit_function_2 = FunctionFactory.createInitialized('name=GausOsc,A=1.0,Sigma=2.5,Frequency=0.1,Phi=0')
        self.view.function_browser.setFunction(str(fit_function))
        self.presenter.selected_data = new_workspace_list
        self.presenter.model.calculate_tf_function.return_value = fit_function_2

        self.view.tf_asymmetry_mode = True

        self.assertEqual(str(self.view.fit_object), str(fit_function_2))
        self.assertEqual([str(item) for item in self.presenter._fit_function], [str(fit_function_2)])
Beispiel #6
0
    def test_do_sequential_fit_correctly_delegates_to_do_single_fit(self):
        trial_function = FunctionFactory.createInitialized(
            'name = Quadratic, A0 = 0, A1 = 0, A2 = 0')
        self.model.do_single_fit = mock.MagicMock(return_value=(trial_function,
                                                                'success',
                                                                0.56))
        x_data = range(0, 100)
        y_data = [5 + x * x for x in x_data]
        workspace = CreateWorkspace(x_data, y_data)
        parameter_dict = {
            'Function': trial_function,
            'InputWorkspace': [workspace] * 5,
            'Minimizer': 'Levenberg-Marquardt',
            'StartX': [0.0] * 5,
            'EndX': [100.0] * 5,
            'EvaluationType': 'CentrePoint'
        }

        self.model.do_sequential_fit(parameter_dict)

        self.assertEqual(self.model.do_single_fit.call_count, 5)
        self.model.do_single_fit.assert_called_with({
            'Function':
            mock.ANY,
            'InputWorkspace':
            workspace,
            'Minimizer':
            'Levenberg-Marquardt',
            'StartX':
            0.0,
            'EndX':
            100.0,
            'EvaluationType':
            'CentrePoint'
        })
Beispiel #7
0
    def test_handle_sequential_fit_finished_updates_view(self):
        number_of_entries = 3
        fit_functions = [
            FunctionFactory.createInitialized('name=GausOsc,A=0.2,'
                                              'Sigma=0.2,Frequency=0.1,Phi=1')
        ] * number_of_entries
        fit_status = ['Success'] * number_of_entries
        fit_quality = [1.3, 2.4, 1.9]

        self.presenter.fitting_calculation_model = mock.MagicMock()
        self.presenter.fitting_calculation_model.result = (fit_functions,
                                                           fit_status,
                                                           fit_quality)

        self.presenter.handle_seq_fit_finished()

        self.assertEqual(self.view.set_fit_function_parameters.call_count,
                         number_of_entries)
        call_list = [
            mock.call(0, [0.2, 0.2, 0.1, 1]),
            mock.call(1, [0.2, 0.2, 0.1, 1]),
            mock.call(2, [0.2, 0.2, 0.1, 1])
        ]
        self.view.set_fit_function_parameters.assert_has_calls(call_list)

        self.assertEqual(self.view.set_fit_quality.call_count,
                         number_of_entries)
        call_list = [
            mock.call(0, 'Success', fit_quality[0]),
            mock.call(1, 'Success', fit_quality[1]),
            mock.call(2, 'Success', fit_quality[2])
        ]
        self.view.set_fit_quality.assert_has_calls(call_list)

        self.view.seq_fit_button.setEnabled.assert_called_once_with(True)
    def test_convert_function_string_into_dict(self):
        trial_function = FunctionFactory.createInitialized(
            'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')

        name = self.model.get_function_name(trial_function)

        self.assertEqual(name, 'GausOsc')
Beispiel #9
0
 def test_parameters_can_be_set_via_members(self):
     func = FunctionFactory.createInitialized(
         'name=FlatBackground,A0=1;name=FlatBackground,A0=2')
     func[0].setParameter('A0', 10.0)
     func[1].setParameter('A0', 20.0)
     self.assertEqual(func.getParameterValue('f0.A0'), 10.0)
     self.assertEqual(func.getParameterValue('f1.A0'), 20.0)
Beispiel #10
0
    def test_updating_function_parameters_updates_relevant_stored_function_for_simul_fit(
            self):
        self.presenter.selected_data = [
            'MUSR22725; Group; top; Asymmetry',
            'MUSR22725; Group; bottom; Asymmetry',
            'MUSR22725; Group; fwd; Asymmetry'
        ]
        self.view.is_simul_fit = mock.MagicMock(return_value=True)
        fit_function = FunctionFactory.createInitialized(
            'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        multi_domain_function = create_multi_domain_function([fit_function] *
                                                             3)
        self.view.function_browser.setFunction(EXAMPLE_MULTI_DOMAIN_FUNCTION)
        self.view.parameter_display_combo.setCurrentIndex(1)
        self.view.function_browser.setParameter('A', 3)

        self.presenter.handle_function_parameter_changed()

        self.assertEqual(
            str(self.presenter._fit_function[0]),
            'composite=MultiDomainFunction,NumDeriv=true;'
            'name=GausOsc,'
            'A=0.2,Sigma=0.2,Frequency=0.1,Phi=0,'
            '$domains=i;name=GausOsc,A=3,Sigma=0.2,Frequency=0.1,'
            'Phi=0,$domains=i;name=GausOsc,A=0.2,Sigma=0.2,'
            'Frequency=0.1,Phi=0,$domains=i')
    def test_do_single_fit_and_return_functions_correctly(self):
        x_data = range(0, 100)
        y_data = [5 + x * x for x in x_data]
        workspace = CreateWorkspace(x_data, y_data)
        trial_function = FunctionFactory.createInitialized(
            'name = Quadratic, A0 = 0, A1 = 0, A2 = 0')
        parameter_dict = {
            'Function': trial_function,
            'InputWorkspace': workspace,
            'Minimizer': 'Levenberg-Marquardt',
            'StartX': 0.0,
            'EndX': 100.0,
            'EvaluationType': 'CentrePoint'
        }

        output_workspace, parameter_table_name, fitting_function, fit_status, fit_chi_squared, covariance_matrix = self.model.do_single_fit_and_return_workspace_parameters_and_fit_function(
            parameter_dict)

        parameter_table = AnalysisDataService.retrieve(parameter_table_name)

        self.assertAlmostEqual(parameter_table.row(0)['Value'], 5.0)
        self.assertAlmostEqual(parameter_table.row(1)['Value'], 0.0)
        self.assertAlmostEqual(parameter_table.row(2)['Value'], 1.0)
        self.assertEqual(fit_status, 'success')
        self.assertAlmostEqual(fit_chi_squared, 0.0)
    def test_do_sequential_fit_correctly_delegates_to_do_single_fit(self):
        trial_function = FunctionFactory.createInitialized(
            'name = Quadratic, A0 = 0, A1 = 0, A2 = 0')
        self.model.do_single_fit = mock.MagicMock(return_value=(trial_function,
                                                                'success',
                                                                0.56))
        workspace = "MUSR1223"
        parameter_dict = {
            'Function': trial_function,
            'InputWorkspace': workspace,
            'Minimizer': 'Levenberg-Marquardt',
            'StartX': 0.0,
            'EndX': 100.0,
            'EvaluationType': 'CentrePoint'
        }
        self.model.get_parameters_for_single_fit = mock.MagicMock(
            return_value=parameter_dict)
        self.model.do_sequential_fit([workspace] * 5)

        self.assertEqual(self.model.do_single_fit.call_count, 5)
        self.model.do_single_fit.assert_called_with(
            {
                'Function': mock.ANY,
                'InputWorkspace': workspace,
                'Minimizer': 'Levenberg-Marquardt',
                'StartX': 0.0,
                'EndX': 100.0,
                'EvaluationType': 'CentrePoint'
            }, True)
Beispiel #13
0
    def initByName(self, name, *args, **kwargs):
        """
        intialise composite function of named type.
        E.g. "ProductFunction"
        This function would be protected in c++
        and should not be called directly except
        by :meth:`__init__` functions of this class
        and subclasses.

        :param name:   name of class calling this.
        :param args:   names of functions in composite function
        :param kwargs: any parameters or attributes that must be passed to the
                       composite function itself.
        """
        if len(args) == 1 and not isinstance(args[0], FunctionWrapper):
            # We have a composite function to wrap
            self.fun = args[0]
        else:
            self.fun = FunctionFactory.createCompositeFunction(name)

            # Add the functions, checking for Composite & Product functions
            for a in args:
                if not isinstance(a, int):
                    if isinstance(a, CompositeFunctionWrapper):
                        if self.pureAddition:
                            self.pureAddition = a.pureAddition
                        if self.pureMultiplication:
                            self.pureMultiplication = a.pureMultiplication
                    functionToAdd = FunctionFactory.createInitialized(
                        a.fun.__str__())
                    self.fun.add(functionToAdd)
        self.init_paramgeters_and_attributes(**kwargs)
Beispiel #14
0
    def test_when_new_data_is_selected_clear_out_old_fits_and_information(
            self):
        self.presenter._fit_status = ['success', 'success', 'success']
        self.presenter._fit_chi_squared = [12.3, 3.4, 0.35]
        fit_function = FunctionFactory.createInitialized(
            'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        self.presenter_fit_function = [
            fit_function, fit_function, fit_function
        ]
        self.presenter.manual_selection_made = True
        self.presenter._start_x = [0.15, 0.45, 0.67]
        self.presenter._end_x = [0.56, 0.78, 0.34]
        self.view.end_time = 0.56
        self.view.start_time = 0.15
        self.presenter.retrieve_first_good_data_from_run_name = mock.MagicMock(
            return_value=0.15)
        new_workspace_list = [
            'MUSR22725; Group; top; Asymmetry',
            'MUSR22725; Group; bottom; Asymmetry',
            'MUSR22725; Group; fwd; Asymmetry'
        ]

        self.presenter.selected_data = new_workspace_list

        self.assertEqual(self.presenter._fit_status, [None, None, None])
        self.assertEqual(self.presenter._fit_chi_squared, [0.0, 0.0, 0.0])
        self.assertEqual(self.presenter._fit_function, [None, None, None])
        self.assertEqual(self.presenter._selected_data, new_workspace_list)
        self.assertEqual(self.presenter.manual_selection_made, True)
        self.assertEqual(self.presenter.start_x, [0.15, 0.15, 0.15])
        self.assertEqual(self.presenter.end_x, [0.56, 0.56, 0.56])
Beispiel #15
0
    def test_get_function_name_returns_correctly_for_composite_functions(self):
        function_string = 'name=FlatBackground,A0=22.5129;name=Polynomial,n=0,A0=-22.5221;name=ExpDecayOsc,A=-0.172352,Lambda=0.111109,Frequency=-0.280031,Phi=-3.03983'
        function_object = FunctionFactory.createInitialized(function_string)

        name_as_string = self.model.get_function_name(function_object)

        self.assertEqual(name_as_string, 'FlatBackground,Polynomial,ExpDecayOsc')
Beispiel #16
0
    def initByName(self, name, *args, **kwargs):
        """
        intialise composite function of named type.
        E.g. "ProductFunction"
        This function would be protected in c++
        and should not be called directly except
        by :meth:`__init__` functions of this class
        and subclasses.

        :param name:   name of class calling this.
        :param args:   names of functions in composite function
        :param kwargs: any parameters or attributes that must be passed to the
                       composite function itself.
        """
        if len(args) == 1 and  not isinstance(args[0], FunctionWrapper):
            # We have a composite function to wrap
            self.fun = args[0]
        else:
            self.fun = FunctionFactory.createCompositeFunction(name)

            # Add the functions, checking for Composite & Product functions
            for a in args:
                if not isinstance(a, int):
                    if isinstance(a, CompositeFunctionWrapper):
                        if self.pureAddition:
                            self.pureAddition = a.pureAddition
                        if self.pureMultiplication:
                            self.pureMultiplication = a.pureMultiplication
                    functionToAdd = FunctionFactory.createInitialized(a.fun.__str__())
                    self.fun.add(functionToAdd)
        self.init_paramgeters_and_attributes(**kwargs)
Beispiel #17
0
    def test_handle_tf_asymmetry_mode_succesfully_converts_back(self):
        new_workspace_list = [
            'MUSR22725; Group; top; Asymmetry',
            'MUSR22725; Group; bottom; Asymmetry', 'MUSR22725; Group; fwd; fwd'
        ]
        self.presenter.selected_data = new_workspace_list
        self.view.function_browser.setFunction(EXAMPLE_TF_ASYMMETRY_FUNCTION)
        self.view.tf_asymmetry_mode_checkbox.blockSignals(True)
        self.view.tf_asymmetry_mode = True
        self.presenter._tf_asymmetry_mode = True
        self.view.tf_asymmetry_mode_checkbox.blockSignals(False)
        fit_function = FunctionFactory.createInitialized(
            'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        self.presenter.model.calculate_tf_function.return_value = fit_function

        self.view.tf_asymmetry_mode = False

        self.assertEqual(
            [str(item) for item in self.presenter._fit_function], [
                'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0',
                'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0',
                'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0'
            ])
        self.assertEqual(str(self.view.fit_object),
                         'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
    def test_undo_fit_resets_fit_in_view(self):
        self.presenter.selected_data = [
            'MUSR22725; Group; top; Asymmetry',
            'MUSR22725; Group; bottom; Asymmetry',
            'MUSR22725; Group; fwd; Asymmetry'
        ]
        self.view.function_browser.setFunction(
            'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        fit_function = FunctionFactory.createInitialized(
            'name=GausOsc,A=0.5,Sigma=0.5,Frequency=1,Phi=0')
        self.presenter.fitting_calculation_model = mock.MagicMock()
        self.presenter.model.evaluate_single_fit.return_value = (
            fit_function, 'Fit Succeeded', 0.5)
        self.presenter.handle_fit_clicked()
        wait_for_thread(self.presenter.calculation_thread)

        # test fit has updated the function
        self.assertEqual(str(self.presenter._fit_function[0]),
                         'name=GausOsc,A=0.5,Sigma=0.5,Frequency=1,Phi=0')

        self.view.undo_fit_button.clicked.emit(True)

        # test undo fit has worked
        self.assertEqual(str(self.presenter._fit_function[0]),
                         'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
    def test_get_parameters_for_tf_simultaneous_fit_returns_correctly(self):
        workspaces = [["MUSR62260;fwd", "MUSR62260;bwd"],
                      ["MUSR62260;top", "MUSR62260;bot"]]
        trial_function = FunctionFactory.createInitialized(
            EXAMPLE_TF_ASYMMETRY_FUNCTION)
        un_normalised_workspace_names = [
            '__MUSR62260; Group; fwd; Asymmetry_unnorm',
            '__MUSR22725; Group; bwd; Asymmetry_unnorm'
        ]
        fit_functions = [trial_function, trial_function.clone()]
        self.setup_multi_fit_workspace_map(workspaces, fit_functions)
        self.model.context.group_pair_context.get_unormalisised_workspace_list = mock.MagicMock(
            return_value=un_normalised_workspace_names)

        result = self.model.get_parameters_for_simultaneous_tf_fit(
            workspaces[1])

        self.assertEqual(
            result, {
                'InputFunction': fit_functions[1],
                'Minimizer': MINIMISER,
                'OutputFitWorkspace': mock.ANY,
                'ReNormalizedWorkspaceList': workspaces[1],
                'StartX': START_X,
                'EndX': END_X,
                'UnNormalizedWorkspaceList': un_normalised_workspace_names
            })
    def test_handle_fit_with_tf_asymmetry_mode_calls_CalculateMuonAsymmetry(
            self):
        self.presenter.model.get_function_name.return_value = 'GausOsc'
        self.presenter.handle_finished = mock.MagicMock()
        new_workspace_list = ['MUSR22725; Group; top; Asymmetry']
        fit_function = FunctionFactory.createInitialized(
            'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        fit_function_2 = FunctionFactory.createInitialized(
            EXAMPLE_TF_ASYMMETRY_FUNCTION)
        self.view.function_browser.setFunction(str(fit_function))
        self.presenter.selected_data = new_workspace_list
        self.presenter.model.convert_to_tf_function.return_value = fit_function_2
        self.view.tf_asymmetry_mode = True
        self.presenter.handle_fit_clicked()
        wait_for_thread(self.presenter.calculation_thread)

        self.assertEqual(self.presenter.handle_finished.call_count, 1)
 def test_parameters_can_be_get_and_set(self):
     func = FunctionFactory.createInitialized('name=FlatBackground,A0=1;name=FlatBackground,A0=2')
     self.assertEqual(func.getParameterValue('f0.A0'), 1.0)
     self.assertEqual(func.getParameterValue('f1.A0'), 2.0)
     func.setParameter('f0.A0', 10.0)
     self.assertEqual(func.getParameterValue('f0.A0'), 10.0)
     func.setParameter('f1.A0', 20.0)
     self.assertEqual(func.getParameterValue('f1.A0'), 20.0)
Beispiel #22
0
    def test_get_function_name_does_truncate_for_exactly_four_members(self):
        function_string = 'name=ExpDecayOsc,A=-5.87503,Lambda=0.0768409,Frequency=0.0150173,Phi=-1.15833;name=GausDecay,' \
                          'A=-1.59276,Sigma=0.361339;name=ExpDecayOsc,A=-5.87503,Lambda=0.0768409,Frequency=0.0150173,' \
                          'Phi=-1.15833;name=ExpDecayMuon,A=-0.354664,Lambda=-0.15637'
        function_object = FunctionFactory.createInitialized(function_string)

        name_as_string = self.model.get_function_name(function_object)

        self.assertEqual(name_as_string, 'ExpDecayOsc,GausDecay,ExpDecayOsc,...')
    def test_undo_fit_button_disabled_until_a_succesful_fit_is_performed(self):
        self.assertEqual(self.view.undo_fit_button.isEnabled(), False)
        self.view.function_browser.setFunction('name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        fit_function = FunctionFactory.createInitialized('name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        self.presenter.fitting_calculation_model = mock.MagicMock()
        self.presenter.fitting_calculation_model.result = (fit_function, 'Success', 1.07)

        self.presenter.handle_finished()

        self.assertEqual(self.view.undo_fit_button.isEnabled(), True)
    def test_get_parameters_for_tf_function_calculation_for_turning_mode_off(self):
        new_workspace_list = ['MUSR22725; Group; top; Asymmetry', 'MUSR22725; Group; bottom; Asymmetry',
                              'MUSR22725; Group; fwd; Asymmetry']
        fit_function = FunctionFactory.createInitialized('name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        self.presenter.selected_data = new_workspace_list

        result = self.presenter.get_parameters_for_tf_function_calculation(fit_function)

        self.assertEqual(result, {'InputFunction': fit_function, 'WorkspaceList': [new_workspace_list[0]],
                                  'Mode': 'Extract'})
Beispiel #25
0
    def test_handle_single_fit_does_nothing_if_no_fit_selected(
            self, mock_function_tools):
        fit_function = FunctionFactory.createInitialized(
            'name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        self.model.fit_function = fit_function
        self.view.get_selected_row = mock.MagicMock(return_value=-1)

        self.presenter.handle_single_fit_requested()

        mock_function_tools.partial.assert_not_called()
    def test_create_parameter_table_name(self):
        input_workspace_name = 'MUSR22725; Group; top; Asymmetry; #1'
        trial_function = FunctionFactory.createInitialized('name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        expected_directory_name = 'Muon Data/Fitting Output/'
        expected_workspace_name = 'MUSR22725; Group; top; Asymmetry; #1; Fitted Parameters; GausOsc'

        name, directory = self.model.create_parameter_table_name(input_workspace_name, trial_function)

        self.assertEqual(name, expected_workspace_name)
        self.assertEqual(directory, expected_directory_name)
Beispiel #27
0
    def test_get_function_name_truncates_function_with_more_than_three_composite_members(self):
        function_string = 'name=ExpDecayOsc,A=-5.87503,Lambda=0.0768409,Frequency=0.0150173,Phi=-1.15833;name=GausDecay,' \
                          'A=-1.59276,Sigma=0.361339;name=ExpDecayOsc,A=-5.87503,Lambda=0.0768409,Frequency=0.0150173,' \
                          'Phi=-1.15833;name=ExpDecayMuon,A=-0.354664,Lambda=-0.15637;name=DynamicKuboToyabe,' \
                          'BinWidth=0.050000000000000003,Asym=7.0419,Delta=0.797147,Field=606.24,Nu=2.67676e-09'
        function_object = FunctionFactory.createInitialized(function_string)

        name_as_string = self.model.get_function_name(function_object)

        self.assertEqual(name_as_string, 'ExpDecayOsc,GausDecay,ExpDecayOsc,...')
Beispiel #28
0
    def test_do_sequential_fit_uses_previous_values_if_requested(self):
        workspace_list = ["MUSR62260;bwd", "MUSR62260;fwd"]
        self.model.tf_asymmetry_mode = False
        use_initial_values = False
        self.model.set_fit_function_parameter_values = mock.MagicMock()
        trial_function_in = FunctionFactory.createInitialized(
            'name = Quadratic, A0 = 0, A1 = 0, A2 = 0')
        trial_function_out = FunctionFactory.createInitialized(
            'name = Quadratic, A0 = 5, A1 = 5, A2 = 5')
        self.model.do_single_fit = mock.MagicMock(
            return_value=(trial_function_out, 'success', 0.56))
        parameter_dict = {'Function': trial_function_in}
        self.model.get_parameters_for_single_fit = mock.MagicMock(
            return_value=parameter_dict)

        self.model.do_sequential_fit(workspace_list, use_initial_values)

        self.model.set_fit_function_parameter_values.assert_called_once_with(
            trial_function_in, [5, 5, 5])
    def _setup_test_fit_function(self, values):
        self.presenter.fitting_calculation_model = mock.MagicMock()
        self.model.get_fit_function_parameter_values = mock.MagicMock(return_value=values)
        fit_function = FunctionFactory.createInitialized(f"name=GausOsc,A={values[0]},Sigma={values[1]},"
                                                         f"Frequency={values[2]},Phi={values[3]}")
        self.model.fit_function = fit_function
        self.model.get_ws_fit_function = mock.MagicMock(return_value=fit_function)
        self.model.get_fit_function_parameter_values = mock.MagicMock(return_value=values)

        return fit_function
 def test_nested_functions(self):
     s = 'name=FlatBackground,A0=1;(name=FlatBackground,A0=2;name=FlatBackground,A0=3)'
     func = FunctionFactory.createInitialized(s)
     self.assertEqual(len(func), 2)
     self.assertFalse(isinstance(func[0], CompositeFunction))
     self.assertTrue(isinstance(func[1], CompositeFunction))
     self.assertEqual(len(func[1]), 2)
     self.assertEqual(func.getParameterValue('f0.A0'), 1.0)
     self.assertEqual(func.getParameterValue('f1.f0.A0'), 2.0)
     self.assertEqual(func.getParameterValue('f1.f1.A0'), 3.0)
     self.assertEqual(func.nParams(), 3)
Beispiel #31
0
 def test_nested_functions(self):
     s = 'name=FlatBackground,A0=1;(name=FlatBackground,A0=2;name=FlatBackground,A0=3)'
     func = FunctionFactory.createInitialized(s)
     self.assertEqual(len(func), 2)
     self.assertFalse(isinstance(func[0], CompositeFunction))
     self.assertTrue(isinstance(func[1], CompositeFunction))
     self.assertEqual(len(func[1]), 2)
     self.assertEqual(func.getParameterValue('f0.A0'), 1.0)
     self.assertEqual(func.getParameterValue('f1.f0.A0'), 2.0)
     self.assertEqual(func.getParameterValue('f1.f1.A0'), 3.0)
     self.assertEqual(func.nParams(), 3)
    def test_handle_asymmetry_mode_changed_reverts_changed_and_shows_error_if_non_group_selected(self):
        new_workspace_list = ['MUSR22725; Group; top; Asymmetry', 'MUSR22725; Group; bottom; Asymmetry',
                              'MUSR22725; Pair; fwd; Long']
        fit_function = FunctionFactory.createInitialized('name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        self.view.function_browser.setFunction(str(fit_function))
        self.presenter.selected_data = new_workspace_list

        self.view.tf_asymmetry_mode = True

        self.view.warning_popup.assert_called_once_with(
            'Can only fit groups in tf asymmetry mode and need a function defined')
    def test_after_fit_fit_cache_is_populated(self):
        self.presenter.selected_data = ['MUSR22725; Group; top; Asymmetry', 'MUSR22725; Group; bottom; Asymmetry',
                                        'MUSR22725; Group; fwd; Asymmetry']
        self.view.function_browser.setFunction('name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0')
        fit_function = FunctionFactory.createInitialized('name=GausOsc,A=0.5,Sigma=0.5,Frequency=1,Phi=0')
        self.presenter.fitting_calculation_model = mock.MagicMock()
        self.presenter.model.do_single_fit.return_value = (fit_function,'Fit Suceeded', 0.5)

        self.presenter.handle_fit_clicked()
        wait_for_thread(self.presenter.calculation_thread)

        self.assertEqual([str(item) for item in self.presenter._fit_function_cache], ['name=GausOsc,A=0.2,Sigma=0.2,Frequency=0.1,Phi=0'] * 3)
    def test_get_ws_fit_function_returns_correct_function_for_single_fit(self):
        workspace = ["MUSR62260;fwd"]
        trial_function_1 = FunctionFactory.createInitialized(
            'name = Quadratic, A0 = 0, A1 = 0, A2 = 0')
        trial_function_2 = trial_function_1.clone()
        self.model.ws_fit_function_map = {
            "MUSR62260;bwd": trial_function_1,
            "MUSR62260;fwd": trial_function_2
        }

        return_function = self.model.get_ws_fit_function(workspace)

        self.assertEqual(return_function, trial_function_2)
 def test_instance_can_be_created_from_factory(self):
     func = FunctionFactory.createInitialized('name=FlatBackground;name=FlatBackground')
     self.assertTrue(isinstance(func, CompositeFunction))
     self.assertEqual(len(func), 2)
     self.assertEqual(func.nParams(), 2)