コード例 #1
0
    def __init__(self, stream = None, parent = None,):
        BaseOscilloscope.__init__(self, stream = stream, parent = parent,)
        h = QtGui.QHBoxLayout()
        self.mainlayout.addLayout(h)
        
        self.but_startstop = QtGui.QPushButton('Start/Stop', checkable = True, checked = True)
        h.addWidget(self.but_startstop)
        self.but_startstop.toggled.connect(self.start_or_stop_trigger)
        but = QtGui.QPushButton('Reset')
        but.clicked.connect(self.reset_stack)
        h.addWidget(but)
        self.label_count = QtGui.QLabel('Nb events:')
        h.addWidget(self.label_count)
        h.addStretch()
        
        
        self.paramGlobal.param('channel').setLimits([0, self.stream['nb_channel']-1])

        # Create curve list items
        self.list_curves = [ [ ] for i in range(self.stream['nb_channel']) ]
        
        self.stackedchunk = StackedChunkOnTrigger(stream = stream, parent = self)
        
        self.recreate_stack()
        self.recreate_curves()
        
        kargs = { k: self.paramGlobal[k] for  k in ['channel', 'threshold', 'debounce_mode', 'debounce_time', 'front']}
        self.trigger = AnalogTrigger(stream = self.stream, autostart = False, callbacks = [ self.on_trigger], **kargs)
        
        self.start()
        
        self.vline = pg.InfiniteLine(pos=0, angle=90, pen='r')
        self.plot.addItem(self.vline)
コード例 #2
0
class TriggeredOscilloscope(BaseOscilloscope):
    _param_global =param_global
    _param_by_channel = param_by_channel
    
    def __init__(self, stream = None, parent = None,):
        BaseOscilloscope.__init__(self, stream = stream, parent = parent,)
        h = QtGui.QHBoxLayout()
        self.mainlayout.addLayout(h)
        
        self.but_startstop = QtGui.QPushButton('Start/Stop', checkable = True, checked = True)
        h.addWidget(self.but_startstop)
        self.but_startstop.toggled.connect(self.start_or_stop_trigger)
        but = QtGui.QPushButton('Reset')
        but.clicked.connect(self.reset_stack)
        h.addWidget(but)
        self.label_count = QtGui.QLabel('Nb events:')
        h.addWidget(self.label_count)
        h.addStretch()
        
        
        self.paramGlobal.param('channel').setLimits([0, self.stream['nb_channel']-1])

        # Create curve list items
        self.list_curves = [ [ ] for i in range(self.stream['nb_channel']) ]
        
        self.stackedchunk = StackedChunkOnTrigger(stream = stream, parent = self)
        
        self.recreate_stack()
        self.recreate_curves()
        
        kargs = { k: self.paramGlobal[k] for  k in ['channel', 'threshold', 'debounce_mode', 'debounce_time', 'front']}
        self.trigger = AnalogTrigger(stream = self.stream, autostart = False, callbacks = [ self.on_trigger], **kargs)
        
        self.start()
        
        self.vline = pg.InfiniteLine(pos=0, angle=90, pen='r')
        self.plot.addItem(self.vline)
        

    def start(self):
        self.trigger.start()
        BaseOscilloscope.start(self)

    def stop(self):
        BaseOscilloscope.stop(self)
        if self.trigger.running:
            self.trigger.stop()
        for thread in self.stackedchunk.threads_limit:
            thread.stop()
            thread.wait()
    
    def start_or_stop_trigger(self, state):
        if state:
            self.trigger.start()
        else:
            self.trigger.stop()
    
    
    def recreate_stack(self):
        self.stackedchunk.recreate_stack()
        self.plotted_trig = 0
        
    def reset_stack(self):
        self.stackedchunk.reset_stack()
        self.plotted_trig = -1
        n = self.stream['nb_channel']
        stack_size = self.paramGlobal['stack_size']
        for c in range(n):
            for pos in range(stack_size):
                self.list_curves[c][pos].setData(self.stackedchunk.t_vect, np.zeros(self.stackedchunk.t_vect.shape), antialias = False)

        
        self.refresh()
    
    def recreate_curves(self):
        n = self.stream['nb_channel']
        stack_size = self.paramGlobal['stack_size']
        # delete olds
        for i,curves in enumerate(self.list_curves):
            for curve in curves:
                self.plot.removeItem(curve)
        
        self.list_curves = [ ]
        for i in range(n):
            curves = [ ]
            for j in range(stack_size):
                color = self.paramChannels.children()[i]['color']
                curve = pg.PlotCurveItem(pen = color)
                self.plot.addItem(curve)
                curves.append(curve)
            self.list_curves.append(curves)

    
    def on_param_change(self, params, changes):
        for param, change, data in changes:
            if change != 'value': continue
            #~ print param.name()
            if param.name() in ['gain', 'offset']: 
                self.redraw_stack()
            if param.name()=='ylims':
                continue
            if param.name()=='visible':
                c = self.paramChannels.children().index(param.parent())
                for curve in self.list_curves[c]:
                    if data:
                        curve.show()
                    else:
                        curve.hide()
            if param.name()=='color':
                i = self.paramChannels.children().index(param.parent())
                c = self.paramChannels.children().index(param.parent())
                for curve in self.list_curves[c]:
                    pen = pg.mkPen(color = data)
                    curve.setPen(pen)
                #~ self.redraw_stack()
            if param.name()=='background_color':
                self.graphicsview.setBackground(data)
            if param.name()=='xsize':
                self.recreate_stack()
                self.recreate_curves()
                self.redraw_stack()
            if param.name()=='refresh_interval':
                self.timer.setInterval(data)
            if param.name() in ['left_sweep', 'right_sweep', 'stack_size']:
                self.stackedchunk.allParams[param.name()] = data
                self.plotted_trig = -1
                #~ self.recreate_stack()
                self.recreate_curves()
            if param.name() in [ 'channel','threshold','debounce_time','debounce_mode', 'front']:
                kargs = {param.name() : data }
                self.trigger.set_params(**kargs)
    
    def redraw_stack(self):
        self.plotted_trig = max(self.stackedchunk.total_trig - self.paramGlobal['stack_size'], 0)

    def on_trigger(self, pos):
        self.stackedchunk.on_trigger(pos)
        
        #~ socket = self.context.socket(zmq.SUB)
        #~ socket.setsockopt(zmq.SUBSCRIBE,'')
        #~ socket.connect("tcp://localhost:{}".format(self.stream['port']))
        #~ thread = WaitLimitThread(socket = socket, pos_limit = self.limit2+pos)
        #~ thread.limit_reached.connect(self.on_limit_reached)
        #~ self.threads_limit.append(thread)
        #~ thread.start()
        
    #~ def on_limit_reached(self, limit):
        #~ self.threads_limit.remove(self.sender())
        
        #~ head = limit%self.half_size+self.half_size
        #~ tail = head - (self.limit2 - self.limit1)
        #~ self.stack[self.stack_pos,:,:] = self.np_array[:, tail:head]
        
        #~ self.stack_pos +=1
        #~ self.stack_pos = self.stack_pos%self.paramGlobal['stack_size']
        #~ self.total_trig += 1

    def refresh(self):
        stack_size = self.paramGlobal['stack_size'] 
        n = self.stream['nb_channel']
        gains = np.array([p['gain'] for p in self.paramChannels.children()])
        offsets = np.array([p['offset'] for p in self.paramChannels.children()])
        visibles = np.array([p['visible'] for p in self.paramChannels.children()], dtype = bool)
        
        #~ if self.plotted_trig<self.total_trig-stack_size:
            #~ self.plotted_trig = self.total_trig-stack_size

        if self.plotted_trig<self.stackedchunk.total_trig-stack_size:
            self.plotted_trig = self.stackedchunk.total_trig-stack_size
        
        
        #~ while self.plotted_trig<self.total_trig:
        while self.plotted_trig<self.stackedchunk.total_trig:
            pos = self.plotted_trig%stack_size
            for c in range(n):
                #~ data = self.stack[pos, c, :]*gains[c]+offsets[c]
                data = self.stackedchunk.stack[pos, c, :]*gains[c]+offsets[c]
                if visibles[c]:
                    self.list_curves[c][pos].setData(self.stackedchunk.t_vect, data, antialias = False)
            self.plotted_trig += 1
        
        self.plot.setXRange( self.stackedchunk.t_vect[0], self.stackedchunk.t_vect[-1])
        ylims  =self.paramGlobal['ylims']
        self.plot.setYRange( *ylims )
        
        self.label_count.setText('Nb events: {}'.format(self.stackedchunk.total_trig))
    
    
    def autoestimate_scales(self):
        
        
        n = self.stream['nb_channel']
        #~ self.all_mean =  np.array([ np.mean(self.np_array[i,tail:head]) for i in range(n) ])
        self.all_sd = np.array([ np.std(self.stackedchunk.stack[:,i,:]) for i in range(n) ])
        # better than std and mean
        self.all_mean = np.array([ np.median(self.stackedchunk.stack[:,i,:]) for i in range(n) ])
        #~ self.all_sd=  np.array([ np.median(np.abs(self.np_array[i,:tail:head]-self.all_mean[i])/.6745) for i in range(n) ])
        #~ print self.all_mean, self.all_sd
        return self.all_mean, self.all_sd