Exemplo n.º 1
0
 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()
Exemplo n.º 2
0
 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)
Exemplo n.º 5
0
 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)
Exemplo n.º 7
0
 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)
Exemplo n.º 8
0
    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)
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
    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)
Exemplo n.º 12
0
    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)
Exemplo n.º 13
0
 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)
Exemplo n.º 14
0
    def __init__(self, manager, name, config):
        Module.__init__(self, manager, name, config)

        self.win = MultiPatchWindow(self)
        self.win.show()
Exemplo n.º 15
0
    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()
Exemplo n.º 17
0
Arquivo: Imager.py Projeto: ablot/acq4
    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)
Exemplo n.º 18
0
 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()
Exemplo n.º 19
0
    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()