Usage of tools and services in Bender is rather trivial
- One aquires tools and services usin the method
tool
andsvc
(that are very smilar to thir C++ counterpartnersGaudiAlgorithm::tool
andGaudiAlgorithm::service
). Typically tools and services are aquired ininitialize
method, e.g.
class TupleTools(Algo):
"""Demonstration how to use TupleTools with Bender"""
def initialize ( self ) :
sc = Algo.initialize ( self ) ## initialize the base class
if sc.isFailure() : return sc
IPTT = cpp.IParticleTupleTool
IETT = cpp.IEventTupleTool
self.t1 = self.tool( IPTT,'TupleToolPid' , parent = self ) ## <--- HERE!
if not self.t1 : return FAILURE
self.t2 = self.tool( IPTT,'TupleToolGeometry' , parent = self ) ## <--- HERE!
if not self.t2 : return FAILURE
self.e1 = self.tool( IETT,'TupleToolBeamSpot' , parent = self ) ## <--- HERE!
if not self.e1 : return FAILURE
return SUCCESS
- Then tools and services can be direcly used in
analyse
-method:
## the main 'analysis' method
def analyse( self ) : ## IMPORTANT!
...
tup = self.nTuple('MyTuple')
for b in particles :
psi = b ( 1 ) ## the first daughter: J/psi
## Particle Tuple Tool
sc = self.t1.fill ( b , psi , 'psi_' , tup )
if sc.isFailure() : return sc
## Particle Tuple Tool
sc = self.t2.fill ( b , b , 'b_' , tup )
if sc.isFailure() : return sc
## Event Tuple Tool
sc = self.e1.fill ( tup )
if sc.isFailure() : return sc
tup.write()
Note that many standard tools and standard services
are direclty accessible via the base class DVAlgorithm
, e.g.
vx_fitter = self.vertexFitter()
dcalc = self.distanceCalculator()
pp = self.ppSvc() ## particle property service
{% challenge "Challenge for the fans of tuple tools use" %}
- Add set of known tuple tools into your example
- (Do not forget to instrument the
initialize
method to aquire tools)
- (Do not forget to instrument the
- Run it and observe new varianles into n-tuple.
- Do their names correspond to your expectations? {% solution "Solution" %} The complete module is accessible here The structure of n-tuple is:
In [7]: from Ostap.Logger import multicolumn
In [8]: f = ROOT.TFile('TupleTools.root','read')
In [9]: t = f.TupleTools.MyTuple
In [10]: print multicolumn ( t.branches() )
BeamX b__ENDVERTEX_COV_ b__ENDVERTEX_Y b__FDCHI2_OWNPV b__OWNPV_CHI2 b__OWNPV_XERR b__OWNPV_ZERR
BeamY b__ENDVERTEX_NDOF b__ENDVERTEX_YERR b__FD_OWNPV b__OWNPV_COV_ b__OWNPV_Y psi__ID
b__DIRA_OWNPV b__ENDVERTEX_X b__ENDVERTEX_Z b__IPCHI2_OWNPV b__OWNPV_NDOF b__OWNPV_YERR
b__ENDVERTEX_CHI2 b__ENDVERTEX_XERR b__ENDVERTEX_ZERR b__IP_OWNPV b__OWNPV_X b__OWNPV_Z
{% endchallenge %}