Пример #1
0
    def test_add_histogram(self, rotate):
        """
        Tests adding a histogram.
        """
        item = HistogramItem(rotate=rotate)

        # Assert no data items.
        self._assert_histogram_item_array_lengths(item, 0)

        data = np.random.random(100)

        item.add_histogram(data)

        data_items = item.listDataItems()
        self._assert_histogram_item_array_lengths(item, 1)
Пример #2
0
    def __init__(self):
        super(EventAnalysisPlotWidget, self).__init__()

        self.plot_event_depth = HistogramItem(title='Event Depth', rotate=True)
        self.addItem(self.plot_event_depth)
        self.plot_event_depth.setMouseEnabled(x=False, y=True)
        self.plot_event_dur_event_depth = self.addPlot(name='Depth vs. Duration', title='Depth vs. Duration')
        self.plot_event_depth.setYLink('Depth vs. Duration')

        self.nextRow()

        self.plot_scatter_select = self.addPlot(title='Single Event')

        self.plot_event_dur = HistogramItem(title='Event Duration')
        self.addItem(self.plot_event_dur)
        self.plot_event_dur.setXLink('Depth vs. Duration')
        self.plot_event_dur.setMouseEnabled(x=True, y=False)

        self.last_scatter_clicked = []

        self.n_bins = 0
        self.bins = np.zeros(0)
Пример #3
0
    def test_remove_first_histogram(self, rotate):
        """
        Tests that removing the first histogram works.
        """
        item = HistogramItem(rotate=rotate)

        data = np.random.random(100)

        item.add_histogram(data)

        data2 = np.random.random(200)

        item.add_histogram(data2)

        data_item2 = item.listDataItems()[1]

        item.remove_item_at(0)

        self._assert_histogram_item_array_lengths(item, 1)

        data_item_left = item.listDataItems()[0]

        self.assertEqual(data_item2, data_item_left)
Пример #4
0
    def __init__(self):
        super(EventAnalysisPlotWidget, self).__init__()

        self.plot_event_depth = HistogramItem(title='Event Depth', rotate=True)
        self.addItem(self.plot_event_depth)
        self.plot_event_depth.setMouseEnabled(x=False, y=True)
        self.plot_event_dur_event_depth = self.addPlot(
            name='Depth vs. Duration', title='Depth vs. Duration')
        self.plot_event_depth.setYLink('Depth vs. Duration')

        self.nextRow()

        self.plot_scatter_select = self.addPlot(title='Single Event')

        self.plot_event_dur = HistogramItem(title='Event Duration')
        self.addItem(self.plot_event_dur)
        self.plot_event_dur.setXLink('Depth vs. Duration')
        self.plot_event_dur.setMouseEnabled(x=True, y=False)

        self.last_scatter_clicked = []

        self.n_bins = 0
        self.bins = np.zeros(0)
Пример #5
0
    def test_add_2_histograms_same_data(self, rotate):
        """
        Tests that adding 2 histograms with the same data is ok.
        """
        item = HistogramItem(rotate=rotate)

        data = np.random.random(100)

        item.add_histogram(data)

        item.add_histogram(data)
        self._assert_histogram_item_array_lengths(item, 2)
Пример #6
0
    def test_remove_only_histogram(self, rotate):
        """
        Tests that removing the only item works.
        """
        item = HistogramItem(rotate=rotate)

        data = np.random.random(100)

        item.add_histogram(data)

        self._assert_histogram_item_array_lengths(item, 1)

        item.remove_item_at(0)

        self._assert_histogram_item_array_lengths(item, 0)
Пример #7
0
    def test_add_2nd_histogram_less_points(self, rotate):
        """
        Tests that adding a 2nd histogram with less points doesn't change number of bins.
        """
        item = HistogramItem(rotate=rotate)

        data = np.random.random(1000)

        item.add_histogram(data)
        n_bins = item.n_bins

        data2 = np.random.random(100)

        item.add_histogram(data2)

        self._assert_histogram_item_array_lengths(item, 2)
        self.assertEqual(item.n_bins, n_bins)
Пример #8
0
    def test_add_2nd_histogram_more_points(self, rotate):
        """
        Tests that adding a 2nd histogram with more points increases the number of bins.
        """
        item = HistogramItem(rotate=rotate)

        data = np.random.random(100)

        item.add_histogram(data)
        n_bins = item.n_bins

        data2 = np.random.random(1000)

        item.add_histogram(data2)

        self._assert_histogram_item_array_lengths(item, 2)
        self.assertGreater(item.n_bins, n_bins)
Пример #9
0
    def test_add_2nd_histogram_wider_range(self, rotate):
        """
        Tests that we can add a 2nd histogram with wider data. The max should increase, min
        should decrease, n_bins should stay same (default n_bins depends on length of data).
        """
        item = HistogramItem(rotate=rotate)

        # 0 < data[i] < 1
        data = np.random.random(100)
        # -50 < data[i] < 50
        data2 = np.random.random(100) * 100 - 50

        item.add_histogram(data)

        maximum = item.maximum
        minimum = item.minimum
        n_bins = item.n_bins

        item.add_histogram(data2)

        self._assert_histogram_item_array_lengths(item, 2)
        self.assertLess(item.minimum, minimum)
        self.assertGreater(item.maximum, maximum)
        self.assertEqual(item.n_bins, n_bins)
Пример #10
0
    def test_add_2nd_histogram_narrower_range(self, rotate):
        """
        Tests that we can add a 2nd histogram with narrower (max-min) data. This should not
        change the histograms max/min or the number of bins.
        """
        item = HistogramItem(rotate=rotate)

        # -50 < data[i] < 50
        data = np.random.random(100) * 100 - 50

        item.add_histogram(data)

        maximum = item.maximum
        minimum = item.minimum
        n_bins = item.n_bins

        # 0 < data[i] < 1
        data2 = np.random.random(100)
        item.add_histogram(data2)

        self._assert_histogram_item_array_lengths(item, 2)
        self.assertEqual(item.maximum, maximum)
        self.assertEqual(item.minimum, minimum)
        self.assertEqual(item.n_bins, n_bins)
Пример #11
0
class EventAnalysisPlotWidget(GraphicsLayoutWidget):
    def __init__(self):
        super(EventAnalysisPlotWidget, self).__init__()

        self.plot_event_depth = HistogramItem(title='Event Depth', rotate=True)
        self.addItem(self.plot_event_depth)
        self.plot_event_depth.setMouseEnabled(x=False, y=True)
        self.plot_event_dur_event_depth = self.addPlot(name='Depth vs. Duration', title='Depth vs. Duration')
        self.plot_event_depth.setYLink('Depth vs. Duration')

        self.nextRow()

        self.plot_scatter_select = self.addPlot(title='Single Event')

        self.plot_event_dur = HistogramItem(title='Event Duration')
        self.addItem(self.plot_event_dur)
        self.plot_event_dur.setXLink('Depth vs. Duration')
        self.plot_event_dur.setMouseEnabled(x=True, y=False)

        self.last_scatter_clicked = []

        self.n_bins = 0
        self.bins = np.zeros(0)

    def add_selections(self, file_names, params):
        """
        Plots event statistics.
        """
        files = []
        counts = []
        event_count = 0
        for filename in file_names:
            h5file = ed.open_file(filename, mode='r')
            files.append(h5file)
            count = h5file.get_event_count()
            event_count += count
            counts.append(count)

        current_blockade = np.empty(event_count)
        dwell_times = np.empty(event_count)
        count = 0
        for j, filex in enumerate(files):
            event_table = filex.get_event_table()
            sample_rate = filex.get_sample_rate()
            for i, row in enumerate(event_table):
                current_blockade[count + i] = row['current_blockage']
                dwell_times[count + i] = row['event_length'] / sample_rate
            count += counts[j]

        color = params['color']
        new_color = QtGui.QColor(color.red(), color.green(), color.blue(), 128)

        self.plot_event_dur.add_histogram(dwell_times, color=new_color)

        self.plot_event_depth.add_histogram(current_blockade, color=new_color)

        scatter_item = ScatterPlotItem(size=10, pen=mkPen(None), brush=new_color, files=file_names, counts=counts)
        scatter_item.setData(dwell_times, current_blockade)
        self.plot_event_dur_event_depth.addItem(scatter_item)
        scatter_item.sigClicked.connect(self.on_scatter_points_clicked)

        for filex in files:
            filex.close()

        return

    def remove_filter(self, index):
        self.plot_event_dur.remove_item_at(index)
        self.plot_event_depth.remove_item_at(index)
        self.plot_event_dur_event_depth.removeItem(self.plot_event_dur_event_depth.listDataItems()[index])

    def on_scatter_points_clicked(self, plot, points):
        """
        Callback for when a scatter plot points are clicked.
        Highlights the points and un-highlights previously selected points.

        plot should be a MyScatterPlotItem
        points should be a MySpotItem
        """
        for p in self.last_scatter_clicked:
            p.resetPen()
            # remove point we've already selected so we
            # can select points behind it.
            if p in points and len(points) > 1:
                points.remove(p)
            #         print 'Points clicked:', points, plot
        for point in points:
            point.setPen('w', width=2)
            self.last_scatter_clicked = [point]
            break  # only take first point

        # Plot the new point clicked on the single event display
        filename, position = plot.get_file_name_from_position(self.last_scatter_clicked[0].event_position)

        h5file = ed.open_file(filename, mode='r')

        row = h5file.get_event_row(position)
        array_row = row['array_row']
        sample_rate = h5file.get_sample_rate()
        event_length = row['event_length']
        raw_points_per_side = row['raw_points_per_side']

        raw_data = h5file.get_raw_data_at(array_row)

        n = len(raw_data)

        times = np.linspace(0.0, 1.0 * n / sample_rate, n)

        self.plot_scatter_select.clear()
        self.plot_scatter_select.plot(times, raw_data)
        # plot the event points in yellow
        self.plot_scatter_select.plot(times[raw_points_per_side:raw_points_per_side + event_length],
                                      raw_data[raw_points_per_side:raw_points_per_side + event_length], pen='y')

        # Plot the cusum levels
        n_levels = row['n_levels']
        baseline = row['baseline']
        # left, start-1, start,
        levels = h5file.get_levels_at(array_row)
        indices = h5file.get_level_lengths_at(array_row)

        level_times = np.zeros(2 * n_levels + 4)
        level_values = np.zeros(2 * n_levels + 4)

        level_times[1] = 1.0 * (raw_points_per_side - 1) / sample_rate
        level_values[0] = level_values[1] = baseline
        i = 0
        length = 0
        for i in xrange(n_levels):
            level_times[2 * i + 2] = times[raw_points_per_side] + 1.0 * length / sample_rate
            level_values[2 * i + 2] = levels[i]
            level_times[2 * i + 3] = times[raw_points_per_side] + 1.0 * (length + indices[i]) / sample_rate
            level_values[2 * i + 3] = levels[i]
            length += indices[i]
        i += 1
        level_times[2 * i + 2] = times[raw_points_per_side + event_length]
        level_times[2 * i + 3] = times[n - 1]
        level_values[2 * i + 2] = level_values[2 * i + 3] = baseline

        self.plot_scatter_select.plot(level_times, level_values, pen='g')

        h5file.close()
Пример #12
0
class EventAnalysisPlotWidget(GraphicsLayoutWidget):
    def __init__(self):
        super(EventAnalysisPlotWidget, self).__init__()

        self.plot_event_depth = HistogramItem(title='Event Depth', rotate=True)
        self.addItem(self.plot_event_depth)
        self.plot_event_depth.setMouseEnabled(x=False, y=True)
        self.plot_event_dur_event_depth = self.addPlot(
            name='Depth vs. Duration', title='Depth vs. Duration')
        self.plot_event_depth.setYLink('Depth vs. Duration')

        self.nextRow()

        self.plot_scatter_select = self.addPlot(title='Single Event')

        self.plot_event_dur = HistogramItem(title='Event Duration')
        self.addItem(self.plot_event_dur)
        self.plot_event_dur.setXLink('Depth vs. Duration')
        self.plot_event_dur.setMouseEnabled(x=True, y=False)

        self.last_scatter_clicked = []

        self.n_bins = 0
        self.bins = np.zeros(0)

    def add_selections(self, file_names, params):
        """
        Plots event statistics.
        """
        files = []
        counts = []
        event_count = 0
        for filename in file_names:
            h5file = ed.open_file(filename, mode='r')
            files.append(h5file)
            count = h5file.get_event_count()
            event_count += count
            counts.append(count)

        current_blockade = np.empty(event_count)
        dwell_times = np.empty(event_count)
        count = 0
        for j, filex in enumerate(files):
            event_table = filex.get_event_table()
            sample_rate = filex.get_sample_rate()
            for i, row in enumerate(event_table):
                current_blockade[count + i] = row['current_blockage']
                dwell_times[count + i] = row['event_length'] / sample_rate
            count += counts[j]

        color = params['color']
        new_color = QtGui.QColor(color.red(), color.green(), color.blue(), 128)

        self.plot_event_dur.add_histogram(dwell_times, color=new_color)

        self.plot_event_depth.add_histogram(current_blockade, color=new_color)

        scatter_item = ScatterPlotItem(size=10,
                                       pen=mkPen(None),
                                       brush=new_color,
                                       files=file_names,
                                       counts=counts)
        scatter_item.setData(dwell_times, current_blockade)
        self.plot_event_dur_event_depth.addItem(scatter_item)
        scatter_item.sigClicked.connect(self.on_scatter_points_clicked)

        for filex in files:
            filex.close()

        return

    def remove_filter(self, index):
        self.plot_event_dur.remove_item_at(index)
        self.plot_event_depth.remove_item_at(index)
        self.plot_event_dur_event_depth.removeItem(
            self.plot_event_dur_event_depth.listDataItems()[index])

    def on_scatter_points_clicked(self, plot, points):
        """
        Callback for when a scatter plot points are clicked.
        Highlights the points and un-highlights previously selected points.

        plot should be a MyScatterPlotItem
        points should be a MySpotItem
        """
        for p in self.last_scatter_clicked:
            p.resetPen()
            # remove point we've already selected so we
            # can select points behind it.
            if p in points and len(points) > 1:
                points.remove(p)
            #         print 'Points clicked:', points, plot
        for point in points:
            point.setPen('w', width=2)
            self.last_scatter_clicked = [point]
            break  # only take first point

        # Plot the new point clicked on the single event display
        filename, position = plot.get_file_name_from_position(
            self.last_scatter_clicked[0].event_position)

        h5file = ed.open_file(filename, mode='r')

        row = h5file.get_event_row(position)
        array_row = row['array_row']
        sample_rate = h5file.get_sample_rate()
        event_length = row['event_length']
        raw_points_per_side = row['raw_points_per_side']

        raw_data = h5file.get_raw_data_at(array_row)

        n = len(raw_data)

        times = np.linspace(0.0, 1.0 * n / sample_rate, n)

        self.plot_scatter_select.clear()
        self.plot_scatter_select.plot(times, raw_data)
        # plot the event points in yellow
        self.plot_scatter_select.plot(
            times[raw_points_per_side:raw_points_per_side + event_length],
            raw_data[raw_points_per_side:raw_points_per_side + event_length],
            pen='y')

        # Plot the cusum levels
        n_levels = row['n_levels']
        baseline = row['baseline']
        # left, start-1, start,
        levels = h5file.get_levels_at(array_row)
        indices = h5file.get_level_lengths_at(array_row)

        level_times = np.zeros(2 * n_levels + 4)
        level_values = np.zeros(2 * n_levels + 4)

        level_times[1] = 1.0 * (raw_points_per_side - 1) / sample_rate
        level_values[0] = level_values[1] = baseline
        i = 0
        length = 0
        for i in xrange(n_levels):
            level_times[
                2 * i +
                2] = times[raw_points_per_side] + 1.0 * length / sample_rate
            level_values[2 * i + 2] = levels[i]
            level_times[2 * i + 3] = times[raw_points_per_side] + 1.0 * (
                length + indices[i]) / sample_rate
            level_values[2 * i + 3] = levels[i]
            length += indices[i]
        i += 1
        level_times[2 * i + 2] = times[raw_points_per_side + event_length]
        level_times[2 * i + 3] = times[n - 1]
        level_values[2 * i + 2] = level_values[2 * i + 3] = baseline

        self.plot_scatter_select.plot(level_times, level_values, pen='g')

        h5file.close()