def quit(self): #print "Stopping patch thread.." geom = self.geometry() uiState = {'window': str(self.saveState().toPercentEncoding()), 'geometry': [geom.x(), geom.y(), geom.width(), geom.height()]} Manager.getManager().writeConfigFile(uiState, self.stateFile) self.thread.stop(block=True)
def quit(self): geom = self.geometry() uiState = {'window': str(self.saveState().toPercentEncoding()), 'geometry': [geom.x(), geom.y(), geom.width(), geom.height()]} Manager.getManager().writeConfigFile(uiState, self.stateFile) for cam in self.cameras: cam.quit() self.module.quit(fromUi=True)
def startClicked(self): if self.ui.startBtn.isChecked(): if not self.thread.isRunning(): self.thread.start() Manager.logMsg("Patch module started.") self.ui.startBtn.setText('Stop') else: self.ui.startBtn.setEnabled(False) self.thread.stop() Manager.logMsg("Patch module stopped.")
def quit(self): geom = self.geometry() uiState = { 'window': str(self.saveState().toPercentEncoding()), 'geometry': [geom.x(), geom.y(), geom.width(), geom.height()], 'docks': self.cw.saveState() } Manager.getManager().writeConfigFile(uiState, self.stateFile) for iface in self.interfaces.values(): iface.quit() self.module.quit(fromUi=True)
def startAcquireClicked(self, mode): """User clicked the acquire video button. """ try: self.cam.setParam('triggerMode', 'Normal', autoRestart=False) self.setBinning(autoRestart=False) self.setExposure(autoRestart=False) self.updateRegion(autoRestart=False) self.cam.start() Manager.logMsg("Camera started aquisition.", importance=0) except: self.imagingCtrl.acquisitionStopped() printExc("Error starting camera:")
def toggleAcquire(self): if self.ui.acquireVideoBtn.isChecked(): try: self.cam.setParam('triggerMode', 'Normal', autoRestart=False) self.setBinning(autoRestart=False) self.setExposure(autoRestart=False) self.updateRegion(autoRestart=False) self.cam.start() Manager.logMsg("Camera started aquisition.", importance=0) except: self.ui.acquireVideoBtn.setChecked(False) printExc("Error starting camera:") else: #print "ACQ untoggled, stop record" self.toggleRecord(False) self.cam.stop() Manager.logMsg("Camera stopped acquisition.", importance=0)
def __init__(self, parent): Qt.QWidget.__init__(self, parent) self.manager = Manager.getManager() self.ui = Ui_Form() self.ui.setupUi(self) self.current = None self.widgets = {} self.ui.fileInfoLayout = self.ui.formLayout_2 self.focusEventCatcher = FocusEventCatcher() self.focusEventCatcher.sigLostFocus.connect(self.focusLost)
def __init__(self, parent): QtGui.QWidget.__init__(self, parent) self.manager = Manager.getManager() self.ui = Ui_Form() self.ui.setupUi(self) self.current = None self.widgets = {} self.ui.fileInfoLayout = self.ui.formLayout_2 self.focusEventCatcher = FocusEventCatcher() #QtCore.QObject.connect(self.focusEventCatcher, QtCore.SIGNAL('lostFocus'), self.focusLost) self.focusEventCatcher.sigLostFocus.connect(self.focusLost)
def start(self): try: if self.selectedImager() is None: raise Exception("No imaging device selected.") prot = self.makeProtocol() self.currentProtocol = prot dh = Manager.getManager().getCurrentDir().getDir('ImageSequence', create=True, autoIncrement=True) dhinfo = prot.copy() del dhinfo['imager'] dh.setInfo(dhinfo) prot['storageDir'] = dh self.ui.startBtn.setText('Stop') self.ui.zStackGroup.setEnabled(False) self.ui.timelapseGroup.setEnabled(False) self.ui.deviceCombo.setEnabled(False) self.thread.start(prot) except Exception: self.threadStopped() raise
def __init__(self, dm, config): clampName = config['clampDev'] QtGui.QMainWindow.__init__(self) self.setWindowTitle(clampName) self.startTime = None self.redrawCommand = 1 self.analysisItems = { 'inputResistance': u'Ω', 'accessResistance': u'Ω', 'capacitance': 'F', 'restingPotential': 'V', 'restingCurrent': 'A', 'fitError': '' } self.params = { 'mode': 'vc', 'rate': config.get('sampleRate', 100000), 'downsample': config.get('downsample', 3), 'cycleTime': .2, 'recordTime': 0.1, 'delayTime': 0.03, 'pulseTime': 0.05, 'icPulse': -30e-12, 'vcPulse': -10e-3, 'icHolding': 0, 'vcHolding': -65e-3, 'icHoldingEnabled': False, 'icPulseEnabled': True, 'vcHoldingEnabled': False, 'vcPulseEnabled': True, 'drawFit': True, 'average': 1, } self.paramLock = Mutex(QtCore.QMutex.Recursive) self.manager = dm self.clampName = clampName self.thread = PatchThread(self) self.cw = QtGui.QWidget() self.setCentralWidget(self.cw) self.ui = Ui_Form() self.ui.setupUi(self.cw) #self.logBtn = LogButton("Log") #self.statusBar().addPermanentWidget(self.logBtn) self.setStatusBar(StatusBar()) self.stateFile = os.path.join('modules', self.clampName + '_ui.cfg') uiState = Manager.getManager().readConfigFile(self.stateFile) if 'geometry' in uiState: geom = QtCore.QRect(*uiState['geometry']) self.setGeometry(geom) if 'window' in uiState: ws = QtCore.QByteArray.fromPercentEncoding(uiState['window']) self.restoreState(ws) self.ui.splitter_2.setSizes([self.width() / 4, self.width() * 3. / 4.]) self.ui.splitter.setStretchFactor(0, 30) self.ui.splitter.setStretchFactor(1, 10) self.plots = {} for k in self.analysisItems: p = PlotWidget() p.setLabel('left', text=k, units=self.analysisItems[k]) self.ui.plotLayout.addWidget(p) self.plots[k] = p irp = self.plots['inputResistance'] irp.setLogMode(y=True, x=False) irp.setYRange(6, 11) self.ui.icPulseSpin.setOpts(dec=True, step=1, minStep=1e-12, bounds=[None, None], siPrefix=True, suffix='A') self.ui.vcPulseSpin.setOpts(dec=True, step=1, minStep=1e-3, bounds=[None, None], siPrefix=True, suffix='V') self.ui.icHoldSpin.setOpts(dec=True, step=1, minStep=1e-12, bounds=[None, None], siPrefix=True, suffix='A') self.ui.vcHoldSpin.setOpts(dec=True, step=1, minStep=1e-3, bounds=[None, None], siPrefix=True, suffix='V') self.ui.cycleTimeSpin.setOpts(dec=True, step=1, minStep=1e-6, bounds=[0, None], siPrefix=True, suffix='s') self.ui.pulseTimeSpin.setOpts(dec=True, step=1, minStep=1e-6, bounds=[0, 1.], siPrefix=True, suffix='s') self.ui.delayTimeSpin.setOpts(dec=True, step=1, minStep=1e-6, bounds=[0, 1.], siPrefix=True, suffix='s') self.stateGroup = WidgetGroup([ (self.ui.icPulseSpin, 'icPulse'), (self.ui.vcPulseSpin, 'vcPulse'), (self.ui.icHoldSpin, 'icHolding'), (self.ui.vcHoldSpin, 'vcHolding'), (self.ui.icPulseCheck, 'icPulseEnabled'), (self.ui.vcPulseCheck, 'vcPulseEnabled'), (self.ui.icHoldCheck, 'icHoldingEnabled'), (self.ui.vcHoldCheck, 'vcHoldingEnabled'), (self.ui.cycleTimeSpin, 'cycleTime'), (self.ui.pulseTimeSpin, 'pulseTime'), (self.ui.delayTimeSpin, 'delayTime'), (self.ui.drawFitCheck, 'drawFit'), (self.ui.averageSpin, 'average'), ]) self.stateGroup.setState(self.params) self.ui.patchPlot.setLabel('left', text='Primary', units='A') self.patchCurve = self.ui.patchPlot.plot( pen=QtGui.QPen(QtGui.QColor(200, 200, 200))) self.patchFitCurve = self.ui.patchPlot.plot( pen=QtGui.QPen(QtGui.QColor(0, 100, 200))) self.ui.commandPlot.setLabel('left', text='Command', units='V') self.commandCurve = self.ui.commandPlot.plot( pen=QtGui.QPen(QtGui.QColor(200, 200, 200))) self.ui.startBtn.clicked.connect(self.startClicked) self.ui.recordBtn.clicked.connect(self.recordClicked) self.ui.bathModeBtn.clicked.connect(self.bathMode) self.ui.patchModeBtn.clicked.connect(self.patchMode) self.ui.cellModeBtn.clicked.connect(self.cellMode) self.ui.monitorModeBtn.clicked.connect(self.monitorMode) self.ui.resetBtn.clicked.connect(self.resetClicked) self.thread.finished.connect(self.threadStopped) self.thread.sigNewFrame.connect(self.handleNewFrame) self.ui.vcModeRadio.toggled.connect(self.updateParams) self.stateGroup.sigChanged.connect(self.updateParams) ## Configure analysis plots, curves, and data arrays self.analysisCurves = {} self.analysisData = {'time': []} for n in self.analysisItems: w = getattr(self.ui, n + 'Check') w.clicked.connect(self.showPlots) p = self.plots[n] self.analysisCurves[n] = p.plot( pen=QtGui.QPen(QtGui.QColor(200, 200, 200))) for suf in ['', 'Std']: self.analysisData[n + suf] = [] self.showPlots() self.updateParams() self.show() self.bathMode()
def stopAcquireClicked(self): self.cam.stop() Manager.logMsg("Camera stopped acquisition.", importance=0)
def __init__(self, dm, clampName, modes): QtGui.QMainWindow.__init__(self) self.setWindowTitle(clampName) self.startTime = None self.redrawCommand = 1 self.analysisItems = { 'inputResistance': u'Ω', 'accessResistance': u'Ω', 'capacitance': 'F', 'restingPotential': 'V', 'restingCurrent': 'A', 'fitError': '' } self.params = modes.pop('default') self.modes = modes self.stylesheet = {} self.paramLock = Mutex(QtCore.QMutex.Recursive) self.manager = dm self.clampName = clampName self.thread = PatchThread(self) self.cw = QtGui.QWidget() self.setCentralWidget(self.cw) self.ui = Ui_Form() self.ui.setupUi(self.cw) self.setStatusBar(StatusBar()) # Create one button for each configured mode row = None self.modeRows = [] rowLen = 0 def mkModeCallback(name): return lambda: self.setMode(name) for modeName, mode in modes.items(): if modeName == 'default': continue if row is None: row = QtGui.QWidget() layout = QtGui.QHBoxLayout() row.setLayout(layout) self.ui.modeLayout.addWidget(row) self.modeRows.append(row) btn = QtGui.QPushButton(modeName) layout.addWidget(btn) rowLen += btn.sizeHint().width() if rowLen > 200: row = None rowLen = 0 btn.clicked.connect(mkModeCallback(modeName)) self.stateFile = os.path.join('modules', self.clampName + '_ui.cfg') uiState = Manager.getManager().readConfigFile(self.stateFile) if 'geometry' in uiState: geom = QtCore.QRect(*uiState['geometry']) self.setGeometry(geom) if 'window' in uiState: ws = QtCore.QByteArray.fromPercentEncoding(uiState['window']) self.restoreState(ws) self.ui.splitter_2.setSizes([self.width()/4, self.width()*3./4.]) self.plots = {} for k in self.analysisItems: p = PlotWidget() p.setLabel('left', text=k, units=self.analysisItems[k]) self.ui.plotLayout.addWidget(p) self.plots[k] = p self.ui.icPulseSpin.setOpts(dec=True, step=1, minStep=1e-12, bounds=[None,None], siPrefix=True, suffix='A') self.ui.vcPulseSpin.setOpts(dec=True, step=1, minStep=1e-3, bounds=[None,None], siPrefix=True, suffix='V') self.ui.icHoldSpin.setOpts(dec=True, step=1, minStep=1e-12, bounds=[None,None], siPrefix=True, suffix='A') self.ui.vcHoldSpin.setOpts(dec=True, step=1, minStep=1e-3, bounds=[None,None], siPrefix=True, suffix='V') self.ui.cycleTimeSpin.setOpts(dec=True, step=1, minStep=1e-6, bounds=[0,None], siPrefix=True, suffix='s') self.ui.pulseTimeSpin.setOpts(dec=True, step=1, minStep=1e-6, bounds=[0,1.], siPrefix=True, suffix='s') self.ui.delayTimeSpin.setOpts(dec=True, step=1, minStep=1e-6, bounds=[0,1.], siPrefix=True, suffix='s') self.stateGroup = WidgetGroup([ (self.ui.icPulseSpin, 'icPulse'), (self.ui.vcPulseSpin, 'vcPulse'), (self.ui.icHoldSpin, 'icHolding'), (self.ui.vcHoldSpin, 'vcHolding'), (self.ui.icPulseCheck, 'icPulseEnabled'), (self.ui.vcPulseCheck, 'vcPulseEnabled'), (self.ui.icHoldCheck, 'icHoldingEnabled'), (self.ui.vcHoldCheck, 'vcHoldingEnabled'), (self.ui.cycleTimeSpin, 'cycleTime'), (self.ui.pulseTimeSpin, 'pulseTime'), (self.ui.delayTimeSpin, 'delayTime'), (self.ui.drawFitCheck, 'drawFit'), (self.ui.averageSpin, 'average'), ]) self.stateGroup.setState(self.params) self.ui.patchPlot.setLabel('left', text='Primary', units='A') self.patchCurve = self.ui.patchPlot.plot(pen=QtGui.QPen(QtGui.QColor(200,200,200))) self.patchFitCurve = self.ui.patchPlot.plot(pen=QtGui.QPen(QtGui.QColor(0,100,200))) self.ui.commandPlot.setLabel('left', text='Command', units='V') self.commandCurve = self.ui.commandPlot.plot(pen=QtGui.QPen(QtGui.QColor(200,200,200))) self.ui.startBtn.clicked.connect(self.startClicked) self.ui.recordBtn.clicked.connect(self.recordClicked) self.ui.resetBtn.clicked.connect(self.resetClicked) self.thread.finished.connect(self.threadStopped) self.thread.sigNewFrame.connect(self.handleNewFrame) self.ui.vcModeRadio.toggled.connect(self.updateParams) self.stateGroup.sigChanged.connect(self.updateParams) ## Configure analysis plots, curves, and data arrays self.analysisCurves = {} self.analysisData = {'time': []} for n in self.analysisItems: w = getattr(self.ui, n+'Check') w.clicked.connect(self.showPlots) p = self.plots[n] self.analysisCurves[n] = p.plot(pen=QtGui.QPen(QtGui.QColor(200,200,200))) for suf in ['', 'Std']: self.analysisData[n+suf] = [] self.showPlots() self.updateParams() self.show()
def __init__(self, dm, clampName): QtGui.QMainWindow.__init__(self) self.setWindowTitle(clampName) self.startTime = None self.redrawCommand = 1 self.analysisItems = { 'inputResistance': u'Ω', 'accessResistance': u'Ω', 'capacitance': 'F', 'restingPotential': 'V', 'restingCurrent': 'A', 'fitError': '' } self.params = { 'mode': 'vc', 'rate': 400000, 'downsample': 10, 'cycleTime': .2, 'recordTime': 0.1, 'delayTime': 0.03, 'pulseTime': 0.05, 'icPulse': -30e-12, 'vcPulse': -10e-3, 'icHolding': 0, 'vcHolding': -65e-3, 'icHoldingEnabled': False, 'icPulseEnabled': True, 'vcHoldingEnabled': False, 'vcPulseEnabled': True, 'drawFit': True, 'average': 1, } self.paramLock = Mutex(QtCore.QMutex.Recursive) self.manager = dm self.clampName = clampName self.thread = PatchThread(self) self.cw = QtGui.QWidget() self.setCentralWidget(self.cw) self.ui = Ui_Form() self.ui.setupUi(self.cw) #self.logBtn = LogButton("Log") #self.statusBar().addPermanentWidget(self.logBtn) self.setStatusBar(StatusBar()) self.stateFile = os.path.join('modules', self.clampName + '_ui.cfg') uiState = Manager.getManager().readConfigFile(self.stateFile) if 'geometry' in uiState: geom = QtCore.QRect(*uiState['geometry']) self.setGeometry(geom) if 'window' in uiState: ws = QtCore.QByteArray.fromPercentEncoding(uiState['window']) self.restoreState(ws) self.ui.splitter_2.setSizes([self.width()/4, self.width()*3./4.]) self.plots = {} for k in self.analysisItems: p = PlotWidget() p.setLabel('left', text=k, units=self.analysisItems[k]) self.ui.plotLayout.addWidget(p) self.plots[k] = p #irp = self.plots['inputResistance'] #irp.setManualYScale() #irp.setYLog(True) #irp.setYRange(1e6, 1e11) self.ui.icPulseSpin.setOpts(dec=True, step=1, minStep=1e-12, bounds=[None,None], siPrefix=True, suffix='A') self.ui.vcPulseSpin.setOpts(dec=True, step=1, minStep=1e-3, bounds=[None,None], siPrefix=True, suffix='V') self.ui.icHoldSpin.setOpts(dec=True, step=1, minStep=1e-12, bounds=[None,None], siPrefix=True, suffix='A') self.ui.vcHoldSpin.setOpts(dec=True, step=1, minStep=1e-3, bounds=[None,None], siPrefix=True, suffix='V') self.ui.cycleTimeSpin.setOpts(dec=True, step=1, minStep=1e-6, bounds=[0,None], siPrefix=True, suffix='s') self.ui.pulseTimeSpin.setOpts(dec=True, step=1, minStep=1e-6, bounds=[0,1.], siPrefix=True, suffix='s') self.ui.delayTimeSpin.setOpts(dec=True, step=1, minStep=1e-6, bounds=[0,1.], siPrefix=True, suffix='s') self.stateGroup = WidgetGroup([ (self.ui.icPulseSpin, 'icPulse'), (self.ui.vcPulseSpin, 'vcPulse'), (self.ui.icHoldSpin, 'icHolding'), (self.ui.vcHoldSpin, 'vcHolding'), (self.ui.icPulseCheck, 'icPulseEnabled'), (self.ui.vcPulseCheck, 'vcPulseEnabled'), (self.ui.icHoldCheck, 'icHoldingEnabled'), (self.ui.vcHoldCheck, 'vcHoldingEnabled'), (self.ui.cycleTimeSpin, 'cycleTime'), (self.ui.pulseTimeSpin, 'pulseTime'), (self.ui.delayTimeSpin, 'delayTime'), (self.ui.drawFitCheck, 'drawFit'), (self.ui.averageSpin, 'average'), ]) self.stateGroup.setState(self.params) self.ui.patchPlot.setLabel('left', text='Primary', units='A') self.patchCurve = self.ui.patchPlot.plot(pen=QtGui.QPen(QtGui.QColor(200, 200, 200))) self.patchFitCurve = self.ui.patchPlot.plot(pen=QtGui.QPen(QtGui.QColor(0, 100, 200))) self.ui.commandPlot.setLabel('left', text='Command', units='V') self.commandCurve = self.ui.commandPlot.plot(pen=QtGui.QPen(QtGui.QColor(200, 200, 200))) self.ui.startBtn.clicked.connect(self.startClicked) self.ui.recordBtn.clicked.connect(self.recordClicked) self.ui.bathModeBtn.clicked.connect(self.bathMode) self.ui.patchModeBtn.clicked.connect(self.patchMode) self.ui.cellModeBtn.clicked.connect(self.cellMode) self.ui.monitorModeBtn.clicked.connect(self.monitorMode) self.ui.resetBtn.clicked.connect(self.resetClicked) self.thread.finished.connect(self.threadStopped) self.thread.sigNewFrame.connect(self.handleNewFrame) self.ui.vcModeRadio.toggled.connect(self.updateParams) self.stateGroup.sigChanged.connect(self.updateParams) ## Configure analysis plots, curves, and data arrays self.analysisCurves = {} self.analysisData = {'time': []} for n in self.analysisItems: w = getattr(self.ui, n+'Check') w.clicked.connect(self.showPlots) p = self.plots[n] self.analysisCurves[n] = p.plot(pen=QtGui.QPen(QtGui.QColor(200, 200, 200))) for suf in ['', 'Std']: self.analysisData[n+suf] = [] self.showPlots() self.updateParams() self.show() self.bathMode()
def __init__(self, module): self.hasQuit = False self.module = module # handle to the rest of the application self.interfaces = OrderedDict() # owner: widget self.docks = OrderedDict() # owner: dock # Start building UI Qt.QMainWindow.__init__(self) self.setWindowTitle('Camera') self.cw = dockarea.DockArea() self.setCentralWidget(self.cw) self.gv = pg.GraphicsView() self.gvDock = dockarea.Dock(name="View", widget=self.gv, hideTitle=True, size=(600,600)) self.cw.addDock(self.gvDock) # set up ViewBox self.view = pg.ViewBox() self.view.enableAutoRange(x=False, y=False) self.view.setAspectLocked(True) self.gv.setCentralItem(self.view) # And a plot area for displaying depth-related information self.depthPlot = pg.PlotWidget(labels={'left': ('Depth', 'm')}) self.depthPlot.setYRange(0, 1e-3) self.depthPlot.setXRange(-1, 1) self.depthPlot.hideAxis('bottom') self.depthPlot.setMouseEnabled(x=False) self.depthDock = pg.dockarea.Dock(name='Depth', widget=self.depthPlot) self.cw.addDock(self.depthDock, 'right') self.depthDock.hide() # Add a group that will track to the center of the view # self.trackedGroup = pg.GroupItem() # self.view.addItem(self.trackedGroup) # search for all devices that provide a cameraModuleInterface() method man = Manager.getManager() devices = [man.getDevice(dev) for dev in man.listDevices()] ifaces = OrderedDict([(dev.name(), dev.cameraModuleInterface(self)) for dev in devices if hasattr(dev, 'cameraModuleInterface')]) # add each device's control panel in ots own dock haveDevs = False for dev, iface in ifaces.items(): if iface is not None: haveDevs = True self.addInterface(dev, iface) # Add explanatory label if no devices were found if not haveDevs: label = Qt.QLabel("No imaging devices available") label.setAlignment(Qt.Qt.AlignHCenter | Qt.Qt.AlignVCenter) dock = dockarea.Dock(name="nocamera", widget=label, size=(100, 500), hideTitle=True) self.cw.addDock(dock, 'left', self.gvDock) # Add a dock with ROI buttons and plot self.roiWidget = ROIPlotter(self) self.roiDock = dockarea.Dock(name='ROI Plot', widget=self.roiWidget, size=(400, 10)) self.cw.addDock(self.roiDock, 'bottom', self.gvDock) # Add timelapse / z stack / mosaic controls self.sequencerWidget = ImageSequencer(self) self.sequencerDock = dockarea.Dock(name='Image Sequencer', widget=self.sequencerWidget, size=(200, 10)) self.cw.addDock(self.sequencerDock, 'right', self.roiDock) #grid = pg.GridItem() #self.view.addItem(grid) #Scale bar self.scaleBar = pg.ScaleBar(100e-6, offset=(-20,-20)) self.scaleBar.setParentItem(self.view) ## Set up status bar labels self.recLabel = Qt.QLabel() self.rgnLabel = Qt.QLabel() self.xyLabel = Qt.QLabel() self.tLabel = Qt.QLabel() self.vLabel = Qt.QLabel() self.vLabel.setFixedWidth(50) self.setStatusBar(StatusBar()) font = self.xyLabel.font() font.setPointSize(8) labels = [self.recLabel, self.xyLabel, self.rgnLabel, self.tLabel, self.vLabel] for label in labels: label.setFont(font) self.statusBar().insertPermanentWidget(0, label) # Load previous window state self.stateFile = os.path.join('modules', self.module.name + '_ui.cfg') uiState = module.manager.readConfigFile(self.stateFile) if 'geometry' in uiState: geom = Qt.QRect(*uiState['geometry']) self.setGeometry(geom) if 'window' in uiState: ws = Qt.QByteArray.fromPercentEncoding(uiState['window']) self.restoreState(ws) if 'docks' in uiState: self.cw.restoreState(uiState['docks'], missing='ignore') # done with UI self.show() self.centerView() self.gv.scene().sigMouseMoved.connect(self.updateMouse)
def __init__(self, camera, module): CameraModuleInterface.__init__(self, camera, module) self.module = module self.view = module.getView() self.hasQuit = False self.boundaryItems = {} ## setup UI self.ui = CameraInterfaceTemplate() self.widget = dockarea.DockArea() w = Qt.QWidget() self.ui.setupUi(w) # takes care of displaying image data, # contrast & background subtraction user interfaces self.imagingCtrl = ImagingCtrl() self.frameDisplay = self.imagingCtrl.frameDisplay ## Move control panels into docks recDock = dockarea.Dock(name="Recording", widget=self.imagingCtrl, size=(100, 10), autoOrientation=False) devDock = dockarea.Dock(name="Device Control", widget=self.ui.devCtrlWidget, size=(100, 10), autoOrientation=False) dispDock = dockarea.Dock(name="Display Control", widget=self.frameDisplay.contrastWidget(), size=(100, 600), autoOrientation=False) bgDock = dockarea.Dock(name="Background Subtraction", widget=self.frameDisplay.backgroundWidget(), size=(100, 10), autoOrientation=False) self.widget.addDock(recDock) self.widget.addDock(devDock, 'bottom', recDock) self.widget.addDock(dispDock, 'bottom', devDock) self.widget.addDock(bgDock, 'bottom', dispDock) ## Camera state variables self.cam = camera self.roi = None self.exposure = 0.001 self.binning = 1 self.region = None ## set up item groups self.cameraItemGroup = pg.ItemGroup( ) ## translated with scope, scaled with camera objective self.imageItemGroup = pg.ItemGroup( ) ## translated and scaled as each frame arrives self.view.addItem(self.imageItemGroup) self.view.addItem(self.cameraItemGroup) self.cameraItemGroup.setZValue(0) self.imageItemGroup.setZValue(-2) ## video image item self.imageItem = self.frameDisplay.imageItem() self.view.addItem(self.imageItem) self.imageItem.setParentItem(self.imageItemGroup) self.imageItem.setZValue(-10) ## open camera, determine bit depth and sensor area self.openCamera() ## Initialize values self.lastCameraPosition = Point(self.camSize[0] * 0.5, self.camSize[1] * 0.5) self.lastCameraScale = Point(1.0, 1.0) self.scopeCenter = [self.camSize[0] * 0.5, self.camSize[1] * 0.5] self.cameraScale = [1, 1] ## Camera region-of-interest control self.roi = CamROI(self.camSize, parent=self.cameraItemGroup) self.roi.sigRegionChangeFinished.connect(self.regionWidgetChanged) self.roi.setZValue(-1) self.setRegion() ## Set up microscope objective borders self.borders = CameraItemGroup(self.cam) self.module.addItem(self.borders) self.borders.setZValue(-1) self.cam.sigGlobalTransformChanged.connect(self.globalTransformChanged) self.globalTransformChanged() # initially set binning and exposure from camera state self.exposure = self.cam.getParam('exposure') self.binning = self.cam.getParam('binning')[0] ## Initialize values/connections in Camera Dock self.setUiBinning(self.binning) self.ui.spinExposure.setValue(self.exposure) self.ui.spinExposure.setOpts(dec=True, step=1, minStep=100e-6, siPrefix=True, suffix='s', bounds=[0, 10]) #Signals from self.ui.btnSnap and self.ui.recordStackBtn are caught by the RecordThread self.ui.btnFullFrame.clicked.connect(lambda: self.setRegion()) self.binningComboProxy = SignalProxy( self.ui.binningCombo.currentIndexChanged, slot=self.binningComboChanged) self.ui.spinExposure.valueChanged.connect( self.setExposure ) ## note that this signal (from acq4.util.SpinBox) is delayed. ## Signals from Camera device self.cam.sigNewFrame.connect(self.newFrame) self.cam.sigCameraStopped.connect(self.cameraStopped) self.cam.sigCameraStarted.connect(self.cameraStarted) self.cam.sigShowMessage.connect(self.showMessage) self.cam.sigParamsChanged.connect(self.cameraParamsChanged) self.frameDisplay.imageUpdated.connect(self.imageUpdated) self.imagingCtrl.sigStartVideoClicked.connect(self.startAcquireClicked) self.imagingCtrl.sigStopVideoClicked.connect(self.stopAcquireClicked) self.imagingCtrl.ui.acquireFrameBtn.setEnabled(False) # Hotkey signals for action, key in self.cam.camConfig.get('hotkeys', {}).items(): if action not in ['snap', 'start']: raise ValueError("Unknown hotkey action %r" % action) dev = Manager.getManager().getDevice(key['device']) dev.addKeyCallback(key['key'], self.hotkeyPressed, (action, ))
def __init__(self, module): self.hasQuit = False self.module = module ## handle to the rest of the application ## ROI state variables self.lastPlotTime = None self.ROIs = [] self.plotCurves = [] ## Start building UI QtGui.QMainWindow.__init__(self) self.cw = dockarea.DockArea() self.setCentralWidget(self.cw) self.gv = pg.GraphicsView() self.gvDock = dockarea.Dock(name="View", widget=self.gv, hideTitle=True, size=(600,600)) self.cw.addDock(self.gvDock) ## Load previous window state self.stateFile = os.path.join('modules', self.module.name + '_ui.cfg') uiState = module.manager.readConfigFile(self.stateFile) if 'geometry' in uiState: geom = QtCore.QRect(*uiState['geometry']) self.setGeometry(geom) if 'window' in uiState: ws = QtCore.QByteArray.fromPercentEncoding(uiState['window']) self.restoreState(ws) self.show() ## set up ViewBox self.view = pg.ViewBox() self.view.setAspectLocked(True) self.gv.setCentralItem(self.view) ## build camera control panels man = Manager.getManager() camNames = man.listInterfaces('camera') self.cameras = [] self.cameraDocks = [] if len(camNames) == 0: label = QtGui.QLabel("No cameras available") label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) dock = dockarea.Dock(name="nocamera", widget=label, size=(100, 500), hideTitle=True) self.cw.addDock(dock, 'left', self.gvDock) else: for name in camNames: camera = man.getInterface('camera', name) iface = camera.cameraModuleInterface(self) self.cameras.append(iface) dock = dockarea.Dock(name=name, widget=iface.controlWidget(), size=(10, 500), hideTitle=(len(camNames)==1)) if len(self.cameraDocks) == 0: self.cw.addDock(dock, 'left', self.gvDock) else: self.cw.addDock(dock, 'below', self.cameraDocks[0]) self.cameraDocks.append(dock) iface.sigNewFrame.connect(self.newFrame) ## ROI plot ctrls self.roiWidget = QtGui.QWidget() self.roiLayout = QtGui.QGridLayout() self.roiLayout.setSpacing(0) self.roiLayout.setContentsMargins(0,0,0,0) self.roiWidget.setLayout(self.roiLayout) rectPath = QtGui.QPainterPath() rectPath.addRect(0, 0, 1, 1) self.rectBtn = pg.PathButton(path=rectPath) ellPath = QtGui.QPainterPath() ellPath.addEllipse(0, 0, 1, 1) self.ellipseBtn = pg.PathButton(path=ellPath) polyPath = QtGui.QPainterPath() polyPath.moveTo(0,0) polyPath.lineTo(2,3) polyPath.lineTo(3,1) polyPath.lineTo(5,0) polyPath.lineTo(2, -2) polyPath.lineTo(0,0) self.polygonBtn = pg.PathButton(path=polyPath) polyPath = QtGui.QPainterPath() polyPath.moveTo(0,0) polyPath.lineTo(2,3) polyPath.lineTo(3,1) polyPath.lineTo(5,0) self.polylineBtn = pg.PathButton(path=polyPath) self.roiLayout.addWidget(self.rectBtn, 0, 0) self.roiLayout.addWidget(self.ellipseBtn, 0, 1) self.roiLayout.addWidget(self.polygonBtn, 1, 0) self.roiLayout.addWidget(self.polylineBtn, 1, 1) self.roiTimeSpin = pg.SpinBox(value=5.0, suffix='s', siPrefix=True, dec=True, step=0.5, bounds=(0,None)) self.roiLayout.addWidget(self.roiTimeSpin, 2, 0, 1, 2) self.roiPlotCheck = QtGui.QCheckBox('Plot') self.roiLayout.addWidget(self.roiPlotCheck, 3, 0, 1, 2) self.roiPlot = pg.PlotWidget() self.roiLayout.addWidget(self.roiPlot, 0, 2, self.roiLayout.rowCount(), 1) self.roiDock = dockarea.Dock(name='ROI Plot', widget=self.roiWidget, size=(600, 10)) self.cw.addDock(self.roiDock, 'bottom', self.gvDock) #grid = pg.GridItem() #self.view.addItem(grid) ##Scale bar self.scaleBar = pg.ScaleBar(100e-6, offset=(-20,-20)) self.scaleBar.setParentItem(self.view) ### Set up status bar labels self.recLabel = QtGui.QLabel() #self.fpsLabel = pg.ValueLabel(averageTime=2.0, formatStr='{avgValue:.1f} fps') #self.displayFpsLabel = pg.ValueLabel(averageTime=2.0, formatStr='(displaying {avgValue:.1f} fps') #self.displayPercentLabel = pg.ValueLabel(averageTime=4.0, formatStr='{avgValue:.1f}%)') self.rgnLabel = QtGui.QLabel() self.xyLabel = QtGui.QLabel() self.tLabel = QtGui.QLabel() self.vLabel = QtGui.QLabel() #self.fpsLabel.setFixedWidth(50) #self.displayFpsLabel.setFixedWidth(100) #self.displayFpsLabel.setFixedWidth(100) self.vLabel.setFixedWidth(50) #self.logBtn = LogButton('Log') self.setStatusBar(StatusBar()) font = self.xyLabel.font() font.setPointSize(8) labels = [self.recLabel, self.xyLabel, self.rgnLabel, self.tLabel, self.vLabel] for label in labels: label.setFont(font) self.statusBar().insertPermanentWidget(0, label) ## done with UI self.show() #self.autoRange() self.centerView() self.gv.scene().sigMouseMoved.connect(self.updateMouse) ## Connect ROI dock self.rectBtn.clicked.connect(self.addROI) #self.ui.btnClearROIs.clicked.connect(self.clearROIs) #self.roiPlotCheck.stateChanged.connect(self.enableROIsChanged) self.roiTimeSpin.valueChanged.connect(self.setROITime)