diff --git a/scripts/Muon/GUI/ElementalAnalysis/PeriodicTable/PeakSelector/peak_selector_view.py b/scripts/Muon/GUI/ElementalAnalysis/PeriodicTable/PeakSelector/peak_selector_view.py index 07cf209ca061524b69fc9739ca0e1cb0991d27a7..77695b3e8fb33597701b192e771ca26fd448fe09 100644 --- a/scripts/Muon/GUI/ElementalAnalysis/PeriodicTable/PeakSelector/peak_selector_view.py +++ b/scripts/Muon/GUI/ElementalAnalysis/PeriodicTable/PeakSelector/peak_selector_view.py @@ -8,12 +8,23 @@ from __future__ import (absolute_import, division, unicode_literals) from qtpy import QtWidgets, QtCore from six import iteritems +import numpy as np from Muon.GUI.Common.checkbox import Checkbox -# Check that the new data format contains at least A, Z, primary (they can be empty) +def value_in_bounds(val, lower, upper): + if val is None or val == {}: + return True + + if lower <= val <= upper: + return True + + return False + + def valid_data(peak_data): + # Check that the new data format contains at least A, Z, primary (they can be empty) data_label = peak_data.keys() if any([ 'Z' not in data_label, 'A' not in data_label, 'Primary' not in data_label, @@ -21,6 +32,28 @@ def valid_data(peak_data): ]): return False + # Check that the data is a sensible number (high bound set by element Oganesson, heaviest known element as of 2019) + if not value_in_bounds(peak_data['Z'], 1, 119): + return False + if not value_in_bounds(peak_data['A'], 1.0, 296.0): + return False + if peak_data['Primary'] is not None: + for x_pos in peak_data['Primary'].values(): + if not value_in_bounds(x_pos, 0.0, np.Inf): + return False + if peak_data['Secondary'] is not None: + for x_pos in peak_data['Secondary'].values(): + if not value_in_bounds(x_pos, 0.0, np.Inf): + return False + if 'Gammas' in data_label and peak_data['Gammas'] is not None: + for x_pos in peak_data['Gammas'].values(): + if not value_in_bounds(x_pos, 0.0, np.Inf): + return False + if 'Electrons' in data_label and peak_data['Electrons'] is not None: + for x_pos in peak_data['Electrons'].values(): + if not value_in_bounds(x_pos, 0.0, np.Inf): + return False + return True @@ -33,7 +66,7 @@ class PeakSelectorView(QtWidgets.QListWidget): self.new_data = {} if not valid_data(peak_data): - raise ValueError + raise ValueError('Element {} does not contain valid data'.format(element)) self.element = element self.update_new_data(peak_data) diff --git a/scripts/Muon/GUI/ElementalAnalysis/PeriodicTable/periodic_table.py b/scripts/Muon/GUI/ElementalAnalysis/PeriodicTable/periodic_table.py index 01b9d7cabfe55ddb9fcf013f064f3794481c24ca..cf0bd1374379544fabbbea54f13ce33098d92ade 100644 --- a/scripts/Muon/GUI/ElementalAnalysis/PeriodicTable/periodic_table.py +++ b/scripts/Muon/GUI/ElementalAnalysis/PeriodicTable/periodic_table.py @@ -175,7 +175,6 @@ class PeriodicTableItem(object): :param str subcategory: Subcategory, based on physical properties (e.g. "alkali metal", "noble gas"...) """ - def __init__(self, symbol, Z, col, row, name, mass, subcategory=""): self.symbol = symbol """Atomic symbol (e.g. H, He, Li...)""" @@ -227,7 +226,6 @@ class ColoredPeriodicTableItem(PeriodicTableItem): "": "#FFFFFF" # white } """Dictionary defining RGB colors for each subcategory.""" - def __init__(self, symbol, Z, col, row, name, mass, subcategory="", bgcolor=None): PeriodicTableItem.__init__(self, symbol, Z, col, row, name, mass, subcategory) @@ -243,7 +241,28 @@ class ColoredPeriodicTableItem(PeriodicTableItem): self.bgcolor = bgcolor -_defaultTableItems = [ColoredPeriodicTableItem(*info) for info in _elements] +# Sometimes the mass of an element can be slightly different to the one in the peak data file, if so use that one +def _correct_with_peak_data_file(): + from periodic_table_model import PeriodicTableModel + import json + import copy + with open(PeriodicTableModel().get_default_peak_data_file(), 'r') as data_file: + data = json.load(data_file) + + for i, element in enumerate(copy.deepcopy(_elements)): + data_element = data.get(element[0], None) + if data_element is not None and data_element['A'] is not None: + if abs(data_element['A'] - element[5]) > 1e-6: + if len(element) > 6: + _elements[i] = (element[0], data_element['Z'], element[2], element[3], + element[4], data_element['A'], element[6]) + else: + _elements[i] = (element[0], data_element['Z'], element[2], element[3], + element[4], data_element['A']) + + +_correct_with_peak_data_file() +_default_table_items = [ColoredPeriodicTableItem(*info) for info in _elements] class _ElementButton(QtWidgets.QPushButton): @@ -257,7 +276,6 @@ class _ElementButton(QtWidgets.QPushButton): """Signal emitted when the widget is left clicked""" sigElementRightClicked = QtCore.Signal(object) """Signal emitted when the widget is right clicked""" - def __init__(self, item, parent=None): """ @@ -273,8 +291,8 @@ class _ElementButton(QtWidgets.QPushButton): self.setFlat(True) self.setCheckable(False) - self.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, - QtWidgets.QSizePolicy.Expanding)) + self.setSizePolicy( + QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)) self.selected = False self.current = False @@ -447,9 +465,7 @@ class PeriodicTable(QtWidgets.QWidget): selected by clicking with the mouse. If *False* (default), selection is only possible with method :meth:`setSelection`. """ - - def __init__(self, parent=None, name="PeriodicTable", elements=None, - selectable=False): + def __init__(self, parent=None, name="PeriodicTable", elements=None, selectable=False): self.selectable = selectable QtWidgets.QWidget.__init__(self, parent) self.setWindowTitle(name) @@ -478,7 +494,7 @@ class PeriodicTable(QtWidgets.QWidget): ("H", "He", "Li"...)""" if elements is None: - elements = _defaultTableItems + elements = _default_table_items # fill cells with elements for elmt in elements: self._addElement(elmt) @@ -632,13 +648,12 @@ class PeriodicCombo(QtWidgets.QComboBox): :class:`PeriodicTableItem` object representing selected element """ - def __init__(self, parent=None, detailed=True, elements=None): QtWidgets.QComboBox.__init__(self, parent) # add all elements from global list if elements is None: - elements = _defaultTableItems + elements = _default_table_items for i, elmt in enumerate(elements): if detailed: txt = "%2s (%d) - %s" % (elmt.symbol, elmt.Z, elmt.name) @@ -650,7 +665,7 @@ class PeriodicCombo(QtWidgets.QComboBox): def _selectionChanged(self, idx): """Emit :attr:`sigSelectionChanged`""" - self.sigSelectionChanged.emit(_defaultTableItems[idx]) + self.sigSelectionChanged.emit(_default_table_items[idx]) def getSelection(self): """Get selected element @@ -658,7 +673,7 @@ class PeriodicCombo(QtWidgets.QComboBox): :return: Selected element :rtype: PeriodicTableItem """ - return _defaultTableItems[self.currentIndex()] + return _default_table_items[self.currentIndex()] def setSelection(self, symbol): """Set selected item in combobox by giving the atomic symbol @@ -668,7 +683,7 @@ class PeriodicCombo(QtWidgets.QComboBox): # accept PeriodicTableItem for getter/setter consistency if isinstance(symbol, PeriodicTableItem): symbol = symbol.symbol - symblist = [elmt.symbol for elmt in _defaultTableItems] + symblist = [elmt.symbol for elmt in _default_table_items] self.setCurrentIndex(symblist.index(symbol)) @@ -688,7 +703,6 @@ class PeriodicList(QtWidgets.QTreeWidget): this signal and sends a list of currently selected :class:`PeriodicTableItem` objects. """ - def __init__(self, parent=None, detailed=True, single=False, elements=None): QtWidgets.QTreeWidget.__init__(self, parent) @@ -705,8 +719,8 @@ class PeriodicList(QtWidgets.QTreeWidget): self.setRootIsDecorated(0) self.itemClicked.connect(self._selectionChanged) - self.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection if single - else QtWidgets.QAbstractItemView.ExtendedSelection) + self.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection if single else QtWidgets. + QAbstractItemView.ExtendedSelection) self._fill_widget(elements) self.resizeColumnToContents(0) self.resizeColumnToContents(1) @@ -716,7 +730,7 @@ class PeriodicList(QtWidgets.QTreeWidget): def _fill_widget(self, elements): """Fill tree widget with elements """ if elements is None: - elements = _defaultTableItems + elements = _default_table_items self.tree_items = [] @@ -744,8 +758,10 @@ class PeriodicList(QtWidgets.QTreeWidget): :return: Selected elements :rtype: List[PeriodicTableItem]""" - return [_defaultTableItems[idx] for idx in range(len(self.tree_items)) - if self.tree_items[idx].isSelected()] + return [ + _default_table_items[idx] for idx in range(len(self.tree_items)) + if self.tree_items[idx].isSelected() + ] # setSelection is a bad name (name of a QTreeWidget method) def setSelectedElements(self, symbolList): @@ -758,4 +774,4 @@ class PeriodicList(QtWidgets.QTreeWidget): if isinstance(symbolList[0], PeriodicTableItem): symbolList = [elmt.symbol for elmt in symbolList] for idx in range(len(self.tree_items)): - self.tree_items[idx].setSelected(_defaultTableItems[idx].symbol in symbolList) + self.tree_items[idx].setSelected(_default_table_items[idx].symbol in symbolList) diff --git a/scripts/test/Muon/elemental_analysis/detectors_presenter_test.py b/scripts/test/Muon/elemental_analysis/detectors_presenter_test.py index 5734fcba261b860c1b9d013b42cdffc7abc3afaf..896327f91c571dea1a70fe0acea5983ff9d1060b 100644 --- a/scripts/test/Muon/elemental_analysis/detectors_presenter_test.py +++ b/scripts/test/Muon/elemental_analysis/detectors_presenter_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + diff --git a/scripts/test/Muon/elemental_analysis/element_button_test.py b/scripts/test/Muon/elemental_analysis/element_button_test.py index 01829a3c1445e3ab03e3a501ff21deeab425df91..5682d3bc4cb1fc21d303194f7c50889daee68fab 100644 --- a/scripts/test/Muon/elemental_analysis/element_button_test.py +++ b/scripts/test/Muon/elemental_analysis/element_button_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + diff --git a/scripts/test/Muon/elemental_analysis/elemental_analysis_test.py b/scripts/test/Muon/elemental_analysis/elemental_analysis_test.py index c23d604270406388c16c12847d4f486b9636b63c..b40ebbe2046fecdadcf90e9b19b80337140f9937 100644 --- a/scripts/test/Muon/elemental_analysis/elemental_analysis_test.py +++ b/scripts/test/Muon/elemental_analysis/elemental_analysis_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + @@ -242,22 +242,22 @@ class ElementalAnalysisTest(unittest.TestCase): self.assertEqual(mock_rm_line.call_count, 2) @mock.patch('Muon.GUI.ElementalAnalysis.elemental_analysis.MultiPlotWindow') - def test_load_run_opens_new_plot_window_if_none_open(self, mock_MultiPlotWindow): + def test_load_run_opens_new_plot_window_if_none_open(self, mock_multi_plot_window): self.gui.add_detector_to_plot = mock.Mock() self.gui.load_run('GE1', '2695') - self.assertEqual(mock_MultiPlotWindow.call_count, 1) + self.assertEqual(mock_multi_plot_window.call_count, 1) @mock.patch('Muon.GUI.ElementalAnalysis.elemental_analysis.MultiPlotWindow') - def test_load_run_does_not_open_new_plot_window_if_one_is_open(self, mock_MultiPlotWindow): + def test_load_run_does_not_open_new_plot_window_if_one_is_open(self, mock_multi_plot_window): self.gui.add_detector_to_plot = mock.Mock() self.gui.plot_window = MultiPlotWindow(str('2695')) self.gui.load_run('GE1', 2695) - self.assertEqual(mock_MultiPlotWindow.call_count, 0) + self.assertEqual(mock_multi_plot_window.call_count, 0) @mock.patch('Muon.GUI.ElementalAnalysis.Detectors.detectors_view.QtWidgets.QWidget') - def test_loading_finished_returns_nothing_if_no_run_loaded(self, mock_QWidget): + def test_loading_finished_returns_nothing_if_no_run_loaded(self, mock_qwidget): self.gui.load_widget.last_loaded_run = mock.Mock(return_value=None) - mock_QWidget.return_value = True + mock_qwidget.return_value = True self.gui.plot_window = mock.Mock() self.gui.plotting = mock.Mock() @@ -265,14 +265,13 @@ class ElementalAnalysisTest(unittest.TestCase): self.assertEqual(self.gui.plotting.remove_subplot.call_count, 0) @mock.patch('Muon.GUI.ElementalAnalysis.Detectors.detectors_view.QtWidgets.QWidget') - def test_loading_finished_returns_correctly_if_no_plot_window_but_has_to_plot( - self, mock_QWidget): + def test_loading_finished_returns_correctly_if_no_plot_window_but_has_to_plot(self, mock_qwidget): self.gui.load_widget.last_loaded_run = mock.Mock(return_value=['run1', 'run2', 'run3']) self.gui.detectors.getNames.return_value = ['1', '2', '3'] self.gui.plot_window = None self.gui.plotting = mock.Mock() self.gui.plotting.get_subplots.return_value = ['1', '2', '3'] - mock_QWidget.return_value = True + mock_qwidget.return_value = True self.gui.loading_finished() self.assertEqual(self.gui.detectors.setStateQuietly.call_count, 3) @@ -281,10 +280,10 @@ class ElementalAnalysisTest(unittest.TestCase): @mock.patch('Muon.GUI.ElementalAnalysis.Detectors.detectors_view.QtWidgets.QWidget') def test_loading_finished_returns_correctly_if_no_to_plot_but_has_plot_window( - self, mock_QWidget): + self, mock_qwidget): self.gui.load_widget.last_loaded_run = mock.Mock(return_value=['run1', 'run2', 'run3']) self.gui.detectors.getNames.return_value = ['1', '2', '3'] - mock_QWidget.return_value = True + mock_qwidget.return_value = True self.gui.plot_window = mock.Mock() self.gui.loading_finished() @@ -433,20 +432,24 @@ class ElementalAnalysisTest(unittest.TestCase): self.assertEqual(self.gui.detectors.setStateQuietly.call_count, 1) self.assertEqual(self.gui.plot_window, None) + @mock.patch('Muon.GUI.ElementalAnalysis.elemental_analysis.message_box.warning') @mock.patch('Muon.GUI.ElementalAnalysis.elemental_analysis.PeriodicTablePresenter.set_peak_datafile') @mock.patch('Muon.GUI.ElementalAnalysis.elemental_analysis.QtWidgets.QFileDialog.getOpenFileName') def test_that_set_peak_datafile_is_called_with_select_data_file(self, - mock_getOpenFileName, - mock_set_peak_datafile): - mock_getOpenFileName.return_value = 'filename' + mock_get_open_file_name, + mock_set_peak_datafile, + mock_warning): + mock_get_open_file_name.return_value = 'filename' self.gui.select_data_file() mock_set_peak_datafile.assert_called_with('filename') + self.assertEqual(0, mock_warning.call_count) @mock.patch('Muon.GUI.ElementalAnalysis.elemental_analysis.PeriodicTablePresenter.set_peak_datafile') @mock.patch('Muon.GUI.ElementalAnalysis.elemental_analysis.QtWidgets.QFileDialog.getOpenFileName') - def test_that_select_data_file_uses_the_first_element_of_a_tuple_when_given_as_a_filename( - self, mock_getOpenFileName, mock_set_peak_datafile): - mock_getOpenFileName.return_value = ('string1', 'string2') + def test_that_select_data_file_uses_the_first_element_of_a_tuple_when_given_as_a_filename(self, + mock_get_open_file_name, + mock_set_peak_datafile): + mock_get_open_file_name.return_value = ('string1', 'string2') self.gui.select_data_file() mock_set_peak_datafile.assert_called_with('string1') @@ -454,10 +457,10 @@ class ElementalAnalysisTest(unittest.TestCase): @mock.patch('Muon.GUI.ElementalAnalysis.elemental_analysis.ElementalAnalysisGui._generate_element_widgets') @mock.patch('Muon.GUI.ElementalAnalysis.elemental_analysis.QtWidgets.QFileDialog.getOpenFileName') def test_that_select_data_file_raises_warning_with_correct_text(self, - mock_getOpenFileName, + mock_get_open_file_name, mock_generate_element_widgets, mock_warning): - mock_getOpenFileName.return_value = 'filename' + mock_get_open_file_name.return_value = 'filename' mock_generate_element_widgets.side_effect = self.raise_ValueError_once self.gui.select_data_file() warning_text = 'The file does not contain correctly formatted data, resetting to default data file.'\ diff --git a/scripts/test/Muon/elemental_analysis/lmodel_test.py b/scripts/test/Muon/elemental_analysis/lmodel_test.py index 812750e50a65fa3b0835d15be0c6f33f1ae35122..f292c9641c8274228cf963fcc87f66dd46d9ce13 100644 --- a/scripts/test/Muon/elemental_analysis/lmodel_test.py +++ b/scripts/test/Muon/elemental_analysis/lmodel_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + diff --git a/scripts/test/Muon/elemental_analysis/load_model_test.py b/scripts/test/Muon/elemental_analysis/load_model_test.py index 0eb5ad10b67ccf5dd18fd17fba75eb587158eaa3..a7e4272e2d768479dc55a47c2daad03166fa24aa 100644 --- a/scripts/test/Muon/elemental_analysis/load_model_test.py +++ b/scripts/test/Muon/elemental_analysis/load_model_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + diff --git a/scripts/test/Muon/elemental_analysis/name_generator_test.py b/scripts/test/Muon/elemental_analysis/name_generator_test.py index dd00f2f4e00712ede2673dce488665e82d9a4592..1c0b151dd93daa43a99bafb01a33bdb6a4c72b0c 100644 --- a/scripts/test/Muon/elemental_analysis/name_generator_test.py +++ b/scripts/test/Muon/elemental_analysis/name_generator_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + diff --git a/scripts/test/Muon/elemental_analysis/peak_selector_view_test.py b/scripts/test/Muon/elemental_analysis/peak_selector_view_test.py index 2aa3d7e9c57afdddd6c758bb40fa0455a9816f7a..7b9e7005138cee2033acc10682cef4eaede859d0 100644 --- a/scripts/test/Muon/elemental_analysis/peak_selector_view_test.py +++ b/scripts/test/Muon/elemental_analysis/peak_selector_view_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + diff --git a/scripts/test/Muon/elemental_analysis/periodic_combo_test.py b/scripts/test/Muon/elemental_analysis/periodic_combo_test.py index 46e611dbcd1a8b2792386cb358796201a7521278..459a75097aa55015551067cdc7961e9538198f75 100644 --- a/scripts/test/Muon/elemental_analysis/periodic_combo_test.py +++ b/scripts/test/Muon/elemental_analysis/periodic_combo_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + @@ -49,13 +49,13 @@ class PeriodicComboTest(unittest.TestCase): combo.sigSelectionChanged = mock.Mock() combo._selectionChanged(1) - combo.sigSelectionChanged.emit.assert_called_with(periodic_table._defaultTableItems[1]) + combo.sigSelectionChanged.emit.assert_called_with(periodic_table._default_table_items[1]) def test_that_selected_item_is_correct(self): combo = PeriodicCombo() combo.currentIndex = mock.Mock(return_value=1) - self.assertEqual(combo.getSelection(), periodic_table._defaultTableItems[1]) + self.assertEqual(combo.getSelection(), periodic_table._default_table_items[1]) def test_that_setSelection_sets_correct_selection_if_given_symbol(self): combo = PeriodicCombo() diff --git a/scripts/test/Muon/elemental_analysis/periodic_list_test.py b/scripts/test/Muon/elemental_analysis/periodic_list_test.py index d74f8653f5ddf3b2da573f00f0a14e304c0b14e0..d3051c708887358c57d7b9a568123d75991736ab 100644 --- a/scripts/test/Muon/elemental_analysis/periodic_list_test.py +++ b/scripts/test/Muon/elemental_analysis/periodic_list_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + @@ -37,14 +37,14 @@ class PeriodicListTest(unittest.TestCase): def test_that_fill_widget_uses_defaultTableItems_when_argument_is_none(self, mock_items): self.plist._fill_widget(None) - exp_num_calls = len(periodic_table._defaultTableItems) + exp_num_calls = len(periodic_table._default_table_items) self.assertEqual(mock_items.call_count, exp_num_calls) self.assertEqual(len(self.plist.tree_items), exp_num_calls) @mock.patch('Muon.GUI.ElementalAnalysis.PeriodicTable.periodic_table.QtWidgets.QTreeWidgetItem') def test_that_fill_widget_uses_custom_items_when_argument_is_not_none(self, mock_items): exp_num_calls = 3 - self.plist._fill_widget(periodic_table._defaultTableItems[:exp_num_calls]) + self.plist._fill_widget(periodic_table._default_table_items[:exp_num_calls]) self.assertEqual(mock_items.call_count, exp_num_calls) self.assertEqual(len(self.plist.tree_items), exp_num_calls) @@ -58,9 +58,9 @@ class PeriodicListTest(unittest.TestCase): self.plist._fill_widget(None) assert all([self.plist.tree_items[i].text(0) == str(el.Z) - for i, el in enumerate(periodic_table._defaultTableItems)]) + for i, el in enumerate(periodic_table._default_table_items)]) assert all([self.plist.tree_items[i].text(1) == el.symbol - for i, el in enumerate(periodic_table._defaultTableItems)]) + for i, el in enumerate(periodic_table._default_table_items)]) def test_that_selectionChanged_emits_correct_signal(self): self.plist.sigSelectionChanged = mock.Mock() @@ -75,9 +75,9 @@ class PeriodicListTest(unittest.TestCase): ret = self.plist.getSelection() self.assertEqual(len(ret), 3) - self.assertEqual(ret, [periodic_table._defaultTableItems[0], - periodic_table._defaultTableItems[1], - periodic_table._defaultTableItems[2]]) + self.assertEqual(ret, [periodic_table._default_table_items[0], + periodic_table._default_table_items[1], + periodic_table._default_table_items[2]]) def test_that_setSelectedElements_throws_when_given_no_elements(self): with self.assertRaises(IndexError): diff --git a/scripts/test/Muon/elemental_analysis/periodic_table_item_test.py b/scripts/test/Muon/elemental_analysis/periodic_table_item_test.py index c6dcdf45972a4f8ebe410829142559e82da283a6..937851bffe2236778173e44c8d484b45518f3cc3 100644 --- a/scripts/test/Muon/elemental_analysis/periodic_table_item_test.py +++ b/scripts/test/Muon/elemental_analysis/periodic_table_item_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + diff --git a/scripts/test/Muon/elemental_analysis/periodic_table_test.py b/scripts/test/Muon/elemental_analysis/periodic_table_test.py index 64ebf1c0af88568964f49c06f48cbf2550b61582..d4782e2bf6e1dc6f1d9e3003445b9ee7f2ffcf20 100644 --- a/scripts/test/Muon/elemental_analysis/periodic_table_test.py +++ b/scripts/test/Muon/elemental_analysis/periodic_table_test.py @@ -1,6 +1,6 @@ # Mantid Repository : https://github.com/mantidproject/mantid # -# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI, +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, # NScD Oak Ridge National Laboratory, European Spallation Source # & Institut Laue - Langevin # SPDX - License - Identifier: GPL - 3.0 + diff --git a/scripts/test/Muon/elemental_analysis/test_peak_data_file.py b/scripts/test/Muon/elemental_analysis/test_peak_data_file.py new file mode 100644 index 0000000000000000000000000000000000000000..f02648d5584eb4f6daebbbb49f59ff3406e6f933 --- /dev/null +++ b/scripts/test/Muon/elemental_analysis/test_peak_data_file.py @@ -0,0 +1,65 @@ +# Mantid Repository : https://github.com/mantidproject/mantid +# +# Copyright © 2019 ISIS Rutherford Appleton Laboratory UKRI, +# NScD Oak Ridge National Laboratory, European Spallation Source +# & Institut Laue - Langevin +# SPDX - License - Identifier: GPL - 3.0 + + +from __future__ import print_function, absolute_import + +from qtpy.QtGui import QCloseEvent +import matplotlib +import unittest +import json +import pprint + +from mantid.py3compat import mock +from mantidqt.utils.qt.testing import start_qapplication +from testhelpers import assertRaisesNothing + +from Muon.GUI.ElementalAnalysis.elemental_analysis import ElementalAnalysisGui +from Muon.GUI.ElementalAnalysis.elemental_analysis import gen_name +from MultiPlotting.multi_plotting_widget import MultiPlotWindow +from MultiPlotting.multi_plotting_widget import MultiPlotWidget +from MultiPlotting.label import Label +from Muon.GUI.ElementalAnalysis.PeriodicTable.periodic_table_model import PeriodicTableModel +from Muon.GUI.ElementalAnalysis.PeriodicTable.periodic_table import _elements +from Muon.GUI.ElementalAnalysis.PeriodicTable.PeakSelector.peak_selector_view import valid_data + + +class PeakDataFileTest(unittest.TestCase): + def setUp(self): + self.file_name = PeriodicTableModel().get_default_peak_data_file() + with open(self.file_name, 'r') as _file: + self.data = json.load(_file) + self.el_names = [data[0] for data in _elements] + + def test_every_peak_is_assigned_to_an_element(self): + for key in self.data.keys(): + self.assertIn(key, self.el_names) + + def test_every_element_contains_valid_data(self): + for element, data in self.data.items(): + if not valid_data(data): + raise Exception("Element '{}' does not contain valid data".format(element)) + + def test_some_elements_have_gamma_peaks(self): + if not any(['Gammas' in data.keys() for _, data in self.data.items()]): + raise Exception('No element has gamma peaks') + + def test_some_elements_have_electron_peaks(self): + if not any(['Electrons' in data.keys() for _, data in self.data.items()]): + raise Exception('No element has electron peaks') + + def test_atomic_number_matches_the_one_in_periodic_table(self): + for element in _elements: + from_file = self.data.get(element[0], None) + if from_file is not None: + self.assertEqual(element[1], from_file['Z']) + + def test_atomic_mass_matches_the_one_in_periodic_table(self): + for element in _elements: + from_file = self.data.get(element[0], None) + if from_file is not None and from_file['A'] is not None: + self.assertAlmostEqual(element[5], from_file['A']) +