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)