Example #1
0
 def __openFile(self, filename):
     self.filename = filename
     self.util.filename = self.filename
     self.closeFile()
     self.reader = TBFileReader(filename)
     self.nevents = self.reader.entries()
     self.statusBar.SetText('events: %d' % self.nevents, 0)
     self.statusBar.SetText(
         self.filename[self.filename.rfind('/') + 1:][-32:], 2)
     self.eventNumber = -1
     self.util.eventNumber = -1
     self.nextEvent()
     self.progressBar.SetRange(0, self.nevents)
     self.progressBar.SetPosition(self.eventNumber)
     #        self.wcplanes.CacheWCMeans("meanfile.txt", filename)
     self.util.tableX = self.reader.tableX
     self.util.tableY = self.reader.tableY
     self.statusBar.SetText(
         'table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY),
         1)
     self.filetime = time.ctime(os.path.getctime(filename))
Example #2
0
 def refreshFile(self):
     try:
         t = self.filetime
     except:
         print 'file is up to date'
         return
     if self.filetime == time.ctime(os.path.getctime(self.filename)):
         print "file up to date"
         return
     else:
         print "refreshing"
         eventNumber = self.eventNumber
         #self.closeFile()
         self.reader = TBFileReader(self.filename)
         self.nevents = self.reader.entries()
         self.statusBar.SetText(
             'event: %d / %d' % (eventNumber, self.nevents - 1), 0)
         self.filetime = time.ctime(os.path.getctime(self.filename))
         self.wcplanes.CacheWCMeans("meanfile.txt", self.filename)
         self.eventNumber = eventNumber
         self.util.eventNumber = eventNumber
         self.util.needsAboost = True
Example #3
0
 def __openFile(self, filename):
     self.filename = filename
     self.util.filename = self.filename
     self.closeFile()		
     self.reader = TBFileReader(filename)
     self.nevents= self.reader.entries()
     self.statusBar.SetText('events: %d' % self.nevents, 0)
     self.statusBar.SetText(self.filename[self.filename.rfind('/')+1:][-32:], 2)
     self.eventNumber = -1
     self.util.eventNumber = -1
     self.nextEvent()
     self.progressBar.SetRange(0, self.nevents)
     self.progressBar.SetPosition(self.eventNumber)
     self.wcplanes.CacheWCMeans("meanfile.txt", filename)
     self.util.tableX = self.reader.tableX
     self.util.tableY = self.reader.tableY
     self.statusBar.SetText('table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY), 1)
     self.filetime = time.ctime(os.path.getctime(filename))
Example #4
0
 def refreshFile(self):
     try:
         t = self.filetime
     except:
         return
     if self.filetime == time.ctime(os.path.getctime(self.filename)):
         print "file up to date"
         return                 
     else:      
         print "refreshing"
         eventNumber = self.eventNumber
         self.closeFile()	            
         self.reader = TBFileReader(self.filename)
         self.nevents= self.reader.entries()
         self.statusBar.SetText('event: %d / %d' % (self.eventNumber, self.nevents-1), 0)
         self.filetime = time.ctime(os.path.getctime(self.filename))
         self.wcplanes.CacheWCMeans("meanfile.txt", self.filename)
         print "in refresh fashion:"
         self.eventNumber = eventNumber
         self.util.eventNumber = eventNumber
Example #5
0
 def __openFile(self, filename):
     self.filename = filename
     self.util.filename = self.filename
     self.closeFile()		
     self.reader = TBFileReader(filename, self.util)
     self.nevents= self.reader.entries()
     self.statusBar.SetText('events: %d' % self.nevents, 0)
     self.statusBar.SetText(self.filename[self.filename.rfind('/')+1:][-32:], 2)
     self.eventNumber = -1
     self.util.eventNumber = -1
     self.nextEvent()
     self.progressBar.SetRange(0, self.nevents)
     self.progressBar.SetPosition(self.eventNumber)
     self.wcplanes.CacheWCMeans("meanfile.txt", filename)
     self.util.tableX = self.reader.tableX
     self.util.tableY = self.reader.tableY
     self.statusBar.SetText('table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY), 1)
     self.filetime = time.ctime(os.path.getctime(filename))
     for  e in range(len(self.wfelements)):
         self.wfelements[e].SetText("Board "+str(self.util.boardNumbers[e]))
         print "trying to rename button to ", "Board "+str(self.util.boardNumbers[e])
Example #6
0
class TBEventDisplay:
    """
    gui = TBEventDisplay(title)
    """
    def __init__(self, title, filename=None, width=WIDTH, height=HEIGHT):

        # Initial directory for open file dialog
        self.openDir = os.environ['PWD']
        self.filename = filename

        #-------------------------------------------------------------------
        # Create main frame
        #-------------------------------------------------------------------
        # Establish a connection between the main frame's "CloseWindow()"
        # signal and the GUI's "close" slot, modeled as a method.
        # When the main frame issues the signal CloseWindow() this
        # triggers a call to the close method of this class.
        #-------------------------------------------------------------------
        self.root = gClient.GetRoot()
        self.main = TGMainFrame(self.root, width, height)
        self.main.SetWindowName(title)
        self.main.SetCleanup(kDeepCleanup)
        self.connection = Connection(self.main, "CloseWindow()", self, "close")

        self.util = Util()
        #-------------------------------------------------------------------
        # Create menu bar
        #-------------------------------------------------------------------
        self.menuBar = MenuBar(self, self.main)

        self.menuBar.Add('File',
                         [('&Open', 'openFile'), ('&Close', 'closeFile'), 0,
                          ('E&xit', 'exit')])

        self.menuBar.Add('Edit', [('&Undo', 'undo')])

        self.menuBar.Add('Event', [('&Next', 'nextEvent'),
                                   ('&Previous', 'previousEvent'),
                                   ('&Goto', 'gotoEvent'), 0,
                                   ('Set ADC cut', 'setADCcut'),
                                   ('Set delay', 'setDelay')])

        self.menuBar.Add('Help', [('About', 'about'), ('Usage', 'usage')])

        #-------------------------------------------------------------------
        # Add vertical frame to the main frame to contain toolbar, notebook
        # and status window
        #-------------------------------------------------------------------
        self.vframe = TGVerticalFrame(self.main, 1, 1)
        self.main.AddFrame(self.vframe, TOP_X_Y)

        #-------------------------------------------------------------------
        # Add horizontal frame to contain toolbar
        #-------------------------------------------------------------------
        self.toolBar = TGHorizontalFrame(self.vframe)
        self.vframe.AddFrame(self.toolBar, TOP_X)

        # Add picture buttons
        #self.refreshButton = PictureButton(self, self.toolBar,
        #                picture='Button-Refresh.png',
        #                method='refreshFile',
        #                text='refresh file for new events')

        self.enchiladaButton = PictureButton(
            self,
            self.toolBar,
            picture='Enchilada.jpg',
            method='wholeEnchilada',
            text='process the whole enchilada')

        self.nextButton = PictureButton(self,
                                        self.toolBar,
                                        picture='GoForward.gif',
                                        method='nextEvent',
                                        text='go to next event')

        self.forwardButton = PictureButton(self,
                                           self.toolBar,
                                           picture='Forward.png',
                                           method='forwardPlayer',
                                           text='foward event player')

        self.stopButton = PictureButton(self,
                                        self.toolBar,
                                        picture='Stop.png',
                                        method='stopPlayer',
                                        text='stop event player')

        self.rewindButton = PictureButton(self,
                                          self.toolBar,
                                          picture='Rewind.png',
                                          method='rewindPlayer',
                                          text='rewind event player')

        self.previousButton = PictureButton(self,
                                            self.toolBar,
                                            picture='GoBack.gif',
                                            method='previousEvent',
                                            text='go to previous event')

        self.snapCanvasButton = PictureButton(self,
                                              self.toolBar,
                                              picture='Camera.png',
                                              method='snapCanvas',
                                              text='pdf this canvas')

        self.cycleButton = PictureButton(self,
                                         self.toolBar,
                                         picture='Bicycle.jpg',
                                         method='cycleTabs',
                                         text='cycle (auto-pilot)')

        self.accumulateButton = CheckButton(self,
                                            self.toolBar,
                                            hotstring='Accumulate',
                                            method='toggleAccumulate',
                                            text='Accumulate')

        #-------------------------------------------------------------------
        # Add a notebook with multiple pages
        #-------------------------------------------------------------------

        #general util struct members:
        self.util.accumulate = False
        self.util.stealthmode = False
        self.util.filename = self.filename
        #WC trace bools:
        self.util.showBoard16 = True
        self.util.showBoard103 = True
        self.util.showBoard112 = True
        self.util.showBoard115 = True
        #WC bools:
        self.util.WC_showIThits = True
        self.util.WC_showQhits = True
        #track struct members:
        self.util.x1hit = 10
        self.util.x2hit = 1
        self.util.y1hit = 10
        self.util.y2hit = 4
        #3D bools
        self.util._3D_showWC1 = True
        self.util._3D_showWC2 = True
        self.util._3D_isolateClusters = False
        self.util.needsAboost = False

        WFbuttons = [
            ('Board 16', 'toggleShowBoard16', 'toggleShowBoard16', True),
            ('Board 103', 'toggleShowBoard103', 'toggleShowBoard103', True),
            ('Board 112', 'toggleShowBoard112', 'toggleShowBoard112', True),
            ('Board 115', 'toggleShowBoard115', 'toggleShowBoard115', True)
        ]
        WCbuttons = [
            ('In-time hits', 'toggleShowIThits', 'toggleShowIThits', True),
            ('Quality hits', 'toggleShowQhits', 'toggleShowQhits', True)
        ]
        ThreeDbuttons = [('show WC1', 'toggleShowWC1', 'toggleShowWC1', True),
                         ('show WC2', 'toggleShowWC2', 'toggleShowWC2', True),
                         ('isolate cluster', 'toggleIsolateClusters',
                          'toggleIsolateCluster', False)]

        self.reraw = True
        self.shutterOpen = False
        self.pageName = 'default'

        self.noteBook = NoteBook(self, self.vframe, 'setPage', width, height)
        # Add pages
        self.display = {}
        for pageName, constructor, buttons in [
            ('WF traces', 'TracePlot(canvas)', WFbuttons),
            ('ADC heatmap', 'ShashlikHeatmap(canvas)', None),
            ('ADC fibers', 'FiberADC(canvas)', None),
            ('WF Noise', 'PedestalNoise(canvas)', None),
                #                          ('Wire chambers', 'WCPlanes(canvas)', WCbuttons),
            ('Wire chambers', 'TDCtiming(canvas)', None),
            ('TDC timing', 'TDCtiming(canvas)', None),
            ('3D display', 'Display3D(page)', ThreeDbuttons)
        ]:
            self.noteBook.Add(pageName, buttons)
            self.noteBook.SetPage(pageName)
            page = self.noteBook.page
            canvas = page.canvas
            print '==> building display: %s' % pageName
            self.display[pageName] = eval(constructor)

        #-------------------------------------------------------------------
        # Create a status bar, divided into two parts
        #-------------------------------------------------------------------
        self.statusBar = TGStatusBar(self.vframe, 1, 1, kDoubleBorder)
        self.statusBar.SetHeight(22)
        status_parts = array('i')
        status_parts.append(18)
        status_parts.append(18)
        status_parts.append(24)
        status_parts.append(20)
        status_parts.append(20)
        self.statusBar.SetParts(status_parts, len(status_parts))
        self.progressBar = ProgressBar(self, self.statusBar)
        self.vframe.AddFrame(self.statusBar, TOP_X)

        # Initial state
        #        self.wcplanes = self.display['Wire chambers']
        self.ADCcut = 50
        self.nevents = 0
        self.eventNumber = -1
        self.DELAY = int(1000 * MINDELAY)
        self.mutex = TMutex(kFALSE)
        self.timer = TTimer()
        self.timerConnection = Connection(self.timer, 'Timeout()', self,
                                          'managePlayer')

        self.DEBUG = DEBUG
        self.DEBUG_COUNT = 0

        # Initialize layout
        self.main.MapSubwindows()
        self.main.Resize()
        self.main.MapWindow()

        #DEBUG
        # to debug a display uncomment next line
        #filename = "data/test.root"

        if filename != None: self.__openFile(filename)
        else: self.__openFile('latest.root')

        #DEBUG
        # to debug a display uncomment next two lines
        self.noteBook.SetPage('ADC heatmap')
        self.displayEvent()

    def __del__(self):
        pass

    def debug(self, message):
        if self.DEBUG < 1: return
        self.DEBUG_COUNT += 1
        print "%10d> %s" % (self.DEBUG_COUNT, message)

    #-----------------------------------------------------------------------
    #	M E T H O D S
    #-----------------------------------------------------------------------

    #	S L O T S    (that is, callbacks)

    def openFile(self):
        dialog = Dialog(gClient.GetRoot(), self.main)
        self.filename = dialog.SelectFile(kFDOpen, self.openDir)
        self.util.filename = self.filename
        self.openDir = dialog.IniDir()
        if self.filename[-5:] != '.root':
            dialog.ShowText("Oops!", "Please select a root file", 230, 30)
            return
        self.__openFile(self.filename)

    def __openFile(self, filename):
        self.filename = filename
        self.util.filename = self.filename
        self.closeFile()
        self.reader = TBFileReader(filename)
        self.nevents = self.reader.entries()
        self.statusBar.SetText('events: %d' % self.nevents, 0)
        self.statusBar.SetText(
            self.filename[self.filename.rfind('/') + 1:][-32:], 2)
        self.eventNumber = -1
        self.util.eventNumber = -1
        self.nextEvent()
        self.progressBar.SetRange(0, self.nevents)
        self.progressBar.SetPosition(self.eventNumber)
        #        self.wcplanes.CacheWCMeans("meanfile.txt", filename)
        self.util.tableX = self.reader.tableX
        self.util.tableY = self.reader.tableY
        self.statusBar.SetText(
            'table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY),
            1)
        self.filetime = time.ctime(os.path.getctime(filename))

    def refreshFile(self):
        try:
            t = self.filetime
        except:
            print 'file is up to date'
            return
        if self.filetime == time.ctime(os.path.getctime(self.filename)):
            print "file up to date"
            return
        else:
            print "refreshing"
            eventNumber = self.eventNumber
            #self.closeFile()
            self.reader = TBFileReader(self.filename)
            self.nevents = self.reader.entries()
            self.statusBar.SetText(
                'event: %d / %d' % (eventNumber, self.nevents - 1), 0)
            self.filetime = time.ctime(os.path.getctime(self.filename))
            self.wcplanes.CacheWCMeans("meanfile.txt", self.filename)
            self.eventNumber = eventNumber
            self.util.eventNumber = eventNumber
            self.util.needsAboost = True

    def closeFile(self):
        try:
            if self.reader.file().IsOpen():
                #gSystem.Exit()
                self.reader.file().Close()
                del self.reader
        except:
            pass

    def setPage(self, id):
        if id == 0:
            self.pageName = 'Traces'
        if id == 1:
            self.pageName = 'Heatmap'
        if id == 2:
            self.pageName = 'Fibers'
        if id == 3:
            self.pageName = 'Noise'
        if id == 4:
            self.pageName = 'WC'
        if id == 5:
            self.pageName = 'TDC'
        if id == 6:
            self.pageName = '3D_'
        self.noteBook.SetPage(id)
        if self.eventNumber >= 0:
            self.displayEvent()

    def nextEvent(self):
        self.debug("begin:nextEvent")
        if self.eventNumber > self.nevents - 2:
            self.eventNumber = 0
        self.readEvent(R_FORWARD)
        self.displayEvent()
        self.debug("end:nextEvent")

    def previousEvent(self):
        self.debug('begin:previousEvent')
        if self.eventNumber < 1:
            self.eventNumber = self.nevents
        self.readEvent(R_REWIND)
        self.displayEvent()
        self.debug('end:previousEvent')

    def gotoEvent(self):
        self.debug('begin:gotoEvent')
        from string import atoi
        dialog = Dialog(gClient.GetRoot(), self.main)
        self.eventNumber = atoi(dialog.GetInput('Goto event %d - %d' % \
                            (0, self.nevents-1),
                            '0'))
        self.eventNumber = max(self.eventNumber, 0)
        self.eventNumber = min(self.eventNumber, self.nevents - 1)

        # do a one-shot read
        self.readEvent(R_ONESHOT)
        self.displayEvent()
        self.debug('end:gotoEvent')

    def forwardPlayer(self):
        self.debug('begin:forwardPlayer')
        self.mutex.Lock()
        self.forward = True
        self.timer.Start(self.DELAY, kFALSE)
        self.mutex.UnLock()
        self.debug('end:forwardPlayer')

    def cycleTabs(self):
        self.debug('begin:cycleTabs')
        self.mutex.Lock()
        if self.noteBook.pageNumber == 6:  #len(self.noteBook.pages)-1:
            self.noteBook.pageNumber = 0
        self.timer.Start(self.DELAY * 5, kFALSE)
        self.noteBook.pageNumber += 1
        self.noteBook.SetPage(self.noteBook.pageNumber)
        self.displayEvent()
        self.forward = True
        self.cycle = True
        self.mutex.UnLock()
        self.debug('end:cycleTabs')

    def rewindPlayer(self):
        self.debug('begin:rewindPlayer')
        self.mutex.Lock()
        self.forward = False
        self.timer.Start(self.DELAY, kFALSE)
        self.mutex.UnLock()
        self.debug('end:rewindPlayer')

    def stopPlayer(self):
        self.debug('begin:stopPlayer')
        self.mutex.Lock()
        self.timer.Stop()
        self.cycle = False
        self.mutex.UnLock()
        self.debug('end:stopPlayer - STOP REQUESTED')

    def managePlayer(self):
        if self.cycle:
            self.cycleTabs()
        if self.forward:
            self.nextEvent()
        else:
            self.previousEvent()

    def toggleAccumulate(self):
        self.debug("toggle:accumulate")
        self.util.accumulate = not self.util.accumulate

    def wholeEnchilada(self):
        self.debug("begin:wholeEnchilada")
        self.util.accumulate = True
        self.util.accumulateButton.SetState(True)
        self.util.stealthmode = True
        self.eventNumber = 0
        while self.eventNumber < self.nevents - 2:
            self.readEvent(R_FORWARD)
            self.displayEvent()
            self.statusBar.Draw()
        self.util.stealthmode = False
        self.readEvent(R_FORWARD)
        self.displayEvent()
        self.eventNumber = 0
        self.debug("end:wholeEnchilada")

    def snapCanvas(self):
        self.debug("begin:snapCanvas")
        self.shutterOpen = True
        self.displayEvent()
        self.shutterOpen = False
        self.debug("end:snapCanvas")

    def toggleShowBoard112(self):
        self.debug("begin:toggleShowBoard112")
        self.util.showBoard112 = not self.util.showBoard112
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowBoard112")

    def toggleShowBoard115(self):
        self.debug("begin:toggleShowBoard115")
        self.util.showBoard115 = not self.util.showBoard115
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowBoard115")

    def toggleShowBoard16(self):
        self.debug("begin:toggleShowBoard16")
        self.util.showBoard16 = not self.util.showBoard16
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowBoard16")

    def toggleShowBoard103(self):
        self.debug("begin:toggleShowBoard103")
        self.util.showBoard103 = not self.util.showBoard103
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowBoard103")

    def toggleShowIThits(self):
        self.debug("begin:ShowIThits")
        self.util.WC_showIThits = not self.util.WC_showIThits
        self.redraw = True
        self.displayEvent()
        self.debug("end:ShowIThits")

    def toggleShowQhits(self):
        self.debug("begin:ShowQhits")
        self.util.WC_showQhits = not self.util.WC_showQhits
        self.redraw = True
        self.displayEvent()
        self.debug("end:ShowQhits")

    def toggleShowWC2(self):
        self.debug("begin:toggleShowWC2")
        self.util._3D_showWC2 = not self.util._3D_showWC2
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowWC2")

    def toggleShowWC1(self):
        self.debug("begin:toggleShowWC2")
        self.util._3D_showWC1 = not self.util._3D_showWC1
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowWC1")

    def toggleIsolateClusters(self):
        self.debug("begin:toggleIsolateClusters")
        self.util._3D_isolateClusters = not self.util._3D_isolateClusters
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleIsolateClusters")

    def setDelay(self):
        from string import atof
        dialog = Dialog(gClient.GetRoot(), self.main)
        seconds = atof(dialog.GetInput('Enter delay in seconds', '2.0'))
        self.playerDelay = max(MINDELAY, int(1000 * seconds))
        self.statusBar.SetText('delay set to: %8.1f s' % seconds, 1)

    def setADCcut(self):
        from string import atoi
        dialog = Dialog(gClient.GetRoot(), self.main)
        self.ADCcut = atoi(dialog.GetInput('Enter ADC cut', '50'))
        self.statusBar.SetText(
            'table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY),
            1)

    def close(self):
        gSystem.Abort()
        gApplication.Terminate(0)
        #gApplication.Close()

    def usage(self):
        dialog = Dialog(gClient.GetRoot(), self.main)
        dialog.SetText('Not done', 'Sorry!', 230, 30)
        #dialog.SetText('Help', HELP)

    def about(self):
        dialog = Dialog(gClient.GetRoot(), self.main)
        dialog.SetText('Not done', 'Sorry!', 230, 30)
        #dialog.SetText('About', ABOUT)

    def exit(self):
        gEve.CloseEveWindow()
        self.close()

    def notdone(self):
        dialog = Dialog(gClient.GetRoot(), self.main)
        dialog.SetText('Not done', 'Sorry!', 230, 30)

    def run(self):
        gApplication.Run()

    #-----------------------------------------------------------------------
    # O T H E R   M E T H O D S
    #-----------------------------------------------------------------------

    # read events until we find one with a channel above specified ADC cut

    def readEvent(self, which=R_ONESHOT):
        self.debug("begin:readEvent")

        try:
            reader = self.reader
        except:
            dialog = Dialog(gClient.GetRoot(), self.main)
            dialog.SetText('Oops!', 'First open a root file', 230, 24)
            self.debug("end:readEvent")
            return

        # cache previous event number
        self.eventNumberPrev = self.eventNumber

        # loop over events and apply ADC cut

        if which == R_ONESHOT:
            self.statusBar.SetText(
                'event: %d / %d' % (self.eventNumber, self.nevents - 1), 0)

            self.reader.read(self.eventNumber)

            self.statusBar.SetText(
                'table(x, y) = (%d, %d) ' %
                (self.util.tableX, self.util.tableY), 1)

        elif which == R_FORWARD:
            while self.eventNumber < self.nevents - 1:
                self.eventNumber += 1
                self.statusBar.SetText(
                    'event: %d / %d' % (self.eventNumber, self.nevents - 1), )
                self.reader.read(self.eventNumber)

                ADCmax = self.reader.maxPadeADC()
                #self.statusBar.SetText('max(ADC): %d' % ADCmax, 1)
                self.statusBar.SetText(
                    'table(x, y) = (%d, %d) ' %
                    (self.util.tableX, self.util.tableY), 1)
                if ADCmax < self.ADCcut: continue
                break
        else:
            while self.eventNumber > 0:
                self.eventNumber -= 1
                self.statusBar.SetText(
                    'event: %d / %d' % (self.eventNumber, self.nevents - 1), 0)
                self.reader.read(self.eventNumber)

                ADCmax = self.reader.maxPadeADC()
                #self.statusBar.SetText('max(ADC): %d' % ADCmax, 1)
                self.statusBar.SetText(
                    'table(x, y) = (%d, %d) ' %
                    (self.util.tableX, self.util.tableY), 1)
                if ADCmax < self.ADCcut: continue
                break

        if self.eventNumber <= 0 or self.eventNumber >= self.nevents - 1:
            self.stopPlayer()

        # Force a re-drawing of pages of notebook when a page is made
        # visible
        keys = self.noteBook.pages.keys()
        for key in keys:
            self.noteBook.pages[key].redraw = True
        self.util.eventNumber = self.eventNumber

        self.debug("end:readEvent")

    #-----------------------------------------------------------------------
    def displayEvent(self):
        self.progressBar.Reset()
        self.progressBar.SetPosition(self.eventNumber)
        pageNumber = self.noteBook.pageNumber
        page = self.noteBook.pages[pageNumber]
        self.debug("begin:displayEvent - %s" % page.name)
        if self.shutterOpen:
            if not os.path.exists(
                    "pdfs_" + self.filename[self.filename.rfind('/') + 1:-5]):
                os.system('mkdir pdfs_' +
                          self.filename[self.filename.rfind('/') + 1:-5])

            if '3D' in page.name:
                pdfname = 'pdfs_'+self.filename[self.filename.rfind('/')+1:-5]+\
                  '/'+self.pageName+str(self.eventNumber)+'.png'
                gEve.GetDefaultGLViewer().SavePictureScale(pdfname, 1.0)
            else:
                pdfname = 'pdfs_'+self.filename[self.filename.rfind('/')+1:-5]+\
                  '/'+self.pageName+str(self.eventNumber)+'.pdf'
                page.canvas.Print(pdfname)

            page.redraw = False
            return
        if not page.redraw and not self.shutterOpen and not self.redraw:
            self.debug("end:displayEvent - DO NOTHING")
            return

        self.refreshFile()

        if '3D' not in page.name:
            self.display[page.name].Draw(self.reader.event(), self.util)
        else:
            self.display['ADC heatmap'].Draw(self.reader.event(), self.util)
            self.util.stealthmode = True
            #            self.display['Wire chambers'].Draw(self.reader.event(), self.util)
            self.util.stealthmode = False
            self.display[page.name].Draw(self.reader.event(), self.util)

        print "displaying with self.util.eventNumber = " + str(
            self.util.eventNumber)
        self.redraw = False
        page.redraw = False
        self.debug("end:displayEvent")
Example #7
0
class TBEventDisplay:
    """
    gui = TBEventDisplay(title)
    """

    def __init__(self, title, filename=None, width=WIDTH, height=HEIGHT):

        # Initial directory for open file dialog
        self.openDir  = os.environ['PWD']
        self.filename = filename

        #-------------------------------------------------------------------
        # Create main frame
        #-------------------------------------------------------------------
        # Establish a connection between the main frame's "CloseWindow()"
        # signal and the GUI's "close" slot, modeled as a method.
        # When the main frame issues the signal CloseWindow() this
        # triggers a call to the close method of this class.
        #-------------------------------------------------------------------
        self.root = gClient.GetRoot()
        self.main = TGMainFrame(self.root, width, height)
        self.main.SetWindowName(title)
        self.main.SetCleanup(kDeepCleanup)
        self.connection = Connection(self.main, "CloseWindow()",
                         self,      "close")

        self.util = Util()
        #-------------------------------------------------------------------
        # Create menu bar
        #-------------------------------------------------------------------
        self.menuBar = MenuBar(self, self.main)

        self.menuBar.Add('File',
                 [('&Open',  'openFile'),
                  ('&Close', 'closeFile'),
                  0,
                  ('E&xit',  'exit')])

        self.menuBar.Add('Edit',
                 [('&Undo',  'undo')])


        self.menuBar.Add('Event',
                 [('&Next',     'nextEvent'),
                  ('&Previous', 'previousEvent'),
                  ('&Goto',     'gotoEvent'),
                0,
                  ('Set ADC cut', 'setADCcut'),
                  ('Set delay',   'setDelay')])

        self.menuBar.Add('Help',
                 [('About', 'about'),
                  ('Usage', 'usage')])

        #-------------------------------------------------------------------
        # Add vertical frame to the main frame to contain toolbar, notebook
        # and status window
        #-------------------------------------------------------------------
        self.vframe = TGVerticalFrame(self.main, 1, 1)
        self.main.AddFrame(self.vframe, TOP_X_Y)

        #-------------------------------------------------------------------
        # Add horizontal frame to contain toolbar
        #-------------------------------------------------------------------
        self.toolBar = TGHorizontalFrame(self.vframe)
        self.vframe.AddFrame(self.toolBar, TOP_X)

        # Add picture buttons        
        #self.refreshButton = PictureButton(self, self.toolBar,
        #                picture='Button-Refresh.png',
        #                method='refreshFile',
        #                text='refresh file for new events')

        
        self.enchiladaButton = PictureButton(self, self.toolBar,
                        picture='Enchilada.jpg',
                        method='wholeEnchilada',
                        text='process the whole enchilada')

        self.nextButton = PictureButton(self, self.toolBar,
                        picture='GoForward.gif',
                        method='nextEvent',
                        text='go to next event')

        self.forwardButton = PictureButton(self, self.toolBar,
                           picture='Forward.png',
                           method='forwardPlayer',
                           text='foward event player')

        self.stopButton = PictureButton(self, self.toolBar,
                        picture='Stop.png',
                        method='stopPlayer',
                        text='stop event player')

        self.rewindButton = PictureButton(self, self.toolBar,
                          picture='Rewind.png',
                          method='rewindPlayer',
                          text='rewind event player')

        self.previousButton = PictureButton(self, self.toolBar,
                            picture='GoBack.gif',
                            method='previousEvent',
                            text='go to previous event')
        
        self.snapCanvasButton = PictureButton(self, self.toolBar,
                        picture='Camera.png',
                        method='snapCanvas',
                        text='pdf this canvas')

        self.cycleButton = PictureButton(self, self.toolBar,
                        picture='Bicycle.jpg',
                        method='cycleTabs',
                        text='cycle (auto-pilot)')

        self.accumulateButton = CheckButton(self, self.toolBar,
                        hotstring='Accumulate',
                        method='toggleAccumulate',
                        text='Accumulate')


        #-------------------------------------------------------------------
        # Add a notebook with multiple pages
        #-------------------------------------------------------------------

    
        
        #general util struct members:
        self.util.accumulate = False   
        self.util.stealthmode = False  
        self.util.filename = self.filename
        #WF trace bools:
        self.wfelements = [] #list built in util.py::NotePad
        WFbuttons = []
        for b in range(4):
            buttonname = 'toggleShowBoard'+str(b)
            WFbuttons.append(("Board    "+str(b), buttonname, buttonname,True))
            self.util.showBoard.push_back(True)
        #WC bools:
        self.util.WC_showIThits = True
        self.util.WC_showQhits = True
        #FiberADC bools
        self.util.FADC_showRecHits = True
        self.util.FADC_showAllHits = False
        #3D bools
        self.util._3D_showWC1 = True
        self.util._3D_showWC2 = True
        self.util._3D_isolateClusters = False
        self.util.needsAboost = False
        self.util.showRecTracks = True
        self.util.showAllTracks = False
        #track struct members:
        self.util.x1hit = 10
        self.util.x2hit = 1
        self.util.y1hit = 10
        self.util.y2hit = 4


        
        WCbuttons = [('In-time hits','toggleShowIThits','toggleShowIThits', True),
                     ('Quality hits','toggleShowQhits','toggleShowQhits', True),
                         ('show rec tracks','toggleShowRecTracks','toggleShowRecTracks',True),
                         ('show all tracks','toggleShowAllTracks','toggleShowAllTracks',False)]
        FADCbuttons = [('show rec hits','toggleShowRecHits','toggleShowRecHits',True),
                      ('show all hits','toggleShowAllHits','toggleShowAllHits',False)]
        ThreeDbuttons = [('show WC1','toggleShowWC1','toggleShowWC1', True),
                         ('show WC2','toggleShowWC2','toggleShowWC2', True),
                         ('isolate cluster','toggleIsolateClusters','toggleIsolateCluster', False),
                         ('use rec tracks','toggleShowRecTracks','toggleShowRecTracks',True),
                         ('use all tracks','toggleShowAllTracks','toggleShowAllTracks',False)]
        
        
        
        self.reraw = True
        self.shutterOpen = False
        self.pageName = 'default'
                 
        self.noteBook = NoteBook(self, self.vframe, 'setPage', width, height)
        # Add pages 
        self.display = {}
        for pageName, constructor, buttons in [('WF traces', 'TracePlot(canvas)', WFbuttons),
                          ('ADC heatmap',   'ShashlikHeatmap(canvas)', None),
                          ('ADC fibers', 'FiberADC(canvas)', FADCbuttons), 
                          ('WF Noise', 'PedestalNoise(canvas)', None), 
                          ('Wire chambers', 'WCPlanes(canvas)', WCbuttons),
                          ('TDC timing','TDCtiming(canvas)', None),
                          ('3D display',    'Display3D(page)', ThreeDbuttons)]:
            self.noteBook.Add(pageName, buttons)
            self.noteBook.SetPage(pageName)
            page = self.noteBook.page
            canvas = page.canvas
            print '==> building display: %s' % pageName
            self.display[pageName] = eval(constructor)
            
        #-------------------------------------------------------------------
        # Create a status bar, divided into two parts
        #-------------------------------------------------------------------
        self.statusBar = TGStatusBar(self.vframe, 1, 1, kDoubleBorder)
        self.statusBar.SetHeight(22)
        status_parts = array('i')
        status_parts.append(18)
        status_parts.append(18)
        status_parts.append(24)
        status_parts.append(20)
        status_parts.append(20)
        self.statusBar.SetParts(status_parts, len(status_parts))
        self.progressBar = ProgressBar(self, self.statusBar)
        self.vframe.AddFrame(self.statusBar, TOP_X)

    
        # Initial state
        self.wcplanes = self.display['Wire chambers']	
        self.ADCcut  = 50
        self.nevents = 0
        self.eventNumber = -1
        self.DELAY  = int(1000*MINDELAY)
        self.mutex  = TMutex(kFALSE)
        self.timer  = TTimer()
        self.timerConnection = Connection(self.timer, 'Timeout()',
                                          self, 'managePlayer')
        
        self.DEBUG  = DEBUG
        self.DEBUG_COUNT = 0

        # Initialize layout        
        self.main.MapSubwindows()
        self.main.Resize()
        self.main.MapWindow()
	
        
        #DEBUG
        # to debug a display uncomment next line
        #filename = "data/test.root"

        if filename != None: self.__openFile(filename)
        else: self.__openFile('data/protons.root')	

        #DEBUG
        # to debug a display uncomment next two lines
        self.noteBook.SetPage('Wire chambers')
        self.displayEvent()
        
    def __del__(self):
        pass


    def debug(self, message):
        if self.DEBUG < 1: return
        self.DEBUG_COUNT += 1
        print "%10d> %s" % (self.DEBUG_COUNT, message)

    #-----------------------------------------------------------------------
    #	M E T H O D S
    #-----------------------------------------------------------------------

    #	S L O T S    (that is, callbacks)

    def openFile(self):
        dialog = Dialog(gClient.GetRoot(), self.main)
        self.filename = dialog.SelectFile(kFDOpen, self.openDir)
        self.util.filename = self.filename
        self.openDir = dialog.IniDir()
        if self.filename[-5:] != '.root':
            dialog.ShowText("Oops!",
                    "Please select a root file",
                    230, 30)
            return
        self.__openFile(self.filename)


    def __openFile(self, filename):
        self.filename = filename
        self.util.filename = self.filename
        self.closeFile()		
        self.reader = TBFileReader(filename, self.util)
        self.nevents= self.reader.entries()
        self.statusBar.SetText('events: %d' % self.nevents, 0)
        self.statusBar.SetText(self.filename[self.filename.rfind('/')+1:][-32:], 2)
        self.eventNumber = -1
        self.util.eventNumber = -1
        self.nextEvent()
        self.progressBar.SetRange(0, self.nevents)
        self.progressBar.SetPosition(self.eventNumber)
        self.wcplanes.CacheWCMeans("meanfile.txt", filename)
        self.util.tableX = self.reader.tableX
        self.util.tableY = self.reader.tableY
        self.statusBar.SetText('table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY), 1)
        self.filetime = time.ctime(os.path.getctime(filename))
        for  e in range(len(self.wfelements)):
            self.wfelements[e].SetText("Board "+str(self.util.boardNumbers[e]))
            print "trying to rename button to ", "Board "+str(self.util.boardNumbers[e])
            

        
    def refreshFile(self):
        try:
            t = self.filetime
        except:
            print 'file is up to date'
            return
        if self.filetime == time.ctime(os.path.getctime(self.filename)):
            print "file up to date"
            return                 
        else:      
            print "refreshing"
            eventNumber = self.eventNumber  
            #self.closeFile()	            
            self.reader = TBFileReader(self.filename, self.util)
            self.nevents= self.reader.entries()
            self.statusBar.SetText('event: %d / %d' % (eventNumber, self.nevents-1), 0)
            self.filetime = time.ctime(os.path.getctime(self.filename))
            self.wcplanes.CacheWCMeans("meanfile.txt", self.filename)
            self.eventNumber = eventNumber
            self.util.eventNumber = eventNumber
            self.util.needsAboost = True
        
    def closeFile(self):
        try:
            if self.reader.file().IsOpen():
                #gSystem.Exit()
                self.reader.file().Close()
                del self.reader
        except:
            pass

    def setPage(self, id):
        if id==0:
            self.pageName = 'Traces'
        if id==1:
            self.pageName = 'Heatmap'
        if id==2:
            self.pageName = 'Fibers'
        if id==3:
            self.pageName = 'Noise'
        if id==4:
            self.pageName = 'WC'
        if id==5:
            self.pageName = 'TDC'
        if id==6:
            self.pageName = '3D_'
        self.noteBook.SetPage(id)
        if self.eventNumber >= 0:
            self.displayEvent()

    def nextEvent(self):
        self.debug("begin:nextEvent")
        if self.eventNumber > self.nevents-2:
            self.eventNumber = 0
        self.readEvent(R_FORWARD)
        self.displayEvent()
        self.debug("end:nextEvent")			

    def previousEvent(self):
        self.debug('begin:previousEvent')
        if self.eventNumber < 1:
            self.eventNumber = self.nevents 
        self.readEvent(R_REWIND)
        self.displayEvent()
        self.debug('end:previousEvent')

    def gotoEvent(self):
        self.debug('begin:gotoEvent')
        from string import atoi
        dialog = Dialog(gClient.GetRoot(), self.main)
        self.eventNumber = atoi(dialog.GetInput('Goto event %d - %d' % \
                            (0, self.nevents-1),
                            '0'))
        self.eventNumber = max(self.eventNumber, 0)
        self.eventNumber = min(self.eventNumber, self.nevents-1)

        # do a one-shot read
        self.readEvent(R_ONESHOT)
        self.displayEvent()
        self.debug('end:gotoEvent')

    def forwardPlayer(self):
        self.debug('begin:forwardPlayer')
        self.mutex.Lock()
        self.forward = True
        self.timer.Start(self.DELAY, kFALSE)
        self.mutex.UnLock()
        self.debug('end:forwardPlayer')

    def cycleTabs(self):
        self.debug('begin:cycleTabs')
        self.mutex.Lock()
        if self.noteBook.pageNumber == 6:#len(self.noteBook.pages)-1:
            self.noteBook.pageNumber = 0
        self.timer.Start(self.DELAY*5, kFALSE)
        self.noteBook.pageNumber+=1
        self.noteBook.SetPage(self.noteBook.pageNumber)
        self.displayEvent()
        self.forward = True
        self.cycle = True
        self.mutex.UnLock()
        self.debug('end:cycleTabs')
        
        
    def rewindPlayer(self):
        self.debug('begin:rewindPlayer')
        self.mutex.Lock()
        self.forward = False
        self.timer.Start(self.DELAY, kFALSE)
        self.mutex.UnLock()
        self.debug('end:rewindPlayer')

    def stopPlayer(self):
        self.debug('begin:stopPlayer')
        self.mutex.Lock()
        self.timer.Stop()
        self.cycle = False
        self.mutex.UnLock()
        self.debug('end:stopPlayer - STOP REQUESTED')

    def managePlayer(self):
        if self.cycle:
            self.cycleTabs()
        if self.forward:
            self.nextEvent()
        else:
            self.previousEvent()

    def toggleAccumulate(self):
        self.debug("toggle:accumulate")
        self.util.accumulate = not self.util.accumulate

    def wholeEnchilada(self):
        self.debug("begin:wholeEnchilada")
        self.util.accumulate = True
        self.util.accumulateButton.SetState(True) 
        self.util.stealthmode = True
        self.eventNumber = 0
        while self.eventNumber<self.nevents-2:
            self.readEvent(R_FORWARD)
            self.displayEvent()
            self.statusBar.Draw()
        self.util.stealthmode = False
        self.readEvent(R_FORWARD)
        self.displayEvent()     
        self.eventNumber = 0
        self.debug("end:wholeEnchilada")
        
    def snapCanvas(self):
        self.debug("begin:snapCanvas")
        self.shutterOpen = True
        self.displayEvent()
        self.shutterOpen = False
        self.debug("end:snapCanvas")


    def toggleShowBoard0(self):
        self.debug("begin:toggleShowBoard0")
        self.util.showBoard[0] = not self.util.showBoard[0]
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowBoard0")

    def toggleShowBoard1(self):
        self.debug("begin:toggleShowBoard1")
        self.util.showBoard[1] = not self.util.showBoard[1]
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowBoard1")

    def toggleShowBoard2(self):
        self.debug("begin:toggleShowBoard2")
        self.util.showBoard[2] = not self.util.showBoard[2]
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowBoard2")

    def toggleShowBoard3(self):
        self.debug("begin:toggleShowBoar3")
        self.util.showBoard[3] = not self.util.showBoard[3]
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowBoard3")
        

    def toggleShowRecHits(self):
            self.debug("begin:toggleShowRecHits")
            self.util.FADC_showRecHits = not self.util.FADC_showRecHits
            self.redraw = True
            self.displayEvent()
            self.debug("end:FADC_showRecHits")

    def toggleShowAllHits(self):
            self.debug("begin:toggleShowAllHits")
            self.util.FADC_showAllHits = not self.util.FADC_showAllHits
            self.redraw = True
            self.displayEvent()
            self.debug("end:FADC_showAllHits")    

    def toggleShowRecTracks(self):
            self.debug("begin:toggleShowRecTracks")
            self.util.showRecTracks = not self.util.showRecTracks
            self.redraw = True
            self.displayEvent()
            self.debug("end:showRecTracks")

    def toggleShowAllTracks(self):
            self.debug("begin:toggleShowAllTracks")
            self.util.showAllTracks = not self.util.showAllTracks
            self.redraw = True
            self.displayEvent()
            self.debug("end:showAllTracks")  

    def toggleShowIThits(self):
        self.debug("begin:ShowIThits")
        self.util.WC_showIThits = not self.util.WC_showIThits
        self.redraw = True
        self.displayEvent()
        self.debug("end:ShowIThits")

    def toggleShowQhits(self):
        self.debug("begin:ShowQhits")
        self.util.WC_showQhits = not self.util.WC_showQhits
        self.redraw = True
        self.displayEvent()
        self.debug("end:ShowQhits")
        

    def toggleShowWC2(self):
        self.debug("begin:toggleShowWC2")
        self.util._3D_showWC2 = not self.util._3D_showWC2
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowWC2")

        
    def toggleShowWC1(self):
        self.debug("begin:toggleShowWC2")
        self.util._3D_showWC1 = not self.util._3D_showWC1
        self.redraw = True
        self.displayEvent()
        self.debug("end:toggleShowWC1")

        
    def toggleIsolateClusters(self):
            self.debug("begin:toggleIsolateClusters")
            self.util._3D_isolateClusters = not self.util._3D_isolateClusters
            self.redraw = True
            self.displayEvent()
            self.debug("end:toggleIsolateClusters")

        
 
        
    def setDelay(self):
        from string import atof
        dialog = Dialog(gClient.GetRoot(), self.main)
        seconds= atof(dialog.GetInput('Enter delay in seconds', '2.0'))
        self.playerDelay = max(MINDELAY, int(1000*seconds))
        self.statusBar.SetText('delay set to: %8.1f s' % seconds, 1)

    def setADCcut(self):
        from string import atoi
        dialog = Dialog(gClient.GetRoot(), self.main)
        self.ADCcut = atoi(dialog.GetInput('Enter ADC cut', '50'))
        self.statusBar.SetText('table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY), 1)

    def close(self):
        gSystem.Abort()
        gApplication.Terminate(0)
        #gApplication.Close()

    def usage(self):
        dialog = Dialog(gClient.GetRoot(), self.main)
        dialog.SetText('Not done', 'Sorry!', 230, 30)
        #dialog.SetText('Help', HELP)

    def about(self):
        dialog = Dialog(gClient.GetRoot(), self.main)
        dialog.SetText('Not done', 'Sorry!', 230, 30)
        #dialog.SetText('About', ABOUT)

    def exit(self):
        gEve.CloseEveWindow()
        self.close()

    def notdone(self):
        dialog = Dialog(gClient.GetRoot(), self.main)
        dialog.SetText('Not done', 'Sorry!', 230, 30)

    def run(self):
        gApplication.Run()


    #-----------------------------------------------------------------------
    # O T H E R   M E T H O D S
    #-----------------------------------------------------------------------

    # read events until we find one with a channel above specified ADC cut

    def readEvent(self, which=R_ONESHOT):
        self.debug("begin:readEvent")

        try:
            reader = self.reader
        except:
            dialog = Dialog(gClient.GetRoot(), self.main)
            dialog.SetText('Oops!', 'First open a root file',
                           230, 24)
            self.debug("end:readEvent")
            return


        # cache previous event number
        self.eventNumberPrev = self.eventNumber

        # loop over events and apply ADC cut

        if   which == R_ONESHOT:
            self.statusBar.SetText('event: %d / %d' % (self.eventNumber, self.nevents-1),
                                   0)
            
            self.reader.read(self.eventNumber)

            self.statusBar.SetText('table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY), 1)

        elif which == R_FORWARD:
            while self.eventNumber < self.nevents-1:
                self.eventNumber += 1
                self.statusBar.SetText('event: %d / %d' % (self.eventNumber, self.nevents-1),
                                       )
                self.reader.read(self.eventNumber)

                ADCmax =  self.reader.maxPadeADC()
                #self.statusBar.SetText('max(ADC): %d' % ADCmax, 1)
                self.statusBar.SetText('table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY), 1)
                if ADCmax < self.ADCcut: continue
                break
        else:
            while self.eventNumber > 0:
                self.eventNumber -= 1
                self.statusBar.SetText('event: %d / %d' % (self.eventNumber, self.nevents-1),
                                       0)
                self.reader.read(self.eventNumber)

                ADCmax =  self.reader.maxPadeADC()
                #self.statusBar.SetText('max(ADC): %d' % ADCmax, 1)
                self.statusBar.SetText('table(x, y) = (%d, %d) ' % (self.util.tableX, self.util.tableY), 1)
                if ADCmax < self.ADCcut: continue				
                break			


        if self.eventNumber <= 0 or self.eventNumber >= self.nevents-1:
            self.stopPlayer()

        # Force a re-drawing of pages of notebook when a page is made
        # visible
        keys = self.noteBook.pages.keys()
        for key in keys:
            self.noteBook.pages[key].redraw = True
        self.util.eventNumber = self.eventNumber

        self.debug("end:readEvent")
    #-----------------------------------------------------------------------
    def displayEvent(self):
        self.progressBar.Reset()
        self.progressBar.SetPosition(self.eventNumber)
        pageNumber = self.noteBook.pageNumber
        page = self.noteBook.pages[pageNumber]
        self.debug("begin:displayEvent - %s" % page.name)
        if self.shutterOpen:
            if not os.path.exists("pdfs_"+self.filename[self.filename.rfind('/')+1:-5]):
                os.system('mkdir pdfs_'+self.filename[self.filename.rfind('/')+1:-5])

            if '3D' in page.name:
                pdfname = 'pdfs_'+self.filename[self.filename.rfind('/')+1:-5]+\
                  '/'+self.pageName+str(self.eventNumber)+'.png'
                gEve.GetDefaultGLViewer().SavePictureScale(pdfname,1.0)
            else:
                pdfname = 'pdfs_'+self.filename[self.filename.rfind('/')+1:-5]+\
                  '/'+self.pageName+str(self.eventNumber)+'.pdf'
                page.canvas.Print(pdfname)
            
            page.redraw = False
            return
        if not page.redraw and not self.shutterOpen and not self.redraw:
            self.debug("end:displayEvent - DO NOTHING")		
            return
        
        self.refreshFile()
        args = (self.reader.event(), self.reader.spill(), self.reader.rechits(), self.reader.tracks(), self.util)
        if '3D' not in page.name:
            self.display[page.name].Draw(*args)
        else:
            self.display['ADC heatmap'].Draw(*args)
            self.util.stealthmode = True
            self.display['Wire chambers'].Draw(*args)
            self.util.stealthmode = False
            self.display[page.name].Draw(*args)

        print "displaying with self.util.eventNumber = "+str(self.util.eventNumber)
        self.redraw = False
        page.redraw = False
        self.debug("end:displayEvent")