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)
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 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)
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 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)
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)
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)
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)
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)
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)
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()
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()