00001 from GaudiPython.GaudiAlgs import GaudiAlgo
00002 from GaudiPython import SUCCESS, FAILURE
00003 from DybPython.DybPythonAlg import DybPythonAlg
00004
00005 class SpadeAlgo(DybPythonAlg):
00006
00007 SITE_SAB = 32
00008
00009 def __init__(self, name="SpadeAlg"):
00010 DybPythonAlg.__init__(self, name)
00011 self.fss = None
00012 self.opened = []
00013 self.tomark = []
00014 self.marked = []
00015 import DybPython.Control
00016 DybPython.Control.nuwa.spadeSvc = self
00017 return
00018
00019
00020 def initialize(self):
00021 status = DybPythonAlg.initialize(self)
00022 if status.isFailure(): return status
00023
00024 self.site = None
00025 self.startTime = None
00026 self.endTime = None
00027 self.fss = self.svc('IRootIOFileStateSvc','RootIOFileStateSvc')
00028
00029 self.debug('Initialized "%s"' % self.name())
00030 return status
00031
00032
00033 def execute(self):
00034
00035
00036 header = self.get('/Event/Readout/ReadoutHeader')
00037 if None == header:
00038 self.debug("Got no ReadoutHeader")
00039 return SUCCESS
00040 from time import gmtime, strftime, timezone
00041 data = header.readout()
00042 if not data:
00043 data = header.daqCrate()
00044 if not data:
00045 self.warning("got no readout nor daqcrate from ReadoutHeader")
00046 return SUCCESS
00047
00048 eventTime = data.triggerTime().GetSeconds()
00049
00050
00051
00052
00053 if None == self.startTime:
00054 self.site = header.context().GetSite()
00055 self.startTime = eventTime
00056 self.endTime = eventTime
00057
00058 self._update_output_files()
00059 self._make_sems(self.tomark)
00060 return SUCCESS
00061
00062
00063 def finalize(self):
00064
00065
00066
00067 self.debug("final cleanup")
00068 self._update_output_files()
00069 self._make_sems(self.tomark)
00070 self._make_sems(self.opened)
00071 return DybPythonAlg.finalize(self)
00072
00073
00074 def _make_sems(self,filenames):
00075 'Make sem files corresponding to all given filenames'
00076 self.debug('marking: %s'%filenames)
00077
00078
00079
00080 filenames = list(filenames)
00081
00082 for fn in filenames:
00083 self._make_one_sem(fn)
00084 self.marked.append(fn)
00085 self.debug('marked= %s' % self.marked)
00086 self.debug('tomark= %s' % self.tomark)
00087 try:
00088 self.tomark.remove(fn)
00089 except ValueError:
00090 pass
00091 continue
00092 return
00093
00094
00095 def _listify(self,vector):
00096 'Turn an STL vector into a Python list'
00097 l = []
00098 siz = vector.size()
00099 for ind in range(siz):
00100 l.append(vector[ind])
00101 return l
00102
00103
00104 def _update_output_files(self):
00105 'Update list of opened and tomark files'
00106 self.opened = self._listify(self.fss.openOutput())
00107
00108 closed = self._listify(self.fss.closedOutput())
00109 for fn in closed:
00110 if fn not in self.marked and fn not in self.tomark:
00111 self.debug('new file to mark: "%s"'%fn)
00112 self.tomark.append(fn)
00113 pass
00114 continue
00115 return
00116
00117 def _make_one_sem(self,filename):
00118 'Make a sem file based on given filename'
00119
00120 self.debug('making sem file for "%s"'%filename)
00121
00122 from Metadata import Metadata
00123 from os.path import basename
00124
00125 basePath = self.fileBase(filename)
00126 metadata = Metadata(basename(basePath))
00127
00128 try:
00129 metadata.subcategory = self.subcategory
00130 except AttributeError:
00131 metadata.subcategory = 'unclassified'
00132
00133
00134 if None != self.site:
00135 metadata.sensor = metadata.SENSOR_SAB
00136
00137 from time import gmtime, strftime
00138 if None == self.startTime:
00139 start = gmtime()
00140 else:
00141 start = gmtime(int(self.startTime) - 1)
00142 pass
00143 metadata.startTime = start
00144 if None == self.endTime:
00145 end = gmtime()
00146 else:
00147 end = gmtime(int(self.endTime) + 1)
00148 pass
00149 metadata.endTime = end
00150
00151 metadata.commandLine = self.getCommandLine()
00152 outFile = open(basePath + '.meta.xml', 'w')
00153 outFile.write(metadata.createXML().toxml())
00154 outFile.close()
00155 return SUCCESS
00156
00157 def fileBase(self,
00158 filename):
00159 cut = filename.rfind('.')
00160 if -1 == cut:
00161 return filename
00162 return filename[:cut]
00163
00164 def getCommandLine(self):
00165 import sys
00166 result = ''
00167 for arg in sys.argv:
00168 if 0 != len(result):
00169 result += ' '
00170 quote = ''
00171 if -1 != arg.find(' '):
00172 quote = '"'
00173 result += quote
00174 result += arg.replace('"',
00175 '\\"') + quote
00176 return result