def setUp(self): AnalysisDataService.clear() self.filepath = FileFinder.findRuns('EMU00019489.nxs')[0] self.load_result, self.run_number, self.filename = load_workspace_from_filename( self.filepath) self.loaded_data = MuonLoadData() self.data_context = MuonDataContext(self.loaded_data) self.gui_context = MuonGuiContext() self.group_pair_context = MuonGroupPairContext() self.gui_context.update({'RebinType': 'None'}) self.context = MuonContext(muon_data_context=self.data_context, muon_gui_context=self.gui_context, muon_group_context=self.group_pair_context) self.data_context.instrument = 'EMU' self.loaded_data.add_data(workspace=self.load_result, run=[self.run_number], filename=self.filename, instrument='EMU') self.data_context.current_runs = [[self.run_number]] self.data_context.update_current_data() self.group_pair_context.reset_group_and_pairs_to_default( self.load_result['OutputWorkspace'][0]._workspace, 'EMU', '')
def setup_context_for_tests(parent_object): parent_object.loaded_data = MuonLoadData() parent_object.loaded_data.get_main_field_direction = mock.MagicMock( return_value='transverse') parent_object.data_context = MuonDataContext( load_data=parent_object.loaded_data) parent_object.gui_context = MuonGuiContext() parent_object.group_context = MuonGroupPairContext( parent_object.data_context.check_group_contains_valid_detectors) parent_object.corrections_context = CorrectionsContext( parent_object.loaded_data) parent_object.phase_table_context = PhaseTableContext() parent_object.fitting_context = TFAsymmetryFittingContext( allow_double_pulse_fitting=True) parent_object.results_context = ResultsContext() parent_object.plot_panes_context = PlotPanesContext() parent_object.model_fitting_context = ModelFittingContext() parent_object.context = DataAnalysisContext( muon_data_context=parent_object.data_context, muon_group_context=parent_object.group_context, muon_gui_context=parent_object.gui_context, muon_phase_context=parent_object.phase_table_context, corrections_context=parent_object.corrections_context, fitting_context=parent_object.fitting_context, results_context=parent_object.results_context, model_fitting_context=parent_object.model_fitting_context, plot_panes_context=parent_object.plot_panes_context)
def setUp(self): self._qapp = mock_widget.mockQapp() # Store an empty widget to parent all the views, and ensure they are deleted correctly self.obj = QtGui.QWidget() self.loaded_data = MuonLoadData() self.data_context = MuonDataContext(self.loaded_data) self.gui_context = MuonGuiContext() self.group_context = MuonGroupPairContext(self.data_context.check_group_contains_valid_detectors) self.context = MuonContext(muon_data_context=self.data_context, muon_group_context=self.group_context, muon_gui_context=self.gui_context) self.model = GroupingTabModel(context=self.context) self.grouping_table_view = GroupingTableView(parent=self.obj) self.grouping_table_widget = GroupingTablePresenter(self.grouping_table_view, self.model) self.pairing_table_view = PairingTableView(parent=self.obj) self.pairing_table_widget = PairingTablePresenter(self.pairing_table_view, self.model) self.add_three_groups() self.add_two_pairs() self.view = GroupingTabView(self.grouping_table_view, self.pairing_table_view, parent=self.obj) self.presenter = GroupingTabPresenter(self.view, self.model, self.grouping_table_widget, self.pairing_table_widget) self.presenter.create_update_thread = mock.MagicMock(return_value=mock.MagicMock()) self.view.display_warning_box = mock.MagicMock() self.grouping_table_view.warning_popup = mock.MagicMock() self.pairing_table_view.warning_popup = mock.MagicMock()
def setup_context(freq=False): loaded_data = MuonLoadData() loaded_data.get_main_field_direction = mock.MagicMock( return_value='transverse') data_context = MuonDataContext(load_data=loaded_data) gui_context = MuonGuiContext() group_context = MuonGroupPairContext( data_context.check_group_contains_valid_detectors) corrections_context = CorrectionsContext(loaded_data) phase_table_context = PhaseTableContext() freq_context = FrequencyContext() plot_panes_context = PlotPanesContext() if freq: return FrequencyDomainAnalysisContext( muon_data_context=data_context, muon_group_context=group_context, muon_gui_context=gui_context, muon_phase_context=phase_table_context, corrections_context=corrections_context, fitting_context=BasicFittingContext( allow_double_pulse_fitting=True), frequency_context=freq_context, plot_panes_context=plot_panes_context) else: return DataAnalysisContext(muon_data_context=data_context, muon_group_context=group_context, muon_gui_context=gui_context, corrections_context=corrections_context, muon_phase_context=phase_table_context, fitting_context=TFAsymmetryFittingContext( allow_double_pulse_fitting=True), results_context=ResultsContext(), model_fitting_context=ModelFittingContext(), plot_panes_context=plot_panes_context)
def setup_context(freq=False): loaded_data = MuonLoadData() loaded_data.get_main_field_direction = mock.MagicMock( return_value='transverse') data_context = MuonDataContext(load_data=loaded_data) gui_context = MuonGuiContext() group_context = MuonGroupPairContext( data_context.check_group_contains_valid_detectors) phase_table_context = PhaseTableContext() fitting_context = FittingContext() freq_context = FrequencyContext() if freq: return FrequencyDomainAnalysisContext( muon_data_context=data_context, muon_group_context=group_context, muon_gui_context=gui_context, muon_phase_context=phase_table_context, fitting_context=fitting_context, frequency_context=freq_context) else: return DataAnalysisContext(muon_data_context=data_context, muon_group_context=group_context, muon_gui_context=gui_context, muon_phase_context=phase_table_context, fitting_context=fitting_context)
def __init__(self, muon_data_context=MuonDataContext(), muon_gui_context=MuonGuiContext(), muon_group_context=MuonGroupPairContext(), base_directory='Muon Data', muon_phase_context= PhaseTableContext()): self._data_context = muon_data_context self._gui_context = muon_gui_context self._group_pair_context = muon_group_context self._phase_context = muon_phase_context self.base_directory = base_directory self.gui_context.update({'DeadTimeSource': 'None', 'LastGoodDataFromFile': True, 'selected_group_pair': ''})
def setup_context_for_tests(parent_object): parent_object.loaded_data = MuonLoadData() parent_object.loaded_data.get_main_field_direction = mock.MagicMock(return_value='transverse') parent_object.data_context = MuonDataContext(load_data=parent_object.loaded_data) parent_object.gui_context = MuonGuiContext() parent_object.group_context = MuonGroupPairContext(parent_object.data_context.check_group_contains_valid_detectors) parent_object.phase_table_context = PhaseTableContext() parent_object.fitting_context = FittingContext() parent_object.context = MuonContext(muon_data_context=parent_object.data_context, muon_group_context=parent_object.group_context, muon_gui_context=parent_object.gui_context, muon_phase_context=parent_object.phase_table_context, fitting_context=parent_object.fitting_context)
def setup_context(): loaded_data = MuonLoadData() loaded_data.get_main_field_direction = mock.MagicMock( return_value='transverse') data_context = MuonDataContext(loaded_data) gui_context = MuonGuiContext() group_context = MuonGroupPairContext( data_context.check_group_contains_valid_detectors) phase_table_context = PhaseTableContext() return MuonContext(muon_data_context=data_context, muon_group_context=group_context, muon_gui_context=gui_context, muon_phase_context=phase_table_context)
def setUp(self): self._qapp = mock_widget.mockQapp() # Store an empty widget to parent all the views, and ensure they are deleted correctly self.obj = QtGui.QWidget() self.loaded_data = MuonLoadData() self.data_context = MuonDataContext(self.loaded_data) self.gui_context = MuonGuiContext() self.group_context = MuonGroupPairContext( self.data_context.check_group_contains_valid_detectors) self.context = MuonContext(muon_data_context=self.data_context, muon_group_context=self.group_context, muon_gui_context=self.gui_context) self.model = GroupingTabModel(context=self.context) self.grouping_table_view = GroupingTableView(parent=self.obj) self.grouping_table_widget = GroupingTablePresenter( self.grouping_table_view, self.model) self.pairing_table_view = PairingTableView(parent=self.obj) self.pairing_table_widget = PairingTablePresenter( self.pairing_table_view, self.model) self.add_three_groups() self.add_two_pairs() self.view = GroupingTabView(self.grouping_table_view, self.pairing_table_view, parent=self.obj) self.presenter = GroupingTabPresenter(self.view, self.model, self.grouping_table_widget, self.pairing_table_widget) self.presenter.create_update_thread = mock.MagicMock( return_value=mock.MagicMock()) self.view.display_warning_box = mock.MagicMock() self.grouping_table_view.warning_popup = mock.MagicMock() self.pairing_table_view.warning_popup = mock.MagicMock()
def setUp(self): AnalysisDataService.clear() self.filepath = FileFinder.findRuns('EMU00019489.nxs')[0] self.load_result, self.run_number, self.filename = load_workspace_from_filename(self.filepath) self.loaded_data = MuonLoadData() self.data_context = MuonDataContext(self.loaded_data) self.gui_context = MuonGuiContext() self.group_pair_context = MuonGroupPairContext() self.gui_context.update({'RebinType': 'None'}) self.context = MuonContext(muon_data_context=self.data_context, muon_gui_context=self.gui_context, muon_group_context=self.group_pair_context) self.data_context.instrument = 'EMU' self.loaded_data.add_data(workspace=self.load_result, run=[self.run_number], filename=self.filename, instrument='EMU') self.data_context.current_runs = [[self.run_number]] self.data_context.update_current_data() self.group_pair_context.reset_group_and_pairs_to_default(self.load_result['OutputWorkspace'][0]._workspace, 'EMU', '')
class MuonGroupPairContextTest(unittest.TestCase): def setUp(self): self.context = MuonGroupPairContext() def test_can_be_created(self): self.assertTrue(self.context) def test_groups_and_pairs_initially_empty(self): self.assertEqual(self.context.groups, []) self.assertEqual(self.context.pairs, []) def test_group_can_be_added(self): group = MuonGroup('group_1', [1,3,5,7,9]) self.context.add_group(group) self.assertEqual(self.context['group_1'], group) def test_non_group_cannot_be_added(self): pair = MuonPair('pair_1') self.assertRaises(AssertionError, self.context.add_group, pair) def test_cannot_add_group_with_duplicate_name(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_1', [1, 3, 5, 7, 9]) self.context.add_group(group_1) self.assertRaises(ValueError, self.context.add_group, group_2) def test_pair_can_be_added(self): pair = MuonPair('pair_1') self.context.add_pair(pair) self.assertEqual(self.context['pair_1'], pair) def test_non_pair_cannot_be_added(self): pair = MuonPair('pair_1') self.assertRaises(AssertionError, self.context.add_group, pair) def test_cannot_add_pair_with_duplicate_name(self): pair_1 = MuonPair('pair') pair_2 = MuonPair('pair') self.context.add_pair(pair_1) self.assertRaises(ValueError, self.context.add_pair, pair_2) def test_show_adds_group_or_pair_to_ADS(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) pair = MuonPair('pair_1') group_1.show = mock.MagicMock() pair.show = mock.MagicMock() self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_pair(pair) self.context.show('group_1', [12345]) self.context.show('pair_1', [12345]) group_1.show.assert_called_once_with(str([12345])) pair.show.assert_called_once_with(str([12345])) def test_group_names_returns_ordered_list_of_names(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_3) self.context.add_group(group_2) self.assertEquals(self.context.group_names, ['group_1', 'group_3', 'group_2']) def test_pair_names_returns_ordered_list_of_names(self): pair_1 = MuonPair('pair_1') pair_2 = MuonPair('pair_2') pair_3 = MuonPair('pair_3') self.context.add_pair(pair_1) self.context.add_pair(pair_2) self.context.add_pair(pair_3) self.assertEquals(self.context.pair_names, ['pair_1', 'pair_2', 'pair_3']) def test_can_remove_groups_as_expected(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) self.context.remove_group('group_1') self.assertEquals(self.context.group_names, ['group_2', 'group_3']) def test_can_remove_pairs_as_expected(self): pair_1 = MuonPair('pair_1') pair_2 = MuonPair('pair_2') pair_3 = MuonPair('pair_3') self.context.add_pair(pair_1) self.context.add_pair(pair_2) self.context.add_pair(pair_3) self.context.remove_pair('pair_2') self.assertEquals(self.context.pair_names, ['pair_1', 'pair_3'])
def __init__(self, parent=None): super(FrequencyAnalysisGui, self).__init__(parent) self.setFocusPolicy(QtCore.Qt.StrongFocus) try: check_facility() except AttributeError as error: self.warning_popup(error.args[0]) # initialise the data storing classes of the interface self.loaded_data = MuonLoadData() self.data_context = MuonDataContext(self.loaded_data) self.gui_context = MuonGuiContext() self.group_pair_context = MuonGroupPairContext( self.data_context.check_group_contains_valid_detectors) self.phase_context = PhaseTableContext() self.context = MuonContext(muon_data_context=self.data_context, muon_gui_context=self.gui_context, muon_group_context=self.group_pair_context, muon_phase_context=self.phase_context) # construct all the widgets. self.load_widget = LoadWidget(self.loaded_data, self.context, self) self.grouping_tab_widget = GroupingTabWidget(self.context) self.home_tab = HomeTabWidget(self.context, self) self.phase_tab = PhaseTabWidget(self.context, self) self.transform = TransformWidget(self.context, FFTWidget, MaxEntWidget, parent=self) self.setup_tabs() self.help_widget = HelpWidget("Frequency Domain Analysis") central_widget = QtWidgets.QWidget() vertical_layout = QtWidgets.QVBoxLayout() vertical_layout.addWidget(self.load_widget.load_widget_view) vertical_layout.addWidget(self.tabs) vertical_layout.addWidget(self.help_widget.view) central_widget.setLayout(vertical_layout) self.setCentralWidget(central_widget) self.setWindowTitle("Frequency Domain Analysis") self.setup_load_observers() self.setup_gui_variable_observers() self.setup_alpha_recalculated_observers() self.setup_grouping_changed_observers() self.setup_instrument_changed_notifier() self.setup_group_calculation_enable_notifer() self.setup_group_calculation_disabler_notifer() self.setup_on_load_enabler() self.setup_on_load_disabler() self.setup_phase_quad_changed_notifer() self.setup_phase_table_changed_notifier() self.context.data_context.message_notifier.add_subscriber( self.grouping_tab_widget.group_tab_presenter.message_observer)
def __init__(self, parent=None): super(MuonAnalysisGui, self).__init__(parent) self.setFocusPolicy(QtCore.Qt.StrongFocus) try: check_facility() except AttributeError as error: self.warning_popup(error.args[0]) # initialise the data storing classes of the interface self.loaded_data = MuonLoadData() self.data_context = MuonDataContext('Muon Data', self.loaded_data) self.gui_context = MuonGuiContext() self.group_pair_context = MuonGroupPairContext( self.data_context.check_group_contains_valid_detectors) self.phase_context = PhaseTableContext() self.fitting_context = FittingContext() self.context = MuonContext(muon_data_context=self.data_context, muon_gui_context=self.gui_context, muon_group_context=self.group_pair_context, muon_phase_context=self.phase_context, fitting_context=self.fitting_context, workspace_suffix=' MA') # create the dockable widget self.dockable_plot_widget = PlottingWidget(self.context) self.dockable_plot_widget_window = PlottingDockWidget( parent=self, plotting_widget=self.dockable_plot_widget.view) self.dockable_plot_widget_window.setMinimumWidth(575) # # add dock widget to main Muon analysis window self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dockable_plot_widget_window) # set up other widgets self.load_widget = LoadWidget(self.loaded_data, self.context, self) self.home_tab = HomeTabWidget(self.context, self) self.grouping_tab_widget = GroupingTabWidget(self.context) self.phase_tab = PhaseTabWidget(self.context, self) self.fitting_tab = FittingTabWidget(self.context, self) self.seq_fitting_tab = SeqFittingTabWidget( self.context, self.fitting_tab.fitting_tab_model, self) self.results_tab = ResultsTabWidget(self.context.fitting_context, self.context, self) self.setup_tabs() self.help_widget = HelpWidget("Muon Analysis 2") central_widget = QtWidgets.QWidget() vertical_layout = QtWidgets.QVBoxLayout() vertical_layout.addWidget(self.load_widget.load_widget_view) vertical_layout.addWidget(self.tabs) vertical_layout.addWidget(self.help_widget.view) central_widget.setLayout(vertical_layout) self.setCentralWidget(central_widget) self.setWindowTitle(self.context.window_title) self.setup_load_observers() self.setup_gui_variable_observers() self.setup_grouping_changed_observers() self.setup_instrument_changed_notifier() self.setup_group_calculation_enable_notifier() self.setup_group_calculation_disabler_notifier() self.setup_on_load_enabler() self.setup_on_load_disabler() self.setup_phase_quad_changed_notifier() self.setup_phase_table_changed_notifier() self.setup_fitting_notifier() self.setup_on_recalulation_finished_notifier() self.context.data_context.message_notifier.add_subscriber( self.grouping_tab_widget.group_tab_presenter.message_observer)
def setUp(self): self.context = MuonGroupPairContext()
class MuonGroupPairContextTest(unittest.TestCase): def setUp(self): self.context = MuonGroupPairContext() def test_can_be_created(self): self.assertTrue(self.context) def test_groups_and_pairs_initially_empty(self): self.assertEqual(self.context.groups, []) self.assertEqual(self.context.pairs, []) def test_group_can_be_added(self): group = MuonGroup('group_1', [1, 3, 5, 7, 9]) self.context.add_group(group) self.assertEqual(self.context['group_1'], group) def test_non_group_cannot_be_added(self): pair = MuonPair('pair_1') self.assertRaises(AssertionError, self.context.add_group, pair) def test_cannot_add_group_with_duplicate_name(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_1', [1, 3, 5, 7, 9]) self.context.add_group(group_1) self.assertRaises(ValueError, self.context.add_group, group_2) def test_pair_can_be_added(self): pair = MuonPair('pair_1') self.context.add_pair(pair) self.assertEqual(self.context['pair_1'], pair) def test_non_pair_cannot_be_added(self): pair = MuonPair('pair_1') self.assertRaises(AssertionError, self.context.add_group, pair) def test_cannot_add_pair_with_duplicate_name(self): pair_1 = MuonPair('pair') pair_2 = MuonPair('pair') self.context.add_pair(pair_1) self.assertRaises(ValueError, self.context.add_pair, pair_2) def test_show_adds_group_or_pair_to_ADS(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) pair = MuonPair('pair_1') group_1.show = mock.MagicMock() pair.show = mock.MagicMock() self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_pair(pair) self.context.show('group_1', [12345]) self.context.show('pair_1', [12345]) group_1.show.assert_called_once_with(str([12345])) pair.show.assert_called_once_with(str([12345])) def test_group_names_returns_ordered_list_of_names(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_3) self.context.add_group(group_2) self.assertEqual(self.context.group_names, ['group_1', 'group_3', 'group_2']) def test_pair_names_returns_ordered_list_of_names(self): pair_1 = MuonPair('pair_1') pair_2 = MuonPair('pair_2') pair_3 = MuonPair('pair_3') self.context.add_pair(pair_1) self.context.add_pair(pair_2) self.context.add_pair(pair_3) self.assertEqual(self.context.pair_names, ['pair_1', 'pair_2', 'pair_3']) def test_can_remove_groups_as_expected(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) self.context.remove_group('group_1') self.assertEqual(self.context.group_names, ['group_2', 'group_3']) def test_can_remove_pairs_as_expected(self): pair_1 = MuonPair('pair_1') pair_2 = MuonPair('pair_2') pair_3 = MuonPair('pair_3') self.context.add_pair(pair_1) self.context.add_pair(pair_2) self.context.add_pair(pair_3) self.context.remove_pair('pair_2') self.assertEqual(self.context.pair_names, ['pair_1', 'pair_3']) def test_get_group_workspace_names_returns_correct_workspace_names(self): group = create_group_populated_by_two_workspace() self.context.add_group(group) workspace_list = self.context.get_group_workspace_names([[33333]], ['group1'], False) self.assertEqual(workspace_list, ['asymmetry_name_33333'])
class MuonContextTest(unittest.TestCase): @classmethod def setUpClass(cls): pass def setUp(self): AnalysisDataService.clear() self.filepath = FileFinder.findRuns('EMU00019489.nxs')[0] self.load_result, self.run_number, self.filename = load_workspace_from_filename(self.filepath) self.loaded_data = MuonLoadData() self.data_context = MuonDataContext(self.loaded_data) self.gui_context = MuonGuiContext() self.group_pair_context = MuonGroupPairContext() self.gui_context.update({'RebinType': 'None'}) self.context = MuonContext(muon_data_context=self.data_context, muon_gui_context=self.gui_context, muon_group_context=self.group_pair_context) self.data_context.instrument = 'EMU' self.loaded_data.add_data(workspace=self.load_result, run=[self.run_number], filename=self.filename, instrument='EMU') self.data_context.current_runs = [[self.run_number]] self.data_context.update_current_data() self.group_pair_context.reset_group_and_pairs_to_default(self.load_result['OutputWorkspace'][0]._workspace, 'EMU', '') def test_reset_groups_and_pairs_to_default(self): self.assertEquals(self.group_pair_context.group_names, ['fwd', 'bwd']) self.assertEquals(self.group_pair_context.pair_names, ['long']) def test_calculate_group_calculates_group_for_given_run(self): counts_workspace, asymmetry_workspace = self.context.calculate_group('fwd', run=[19489]) self.assertEquals(type(counts_workspace), Workspace2D) self.assertEquals(type(counts_workspace), Workspace2D) def test_calculate_pair_calculates_pair_for_given_run(self): pair_asymmetry = self.context.calculate_pair('long', run=[19489]) self.assertEquals(type(pair_asymmetry), Workspace2D) def test_show_all_groups_calculates_and_shows_all_groups(self): self.context.show_all_groups() self.assertEquals(AnalysisDataService.getObjectNames(), ['EMU19489', 'EMU19489 Groups', 'EMU19489; Group; bwd; Asymmetry; #1', 'EMU19489; Group; bwd; Counts; #1', 'EMU19489; Group; fwd; Asymmetry; #1', 'EMU19489; Group; fwd; Counts; #1', 'Muon Data']) def test_that_show_all_calculates_and_shows_all_groups_with_rebin(self): self.gui_context['RebinType'] = 'Fixed' self.gui_context['RebinFixed'] = 2 self.context.show_all_groups() self.assertEquals(AnalysisDataService.getObjectNames(), ['EMU19489', 'EMU19489 Groups', 'EMU19489; Group; bwd; Asymmetry; #1', 'EMU19489; Group; bwd; Asymmetry; Rebin; #1', 'EMU19489; Group; bwd; Counts; #1', 'EMU19489; Group; bwd; Counts; Rebin; #1', 'EMU19489; Group; fwd; Asymmetry; #1', 'EMU19489; Group; fwd; Asymmetry; Rebin; #1', 'EMU19489; Group; fwd; Counts; #1', 'EMU19489; Group; fwd; Counts; Rebin; #1', 'Muon Data']) def test_show_all_pairs_calculates_and_shows_all_pairs(self): self.context.show_all_pairs() self.assertEquals(AnalysisDataService.getObjectNames(), ['EMU19489', 'EMU19489 Pairs', 'EMU19489; Pair Asym; long; #1', 'Muon Data']) def test_that_show_all_calculates_and_shows_all_pairs_with_rebin(self): self.gui_context['RebinType'] = 'Fixed' self.gui_context['RebinFixed'] = 2 self.context.show_all_pairs() self.assertEquals(AnalysisDataService.getObjectNames(), ['EMU19489', 'EMU19489 Pairs', 'EMU19489; Pair Asym; long; #1', 'EMU19489; Pair Asym; long; Rebin; #1', 'Muon Data']) def test_update_current_data_sets_current_run_in_data_context(self): self.context.update_current_data() self.assertEquals(self.data_context.current_data, self.load_result) def test_update_current_data_sets_groups_and_pairs(self): self.context.update_current_data() self.assertEquals(self.group_pair_context.pair_names, ['long']) self.assertEquals(self.group_pair_context.group_names, ['fwd', 'bwd']) def test_show_raw_data_puts_raw_data_into_the_ADS(self): self.context.show_raw_data() self.assertEquals(AnalysisDataService.getObjectNames(), ['EMU19489', 'EMU19489 Raw Data', 'EMU19489_raw_data', 'Muon Data']) def test_that_first_good_data_returns_correctly_when_from_file_chosen_option(self): self.gui_context.update({'FirstGoodDataFromFile': True}) first_good_data = self.context.first_good_data([19489]) self.assertEquals(first_good_data, 0.11) def test_first_good_data_returns_correctly_when_manually_specified_used(self): self.gui_context.update({'FirstGoodDataFromFile': False, 'FirstGoodData': 5}) first_good_data = self.context.first_good_data([19489]) self.assertEquals(first_good_data, 5) def test_that_last_good_data_returns_correctly_when_from_file_chosen_option(self): self.gui_context.update({'LastGoodDataFromFile': True}) last_good_data = self.context.last_good_data([19489]) self.assertEquals(last_good_data, 31.76) def test_last_good_data_returns_correctly_when_manually_specified_used(self): self.gui_context.update({'LastGoodDataFromFile': False, 'LastGoodData': 5}) last_good_data = self.context.last_good_data([19489]) self.assertEquals(last_good_data, 5) def test_that_dead_time_table_from_ADS_returns_table_name(self): self.gui_context.update({'DeadTimeSource': 'FromADS', 'DeadTimeTable': 'deadtime_table_name'}) deadtime_table = self.context.dead_time_table([19489]) self.assertEquals(deadtime_table, 'deadtime_table_name')
class MuonContextTest(unittest.TestCase): @classmethod def setUpClass(cls): pass def setUp(self): AnalysisDataService.clear() self.filepath = FileFinder.findRuns('EMU00019489.nxs')[0] self.load_result, self.run_number, self.filename = load_workspace_from_filename( self.filepath) self.loaded_data = MuonLoadData() self.data_context = MuonDataContext(self.loaded_data) self.gui_context = MuonGuiContext() self.group_pair_context = MuonGroupPairContext() self.gui_context.update({'RebinType': 'None'}) self.context = MuonContext(muon_data_context=self.data_context, muon_gui_context=self.gui_context, muon_group_context=self.group_pair_context) self.data_context.instrument = 'EMU' self.loaded_data.add_data(workspace=self.load_result, run=[self.run_number], filename=self.filename, instrument='EMU') self.data_context.current_runs = [[self.run_number]] self.data_context.update_current_data() self.group_pair_context.reset_group_and_pairs_to_default( self.load_result['OutputWorkspace'][0]._workspace, 'EMU', '') def populate_ADS(self): self.context.calculate_all_groups() self.context.show_all_groups() self.context.calculate_all_pairs() self.context.show_all_pairs() workspace = CreateWorkspace([0], [0], StoreInADS=False) self.context.phase_context.add_phase_quad( MuonWorkspaceWrapper(workspace, 'EMU19489; PhaseQuad; PhaseTable EMU19489')) def test_reset_groups_and_pairs_to_default(self): self.assertEquals(self.group_pair_context.group_names, ['fwd', 'bwd']) self.assertEquals(self.group_pair_context.pair_names, ['long']) def test_calculate_group_calculates_group_for_given_run(self): counts_workspace, asymmetry_workspace = self.context.calculate_group( 'fwd', run=[19489]) self.assertEquals(type(counts_workspace), Workspace2D) self.assertEquals(type(counts_workspace), Workspace2D) def test_calculate_pair_calculates_pair_for_given_run(self): pair_asymmetry = self.context.calculate_pair('long', run=[19489]) self.assertEquals(type(pair_asymmetry), Workspace2D) def test_show_all_groups_calculates_and_shows_all_groups(self): self.context.show_all_groups() self.assertEquals(AnalysisDataService.getObjectNames(), [ 'EMU19489', 'EMU19489 Groups', 'EMU19489; Group; bwd; Asymmetry; #1', 'EMU19489; Group; bwd; Counts; #1', 'EMU19489; Group; fwd; Asymmetry; #1', 'EMU19489; Group; fwd; Counts; #1', 'Muon Data' ]) def test_that_show_all_calculates_and_shows_all_groups_with_rebin(self): self.gui_context['RebinType'] = 'Fixed' self.gui_context['RebinFixed'] = 2 self.context.show_all_groups() self.assertEquals(AnalysisDataService.getObjectNames(), [ 'EMU19489', 'EMU19489 Groups', 'EMU19489; Group; bwd; Asymmetry; #1', 'EMU19489; Group; bwd; Asymmetry; Rebin; #1', 'EMU19489; Group; bwd; Counts; #1', 'EMU19489; Group; bwd; Counts; Rebin; #1', 'EMU19489; Group; fwd; Asymmetry; #1', 'EMU19489; Group; fwd; Asymmetry; Rebin; #1', 'EMU19489; Group; fwd; Counts; #1', 'EMU19489; Group; fwd; Counts; Rebin; #1', 'Muon Data' ]) def test_show_all_pairs_calculates_and_shows_all_pairs(self): self.context.show_all_pairs() self.assertEquals(AnalysisDataService.getObjectNames(), [ 'EMU19489', 'EMU19489 Pairs', 'EMU19489; Pair Asym; long; #1', 'Muon Data' ]) def test_that_show_all_calculates_and_shows_all_pairs_with_rebin(self): self.gui_context['RebinType'] = 'Fixed' self.gui_context['RebinFixed'] = 2 self.context.show_all_pairs() self.assertEquals(AnalysisDataService.getObjectNames(), [ 'EMU19489', 'EMU19489 Pairs', 'EMU19489; Pair Asym; long; #1', 'EMU19489; Pair Asym; long; Rebin; #1', 'Muon Data' ]) def test_update_current_data_sets_current_run_in_data_context(self): self.context.update_current_data() self.assertEquals(self.data_context.current_data, self.load_result) def test_update_current_data_sets_groups_and_pairs(self): self.context.update_current_data() self.assertEquals(self.group_pair_context.pair_names, ['long']) self.assertEquals(self.group_pair_context.group_names, ['fwd', 'bwd']) def test_show_raw_data_puts_raw_data_into_the_ADS(self): self.context.show_raw_data() self.assertEquals(AnalysisDataService.getObjectNames(), [ 'EMU19489', 'EMU19489 Raw Data', 'EMU19489_raw_data', 'Muon Data' ]) def test_that_first_good_data_returns_correctly_when_from_file_chosen_option( self): self.gui_context.update({'FirstGoodDataFromFile': True}) first_good_data = self.context.first_good_data([19489]) self.assertEquals(first_good_data, 0.11) def test_first_good_data_returns_correctly_when_manually_specified_used( self): self.gui_context.update({ 'FirstGoodDataFromFile': False, 'FirstGoodData': 5 }) first_good_data = self.context.first_good_data([19489]) self.assertEquals(first_good_data, 5) def test_that_last_good_data_returns_correctly_when_from_file_chosen_option( self): self.gui_context.update({'LastGoodDataFromFile': True}) last_good_data = self.context.last_good_data([19489]) self.assertEquals(last_good_data, 31.76) def test_last_good_data_returns_correctly_when_manually_specified_used( self): self.gui_context.update({ 'LastGoodDataFromFile': False, 'LastGoodData': 5 }) last_good_data = self.context.last_good_data([19489]) self.assertEquals(last_good_data, 5) def test_that_dead_time_table_from_ADS_returns_table_name(self): self.gui_context.update({ 'DeadTimeSource': 'FromADS', 'DeadTimeTable': 'deadtime_table_name' }) deadtime_table = self.context.dead_time_table([19489]) self.assertEquals(deadtime_table, 'deadtime_table_name') def test_get_workspace_names_returns_all_stored_workspaces_if_all_selected( self): self.populate_ADS() workspace_list = self.context.get_names_of_workspaces_to_fit( '19489', 'fwd, bwd, long', True) self.assertEqual(workspace_list, [ 'EMU19489; Group; fwd; Asymmetry; #1', 'EMU19489; Group; bwd; Asymmetry; #1', 'EMU19489; Pair Asym; long; #1', 'EMU19489; PhaseQuad; PhaseTable EMU19489' ]) def test_get_workspace_names_returns_nothing_if_no_parameters_passed(self): self.populate_ADS() workspace_list = self.context.get_names_of_workspaces_to_fit() self.assertEqual(workspace_list, []) def test_get_workspaces_names_copes_with_bad_groups(self): self.populate_ADS() workspace_list = self.context.get_names_of_workspaces_to_fit( '19489', 'fwd, bwd, long, random, wrong', True) self.assertEqual(workspace_list, [ 'EMU19489; Group; fwd; Asymmetry; #1', 'EMU19489; Group; bwd; Asymmetry; #1', 'EMU19489; Pair Asym; long; #1', 'EMU19489; PhaseQuad; PhaseTable EMU19489' ]) def test_get_workspaces_names_copes_with_non_existent_runs(self): self.populate_ADS() workspace_list = self.context.get_names_of_workspaces_to_fit( '19489, 22222', 'fwd, bwd, long', True) self.assertEqual(workspace_list, [ 'EMU19489; Group; fwd; Asymmetry; #1', 'EMU19489; Group; bwd; Asymmetry; #1', 'EMU19489; Pair Asym; long; #1', 'EMU19489; PhaseQuad; PhaseTable EMU19489' ]) def test_that_run_ranged_correctly_parsed(self): self.populate_ADS() workspace_list = self.context.get_names_of_workspaces_to_fit( '19489-95', 'fwd, bwd, long', True) self.assertEqual(workspace_list, [ 'EMU19489; Group; fwd; Asymmetry; #1', 'EMU19489; Group; bwd; Asymmetry; #1', 'EMU19489; Pair Asym; long; #1', 'EMU19489; PhaseQuad; PhaseTable EMU19489' ])
def __init__(self, parent=None): super(FrequencyAnalysisGui, self).__init__(parent) self.setFocusPolicy(QtCore.Qt.StrongFocus) try: check_facility() except AttributeError as error: self.warning_popup(error.args[0]) # initialise the data storing classes of the interface self.loaded_data = MuonLoadData() self.data_context = MuonDataContext('Frequency Domain Data', self.loaded_data) self.gui_context = MuonGuiContext() self.group_pair_context = MuonGroupPairContext( self.data_context.check_group_contains_valid_detectors) self.phase_context = PhaseTableContext() self.fitting_context = FittingContext() self.frequency_context = FrequencyContext() self.context = MuonContext(muon_data_context=self.data_context, muon_gui_context=self.gui_context, muon_group_context=self.group_pair_context, muon_phase_context=self.phase_context, fitting_context=self.fitting_context, workspace_suffix=' FD', frequency_context=self.frequency_context) # create the dockable widget self.plot_widget = PlotWidget(self.context) self.dockable_plot_widget_window = PlottingDockWidget( parent=self, plotting_widget=self.plot_widget.view) self.dockable_plot_widget_window.setMinimumWidth(575) # Add dock widget to main Muon analysis window self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dockable_plot_widget_window) # Need this line to stop the bug where the dock window snaps back to its original size after resizing. # This is a qt bug reported at (https://bugreports.qt.io/browse/QTBUG-65592) if QT_VERSION >= LooseVersion("5.6"): self.resizeDocks({self.dockable_plot_widget_window}, {40}, QtCore.Qt.Horizontal) # construct all the widgets. self.load_widget = LoadWidget(self.loaded_data, self.context, self) self.grouping_tab_widget = GroupingTabWidget(self.context) self.home_tab = HomeTabWidget(self.context, self) self.phase_tab = PhaseTabWidget(self.context, self) self.transform = TransformWidget(self.context, FFTWidget, MaxEntWidget, parent=self) self.fitting_tab = FittingTabWidget(self.context, self) self.results_tab = ResultsTabWidget(self.context.fitting_context, self.context, self) self.setup_tabs() self.help_widget = HelpWidget(self.context.window_title) central_widget = QtWidgets.QWidget() vertical_layout = QtWidgets.QVBoxLayout() vertical_layout.addWidget(self.load_widget.load_widget_view) vertical_layout.addWidget(self.tabs) vertical_layout.addWidget(self.help_widget.view) central_widget.setLayout(vertical_layout) self.setCentralWidget(central_widget) self.setWindowTitle(self.context.window_title) self.setup_load_observers() self.setup_gui_variable_observers() self.setup_grouping_changed_observers() self.setup_instrument_changed_notifier() self.setup_group_calculation_enable_notifier() self.setup_group_calculation_disabler_notifier() self.setup_on_load_enabler() self.setup_on_load_disabler() self.setup_phase_quad_changed_notifier() self.setup_phase_table_changed_notifier() self.setup_fitting_notifier() self.setup_on_recalculation_finished_notifier() self.transform.set_up_calculation_observers( self.fitting_tab.fitting_tab_presenter.enable_tab_observer, self.fitting_tab.fitting_tab_presenter.disable_tab_observer) self.transform.new_data_observer( self.fitting_tab.fitting_tab_presenter.input_workspace_observer) self.transform.new_data_observer( self.plot_widget.presenter.input_workspace_observer) self.context.data_context.message_notifier.add_subscriber( self.grouping_tab_widget.group_tab_presenter.message_observer)
class MuonGroupPairContextTest(unittest.TestCase): def setUp(self): self.context = MuonGroupPairContext() def test_can_be_created(self): self.assertTrue(self.context) def test_groups_and_pairs_initially_empty(self): self.assertEqual(self.context.groups, []) self.assertEqual(self.context.pairs, []) def test_group_can_be_added(self): group = MuonGroup('group_1', [1,3,5,7,9]) self.context.add_group(group) self.assertEqual(self.context['group_1'], group) def test_non_group_cannot_be_added(self): pair = MuonPair('pair_1') self.assertRaises(AssertionError, self.context.add_group, pair) def test_cannot_add_group_with_duplicate_name(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_1', [1, 3, 5, 7, 9]) self.context.add_group(group_1) self.assertRaises(ValueError, self.context.add_group, group_2) def test_pair_can_be_added(self): pair = MuonPair('pair_1') self.context.add_pair(pair) self.assertEqual(self.context['pair_1'], pair) def test_non_pair_cannot_be_added(self): pair = MuonPair('pair_1') self.assertRaises(AssertionError, self.context.add_group, pair) def test_cannot_add_pair_with_duplicate_name(self): pair_1 = MuonPair('pair') pair_2 = MuonPair('pair') self.context.add_pair(pair_1) self.assertRaises(ValueError, self.context.add_pair, pair_2) def test_group_names_returns_ordered_list_of_names(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_3) self.context.add_group(group_2) self.assertEqual(self.context.group_names, ['group_1', 'group_3', 'group_2']) def test_pair_names_returns_ordered_list_of_names(self): pair_1 = MuonPair('pair_1') pair_2 = MuonPair('pair_2') pair_3 = MuonPair('pair_3') self.context.add_pair(pair_1) self.context.add_pair(pair_2) self.context.add_pair(pair_3) self.assertEqual(self.context.pair_names, ['pair_1', 'pair_2', 'pair_3']) def test_can_remove_groups_as_expected(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) self.context.remove_group('group_1') self.assertEqual(self.context.group_names, ['group_2', 'group_3']) def test_can_remove_pairs_as_expected(self): pair_1 = MuonPair('pair_1') pair_2 = MuonPair('pair_2') pair_3 = MuonPair('pair_3') self.context.add_pair(pair_1) self.context.add_pair(pair_2) self.context.add_pair(pair_3) self.context.remove_pair('pair_2') self.assertEqual(self.context.pair_names, ['pair_1', 'pair_3']) def test_get_group_workspace_names_returns_correct_workspace_names(self): group = create_group_populated_by_two_workspace() self.context.add_group(group) workspace_list = self.context.get_group_workspace_names([[33333]], ['group1'], False) self.assertEqual(workspace_list, ['asymmetry_name_33333']) def test_that_reset_to_default_groups_creates_correct_groups_and_pairs_for_single_period_data(self): workspace = CreateSampleWorkspace() LoadInstrument(workspace, InstrumentName="EMU", RewriteSpectraMap=True) self.context.reset_group_and_pairs_to_default(workspace, 'EMU', 'longitudanal', 1) self.assertEquals(self.context.group_names, ['fwd', 'bwd']) self.assertEquals(self.context.pair_names, ['long']) for group in self.context.groups: self.assertEquals(group.periods, [1]) def test_that_reset_to_default_groups_creates_correct_groups_and_pairs_for_multi_period_data(self): workspace = CreateSampleWorkspace() LoadInstrument(workspace, InstrumentName="EMU", RewriteSpectraMap=True) self.context.reset_group_and_pairs_to_default(workspace, 'EMU', 'longitudanal', 2) self.assertEquals(self.context.group_names, ['fwd1', 'bwd1', 'fwd2', 'bwd2']) self.assertEquals(self.context.pair_names, ['long1', 'long2']) self.assertEquals(self.context.groups[0].periods, [1]) self.assertEquals(self.context.groups[1].periods, [1]) self.assertEquals(self.context.groups[2].periods, [2]) self.assertEquals(self.context.pairs[0].forward_group, 'fwd1') self.assertEquals(self.context.pairs[0].backward_group, 'bwd1') self.assertEquals(self.context.pairs[1].forward_group, 'fwd2') self.assertEquals(self.context.pairs[1].backward_group, 'bwd2') self.assertEquals(self.context.selected, 'long1') def test_get_group_pair_name_and_run_from_workspace_name(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) group_1.update_workspaces([62260], 'group_1_counts', 'group_1_asym', 'group_1_asym_unorm', False) workspace_name_list = self.context.get_group_workspace_names(runs = [[62260]], groups=['group_1'], rebin=False) group_name, run = self.context.get_group_pair_name_and_run_from_workspace_name(workspace_name_list[0]) self.assertEqual(group_name, 'group_1') self.assertEqual(run, '62260') def test_get_group_pair_name_and_run_works_for_co_added_runs(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) group_1.update_workspaces([62260, 62261], 'group_1_counts', 'group_1_asym', 'group_1_asym_unorm', False) workspace_name_list = self.context.get_group_workspace_names(runs = [[62260, 62261]], groups=['group_1'], rebin=False) group_name, run = self.context.get_group_pair_name_and_run_from_workspace_name(workspace_name_list[0]) self.assertEqual(group_name, 'group_1') self.assertEqual(run, '62260-62261') def test_that_get_group_pair_name_and_run_works_for_fit_workspace_names_containing_original_worspace(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) group_1.update_workspaces([62260, 62261], 'group_1_counts', 'group_1_asym', 'group_1_asym_unorm', False) workspace_name_list = self.context.get_group_workspace_names(runs = [[62260, 62261]], groups=['group_1'], rebin=False) group_name, run = self.context.get_group_pair_name_and_run_from_workspace_name(workspace_name_list[0] + '; Fit Seq Flatbackground') self.assertEqual(group_name, 'group_1') self.assertEqual(run, '62260-62261')
class MuonGroupPairContextTest(unittest.TestCase): def setUp(self): self.context = MuonGroupPairContext() def test_can_be_created(self): self.assertTrue(self.context) def test_groups_and_pairs_initially_empty(self): self.assertEqual(self.context.groups, []) self.assertEqual(self.context.pairs, []) self.assertEqual(self.context.diffs, []) def test_group_can_be_added(self): group = MuonGroup('group_1', [1, 3, 5, 7, 9]) self.context.add_group(group) self.assertEqual(self.context['group_1'], group) def test_non_group_cannot_be_added(self): pair = MuonPair('pair_1') diff = MuonDiff('diff_1', 'positive', 'negative') self.assertRaises(AssertionError, self.context.add_group, pair) self.assertRaises(AssertionError, self.context.add_group, diff) def test_cannot_add_group_with_duplicate_name(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_1', [1, 3, 5, 7, 9]) self.context.add_group(group_1) self.assertRaises(ValueError, self.context.add_group, group_2) def test_pair_can_be_added(self): pair = MuonPair('pair_1') self.context.add_pair(pair) self.assertEqual(self.context['pair_1'], pair) def test_non_pair_cannot_be_added(self): group = MuonGroup('group_1', [1, 3, 5, 7, 9]) diff = MuonDiff('diff_1', 'positive', 'negative') # Value error as cannot assert isinstance in code since could add MuonPair or MuonBasePair self.assertRaises(ValueError, self.context.add_pair, group) self.assertRaises(ValueError, self.context.add_pair, diff) def test_cannot_add_pair_with_duplicate_name(self): pair_1 = MuonPair('pair') pair_2 = MuonPair('pair') self.context.add_pair(pair_1) self.assertRaises(ValueError, self.context.add_pair, pair_2) def test_diff_can_be_added(self): diff = MuonDiff('diff_1', 'positive', 'negative') self.context.add_diff(diff) self.assertEqual(self.context['diff_1'], diff) def test_non_diff_cannot_be_added(self): group = MuonGroup('group_1', [1, 3, 5, 7, 9]) pair = MuonPair('pair_1') self.assertRaises(AssertionError, self.context.add_diff, group) self.assertRaises(AssertionError, self.context.add_diff, pair) def test_cannot_add_diff_with_duplicate_name(self): diff_1 = MuonDiff('diff', 'positive', 'negative') diff_2 = MuonDiff('diff', 'positive', 'negative') self.context.add_diff(diff_1) self.assertRaises(ValueError, self.context.add_diff, diff_2) def test_groups_pairs_diffs_should_all_have_unique_names(self): group_1 = MuonGroup('group', [1, 3, 5, 7, 9]) group_2 = MuonGroup('pair', [1, 3, 5, 7, 9]) group_3 = MuonGroup('diff', [1, 3, 5, 7, 9]) pair_1 = MuonPair('pair') pair_2 = MuonPair('group') pair_3 = MuonPair('diff') diff_1 = MuonDiff('diff', 'positive', 'negative') diff_2 = MuonDiff('group', 'positive', 'negative') diff_3 = MuonDiff('pair', 'positive', 'negative') # Add correct group, pair and diff self.context.add_group(group_1) self.context.add_pair(pair_1) self.context.add_diff(diff_1) # Now check cannot duplicate names self.assertRaises(ValueError, self.context.add_group, group_2) self.assertRaises(ValueError, self.context.add_group, group_3) self.assertRaises(ValueError, self.context.add_pair, pair_2) self.assertRaises(ValueError, self.context.add_pair, pair_3) self.assertRaises(ValueError, self.context.add_diff, diff_2) self.assertRaises(ValueError, self.context.add_diff, diff_3) def test_group_names_returns_ordered_list_of_names(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_3) self.context.add_group(group_2) self.assertEqual(self.context.group_names, ['group_1', 'group_3', 'group_2']) def test_pair_names_returns_ordered_list_of_names(self): pair_1 = MuonPair('pair_1') pair_2 = MuonPair('pair_2') pair_3 = MuonPair('pair_3') self.context.add_pair(pair_1) self.context.add_pair(pair_2) self.context.add_pair(pair_3) self.assertEqual(self.context.pair_names, ['pair_1', 'pair_2', 'pair_3']) def test_diff_names_returns_ordered_list_of_names(self): diff_1 = MuonDiff('diff_1', 'positive', 'negative') diff_2 = MuonDiff('diff_2', 'positive', 'negative') diff_3 = MuonDiff('diff_3', 'positive', 'negative') self.context.add_diff(diff_1) self.context.add_diff(diff_2) self.context.add_diff(diff_3) self.assertEqual(self.context.diff_names, ['diff_1', 'diff_2', 'diff_3']) def test_can_remove_groups_as_expected(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) self.context.remove_group('group_1') self.assertEqual(self.context.group_names, ['group_2', 'group_3']) def test_can_remove_pairs_as_expected(self): pair_1 = MuonPair('pair_1') pair_2 = MuonPair('pair_2') pair_3 = MuonPair('pair_3') self.context.add_pair(pair_1) self.context.add_pair(pair_2) self.context.add_pair(pair_3) self.context.remove_pair('pair_2') self.assertEqual(self.context.pair_names, ['pair_1', 'pair_3']) def test_can_remove_diffs_as_expected(self): diff_1 = MuonDiff('diff_1', 'positive', 'negative') diff_2 = MuonDiff('diff_2', 'positive', 'negative') diff_3 = MuonDiff('diff_3', 'positive', 'negative') self.context.add_diff(diff_1) self.context.add_diff(diff_2) self.context.add_diff(diff_3) self.context.remove_diff('diff_2') self.assertEqual(self.context.diff_names, ['diff_1', 'diff_3']) def test_get_group_workspace_names_returns_correct_workspace_names(self): group = create_group_populated_by_two_workspace() self.context.add_group(group) workspace_list = self.context.get_group_workspace_names([[33333]], ['group1'], False) self.assertEqual(workspace_list, ['asymmetry_name_33333']) def test_that_reset_to_default_groups_creates_correct_groups_and_pairs_for_single_period_data( self): workspace = CreateSampleWorkspace() LoadInstrument(workspace, InstrumentName="EMU", RewriteSpectraMap=True) self.context.reset_group_and_pairs_to_default(workspace, 'EMU', 'longitudanal', 1) self.assertEquals(self.context.group_names, ['fwd', 'bwd']) self.assertEquals(self.context.pair_names, ['long']) self.assertEquals(self.context.diff_names, []) for group in self.context.groups: self.assertEquals(group.periods, [1]) def test_that_reset_to_default_groups_creates_correct_groups_and_pairs_for_multi_period_data( self): workspace = CreateSampleWorkspace() LoadInstrument(workspace, InstrumentName="EMU", RewriteSpectraMap=True) self.context.reset_group_and_pairs_to_default(workspace, 'EMU', 'longitudanal', 2) self.assertEquals(self.context.group_names, ['fwd1', 'bwd1', 'fwd2', 'bwd2']) self.assertEquals(self.context.pair_names, ['long1', 'long2']) self.assertEquals(self.context.diff_names, ['pair_diff1']) self.assertEquals(self.context.groups[0].periods, [1]) self.assertEquals(self.context.groups[1].periods, [1]) self.assertEquals(self.context.groups[2].periods, [2]) self.assertEquals(self.context.pairs[0].forward_group, 'fwd1') self.assertEquals(self.context.pairs[0].backward_group, 'bwd1') self.assertEquals(self.context.pairs[1].forward_group, 'fwd2') self.assertEquals(self.context.pairs[1].backward_group, 'bwd2') self.assertEquals(self.context.diffs[0].positive, 'long1') self.assertEquals(self.context.diffs[0].negative, 'long2') self.assertEquals(self.context.selected, 'long1') def test_get_group_pair_name_and_run_from_workspace_name(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) group_1.update_counts_workspace(MuonRun([62260]), 'group_1_counts', False) group_1.update_asymmetry_workspace(MuonRun([62260]), 'group_1_asym', 'group_1_asym_unorm', False) workspace_name_list = self.context.get_group_workspace_names( runs=[[62260]], groups=['group_1'], rebin=False) group_name, run = self.context.get_group_pair_name_and_run_from_workspace_name( workspace_name_list[0]) self.assertEqual(group_name, 'group_1') self.assertEqual(run, '62260') def test_get_group_pair_name_and_run_works_for_co_added_runs(self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) group_1.update_counts_workspace(MuonRun([62260, 62261]), 'group_1_counts', False) group_1.update_asymmetry_workspace(MuonRun([62260, 62261]), 'group_1_asym', 'group_1_asym_unorm', False) workspace_name_list = self.context.get_group_workspace_names( runs=[[62260, 62261]], groups=['group_1'], rebin=False) group_name, run = self.context.get_group_pair_name_and_run_from_workspace_name( workspace_name_list[0]) self.assertEqual(group_name, 'group_1') self.assertEqual(run, '62260-62261') def test_that_get_group_pair_name_and_run_works_for_fit_workspace_names_containing_original_worspace( self): group_1 = MuonGroup('group_1', [1, 3, 5, 7, 9]) group_2 = MuonGroup('group_2', [1, 3, 4, 7, 9]) group_3 = MuonGroup('group_3', [1, 3, 4, 7, 9]) self.context.add_group(group_1) self.context.add_group(group_2) self.context.add_group(group_3) group_1.update_counts_workspace(MuonRun([62260, 62261]), 'group_1_counts', False) group_1.update_asymmetry_workspace(MuonRun([62260, 62261]), 'group_1_asym', 'group_1_asym_unorm', False) workspace_name_list = self.context.get_group_workspace_names( runs=[[62260, 62261]], groups=['group_1'], rebin=False) group_name, run = self.context.get_group_pair_name_and_run_from_workspace_name( workspace_name_list[0] + '; Fit Seq Flatbackground') self.assertEqual(group_name, 'group_1') self.assertEqual(run, '62260-62261') def test_add_phasequad(self): phasequad = MuonPhasequad("test", "table") self.assertEqual(len(self.context._phasequad), 0) self.assertEqual(len(self.context._pairs), 0) self.context.add_phasequad(phasequad) self.assertEqual(len(self.context._phasequad), 1) self.assertEqual(len(self.context._pairs), 2) self.assertEqual(self.context._phasequad[0].name, "test") self.assertEqual(self.context._pairs[0].name, "test_Re_") self.assertEqual(self.context._pairs[1].name, "test_Im_") def test_rm_phasequad(self): phasequad = MuonPhasequad("test", "table") phasequad2 = MuonPhasequad("test2", "table2") self.context.add_phasequad(phasequad) self.context.add_phasequad(phasequad2) self.assertEqual(len(self.context._phasequad), 2) self.assertEqual(len(self.context._pairs), 4) self.context.remove_phasequad(phasequad) self.assertEqual(len(self.context._phasequad), 1) self.assertEqual(len(self.context._pairs), 2) self.assertEqual(self.context._phasequad[0].name, "test2") self.assertEqual(self.context._pairs[0].name, "test2_Re_") self.assertEqual(self.context._pairs[1].name, "test2_Im_")
class GroupingTabPresenterTest(unittest.TestCase): def setUp(self): self._qapp = mock_widget.mockQapp() # Store an empty widget to parent all the views, and ensure they are deleted correctly self.obj = QtGui.QWidget() self.loaded_data = MuonLoadData() self.data_context = MuonDataContext(self.loaded_data) self.gui_context = MuonGuiContext() self.group_context = MuonGroupPairContext(self.data_context.check_group_contains_valid_detectors) self.context = MuonContext(muon_data_context=self.data_context, muon_group_context=self.group_context, muon_gui_context=self.gui_context) self.model = GroupingTabModel(context=self.context) self.grouping_table_view = GroupingTableView(parent=self.obj) self.grouping_table_widget = GroupingTablePresenter(self.grouping_table_view, self.model) self.pairing_table_view = PairingTableView(parent=self.obj) self.pairing_table_widget = PairingTablePresenter(self.pairing_table_view, self.model) self.add_three_groups() self.add_two_pairs() self.view = GroupingTabView(self.grouping_table_view, self.pairing_table_view, parent=self.obj) self.presenter = GroupingTabPresenter(self.view, self.model, self.grouping_table_widget, self.pairing_table_widget) self.presenter.create_update_thread = mock.MagicMock(return_value=mock.MagicMock()) self.view.display_warning_box = mock.MagicMock() self.grouping_table_view.warning_popup = mock.MagicMock() self.pairing_table_view.warning_popup = mock.MagicMock() def add_three_groups(self): testgroup1 = MuonGroup(group_name="fwd", detector_ids=[1, 2, 3, 4, 5]) testgroup2 = MuonGroup(group_name="bwd", detector_ids=[6, 7, 8, 9, 10]) testgroup3 = MuonGroup(group_name="top", detector_ids=[11, 12, 13, 14, 15]) self.grouping_table_widget.add_group(testgroup1) self.grouping_table_widget.add_group(testgroup2) self.grouping_table_widget.add_group(testgroup3) def add_two_pairs(self): testpair1 = MuonPair(pair_name="long1", forward_group_name="fwd", backward_group_name="bwd") testpair2 = MuonPair(pair_name="long2", forward_group_name="fwd", backward_group_name="top") self.pairing_table_widget.add_pair(testpair1) self.pairing_table_widget.add_pair(testpair2) def tearDown(self): self.obj = None # ------------------------------------------------------------------------------------------------------------------ # TESTS # ------------------------------------------------------------------------------------------------------------------ def test_context_menu_add_pair_adds_pair_if_two_groups_selected(self): self.assertEqual(self.pairing_table_view.num_rows(), 2) self.grouping_table_view._get_selected_row_indices = mock.Mock(return_value=[0, 1]) self.grouping_table_view.contextMenuEvent(0) self.grouping_table_view.add_pair_action.triggered.emit(True) self.assertEqual(self.pairing_table_view.num_rows(), 3) def test_context_menu_add_pair_adds_correct_pair_if_two_groups_selected(self): self.grouping_table_view._get_selected_row_indices = mock.Mock(return_value=[0, 1]) self.grouping_table_view.contextMenuEvent(0) self.grouping_table_view.add_pair_action.triggered.emit(True) pair_name = "pair_0" self.assertEqual(self.group_context[pair_name].forward_group, "fwd") self.assertEqual(self.group_context[pair_name].backward_group, "bwd") def test_that_clear_button_clears_model_and_view(self): self.view.clear_grouping_button.clicked.emit(True) self.assertEqual(len(self.model.groups), 0) self.assertEqual(len(self.model.pairs), 0) self.assertEqual(self.grouping_table_view.num_rows(), 0) self.assertEqual(self.pairing_table_view.num_rows(), 0) @mock.patch("Muon.GUI.Common.grouping_tab_widget.grouping_tab_widget_presenter.xml_utils.load_grouping_from_XML") def test_that_load_grouping_triggers_the_correct_function(self, mock_load): self.view.show_file_browser_and_return_selection = mock.MagicMock(return_value="grouping.xml") groups = [MuonGroup(group_name="grp1", detector_ids=[1, 2, 3, 4, 5]), MuonGroup(group_name="grp2", detector_ids=[6, 7, 8, 9, 10])] pairs = [MuonPair(pair_name="pair1", forward_group_name="grp1", backward_group_name="grp2")] mock_load.return_value = (groups, pairs, 'description') self.view.load_grouping_button.clicked.emit(True) self.assertEqual(mock_load.call_count, 1) self.assertEqual(mock_load.call_args[0][0], "grouping.xml") def test_that_load_grouping_inserts_loaded_groups_and_pairs_correctly(self): self.view.show_file_browser_and_return_selection = mock.Mock(return_value="grouping.xml") groups = [MuonGroup(group_name="grp1", detector_ids=[1, 2, 3, 4, 5]), MuonGroup(group_name="grp2", detector_ids=[6, 7, 8, 9, 10])] pairs = [MuonPair(pair_name="pair1", forward_group_name="grp1", backward_group_name="grp2")] with mock.patch( "Muon.GUI.Common.grouping_tab_widget.grouping_tab_widget_presenter.xml_utils.load_grouping_from_XML") as mock_load: # mock the loading to return set groups/pairs mock_load.return_value = (groups, pairs, 'description') self.view.load_grouping_button.clicked.emit(True) six.assertCountEqual(self, self.model.group_names, ["grp1", "grp2"]) six.assertCountEqual(self, self.model.pair_names, ["pair1"]) self.assertEqual(self.grouping_table_view.num_rows(), 2) self.assertEqual(self.pairing_table_view.num_rows(), 1) self.assertEqual(self.pairing_table_view.pairing_table.cellWidget(0, 1).currentText(), "grp1") self.assertEqual(self.pairing_table_view.pairing_table.cellWidget(0, 2).currentText(), "grp2") def test_loading_does_not_insert_invalid_groups(self): self.view.show_file_browser_and_return_selection = mock.Mock(return_value="grouping.xml") groups = [MuonGroup(group_name="grp1", detector_ids=[1, 2, 3, 4, 5]), MuonGroup(group_name="grp2", detector_ids=[6, 7, 8, 9, 1000])] pairs = [MuonPair(pair_name="pair1", forward_group_name="grp1", backward_group_name="grp2")] with mock.patch( "Muon.GUI.Common.grouping_tab_widget.grouping_tab_widget_presenter.xml_utils.load_grouping_from_XML") as mock_load: # mock the loading to return set groups/pairs mock_load.return_value = (groups, pairs, 'description') self.view.load_grouping_button.clicked.emit(True) self.view.display_warning_box.assert_called_once_with('Invalid detectors in group grp2') six.assertCountEqual(self, self.model.group_names, ["grp1"]) six.assertCountEqual(self, self.model.pair_names, []) self.assertEqual(self.grouping_table_view.num_rows(), 1) self.assertEqual(self.pairing_table_view.num_rows(), 0) def test_that_save_grouping_triggers_the_correct_function(self): # Save functionality is tested elsewhere self.view.show_file_save_browser_and_return_selection = mock.Mock(return_value="grouping.xml") with mock.patch( "Muon.GUI.Common.grouping_tab_widget.grouping_tab_widget_presenter.xml_utils.save_grouping_to_XML") as mock_save: self.view.save_grouping_button.clicked.emit(True) self.assertEqual(mock_save.call_count, 1) self.assertEqual(mock_save.call_args[0][-1], "grouping.xml") def test_update_all_calculates_groups_and_pairs(self): self.presenter.handle_update_all_clicked() self.presenter.update_thread.threadWrapperSetUp.assert_called_once_with(self.presenter.disable_editing, self.presenter.handle_update_finished, self.presenter.error_callback) self.presenter.update_thread.start.assert_called_once_with() def test_removing_group_removes_linked_pairs(self): self.group_context.clear_pairs() self.group_context.clear_groups() self.add_three_groups() self.add_two_pairs() self.presenter.grouping_table_widget.remove_last_row_in_view_and_model() self.assertEqual(self.model.pair_names, ['long1'])
def __init__(self, parent=None): super(MuonAnalysisGui, self).__init__(parent) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.setFocusPolicy(QtCore.Qt.StrongFocus) self.setObjectName("MuonAnalysis2") self.current_tab = '' try: check_facility() except AttributeError as error: self.warning_popup(error.args[0]) # initialise the data storing classes of the interface self.loaded_data = MuonLoadData() self.data_context = MuonDataContext('Muon Data', self.loaded_data) self.gui_context = MuonGuiContext() self.group_pair_context = MuonGroupPairContext( self.data_context.check_group_contains_valid_detectors) self.phase_context = PhaseTableContext() self.fitting_context = FittingContext() self.context = DataAnalysisContext( muon_data_context=self.data_context, muon_gui_context=self.gui_context, muon_group_context=self.group_pair_context, fitting_context=self.fitting_context, muon_phase_context=self.phase_context) # create the Dockable plot widget self.fitting_tab = FittingTabWidget(self.context, self) self.plot_widget = PlotWidget( self.context, self.fitting_tab.fitting_tab_presenter.get_selected_fit_workspaces, parent=self) self.dockable_plot_widget_window = PlottingDockWidget( parent=self, plotting_widget=self.plot_widget.view) self.dockable_plot_widget_window.setMinimumWidth(575) # Add dock widget to main Muon analysis window self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.dockable_plot_widget_window) # Need this line to stop the bug where the dock window snaps back to its original size after resizing. # 0 argument is arbitrary and has no effect on fit widget size # This is a qt bug reported at (https://bugreports.qt.io/browse/QTBUG-65592) if QT_VERSION >= LooseVersion("5.6"): self.resizeDocks({self.dockable_plot_widget_window}, {1}, QtCore.Qt.Horizontal) self.disable_notifier = GenericObservable() self.disable_observer = GenericObserver( self.disable_notifier.notify_subscribers) self.enable_notifier = GenericObservable() self.enable_observer = GenericObserver( self.enable_notifier.notify_subscribers) # set up other widgets self.load_widget = LoadWidget(self.loaded_data, self.context, self) self.home_tab = HomeTabWidget(self.context, self) self.grouping_tab_widget = GroupingTabWidget(self.context) self.phase_tab = PhaseTabWidget(self.context, self) self.seq_fitting_tab = SeqFittingTabWidget( self.context, self.fitting_tab.fitting_tab_model, self) self.results_tab = ResultsTabWidget(self.context.fitting_context, self.context, self) self.setup_tabs() self.help_widget = HelpWidget("Muon Analysis 2") central_widget = QtWidgets.QWidget() vertical_layout = QtWidgets.QVBoxLayout() vertical_layout.addWidget(self.load_widget.load_widget_view) vertical_layout.addWidget(self.tabs) vertical_layout.addWidget(self.help_widget.view) central_widget.setLayout(vertical_layout) self.setCentralWidget(central_widget) self.setWindowTitle(self.context.window_title) self.setup_load_observers() self.setup_gui_variable_observers() self.setup_grouping_changed_observers() self.setup_instrument_changed_notifier() self.setup_group_calculation_enable_notifier() self.setup_group_calculation_disabler_notifier() self.setup_on_load_enabler() self.setup_on_load_disabler() self.setup_phase_quad_changed_notifier() self.setup_phase_table_changed_notifier() self.setup_fitting_notifier() self.setup_on_recalulation_finished_notifier() self.context.data_context.message_notifier.add_subscriber( self.grouping_tab_widget.group_tab_presenter.message_observer) self.setup_disable_notifier() self.setup_enable_notifier()
class GroupingTabPresenterTest(unittest.TestCase): def setUp(self): self._qapp = mock_widget.mockQapp() # Store an empty widget to parent all the views, and ensure they are deleted correctly self.obj = QtGui.QWidget() self.loaded_data = MuonLoadData() self.data_context = MuonDataContext(self.loaded_data) self.gui_context = MuonGuiContext() self.group_context = MuonGroupPairContext( self.data_context.check_group_contains_valid_detectors) self.context = MuonContext(muon_data_context=self.data_context, muon_group_context=self.group_context, muon_gui_context=self.gui_context) self.model = GroupingTabModel(context=self.context) self.grouping_table_view = GroupingTableView(parent=self.obj) self.grouping_table_widget = GroupingTablePresenter( self.grouping_table_view, self.model) self.pairing_table_view = PairingTableView(parent=self.obj) self.pairing_table_widget = PairingTablePresenter( self.pairing_table_view, self.model) self.add_three_groups() self.add_two_pairs() self.view = GroupingTabView(self.grouping_table_view, self.pairing_table_view, parent=self.obj) self.presenter = GroupingTabPresenter(self.view, self.model, self.grouping_table_widget, self.pairing_table_widget) self.presenter.create_update_thread = mock.MagicMock( return_value=mock.MagicMock()) self.view.display_warning_box = mock.MagicMock() self.grouping_table_view.warning_popup = mock.MagicMock() self.pairing_table_view.warning_popup = mock.MagicMock() def add_three_groups(self): testgroup1 = MuonGroup(group_name="fwd", detector_ids=[1, 2, 3, 4, 5]) testgroup2 = MuonGroup(group_name="bwd", detector_ids=[6, 7, 8, 9, 10]) testgroup3 = MuonGroup(group_name="top", detector_ids=[11, 12, 13, 14, 15]) self.grouping_table_widget.add_group(testgroup1) self.grouping_table_widget.add_group(testgroup2) self.grouping_table_widget.add_group(testgroup3) def add_two_pairs(self): testpair1 = MuonPair(pair_name="long1", forward_group_name="fwd", backward_group_name="bwd") testpair2 = MuonPair(pair_name="long2", forward_group_name="fwd", backward_group_name="top") self.pairing_table_widget.add_pair(testpair1) self.pairing_table_widget.add_pair(testpair2) def tearDown(self): self.obj = None # ------------------------------------------------------------------------------------------------------------------ # TESTS # ------------------------------------------------------------------------------------------------------------------ def test_context_menu_add_pair_adds_pair_if_two_groups_selected(self): self.assertEqual(self.pairing_table_view.num_rows(), 2) self.grouping_table_view._get_selected_row_indices = mock.Mock( return_value=[0, 1]) self.grouping_table_view.contextMenuEvent(0) self.grouping_table_view.add_pair_action.triggered.emit(True) self.assertEqual(self.pairing_table_view.num_rows(), 3) def test_context_menu_add_pair_adds_correct_pair_if_two_groups_selected( self): self.grouping_table_view._get_selected_row_indices = mock.Mock( return_value=[0, 1]) self.grouping_table_view.contextMenuEvent(0) self.grouping_table_view.add_pair_action.triggered.emit(True) pair_name = "pair_0" self.assertEqual(self.group_context[pair_name].forward_group, "fwd") self.assertEqual(self.group_context[pair_name].backward_group, "bwd") def test_that_clear_button_clears_model_and_view(self): self.view.clear_grouping_button.clicked.emit(True) self.assertEqual(len(self.model.groups), 0) self.assertEqual(len(self.model.pairs), 0) self.assertEqual(self.grouping_table_view.num_rows(), 0) self.assertEqual(self.pairing_table_view.num_rows(), 0) @mock.patch( "Muon.GUI.Common.grouping_tab_widget.grouping_tab_widget_presenter.xml_utils.load_grouping_from_XML" ) def test_that_load_grouping_triggers_the_correct_function(self, mock_load): self.view.show_file_browser_and_return_selection = mock.MagicMock( return_value="grouping.xml") groups = [ MuonGroup(group_name="grp1", detector_ids=[1, 2, 3, 4, 5]), MuonGroup(group_name="grp2", detector_ids=[6, 7, 8, 9, 10]) ] pairs = [ MuonPair(pair_name="pair1", forward_group_name="grp1", backward_group_name="grp2") ] mock_load.return_value = (groups, pairs, 'description') self.view.load_grouping_button.clicked.emit(True) self.assertEqual(mock_load.call_count, 1) self.assertEqual(mock_load.call_args[0][0], "grouping.xml") def test_that_load_grouping_inserts_loaded_groups_and_pairs_correctly( self): self.view.show_file_browser_and_return_selection = mock.Mock( return_value="grouping.xml") groups = [ MuonGroup(group_name="grp1", detector_ids=[1, 2, 3, 4, 5]), MuonGroup(group_name="grp2", detector_ids=[6, 7, 8, 9, 10]) ] pairs = [ MuonPair(pair_name="pair1", forward_group_name="grp1", backward_group_name="grp2") ] with mock.patch( "Muon.GUI.Common.grouping_tab_widget.grouping_tab_widget_presenter.xml_utils.load_grouping_from_XML" ) as mock_load: # mock the loading to return set groups/pairs mock_load.return_value = (groups, pairs, 'description') self.view.load_grouping_button.clicked.emit(True) six.assertCountEqual(self, self.model.group_names, ["grp1", "grp2"]) six.assertCountEqual(self, self.model.pair_names, ["pair1"]) self.assertEqual(self.grouping_table_view.num_rows(), 2) self.assertEqual(self.pairing_table_view.num_rows(), 1) self.assertEqual( self.pairing_table_view.pairing_table.cellWidget( 0, 1).currentText(), "grp1") self.assertEqual( self.pairing_table_view.pairing_table.cellWidget( 0, 2).currentText(), "grp2") def test_loading_does_not_insert_invalid_groups(self): self.view.show_file_browser_and_return_selection = mock.Mock( return_value="grouping.xml") groups = [ MuonGroup(group_name="grp1", detector_ids=[1, 2, 3, 4, 5]), MuonGroup(group_name="grp2", detector_ids=[6, 7, 8, 9, 1000]) ] pairs = [ MuonPair(pair_name="pair1", forward_group_name="grp1", backward_group_name="grp2") ] with mock.patch( "Muon.GUI.Common.grouping_tab_widget.grouping_tab_widget_presenter.xml_utils.load_grouping_from_XML" ) as mock_load: # mock the loading to return set groups/pairs mock_load.return_value = (groups, pairs, 'description') self.view.load_grouping_button.clicked.emit(True) self.view.display_warning_box.assert_called_once_with( 'Invalid detectors in group grp2') six.assertCountEqual(self, self.model.group_names, ["grp1"]) six.assertCountEqual(self, self.model.pair_names, []) self.assertEqual(self.grouping_table_view.num_rows(), 1) self.assertEqual(self.pairing_table_view.num_rows(), 0) def test_that_save_grouping_triggers_the_correct_function(self): # Save functionality is tested elsewhere self.view.show_file_save_browser_and_return_selection = mock.Mock( return_value="grouping.xml") with mock.patch( "Muon.GUI.Common.grouping_tab_widget.grouping_tab_widget_presenter.xml_utils.save_grouping_to_XML" ) as mock_save: self.view.save_grouping_button.clicked.emit(True) self.assertEqual(mock_save.call_count, 1) self.assertEqual(mock_save.call_args[0][-1], "grouping.xml") def test_update_all_calculates_groups_and_pairs(self): self.presenter.handle_update_all_clicked() self.presenter.update_thread.threadWrapperSetUp.assert_called_once_with( self.presenter.disable_editing, self.presenter.handle_update_finished, self.presenter.error_callback) self.presenter.update_thread.start.assert_called_once_with() def test_removing_group_removes_linked_pairs(self): self.group_context.clear_pairs() self.group_context.clear_groups() self.add_three_groups() self.add_two_pairs() self.presenter.grouping_table_widget.remove_last_row_in_view_and_model( ) self.assertEqual(self.model.pair_names, ['long1'])