def powerCmdChanged(self): self.clearRawPlots() self.cache = {} rate = self.powerWidget.rate #### calculate, cache and display sequence waves for shutter/qSwitch/pCell params = {} ps = self.powerWidget.listSequence() for k in ps: params[k] = range(len(ps[k])) ## get power waveforms waves = [] runSequence( lambda p: waves.append(self.powerWidget.getSingleWave(p)), params, list(params.keys( ))) ## appends waveforms for the entire parameter space to waves for w in waves: if w is not None: ## need to translate w into raw traces, plot them, and cache them (using id(w) as a key) rawWaves = self.getChannelCmds(w, rate) #rawWaves = self.dev.getChannelCmds({'powerWaveform':w}, rate) ## calculate raw waveforms for shutter/qSwitch/pCell from powerWaveform #self.cache[id(w)] = rawWaves ## cache the calculated waveforms self.plotRawCurves( rawWaves, color=Qt.QColor(100, 100, 100) ) ## plot the raw waveform in it's appropriate plot in grey ## calculate (or pull from cache) and display single-mode wave in red single = self.powerWidget.getSingleWave() if single is not None: #rawSingle = self.cache.get(id(single), self.dev.getChannelCmds({'powerWaveform':single}, rate)) rawSingle = self.getChannelCmds(single, rate) self.plotRawCurves(rawSingle, color=Qt.QColor(200, 100, 100))
def updateWaves(self): if self._block_update: return self.clearCmdPlots() ## compute sequence waves params = {} ps = self.ui.waveGeneratorWidget.listSequences() for k in ps: params[k] = range(len(ps[k])) waves = [] runSequence(lambda p: waves.append(self.getSingleWave(p)), params, list(params.keys())) # Plot all waves but disable auto-range first to improve performance. autoRange = self.ui.bottomPlotWidget.getViewBox().autoRangeEnabled() self.ui.bottomPlotWidget.enableAutoRange(x=False, y=False) try: for w in waves: if w is not None: self.plotCmdWave(w, color=Qt.QColor(100, 100, 100), replot=False) ## display single-mode wave in red single = self.getSingleWave() if single is not None: p = self.plotCmdWave(single, color=Qt.QColor(200, 100, 100)) p.setZValue(1000) finally: # re-enable auto range if needed self.ui.bottomPlotWidget.enableAutoRange(x=autoRange[0], y=autoRange[1])
def updateDeviceList(self, task=None): """Update the device list to reflect only the devices that exist in the system or are referenced by the current task. Update the color and checkstate of each item as well.""" devList = self.manager.listDevices() if task is not None: protList = list(task.devices.keys()) elif self.currentTask is not None: protList = list(self.currentTask.devices.keys()) else: protList = [] ## Remove all devices that do not exist and are not referenced by the task rem = [] for d in self.devListItems: if d not in devList and d not in protList: #print " ", d self.ui.deviceList.takeItem( self.ui.deviceList.row(self.devListItems[d])) rem.append(d) for d in rem: del self.devListItems[d] ## Add all devices that exist in the current system for d in devList: if d not in self.devListItems: self.devListItems[d] = Qt.QListWidgetItem( d, self.ui.deviceList) #self.devListItems[d].setData(32, Qt.QVariant(d)) self.devListItems[d].setData(32, d) self.devListItems[d].setForeground(Qt.QBrush(Qt.QColor(0, 0, 0))) ## Add all devices that are referenced by the task but do not exist for d in protList: if d not in self.devListItems: self.devListItems[d] = Qt.QListWidgetItem( d, self.ui.deviceList) self.devListItems[d].setForeground( Qt.QBrush(Qt.QColor(150, 0, 0))) ## Make sure flags and checkState are correct for all items for d in self.devListItems: self.devListItems[d].setFlags(Qt.Qt.ItemIsSelectable | Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsUserCheckable) if d in protList: self.devListItems[d].setCheckState(Qt.Qt.Checked) else: self.devListItems[d].setCheckState(Qt.Qt.Unchecked)
def __init__(self, handle, checkState=None, allowMove=True, allowRename=True): Qt.QTreeWidgetItem.__init__(self, [handle.shortName()]) self.handle = handle self.childrenLoaded = False if self.handle.isDir(): self.setExpanded(False) self.setChildIndicatorPolicy(Qt.QTreeWidgetItem.ShowIndicator) self.setFlags(Qt.Qt.ItemIsSelectable | Qt.Qt.ItemIsDropEnabled | Qt.Qt.ItemIsEnabled) self.setForeground(0, Qt.QBrush(Qt.QColor(0, 0, 150))) else: self.setFlags(Qt.Qt.ItemIsSelectable | Qt.Qt.ItemIsEnabled) if allowMove: self.setFlag(Qt.Qt.ItemIsDragEnabled) if allowRename: self.setFlag(Qt.Qt.ItemIsEditable) if checkState is not None: self.setFlag(Qt.Qt.ItemIsUserCheckable) if checkState: self.setCheckState(0, Qt.Qt.Checked) else: self.setCheckState(0, Qt.Qt.Unchecked) self.expandState = False self.handle.sigChanged.connect(self.handleChanged) self.updateBoldState()
def plotCmdWave(self, data, color=Qt.QColor(100, 100, 100), replot=True): if data is None: return plot = self.ui.bottomPlotWidget.plot(data, x=self.timeVals) plot.setPen(Qt.QPen(color)) return plot
def updateCurrentDirItem(self): """Color the currentDir item, expand, and scroll-to""" #print "UpdateCurrentDirItem" item = self.item(self.currentDir) item.setBackground(0, Qt.QBrush(Qt.QColor(250, 100, 100))) item.setExpanded(True) self.scrollToItem(item) self.selectionChanged()
def handleResult(self, result, params): if self.stateGroup.state()['displayCheck']: if self.clearBeforeNextPlot: self.clearPlots() self.clearBeforeNextPlot = False plot = self.plot.plot(y=result.view(numpy.ndarray), x=result.xvals('Time'), pen=Qt.QPen(Qt.QColor(200, 200, 200)), params=params)
def addSpot(self, pos, size): """Add a circle to the image""" s2 = size/2.0 s = Qt.QGraphicsEllipseItem(0, 0, 1, 1) s.scale(size, size) s.setPos(pos[0]-s2, pos[1]-s2) s.setPen(Qt.QPen(Qt.QColor(100, 255, 100, 70))) self.ui.view.addItem(s) s.setZValue(100) self.spots.append(s)
def taskStarted(self, params): ## Draw green trace for current command waveform if self.currentCmdPlot is not None: self.ui.bottomPlotWidget.removeItem(self.currentCmdPlot) params = dict([(p[1], params[p]) for p in params if p[0] == self.dev.name()]) cur = self.getSingleWave(params) if cur is not None: self.currentCmdPlot = self.plotCmdWave(cur, color=Qt.QColor( 100, 200, 100)) self.currentCmdPlot.setZValue(1001)
def taskStarted(self, params): ## Draw green trace for current command waveform if not self.stateGroup.state()['displayCheck']: return if self.currentPlot is not None: self.plot.removeItem(self.currentPlot) cur = self.getSingleWave(params) if cur is not None: self.currentPlot = self.plotCurve(cur, color=Qt.QColor(100, 200, 100)) self.currentPlot.setZValue(100)
def plotRawCurves(self, data, color=Qt.QColor(100, 100, 100)): if 'shutter' in data: self.shutterPlot.plot(y=data['shutter'], x=self.powerWidget.timeVals, pen=Qt.QPen(color)) if 'qSwitch' in data: self.qSwitchPlot.plot(y=data['qSwitch'], x=self.powerWidget.timeVals, pen=Qt.QPen(color)) if 'pCell' in data: self.pCellPlot.plot(y=data['pCell'], x=self.powerWidget.timeVals, pen=Qt.QPen(color))
def getColor(self, args): arg = str(self.argCombo.currentText()) if arg not in args: raise Exception( 'Cannot generate color; value "%s" is not present in this data.' % arg) val = args[arg] if val is None: return Qt.QColor(100, 100, 100, 255) #raise Exception('Cannot generate color; value "%s" is empty (None).' % arg) mn = self.minSpin.value() mx = self.maxSpin.value() norm = np.clip((val - mn) / (mx - mn), 0.0, 1.0) return self.gradient.getColor(norm)
def updateWaves(self): if self._block_update: return if not self.ui.functionCheck.isChecked(): self.plot.clear() return self.clearPlots() ## display sequence waves params = {} ps = self.ui.waveGeneratorWidget.listSequences() for k in ps: params[k] = range(len(ps[k])) waves = [] runSequence( lambda p: waves.append(self.getSingleWave(p)), params, list(params.keys( ))) ## appends waveforms for the entire parameter space to waves autoRange = self.plot.getViewBox().autoRangeEnabled() self.plot.enableAutoRange(x=False, y=False) try: for w in waves: if w is not None: # self.ui.functionCheck.setChecked(True) self.plotCurve(w, color=Qt.QColor(100, 100, 100)) ## display single-mode wave in red single = self.getSingleWave() if single is not None: # self.ui.functionCheck.setChecked(True) self.plotCurve(single, color=Qt.QColor(200, 100, 100)) finally: self.plot.enableAutoRange(x=autoRange[0], y=autoRange[1]) self.sigDataChanged.emit(self)
def setCurrentDir(self, d): #print "set current %s -> %s" % (self.currentDir, d) ## uncolor previous current item if self.currentDir in self.items: item = self.items[self.currentDir] item.setBackground(0, Qt.QBrush(Qt.QColor(255, 255, 255))) #print " - uncolor item ", item, self.handle(item) self.currentDir = d if d is self.baseDir: return self.expandTo(d) if d in self.items: self.updateCurrentDirItem()
def getColor(self, args): color = np.array([0., 0., 0., 0.]) for item in self.items: c = item.getColor(args) c = np.array([c.red(), c.green(), c.blue(), c.alpha()], dtype=float) / 255. op = item.getOp() if op == '+': color += c elif op == '*': color *= c color = np.clip(color, 0, 1.) #print color, c color = np.clip(color * 255, 0, 255).astype(int) return Qt.QColor(*color)
def getTargetList(self): ## should probably do some caching here. items = self.activeItems() locations = [] occArea = Qt.QPainterPath() for i in items: if isinstance(i, TargetOcclusion): occArea |= i.mapToView(i.shape()) for i in items: pts = i.listPoints() for j in range(len(pts)): p = pts[j] point = Qt.QPointF(p[0], p[1]) if occArea.contains(point): i.setTargetPen(j, Qt.QPen(Qt.QColor(0,0,0,160))) else: locations.append(p) i.setTargetPen(j, None) return locations
def evaluateTrace(self, data): bstart = self.state['clampBaseStartSpin'] bstop = self.state['clampBaseStopSpin'] tstart = self.state['clampTestStartSpin'] tstop = self.state['clampTestStopSpin'] base = data['Time':bstart:bstop].view(ndarray) test = data['Time':tstart:tstop].view(ndarray) if len(test) == 0: raise Exception( "Uncaging analysis: No clamp data to evaluate. Check start/stop values?" ) time = data.xvals('Time') dt = time[1] - time[0] med = np.median(base) std = base.std() testDetrend = test - med testBlur = scipy.ndimage.gaussian_filter(testDetrend, (1e-3 / dt)) # Compute size of positive / negative peaks mx = testDetrend.max() mn = testDetrend.min() results = { 'maxPeak': mx, 'minPeak': mn, 'maxZScore': mx / std, 'minZScore': mn / std, } # do spike detection thresh = self.state['spikeThresholdSpin'] if self.state['spikeThresholdAbsRadio'] is False: thresh += med if thresh > med: mask = test > thresh else: mask = test < thresh spikes = np.argwhere(np.diff(mask.astype(np.int8)) == 1) results['nSpikes'] = len(spikes) # generate spot color from analysis color = self.ui().ui.colorMapper.map(results) return Qt.QColor(*color[0])
def addROI(): global rois, img, images, plots, cTimes, plotVBox c = intColor(len(rois)) roi = RectROI([0, 0], [5, 5], translateSnap=True, scaleSnap=True) roi.setPen(Qt.QPen(c)) rois.append(roi) images[0].addItem(roi) p = PlotWidget(None, name='ROI-%03d' % len(rois)) #p.ui.btnHorizScale.setChecked(True) p.addCurve( ROIPlotItem(roi, img, images[0].imageItem, axes=(1, 2), xVals=cTimes, color=c)) p.setSizePolicy( Qt.QSizePolicy(Qt.QSizePolicy.MinimumExpanding, Qt.QSizePolicy.MinimumExpanding)) p.setMinimumSize(100, 100) plotVBox.addWidget(p) p.line = Qt.QGraphicsLineItem(0, 1e100, 0, -1e100) p.addItem(p.line) p.line.setPen(Qt.QPen(Qt.QColor(200, 200, 0))) Qt.QObject.connect( images[0].cw, Qt.SIGNAL('timeChanged'), lambda i, t: p.line.setLine(cTimes[i], 1e100, cTimes[i], -1e100)) #Qt.QObject.connect(images[0].cw, Qt.SIGNAL('timeChanged'), p.scene.invalidate) ## improves performance #images[0].ui.timeSlider.setTracking(False) Qt.QObject.connect(p, Qt.SIGNAL('closed'), lambda: images[0].removeItem(roi)) #for pp in plots: #p.view.lockXRange(pp.view) #pp.view.lockXRange(p.view) plots.append(p)
def setupUi(self, Form): Form.setObjectName(_fromUtf8("Form")) Form.resize(384, 410) sizePolicy = Qt.QSizePolicy(Qt.QSizePolicy.Minimum, Qt.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(Form.sizePolicy().hasHeightForWidth()) Form.setSizePolicy(sizePolicy) Form.setMaximumSize(Qt.QSize(384, 410)) font = Qt.QFont() font.setFamily(_fromUtf8("Arial")) font.setPointSize(12) Form.setFont(font) self.gridLayout = Qt.QGridLayout(Form) self.gridLayout.setMargin(0) self.gridLayout.setHorizontalSpacing(10) self.gridLayout.setVerticalSpacing(0) self.gridLayout.setObjectName(_fromUtf8("gridLayout")) self.groupBox = Qt.QGroupBox(Form) self.groupBox.setMaximumSize(Qt.QSize(392, 410)) font = Qt.QFont() font.setFamily(_fromUtf8("Lucida Grande")) font.setPointSize(13) self.groupBox.setFont(font) self.groupBox.setAlignment(Qt.Qt.AlignCenter) self.groupBox.setFlat(True) self.groupBox.setObjectName(_fromUtf8("groupBox")) self.groupBox_3 = Qt.QGroupBox(self.groupBox) self.groupBox_3.setGeometry(Qt.QRect(15, 20, 171, 371)) sizePolicy = Qt.QSizePolicy(Qt.QSizePolicy.Preferred, Qt.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.groupBox_3.sizePolicy().hasHeightForWidth()) self.groupBox_3.setSizePolicy(sizePolicy) palette = Qt.QPalette() brush = Qt.QBrush(Qt.QColor(99, 99, 99)) brush.setStyle(Qt.Qt.SolidPattern) palette.setBrush(Qt.QPalette.Active, Qt.QPalette.Shadow, brush) brush = Qt.QBrush(Qt.QColor(99, 99, 99)) brush.setStyle(Qt.Qt.SolidPattern) palette.setBrush(Qt.QPalette.Inactive, Qt.QPalette.Shadow, brush) brush = Qt.QBrush(Qt.QColor(99, 99, 99)) brush.setStyle(Qt.Qt.SolidPattern) palette.setBrush(Qt.QPalette.Disabled, Qt.QPalette.Shadow, brush) self.groupBox_3.setPalette(palette) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) self.layoutWidget = Qt.QWidget(self.groupBox_3) self.layoutWidget.setGeometry(Qt.QRect(10, 240, 146, 26)) self.layoutWidget.setObjectName(_fromUtf8("layoutWidget")) self.horizontalLayout_10 = Qt.QHBoxLayout(self.layoutWidget) self.horizontalLayout_10.setMargin(9) self.horizontalLayout_10.setSpacing(6) self.horizontalLayout_10.setObjectName( _fromUtf8("horizontalLayout_10")) self.label_6 = Qt.QLabel(self.layoutWidget) self.label_6.setObjectName(_fromUtf8("label_6")) self.horizontalLayout_10.addWidget(self.label_6) self.ImagePhys_ROIKernel = Qt.QComboBox(self.layoutWidget) self.ImagePhys_ROIKernel.setMaximumSize(Qt.QSize(75, 16777215)) self.ImagePhys_ROIKernel.setToolTip(_fromUtf8("")) self.ImagePhys_ROIKernel.setLayoutDirection(Qt.Qt.LeftToRight) self.ImagePhys_ROIKernel.setStyleSheet( _fromUtf8("<align = \'right\'>")) self.ImagePhys_ROIKernel.setMaxVisibleItems(1) self.ImagePhys_ROIKernel.setMaxCount(10) self.ImagePhys_ROIKernel.setSizeAdjustPolicy( Qt.QComboBox.AdjustToMinimumContentsLength) self.ImagePhys_ROIKernel.setFrame(False) self.ImagePhys_ROIKernel.setModelColumn(0) self.ImagePhys_ROIKernel.setObjectName( _fromUtf8("ImagePhys_ROIKernel")) self.ImagePhys_ROIKernel.addItem(_fromUtf8("")) self.ImagePhys_ROIKernel.addItem(_fromUtf8("")) self.ImagePhys_ROIKernel.addItem(_fromUtf8("")) self.ImagePhys_ROIKernel.addItem(_fromUtf8("")) self.ImagePhys_ROIKernel.addItem(_fromUtf8("")) self.ImagePhys_ROIKernel.addItem(_fromUtf8("")) self.horizontalLayout_10.addWidget(self.ImagePhys_ROIKernel) self.layoutWidget1 = Qt.QWidget(self.groupBox_3) self.layoutWidget1.setGeometry(Qt.QRect(5, 215, 156, 25)) self.layoutWidget1.setObjectName(_fromUtf8("layoutWidget1")) self.horizontalLayout_14 = Qt.QHBoxLayout(self.layoutWidget1) self.horizontalLayout_14.setMargin(9) self.horizontalLayout_14.setSpacing(6) self.horizontalLayout_14.setObjectName( _fromUtf8("horizontalLayout_14")) self.ImagePhys_StdRB = Qt.QRadioButton(self.layoutWidget1) self.ImagePhys_StdRB.setObjectName(_fromUtf8("ImagePhys_StdRB")) self.horizontalLayout_14.addWidget(self.ImagePhys_StdRB) self.ImagePhys_FFTRB = Qt.QRadioButton(self.layoutWidget1) self.ImagePhys_FFTRB.setChecked(True) self.ImagePhys_FFTRB.setObjectName(_fromUtf8("ImagePhys_FFTRB")) self.horizontalLayout_14.addWidget(self.ImagePhys_FFTRB) self.layoutWidget2 = Qt.QWidget(self.groupBox_3) self.layoutWidget2.setGeometry(Qt.QRect(10, 270, 146, 100)) self.layoutWidget2.setObjectName(_fromUtf8("layoutWidget2")) self.verticalLayout_2 = Qt.QVBoxLayout(self.layoutWidget2) self.verticalLayout_2.setMargin(9) self.verticalLayout_2.setSpacing(6) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) self.ImagePhys_RecalculateROIs = Qt.QPushButton(self.layoutWidget2) self.ImagePhys_RecalculateROIs.setObjectName( _fromUtf8("ImagePhys_RecalculateROIs")) self.verticalLayout_2.addWidget(self.ImagePhys_RecalculateROIs) self.ImagePhys_RetrieveROI = Qt.QPushButton(self.layoutWidget2) self.ImagePhys_RetrieveROI.setObjectName( _fromUtf8("ImagePhys_RetrieveROI")) self.verticalLayout_2.addWidget(self.ImagePhys_RetrieveROI) self.ImagePhys_SaveROI = Qt.QPushButton(self.layoutWidget2) self.ImagePhys_SaveROI.setObjectName(_fromUtf8("ImagePhys_SaveROI")) self.verticalLayout_2.addWidget(self.ImagePhys_SaveROI) self.widget = Qt.QWidget(self.groupBox_3) self.widget.setGeometry(Qt.QRect(5, 20, 161, 136)) self.widget.setObjectName(_fromUtf8("widget")) self.gridLayout_2 = Qt.QGridLayout(self.widget) self.gridLayout_2.setMargin(9) self.gridLayout_2.setSpacing(6) self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2")) self.ImagePhys_addRoi = Qt.QPushButton(self.widget) self.ImagePhys_addRoi.setObjectName(_fromUtf8("ImagePhys_addRoi")) self.gridLayout_2.addWidget(self.ImagePhys_addRoi, 0, 0, 1, 1) self.ImagePhys_clearRoi = Qt.QPushButton(self.widget) self.ImagePhys_clearRoi.setObjectName(_fromUtf8("ImagePhys_clearRoi")) self.gridLayout_2.addWidget(self.ImagePhys_clearRoi, 1, 0, 1, 1) self.ImagePhys_findROIs = Qt.QPushButton(self.widget) self.ImagePhys_findROIs.setObjectName(_fromUtf8("ImagePhys_findROIs")) self.gridLayout_2.addWidget(self.ImagePhys_findROIs, 2, 0, 1, 1) self.horizontalLayout_3 = Qt.QHBoxLayout() self.horizontalLayout_3.setMargin(9) self.horizontalLayout_3.setSpacing(6) self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) self.label_13 = Qt.QLabel(self.widget) self.label_13.setObjectName(_fromUtf8("label_13")) self.horizontalLayout_3.addWidget(self.label_13) self.ImagePhys_ROISize = Qt.QSpinBox(self.widget) self.ImagePhys_ROISize.setMinimum(1) self.ImagePhys_ROISize.setMaximum(25) self.ImagePhys_ROISize.setProperty("value", 2) self.ImagePhys_ROISize.setObjectName(_fromUtf8("ImagePhys_ROISize")) self.horizontalLayout_3.addWidget(self.ImagePhys_ROISize) self.gridLayout_2.addLayout(self.horizontalLayout_3, 3, 0, 1, 1) self.widget1 = Qt.QWidget(self.groupBox_3) self.widget1.setGeometry(Qt.QRect(5, 160, 161, 53)) self.widget1.setObjectName(_fromUtf8("widget1")) self.horizontalLayout_4 = Qt.QHBoxLayout(self.widget1) self.horizontalLayout_4.setMargin(9) self.horizontalLayout_4.setSpacing(6) self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) self.verticalLayout = Qt.QVBoxLayout() self.verticalLayout.setMargin(9) self.verticalLayout.setSpacing(6) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) self.label_11 = Qt.QLabel(self.widget1) self.label_11.setAlignment(Qt.Qt.AlignCenter) self.label_11.setObjectName(_fromUtf8("label_11")) self.verticalLayout.addWidget(self.label_11) self.ImagePhys_ROIThrLow = Qt.QDoubleSpinBox(self.widget1) sizePolicy = Qt.QSizePolicy(Qt.QSizePolicy.Minimum, Qt.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.ImagePhys_ROIThrLow.sizePolicy().hasHeightForWidth()) self.ImagePhys_ROIThrLow.setSizePolicy(sizePolicy) self.ImagePhys_ROIThrLow.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignTrailing | Qt.Qt.AlignVCenter) self.ImagePhys_ROIThrLow.setMinimum(0.01) self.ImagePhys_ROIThrLow.setMaximum(1.0) self.ImagePhys_ROIThrLow.setSingleStep(0.1) self.ImagePhys_ROIThrLow.setProperty("value", 0.2) self.ImagePhys_ROIThrLow.setObjectName( _fromUtf8("ImagePhys_ROIThrLow")) self.verticalLayout.addWidget(self.ImagePhys_ROIThrLow) self.horizontalLayout_4.addLayout(self.verticalLayout) self.verticalLayout_3 = Qt.QVBoxLayout() self.verticalLayout_3.setMargin(9) self.verticalLayout_3.setSpacing(6) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) self.label_12 = Qt.QLabel(self.widget1) self.label_12.setAlignment(Qt.Qt.AlignCenter) self.label_12.setObjectName(_fromUtf8("label_12")) self.verticalLayout_3.addWidget(self.label_12) self.ImagePhys_ROIThrHigh = Qt.QDoubleSpinBox(self.widget1) sizePolicy = Qt.QSizePolicy(Qt.QSizePolicy.Minimum, Qt.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.ImagePhys_ROIThrHigh.sizePolicy().hasHeightForWidth()) self.ImagePhys_ROIThrHigh.setSizePolicy(sizePolicy) self.ImagePhys_ROIThrHigh.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignTrailing | Qt.Qt.AlignVCenter) self.ImagePhys_ROIThrHigh.setMinimum(0.1) self.ImagePhys_ROIThrHigh.setMaximum(1.0) self.ImagePhys_ROIThrHigh.setSingleStep(0.1) self.ImagePhys_ROIThrHigh.setProperty("value", 1.0) self.ImagePhys_ROIThrHigh.setObjectName( _fromUtf8("ImagePhys_ROIThrHigh")) self.verticalLayout_3.addWidget(self.ImagePhys_ROIThrHigh) self.horizontalLayout_4.addLayout(self.verticalLayout_3) self.groupBox_2 = Qt.QGroupBox(self.groupBox) self.groupBox_2.setGeometry(Qt.QRect(205, 20, 156, 191)) self.groupBox_2.setMinimumSize(Qt.QSize(120, 190)) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) self.ImagePhys_RegisterStack = Qt.QPushButton(self.groupBox_2) self.ImagePhys_RegisterStack.setGeometry(Qt.QRect(0, 15, 151, 29)) self.ImagePhys_RegisterStack.setObjectName( _fromUtf8("ImagePhys_RegisterStack")) self.layoutWidget3 = Qt.QWidget(self.groupBox_2) self.layoutWidget3.setGeometry(Qt.QRect(0, 40, 141, 32)) self.layoutWidget3.setObjectName(_fromUtf8("layoutWidget3")) self.horizontalLayout_6 = Qt.QHBoxLayout(self.layoutWidget3) self.horizontalLayout_6.setMargin(9) self.horizontalLayout_6.setSpacing(6) self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) self.ImagePhys_UnBleach = Qt.QPushButton(self.layoutWidget3) self.ImagePhys_UnBleach.setCheckable(True) self.ImagePhys_UnBleach.setObjectName(_fromUtf8("ImagePhys_UnBleach")) self.horizontalLayout_6.addWidget(self.ImagePhys_UnBleach) self.ImagePhys_BleachInfo = Qt.QLabel(self.layoutWidget3) self.ImagePhys_BleachInfo.setFrameShape(Qt.QFrame.StyledPanel) self.ImagePhys_BleachInfo.setFrameShadow(Qt.QFrame.Sunken) self.ImagePhys_BleachInfo.setAlignment(Qt.Qt.AlignCenter) self.ImagePhys_BleachInfo.setObjectName( _fromUtf8("ImagePhys_BleachInfo")) self.horizontalLayout_6.addWidget(self.ImagePhys_BleachInfo) self.ImagePhys_SpecCalc = Qt.QPushButton(self.groupBox_2) self.ImagePhys_SpecCalc.setGeometry(Qt.QRect(0, 70, 151, 30)) self.ImagePhys_SpecCalc.setObjectName(_fromUtf8("ImagePhys_SpecCalc")) self.layoutWidget4 = Qt.QWidget(self.groupBox_2) self.layoutWidget4.setGeometry(Qt.QRect(0, 95, 146, 27)) self.layoutWidget4.setObjectName(_fromUtf8("layoutWidget4")) self.horizontalLayout = Qt.QHBoxLayout(self.layoutWidget4) self.horizontalLayout.setMargin(9) self.horizontalLayout.setSpacing(6) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) self.label_7 = Qt.QLabel(self.layoutWidget4) self.label_7.setObjectName(_fromUtf8("label_7")) self.horizontalLayout.addWidget(self.label_7) self.ImagePhys_SpecHPF = Qt.QDoubleSpinBox(self.layoutWidget4) self.ImagePhys_SpecHPF.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignTrailing | Qt.Qt.AlignVCenter) self.ImagePhys_SpecHPF.setProperty("value", 1.0) self.ImagePhys_SpecHPF.setObjectName(_fromUtf8("ImagePhys_SpecHPF")) self.horizontalLayout.addWidget(self.ImagePhys_SpecHPF) self.layoutWidget5 = Qt.QWidget(self.groupBox_2) self.layoutWidget5.setGeometry(Qt.QRect(0, 125, 146, 27)) self.layoutWidget5.setObjectName(_fromUtf8("layoutWidget5")) self.horizontalLayout_11 = Qt.QHBoxLayout(self.layoutWidget5) self.horizontalLayout_11.setMargin(9) self.horizontalLayout_11.setSpacing(6) self.horizontalLayout_11.setObjectName( _fromUtf8("horizontalLayout_11")) self.label_8 = Qt.QLabel(self.layoutWidget5) self.label_8.setObjectName(_fromUtf8("label_8")) self.horizontalLayout_11.addWidget(self.label_8) self.ImagePhys_SpecLPF = Qt.QDoubleSpinBox(self.layoutWidget5) self.ImagePhys_SpecLPF.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignTrailing | Qt.Qt.AlignVCenter) self.ImagePhys_SpecLPF.setProperty("value", 10.0) self.ImagePhys_SpecLPF.setObjectName(_fromUtf8("ImagePhys_SpecLPF")) self.horizontalLayout_11.addWidget(self.ImagePhys_SpecLPF) self.layoutWidget6 = Qt.QWidget(self.groupBox_2) self.layoutWidget6.setGeometry(Qt.QRect(1, 155, 149, 27)) self.layoutWidget6.setObjectName(_fromUtf8("layoutWidget6")) self.horizontalLayout_12 = Qt.QHBoxLayout(self.layoutWidget6) self.horizontalLayout_12.setMargin(9) self.horizontalLayout_12.setSpacing(6) self.horizontalLayout_12.setObjectName( _fromUtf8("horizontalLayout_12")) self.label_10 = Qt.QLabel(self.layoutWidget6) self.label_10.setObjectName(_fromUtf8("label_10")) self.horizontalLayout_12.addWidget(self.label_10) self.ImagePhys_FFTSmooth = Qt.QSpinBox(self.layoutWidget6) self.ImagePhys_FFTSmooth.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignTrailing | Qt.Qt.AlignVCenter) self.ImagePhys_FFTSmooth.setMaximum(16) self.ImagePhys_FFTSmooth.setObjectName( _fromUtf8("ImagePhys_FFTSmooth")) self.horizontalLayout_12.addWidget(self.ImagePhys_FFTSmooth) self.groupBox_6 = Qt.QGroupBox(self.groupBox) self.groupBox_6.setGeometry(Qt.QRect(205, 220, 161, 161)) self.groupBox_6.setObjectName(_fromUtf8("groupBox_6")) self.layoutWidget7 = Qt.QWidget(self.groupBox_6) self.layoutWidget7.setGeometry(Qt.QRect(5, 51, 152, 31)) self.layoutWidget7.setObjectName(_fromUtf8("layoutWidget7")) self.horizontalLayout_7 = Qt.QHBoxLayout(self.layoutWidget7) self.horizontalLayout_7.setMargin(9) self.horizontalLayout_7.setSpacing(6) self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) self.label_3 = Qt.QLabel(self.layoutWidget7) self.label_3.setObjectName(_fromUtf8("label_3")) self.horizontalLayout_7.addWidget(self.label_3) self.ImagePhys_BaseEnd = Qt.QDoubleSpinBox(self.layoutWidget7) self.ImagePhys_BaseEnd.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignTrailing | Qt.Qt.AlignVCenter) self.ImagePhys_BaseEnd.setMinimum(-5000.0) self.ImagePhys_BaseEnd.setMaximum(50000.0) self.ImagePhys_BaseEnd.setObjectName(_fromUtf8("ImagePhys_BaseEnd")) self.horizontalLayout_7.addWidget(self.ImagePhys_BaseEnd) self.layoutWidget8 = Qt.QWidget(self.groupBox_6) self.layoutWidget8.setGeometry(Qt.QRect(5, 20, 152, 27)) self.layoutWidget8.setObjectName(_fromUtf8("layoutWidget8")) self.horizontalLayout_2 = Qt.QHBoxLayout(self.layoutWidget8) self.horizontalLayout_2.setMargin(9) self.horizontalLayout_2.setSpacing(6) self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) self.label = Qt.QLabel(self.layoutWidget8) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout_2.addWidget(self.label) self.ImagePhys_BaseStart = Qt.QDoubleSpinBox(self.layoutWidget8) self.ImagePhys_BaseStart.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignTrailing | Qt.Qt.AlignVCenter) self.ImagePhys_BaseStart.setMinimum(-5000.0) self.ImagePhys_BaseStart.setMaximum(50000.0) self.ImagePhys_BaseStart.setObjectName( _fromUtf8("ImagePhys_BaseStart")) self.horizontalLayout_2.addWidget(self.ImagePhys_BaseStart) self.layoutWidget9 = Qt.QWidget(self.groupBox_6) self.layoutWidget9.setGeometry(Qt.QRect(5, 85, 151, 32)) self.layoutWidget9.setObjectName(_fromUtf8("layoutWidget9")) self.horizontalLayout_8 = Qt.QHBoxLayout(self.layoutWidget9) self.horizontalLayout_8.setMargin(9) self.horizontalLayout_8.setSpacing(6) self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8")) self.ImagePhys_CorrTool_LPF = Qt.QCheckBox(self.layoutWidget9) self.ImagePhys_CorrTool_LPF.setEnabled(True) self.ImagePhys_CorrTool_LPF.setLayoutDirection(Qt.Qt.RightToLeft) self.ImagePhys_CorrTool_LPF.setObjectName( _fromUtf8("ImagePhys_CorrTool_LPF")) self.horizontalLayout_8.addWidget(self.ImagePhys_CorrTool_LPF) self.ImagePhys_ImgLPF = Qt.QDoubleSpinBox(self.layoutWidget9) self.ImagePhys_ImgLPF.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignTrailing | Qt.Qt.AlignVCenter) self.ImagePhys_ImgLPF.setDecimals(2) self.ImagePhys_ImgLPF.setMinimum(0.1) self.ImagePhys_ImgLPF.setMaximum(5000.0) self.ImagePhys_ImgLPF.setSingleStep(1.0) self.ImagePhys_ImgLPF.setProperty("value", 20.0) self.ImagePhys_ImgLPF.setObjectName(_fromUtf8("ImagePhys_ImgLPF")) self.horizontalLayout_8.addWidget(self.ImagePhys_ImgLPF) self.layoutWidget10 = Qt.QWidget(self.groupBox_6) self.layoutWidget10.setGeometry(Qt.QRect(5, 120, 151, 32)) self.layoutWidget10.setObjectName(_fromUtf8("layoutWidget10")) self.horizontalLayout_9 = Qt.QHBoxLayout(self.layoutWidget10) self.horizontalLayout_9.setMargin(9) self.horizontalLayout_9.setSpacing(6) self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9")) self.ImagePhys_CorrTool_HPF = Qt.QCheckBox(self.layoutWidget10) self.ImagePhys_CorrTool_HPF.setLayoutDirection(Qt.Qt.RightToLeft) self.ImagePhys_CorrTool_HPF.setObjectName( _fromUtf8("ImagePhys_CorrTool_HPF")) self.horizontalLayout_9.addWidget(self.ImagePhys_CorrTool_HPF) self.ImagePhys_ImgHPF = Qt.QDoubleSpinBox(self.layoutWidget10) self.ImagePhys_ImgHPF.setAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignTrailing | Qt.Qt.AlignVCenter) self.ImagePhys_ImgHPF.setSuffix(_fromUtf8("")) self.ImagePhys_ImgHPF.setDecimals(3) self.ImagePhys_ImgHPF.setMinimum(0.001) self.ImagePhys_ImgHPF.setMaximum(10.0) self.ImagePhys_ImgHPF.setSingleStep(0.2) self.ImagePhys_ImgHPF.setProperty("value", 0.2) self.ImagePhys_ImgHPF.setObjectName(_fromUtf8("ImagePhys_ImgHPF")) self.horizontalLayout_9.addWidget(self.ImagePhys_ImgHPF) self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 1) self.retranslateUi(Form) self.ImagePhys_ROIKernel.setCurrentIndex(1) Qt.QMetaObject.connectSlotsByName(Form)
def plotCurve(self, data, color=Qt.QColor(100, 100, 100), replot=True): plot = self.plot.plot(y=data, x=self.timeVals, pen=Qt.QPen(color)) return plot
def __init__(self, dev, taskRunner): TaskGui.__init__(self, dev, taskRunner) self.ui = Ui_Form() self.ui.setupUi(self) dm = getManager() self.targets = None self.items = {} self.haveCalibration = True ## whether there is a calibration for the current combination of laser/optics self.currentOpticState = None self.currentCamMod = None self.displaySize = {} ## maps (laser,opticState) : display size ## since this setting is remembered for each objective. # Make sure DQ appears in this task daqName = dev.getDaqName() taskRunner.getDevice(daqName) ## Populate module/device lists, auto-select based on device defaults self.defCam = None if 'defaultCamera' in self.dev.config: self.defCam = self.dev.config['defaultCamera'] defLaser = None if 'defaultLaser' in self.dev.config: defLaser = self.dev.config['defaultLaser'] daqDev = dev.getDaqName() self.daqUI = taskRunner.getDevice(daqDev) self.ui.cameraCombo.setTypes(['cameraModule']) self.ui.laserCombo.setTypes(['laser']) self.positionCtrlGroup = PositionCtrlGroup() self.positionCtrlGroup.sigAddNewRequested.connect(self.addPositionCtrl) self.ui.itemTree.setParameters(self.positionCtrlGroup, showTop=False) self.positionCtrlGroup.sigChildRemoved.connect(self.positionCtrlRemoved) self.ui.spotSequenceGroup.setCollapsed(True) self.ui.spotDisplayGroup.setCollapsed(True) self.scanProgram = ScanProgram() self.scanProgram.setDevices(scanner=self.dev) self.ui.programTree.setParameters(self.scanProgram.ctrlParameter(), showTop=False) ## Set up SpinBoxes self.ui.minTimeSpin.setOpts(dec=True, step=1, minStep=1e-3, siPrefix=True, suffix='s', bounds=[0, 50]) self.ui.minDistSpin.setOpts(dec=True, step=1, minStep=1e-6, siPrefix=True, suffix='m', bounds=[0, 10e-3]) self.ui.sizeSpin.setOpts(dec=True, step=1, minStep=1e-6, siPrefix=True, suffix='m', bounds=[1e-9, 1e-3]) ## Create state group for saving/restoring state self.stateGroup = pg.WidgetGroup([ (self.ui.cameraCombo,), (self.ui.laserCombo,), (self.ui.minTimeSpin, 'minTime'), (self.ui.minDistSpin, 'minDist'), (self.ui.simulateShutterCheck, 'simulateShutter'), (self.ui.sizeSpin, 'spotSize'), (self.ui.enablePosCtrlCheck, 'enablePosCtrl'), (self.ui.enableScanProgCheck, 'enableScanProg'), ]) self.stateGroup.setState({'minTime': 10, 'minDist': 500e-6, 'sizeSpin':100e-6}) self.tdPlot = self.ui.tdPlotWidget.plotItem self.tdPlot.setLabel('bottom', text="Distance", units='m') self.tdPlot.setLabel('left', text="Wait time", units='s') self.ui.scanProgramSplitter.setSizes([600, 100]) self.ui.programTimeline.setDownsampling(True) ## Note we use lambda functions for all these clicks to strip out the arg sent with the signal self.ui.showPosCtrlCheck.toggled.connect(self.showPosCtrls) self.ui.cameraCombo.currentIndexChanged.connect(self.camModChanged) self.ui.laserCombo.currentIndexChanged.connect(self.laserDevChanged) self.ui.sizeFromCalibrationRadio.toggled.connect(self.updateSpotSizes) self.ui.sizeSpin.valueChanged.connect(self.sizeSpinEdited) self.ui.minTimeSpin.valueChanged.connect(self.sequenceChanged) self.ui.minDistSpin.valueChanged.connect(self.sequenceChanged) self.ui.recomputeBtn.clicked.connect(self.recomputeClicked) self.ui.loadConfigBtn.clicked.connect(self.loadConfiguration) self.ui.previewBtn.toggled.connect(self.previewProgram) self.ui.enablePosCtrlCheck.toggled.connect(self.enablePosCtrlToggled) self.ui.enableScanProgCheck.toggled.connect(self.enableScanProgToggled) self.ui.showLastSpotCheck.toggled.connect(self.showLastSpotToggled) self.ui.programPreviewSlider.valueChanged.connect(self.previewRateChanged) self.dev.sigGlobalSubdeviceChanged.connect(self.opticStateChanged) self.testTarget = TargetPoint(name="Test", ptSize=100e-6) self.testTarget.setPen(Qt.QPen(Qt.QColor(255, 200, 200))) self.spotMarker = TargetPoint(name="Last", ptSize=100e-6, movable=False) self.spotMarker.setPen(pg.mkPen(color=(255,255,255), width = 2)) self.spotMarker.hide() self.laserDevChanged() # also updates spot sizes self.camModChanged() self.updateTDPlot() #self.ui.simulateShutterCheck.setChecked(False) if 'offVoltage' not in self.dev.config: ## we don't have a voltage for virtual shuttering self.ui.simulateShutterCheck.setChecked(False) self.ui.simulateShutterCheck.setEnabled(False) self.daqChanged(self.daqUI.currentState()) self.daqUI.sigChanged.connect(self.daqChanged)
def paintEvent(self, event): p = Qt.QPainter(self) brush = Qt.QBrush(Qt.QColor(0, 0, 0)) p.fillRect(self.rect(), brush) p.end()
def recalculate(self, allFrames=False): if len(self.frames) < 1: return #print "recalc", allFrames #print self.state ## calculate image if allFrames: ## Clear out old displays #self.img = None for (i, p, s) in self.items: s = i.scene() if s is not None: s.removeItem(i) self.items = [] ## Compute for all frames frames = self.frames else: frames = self.frames[-1:] #if self.state['displayImageCheck'] and frames[0]['cam'] is not None: #if self.img is None: #self.img = zeros(frames[0]['cam'].shape + (4,), dtype=float32) for f in frames: (r, g, b) = self.evaluateTrace(f['clamp']) #if self.state['displayImageCheck'] and f['cam'] is not None and self.img is not None and f['cam'].shape == self.img.shape: #alpha = gaussian_filter((f['cam'] - f['cam'].min()), (5, 5)) #tol = self.state['spotToleranceSpin'] #alpha = clip(alpha-tol, 0, 2**32) #alpha *= 256. / alpha.max() #newImg = empty(frames[0]['cam'].shape + (4,), dtype=uint16) #newImg[..., 0] = b * alpha #newImg[..., 1] = g * alpha #newImg[..., 2] = r * alpha #newImg[..., 3] = alpha #self.img = clip(self.img + (newImg.astype(uint16)), 0, 255) #else: alpha = self.state['alphaSlider'] spot = Qt.QGraphicsEllipseItem(Qt.QRectF(-0.5, -0.5, 1, 1)) spot.setBrush( Qt.QBrush(Qt.QColor(r * 255, g * 255, b * 255, alpha))) spot.setPen(Qt.QPen(Qt.Qt.NoPen)) p = f['scanner']['position'] s = f['scanner']['spotSize'] self.items.append([spot, p, [s, s]]) self.hide() ## Make sure only correct items are displayed self.show() #if self.state['displayImageCheck']: #self.updateImage() ## update location of image #info = frames[-1]['camInfo'][-1] #s = info['pixelSize'] #p = info['imagePosition'] #self.items[0][1] = p #self.items[0][2] = s ## Set correct scene #cModName = str(self.ui().ui.cameraModCombo.currentText()) #camMod = self.ui().man.getModule(cModName) camMod = self.ui().ui.cameraModCombo.getSelectedObj() scene = camMod.ui.view.scene() for i in self.items: (item, p, s) = i if item.scene() is not scene: camMod.ui.addItem(item, p, s, self.z)
def __init__(self, dm, config): clampName = config['clampDev'] Qt.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(Qt.QMutex.Recursive) self.manager = dm self.clampName = clampName self.thread = PatchThread(self) self.cw = Qt.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 = Qt.QRect(*uiState['geometry']) self.setGeometry(geom) if 'window' in uiState: ws = Qt.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=Qt.QPen(Qt.QColor(200, 200, 200))) self.patchFitCurve = self.ui.patchPlot.plot(pen=Qt.QPen(Qt.QColor(0, 100, 200))) self.ui.commandPlot.setLabel('left', text='Command', units='V') self.commandCurve = self.ui.commandPlot.plot(pen=Qt.QPen(Qt.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=Qt.QPen(Qt.QColor(200, 200, 200))) for suf in ['', 'Std']: self.analysisData[n+suf] = [] self.showPlots() self.updateParams() self.show() self.bathMode()