Пример #1
0
    def __init__(self, host):
        AnalysisModule.__init__(self, host)
        if self.dataModel is None:
            raise Exception(
                "Photostim analysis module requires a data model, but none is loaded yet."
            )
        self.dbIdentity = "Photostim"  ## how we identify to the database; this determines which tables we own
        self.selectedSpot = None

        ## setup analysis flowchart
        modPath = os.path.abspath(os.path.split(__file__)[0])
        flowchartDir = os.path.join(modPath, "analysis_fc")
        self.flowchart = Flowchart(filePath=flowchartDir)
        self.flowchart.addInput('events')
        self.flowchart.addInput('regions')
        self.flowchart.addInput('fileHandle')
        self.flowchart.addOutput('dataOut')
        self.analysisCtrl = self.flowchart.widget()

        ## color mapper
        self.mapper = ColorMapper.ColorMapper(
            filePath=os.path.join(modPath, "colormaps"))
        self.mapCtrl = QtGui.QWidget()
        self.mapLayout = QtGui.QVBoxLayout()
        self.mapCtrl.setLayout(self.mapLayout)
        self.mapLayout.splitter = QtGui.QSplitter()
        self.mapLayout.splitter.setOrientation(QtCore.Qt.Vertical)
        self.mapLayout.splitter.setContentsMargins(0, 0, 0, 0)
        self.mapLayout.addWidget(self.mapLayout.splitter)
        self.mapLayout.splitter.addWidget(self.analysisCtrl)
        #self.mapLayout.splitter.addWidget(QtGui.QSplitter())
        self.mapLayout.splitter.addWidget(self.mapper)
        #self.mapLayout.splitter.addWidget(self.recolorBtn)

        self.recolorLayout = QtGui.QHBoxLayout()
        self.recolorWidget = QtGui.QWidget()
        self.mapLayout.splitter.addWidget(self.recolorWidget)
        self.recolorWidget.setLayout(self.recolorLayout)
        self.recolorBtn = QtGui.QPushButton('Recolor')
        self.recolorLayout.addWidget(self.recolorBtn)
        self.recolorParallelCheck = QtGui.QCheckBox('Parallel')
        self.recolorParallelCheck.setChecked(True)
        self.recolorLayout.addWidget(self.recolorParallelCheck)

        ## scatter plot
        self.scatterPlot = ScatterPlotter()
        self.scatterPlot.sigClicked.connect(self.scatterPlotClicked)

        ## setup map DB ctrl
        self.dbCtrl = DBCtrl(self, self.dbIdentity)

        ## storage for map data
        #self.scanItems = {}
        self.scans = []
        #self.seriesScans = {}
        self.maps = []

        ## create event detector
        fcDir = os.path.join(os.path.abspath(os.path.split(__file__)[0]),
                             "detector_fc")
        self.detector = EventDetector.EventDetector(
            host, flowchartDir=fcDir, dbIdentity=self.dbIdentity + '.events')

        ## override some of its elements
        self.detector.setElement('File Loader', self)
        self.detector.setElement('Database', self.dbCtrl)

        ## Create element list, importing some gui elements from event detector
        elems = self.detector.listElements()
        self._elements_ = OrderedDict([
            ('Database', {
                'type': 'ctrl',
                'object': self.dbCtrl,
                'size': (300, 600)
            }),
            ('Scatter Plot', {
                'type': 'ctrl',
                'object': self.scatterPlot,
                'pos': ('right', ),
                'size': (700, 400)
            }),
            ('Canvas', {
                'type': 'canvas',
                'pos': ('above', 'Scatter Plot'),
                'size': (700, 400),
                'allowTransforms': False,
                'hideCtrl': True,
                'args': {
                    'name': 'Photostim'
                }
            }),
            #('Maps', {'type': 'ctrl', 'pos': ('bottom', 'Database'), 'size': (200,200), 'object': self.mapDBCtrl}),
            ('Map Opts', {
                'type': 'ctrl',
                'object': self.mapCtrl,
                'pos': ('above', 'Database'),
                'size': (300, 600)
            }),
            ('Detection Opts',
             elems['Detection Opts'].setParams(pos=('above', 'Map Opts'),
                                               size=(300, 600))),
            ('File Loader', {
                'type': 'fileInput',
                'size': (300, 300),
                'pos': ('above', 'Detection Opts'),
                'host': self,
                'showFileTree': False
            }),
            ('Data Plot', elems['Data Plot'].setParams(pos=('bottom',
                                                            'Canvas'),
                                                       size=(700, 200))),
            ('Filter Plot', elems['Filter Plot'].setParams(pos=('bottom',
                                                                'Data Plot'),
                                                           size=(700, 200))),
            ('Event Table',
             elems['Output Table'].setParams(pos=('below', 'Filter Plot'),
                                             size=(700, 200))),
            ('Stats', {
                'type': 'dataTree',
                'size': (700, 200),
                'pos': ('below', 'Event Table')
            }),
        ])

        self.initializeElements()

        try:
            ## load default chart
            self.flowchart.loadFile(os.path.join(flowchartDir, 'default.fc'))
        except:
            debug.printExc('Error loading default flowchart:')

        self.detector.flowchart.sigOutputChanged.connect(
            self.detectorOutputChanged)
        self.flowchart.sigOutputChanged.connect(self.analyzerOutputChanged)
        self.detector.flowchart.sigStateChanged.connect(
            self.detectorStateChanged)
        self.flowchart.sigStateChanged.connect(self.analyzerStateChanged)
        self.recolorBtn.clicked.connect(self.recolor)