| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

UserTaggingAlg.py

Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # zhang@caltech.edu 2011-03-01
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         # avoid a 'bug?' of UserDataHeader
00059         # gbl.std.vector('float')() has to be called at least once 
00060         # before instantiate UserDataHeader 
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         # self.tagSet = {}
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         # all the real logics/algorithms happen here:
00165         # - check the properties of the event headers, run some algorithms.
00166         # - decide if this event should be tagged.
00167         # - if shoud be tagged, call tagIt(tagName) function to trigger the I/O
00168         # - save some calculated variables to the UserData
00169         # - the tags and user data will then be automatically saved 
00170         #   to the output (root) file at the paths defined in the tags
00171         #   at this exec cycle.
00172         #
00173         # If GaudiKernel.FAILURE is returned the execute() method will
00174         # immediately return this value.
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 
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:10:48 2011 for UserTagging by doxygen 1.4.7