00001 #!/usr/local/bin/python 00002 # 00003 # Copyright 2004 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__ = "Event archiver class" 00012 __author__ = "S. Tuvi <stuvi@SLAC.Stanford.edu> SLAC - GLAST LAT I&T/Online" 00013 __date__ = "02/13/2003" 00014 __version__ = "$Revision: 2.3 $" 00015 __credits__ = "SLAC" 00016 00017 from time import gmtime, strftime 00018 import os 00019 from struct import unpack 00020 from struct import pack 00021 00022 from LATTE.client.gEvtCli import EvtCli 00023 00024 MODE_CREATE = 0 00025 MODE_APPEND = 1 00026 MODE_READONLY = 2 00027 00028 class rcArchiver(object): 00029 """\brief Event Archiver 00030 00031 Default event archiver class to store event data to a file. 00032 This class can be inherited to create a custom event class and 00033 using it from a RunControl class by calling the setArchiverClass 00034 method. 00035 """ 00036 00037 def __init__(self, filePath=None, fileName=None, mode=MODE_CREATE, userId=123): 00038 if fileName is None: 00039 ts = strftime('%y%m%d%H%M%S', gmtime()) 00040 self.__fileName = rcArchiver.getFileNameFromTS(ts) 00041 else: 00042 self.__fileName = fileName 00043 if filePath is None: 00044 self.__filePath = "" 00045 else: 00046 self.__filePath = filePath + os.sep 00047 self.__mode = mode 00048 if mode == MODE_CREATE: 00049 fileMode = 'w+b' 00050 self.__archFile = file(os.path.join(self.__filePath, self.__fileName), fileMode) 00051 elif mode == MODE_APPEND: 00052 fileMode = 'a+b' 00053 self.__archFile = file(os.path.join(self.__filePath, self.__fileName), fileMode) 00054 elif mode == MODE_READONLY: 00055 fileMode = 'rb' 00056 self.__archFile = None 00057 self.__evtCli = EvtCli() 00058 self.__evtCli.open(os.path.join(self.__filePath, self.__fileName), fileMode) 00059 else: 00060 raise RuntimeError, "Invalid archive file mode" 00061 00062 def write(self, rawEventData): 00063 if not self.__archFile.closed: 00064 self.__archFile.write(rawEventData) 00065 00066 def writeTuple(self, tuple): 00067 for item in tuple: 00068 self.__archFile.write(item) 00069 00070 def read(self): 00071 try: 00072 (header, dat) = self.__evtCli.read() 00073 return dat 00074 except: 00075 return None 00076 00077 def close(self): 00078 if self.__mode == MODE_READONLY: 00079 self.__evtCli.close() 00080 else: 00081 self.__archFile.close() 00082 00083 def isClosed(self): 00084 return self.__archFile.closed 00085 00086 def getFileName(self): 00087 return self.__fileName 00088 00089 def getFilePath(self): 00090 return self.__filePath 00091 00092 def getFileNameFromTS(ts): 00093 return ts + ".ldf" 00094 getFileNameFromTS = staticmethod(getFileNameFromTS) 00095