def process(self, events, display=True): if not display: return {'plot': None} conn = self['plot'].connections() if len(events) > 2000: events = events[:2000] color = self.ctrls['color'].color() ## don't keep items from last run; they may have been removed already. self.items = {} for c in conn: plot = c.node().getPlot() if plot is None: continue ## It's possible items were cleared out already; always rebuild. #if c in self.items: #item = self.items[c] #item.setXVals(events) #else: #self.items[c] = graphicsItems.VTickGroup(events, view=plot, pen=color) #self.items[c].setYRange([0., 0.2], relative=True) #self.items[c] = graphicsItems.VTickGroup(events, view=plot, pen=color) self.items[c] = pg.VTickGroup(events, yrange=[0.9, 1.], pen=color) #self.items[c].setYRange([0., 0.2], relative=True) self.items[c].setZValue(1000) return {'plot': self.items}
def __init__(self, dev, taskRunner): DAQGenericTaskGui.__init__( self, dev, taskRunner, ownUi=False ) ## When initializing superclass, make sure it knows this class is creating the ui. self.ui = Ui_Form() self.ui.setupUi(self) self.stateGroup = pg.WidgetGroup( self) ## create state group before DAQ creates its own interface self.ui.horizSplitter.setStretchFactor(0, 0) self.ui.horizSplitter.setStretchFactor(1, 1) DAQGenericTaskGui.createChannelWidgets(self, self.ui.ctrlSplitter, self.ui.plotSplitter) self.ui.plotSplitter.setStretchFactor(0, 10) self.ui.plotSplitter.setStretchFactor(1, 1) self.ui.plotSplitter.setStretchFactor(2, 1) ## plots should not be storing more than one trace at a time. for p in self.plots.values(): p.plotItem.ctrl.maxTracesCheck.setChecked(True) p.plotItem.ctrl.maxTracesSpin.setValue(1) p.plotItem.ctrl.forgetTracesCheck.setChecked(True) conf = self.dev.camConfig tModes = self.dev.listParams('triggerMode')[0] for m in tModes: item = self.ui.triggerModeCombo.addItem(m) self.vLines = [] if 'trigger' in self.plots: l = pg.InfiniteLine() self.vLines.append(l) self.plots['trigger'].addItem(l) if 'exposure' in self.plots: l = pg.InfiniteLine() self.vLines.append(l) self.plots['exposure'].addItem(l) self.frameTicks = pg.VTickGroup() self.frameTicks.setYRange([0.8, 1.0]) self.ui.imageView.sigTimeChanged.connect(self.timeChanged) self.taskRunner.sigTaskPaused.connect(self.taskPaused)
def displayData(self, fh, plot, pen, evTime=None, eventFilter=None): """ Display data for a single site in a plot--ephys trace, detected events Returns all items added to the plot. """ pen = pg.mkPen(pen) items = [] if isinstance(fh, six.string_types): fh = self.source()[fh] if fh.isDir(): fh = self.dataModel.getClampFile(fh) ## plot all data, incl. events data = fh.read()['primary'] data = fn.besselFilter(data, 4e3) pc = plot.plot(data, pen=pen, clear=False) items.append(pc) ## mark location of event if an event index was given if evTime is not None: #pos = float(index)/len(data) pos = evTime / data.xvals('Time')[-1] #print evTime, data.xvals('Time')[-1], pos #print index arrow = pg.CurveArrow(pc, pos=pos) plot.addItem(arrow) items.append(arrow) events = self.getEvents(fh)['events'] if eventFilter is not None: events = eventFilter(events) ## draw ticks over all detected events if len(events) > 0: if 'fitTime' in events.dtype.names: times = events['fitTime'] ticks = pg.VTickGroup(times, [0.9, 1.0], pen=pen) plot.addItem(ticks) items.append(ticks) #self.mapTicks.append(ticks) ## draw event fits evPen = pg.mkPen(pen) c = evPen.color() c.setAlpha(c.alpha() / 2) evPen.setColor(c) for ev in events: time = ev['fitTime'] try: fitLen = ev['fitDecayTau'] * ev['fitLengthOverDecay'] except IndexError: fitLen = ev['fitDecayTau'] * 4. x = np.linspace(time, time + fitLen, fitLen * 50e3) v = [ ev['fitAmplitude'], ev['fitTime'], ev['fitRiseTau'], ev['fitDecayTau'] ] y = fn.pspFunc(v, x, risePower=2.0) + data[np.argwhere( data.xvals('Time') > time)[0] - 1] evc = plot.plot(x, y, pen=evPen) evc.setZValue(pc.zValue() - 100) return items