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:
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:
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()