Ejemplo n.º 1
0
    def __init__(self, daq, logger, opts, win_parent=None):

        QtGui.QMainWindow.__init__(self, win_parent)
        self.daq = daq
        self.logger = logger
        self.settings = MuonicSettings(self.logger)
        self.constants = MuonicConstants()
        self.opts = opts

        # we have to ensure that the DAQcard does not sent
        # any automatic status reports every x seconds
        self.daq.put('ST 0')

        self.setWindowTitle(QtCore.QString("muonic"))
        self.statusbar = QtGui.QMainWindow.statusBar(self)
        self.muonic_menus = MuonicMenus(parent=self)

        # we chose a global format for naming the files -> decided on 18/01/2012
        # we use GMT times
        # " Zur einheitlichen Datenbezeichnung schlage ich folgendes Format vor:
        # JJJJ-MM-TT_y_x_vn.dateiformat (JJJJ-Jahr; MM-Monat; TT-Speichertag bzw.
        # Beendigung der Messung; y: G oder L ausw?hlen, G steht f?r **We add R for rate P for pulses and RW for RAW **
        # Geschwindigkeitsmessung/L f?r Lebensdauermessung; x-Messzeit in Stunden;
        # v-erster Buchstabe Vorname; n-erster Buchstabe Familienname)."

        self.now = datetime.datetime.now()

        self.pulsefilename = os.path.join(
            self.settings.muonic_setting('data_path'),
            self.settings.muonic_setting('muonic_filenames') %
            (self.now.strftime('%Y-%m-%d_%H-%M-%S'), "P", opts.user[0],
             opts.user[1]))
        self.writepulses = False
        self.statusline = self.settings.muonic_setting('status_line')
        self.channel_counts = [0, 0, 0, 0, 0]  #[trigger,ch0,ch1,ch2,ch3]
        self.daq.put('TL')
        time.sleep(0.5)  #give the daq some time to ract
        self.threshold_ch = []

        self.channelcheckbox = []
        self.vetocheckbox = []
        self.coincidencecheckbox = []
        for i in range(4):
            self.channelcheckbox.append(True)
            self.vetocheckbox.append(False)
            self.coincidencecheckbox.append(False)
            self.threshold_ch.append(300)

        self.coincidencecheckbox[0] = True
        self.daq_msg = MuonicDAQMSG()
        while self.daq.data_available():
            try:
                self.daq_msg.append(self.daq.get(0))
                self.get_thresholds_from_queue()

            except DAQIOError:
                self.logger.debug("Queue empty!")

        self.coincidence_time = 0.

        self.daq.put('DC')
        time.sleep(0.5)  #give the daq some time to ract
        while self.daq.data_available():
            try:
                self.daq_msg.append(self.daq.get(0))
                self.get_channels_from_queue()

            except DAQIOError:
                self.logger.debug("Queue empty!")

        self.pulseextractor = pa.PulseExtractor(pulsefile=self.writepulses)
        self.pulses = None

        # prepare fields for scalars
        self.scalars_ch0_previous = 0
        self.scalars_ch1_previous = 0
        self.scalars_ch2_previous = 0
        self.scalars_ch3_previous = 0
        self.scalars_trigger_previous = 0
        self.scalars_time = 0
        self.scalars_diff_ch0 = 0
        self.scalars_diff_ch1 = 0
        self.scalars_diff_ch2 = 0
        self.scalars_diff_ch3 = 0
        self.scalars_diff_trigger = 0
        # define the begin of the timeintervall
        # for the rate calculation
        now = time.time()
        self.thisscalarquery = now
        self.lastscalarquery = now
        self.query_daq_for_scalars()
        while self.daq.data_available():
            try:
                self.daq_msg.append(self.daq.get(0))
                self.get_scalars_from_queue()
            except DAQIOError:
                self.logger.debug("Queue empty!")

        # A timer to periodically call processIncoming and check what is in the queue
        self.timer = QtCore.QTimer()
        QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"),
                               self.processIncoming)

        self.tabwidget = QtGui.QTabWidget(self)
        #pal = QtGui.QPalette()
        #pal.setColor(QtGui.QPalette.Window, QtGui.QColor(0,222,0))
        #self.tabwidget.setPalette(pal)
        self.tabwidget.mainwindow = self.parentWidget()

        self.timewindow = 5.0
        self.logger.info("Timewindow is %4.2f" % self.timewindow)

        self.tabwidget.addTab(RateWidget(logger, parent=self), "Muon Rates")
        self.tabwidget.ratewidget = self.tabwidget.widget(0)

        self.tabwidget.addTab(PulseanalyzerWidget(logger, parent=self),
                              "Pulse Analyzer")
        self.tabwidget.pulseanalyzerwidget = self.tabwidget.widget(1)

        self.tabwidget.addTab(DecayWidget(logger, parent=self), "Muon Decay")
        self.tabwidget.decaywidget = self.tabwidget.widget(2)

        self.tabwidget.addTab(VelocityWidget(logger, parent=self),
                              "Muon Velocity")
        self.tabwidget.velocitywidget = self.tabwidget.widget(3)

        self.tabwidget.addTab(StatusWidget(logger, parent=self), "Status")
        self.tabwidget.statuswidget = self.tabwidget.widget(4)

        self.tabwidget.addTab(DAQWidget(logger, parent=self), "DAQ Output")
        self.tabwidget.daqwidget = self.tabwidget.widget(5)

        self.tabwidget.addTab(GPSWidget(logger, parent=self), "GPS Output")
        self.tabwidget.gpswidget = self.tabwidget.widget(6)

        # widgets which shuld be dynmacally updated by the timer should be in this list
        self.tabwidget.update_widgets = [
            self.tabwidget.decaywidget, self.tabwidget.pulseanalyzerwidget,
            self.tabwidget.velocitywidget, self.tabwidget.ratewidget,
            self.tabwidget.statuswidget
        ]
        # widgets which should be calculated in processIncoming. The widget is only calculated when it is set to active (True) via widget.is_active()
        self.tabwidget.calculate_widgets = [
            self.tabwidget.ratewidget, self.tabwidget.pulseanalyzerwidget,
            self.tabwidget.velocitywidget, self.tabwidget.decaywidget
        ]
        self.widgetupdater = QtCore.QTimer()
        QtCore.QObject.connect(self.widgetupdater, QtCore.SIGNAL("timeout()"),
                               self.widgetUpdate)

        self.setCentralWidget(self.tabwidget)
        # provide buttons to exit the application
        exit = QtGui.QAction(
            QtGui.QIcon('/usr/share/icons/gnome/24x24/actions/exit.png'),
            'Exit', self)
        exit.setShortcut('Ctrl+Q')
        exit.setStatusTip('Exit application')

        self.connect(exit, QtCore.SIGNAL('triggered()'),
                     QtCore.SLOT('close()'))

        # prepare the config menu
        config = QtGui.QAction(QtGui.QIcon(''), 'Channel Configuration', self)
        config.setStatusTip('Configure the Coincidences and channels')
        self.connect(config, QtCore.SIGNAL('triggered()'),
                     self.muonic_menus.config_menu)

        # prepare the advanced config menu
        advanced = QtGui.QAction(QtGui.QIcon(''), 'Advanced Configurations',
                                 self)
        advanced.setStatusTip('Advanced configurations')
        self.connect(advanced, QtCore.SIGNAL('triggered()'),
                     self.muonic_menus.advanced_menu)

        # prepare the threshold menu
        thresholds = QtGui.QAction(QtGui.QIcon(''), 'Thresholds', self)
        thresholds.setStatusTip('Set trigger thresholds')
        self.connect(thresholds, QtCore.SIGNAL('triggered()'),
                     self.muonic_menus.threshold_menu)

        # helpmenu
        helpdaqcommands = QtGui.QAction(QtGui.QIcon('icons/blah.png'),
                                        'DAQ Commands', self)
        self.connect(helpdaqcommands, QtCore.SIGNAL('triggered()'),
                     self.muonic_menus.help_menu)

        # sphinx-documentation
        sphinxdocs = QtGui.QAction(QtGui.QIcon('icons/blah.png'),
                                   'Technical documentation', self)
        self.connect(sphinxdocs, QtCore.SIGNAL('triggered()'),
                     self.muonic_menus.sphinxdoc_menu)

        # manual
        manualdocs = QtGui.QAction(QtGui.QIcon('icons/blah.png'), 'Manual',
                                   self)
        self.connect(manualdocs, QtCore.SIGNAL('triggered()'),
                     self.muonic_menus.manualdoc_menu)

        # about
        aboutmuonic = QtGui.QAction(QtGui.QIcon('icons/blah.png'),
                                    'About muonic', self)
        self.connect(aboutmuonic, QtCore.SIGNAL('triggered()'),
                     self.muonic_menus.about_menu)

        # create the menubar and fill it with the submenus
        menubar = self.menuBar()
        filemenu = menubar.addMenu(tr('MainWindow', '&File'))
        filemenu.addAction(exit)
        settings = menubar.addMenu(tr('MainWindow', '&Settings'))
        settings.addAction(config)
        settings.addAction(thresholds)
        settings.addAction(advanced)

        helpmenu = menubar.addMenu(tr('MainWindow', '&Help'))
        helpmenu.addAction(helpdaqcommands)
        helpmenu.addAction(sphinxdocs)
        helpmenu.addAction(manualdocs)
        helpmenu.addAction(aboutmuonic)

        self.processIncoming()
        self.timer.start(1000)
        self.widgetupdater.start(self.timewindow * 1000)