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)
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)])
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' })
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')
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)
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)
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)
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])
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')
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)
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)
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'})
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)
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,...')
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)
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)