コード例 #1
0
    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', '')
コード例 #2
0
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)
コード例 #3
0
    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()
コード例 #4
0
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)
コード例 #5
0
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)
コード例 #6
0
ファイル: muon_context.py プロジェクト: JoachimCoenen/mantid
    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': ''})
コード例 #7
0
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)
コード例 #8
0
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)
コード例 #9
0
    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()
コード例 #10
0
    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', '')
コード例 #11
0
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'])
コード例 #12
0
    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)
コード例 #13
0
    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)
コード例 #14
0
 def setUp(self):
     self.context = MuonGroupPairContext()
コード例 #15
0
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'])
コード例 #16
0
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')
コード例 #17
0
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'
        ])
コード例 #18
0
    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)
コード例 #19
0
 def setUp(self):
     self.context = MuonGroupPairContext()
コード例 #20
0
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')
コード例 #21
0
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_")
コード例 #22
0
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'])
コード例 #23
0
    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()
コード例 #24
0
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'])