def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.ui = dashboard.Dashboard(limit=config.get('limit', None), filter_defaults=config.get( 'filters', None)) self.ui.resize(1600, 900) self.ui.show()
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.man = manager self.win = QtGui.QMainWindow() self.cw = DataTreeWidget() self.win.setCentralWidget(self.cw) self.win.show() self.man.sigTaskCreated.connect(self.showTask)
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.ui = multipatch_nwb_viewer.MultipatchNwbViewer() self.ui.resize(1600, 900) self.ui.show() self.load_from_dm_btn = QtGui.QPushButton("load from data manager") self.ui.vsplit.insertWidget(0, self.load_from_dm_btn) self.load_from_dm_btn.clicked.connect(self.load_from_dm_clicked)
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.ui = submit_expt.ExperimentSubmitUi() self.ui.resize(1600, 900) self.ui.show() self.load_from_dm_btn = QtGui.QPushButton("load from data manager") self.ui.left_layout.insertWidget(0, self.load_from_dm_btn) self.load_from_dm_btn.clicked.connect(self.load_from_dm_clicked)
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.ui = vimaging.VImagingAnalyzer() self.ui.resize(1600, 900) self.ui.show() self.load_from_dm_btn = QtGui.QPushButton("load from data manager") self.ui.layout.addWidget(self.load_from_dm_btn, self.ui.layout.rowCount(), 0) self.load_from_dm_btn.clicked.connect(self.load_from_dm_clicked)
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.ui = vimaging.VImagingAnalyzer2() self.ui.resize(1600, 900) self.ui.show() self.load_from_dm_btn = QtGui.QPushButton("load from data manager") self.load_from_dm_btn.setParent(self.ui) self.load_from_dm_btn.resize(160, 30) self.load_from_dm_btn.show() self.load_from_dm_btn.clicked.connect(self.load_from_dm_clicked)
def __init__(self, manager, name, config): from aiccf.data import CCFAtlasData from aiccf.viewer import AtlasViewer Module.__init__(self, manager, name, config) self.man = manager self.win = AtlasViewer() self.win.show() self.win.setWindowTitle(name) resolution = config.get('resolution', None) self.atlas_data = CCFAtlasData(resolution=resolution) self.win.set_data(self.atlas_data)
def __init__(self, manager, name, config): from pycsf.editor import SolutionEditorWindow from pycsf.core import SolutionDatabase Module.__init__(self, manager, name, config) self.man = manager self.db = SolutionDatabase() self.win = SolutionEditorWindow(db=self.db) if 'recipeFile' in config: self.win.loadFile(config['recipeFile']) else: self.db.loadDefault() self.win.show() self.win.tabs.setCurrentIndex(2)
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.man = manager self.win = QtGui.QMainWindow() self.cw = QtGui.QSplitter() self.taskTree = DataTreeWidget() self.resultTree = DataTreeWidget() self.win.setCentralWidget(self.cw) self.cw.addWidget(self.taskTree) self.cw.addWidget(self.resultTree) self.win.show() self.win.setWindowTitle('Task Monitor') self.man.sigTaskCreated.connect(self.showTask) self.taskTimer = QtCore.QTimer() self.taskTimer.timeout.connect(self.checkResult)
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.win = MultiPatchWindow(self) self.win.show()
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.recordDir = None self.recordWritable = False self.running = False self.win = Qt.QSplitter() self.ctrlWidget = pg.LayoutWidget() self.win.addWidget(self.ctrlWidget) self.newBtn = Qt.QPushButton('New Record') self.loadBtn = Qt.QPushButton('Load Record') self.startBtn = Qt.QPushButton('Start') self.startBtn.setCheckable(True) self.fileLabel = Qt.QLabel() self.ctrlWidget.addWidget(self.newBtn, 0, 0) self.ctrlWidget.addWidget(self.loadBtn, 1, 0) self.ctrlWidget.addWidget(self.startBtn, 2, 0) self.ctrlWidget.addWidget(self.fileLabel, 3, 0) self.newBtn.clicked.connect(self.newRecord) self.loadBtn.clicked.connect(self.loadClicked) self.startBtn.toggled.connect(self.startToggled) self.params = pg.parametertree.Parameter.create( name='params', type='group', children=[ dict(name='interval', type='float', value=10, suffix='s', siPrefix=True, limits=[0.001, None], step=1.0), dict(name='trace duration', type='float', value=1.0, suffix='s', siPrefix=True, limits=[0.001, None], step=0.1), dict(name='sample rate', type='int', value=1e6, suffix='Hz', siPrefix=True, limits=[100, None], step=1e5), ]) self.ptree = pg.parametertree.ParameterTree() self.ptree.setParameters(self.params) self.ctrlWidget.addWidget(self.ptree, 4, 0) self.channelLayout = Qt.QSplitter() self.win.addWidget(self.channelLayout) self.channels = collections.OrderedDict() self.win.show() self.timer = Qt.QTimer() self.timer.timeout.connect(self.runOnce)
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.ui = dashboard.Dashboard(limit=config.get('limit', None), filter_defaults=config.get('filters', None)) self.ui.resize(1600, 900) self.ui.show()
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.win = ImagerWindow(self) # make the main window - mostly to catch window close event... self.ui = Ui_Form() self.testMode = False # set to True to just display the scan signals self.win.show() self.win.setWindowTitle('Multiphoton Imager V 1.01') self.win.resize(1200, 900) # make the window big enough to use on a large monitor... self.w1 = QtGui.QSplitter() # divide l, r self.w1.setOrientation(QtCore.Qt.Horizontal) self.w2s = QtGui.QSplitter() self.w2s.setOrientation(QtCore.Qt.Vertical) self.win.setCentralWidget(self.w1) # w1 is the "main window" splitter self.w1.addWidget(self.w2s) # now we add w2s, the spliter on the left self.ui.setupUi(self.w2s) # put the ui on the top # create the user interface self.tree = PT.ParameterTree() self.w2s.addWidget(self.tree) # put the parameters on the bottom self.w2s.setSizes([1,1,900]) # Ui top widget has multiple splitters itself - force small space.. self.view = ImagerView() self.w1.addWidget(self.view) # add the view to the right of w1 self.originalROI = None self.currentStack = None self.currentStackLength = 0 self.roi = None # no current ROI self.regionCtrl = None self.currentRoi = None self.tileRoi = None self.tileRoiVisible = False self.tilexPos = 0. self.tileyPos = 0. self.tileWidth = 2e-4 self.tileHeight = 2e-4 self.img = None # overlay image in the camera Window... self.dwellTime = 0. # "pixel dwell time" computed from scan time and points. self.fieldSize = 63.0*120e-6 # field size for 63x, will be scaled for others # we assume that you are not going to change the current camera or scope while running # ... not just yet anyway. # if this is to be allowed on a system, the change must be signaled to this class, # and we need to pick up the device in a routine that handles the change. try: self.cameraModule = self.manager.getModule(config['cameraModule']) except: self.manager.loadDefinedModule(config['cameraModule']) pg.QtGui.QApplication.processEvents() self.cameraModule = self.manager.getModule(config['cameraModule']) #self.scopeDev = self.camdev.scopeDev self.laserDev = self.manager.getDevice(config['laser']) self.scannerDev = self.manager.getDevice(config['scanner']) #self.scannerDev.sigGlobalSubdeviceChanged.connect(self.objectiveUpdate) #self.scannerDev.sigGlobalTransformChanged.connect(self.transformUpdate) # find first scope device that is parent of scanner dev = self.scannerDev while dev is not None and not isinstance(dev, Microscope): dev = dev.parentDevice() self.scopeDev = dev if dev is not None: self.scopeDev.sigObjectiveChanged.connect(self.objectiveUpdate) self.scopeDev.sigGlobalTransformChanged.connect(self.transformChanged) self.detectorDev = self.manager.getDevice(config['detector'][0]) self.detectorChannel = config['detector'][1] self.attenuatorDev = self.manager.getDevice(config['attenuator'][0]) self.attenuatorChannel = config['attenuator'][1] self.objectiveROImap = {} # this is a dict that we will populate with the name # of the objective and the associated ROI object . # That way, each objective has a scan region appopriate for it's magnification. self.ui.hide_check.stateChanged.connect(self.hideOverlayImage) self.ui.alphaSlider.valueChanged.connect(self.imageAlphaAdjust) self.ui.snap_Button.clicked.connect(self.PMT_SnapClicked) self.ui.snap_Standard_Button.clicked.connect(self.PMT_Snap_std) self.ui.snap_High_Button.clicked.connect(self.PMT_Snap_high) self.ui.video_button.clicked.connect(self.toggleVideo) self.ui.video_std_button.clicked.connect(self.toggleVideo_std) self.ui.video_fast_button.clicked.connect(self.toggleVideo_fast) self.ui.record_button.toggled.connect(self.recordToggled) self.ui.run_button.clicked.connect(self.PMT_Run) self.ui.stop_button.clicked.connect(self.PMT_Stop) self.ui.set_TilesButton.clicked.connect(self.setTilesROI) #self.ui.cameraSnapBtn.clicked.connect(self.cameraSnap) self.ui.restoreROI.clicked.connect(self.restoreROI) self.ui.saveROI.clicked.connect(self.saveROI) self.ui.Align_to_Camera.clicked.connect(self.reAlign) self.param = PT.Parameter(name = 'param', children=[ dict(name="Preset", type='list', value='StandardDef', values=['StandardDef', 'HighDef', 'video-std', 'video-fast', 'video-ultra']), dict(name='Store', type='bool', value=True), dict(name='Blank Screen', type='bool', value=True), dict(name='Sample Rate', type='float', value=1.0e6, suffix='Hz', dec = True, minStep=100., step=0.5, limits=[10e3, 5e6], siPrefix=True), dict(name='Downsample', type='int', value=1, limits=[1,None]), dict(name='Frame Time', type='float', readonly=True, value=0.0), dict(name='Average', type='int', value=1, limits=[1,100]), dict(name='Pockels', type='float', value= 0.03, suffix='V', dec=True, minStep=1e-3, limits=[0, 1.5], step=0.1, siPrefix=True), dict(name='Wavelength', type='float', value= 700, suffix = 'nm', readonly = True), dict(name='Power', type='float', value = 0.00, suffix = 'W', readonly = True), dict(name='Objective', type='str', value='Unknown', readonly=True), dict(name='Follow Stage', type='bool', value=True), dict(name='Image Width', type='int', value=500, readonly=False), dict(name='Image Height', type='int', value=500, readonly=False), dict(name='xSpan', type='float', value = 1.0, limits=[0.01, 2.5]), #limits=[0., 20.e-3], step=10e-6, siPrefix=True, readonly=True), # True image width and height, in microns dict(name='ySpan', type = 'float', value = 1.0, limits=[0.01, 2.5]), # limits=[0., 20.e-3], step=10e-6, siPrefix=True, readonly=True), dict(name='Bidirectional', type='bool', value=True), dict(name='Decomb', type='bool', value=True, children=[ dict(name='Auto', type='bool', value=True), dict(name='Shift', type='float', value=100e-6, suffix='s', step=10e-6, siPrefix=True), ]), dict(name='Overscan', type='float', value=25.0, suffix='%'), dict(name='Scope Device', type='interface', interfaceTypes=['microscope']), dict(name='Scanner Device', type='interface', interfaceTypes=['scanner']), dict(name='Laser Device', type='interface', interfaceTypes=['laser']), dict(name='Camera Module', type='interface', interfaceTypes=['cameraModule']), dict(name="Tiles", type="bool", value=False, children=[ dict(name='Stage', type='interface', interfaceTypes='stage'), dict(name="X0", type="float", value=-100., suffix='um', dec=True, minStep=1, step=1, limits=[-2.5e3,2.5e3], siPrefix=True), dict(name="X1", type="float", value=100., suffix='um', dec=True, minStep=1, step=1, limits=[-2.5e3,2.5e3], siPrefix=True), dict(name="Y0", type="float", value=-100., suffix='um', dec=True, minStep=1, step=1, limits=[-2.5e3,2.5e3], siPrefix=True), dict(name="Y1", type="float", value=100., suffix='um', dec=True, minStep=1, step=1, limits=[-2.5e3,2.5e3], siPrefix=True), dict(name="StepSize", type="float", value=100, suffix='um', dec=True, minStep=1e-5, step=0.5, limits=[1e-5,1e3], siPrefix=True), ]), dict(name="Z-Stack", type="bool", value=False, children=[ dict(name='Stage', type='interface', interfaceTypes='stage'), dict(name="Step Size", type="float", value=5e-6, suffix='m', dec=True, minStep=1e-7, step=0.5, limits=[1e-9,1], siPrefix=True), dict(name="Steps", type='int', value=10, step=1, limits=[1,None]), dict(name="Depth", type="float", value=0, readonly=True, suffix='m', siPrefix=True) ]), dict(name="Timed", type="bool", value=False, children=[ dict(name="Interval", type="float", value=5.0, suffix='s', dec=True, minStep=0.1, step=0.5, limits=[0.1,30], siPrefix=True), dict(name="N Intervals", type='int', value=10, step=1, limits=[1,None]), dict(name="Duration", type="float", value=0, readonly=True, suffix='s', siPrefix = True), dict(name="Current Frame", type='int', value = 0, readonly=True), ]), dict(name='Show PMT V', type='bool', value=False), dict(name='Show Mirror V', type='bool', value=False), ]) self.stopFlag = False self.tree.setParameters(self.param) self.Manager = manager # insert an ROI into the camera image that corresponds to our scan area self.objectiveUpdate() # force update of objective information and create appropriate ROI # check the devices... self.update() # also force update now to make sure all parameters are synchronized self.param.sigTreeStateChanged.connect(self.update)
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.dataModel = None # left over from old analysis system.. self.editor = MosaicEditor(self) self.win = MosaicEditorWindow(self.editor, name) self.win.show()
def __init__(self, manager, name, config): Module.__init__(self, manager, name, config) self.win = ImagerWindow(self) # make the main window - mostly to catch window close event... self.win.show() self.win.setWindowTitle('Multiphoton Imager V 1.01') self.win.resize(500, 900) # make the window big enough to use on a large monitor... self.w1 = QtGui.QSplitter() # divide l, r self.w1.setOrientation(QtCore.Qt.Horizontal) self.win.setCentralWidget(self.w1) # w1 is the "main window" splitter self.dockarea = pg.dockarea.DockArea() self.w1.addWidget(self.dockarea) self.w2s = QtGui.QWidget() self.w2sl = QtGui.QVBoxLayout() self.w2s.setLayout(self.w2sl) self.w2sl.setContentsMargins(0, 0, 0, 0) self.w2sl.setSpacing(0) self.ctrlWidget = QtGui.QWidget() self.ui = Ui_Form() self.ui.setupUi(self.ctrlWidget) # put the ui on the top self.w2sl.addWidget(self.ctrlWidget) # create the parameter tree for controlling device behavior self.tree = PT.ParameterTree() self.w2sl.addWidget(self.tree) # takes care of displaying image data, # contrast & background subtraction user interfaces self.imagingCtrl = imaging.ImagingCtrl() self.frameDisplay = self.imagingCtrl.frameDisplay self.imageItem = self.frameDisplay.imageItem() # create docks for imaging, contrast, and background subtraction recDock = pg.dockarea.Dock(name="Acquisition Control", widget=self.imagingCtrl, size=(250, 10), autoOrientation=False) scanDock = pg.dockarea.Dock(name="Device Control", widget=self.w2s, size=(250, 800), autoOrientation=False) dispDock = pg.dockarea.Dock(name="Display Control", widget=self.frameDisplay.contrastWidget(), size=(250, 800), autoOrientation=False) bgDock = pg.dockarea.Dock(name="Background Subtraction", widget=self.frameDisplay.backgroundWidget(), size=(250, 10), autoOrientation=False) self.dockarea.addDock(recDock) self.dockarea.addDock(dispDock, 'right', recDock) self.dockarea.addDock(scanDock, 'bottom', recDock) self.dockarea.addDock(bgDock, 'bottom', dispDock) # TODO: resurrect this for situations when the camera module can't be used # self.view = ImagerView() # self.w1.addWidget(self.view) # add the view to the right of w1 self.blanker = ScreenBlanker() self.blanker.sigCancelClicked.connect(self.blankerCancelClicked) self.abort = False self.storedROI = None self.currentRoi = None self.ignoreRoiChange = False self.lastFrame = None self.fieldSize = 63.0*120e-6 # field size for 63x, will be scaled for others self.scanVoltageCache = None # cached scan protocol computed by generateScanProtocol self.objectiveROImap = {} # this is a dict that we will populate with the name # of the objective and the associated ROI object . # That way, each objective has a scan region appopriate for it's magnification. # we assume that you are not going to change the current camera or scope while running # ... not just yet anyway. # if this is to be allowed on a system, the change must be signaled to this class, # and we need to pick up the device in a routine that handles the change. try: self.cameraModule = self.manager.getModule(config['cameraModule']) except: self.manager.loadDefinedModule(config['cameraModule']) pg.QtGui.QApplication.processEvents() self.cameraModule = self.manager.getModule(config['cameraModule']) self.laserDev = self.manager.getDevice(config['laser']) self.scannerDev = self.manager.getDevice(config['scanner']) self.imagingThread = ImagingThread(self.laserDev, self.scannerDev) self.imagingThread.sigNewFrame.connect(self.newFrame) self.imagingThread.sigVideoStopped.connect(self.videoStopped) self.imagingThread.sigAborted.connect(self.imagingAborted) # connect user interface to camera module self.camModInterface = ImagerCamModInterface(self, self.cameraModule) self.cameraModule.window().addInterface(self.name, self.camModInterface) # find first scope device that is parent of scanner dev = self.scannerDev while dev is not None and not isinstance(dev, Microscope): dev = dev.parentDevice() self.scopeDev = dev if dev is not None: self.scopeDev.sigObjectiveChanged.connect(self.objectiveUpdate) self.scopeDev.sigGlobalTransformChanged.connect(self.transformChanged) # config may specify a single detector device (dev, channel) or a list of devices # to select from [(dev1, channel1), ...] self.detectors = config.get('detectors', [config.get('detector')]) self.attenuatorDev = self.manager.getDevice(config['attenuator'][0]) self.attenuatorChannel = config['attenuator'][1] self.laserMonitor = QtCore.QTimer() self.laserMonitor.timeout.connect(self.updateLaserInfo) self.laserMonitor.start(3000) self.frameDisplay.imageUpdated.connect(self.imageUpdated) self.imagingCtrl.sigAcquireFrameClicked.connect(self.acquireFrameClicked) self.imagingCtrl.sigStartVideoClicked.connect(self.startVideoClicked) self.imagingCtrl.sigStopVideoClicked.connect(self.stopVideoClicked) # Add custom imaging modes for mode in FrameModes: self.imagingCtrl.addFrameButton(mode) for mode in VideoModes: self.imagingCtrl.addVideoButton(mode) # Connect other UI controls # self.ui.run_button.clicked.connect(self.PMT_Run) # self.ui.stop_button.clicked.connect(self.PMT_Stop) # self.ui.set_TilesButton.clicked.connect(self.setTilesROI) #self.ui.cameraSnapBtn.clicked.connect(self.cameraSnap) self.ui.restoreROI.clicked.connect(self.restoreROI) self.ui.saveROI.clicked.connect(self.saveROI) self.ui.Align_to_Camera.clicked.connect(self.reAlign) self.scanProgram = ScanProgram() self.scanProgram.addComponent('rect') self.param = PT.Parameter(name = 'param', children=[ dict(name='Scan Control', type='group', children=[ dict(name='Pockels', type='float', value=0.03, suffix='V', step=0.005, limits=[0, 1.5], siPrefix=True), dict(name='Sample Rate', type='int', value=2.0e6, suffix='Hz', dec=True, minStep=100., step=0.5, limits=[10e3, 50e6], siPrefix=True), dict(name='Downsample', type='int', value=1, limits=[1,None]), dict(name='Average', type='int', value=1, limits=[1,100]), dict(name='Blank Screen', type='bool', value=True), dict(name='Image Width', type='int', value=500, readonly=False, limits=[1, None]), dict(name='Image Height', type='int', value=500, readonly=False, limits=[1, None]), dict(name='Bidirectional', type='bool', value=True), dict(name='Overscan', type='float', value=50e-6, suffix='s', siPrefix=True, limits=[0, None], step=10e-6), dict(name='Photodetector', type='list', values=self.detectors), dict(name='Follow Stage', type='bool', value=True), ]), dict(name='Scan Properties', type='group', children=[ dict(name='Frame Time', type='float', value=50e-3, suffix='s', siPrefix=True, readonly=True, dec=True, step=0.5, minStep=100e-6), dict(name='Pixel Size', type='float', value=1e-6, suffix='m', siPrefix=True, readonly=True), dict(name='Scan Speed', type='float', value=0.00, suffix='m/s', siPrefix=True, readonly=True), dict(name='Exposure per Frame', type='float', value=0.00, suffix='s/um^2', siPrefix=True, readonly=True), dict(name='Total Exposure', type='float', value=0.00, suffix='s/um^2', siPrefix=True, readonly=True), dict(name='Wavelength', type='float', value=700, suffix='nm', readonly=True), dict(name='Power', type='float', value=0.00, suffix='W', readonly=True), dict(name='Objective', type='str', value='Unknown', readonly=True), ]), dict(name='Image Control', type='group', children=[ dict(name='Decomb', type='float', value=20e-6, suffix='s', siPrefix=True, bounds=[0, 1e-3], step=2e-7, decimals=5, children=[ dict(name='Auto', type='action'), dict(name='Subpixel', type='bool', value=False), ]), dict(name='Camera Module', type='interface', interfaceTypes=['cameraModule']), ]), # dict(name='Scope Device', type='interface', interfaceTypes=['microscope']), # dict(name='Scanner Device', type='interface', interfaceTypes=['scanner']), # dict(name='Laser Device', type='interface', interfaceTypes=['laser']), # dict(name="Tiles", type="bool", value=False, children=[ # dict(name='Stage', type='interface', interfaceTypes='stage'), # dict(name="X0", type="float", value=-100., suffix='um', dec=True, minStep=1, step=1, limits=[-2.5e3,2.5e3], siPrefix=True), # dict(name="X1", type="float", value=100., suffix='um', dec=True, minStep=1, step=1, limits=[-2.5e3,2.5e3], siPrefix=True), # dict(name="Y0", type="float", value=-100., suffix='um', dec=True, minStep=1, step=1, limits=[-2.5e3,2.5e3], siPrefix=True), # dict(name="Y1", type="float", value=100., suffix='um', dec=True, minStep=1, step=1, limits=[-2.5e3,2.5e3], siPrefix=True), # dict(name="StepSize", type="float", value=100, suffix='um', dec=True, minStep=1e-5, step=0.5, limits=[1e-5,1e3], siPrefix=True), # ]), # dict(name="Z-Stack", type="bool", value=False, children=[ # dict(name='Stage', type='interface', interfaceTypes='stage'), # dict(name="Step Size", type="float", value=5e-6, suffix='m', dec=True, minStep=1e-7, step=0.5, limits=[1e-9,1], siPrefix=True), # dict(name="Steps", type='int', value=10, step=1, limits=[1,None]), # dict(name="Depth", type="float", value=0, readonly=True, suffix='m', siPrefix=True) # ]), # dict(name="Timed", type="bool", value=False, children=[ # dict(name="Interval", type="float", value=5.0, suffix='s', dec=True, minStep=0.1, step=0.5, limits=[0.1,30], siPrefix=True), # dict(name="N Intervals", type='int', value=10, step=1, limits=[1,None]), # dict(name="Duration", type="float", value=0, readonly=True, suffix='s', siPrefix = True), # dict(name="Current Frame", type='int', value = 0, readonly=True), # ]), # dict(name='Show PMT V', type='bool', value=False), # dict(name='Show Mirror V', type='bool', value=False), ]) self.tree.setParameters(self.param, showTop=False) # insert an ROI into the camera image that corresponds to our scan area self.objectiveUpdate() # force update of objective information and create appropriate ROI # check the devices... self.updateParams() # also force update now to make sure all parameters are synchronized self.param.child('Scan Control').sigTreeStateChanged.connect(self.updateParams) self.param.child('Image Control').sigTreeStateChanged.connect(self.updateDecomb) self.param.child('Image Control', 'Decomb', 'Auto').sigActivated.connect(self.autoDecomb) self.manager.sigAbortAll.connect(self.abortTask) self.updateImagingProtocol()