def test_fail_to_add_yerr_for_another_yerr(self): mc = MarkedColumns() mc.add_y(0) mc.add_y(1) mc.add_y(2) mc.add_y(3) mc.add_y_err(ErrorColumn(1, 0)) expected = [(0, '[Y0]'), (2, '[Y1]'), (3, '[Y2]'), (1, '[Y0_YErr]')] self.assertEqual(expected, mc.build_labels()) self.assertRaises(ValueError, lambda: mc.add_y_err(ErrorColumn(0, 1)))
def test_add_y_err(self): """ Test adding YErr columns that do not overlap in any way """ mc = MarkedColumns() ec = ErrorColumn(2, 4) mc.add_y_err(ec) self.assertEqual(1, len(mc.as_y_err)) ec = ErrorColumn(3, 5) mc.add_y_err(ec) self.assertEqual(2, len(mc.as_y_err)) ec = ErrorColumn(1, 6) mc.add_y_err(ec) self.assertEqual(3, len(mc.as_y_err))
def test_add_y_err_duplicate_column(self): mc = MarkedColumns() ec = ErrorColumn(2, 4) mc.add_y_err(ec) self.assertEqual(1, len(mc.as_y_err)) mc.add_y_err(ec) self.assertEqual(1, len(mc.as_y_err)) ec2 = ErrorColumn(3, 5) mc.add_y_err(ec2) self.assertEqual(2, len(mc.as_y_err)) mc.add_y_err(ec2) self.assertEqual(2, len(mc.as_y_err))
def test_build_labels_y_and_yerr_change_middle(self): mc = MarkedColumns() mc.add_y(0) mc.add_y(1) mc.add_y(2) # change one of the columns to YErr mc.add_y_err(ErrorColumn(1, 0)) expected = [(0, '[Y0]'), (2, '[Y1]'), (1, '[Y0_YErr]')] self.assertEqual(expected, mc.build_labels()) # change the last Y column to YErr mc.add_y_err(ErrorColumn(2, 0)) expected = [(0, '[Y0]'), (2, '[Y0_YErr]')] self.assertEqual(expected, mc.build_labels())
def __init__(self, ws): """ Initialise the model with the workspace :param ws: Workspace to be used for providing data :raises ValueError: if the workspace is not supported """ self.supports(ws) self.ws = ws self.ws_num_rows = self.ws.rowCount() self.ws_num_cols = self.ws.columnCount() self.marked_columns = MarkedColumns() self._original_column_headers = self.get_column_headers() # loads the types of the columns for col in range(self.ws_num_cols): plot_type = self.ws.getPlotType(col) if plot_type == TableWorkspaceColumnTypeMapping.X: self.marked_columns.add_x(col) elif plot_type == TableWorkspaceColumnTypeMapping.Y: self.marked_columns.add_y(col) elif plot_type == TableWorkspaceColumnTypeMapping.YERR: # mark YErrs only if there are any columns that have been marked as Y # if there are none then do not mark anything as YErr if len(self.marked_columns.as_y) > len( self.marked_columns.as_y_err): # Assume all the YErrs are associated with the first available (no other YErr has it) Y column. # There isn't a way to know the correct Y column, as that information is not stored # in the table workspace - the original table workspace does not associate Y errors # columns with specific Y columns err_for_column = self.marked_columns.as_y[len( self.marked_columns.as_y_err)] label = str(len(self.marked_columns.as_y_err)) self.marked_columns.add_y_err( ErrorColumn(col, err_for_column, label))
def __init__(self, ws): """ Initialise the model with the workspace :param ws: Workspace to be used for providing data :raises ValueError: if the workspace is not supported """ self.supports(ws) self.ws = ws self.ws_num_rows = self.ws.rowCount() self.ws_num_cols = self.ws.columnCount() self.marked_columns = MarkedColumns() self._original_column_headers = self.get_column_headers() # loads the types of the columns for col in range(self.ws_num_cols): plot_type = self.ws.getPlotType(col) if plot_type == TableWorkspaceColumnTypeMapping.X: self.marked_columns.add_x(col) elif plot_type == TableWorkspaceColumnTypeMapping.Y: self.marked_columns.add_y(col) elif plot_type == TableWorkspaceColumnTypeMapping.YERR: err_for_column = self.ws.getLinkedYCol(col) if err_for_column >= 0: self.marked_columns.add_y_err(ErrorColumn(col, err_for_column))
def test_build_labels_y_and_yerr_change_first(self): mc = MarkedColumns() mc.add_y(0) mc.add_y(1) mc.add_y(2) # change one of the columns to YErr mc.add_y_err(ErrorColumn(0, 1)) # note: the first column is being set -> this decreases the label index of all columns to its right by 1 expected = [(1, '[Y0]'), (2, '[Y1]'), (0, '[Y0_YErr]')] self.assertEqual(expected, mc.build_labels()) # change the last Y column to YErr mc.add_y_err(ErrorColumn(2, 1)) expected = [(1, '[Y0]'), (2, '[Y0_YErr]')] self.assertEqual(expected, mc.build_labels())
def test_remove_column(self): mc = MarkedColumns() mc.add_y(4) mc.add_x(3) ec = ErrorColumn(column=2, related_y_column=6) mc.add_y_err(ec) self.assertEqual(1, len(mc.as_x)) self.assertEqual(1, len(mc.as_y)) self.assertEqual(1, len(mc.as_y_err)) mc.remove(4) self.assertEqual(0, len(mc.as_y)) self.assertEqual(1, len(mc.as_y_err)) self.assertEqual(1, len(mc.as_x)) mc.remove(3) self.assertEqual(0, len(mc.as_x)) self.assertEqual(0, len(mc.as_y)) self.assertEqual(1, len(mc.as_y_err)) mc.remove(2) self.assertEqual(0, len(mc.as_x)) self.assertEqual(0, len(mc.as_y)) self.assertEqual(0, len(mc.as_y_err))
def action_set_as_y_err(self, related_y_column): """ :param related_y_column: The real index of the column for which the error is being marked :param label_index: The index present in the label of the column for which the error is being marked This will be the number in <ColumnName>[Y10] -> the 10 """ try: selected_column = self._get_selected_columns( 1, self.TOO_MANY_TO_SET_AS_Y_ERR_MESSAGE) except ValueError: return try: err_column = ErrorColumn(selected_column, related_y_column) except ValueError as e: self.presenter.view.show_warning(str(e)) return removed_items = self.presenter.model.marked_columns.add_y_err( err_column) # if a column other than the one the user has just picked as a y err column has been affected, # reset it's type to None for col in removed_items: if col != selected_column: self.presenter.model.set_column_type(int(col), 0) self.presenter.model.set_column_type(selected_column, 5, related_y_column) self.presenter.update_column_headers()
def test_build_labels_y_with_only_some_having_yerr(self): mc = MarkedColumns() mc.add_y(0) mc.add_y(1) mc.add_y_err(ErrorColumn(2,1)) expected = [(0, '[Y0]'), (1, '[Y1]'), (2, '[Y1_YErr]')] self.assertEqual(expected, mc.build_labels())
def test_find_yerr(self): mc = MarkedColumns() mc.add_y(0) mc.add_y(1) mc.add_y(2) mc.add_y(3) mc.add_y_err(ErrorColumn(4, 1)) expected = {1: 4} self.assertEqual(expected, mc.find_yerr([1])) # Replace the Y column, which has an associated YErr. This should remove the YErr as well mc.add_y_err(ErrorColumn(1, 3)) expected = {3: 1} self.assertEqual(expected, mc.find_yerr([0, 1, 2, 3])) mc.add_y_err(ErrorColumn(4, 2)) expected = {2: 4, 3: 1} self.assertEqual(expected, mc.find_yerr([0, 1, 2, 3]))
def test_build_labels_x_y_and_yerr(self): mc = MarkedColumns() mc.add_y(0) mc.add_y(1) mc.add_y(2) mc.add_y(3) mc.add_y_err(ErrorColumn(1, 0)) expected = [(0, '[Y0]'), (2, '[Y1]'), (3, '[Y2]'), (1, '[Y0_YErr]')] self.assertEqual(expected, mc.build_labels()) expected = [(1, '[X0]'), (0, '[Y0]'), (2, '[Y1]'), (3, '[Y2]')] mc.add_x(1) self.assertEqual(expected, mc.build_labels()) expected = [(1, '[X0]'), (2, '[Y0]'), (3, '[Y1]'), (0, '[Y1_YErr]')] mc.add_y_err(ErrorColumn(0, 3)) self.assertEqual(expected, mc.build_labels())
def test_add_y_err_duplicate_column_different_reference_col(self): """ Test for adding a new YErr column with a _different_ source column but same reference column -> The new YErr must replace the old one """ mc = MarkedColumns() ec = ErrorColumn(column=2, related_y_column=4) mc.add_y_err(ec) self.assertEqual(1, len(mc.as_y_err)) self.assertEqual(2, mc.as_y_err[0].column) self.assertEqual(4, mc.as_y_err[0].related_y_column) # different source column but contains error for the same column # adding this one should replace the first one ec2 = ErrorColumn(column=3, related_y_column=4) mc.add_y_err(ec2) self.assertEqual(1, len(mc.as_y_err)) self.assertEqual(3, mc.as_y_err[0].column) self.assertEqual(4, mc.as_y_err[0].related_y_column)
def decode(obj_dic, _=None): import matplotlib.pyplot as plt pres = TableWorkspaceDisplay(ADS.retrieve(obj_dic["workspace"]), name=obj_dic["windowName"], plot=plt) pres.model.marked_columns.as_x = obj_dic["markedColumns"]["as_x"] pres.model.marked_columns.as_y = obj_dic["markedColumns"]["as_y"] error_columns = [] for y_err in obj_dic["markedColumns"]["as_y_err"]: error_columns.append(ErrorColumn(column=y_err["column"], related_y_column=y_err["relatedY"])) pres.model.marked_columns.as_y_err = error_columns pres.update_column_headers() return pres.container
def test_eq_versus_ErrorColumn(self): ec1 = ErrorColumn(0, 1, 0) ec2 = ErrorColumn(0, 1, 0) self.assertEqual(ec1, ec2) ec1 = ErrorColumn(0, 3, 0) ec2 = ErrorColumn(0, 1, 0) self.assertEqual(ec1, ec2) ec1 = ErrorColumn(2, 3, 0) ec2 = ErrorColumn(0, 3, 0) self.assertEqual(ec1, ec2)
def test_changing_y_to_none_removes_associated_yerr_columns(self): """ Test to check if a first column is marked as Y, a second column YErr is associated with it, but then the first one is changed to X - the YErr mark should be removed """ mc = MarkedColumns() mc.add_y(4) ec = ErrorColumn(column=2, related_y_column=4, label_index=0) mc.add_y_err(ec) # check that we have both a Y col and an associated YErr self.assertEqual(1, len(mc.as_y)) self.assertEqual(1, len(mc.as_y_err)) mc.remove(4) # changing the column to NONE should have removed it from X, Y and YErr self.assertEqual(0, len(mc.as_x)) self.assertEqual(0, len(mc.as_y)) self.assertEqual(0, len(mc.as_y_err))
def action_set_as_y_err(self, related_y_column, label_index): """ :param related_y_column: The real index of the column for which the error is being marked :param label_index: The index present in the label of the column for which the error is being marked This will be the number in <ColumnName>[Y10] -> the 10 """ try: selected_column = self._get_selected_columns(1, self.TOO_MANY_TO_SET_AS_Y_ERR_MESSAGE) except ValueError: return try: err_column = ErrorColumn(selected_column, related_y_column, label_index) except ValueError as e: self.view.show_warning(str(e)) return self.model.marked_columns.add_y_err(err_column) self.model.set_column_type(selected_column, 5) self.update_column_headers()
def test_changing_y_to_x_removes_associated_yerr_columns(self): """ Test to check if a first column is marked as Y, a second column YErr is associated with it, but then the first one is changed to X - the YErr mark should be removed """ mc = MarkedColumns() mc.add_y(4) ec = ErrorColumn(column=2, related_y_column=4) mc.add_y_err(ec) # check that we have both a Y col and an associated YErr self.assertEqual(1, len(mc.as_y)) self.assertEqual(1, len(mc.as_y_err)) mc.add_x(4) # changing the column to X should have removed it from Y and Yerr self.assertEqual(1, len(mc.as_x)) self.assertEqual(0, len(mc.as_y)) self.assertEqual(0, len(mc.as_y_err)) # check setting the column back to Y does not automatically reinstate the error column mc.add_y(4) self.assertEqual(1, len(mc.as_y)) self.assertEqual(0, len(mc.as_y_err))
def test_int(self): ec = ErrorColumn(1, 2) self.assertEqual(int(ec), 1)
def test_eq_versus_same_int(self): ec = ErrorColumn(150, 1, 0) self.assertEqual(ec, 150)
def test_eq_unsupported_type(self): ec = ErrorColumn(150, 1, 0) self.assertRaises(RuntimeError, lambda: ec == "awd")
def test_correct_init(self): ErrorColumn(0, 1, 0)
def test_raises_for_same_y_and_yerr(self): self.assertRaises(ValueError, lambda: ErrorColumn(2, 2, 3))