00001
00002
00003
00004 from DybPython.DybPythonAlg import DybPythonAlg
00005 from GaudiPython import SUCCESS, FAILURE
00006 from GaudiPython import gbl
00007 import ROOT
00008 from UserTagging.Models import TagSet, Tag, Data, Int, Float, IntArray, FloatArray
00009
00010 class UserTaggingAlg(DybPythonAlg):
00011 '''
00012 Abstract Class for Saving UserTag and UserData
00013
00014 The following demostrate the layout of UserTaggingAlg:
00015
00016 UserTaggingAlg
00017 |
00018 |
00019 ----------------
00020 | |
00021 | |
00022 tagSet 'other members ...'
00023 |
00024 |
00025 -------------
00026 | | |
00027 | | |
00028 Tag1 Tag2 ...
00029 |
00030 |
00031 ----------------------------------
00032 | | | | |
00033 | | | | |
00034 dataSet path header isTagged ...
00035 |
00036 |
00037 -------------
00038 | | |
00039 | | |
00040 Data1 Data2 ...
00041 |
00042 |
00043 ---------------------------
00044 | | | |
00045 | | | |
00046 paraSet path header ...
00047 |
00048 |
00049 -------------
00050 | | |
00051 | | |
00052 Para1 Para2 ...
00053 '''
00054
00055 def __init__(self,name):
00056 DybPythonAlg.__init__(self,name)
00057
00058
00059
00060
00061 tmp = gbl.std.vector('float')();
00062 return
00063
00064
00065 def initialize(self):
00066
00067 '''
00068 User need not implement, but if so, you must call this method on the
00069 super-class'''
00070
00071 status = DybPythonAlg.initialize(self)
00072 if status.isFailure(): return status
00073
00074
00075 self.tagSet = TagSet()
00076
00077 status = self.initTagList()
00078 if status == FAILURE:
00079 self.error('error in initTagList() function')
00080 return FAILURE
00081
00082 self.execNumber = 1
00083
00084 return SUCCESS
00085
00086
00087 def initTagList(self):
00088 '''
00089 Child Class should overwrite this function.
00090 Child Class should initialize UserTag and UserData here
00091
00092 example adding Tag:
00093 self.addTag('AD' , '/Event/UserTag/Detector/AD')
00094
00095 or alternative (pythonic) syntax:
00096 self.tagSet.AD = Tag('/Event/UserTag/Detector/AD')
00097
00098 example adding a Dummy Tag and UserData:
00099 self.addTag('Dummy', ''
00100 ).addData('ADReadoutData', '/Event/UserData/AD/ADReadoutData'
00101 ).addInt('nChannels', 'nHits'
00102 ).addFloat('chargeSum')
00103
00104 or alternative (pythonic) syntax:
00105 self.tagSet.Dummy = Tag()
00106 self.tagSet.Dummy.dataSet.ADReadoutData = Data('/Event/UserData/AD/ADReadoutData')
00107 paraSet = self.tagSet.Dummy.dataSet.ADReadoutData.paraSet
00108 paraSet.nChannels = Int()
00109 paraSet.nHits = Int()
00110 paraSet.chargeSum = Float()
00111 '''
00112
00113
00114 def addTag(self, name, path=''):
00115 """
00116 Add one UserTag by name, provide a path to cause the tag
00117 object to be sent through I/O.
00118
00119 Can also do:
00120
00121 self.tagSet.<name> = Models.Tag([path])
00122 """
00123 return self.tagSet.addTag(name, path)
00124
00125
00126 def getTag(self, name):
00127 """
00128 Look the UserTagHeader a tag by name.
00129
00130 Can also do:
00131
00132 mytag = self.tagSet.<name>
00133 """
00134 return self.tagSet.get(name)
00135
00136
00137 def tagIt(self, name):
00138 """
00139 Tag the named UserTag.
00140
00141 Can also do:
00142
00143 self.tagSet.<name>.tagIt()
00144 """
00145 return self.tagSet.get(name).tagIt()
00146
00147
00148 def reset(self):
00149 '''Reset the Tag States'''
00150
00151 for tag in self.tagSet.all():
00152 if tag.isTagged:
00153 if tag.path:
00154 tag.header = gbl.DayaBay.HeaderObject()
00155 ROOT.SetOwnership(tag.header,False)
00156 for data in tag.dataSet.all():
00157 data.header = gbl.DayaBay.UserDataHeader()
00158 ROOT.SetOwnership(data.header,False)
00159 tag.isTagged = False
00160
00161
00162 def check(self, evt):
00163 '''Child Class should overwrie this function'''
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 pass
00176
00177
00178 def config(self, evt):
00179 '''
00180 Configure the UserTagHeader and UserDataHeader object
00181 Child class can overwrite depends on the situation.
00182
00183 The "evt" is the transient event store object.
00184 '''
00185
00186 for tag in self.tagSet.all():
00187 if tag.isTagged:
00188 baseHeader = evt[tag.baseHeader]
00189 if not baseHeader:
00190 self.error(tag.baseHeader + ' does not exist')
00191 return FAILURE
00192 if tag.path:
00193 tagHeader = tag.header
00194 tagHeader.setExecNumber(baseHeader.execNumber())
00195 tagHeader.setContext(baseHeader.context())
00196 tagHeader.setEarliest(baseHeader.earliest())
00197 tagHeader.setLatest(baseHeader.latest())
00198
00199 for data in tag.dataSet.all():
00200 dataHeader = data.header
00201 dataHeader.setExecNumber(baseHeader.execNumber())
00202 dataHeader.setContext(baseHeader.context())
00203 dataHeader.setEarliest(baseHeader.earliest())
00204 dataHeader.setLatest(baseHeader.latest())
00205
00206
00207 def save(self, evt):
00208 '''
00209 Save the UserTag and UserData objects
00210
00211 Most subclass should not override.
00212 '''
00213
00214 for tag in self.tagSet.all():
00215 if tag.isTagged:
00216 tag.nTagged += 1
00217 if tag.path:
00218 evt[tag.path] = tag.header
00219 del tag.header
00220 for data in tag.dataSet.all():
00221 data.save()
00222 evt[data.path] = data.header
00223 del data.header
00224
00225
00226 def execute(self):
00227 'Subclass should not override'
00228
00229 evt = self.evtSvc()
00230
00231 status = self.reset()
00232 if status == FAILURE:
00233 self.error('error in reset() function')
00234 return FAILURE
00235
00236 status = self.check(evt)
00237 if status == FAILURE:
00238 self.error('error in check() function')
00239 return FAILURE
00240
00241 status = self.config(evt)
00242 if status == FAILURE:
00243 self.error('error in config() function')
00244 return FAILURE
00245
00246 status = self.save(evt)
00247 if status == FAILURE:
00248 self.error('error in save() function')
00249 return FAILURE
00250
00251 self.execNumber += 1
00252 return SUCCESS
00253
00254
00255 def finalPrint(self):
00256 '''Print how many tagged events'''
00257
00258 for name, tag in self.tagSet.all_dict().items():
00259 self.info( 'Summary: UserTag %s : %d events tagged at %s' % (name, tag.nTagged, tag.path) )
00260 for dataName, data in tag.dataSet.all_dict().items():
00261 self.info( "\tUserData %s saved at %s" % (dataName, data.path) )
00262
00263
00264 def finalize(self):
00265 'Subclass may override, but it must called this method on the super-class'
00266 self.finalPrint()
00267 status = DybPythonAlg.finalize(self)
00268 return status
00269