00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
00043 import GaudiPython as gaudimodule
00044
00045
00046 GaudiPython = gaudimodule.gbl.GaudiPython
00047 GaudiAlg = gaudimodule.gbl.GaudiAlg
00048
00049 GaudiPython.Vector = gaudimodule.gbl.std.vector('double')
00050
00051 GaudiPython.Matrix = gaudimodule.gbl.std.vector('std::vector<double>')
00052
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
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
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
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
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
00157
00158
00159
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
00174
00175
00176
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
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
00197
00198
00199
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
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
00216
00217
00218
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
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
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
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
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
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
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
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
00338 def _get ( self , location ) :
00339 """
00340 Trivial function to access the data in TES
00341 """
00342 return self._evtSvc_[location]
00343
00344
00345
00346 def _getDet ( self , location ) :
00347 """
00348 Trivial function to access the data in TDS
00349 """
00350 return self._detSvc_[location]
00351
00352
00353
00354 def _ntupleSvc ( self ) :
00355 """
00356 Trivial function to access N-Tuple Service
00357 """
00358 return self._ntupleSvc_
00359
00360
00361
00362 def _evtcolSvc ( self ) :
00363 """
00364 Trivial function to access Event Collection Service
00365 """
00366 return self._evtcolSvc_
00367
00368
00369
00370
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
00379 def _success_ ( self ) : return gaudimodule.SUCCESS
00380
00381
00382
00383
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
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
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
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
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
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
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
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
00622
00623
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
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
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
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
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
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
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_ ,
01016 'tool' : _tool_ ,
01017 'svc' : _service_ ,
01018 'evtSvc' : _evtSvc ,
01019 'eventSvc' : _evtSvc ,
01020 'detSvc' : _detSvc ,
01021 'histoSvc' : _histoSvc ,
01022 'histSvc' : _histoSvc ,
01023 'get' : _get ,
01024 'getDet' : _getDet ,
01025 'finalize' : _finalize_ ,
01026 'beginRun' : _success_ ,
01027 'endRun' : _success_ ,
01028
01029 'hasProperty' : _hasProperty_ ,
01030 'getProperty' : _getProperty_ ,
01031 'setProperty' : _setProperty_ ,
01032 '__setattr__' : _set_attr_ ,
01033 '__getattr__' : _get_attr_
01034 }
01035
01036
01037
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
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
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
01081
01082 if __name__ == '__main__' :
01083 _help_()
01084
01085
01086
01087