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 LAT Data Format (LDF) data dumper functions for Beam Test" 00012 __author__ = "R. Claus <Claus@SLAC.Stanford.edu> SLAC - GLAST LAT I&T/Online" 00013 __date__ = "6/17/2006" 00014 __version__ = "$Revision: 1.1 $" 00015 __credits__ = "SLAC" 00016 00017 import copyright_SLAC 00018 00019 import os, stat, struct 00020 00021 import LDF 00022 00023 import LDFdumper as LD 00024 from LDFdumper import _u 00025 00026 from LDFdump import myLATcomponentIterator 00027 from ancillaryContribution import AncillaryContribution 00028 00029 import sys 00030 00031 00032 def _testDg(dgBuf): 00033 """Iterate over a buffer containing a list of LATdatagrams. 00034 """ 00035 class myEBFeventIterator(LDF.LDBI_EBFeventIterator): 00036 def __init__(self, lci): 00037 LDF.LDBI_EBFeventIterator.__init__(self, lci) 00038 self.__lci = lci 00039 00040 def process(self, evt): 00041 LD.EBFevent(evt).dump() 00042 if evt.status() != 0: 00043 print 00044 print "Bad status %d in event header" % (evt.status()) 00045 print "Aborting processing of event" 00046 print 00047 return evt.status() 00048 else: 00049 self.__lci.iterate(evt) 00050 return self.__lci.status() 00051 00052 def handleError(self, event, code, p1, p2): 00053 if code == LDF.EBFeventIterator.ERR_NonEBFevent: 00054 print >> sys.stderr, "EBFeventIterator::iterate: ", \ 00055 "Encountered a non-EBFevent datagram contribution ", \ 00056 "with typeId %08x\n" % (p1) 00057 return 1 00058 else: 00059 print >> sys.stderr, "myEBFeventIterator.handleError got unknown error code:", \ 00060 " code=%d, p1=%d, p2=%d\n" % ( code, p1, p2) 00061 return 0 00062 00063 class myASCtileContributionIterator(LD.ASCtileContributionIteratorDump): 00064 def __init__(self): 00065 LD.ASCtileContributionIteratorDump.__init__(self) 00066 00067 class myASCcontributionIterator(LD.ASCcontributionIteratorDump): 00068 def __init__(self): 00069 LD.ASCcontributionIteratorDump.__init__(self) 00070 00071 class myLATcontributionIterator(LDF.LDBI_LATcontributionIterator): 00072 __typeIds = [AncillaryContribution.EventId, 00073 AncillaryContribution.HeaderId, 00074 AncillaryContribution.TrailerId] 00075 def __init__(self, eei): 00076 LDF.LDBI_LATcontributionIterator.__init__(self, eei) 00077 00078 def handleError(self, contribution, code, p1, p2): 00079 if code == LDF.LATcontributionIterator.ERR_UDFcontribution: 00080 typeId = _u(p1) 00081 if typeId & 0x000fffff in myLATcontributionIterator.__typeIds: 00082 import Numeric 00083 buffer = Numeric.fromstring(contribution.string(0), 'i') 00084 i = 0 00085 prefix = " " 00086 print "ANC:" 00087 print "%s %08x, %08x, %08x, %08x" % (prefix, 00088 _u(buffer[0 ]),_u(buffer[i+1]), 00089 _u(buffer[i+2]),_u(buffer[i+3])) 00090 print 00091 return 0 00092 else: 00093 print >> sys.stderr, "LATcontributionIterator::UDF: ", \ 00094 "Found unrecognized LATdatagram contribution type 0x%08X" % \ 00095 (typeId) 00096 return -1 00097 else: 00098 print >> sys.stderr, "myLATcontributionIterator.handleError got unknown error code:", \ 00099 " code=%d, p1=%d, p2=%d\n" % ( code, p1, p2) 00100 return 0 00101 00102 def ASC(self, start, end): 00103 print "" 00104 print "ASC" 00105 asci = myASCcontributionIterator() 00106 asci.iterate(start) 00107 return asci.status() 00108 00109 class myLATdatagramIterator(LDF.LDBI_LATdatagramIterator): 00110 def __init__(self, lci): 00111 LDF.LDBI_LATdatagramIterator.__init__(self, lci) 00112 self.__lci = lci 00113 00114 def handleError(self, contribution, code, p1, p2): 00115 if code == LDF.LATdatagramIterator.ERR_IDmismatch: 00116 print >> sys.stderr, "LATdatagramIterator.iterate: ", \ 00117 "Identity mismatch: got %08x, expected %08x\n" % \ 00118 (p1, p2) 00119 return -1 00120 else: 00121 print >> sys.stderr, "myLATcontributionIterator.handleError got unknown error code:", \ 00122 " code=%d, p1=%d, p2=%d\n" % ( code, p1, p2) 00123 return 0 00124 00125 def process(self, dg): 00126 LD.LATdatagram(dg).dump() 00127 00128 self.__lci.iterate(dg) # Returns the number of objects iterated over 00129 status = self.__lci.status() 00130 if status: print "Datagram iteration returned status 0x%08x = %d" % \ 00131 (_u(status), _u(status)) 00132 00133 return 0 00134 00135 latCompIt = myLATcomponentIterator() 00136 ebfEvtIt = myEBFeventIterator(latCompIt) 00137 ascContIt = myASCcontributionIterator() 00138 latContIt = myLATcontributionIterator(ebfEvtIt) 00139 latDgIt = myLATdatagramIterator(latContIt) 00140 latDataBufIt = LDF.LATdataBufferIterator(latDgIt) 00141 00142 latDataBufIt.iterate(dgBuf, len(dgBuf)) # Returns # of objects iterated over 00143 return latDgIt.status() 00144 00145 def testDG(dg): 00146 _testDg(dg) 00147 00148 def testRaw(filename="muon-5.arch", skip=0, saveFile=None): 00149 """This function is meant for use with datagram encapsulated EBF event files. 00150 It assumes the first contribution to the datagram is an EBF event and ignores 00151 any subsequent contributions. An EBF event as defined here contains an 00152 identification value in its first longword and is followed by the raw EBF 00153 event format as described in the TEM, AEM, GEM, etc. documents. 00154 """ 00155 ebfFile = open(filename, 'rb') 00156 fileLen = os.stat(filename)[stat.ST_SIZE] 00157 if saveFile is not None: saveFile = open(saveFile, 'wb') 00158 n = 0 00159 00160 while fileLen > 0: 00161 try: 00162 data = ebfFile.read(8) 00163 if len(data) < 8: break 00164 (identity, length) = struct.unpack('!LL', data) 00165 data += ebfFile.read(length - 8) 00166 00167 if n == skip: 00168 if saveFile is not None: saveFile.write(data) 00169 print 00170 status = _testDg(data) 00171 if status > 0: break 00172 if status < 0: 00173 skip = -status 00174 n = 0 00175 else: 00176 if n % 30000 == 0: 00177 print "\n%7d" % (n), 00178 else: 00179 if n % 1000 == 0: 00180 print ".", 00181 n += 1 00182 00183 fileLen -= length 00184 except KeyboardInterrupt: 00185 n = skip 00186 except MemoryError, e: 00187 print "MemoryError exception: ", e 00188 print "Length = 0x%08x" % length 00189 00190 if saveFile is not None: saveFile.close() 00191 ebfFile.close() 00192 00193 00194 if __name__ == '__main__': 00195 import sys 00196 00197 def usage(): 00198 print "%s <filename>" % sys.argv[0] 00199 print 00200 print " runs testRaw(<filename>)" 00201 print 00202 print "Other functions are available by running with python -i:" 00203 print " test(<string buffer>)" 00204 print " testEBF(<filename>, <identity>)" 00205 print " testRaw(<filename>, <skip count>, <save filename>" 00206 print " testFITS(<filename>)" 00207 print " testFITS_Dist(<filename>, <multicast address>)" 00208 print " testRaw_Dist(<server>)" 00209 print " testHex(<filename>)" 00210 00211 00212 if len(sys.argv) == 1: 00213 usage() 00214 else: 00215 testRaw(sys.argv[1])