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())
Пример #5
0
    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))
Пример #6
0
    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))
Пример #9
0
    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)
Пример #14
0
    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)
Пример #16
0
    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))
Пример #17
0
    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))