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

In This Package:

GaudiAlgs.py

Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 # =============================================================================
00003 # $Id: GaudiAlgs.py,v 1.2 2008/07/15 16:05:53 marcocle Exp $ 
00004 # =============================================================================
00005 ## @file
00006 #
00007 # Helper module, which effectively 'imports' few useful C++ algorithmic       
00008 # base classes into Python                                                    
00009 #                                                                             
00010 #
00011 #              The major imported classes are :                               
00012 #                                                                             
00013 # - GaudiAlgo - analogue for GaudiAlgorithm C++ class from GaudiAlg package 
00014 # - HistoAlgo - analogue for GaudiHistoAlg  C++ class from GaudiAlg package  
00015 # - TupleAlgo - analogue for GaudiTupleAlg  C++ class from GaudiAlg package
00016 #
00017 # @author Vanya BELYAEV ibelyaev@physics.syr.edu
00018 # @date 2006-11-26
00019 # =============================================================================
00020 """
00021 *******************************************************************************
00022 *                                                * 'Physisics do not like it, *
00023 *                                                *  physisics do not need it, *
00024 *                                                *  physisics do not use  it' *
00025 *                                                * ****************************
00026 *                                                                             *
00027 * Helper module, which effectively 'imports' few useful C++ algorithmic       *
00028 * base classes into Python                                                    *
00029 *                                                                             *
00030 *******************************************************************************
00031 *              The major imported classes are :                               *
00032 *                                                                             *
00033 * (1) GaudiAlgo - analogue for GaudiAlgorithm C++ class from GaudiAlg package *
00034 * (2) HistoAlgo - analogue for GaudiHistoAlg  C++ class from GaudiAlg package * 
00035 * (3) TupleAlgo - analogue for GaudiTupleAlg  C++ class from GaudiAlg package *
00036 *******************************************************************************
00037 """
00038 # =============================================================================
00039 __author__ = 'Vanya BELYAEV  Ivan.Belyaev@lapp.in2p3.fr'
00040 # =============================================================================
00041 
00042 # import core of Gaudi 
00043 import GaudiPython as gaudimodule
00044 
00045 ## get the namespaces 
00046 GaudiPython        = gaudimodule.gbl.GaudiPython
00047 GaudiAlg           = gaudimodule.gbl.GaudiAlg
00048 ## "typedef" for GaudiPython::Vector 
00049 GaudiPython.Vector = gaudimodule.gbl.std.vector('double')
00050 ## "typedef" for GaudiPython::Matrix
00051 GaudiPython.Matrix = gaudimodule.gbl.std.vector('std::vector<double>')
00052 ## histogram and N-Tuple universal identifier
00053 HID       = GaudiAlg.ID
00054 HistoID   = HID 
00055 TID       = HID 
00056 TupleID   = TID
00057 ##
00058 SUCCESS    = gaudimodule.SUCCESS 
00059 iAlgorithm = gaudimodule.iAlgorithm
00060 
00061 # =============================================================================
00062 ## Useful method to locate the tool a certain
00063 #
00064 #  Usage:
00065 #
00066 #  @code 
00067 #
00068 #      # locate public tool
00069 #      t1 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator')
00070 #      # locate private tool
00071 #      t2 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator',parent=self)
00072 #      # locate public tool with defined name 
00073 #      t3 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator/MyExt1')
00074 #      # locate private tool with defined name 
00075 #      t4 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator/MyExt2',parent=self)
00076 #      # locate public tool with defined name 
00077 #      t5 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator','MyExt3')
00078 #      # locate private tool with defined name 
00079 #      t6 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator','MyExt4',parent=self)
00080 #
00081 #  @endcode
00082 #
00083 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00084 #  @date 2006-11-26
00085 def _tool_ ( self             ,
00086              interface        ,
00087              typename         ,
00088              name     = None  ,
00089              parent   = None  ,
00090              create   = True  ) :
00091     """
00092     Useful method to locate the tool a certain
00093     
00094     Usage:
00095     
00096     # locate public tool
00097     t1 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator')
00098     # locate private tool
00099     t2 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator',parent=self)
00100     # locate public tool with defined name 
00101     t3 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator/MyExt1')
00102     # locate private tool with defined name 
00103     t4 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator/MyExt2',parent=self)
00104     # locate public tool with defined name 
00105     t5 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator','MyExt3')
00106     # locate private tool with defined name 
00107     t6 = self.tool(ITrExtrapolator,'TrParabolicExtrapolator','MyExt4',parent=self)
00108     
00109     """
00110     if not interface : interface = gaudimodule.GaudiPython.IAlgTool 
00111     if not parent    : parent    = self
00112     if name          : typename  += '/' + name 
00113     _tool = GaudiPython.AlgDecorator.tool_( self , typename , parent , create )
00114     if not _tool : return None
00115     _tool = gaudimodule.InterfaceCast(interface)(_tool)
00116     if not _tool :
00117         self.Warning('Invalid cast to interface %s' % interface )
00118         return None 
00119     return _tool 
00120 
00121 # =============================================================================
00122 ## Useful method to locate a service:
00123 #    
00124 #     Usage: 
00125 #
00126 #  @code 
00127 #
00128 #     ntsvc = self.svc( INTupleSvc , 'NTUpleSvc' )
00129 #
00130 #  @endcode 
00131 #
00132 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00133 #  @date 2006-11-26
00134 def _service_ ( self              ,
00135                 interface         ,
00136                 name              ,
00137                 create   = False  ) :
00138     """
00139     Useful method to locate a service:
00140     
00141     Usage: 
00142     
00143     ntsvc = self.svc( INTupleSvc , 'NTUpleSvc' )
00144     
00145     """
00146     if not interface : interface = gaudimodule.GaudiPython.IInterface
00147     _svc = GaudiPython.AlgDecorator.svc_ ( self , name , create )
00148     if not _svc : return None
00149     _svc = gaudimodule.InterfaceCast(interface)(_svc)
00150     if not _svc :
00151         self.Warning('Invalid cast to interface %s' % interface )
00152         return None 
00153     return _svc 
00154 
00155 # =============================================================================
00156 ## The constructor from unique algorithm instance name,
00157 #
00158 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00159 #  @date 2006-11-26
00160 def _init_ ( self , name ) :
00161     """
00162     The constructor from unique algorithm instance name,
00163     """
00164     self._Base.__init__( self , self , name )
00165     appMgr = gaudimodule.AppMgr()
00166     algMgr = appMgr._algmgr
00167     status = algMgr.addAlgorithm( self )
00168     if status.isFailure() : 
00169         raise RuntimeError, 'Unable to add Algorithm "' + name + '"'
00170     iAlgorithm.__init__ ( self , name , self )
00171                           
00172 # =============================================================================
00173 ## The default initialization (initilization of base C++ class + data 
00174 #
00175 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00176 #  @date 2006-11-26
00177 def _initialize_ ( self ) :
00178     """    
00179     The default initialzation (initilization of base C++ class + data 
00180     """    
00181     status = self._Base.initialize_( self )
00182     if status.isFailure() : return status
00183     
00184     # set the basic services
00185     _e = self._Base.evtSvc( self )
00186     _s = gaudimodule.InterfaceCast(gaudimodule.gbl.IService)(_e)
00187     self._evtSvc_ = gaudimodule.iDataSvc ( _s.name() , _e )
00188     
00189     _d = self._Base.detSvc( self )
00190     _s = gaudimodule.InterfaceCast(gaudimodule.gbl.IService)(_d)
00191     self._detSvc_ = gaudimodule.iDataSvc ( _s.name() , _d )
00192     
00193     return status
00194 
00195 # =============================================================================
00196 ## The default initialization (initilization of base C++ class + data memebrs)
00197 #
00198 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00199 #  @date 2006-11-26
00200 def _initialize_histo_ ( self ) :
00201     """    
00202     The default initialzation (initilization of base C++ class + data memebrs)
00203     """
00204     status = _initialize_( self )
00205     if status.isFailure() : return status
00206     
00207     # set the basic services
00208     _h = self._Base.histoSvc( self )
00209     _s = gaudimodule.InterfaceCast(gaudimodule.gbl.IService)(_h)
00210     self._histoSvc_ = gaudimodule.iHistogramSvc ( _s.name() , _h )
00211     
00212     return status
00213 
00214 # =============================================================================
00215 ## The default initilization (initialization of base C++ class + data memebrs)
00216 #
00217 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00218 #  @date 2006-11-26
00219 def _initialize_tuple_ ( self ) :
00220     """    
00221     The default initialzation (initilization of base C++ class + data memebrs)
00222     """
00223     status = _initialize_histo_( self )
00224     if status.isFailure() : return status
00225     
00226     # set the basic services
00227     if self.produceNTuples() :
00228         _n = self._Base.ntupleSvc( self )
00229         _s = gaudimodule.InterfaceCast(gaudimodule.gbl.IService)(_n)
00230         self._ntupleSvc_ = gaudimodule.iNTupleSvc ( _s.name() , _n )
00231         
00232     if self.produceEvtCols() :
00233         _n = self._Base.evtColSvc( self )
00234         _s = gaudimodule.InterfaceCast(gaudimodule.gbl.IService)(_n)
00235         self._evtcolSvc_ = gaudimodule.iNTupleSvc ( _s.name() , _n )
00236         
00237     return status
00238 
00239 # =============================================================================
00240 ## Trivial helper function to access Event Data and Event Data Service
00241 #
00242 #    Usage:
00243 #
00244 #  @code
00245 #
00246 #    # get event data service
00247 #    svc = self.evtSvc()
00248 #
00249 #    # get the data
00250 #    hits = self.evtSvc('MC/Calo/Hits')
00251 #
00252 #  @endcode
00253 #
00254 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00255 #  @date 2006-11-26
00256 def _evtSvc   ( self , location = None ) :
00257     """    
00258     Trivial helper function to access Event Data and Event Data Service
00259 
00260     Usage:
00261     
00262     # get event data service
00263     svc = self.evtSvc()
00264 
00265     # get the data
00266     hits = self.evtSvc('MC/Calo/Hits')    
00267     """ 
00268     if not location :
00269         return self._evtSvc_
00270     return self._evtSvc_[location]
00271 
00272 # =============================================================================
00273 ## Trivial helper function to access Detector Data and Detector  Data Service
00274 #    
00275 #    Usage:
00276 #
00277 #  @code
00278 #
00279 #    # get detector data service
00280 #    svc = self.detSvc()
00281 #    
00282 #    # get the data
00283 #    lhcb = self.detSvc('/dd/Structure/LHCb')
00284 #
00285 #  @endcode
00286 #
00287 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00288 #  @date 2006-11-26
00289 def _detSvc   ( self, location ) :
00290     """    
00291     Trivial helper function to access Detector Data and Event Data Service
00292     
00293     Usage:
00294     # get detector data service
00295     svc = self.detSvc()
00296     
00297     # get the data
00298     lhcb = self.detSvc('/dd/Structure/LHCb')
00299     """ 
00300     if not location :
00301         return self._detSvc_
00302     return self._detSvc_[location]
00303 
00304 # =============================================================================
00305 ## Trivial helper function to access Histogram  Data and Histogram  Data Service
00306 #
00307 #    Usage:
00308 #
00309 #  @code
00310 #
00311 #    # get histogram data service
00312 #    svc = self.histoSvc()
00313 #    
00314 #    # get the data
00315 #    histo = self.histoSvc('/stat/Calo/1')
00316 # 
00317 #  @endcode
00318 #
00319 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00320 #  @date 2006-11-26
00321 def _histoSvc  ( self , address = None ) :
00322     """    
00323     Trivial helper function to access Histogram  Data and Histogram  Data Service
00324     
00325     Usage:
00326 
00327     # get histogram data service
00328     svc = self.histoSvc()
00329     
00330     # get the data
00331     histo = self.histoSvc('/stat/Calo/1')    
00332     """ 
00333     if not address : return self._histoSvc_
00334     return self._histoSvc_[ address ]
00335 
00336 # =============================================================================
00337 ## Trivial function to access the data in TES
00338 def _get      ( self , location ) :
00339     """    
00340     Trivial function to access the data in TES
00341     """
00342     return self._evtSvc_[location]
00343 
00344 # =============================================================================
00345 ## Trivial function to access the data in TDS
00346 def _getDet   ( self , location ) :
00347     """    
00348     Trivial function to access the data in TDS
00349     """
00350     return self._detSvc_[location]
00351 
00352 # =============================================================================
00353 ## Trivial helper function to access NTuple Service 
00354 def _ntupleSvc ( self ) :
00355     """    
00356     Trivial function to access N-Tuple Service 
00357     """
00358     return self._ntupleSvc_
00359 
00360 # =============================================================================
00361 ## Trivial helper function to access Event Collection Service 
00362 def _evtcolSvc ( self ) :
00363     """    
00364     Trivial function to access Event Collection Service 
00365     """
00366     return self._evtcolSvc_
00367 
00368     
00369 # =============================================================================
00370 ## The default finalization (finalization of base C++ class)
00371 def _finalize_   ( self ) :
00372     """
00373     The default finalization : finalize the base C++ class
00374     """
00375     status = self._Base.finalize_  ( self )
00376     return status
00377 # =============================================================================
00378 ## Dummy method returning success
00379 def _success_ ( self ) : return gaudimodule.SUCCESS 
00380 
00381 
00382 # =============================================================================
00383 ## check the existency of the proeprty with the given name
00384 def _hasProperty_ ( self , pname ) :
00385     """
00386     The trivial function which checks the existence of the property with given name
00387     """
00388     return gaudimodule.gbl.Gaudi.Utils.hasProperty ( self , pname ) 
00389 
00390 # =============================================================================
00391 ## get the value of the given property 
00392 def _getProperty_ ( self , pname ) :
00393     """
00394     Get the property by name
00395     """
00396     if not self.hasProperty( pname ) :
00397         raise AttributeError, 'property %s does not exist' % pname 
00398     return iAlgorithm.__getattr__( self , pname )
00399 
00400 # =============================================================================
00401 ## set the value for the given property 
00402 def _setProperty_ ( self , pname , pvalue ) :
00403     """
00404     Set the property from the value 
00405     """
00406     if not self.hasProperty( pname ) :
00407         raise AttributeError, 'property %s does not exist' % pname 
00408     return iAlgorithm.__setattr__ ( self , pname , pvalue )
00409 
00410 # =============================================================================
00411 ## get the attribute or property 
00412 def _get_attr_ ( self , pname ) :
00413     """
00414     Get the atribute (or property) 
00415     - if the attribute name corresponds to the property name, property value is returned 
00416     """
00417     if self.hasProperty( pname ) :
00418         return iAlgorithm.__getattr__ ( self , pname )
00419     raise AttributeError, 'attribute/property %s does not exist' % pname 
00420     
00421 # =============================================================================
00422 ## set the attribute or property 
00423 def _set_attr_ ( self , pname , pvalue ) :
00424     """
00425     Set the attribute (or property) :
00426     - if the attribute name corresponds to the property name, the property is updated 
00427     """
00428     if not self.hasProperty( pname ) : self.__dict__[pname] = pvalue
00429     else : iAlgorithm.__setattr__ ( self , pname , pvalue )
00430 
00431     
00432 _GaudiAlgorithm = GaudiPython.PyAlg( 'GaudiAlgorithm' )
00433 _GaudiHistoAlg  = GaudiPython.PyAlg( 'GaudiHistoAlg'  )
00434 _GaudiTupleAlg  = GaudiPython.PyAlg( 'GaudiTupleAlg'  )
00435 
00436 # =============================================================================
00437 ## @class GaudiAlgo
00438 #  the base class for all algorithm
00439 #  Python-image of C++ clkass GaudiAlgorithm
00440 #
00441 #  Usage:                                                                     
00442 #                                                                            
00443 #  @code
00444 #
00445 #  from gaudimodule import SUCCESS                                            
00446 #  from GaudiAlgs   import GaudiAlgo                                         
00447 #                                                                             
00448 #  class MyClass(GaudiAlgo) :                                                 
00449 #       ' My specific Algorithm, derived from GaudiAlgo base class '          
00450 #       def __init__( self , name ) :                                         
00451 #            'Constructor from algorithm instance name'                       
00452 #            #invoke the constructor of base class                           
00453 #             GaudiAlgo.__init__(self , name )                                
00454 #                                                                             
00455 #       def initialize ( self ) :                                             
00456 #           'Algorithm initialization'                                        
00457 #           # initialize the base class                                       
00458 #           status = GaudiAlgo.initialize( self )                             
00459 #           if status.isFailure() : return status                             
00460 #                                                                             
00461 #           # locate the services and tools                                   
00462 #                                                                             
00463 #           # locate some tool:                                               
00464 #           extrapolator = self.tool(ITrExtrapolator,'TrExtrapolator')        
00465 #                                                                             
00466 #           # locate the service                                              
00467 #           rndmSvc = self.svc(IRndmGenSvc, 'RndmGenSvc')                     
00468 #                                                                             
00469 #           return SUCCESS                                                    
00470 #                                                                             
00471 #                                                                             
00472 #       def execute ( self ) :                                                
00473 #            'Major method (from IAlgorithm interface)'                       
00474 #                                                                             
00475 #           # get some data from Transient Event Store                        
00476 #           tracks = self.get('/Event/Rec/Tracks')                            
00477 #                                                                             
00478 #           # use counters                                                    
00479 #           c1 = self.counter('#Tracks')                                      
00480 #           c2 = self.counter('No Tracks')                                    
00481 #           if tracks.empty :                                                 
00482 #              c2+=1                                                          
00483 #           c1 += tracks->size()                                              
00484 #                                                                             
00485 #           if 1000 < tracks.size() :                                         
00486 #                return self.Error('The event is *VERY* busy')                
00487 #                                                                             
00488 #           return SUCCESS                                                    
00489 #                                                                             
00490 #  @endcode 
00491 #
00492 #  @see GaudiAlgorithm
00493 #
00494 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00495 #  @date 2006-11-26
00496 class GaudiAlgo ( _GaudiAlgorithm , iAlgorithm ) :
00497     """
00498 *******************************************************************************
00499 *                                                * 'Physisics do not like it, *
00500 *                                                *  physisics do not need it, *
00501 *                                                *  physisics do not use  it' *
00502 *                                                * ****************************
00503 *  Usage:                                                                     *
00504 *                                                                             *
00505 *  from gaudimodule import SUCCESS                                            *
00506 *  from GaudiAlgs   import GaudiAlgo                                          *
00507 *                                                                             *
00508 *  class MyClass(GaudiAlgo) :                                                 *
00509 *       ' My specific Algorithm, derived from GaudiAlgo base class '          *
00510 *       def __init__( self , name ) :                                         *
00511 *            'Constructor from algorithm instance name'                       *
00512 *             #invoke the constructor of base class                           *
00513 *             GaudiAlgo.__init__(self , name )                                *
00514 *                                                                             *
00515 *       def initialize ( self ) :                                             *
00516 *           'Algorithm initialization'                                        *
00517 *           # initialize the base class                                       *
00518 *           status = GaudiAlgo.initialize( self )                             *
00519 *           if status.isFailure() : return status                             *
00520 *                                                                             *
00521 *           # locate the services and tools                                   *
00522 *                                                                             *
00523 *           # locate some tool:                                               *
00524 *           extrapolator = self.tool(ITrExtrapolator,'TrExtrapolator')        *
00525 *                                                                             *
00526 *           # locate the service                                              *
00527 *           rndmSvc = self.svc(IRndmGenSvc, 'RndmGenSvc')                     *
00528 *                                                                             *
00529 *           return SUCCESS                                                    *
00530 *                                                                             *
00531 *                                                                             *
00532 *       def execute ( self ) :                                                *
00533 *            'Major method (from IAlgorithm interface)'                       *
00534 *                                                                             *
00535 *           # get some data from Transient Event Store                        *
00536 *           tracks = self.get('/Event/Rec/Tracks')                            *
00537 *                                                                             *
00538 *           # use counters                                                    *
00539 *           c1 = self.counter('#Tracks')                                      *
00540 *           c2 = self.counter('No Tracks')                                    *
00541 *           if tracks.empty :                                                 *
00542 *              c2+=1                                                          *
00543 *           c1 += tracks->size()                                              *
00544 *                                                                             *
00545 *           if 1000 < tracks.size() :                                         *
00546 *                return self.Error('The event is *VERY* busy')                *
00547 *                                                                             *
00548 *           return SUCCESS                                                    *
00549 *                                                                             *
00550 *******************************************************************************
00551     """
00552     pass
00553 
00554 # =============================================================================
00555 ## @class HistoAlgo
00556 #  The base class for easy histogramming
00557 #
00558 #  Usage:                                                                     
00559 #
00560 #
00561 #  @code
00562 #
00563 #  from gaudimodule import SUCCESS                                            
00564 #  from GaudiAlgs   import HistoAlgo                                          
00565 #                                                                             
00566 #  class MyClass(HistoAlgo) :                                                 
00567 #       ' My specific Algorithm, derived from GaudiAlgo base class '          
00568 #       def __init__( self , name ) :                                         
00569 #            'Constructor from algorithm instance name'
00570 #             #invoke the constructor of base class                           
00571 #             HistoAlgo.__init__(self , name )                                
00572 #                                                                             
00573 #       def execute ( self ) :                                                
00574 #            'Major method (from IAlgorithm interface)'                       
00575 #                                                                             
00576 #           # get some data from Transient Event Store                        
00577 #           tracks = self.get('/Event/Rec/Tracks')                            
00578 #                                                                             
00579 #           self.plot1D ( tracks->size() , '#tracks' , 0 , 100 )              
00580 #                                                                             
00581 #           return SUCCESS                                                   
00582 #
00583 #  @endcode
00584 #
00585 # Alternatively the histogram  could be booked in advance:                    
00586 #
00587 #  @code 
00588 #
00589 #  class MyClass(HistoAlgo) :                                                 
00590 #       ' My specific Algorithm, derived from GaudiAlgo base class '          
00591 #       def __init__( self , name ) :                                         
00592 #            'Constructor from algorithm instance name'                       
00593 #             #invoke the constructor of base class                           
00594 #             HistoAlgo.__init__(self , name )                                
00595 #                                                                             
00596 #       def initialize ( self ) :                                             
00597 #           'Algorithm initialization'                                        
00598 #           # initialize the base class                                       
00599 #           status = HistoAlgo.initialize( self )                             
00600 #           if status.isFailure() : return status                             
00601 #                                                                             
00602 #           # book the histogram                                              
00603 #           self.h1 = selff.book1D ( '#tracks' , 0 , 100 )                    
00604 #                                                                             
00605 #           return SUCCESS                                                    
00606 #                                                                             
00607 #                                                                             
00608 #       def execute ( self ) :                                                
00609 #            'Major method (from IAlgorithm interface)'                       
00610 #                                                                             
00611 #           # get some data from Transient Event Store                        
00612 #           tracks = self.get('/Event/Rec/Tracks')                            
00613 #                                                                             
00614 #           # fill the histogram                                              
00615 #           self.h1.fill ( tracks->size() )                                   
00616 #
00617 #            return SUCCESS                                                    
00618 #  @endcode
00619 # 
00620 #  @see GaudiHistoAlg
00621 #
00622 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00623 #  @date 2006-11-26
00624 class HistoAlgo ( _GaudiHistoAlg , iAlgorithm ) :
00625     """
00626 *******************************************************************************
00627 *                                                * 'Physisics do not like it, *
00628 *                                                *  physisics do not need it, *
00629 *                                                *  physisics do not use  it' *
00630 *                                                * ****************************
00631 *  Usage:                                                                     *
00632 *                                                                             *
00633 *  from gaudimodule import SUCCESS                                            *
00634 *  from GaudiAlgs   import HistoAlgo                                          *
00635 *                                                                             *
00636 *  class MyClass(HistoAlgo) :                                                 *
00637 *       ' My specific Algorithm, derived from GaudiAlgo base class '          *
00638 *       def __init__( self , name ) :                                         *
00639 *            'Constructor from algorithm instance name'                       *
00640 *             #invoke the constructor of base class                           *
00641 *             HistoAlgo.__init__(self , name )                                *
00642 *                                                                             *
00643 *       def execute ( self ) :                                                *
00644 *            'Major method (from IAlgorithm interface)'                       *
00645 *                                                                             *
00646 *           # get some data from Transient Event Store                        *
00647 *           tracks = self.get('/Event/Rec/Tracks')                            *
00648 *                                                                             *
00649 *           self.plot1D ( tracks->size() , '#tracks' , 0 , 100 )              *
00650 *                                                                             *
00651 *           return SUCCESS                                                    *
00652 *                                                                             *
00653 * Alternatively the histogram  could be booked in advance:                    *
00654 *                                                                             *
00655 *  class MyClass(HistoAlgo) :                                                 *
00656 *       ' My specific Algorithm, derived from GaudiAlgo base class '          *
00657 *       def __init__( self , name ) :                                         *
00658 *            'Constructor from algorithm instance name'                       *
00659 *             #invoke the constructor of base class                           *
00660 *             HistoAlgo.__init__(self , name )                                *
00661 *                                                                             *
00662 *       def initialize ( self ) :                                             *
00663 *           'Algorithm initialization'                                        *
00664 *           # initialize the base class                                       *
00665 *           status = HistoAlgo.initialize( self )                             *
00666 *           if status.isFailure() : return status                             *
00667 *                                                                             *
00668 *           # book the histogram                                              *
00669 *           self.h1 = selff.book1D ( '#tracks' , 0 , 100 )                    *
00670 *                                                                             *
00671 *           return SUCCESS                                                    *
00672 *                                                                             *
00673 *                                                                             *
00674 *       def execute ( self ) :                                                *
00675 *            'Major method (from IAlgorithm interface)'                       *
00676 *                                                                             *
00677 *           # get some data from Transient Event Store                        *
00678 *           tracks = self.get('/Event/Rec/Tracks')                            *
00679 *                                                                             *
00680 *           # fill the histogram                                              *
00681 *           self.h1.fill ( tracks->size() )                                   *
00682 *                                                                             *
00683 *           return SUCCESS                                                    *
00684 *                                                                             *
00685 *******************************************************************************
00686     """
00687     pass
00688 
00689 # =============================================================================
00690 ## @class TupleAlgo
00691 #  The base class for easy manupulations with N-Tuples
00692 #
00693 #  Usage:                                                                     
00694 #                                                                             
00695 #  @code                                                                      
00696 #                                                                             
00697 #  from gaudimodule import SUCCESS                                            
00698 #  from GaudiAlgs   import TupleAlgo                                          
00699 #                                                                             
00700 #  class MyClass(TupleAlgo) :                                                 
00701 #       ' My specific Algorithm, derived from TupleAlgo base class '          
00702 #       def __init__( self , name ) :                                         
00703 #            'Constructor from algorithm instance name'                       
00704 #             #invoke the constructor of base class                           
00705 #             TupleAlgo.__init__(self , name )                                
00706 #                                                                             
00707 #       def execute ( self ) :                                                
00708 #            'Major method (from IAlgorithm interface)'                       
00709 #                                                                             
00710 #           # get some data from Transient Event Store                        
00711 #           tracks = self.get('/Event/Rec/Tracks')                            
00712 #                                                                             
00713 #           tup = self.nTuple('My N-Tuple')                                   
00714 #                                                                             
00715 #           for track in tracks :                                             
00716 #                                                                             
00717 #                 pt   = track.pt   ()                                        
00718 #                 p    = track.p    ()                                        
00719 #                 chi2 = track.chi2 ()                                        
00720 #                                                                             
00721 #                 #fill N-tuple:
00722 #                 tup.column ( 'pt'   ,  pt   )                               
00723 #                 tup.column ( 'p'    ,  p    )                               
00724 #                 tup.column ( 'chi2' ,  chi2 )                               
00725 #                 #commit the row                                             
00726 #                 tup.write  ()                                               
00727 #                                                                             
00728 #           return SUCCESS                                                    
00729 #
00730 #  @endcode 
00731 #
00732 #  @see GaudiTupleAlg
00733 #
00734 #  @author Vanya BELYAEV ibelyaev@physics.syr.edu
00735 #  @date 2006-11-26
00736 class TupleAlgo ( _GaudiTupleAlg  , iAlgorithm ) :
00737     """
00738 *******************************************************************************
00739 *                                                * 'Physisics do not like it, *
00740 *                                                *  physisics do not need it, *
00741 *                                                *  physisics do not use  it' *
00742 *                                                * ****************************
00743 *  Usage:                                                                     *
00744 *                                                                             *
00745 *  from gaudimodule import SUCCESS                                            *
00746 *  from GaudiAlgs   import TupleAlgo                                          *
00747 *                                                                             *
00748 *  class MyClass(TupleAlgo) :                                                 *
00749 *       ' My specific Algorithm, derived from TupleAlgo base class '          *
00750 *       def __init__( self , name ) :                                         *
00751 *            'Constructor from algorithm instance name'                       *
00752 *             #invoke the constructor of base class                           *
00753 *             TupleAlgo.__init__(self , name )                                *
00754 *                                                                             *
00755 *       def execute ( self ) :                                                *
00756 *            'Major method (from IAlgorithm interface)'                       *
00757 *                                                                             *
00758 *           # get some data from Transient Event Store                        *
00759 *           tracks = self.get('/Event/Rec/Tracks')                            *
00760 *                                                                             *
00761 *           tup = self.nTuple('My N-Tuple')                                   *
00762 *                                                                             *
00763 *           for track in tracks :                                             *
00764 *                                                                             *
00765 *                 pt   = track.pt   ()                                        *
00766 *                 p    = track.p    ()                                        *
00767 *                 chi2 = track.chi2 ()                                        *
00768 *                                                                             *
00769 *                 #fill N-tuple:                                              *
00770 *                 tup.column ( 'pt'   ,  pt   )                               *
00771 *                 tup.column ( 'p'    ,  p    )                               *
00772 *                 tup.column ( 'chi2' ,  chi2 )                               *
00773 *                 #commit the row                                             *
00774 *                 tup.write  ()                                               *
00775 *                                                                             *
00776 *           return SUCCESS                                                    *
00777 *                                                                             *
00778 *******************************************************************************
00779     """
00780     pass
00781 class objectmethod(object) :
00782   def __init__(self, m) :
00783     self.method = m
00784   def __call__(self, *args) :
00785     print args
00786     return self.method(*args )
00787 
00788 GaudiAlgo._Base = _GaudiAlgorithm  
00789 HistoAlgo._Base = _GaudiHistoAlg
00790 TupleAlgo._Base = _GaudiTupleAlg
00791 
00792 # initialize is 'unique' method :  
00793 GaudiAlgo.initialize = _initialize_ 
00794 HistoAlgo.initialize = _initialize_histo_
00795 TupleAlgo.initialize = _initialize_tuple_
00796 
00797 def _start_ ( self ) :
00798     """
00799     The stub 'start' method needed by the internal implementation of PyAlg<>.
00800     """
00801     # return self._Base.start_(self)
00802     return SUCCESS
00803 
00804 GaudiAlgo.start = _start_
00805 HistoAlgo.start = _start_
00806 TupleAlgo.start = _start_
00807 
00808 def _execute_ ( self ) :
00809     """
00810     The fictive 'execute' method, which MUST be overwitten by user
00811     """
00812     raise RuntimeError, 'Execute method is not implemented for %s' % self.name() 
00813 
00814 GaudiAlgo.execute = _execute_
00815 HistoAlgo.execute = _execute_
00816 TupleAlgo.execute = _execute_
00817 
00818 def _stop_ ( self ) :
00819     """
00820     The stub 'stop' method needed by the internal implementation of PyAlg<>.
00821     """
00822     # return self._Base.stop_(self)
00823     return SUCCESS
00824 
00825 GaudiAlgo.stop = _stop_
00826 HistoAlgo.stop = _stop_
00827 TupleAlgo.stop = _stop_
00828 
00829 def _plot1D_    ( s, *a ) :
00830     """
00831     The basic method to fill (book-on-demand) 1D-histogram
00832 
00833     The histogram will be created/booked dautomatically according to the
00834     specifications:
00835     
00836        - literal or numerical ID (optional)
00837        - title
00838        - low edge
00839        - high edge
00840        - number of bins (default is 100)
00841        
00842     The reference to the histogram is returned and could be used for later manipulations
00843     
00844     """
00845     return GaudiPython.HistoDecorator.plot1D    (s,*a) 
00846 def _plot2D_    ( s, *a ) :
00847     """
00848     The basic method to fill (book-on-demand) 2D-histogram
00849 
00850     The histogram will be created/booked dautomatically according to the
00851     specifications:
00852     
00853        - literal or numerical ID (optional)
00854        - title
00855        - low X-edge
00856        - high X-edge
00857        - low Y-edge
00858        - high Y-edge
00859        - number of X-bins (default is 50)
00860        - number of Y-bins (default is 50)
00861        
00862     The reference to the histogram is returned and could be used for later manipulations
00863     
00864     """
00865     return GaudiPython.HistoDecorator.plot2D    (s,*a) 
00866 def _plot3D_    ( s, *a ) :
00867     """
00868     The basic method to fill (book-on-demand) 3D-histogram
00869     
00870     The histogram will be created/booked dautomatically according to the
00871     specifications:
00872     
00873        - literal or numerical ID (optional)
00874        - title
00875        - low X-edge
00876        - high X-edge
00877        - low Y-edge
00878        - high Y-edge
00879        - low Z-edge
00880        - high Z-edge
00881        - number of X-bins (default is 10)
00882        - number of Y-bins (default is 10)
00883        - number of Y-bins (default is 10)
00884        
00885     The reference to the histogram is returned and could be used for later manipulations
00886     
00887     """
00888     return GaudiPython.HistoDecorator.plot3D    (s,*a)
00889 def _profile1D_ ( s, *a ) :
00890     """
00891     The basic method to fill (book-on-demand) 1D profile histogram
00892     
00893     The profile histogram will be created/booked dautomatically
00894     according to the specifications:
00895     
00896        - literal or numerical ID (optional)
00897        - title
00898        - low X-edge
00899        - high X-edge
00900        - number of X-bins (default is 100)
00901        
00902     The reference to the histogram is returned and could be used for later manipulations
00903     
00904     """
00905     return GaudiPython.HistoDecorator.profile1D (s,*a)
00906 def _profile2D_ ( s, *a ) :
00907     """
00908     The basic method to fill (book-on-demand) 2D profile histiogram 
00909 
00910     The profile histogram will be created/booked automatically
00911     according to the specifications:
00912     
00913        - literal or numerical ID (optional)
00914        - title
00915        - low X-edge
00916        - high X-edge
00917        - low Y-edge
00918        - high Y-edge
00919        - number of X-bins (default is 50)
00920        - number of Y-bins (default is 50)
00921        
00922     The reference to the histogram is returned and could be used for later manipulations
00923     
00924     """
00925     return GaudiPython.HistoDecorator.profile2D (s,*a)
00926 
00927 _plot1D_    .__doc__ += GaudiPython.HistoDecorator.plot1D    .__doc__
00928 _plot2D_    .__doc__ += GaudiPython.HistoDecorator.plot2D    .__doc__
00929 _plot3D_    .__doc__ += GaudiPython.HistoDecorator.plot3D    .__doc__
00930 _profile1D_ .__doc__ += GaudiPython.HistoDecorator.profile1D .__doc__
00931 _profile2D_ .__doc__ += GaudiPython.HistoDecorator.profile2D .__doc__
00932 
00933 def _decorate_plots_ ( klasses ) :
00934     t = type( klasses ) 
00935     if not issubclass ( t , list  ) and  \
00936        not issubclass ( t , tuple ) : klasses = [ klasses ] 
00937     for klass in klasses :
00938         klass .plot       = _plot1D_ 
00939         klass .plot1D     = _plot1D_ 
00940         klass .plot2D     = _plot2D_ 
00941         klass .plot3D     = _plot3D_
00942         klass .profile1D  = _profile1D_
00943         klass .profile2D  = _profile2D_
00944         
00945 _decorate_plots_ ( HistoAlgo )
00946 _decorate_plots_ ( TupleAlgo )
00947 
00948 
00949 def _nTuple_ ( s , *a )  :
00950     """
00951     Retrieve (book-on-demand) N-Tuple object
00952     """
00953     return GaudiPython.TupleAlgDecorator.nTuple ( s , *a )
00954 def _evtCol_ ( s , *a )  :
00955     """
00956     Retrieve (book-on-demand) N-Tuple object for Event Tag Collections
00957     """
00958     return GaudiPython.TupleAlgDecorator.evtCol ( s , *a )
00959 
00960 _nTuple_.__doc__  += GaudiPython.TupleAlgDecorator.nTuple.__doc__
00961 _evtCol_.__doc__  += GaudiPython.TupleAlgDecorator.evtCol.__doc__
00962 
00963 def _decorate_tuples_ ( klasses ) :
00964     t = type( klasses ) 
00965     if not issubclass ( t , list  ) and  \
00966        not issubclass ( t , tuple ) : klasses = [ klasses ] 
00967     for klass in klasses :
00968         klass . nTuple    = _nTuple_
00969         klass . evtCol    = _evtCol_
00970         klass . ntupleSvc = _ntupleSvc
00971         klass .  tupleSvc = _ntupleSvc
00972         klass .   ntupSvc = _ntupleSvc
00973         klass .    tupSvc = _ntupleSvc
00974         klass . evtColSvc = _evtcolSvc 
00975         klass . evtcolSvc = _evtcolSvc 
00976 
00977 # ==========================================================
00978 _decorate_tuples_ ( TupleAlgo )
00979 
00980 
00981 # "decorate N-Tuple object
00982 Tuple = gaudimodule.gbl.Tuples.Tuple
00983 _Dec  = GaudiPython.TupleDecorator 
00984 def _t_nTuple_  (s,*a) : return _Dec.nTuple (s,*a)
00985 def _t_ntuple_  (s,*a) : return _Dec.ntuple (s,*a)
00986 def _t_valid_   (s,*a) : return _Dec.valid  (s,*a)
00987 def _t_write_   (s,*a) : return _Dec.write  (s,*a)
00988 def _t_column_  (s,*a) : return _Dec.column (s,*a)
00989 def _t_array_   (s,*a) : return _Dec.array  (s,*a)
00990 def _t_matrix_  (s,*a) : return _Dec.matrix (s,*a)
00991 def _t_farray_  (s,*a) : return _Dec.farray (s,*a)
00992 def _t_fmatrix_ (s,*a) : return _Dec.fmatrix (s,*a)
00993 
00994 _t_nTuple_ .__doc__ = _Dec.nTuple  .__doc__
00995 _t_ntuple_ .__doc__ = _Dec.ntuple  .__doc__
00996 _t_valid_  .__doc__ = _Dec.valid   .__doc__
00997 _t_write_  .__doc__ = _Dec.write   .__doc__
00998 _t_column_ .__doc__ = _Dec.column  .__doc__
00999 _t_array_  .__doc__ = _Dec.array   .__doc__
01000 _t_matrix_ .__doc__ = _Dec.matrix  .__doc__
01001 _t_farray_ .__doc__ = _Dec.farray  .__doc__
01002 _t_fmatrix_.__doc__ = _Dec.fmatrix .__doc__
01003 
01004 Tuple.nTuple  = _t_nTuple_ 
01005 Tuple.ntuple  = _t_ntuple_
01006 Tuple.valid   = _t_valid_ 
01007 Tuple.write   = _t_write_ 
01008 Tuple.column  = _t_column_ 
01009 Tuple.array   = _t_array_ 
01010 Tuple.matrix  = _t_matrix_ 
01011 Tuple.farray  = _t_farray_ 
01012 Tuple.fmatrix = _t_fmatrix_ 
01013 
01014 _alg_map_ = {
01015     '__init__'    : _init_        , # constructor 
01016     'tool'        : _tool_        , # service locator 
01017     'svc'         : _service_     , # tool locator 
01018     'evtSvc'      : _evtSvc       , # event data service 
01019     'eventSvc'    : _evtSvc       , # event data service
01020     'detSvc'      : _detSvc       , # detector data service 
01021     'histoSvc'    : _histoSvc     , # histogram data service
01022     'histSvc'     : _histoSvc     , # histogram data service
01023     'get'         : _get          , # access to event data
01024     'getDet'      : _getDet       , # access to detector data
01025     'finalize'    : _finalize_    , # algorithm finalization
01026     'beginRun'    : _success_     , # dummy function returning success
01027     'endRun'      : _success_     , # dummy function returning success
01028     #
01029     'hasProperty' : _hasProperty_ , # check the existence of property with given name 
01030     'getProperty' : _getProperty_ , # get the property value with given name 
01031     'setProperty' : _setProperty_ , # set the property with given name 
01032     '__setattr__' : _set_attr_    , # set the attribute/property with given name 
01033     '__getattr__' : _get_attr_      # set the attribute/property with given name 
01034     }
01035 
01036 
01037 # decorate the classes with the useful methods
01038 def _decorate_algs_ ( klasses ) :
01039     t = type( klasses ) 
01040     if not issubclass ( t , list  ) and  \
01041        not issubclass ( t , tuple ) : klasses = [ klasses ] 
01042     for _alg in klasses : 
01043         for key in _alg_map_ : setattr( _alg , key , _alg_map_[key] )
01044 
01045 # =
01046 _decorate_algs_ ( GaudiAlgo )
01047 _decorate_algs_ ( HistoAlgo )
01048 _decorate_algs_ ( TupleAlgo )
01049 
01050 # =============================================================================
01051 # Helper function to fill histogram/ntuple using 'map'-operation 
01052 # =============================================================================
01053 def mapvct ( func , sequence , ovct = None ) :
01054     """ Helper function to fill histogram/ntuple using 'map'-operation """
01055     if not ovct : 
01056         vct = GaudiPython.Vector
01057     else :
01058         vct = ovct
01059     if   hasattr( sequence, 'size' ) :
01060         vct.reserve ( vct.size() + sequence.size() )
01061     elif hasattr( sequence, '__len__' ) :
01062         vct.reserve ( vct.size() + len( sequence ) )
01063     for object in sequence :
01064         vct.push_back( func( object ) )
01065     if not ovct : return vct
01066     
01067 
01068 GaudiPython.mapvct = mapvct
01069 
01070 # =============================================================================
01071 # pseudo help 
01072 # =============================================================================
01073 def _help_() :
01074     print __doc__ , __author__
01075     print '\t\t\tDoc-string for class GaudiAlgo \n' , GaudiAlgo.__doc__ 
01076     print '\t\t\tDoc-string for class HistoAlgo \n' , HistoAlgo.__doc__
01077     print '\t\t\tDoc-string for class TupleAlgo \n' , TupleAlgo.__doc__
01078     
01079 # =============================================================================
01080 # pseudo-test suite 
01081 # =============================================================================
01082 if __name__ == '__main__' :
01083     _help_() 
01084 
01085 # =============================================================================
01086 # The END 
01087 # =============================================================================
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 19:58:56 2011 for GaudiPython by doxygen 1.4.7