Main Page | Packages | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | Related Pages

gosedImpl.py

00001 #!/usr/local/bin/python
00002 #
00003 #                               Copyright 2003
00004 #                                     by
00005 #                        The Board of Trustees of the
00006 #                     Leland Stanford Junior University.
00007 #                            All rights reserved.
00008 #
00009 
00010 __facility__ = "Online"
00011 __abstract__ = "GLAST Online Single Event Display Modular"
00012 __author__   = "A. Kavelaars <aliciak@SLAC.Stanford.edu> SLAC - GLAST LAT I&T/Online"
00013 __date__     = "11/20/2003"
00014 __version__  = "$Revision: 1.32 $"
00015 __credits__  = "SLAC"
00016 
00017 
00018 import LATTE.copyright_SLAC
00019 from   qt                    import *
00020 import sys
00021 import struct
00022 
00023 from   gosed                 import singleEvtDisplay
00024 from   ServerPreferencesImpl import ServerPreferencesImpl
00025 from   GOSEDPreferencesImpl  import GOSEDPreferencesImpl
00026 from   GOSEDReadme           import GOSEDReadme
00027 
00028 import GOSEDACDImpl
00029 import GOSEDTWRImpl
00030 import GOSEDCALImpl
00031 import GOSEDTKRImpl
00032 import GOSEDCALTKRImpl
00033 import GOSEDDataImpl
00034 import GOSEDPainter
00035 import GOTEDImpl
00036 import GOSED_LDF
00037 import LDF
00038 import logging                as     myLog
00039 #~ import DataDistributorPoll as DDP
00040 #~ from   LATTE.client.gBits    import hexConvert
00041 
00042 import atexit
00043 
00044 
00045 class singleEvtDisplayImpl(singleEvtDisplay):
00046   """ \brief Glast Online Single Event Display (GOSED)
00047 
00048   This class:
00049   1. Manages all the GUI functions for GOSED.
00050   2. Retreives the TKR and CAL projections' pixmaps from GOSEDPainter.
00051   3. Loads all the information from the current event processed by GOSED_LDF,
00052   """
00053 
00054   def __init__(self,filename = None,parent = None,name = None,fl = 0):
00055     """ singleEvtDisplayImpl contructor
00056 
00057     \param filename      None
00058     \param parent        None
00059     \param name          None
00060     \param fl            0
00061     """
00062 
00063     # Initialize variables
00064     singleEvtDisplay.__init__(self,parent,name,fl)
00065     self.flagDisabledPixmap = self.image4
00066     self.flagEnabledPixmap  = self.image3
00067     self.stopPixmap         = self.image7
00068     self.goPixmap           = self.image8
00069 
00070     # Initialize variables
00071     self.__fn      = filename
00072     self.__ds      = None
00073     self.__file    = None
00074     self.__fits    = None
00075     self.__data    = None
00076     self.__evtList = []
00077 
00078     self.__lci     = GOSED_LDF.myLATcomponentIterator(self)
00079     self.__ldbi    = LDF.LATdataBufferIterator(self.__lci)
00080 
00081     # Set default led flags
00082     #~ self.errorFlag.setPixmap(self.flagDisabledPixmap)
00083     #~ self.diagnosticFlag.setPixmap(self.flagDisabledPixmap)
00084 
00085     # Initialize Preferences windows
00086     import ConfigParser                 # Triage...
00087     self.__confParser = ConfigParser.ConfigParser() # Should have 1 Prefs GUI
00088     self.ServerPreferencesGUI = ServerPreferencesImpl(self.__confParser, self)
00089     self.GOSEDPreferencesGUI  = GOSEDPreferencesImpl(self.__confParser, self)
00090 
00091     #~ if self.GOSEDPreferencesGUI.EventlimitsButton.isChecked():
00092       #~ self.preferredLimits = "Event"
00093     if self.GOSEDPreferencesGUI.CustomlimitsButton.isChecked():
00094       self.preferredLimits = "Custom"
00095     else:# self.GOSEDPreferencesGUI.CALlimitsButton.isChecked():
00096       self.preferredLimits = "Default"
00097 
00098     if self.GOSEDPreferencesGUI.CustomlimitsButton2.isChecked():
00099       self.preferredLimits2 = "Custom"
00100     else:
00101       self.preferredLimits2 = "Default"
00102 
00103     # Create dock windows
00104     self.createDockWindows()
00105 
00106     prefs = self.GOSEDPreferencesGUI
00107 
00108     # Create Painters
00109     self.drawGOSEDACD = GOSEDACDImpl.ACDSingleEvtDisplayImpl(prefs, self.__dwGOSEDACD)
00110     self.__dwGOSEDACD.setWidget(self.drawGOSEDACD)
00111 
00112     self.drawGOSEDCAL = GOSEDCALImpl.GOSEDCALImpl(prefs, self.__dwGOSEDCAL)
00113     self.__dwGOSEDCAL.setWidget(self.drawGOSEDCAL)
00114 
00115     self.drawGOSEDTKR = GOSEDTKRImpl.GOSEDTKRImpl(self.__dwGOSEDTKR)
00116     self.__dwGOSEDTKR.setWidget(self.drawGOSEDTKR)
00117 
00118     self.drawGOSEDTWR = GOSEDTWRImpl.GOSEDTWRImpl(self.__dwGOSEDTWR)
00119     self.__dwGOSEDTWR.setWidget(self.drawGOSEDTWR)
00120 
00121     self.drawGOSEDCALTKR = GOSEDCALTKRImpl.GOSEDCALTKRImpl(prefs, self.__dwGOSEDCALTKR)
00122     self.__dwGOSEDCALTKR.setWidget(self.drawGOSEDCALTKR)
00123 
00124     self.drawGOSEDData = GOSEDDataImpl.GOSEDDataImpl(self, self.__dwGOSEDData)
00125     self.__dwGOSEDData.setWidget(self.drawGOSEDData)
00126 
00127     self.drawGOTED = GOTEDImpl.towerEvtDisplayImpl(self.__dwGOTED)
00128     self.__dwGOTED.setWidget(self.drawGOTED)
00129 
00130     # Add default setup Dock Windows ATK-060904 -- WORK THIS OUT!!
00131     self.addDockWindow(self.__dwGOSEDTWR , Qt.DockLeft, True)
00132     if not self.GOSEDPreferencesGUI.twr():  self.__dwGOSEDTWR.hide()
00133 
00134     self.addDockWindow(self.__dwGOSEDCALTKR , Qt.DockLeft, False)
00135     if not self.GOSEDPreferencesGUI.calTkr():  self.__dwGOSEDCALTKR.hide()
00136 
00137     self.addDockWindow(self.__dwGOSEDData, Qt.DockRight, False)
00138     if not self.GOSEDPreferencesGUI.data():  self.__dwGOSEDData.hide()
00139 
00140     self.addDockWindow(self.__dwGOSEDTKR , Qt.DockLeft, False)
00141     if not self.GOSEDPreferencesGUI.tkr():  self.__dwGOSEDTKR.hide()
00142 
00143     self.addDockWindow(self.__dwGOSEDACD , Qt.DockRight, True)
00144     if not self.GOSEDPreferencesGUI.acd():  self.__dwGOSEDACD.hide()
00145 
00146     self.addDockWindow(self.__dwGOSEDCAL,  Qt.DockRight,  False)
00147     if not self.GOSEDPreferencesGUI.cal():  self.__dwGOSEDCAL.hide()
00148 
00149     self.addDockWindow(self.__dwGOTED,  Qt.DockRight,  True)
00150     if not self.GOSEDPreferencesGUI.ted():  self.__dwGOTED.hide()
00151 
00152     # Custom Widgets setup
00153     self.setFocusPolicy(QWidget.StrongFocus)
00154 
00155     # TKR and CAL
00156     self.xzTKR = self.drawGOSEDTKR.xzTKR
00157     self.yzTKR = self.drawGOSEDTKR.yzTKR
00158     self.xzCAL = self.drawGOSEDCAL.xzCAL
00159     self.yzCAL = self.drawGOSEDCAL.yzCAL
00160     self.rainbowCAL = self.drawGOSEDCAL.rainbowScaleCAL
00161 
00162     xzTKRLayout = QGridLayout(self.xzTKR,0,0,0,-1,"gosedLayout")
00163     yzTKRLayout = QGridLayout(self.yzTKR,0,0,0,-1,"gosedLayout")
00164     xzCALLayout = QGridLayout(self.xzCAL,0,0,0,-1,"gosedLayout")
00165     yzCALLayout = QGridLayout(self.yzCAL,0,0,0,-1,"gosedLayout")
00166     rainbowCALLayout = QGridLayout(self.rainbowCAL,0,0,0,-1,"gosedLayout")
00167 
00168     self.drawXZ_TKR = GOSEDPainter.drawXZ_TKR(self, self.xzTKR)
00169     self.drawYZ_TKR = GOSEDPainter.drawYZ_TKR(self, self.yzTKR)
00170     self.drawXZ_CAL = GOSEDPainter.drawXZ_CAL(self, self.xzCAL)
00171     self.drawYZ_CAL = GOSEDPainter.drawYZ_CAL(self, self.yzCAL)
00172     self.drawRainbowCAL = GOSEDPainter.drawRainbowCAL(self, self.rainbowCAL)
00173 
00174     xzTKRLayout.addWidget(self.drawXZ_TKR,0,0)
00175     yzTKRLayout.addWidget(self.drawYZ_TKR,0,0)
00176     xzCALLayout.addWidget(self.drawXZ_CAL,0,0)
00177     yzCALLayout.addWidget(self.drawYZ_CAL,0,0)
00178     rainbowCALLayout.addWidget(self.drawRainbowCAL,0,0)    
00179 
00180     self.xzTKR2 = self.drawGOSEDCALTKR.xzTKR
00181     self.yzTKR2 = self.drawGOSEDCALTKR.yzTKR
00182     self.xzCAL2 = self.drawGOSEDCALTKR.xzCAL
00183     self.yzCAL2 = self.drawGOSEDCALTKR.yzCAL
00184     self.rainbowCAL2 = self.drawGOSEDCALTKR.rainbowScaleCAL
00185 
00186     xzTKRLayout2 = QGridLayout(self.xzTKR2,0,0,0,-1,"gosedLayout")
00187     yzTKRLayout2 = QGridLayout(self.yzTKR2,0,0,0,-1,"gosedLayout")
00188     xzCALLayout2 = QGridLayout(self.xzCAL2,0,0,0,-1,"gosedLayout")
00189     yzCALLayout2 = QGridLayout(self.yzCAL2,0,0,0,-1,"gosedLayout")
00190     rainbowCALLayout2 = QGridLayout(self.rainbowCAL2,0,0,0,-1,"gosedLayout")
00191 
00192     self.drawXZ_TKR2 = GOSEDPainter.drawXZ_TKR(self, self.xzTKR2)
00193     self.drawYZ_TKR2 = GOSEDPainter.drawYZ_TKR(self, self.yzTKR2)
00194     self.drawXZ_CAL2 = GOSEDPainter.drawXZ_CAL(self, self.xzCAL2)
00195     self.drawYZ_CAL2 = GOSEDPainter.drawYZ_CAL(self, self.yzCAL2)
00196     self.drawRainbowCAL2 = GOSEDPainter.drawRainbowCAL(self, self.rainbowCAL2)
00197 
00198     xzTKRLayout2.addWidget(self.drawXZ_TKR2,0,0)
00199     yzTKRLayout2.addWidget(self.drawYZ_TKR2,0,0)
00200     xzCALLayout2.addWidget(self.drawXZ_CAL2,0,0)
00201     yzCALLayout2.addWidget(self.drawYZ_CAL2,0,0)
00202     rainbowCALLayout2.addWidget(self.drawRainbowCAL2,0,0)
00203 
00204     # ACD
00205     self.side1ACD = self.drawGOSEDACD.side1ACD
00206     self.side2ACD = self.drawGOSEDACD.side2ACD
00207     self.side3ACD = self.drawGOSEDACD.side3ACD
00208     self.side4ACD = self.drawGOSEDACD.side4ACD
00209     self.hatACD = self.drawGOSEDACD.hatACD
00210     self.rainbowACD = self.drawGOSEDACD.rainbowScaleACD
00211 
00212     #hatWidth    = self.hatACD.width()
00213     #hatHeight   = self.hatACD.height()
00214     #side1Width  = self.side1ACD.width()
00215     #side1Height = self.side1ACD.height()
00216 
00217     side1ACDLayout = QGridLayout(self.side1ACD,0,0,0,-1,"gosedLayout")
00218     self.side1ACDLayout = side1ACDLayout
00219     side2ACDLayout = QGridLayout(self.side2ACD,0,0,0,-1,"gosedLayout")
00220     side3ACDLayout = QGridLayout(self.side3ACD,0,0,0,-1,"gosedLayout")
00221     side4ACDLayout = QGridLayout(self.side4ACD,0,0,0,-1,"gosedLayout")
00222     hatACDLayout = QGridLayout(self.hatACD,0,0,0,-1,"gosedLayout")
00223     rainbowACDLayout = QGridLayout(self.rainbowACD,0,0,0,-1,"gosedLayout")
00224 
00225     self.drawSide1ACD = GOSEDPainter.drawSide1ACD(self, self.side1ACD)
00226     self.drawSide2ACD = GOSEDPainter.drawSide2ACD(self, self.side2ACD)
00227     self.drawSide3ACD = GOSEDPainter.drawSide3ACD(self, self.side3ACD)
00228     self.drawSide4ACD = GOSEDPainter.drawSide4ACD(self, self.side4ACD)
00229     self.drawHatACD = GOSEDPainter.drawHatACD(self, self.hatACD)    
00230     self.drawRainbowACD = GOSEDPainter.drawRainbowACD(self, self.rainbowACD)
00231 
00232     #~ self.drawSide1ACD.setGeometry(0,0,hatWidth,side1Height)
00233     side1ACDLayout.addWidget(self.drawSide1ACD,0,0)
00234     side2ACDLayout.addWidget(self.drawSide2ACD,0,0)
00235     side3ACDLayout.addWidget(self.drawSide3ACD,0,0)
00236     side4ACDLayout.addWidget(self.drawSide4ACD,0,0)
00237     hatACDLayout.addWidget(self.drawHatACD,0,0)
00238     rainbowACDLayout.addWidget(self.drawRainbowACD,0,0)
00239 
00240     # Buttons setup
00241     self.clearViews()
00242     self.clearButtonGroups()
00243 
00244     self.Go.setEnabled(0)
00245     self.Next.setEnabled(0)
00246     self.Previous.setEnabled(0)
00247     self.Stop.setEnabled(0)
00248     self.SkipValue.setEnabled(0)
00249     self.Skip.setEnabled(0)
00250 
00251     self.drawGOSEDTWR.selectTWR.setEnabled(0)
00252     #~ self.drawGOSEDCAL.selectRNG.setEnabled(0)
00253     self.drawGOSEDCAL.RNGAll.setEnabled(0)
00254     #~ self.drawGOSEDCALTKR.selectRNG.setEnabled(0)
00255     self.drawGOSEDCALTKR.RNGAll.setEnabled(0)
00256 
00257     for i in range(16):
00258       self.drawGOTED.towerList[i].setEnabled(1)
00259 
00260     # Initialize timer
00261     self.__timer = QTimer(self)
00262 
00263     # Connections
00264     self.connect(self.__timer, SIGNAL("timeout()"), self.nextClicked)
00265     #~ self.connect(self.__timer, SIGNAL("timeout()"), self.next)
00266     self.connect(self.drawGOSEDTWR.selectTWR,         SIGNAL('clicked(int)'),   self.selectChange)
00267     self.connect(self.drawGOSEDCAL.scaleSelection,    SIGNAL('activated(int)'), self.scaleChange)
00268     self.connect(self.drawGOSEDCALTKR.scaleSelection, SIGNAL('activated(int)'), self.scaleChange2)
00269     self.connect(self.drawGOSEDCAL.selectRNG,         SIGNAL('clicked(int)'),   self.rangeChange)
00270     self.connect(self.drawGOSEDCALTKR.selectRNG,      SIGNAL('clicked(int)'),   self.rangeChange2)
00271     self.connect(self.drawGOTED.refreshButton,        SIGNAL('clicked()'),      self.selectChange)
00272     self.connect(self.drawGOSEDCAL.accessGOSEDPreferences,
00273                  SIGNAL('clicked()'), self.GOSEDPreferences)
00274     self.connect(self.drawGOSEDCALTKR.accessGOSEDPreferences,
00275                  SIGNAL('clicked()'), self.GOSEDPreferences)
00276     self.connect(self.__dwGOSEDTWR,    SIGNAL('visibilityChanged ( bool ) '), self.updateDockGOSEDTWR)
00277     self.connect(self.__dwGOSEDTKR,    SIGNAL('visibilityChanged ( bool ) '), self.updateDockGOSEDTKR)
00278     self.connect(self.__dwGOSEDCAL,    SIGNAL('visibilityChanged ( bool ) '), self.updateDockGOSEDCAL)
00279     self.connect(self.__dwGOSEDCALTKR, SIGNAL('visibilityChanged ( bool ) '), self.updateDockGOSEDCALTKR)
00280     self.connect(self.__dwGOSEDData,   SIGNAL('visibilityChanged ( bool ) '), self.updateDockGOSEDData)
00281     self.connect(self.__dwGOTED,       SIGNAL('visibilityChanged ( bool ) '), self.updateDockGOTED)
00282     self.connect(self.__dwGOSEDACD,    SIGNAL('visibilityChanged ( bool ) '), self.updateDockGOSEDACD)
00283 
00284     self.connect(self.toolsPrintCALTKRAction, SIGNAL('activated()'),      self.printCALTKR)
00285     self.connect(self.toolsPrintACDAction,    SIGNAL('activated()'),      self.printACD)
00286 
00287     atexit.register(self.fileExit)
00288 
00289   def printCALTKR(self):
00290     XZ_TKR = QPixmap().grabWidget(self.drawXZ_TKR2)
00291     YZ_TKR = QPixmap().grabWidget(self.drawYZ_TKR2)
00292     XZ_CAL = QPixmap().grabWidget(self.drawXZ_CAL2)
00293     YZ_CAL = QPixmap().grabWidget(self.drawYZ_CAL2)
00294     redLbl = str(self.drawGOSEDACD.redLbl.text())
00295     orangeLbl = str(self.drawGOSEDCALTKR.orangeLbl.text())
00296     yellowLbl = str(self.drawGOSEDCALTKR.yellowLbl.text())
00297     greenLbl = str(self.drawGOSEDCALTKR.greenLbl.text())
00298     blueLbl = str(self.drawGOSEDCALTKR.blueLbl.text())
00299     violetLbl = str(self.drawGOSEDCALTKR.violetLbl.text())
00300     self.printer = QPrinter()
00301     self.printer.setup(self)
00302     self.printer.setOrientation(QPrinter.Landscape)
00303     p = QPainter()
00304     p.begin(self.printer)
00305     p.drawRect(250,50,560,690)
00306     p.drawRect(280,550,490,70)
00307     p.drawPixmap(360, 150, XZ_TKR, 0, 0, -1, -1)
00308     p.drawPixmap(540, 150, YZ_TKR, 0, 0, -1, -1)
00309     p.drawPixmap(360, 415, XZ_CAL, 0, 0, -1, -1)
00310     p.drawPixmap(540, 415, YZ_CAL, 0, 0, -1, -1)
00311     p.drawPixmap(320, 570, self.drawGOSEDCALTKR.rainbowPixmap, 0, 0, -1, -1)
00312     p.drawText(320, 600, redLbl)
00313     p.drawText(381, 600, orangeLbl)
00314     p.drawText(462, 600, yellowLbl)
00315     p.drawText(543, 600, greenLbl)
00316     p.drawText(624, 600, blueLbl)
00317     p.drawText(705, 600, violetLbl)
00318     filename = "File: " + str(self.drawGOSEDData.filename.text())
00319     timeStamp = "Timestamp: " + str(self.drawGOSEDData.timeStamp.text())
00320     event = "Event Seq.#:" + str(self.drawGOSEDData.eventNumber.text())
00321     eventTag = "Event Tag: " + str(self.drawGOSEDData.eventTag.text())
00322     flags = str(self.drawGOSEDData.flagLine.text())
00323     p.drawText(300, 645, filename)
00324     p.drawText(300, 665, timeStamp)
00325     p.drawText(300, 685, event)
00326     p.drawText(300, 705, eventTag)
00327     p.drawText(300, 725, flags)
00328     self.headerFont = QFont()
00329     self.headerFont.setFamily("Arial")
00330     self.headerFont.setPointSize(12)
00331     self.headerFont.setBold(1)
00332     p.setFont(self.headerFont)
00333     p.drawText(300, 100, "GLAST ONLINE SINGLE EVENT DISPLAY - GOSED CAL & TKR")
00334     p.end()
00335 
00336   def printACD(self):
00337     side1ACD = QPixmap().grabWidget(self.drawSide1ACD)
00338     side2ACD = QPixmap().grabWidget(self.drawSide2ACD)
00339     side3ACD = QPixmap().grabWidget(self.drawSide3ACD)
00340     side4ACD = QPixmap().grabWidget(self.drawSide4ACD)
00341     hatACD = QPixmap().grabWidget(self.drawHatACD)
00342     redLbl = str(self.drawGOSEDACD.redLbl.text())
00343     orangeLbl = str(self.drawGOSEDACD.orangeLbl.text())
00344     yellowLbl = str(self.drawGOSEDACD.yellowLbl.text())
00345     greenLbl = str(self.drawGOSEDACD.greenLbl.text())
00346     blueLbl = str(self.drawGOSEDACD.blueLbl.text())
00347     violetLbl = str(self.drawGOSEDACD.violetLbl.text())
00348     self.printer = QPrinter()
00349     self.printer.setup(self)
00350     self.printer.setOrientation(QPrinter.Landscape)
00351     p = QPainter()
00352     p.begin(self.printer)
00353     p.drawRect(250,50,560,690)
00354     p.drawRect(280,560,480,70)
00355     p.drawPixmap(400, 460, side1ACD, 0, 0, -1, -1)
00356     p.drawPixmap(660, 200, side2ACD, 0, 0, -1, -1)
00357     p.drawPixmap(400, 100, side3ACD, 0, 0, -1, -1)
00358     p.drawPixmap(300, 200, side4ACD, 0, 0, -1, -1)
00359     p.drawPixmap(400, 200, hatACD, 0, 0, -1, -1)
00360     p.drawPixmap(300, 580, self.drawGOSEDACD.rainbowPixmap, 0, 0, -1, -1)
00361     p.drawText(300, 610, redLbl)
00362     p.drawText(383, 610, orangeLbl)
00363     p.drawText(466, 610, yellowLbl)
00364     p.drawText(549, 610, greenLbl)
00365     p.drawText(632, 610, blueLbl)
00366     p.drawText(715, 610, violetLbl)
00367     filename = "File: " + str(self.drawGOSEDData.filename.text())
00368     timeStamp = "Timestamp: " + str(self.drawGOSEDData.timeStamp.text())
00369     event = "Event Seq.#:" + str(self.drawGOSEDData.eventNumber.text())
00370     eventTag = "Event Tag: " + str(self.drawGOSEDData.eventTag.text())
00371     flags = str(self.drawGOSEDData.flagLine.text())
00372     p.drawText(300, 650, filename)
00373     p.drawText(300, 670, timeStamp)
00374     p.drawText(300, 690, event)
00375     p.drawText(300, 710, eventTag)
00376     p.drawText(300, 730, flags)
00377     self.headerFont = QFont()
00378     self.headerFont.setFamily("Arial")
00379     self.headerFont.setPointSize(12)
00380     self.headerFont.setBold(1)
00381     p.setFont(self.headerFont)
00382     p.drawText(300, 80, "GLAST ONLINE SINGLE EVENT DISPLAY - GOSED ACD")
00383     p.end()
00384 
00385   def createDockWindows(self):
00386     # Create Dock for GLAST Online Single Event Display TWR Window (GOSEDTWR)
00387     self.__dwGOSEDTWR = QDockWindow()
00388     self.__dwGOSEDTWR.setResizeEnabled(0)
00389     self.__dwGOSEDTWR.setCloseMode(QDockWindow.Always)
00390     self.__dwGOSEDTWR.setCaption('GOSED TWR Display')
00391     #~ self.__teComments = self.__comments.getWidget()
00392     #~ self.__dwGOSEDTWR.setFixedExtentWidth(428)
00393     #~ self.__dwGOSEDTWR.setFixedExtentHeight(315)
00394 
00395     # Create Dock for GLAST Online Single Event Display TKR Window (GOSEDTKR)
00396     self.__dwGOSEDTKR = QDockWindow()
00397     self.__dwGOSEDTKR.setResizeEnabled(0)
00398     self.__dwGOSEDTKR.setCloseMode(QDockWindow.Always)
00399     self.__dwGOSEDTKR.setCaption('GOSED TKR Display')
00400     #~ self.__teComments = self.__comments.getWidget()
00401     self.__dwGOSEDTKR.setFixedExtentWidth(428)
00402     self.__dwGOSEDTKR.setFixedExtentHeight(315)
00403 
00404     # Create Dock for GLAST Online Single Event Display CAL Window (GOSEDCAL)
00405     self.__dwGOSEDCAL = QDockWindow()
00406     self.__dwGOSEDCAL.setResizeEnabled(0)
00407     self.__dwGOSEDCAL.setCloseMode(QDockWindow.Always)
00408     self.__dwGOSEDCAL.setCaption('GOSED CAL Display')
00409     #~ self.__teComments = self.__comments.getWidget()
00410     self.__dwGOSEDCAL.setFixedExtentWidth(428)
00411     self.__dwGOSEDCAL.setFixedExtentHeight(115)
00412 
00413     # Create Dock for GLAST Online Single Event Display CAL & TKR Window (GOSEDCAL)
00414     self.__dwGOSEDCALTKR = QDockWindow()
00415     self.__dwGOSEDCALTKR.setResizeEnabled(0)
00416     self.__dwGOSEDCALTKR.setCloseMode(QDockWindow.Always)
00417     self.__dwGOSEDCALTKR.setCaption('GOSED CAL & TKR Display')
00418     #~ self.__teComments = self.__comments.getWidget()
00419     #~ self.__dwGOSEDCALTKR.setFixedExtentWidth(428)
00420     #~ self.__dwGOSEDCALTKR.setFixedExtentHeight(115)
00421 
00422     # Create Dock for GLAST Online ACD Event Display (GOSEDACD)
00423     self.__dwGOSEDACD = QDockWindow()
00424     self.__dwGOSEDACD.setResizeEnabled(0)
00425     self.__dwGOSEDACD.setCloseMode(QDockWindow.Always)
00426     self.__dwGOSEDACD.setCaption('GOSED ACD Display')
00427     self.__dwGOSEDACD.setNewLine(True)
00428     #~ self.__teComments = self.__comments.getWidget()
00429     self.__dwGOSEDACD.setFixedExtentWidth(428)
00430     self.__dwGOSEDACD.setFixedExtentHeight(428)
00431 
00432     # Create Dock for GLAST Online Single Event Display Data Window(GOSED Data)
00433     self.__dwGOSEDData = QDockWindow()
00434     self.__dwGOSEDData.setResizeEnabled(1)
00435     self.__dwGOSEDData.setCloseMode(QDockWindow.Always)
00436     self.__dwGOSEDData.setCaption('GOSED Data Window')
00437     self.__dwGOSEDData.setNewLine(True)
00438     #~ self.__teComments = self.__comments.getWidget()
00439     self.__dwGOSEDData.setFixedExtentWidth(435)
00440     self.__dwGOSEDData.setFixedExtentHeight(100)
00441 
00442     # Create Dock for GLAST Online Tower Event Display (GOTED)
00443     self.__dwGOTED = QDockWindow()
00444     self.__dwGOTED.setResizeEnabled(1)
00445     self.__dwGOTED.setCloseMode(QDockWindow.Always)
00446     self.__dwGOTED.setCaption('GOTED Display')
00447     #~ self.__teComments = self.__comments.getWidget()
00448     self.__dwGOTED.setFixedExtentWidth(50)
00449     self.__dwGOTED.setFixedExtentHeight(50)
00450 
00451   def dockGOSEDTWR(self):
00452     self.__dwGOSEDTWR.show()
00453     self.GOSEDPreferencesGUI.twr(True)
00454     self.__shown()
00455 
00456   def dockGOSEDTKR(self):
00457     self.__dwGOSEDTKR.show()
00458     self.GOSEDPreferencesGUI.tkr(True)
00459     self.__shown()
00460 
00461   def dockGOSEDCAL(self):
00462     self.__dwGOSEDCAL.show()
00463     self.GOSEDPreferencesGUI.cal(True)
00464     self.__shown()
00465 
00466   def dockGOSEDCALTKR(self):
00467     self.__dwGOSEDCALTKR.show()
00468     self.GOSEDPreferencesGUI.calTkr(True)
00469     self.__shown()
00470 
00471   def dockGOSEDData(self):
00472     self.__dwGOSEDData.show()
00473     self.GOSEDPreferencesGUI.data(True)
00474     self.__shown()
00475 
00476   def dockGOTED(self):
00477     self.__dwGOTED.show()
00478     self.GOSEDPreferencesGUI.ted(True)
00479     self.__shown()
00480 
00481   def dockGOSEDACD(self):
00482     self.__dwGOSEDACD.show()
00483     self.GOSEDPreferencesGUI.acd(True)
00484     self.__shown()
00485 
00486   def updateDockGOSEDTWR(self):
00487     if not self.__dwGOSEDTWR.isVisible():
00488       self.GOSEDPreferencesGUI.twr(False)
00489       self.__shown()
00490 
00491   def updateDockGOSEDTKR(self):
00492     if not self.__dwGOSEDTKR.isVisible():
00493       self.GOSEDPreferencesGUI.tkr(False)
00494       self.__shown()
00495 
00496   def updateDockGOSEDCAL(self):
00497     if not self.__dwGOSEDCAL.isVisible():
00498       self.GOSEDPreferencesGUI.cal(False)
00499       self.__shown()
00500 
00501   def updateDockGOSEDCALTKR(self):
00502     if not self.__dwGOSEDCALTKR.isVisible():
00503       self.GOSEDPreferencesGUI.calTkr(False)
00504       self.__shown()
00505 
00506   def updateDockGOSEDData(self):
00507     if not self.__dwGOSEDData.isVisible():
00508       self.GOSEDPreferencesGUI.data(False)
00509       self.__shown()
00510 
00511   def updateDockGOTED(self):
00512     if not self.__dwGOTED.isVisible():
00513       self.GOSEDPreferencesGUI.ted(False)
00514       self.__shown()
00515 
00516   def updateDockGOSEDACD(self):
00517     if not self.__dwGOSEDACD.isVisible():
00518       self.GOSEDPreferencesGUI.acd(False)
00519       self.__shown()
00520 
00521   def mousePressEvent(self, e):
00522     for i in range(16):
00523       if self.drawGOTED.towerList[i].hasMouse():
00524         Zpm = self.clickTWR(i)
00525         if Zpm is None:
00526           return
00527         twrButton = self.drawGOSEDTWR.selectTWR.find(i)
00528         twrButton.setOn(1)
00529         self.selectChange()
00530         bitBlt(self.drawGOTED.towerList[i], 0, 0, Zpm , 0, 0)
00531 
00532 
00533   def clickTWR(self, id):
00534     if self.drawGOTED.final[id].isNull():
00535       #~ bitBlt(Zpm, 0, 0, self.drawGOTED.noBgrZ , 0, 0)
00536       return
00537     Zpm = QPixmap(self.drawGOTED.towerList[id].width(),
00538                   self.drawGOTED.towerList[id].height())
00539     bitBlt(Zpm, 0, 0, self.drawGOTED.final[id] , 0, 0)
00540     self.pTWR = QPainter(Zpm)
00541     #~ self.pCAL.setBrush(color)
00542     self.pTWR.setPen(QColor("red"))
00543     self.pTWR.drawRect(0,0,
00544                        self.drawGOTED.towerList[id].width(),
00545                        self.drawGOTED.towerList[id].height()
00546                        )
00547     self.pTWR.end()
00548     return Zpm
00549 
00550 
00551   def plot(self, skip = 0):
00552     """ Plot is the heart of GOSED. It strips the information of the event
00553     from the data string and passes it to GOSED_LDF, initializing the
00554     iteration over all the entries of the event.
00555     It manages three kinds of sources of data:
00556     1. Data from .ldf files
00557     2. Data from .fits files
00558     3. Data from server
00559     It also manages the reinizialization of all the gui's outputs, calling
00560     clearviews() to delete the information from a previous event
00561     \param skip - Number of events to skip (ignored if source is not an LDF file)
00562                   Defaults to plotting next event in the file
00563     """
00564 
00565     if self.__file is not None:
00566       if        str(self.__fn).endswith(".ldf", False) \
00567              or str(self.__fn).endswith(".arch", False) \
00568              or str(self.__fn).endswith(".dge", False):
00569 
00570         n = 0
00571         while n <= skip:
00572           evtPtr = self.__file.tell()
00573           #~ print "plot: evtPtr =", evtPtr
00574 
00575           self.__evtList.append(evtPtr)
00576           #~ print "-------> plot: eventList = ", self.__evtList
00577 
00578           data = self.__file.read(8)
00579 
00580           if len(data) < 8:
00581             print "End of File: " , (self.__fn)
00582             #~ self.__pauseDisplay = 1
00583             self.statusBar().message("End of File: %s" % (self.__fn), 2000)
00584             self.Next.setEnabled(0)
00585             self.Previous.setEnabled(1)
00586             self.Go.setEnabled(0)
00587             self.Stop.setEnabled(0)
00588             self.__timer.stop()
00589 
00590             if self.__evtList.count(evtPtr) != 1:
00591               self.__evtList.pop()
00592               #~ print "-------> plot: eventList = ", self.__evtList
00593 
00594             return
00595 
00596           (identity, length) = struct.unpack('!LL', data)
00597           data              += self.__file.read(length - 8)
00598 
00599           if n == skip:  break
00600 
00601           if skip >= 1000:
00602             if n % 1000 == 0:  print n
00603           n += 1
00604 
00605     elif self.__fits is not None:
00606       data = self.__fits.read()
00607       if data is None:
00608         print "End of File: " , (self.__fn)
00609         #~ self.__pauseDisplay = 1
00610         self.statusBar().message("End of File: %s" % (self.__fn), 2000)
00611         self.__timer.stop()
00612         self.Next.setEnabled(0)
00613         self.Go.setEnabled(0)
00614         self.Stop.setEnabled(0)
00615         return
00616 
00617     elif self.__ds is not None:
00618       #import gutil
00619       data, sender = self.__ds.receive()
00620       if data is None or len(data) == 0:
00621         return
00622       #print gutil.hexConvert(data)
00623 
00624     else:
00625       print "No data source open for display"
00626       self.statusBar().message("No data source open for display", 2000)
00627       self.__timer.stop()
00628       return
00629 
00630     # Clear the display
00631     self.drawGOSEDData.totHits.clear()  # RiC 10/30/03 added this line
00632     self.clearViews()                   # RiC 10/30/03 added this line
00633 
00634     # Iterate over all entries for the current data buffer
00635     # RiC: A buffer is allowed to contain more than one event, but doesn't now.
00636     #      May have to rethink this when it does.
00637     self.__ldbi.iterate(data, len(data)) # RiC 4/2/04 switched to the new way
00638 
00639     # Make sure the data doesn't get garbage collected by keeping a link to it
00640     # that will be overwritten by the next event.  The previous one will then
00641     # be garbage collected.  This is important for replotting the asme event.
00642     self.__data = data
00643 
00644   def replot(self):
00645     # Clear the display
00646     self.drawGOSEDData.totHits.clear()  # RiC 10/30/03 added this line
00647     self.clearViews()                   # RiC 10/30/03 added this line
00648 
00649     # Iterate over all entries for the current data buffer
00650     # RiC: A buffer is allowed to contain more than one event, but doesn't now.
00651     #      May have to rethink this when it does.
00652     self.__ldbi.iterate() # RiC 4/2/04 switched to the new way
00653 
00654   def rangeChange(self, buttonId):
00655     self.setGOSEDDefaults()
00656     self.maintainButtons(buttonId, self.drawGOSEDCAL.selectRNG)
00657 
00658   def rangeChange2(self, buttonId):
00659     self.setGOSEDDefaults()
00660     self.maintainButtons(buttonId, self.drawGOSEDCALTKR.selectRNG)
00661 
00662   def maintainButtons(self, buttonId, widget):
00663     button = widget.find(buttonId)
00664     if buttonId == 4:
00665       if button.isChecked():
00666         check = 1
00667       else:
00668         check = 0
00669       for i in range(0,4):
00670         button = widget.find(i)
00671         #~ if button.isEnabled():
00672         button.setChecked(check)
00673     else:
00674       if not button.isChecked():
00675         button = widget.find(4)
00676         button.setChecked(0)
00677     if self.__file is not None or \
00678        self.__fits is not None or \
00679        self.__ds is not None:
00680       self.__ldbi.iterate()
00681     if buttonId == 4:
00682       for i in range(0,4):
00683         button = widget.find(i)
00684         if not button.isEnabled():
00685           button.setChecked(0)
00686 
00687   def scaleChange(self, scaleId):
00688     self.maintainScale(scaleId, self.drawGOSEDCAL)
00689 
00690   def scaleChange2(self, scaleId):
00691     self.maintainScale(scaleId, self.drawGOSEDCALTKR)
00692 
00693   def maintainScale(self, scaleId, window):
00694     if scaleId == 0:
00695       #~ window.selectRNG.setEnabled(1)
00696       #~ window.RNGAll.setChecked(1)
00697       window.CALenergy.setEnabled(1)
00698     else:
00699       #~ window.selectRNG.setEnabled(1)
00700       #~ window.RNGAll.setChecked(1)
00701       window.CALenergy.setEnabled(0)
00702     self.selectChange()
00703 
00704   def selectChange(self):
00705     """ This function is called whenever the user makes a change of selection
00706     in TWR, RNG or Scale, to reload the event with the new filter settings.
00707     """
00708     # Pass the new filter only for the implemented Scale Selections - Not necessary ATK 040706
00709     #~ if (self.drawGOSEDCAL.scaleSelection.currentItem() == 0 or \
00710        #~ self.drawGOSEDCAL.scaleSelection.currentItem() == 1) and\
00711        #~ (self.drawGOSEDCALTKR.scaleSelection.currentItem() == 0 or \
00712         #~ self.drawGOSEDCALTKR.scaleSelection.currentItem() == 1):
00713     if self.__file is not None or \
00714        self.__fits is not None or \
00715        self.__ds is not None:
00716       self.setGOSEDDefaults()
00717       self.__ldbi.iterate()
00718 
00719   def setGOSEDDefaults(self):
00720       #~ self.drawGOSEDCAL.RNGAll.setEnabled(0)
00721       # Reinitialize settings, we have to do it again here since we don't call
00722       # plot() for a new event, we reiterate the current event over a new
00723       # set of filters.
00724       self.clearViews()
00725       self.drawGOSEDData.totHits.setText(str(0))
00726 
00727       # Load backgrounds. We do it here and not in clearviews() not to have a
00728       # white pixmap while the event is being processed.
00729       bitBlt(self.drawXZ_TKR, 0, 0, self.drawXZ_TKR.background)
00730       bitBlt(self.drawYZ_TKR, 0, 0, self.drawYZ_TKR.background)
00731       bitBlt(self.drawXZ_CAL, 0, 0, self.drawXZ_CAL.background)
00732       bitBlt(self.drawYZ_CAL, 0, 0, self.drawYZ_CAL.background)
00733 
00734       bitBlt(self.drawXZ_TKR2, 0, 0, self.drawXZ_TKR2.background)
00735       bitBlt(self.drawYZ_TKR2, 0, 0, self.drawYZ_TKR2.background)
00736       bitBlt(self.drawXZ_CAL2, 0, 0, self.drawXZ_CAL2.background)
00737       bitBlt(self.drawYZ_CAL2, 0, 0, self.drawYZ_CAL2.background)
00738 
00739       bitBlt(self.drawHatACD, 0, 0, self.drawHatACD.background)
00740       bitBlt(self.drawSide1ACD, 0, 0, self.drawSide1ACD.background)
00741       bitBlt(self.drawSide2ACD, 0, 0, self.drawSide2ACD.background)
00742       bitBlt(self.drawSide3ACD, 0, 0, self.drawSide3ACD.background)
00743       bitBlt(self.drawSide4ACD, 0, 0, self.drawSide4ACD.background)
00744 
00745       #~ for i in range(16):
00746         #~ if not self.drawGOTED.final[i].isNull():
00747           #~ bitBlt(self.drawYZ_CAL, 0, 0, self.drawYZ_CAL.background)
00748 
00749     #~ else:
00750       #~ self.statusBar().message("Auto Range not Implemented Yet", 2000)
00751 
00752 
00753   def clearViews(self):
00754     """ This function reloads GOSED defaults in order to process a new event.
00755     """
00756 
00757 #     # Reinitialize final Pixmaps, they need to be Null at the beginning of
00758 #     # each event processing
00759 #     self.drawXZ_TKR.final = QPixmap()
00760 #     self.drawYZ_TKR.final = QPixmap()
00761 #     self.drawXZ_CAL.final = QPixmap()
00762 #     self.drawYZ_CAL.final = QPixmap()
00763 
00764 #     self.drawXZ_TKR2.final = QPixmap()
00765 #     self.drawYZ_TKR2.final = QPixmap()
00766 #     self.drawXZ_CAL2.final = QPixmap()
00767 #     self.drawYZ_CAL2.final = QPixmap()
00768 
00769 #     self.drawHatACD.finalHatACD = QPixmap()
00770 #     self.drawSide1ACD.finalSide1ACD = QPixmap()
00771 #     self.drawSide2ACD.finalSide2ACD = QPixmap()
00772 #     self.drawSide3ACD.finalSide3ACD = QPixmap()
00773 #     self.drawSide4ACD.finalSide4ACD = QPixmap()
00774 
00775 #     #~ for i in range(16):
00776 #       #~ self.drawGOTED.final[i] = QPixmap()
00777 #       #~ bitBlt(self.drawGOTED.towerList[i], 0, 0,
00778 #              #~ self.drawGOTED.noBgrZ, 0, 0)
00779 #       #~ self.drawGOTED.towerList[i].setIcon(QPixmap())
00780 
00781 #     for i in range(16):
00782 #       self.drawGOTED.final[i] = QPixmap()
00783 #       bitBlt(self.drawGOTED.towerList[i], 0, 0,
00784 #              self.drawGOTED.noBgrZ, 0, 0)
00785 
00786     # Separate data from pixmaps - ATK-040405
00787     self.clearButtons()
00788     self.clearPixmaps()
00789 
00790   def clearButtons(self):
00791     # Clear list views
00792     #self.drawGOSEDData.ACDview.clear()
00793     self.drawGOSEDData.acd.clear()
00794     self.drawGOSEDData.TKRview.clear()
00795     self.drawGOSEDData.CALview.clear()
00796     self.drawGOSEDData.diagTKR.clear()
00797     self.drawGOSEDData.diagCAL.clear()
00798     self.drawGOSEDData.error.clear()
00799     self.drawGOSEDData.trigger.clear()
00800 
00801     # Disable button groups
00802     #~ for i in range(self.drawGOSEDTWR.selectTWR.count()): -ATK20050822
00803       #~ twrButton = self.drawGOSEDTWR.selectTWR.find(i)
00804       #~ twrButton.setEnabled(0)
00805       #~ twrButton.setChecked(0)
00806 
00807     for i in range(0,4):
00808       RngButton = self.drawGOSEDCAL.selectRNG.find(i)
00809       RngButton.setEnabled(0)
00810       #~ RngButton.setChecked(0)
00811 
00812     for i in range(0,4):
00813       RngButton = self.drawGOSEDCALTKR.selectRNG.find(i)
00814       RngButton.setEnabled(0)
00815       #~ RngButton.setChecked(0)
00816 
00817     #~ for i in range(16):
00818       #~ self.drawGOTED.towerList[i].setEnabled(0)
00819 
00820 
00821   def clearPixmaps(self):
00822     # Reinitialize final Pixmaps, they need to be Null at the beginning of
00823     # each event processing
00824     self.drawXZ_TKR.clear()
00825     self.drawYZ_TKR.clear()
00826 
00827     self.drawXZ_CAL.clear()
00828     self.drawYZ_CAL.clear()
00829 
00830     self.drawXZ_TKR2.clear()
00831     self.drawYZ_TKR2.clear()
00832     self.drawXZ_CAL2.clear()
00833     self.drawYZ_CAL2.clear()
00834 
00835     self.drawHatACD.clear()
00836     self.drawSide1ACD.clear()
00837     self.drawSide2ACD.clear()
00838     self.drawSide3ACD.clear()
00839     self.drawSide4ACD.clear()
00840 
00841     #~ for i in range(16):
00842       #~ self.drawGOTED.clear()
00843       #~ bitBlt(self.drawGOTED.towerList[i], 0, 0,
00844              #~ self.drawGOTED.noBgrZ, 0, 0)
00845       #~ self.drawGOTED.towerList[i].setIcon(QPixmap())
00846 
00847     for i in range(16):
00848       self.drawGOTED.clear()
00849       bitBlt(self.drawGOTED.towerList[i], 0, 0,
00850              self.drawGOTED.noBgrZ, 0, 0)
00851 
00852   def clearButtonGroups(self):
00853     """ This function unchecks all the buttons. Contrary to clearviews(), this
00854     is only necesary when opening a new file, since we may have changed a
00855     selection in only one parameter (for example RNG only), and thus we don't
00856     want to loose the other filter by unchecking it (for example TWR).
00857     """
00858 
00859     self.Go.setIconSet(QIconSet(self.goPixmap))
00860 
00861     window = self.drawGOSEDData
00862     window.filename.clear()
00863     window.timeStamp.clear()
00864     window.eventNumber.clear()
00865     window.eventTag.clear()
00866     window.flagLine.clear()
00867 
00868     for i in range(0,5):
00869       rngButton = self.drawGOSEDCAL.selectRNG.find(i)
00870       #~ if rngButton.isOn():
00871       rngButton.setChecked(0)
00872 
00873     for i in range(0,5):
00874       rngButton = self.drawGOSEDCALTKR.selectRNG.find(i)
00875       #~ if rngButton.isOn():
00876       rngButton.setChecked(0)
00877 
00878     self.drawXZ_TKR.update()
00879     self.drawYZ_TKR.update()
00880     self.drawXZ_CAL.update()
00881     self.drawYZ_CAL.update()
00882     self.drawXZ_TKR2.update()
00883     self.drawYZ_TKR2.update()
00884     self.drawXZ_CAL2.update()
00885     self.drawYZ_CAL2.update()
00886     self.drawHatACD.update()
00887     self.drawSide1ACD.update()
00888     self.drawSide2ACD.update()
00889     self.drawSide3ACD.update()
00890     self.drawSide4ACD.update()
00891     self.drawRainbowACD.update()
00892     self.drawRainbowCAL.update()
00893     self.drawRainbowCAL2.update()
00894     # GOTED Missing here - ATK 040705
00895 
00896   #~ def clearTWRButtons(self):
00897     for i in range(self.drawGOSEDTWR.selectTWR.count()):
00898       twrButton = self.drawGOSEDTWR.selectTWR.find(i)
00899       if twrButton.isOn():
00900         twrButton.setChecked(0)
00901       twrButton.setEnabled(0)
00902 
00903   def nextClicked(self, skip = 0):
00904     """ Plots next event when called
00905 
00906     \param skip - Number of events to skip, negative means backward.
00907                   Defaults to going forward one 1 event
00908     """
00909 
00910     # INVESTIGATE HOW TO REINICIALIZE THE SELECTED TOWER FOR A NEW EVENT HERE
00911     #~ GOSED_LDF.CALcontributionIterator1.__selectedTower = -1
00912     #~ self.GOSED_LDF.CALcontributionIterator2.__selectedTower = -1
00913     #~ self.GOSED_LDF.TKRcontributionIterator.__selectedTower = -1
00914 
00915     # As easy as this:
00916     self.plot(skip)
00917 
00918     #~ for i in range(16):
00919       #~ twrButton = self.drawGOSEDTWR.selectTWR.find(i)
00920       #~ if twrButton.isChecked():
00921         #~ Zpm = self.clickTWR(i)
00922         #~ if Zpm is None:
00923           #~ return
00924         #~ bitBlt(self.drawGOTED.towerList[i], 0, 0, Zpm , 0, 0)
00925 
00926     # Enable Previous button
00927     if self.__ds is None and self.__fits is None and not self.__timer.isActive():
00928       self.Previous.setEnabled(1)
00929 
00930     # Check if we have no data for either the CAL or the TKR and if so load
00931     # the background. We do it here and not in clearviews() not to have a
00932     # white pixmap while the event is being processed
00933 #     if self.drawGOSEDData.CALview.childCount() == 0:
00934 #       bitBlt(self.drawXZ_CAL, 0, 0, self.drawXZ_CAL.background)
00935 #       bitBlt(self.drawYZ_CAL, 0, 0, self.drawYZ_CAL.background)
00936 
00937 #       bitBlt(self.drawXZ_CAL2, 0, 0, self.drawXZ_CAL2.background)
00938 #       bitBlt(self.drawYZ_CAL2, 0, 0, self.drawYZ_CAL2.background)
00939 
00940 #     if self.drawGOSEDData.TKRview.childCount() == 0:
00941 #       bitBlt(self.drawXZ_TKR, 0, 0, self.drawXZ_TKR.background)
00942 #       bitBlt(self.drawYZ_TKR, 0, 0, self.drawYZ_TKR.background)
00943 
00944 #       bitBlt(self.drawXZ_TKR2, 0, 0, self.drawXZ_TKR2.background)
00945 #       bitBlt(self.drawYZ_TKR2, 0, 0, self.drawYZ_TKR2.background)
00946 
00947 #     if self.drawGOSEDData.acd.childCount() == 0:
00948 #       bitBlt(self.drawHatACD, 0, 0, self.drawHatACD.background)
00949 #       bitBlt(self.drawSide1ACD, 0, 0, self.drawSide1ACD.background)
00950 #       bitBlt(self.drawSide2ACD, 0, 0, self.drawSide2ACD.background)
00951 #       bitBlt(self.drawSide3ACD, 0, 0, self.drawSide3ACD.background)
00952 #       bitBlt(self.drawSide4ACD, 0, 0, self.drawSide4ACD.background)
00953 
00954     #~ if not self.Go.isEnabled():
00955       #~ step = float(str(self.GOSEDPreferencesGUI.timestepValue.text()))
00956       #~ self.__timer.start(step*1000, False)   # seconds in milliseconds
00957      #~ self.__timer.start(500, False)
00958 
00959 
00960   def previousClicked(self, skip = -1):
00961     """ Finds previous event in the file and then plots it. It only
00962     works for .arch files.
00963 
00964     \param skip - Number of events to skip, negative means backward.
00965                   Defaults to going backward one 1 event
00966     """
00967 
00968     if self.__ds is not None:
00969       self.statusBar().message("Previous event is not available", 2000)
00970       self.Previous.setEnabled(0)
00971       return
00972 
00973     if self.__fits is not None:
00974       self.statusBar().message("Can't go to Previous event in a Fits file", 2000)
00975       self.Previous.setEnabled(0)
00976       return
00977 
00978     if self.__file is None:  return
00979 
00980     evtPtr = 0
00981     self.Go.setIconSet(QIconSet(self.goPixmap))
00982 
00983     if self.__evtList != []:
00984       evtPtr = self.__evtList.pop()  # points to beginning of current  event
00985       n = 0
00986       while n > skip:
00987         if self.__evtList == []:  break
00988         evtPtr = self.__evtList.pop()  # points to beginning of previous event
00989         if skip <= -1000:
00990           if n % 1000 == 0:  print n
00991         n -= 1
00992 
00993     self.__file.seek(evtPtr)
00994     self.nextClicked()
00995 
00996     self.Go.setEnabled(1)
00997     self.Next.setEnabled(1)
00998     self.SkipValue.setEnabled(1)
00999     self.Skip.setEnabled(1)
01000 
01001     if evtPtr == 0:
01002       print "Beginning of File: " , (self.__fn)
01003       self.statusBar().message("Beginning of File: %s" % (self.__fn), 2000)
01004       self.Previous.setEnabled(0)
01005 
01006 
01007   def goClicked(self):
01008     """ Load events ininterruptedly in time steps selected by the user from
01009     the GOSED Preferences menu. It stops when the Stop Button is clicked.
01010     """
01011 
01012     if self.__timer.isActive():
01013       self.__timer.stop()
01014       self.Go.setIconSet(QIconSet(self.goPixmap))
01015       # Enable back Browse buttons
01016       if self.__ds is None:
01017         self.Next.setEnabled(1)
01018         self.Skip.setEnabled(1) # ATK20050822
01019       # The Previous button is only enabled for .arch files
01020       if self.__ds is None and self.__fits is None:
01021         self.Previous.setEnabled(1)
01022     else:
01023       self.Go.setIconSet(QIconSet(self.stopPixmap))
01024       # Disable Browse buttons to avoid conflicting signals
01025       #~ self.Go.setEnabled(0)
01026       self.Previous.setEnabled(0)
01027       self.Next.setEnabled(0)
01028       #~ self.Stop.setEnabled(1)
01029       self.SkipValue.setEnabled(0)
01030       self.Skip.setEnabled(0)
01031       step = float(str(self.GOSEDPreferencesGUI.timestepValue.text()))
01032       self.__timer.start(step*1000, False)   # seconds in milliseconds
01033 
01034   def stopClicked(self):
01035     """ Stop the ininterrupted display of events triggered by the Go Button
01036     """
01037     self.__timer.stop()
01038 
01039     # Enable back Browse buttons
01040     self.Go.setEnabled(1)
01041     self.Stop.setEnabled(0)
01042     if self.__ds is None:
01043       self.Next.setEnabled(1)
01044     # The Previous and Skip buttons are only enabled for LDF files
01045     if self.__ds is None and self.__fits is None:
01046       self.Previous.setEnabled(1)
01047       self.SkipValue.setEnabled(1)
01048       self.Skip.setEnabled(1)
01049 
01050   def skipClicked(self):
01051     """ Skip events forward or backward in an LDF file.
01052     A skip amount of:
01053        1 => display next event
01054        0 => replot current event
01055       -1 => display previous event
01056        N => display event with Event Number = current event's Event Number + N
01057       -N => display event with Event Number = current event's Event Number - N
01058     """
01059     try:
01060       skipAmount = int(str(self.SkipValue.text()))
01061     except (TypeError, ValueError):
01062       self.statusBar().message("Skip value must be a positive or negative integer")
01063       return
01064 
01065     if skipAmount > 0:
01066       self.nextClicked(skipAmount - 1)
01067     else:
01068       self.previousClicked(skipAmount)
01069 
01070   def fileOpen(self):
01071     """ Load data from a file
01072     """
01073 
01074     # Prevent that gui gets hanged up if Cancel button is clicked at the dialog window
01075     self.__fn_Old = self.__fn
01076     self.__timer.stop()
01077 
01078     self.__fn = QFileDialog.getOpenFileName(QString.null, "(*.ldf *.arch *.fits *.dge)", self)
01079 
01080     # If Cancel was clicked in the File Open dialog reload existing file and return
01081     if str(self.__fn) == "":
01082       self.__fn = self.__fn_Old
01083       return
01084 
01085     if not self.__fn.endsWith(".arch") and not self.__fn.endsWith(".ldf") and not str(self.__fn).endswith(".fits"):
01086       self.statusBar().message("Can't display a File other than with extension .arch or .fits", 2000)
01087       self.__fn = self.__fn_Old
01088       return
01089 
01090     # Close previous data sources
01091     if self.__ds is not None:
01092       self.serverClose()
01093 
01094     self.fileClose()
01095 
01096     # Flag to check which one is my first tower and range in the File
01097     self.firstTower = None
01098     self.firstRNG   = None
01099     self.firstRNG2  = None
01100 
01101     # Setup Browse buttons
01102     self.Go.setEnabled(1)
01103     self.Go.setIconSet(QIconSet(self.goPixmap))
01104     self.Next.setEnabled(1)
01105     self.Previous.setEnabled(0)
01106     self.Stop.setEnabled(1)
01107 
01108     if self.__fn.endsWith(".fits"):
01109       try:
01110         from LATTE.runcontrol import rcFitsWriter
01111       except (ImportError, IOError), e:
01112         raise "rcFitsWriter or one of its dependencies not available: %s" % e
01113         self.statusBar().message("Dependencies to read FITS file not available", 2000)
01114         
01115       self.__fits = rcFitsWriter.rcFitsWriter(fileName=str(self.__fn), mode=rcFitsWriter.MODE_READONLY, format=rcFitsWriter.FORMAT_BYTE)
01116     else:
01117       self.__file = open(str(self.__fn), 'rb')
01118       self.SkipValue.setEnabled(1)
01119       self.Skip.setEnabled(1)
01120 
01121     self.__evtList = []
01122 
01123 
01124     self.statusBar().message("Beginning of File: %s" % (self.__fn), 2000)
01125     self.drawGOSEDData.filename.setText(str(self.__fn))
01126     self.drawGOSEDTWR.selectTWR.setEnabled(1)
01127     #~ if int(self.drawGOSEDCAL.scaleSelection.currentItem()) == 1:
01128       #~ self.drawGOSEDCAL.selectRNG.setEnabled(1)
01129       #~ self.drawGOSEDCALTKR.selectRNG.setEnabled(1)
01130     self.GOSEDPreferencesGUI.setCustomEnabled(1)
01131     self.GOSEDPreferencesGUI.setCustomEnabled2(1)
01132     self.GOSEDPreferencesGUI.setACDCustomEnabled(1)
01133 
01134     # Plot data
01135     self.plot()
01136 
01137 
01138   def fileClose(self):
01139     """ Close file source
01140     """
01141     self.__timer.stop()
01142 
01143     #INVESTIGATE HOW TO REINICIALIZE THE SELECTED TOWER FOR A NEW EVENT HERE
01144     #~ self.selectTWR.setButton(-1)
01145 
01146     if self.__file is not None:
01147       self.__file.close()
01148       self.__file = None
01149     elif self.__fits is not None:
01150       self.__fits.close()
01151       self.__fits = None
01152     else:
01153       self.statusBar().message("No file open for display", 2000)
01154       return
01155 
01156     # Reinitialize everything
01157     self.clearViews()
01158     self.GOSEDPreferencesGUI.setCustomEnabled(0)
01159     self.GOSEDPreferencesGUI.setACDCustomEnabled(0)
01160 
01161     self.drawGOSEDTWR.selectTWR.setEnabled(0)
01162     #~ self.drawGOSEDCAL.selectRNG.setEnabled(0)
01163     #~ self.drawGOSEDCALTKR.selectRNG.setEnabled(0)
01164     self.clearButtonGroups()
01165 
01166 
01167   def __shown(self):
01168     self.GOSEDPreferencesGUI.twr(self.__dwGOSEDTWR.isVisible())
01169     self.GOSEDPreferencesGUI.calTkr(self.__dwGOSEDCALTKR.isVisible())
01170     self.GOSEDPreferencesGUI.data(self.__dwGOSEDData.isVisible())
01171     self.GOSEDPreferencesGUI.tkr(self.__dwGOSEDTKR.isVisible())
01172     self.GOSEDPreferencesGUI.acd(self.__dwGOSEDACD.isVisible())
01173     self.GOSEDPreferencesGUI.cal(self.__dwGOSEDCAL.isVisible())
01174     self.GOSEDPreferencesGUI.ted(self.__dwGOTED.isVisible())
01175 
01176   def fileExit(self):
01177     """ Exits the gui
01178     """
01179     if self.__file is not None:
01180       self.fileClose()
01181     else:
01182       self.serverClose()
01183     self.__timer.stop()
01184     self.GOSEDPreferencesGUI.saveViews()
01185     self.close()
01186 
01187   def serverOpen(self, state):
01188     """  Load event data from a network server
01189     """
01190     try:
01191       import LATTE.tools.DataDistributorPoll as DDP
01192     except IOError, e:
01193       myLog.warning("Unable to connect to Data Distribution server due to: %s" % e)
01194       self.statusBar().message("Unable to connect to Data Distribution server due to: %s" % e, 2000)
01195       #~ print "Unable to connect to Data Distribution server"
01196     
01197     if state:
01198       # Close previous data sources
01199       if self.__file is not None or self.__fits is not None:
01200         self.fileClose()
01201         self.SkipValue.setEnabled(0)
01202         self.Skip.setEnabled(0)
01203 
01204       # Obsolete
01205       #~ """Flag to check which one is my first tower and range in the File"""
01206       self.firstTower = None
01207       self.firstRNG   = None
01208       self.firstRNG2  = None
01209 
01210       server = str(self.ServerPreferencesGUI.selectedServer.text())
01211       print "Listening on data server", server
01212       if server == "":
01213         return
01214 
01215       dsName = 'LAT_EBFdata'
01216       if self.__ds is None:
01217         self.__ds = DDP.DataDistributorPoll(dsName)
01218         if self.__ds is not None:
01219           self.__ds.connect(server)
01220           self.__ds.start()
01221           self.drawGOSEDTWR.selectTWR.setEnabled(1)
01222           #~ if int(self.drawGOSEDCAL.scaleSelection.currentItem()) == 1:
01223             #~ self.drawGOSEDCAL.selectRNG.setEnabled(1)
01224             #~ self.drawGOSEDCALTKR.selectRNG.setEnabled(1)
01225           self.GOSEDPreferencesGUI.setCustomEnabled(1)
01226           self.GOSEDPreferencesGUI.setCustomEnabled2(1)
01227           self.GOSEDPreferencesGUI.setACDCustomEnabled(1)
01228           self.stopClicked()
01229           self.goClicked()
01230         else:
01231           print "Unable to connect to Data Distribution server", dsName
01232     else:
01233       self.stopClicked()
01234       self.Go.setEnabled(0)
01235       self.serverClose()
01236 
01237 
01238   def serverClose(self):
01239     """  Close network server
01240     """
01241     if self.__ds is not None:
01242       self.__ds.stop()
01243       self.__ds.disconnect()
01244       self.__ds = None
01245       self.clearViews()
01246       self.clearButtonGroups()
01247 
01248   def ServerPreferences(self):
01249     """ Calls the Server Preferences window stopping the timer.
01250     """
01251     self.__timer.stop()
01252     self.serverClose()
01253     self.ServerPreferencesGUI.exec_loop()
01254     self.serverOpen(True)
01255     #~ self.Go.setIconSet(QIconSet(self.goPixmap))
01256 
01257 
01258 
01259   def GOSEDPreferences(self):
01260     """ Calls the GOSED Preferences window stopping the timer. It also
01261     passes the new settings to GOSED.
01262     """
01263 
01264     startTimer = False
01265     if self.__timer.isActive():
01266       self.__timer.stop()
01267       startTimer = True
01268 
01269     self.GOSEDPreferencesGUI.exec_loop()
01270 
01271     #~ if self.GOSEDPreferencesGUI.EventlimitsButton.isChecked():
01272       #~ self.preferredLimits = "Event"
01273     if self.GOSEDPreferencesGUI.CALlimitsButton.isChecked():
01274       self.preferredLimits = "Default"
01275     elif self.GOSEDPreferencesGUI.CustomlimitsButton.isChecked():
01276       self.preferredLimits = "Custom"
01277 
01278     if self.GOSEDPreferencesGUI.CALlimitsButton2.isChecked():
01279       self.preferredLimits2 = "Default"
01280     elif self.GOSEDPreferencesGUI.CustomlimitsButton2.isChecked():
01281       self.preferredLimits2 = "Custom"
01282 
01283     # Obsolete:
01284     #~ if self.GOSEDPreferencesGUI.energyScaleButton.isChecked():
01285       #~ self.preferredScale = "Energy"
01286       #~ self.CALenergy.setEnabled(1)
01287     #~ elif self.GOSEDPreferencesGUI.rangeScaleButton.isChecked():
01288       #~ self.preferredScale = "Range"
01289       #~ self.CALenergy.setEnabled(0)
01290 
01291     # Return if no data source is loaded
01292     if (self.__file is None) and (self.__fits is None) and (self.__ds is None):
01293       return
01294 
01295     # Reload Go Icon
01296     self.Go.setIconSet(QIconSet(self.goPixmap))
01297 
01298     # If there is no event loaded click next (plot), otherwise reload the
01299     # same event with the new settings
01300     if self.__evtList == []:
01301       self.nextClicked()
01302     else:
01303       self.clearViews()
01304       # Obsolete:
01305       #~ self.existsTWRdata = 0
01306       #~ self.existsCALTWRdata = 0
01307       self.__ldbi.iterate()
01308 
01309     if startTimer:
01310       step = float(str(self.GOSEDPreferencesGUI.timestepValue.text()))
01311       self.__timer.start(step*1000, False)
01312       self.Go.setIconSet(QIconSet(self.stopPixmap))
01313 
01314   def closeEvent(self, e):
01315     self.GOSEDPreferencesGUI.saveGOSEDSize()
01316     e.accept()
01317 
01318   def helpOnline(self):
01319     """This function opens a web browser with I&T URL for reference.
01320     """
01321     import webbrowser
01322     webbrowser.open('http://www-glast.slac.stanford.edu/IntegrationTest/ONLINE/Default.htm')
01323 
01324 
01325   def helpContents(self):
01326     """ Calls GOSED Readme file for reference.
01327     """
01328     self.GOSEDReadme = GOSEDReadme()
01329     self.GOSEDReadme.exec_loop()
01330 
01331 
01332   def helpAbout(self):
01333     """ Displays About GOSED info
01334     """
01335     QMessageBox.about(self,'Help About',
01336                            '                              GLAST Online Single Event Display\n' +
01337                            '                                  ' +
01338                            'I&T Online - Alicia T. Kavelaars\nhttp://www-glast.slac.stanford.edu/' +
01339                            'IntegrationTest/ONLINE/contact.htm\n' +
01340                            '                                      Copyright 2003 by\n' +
01341                            '       The Board of Trustees of the Leland Stanford Junior University.\n' +
01342                            '                                       All rights reserved.')
01343 
01344 
01345 if __name__ == "__main__":
01346   import os
01347   a = QApplication(sys.argv)
01348   QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
01349   if os.name == 'posix':
01350     font = a.font()
01351     size = font.pointSize()
01352     if size > 8:
01353       font.setPointSize ( 8 )
01354       a.setFont ( font, True )
01355   #if len(sys.argv) == 2:
01356   #  w = singleEvtDisplayImpl(sys.argv[1])
01357   #else:
01358   w = singleEvtDisplayImpl()
01359   a.setMainWidget(w)
01360   w.show()
01361   a.exec_loop()

Generated on Fri Jul 21 13:26:28 2006 for LATTE R04-12-00 by doxygen 1.4.3