34
NIKHEF, 13th June. 2006 1/34 Using Python In LHCb Using Python In LHCb E. Rodrigues, NIKHEF E. Rodrigues, NIKHEF NIKHEF NIKHEF A Practical Introduction A Practical Introduction

NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

Embed Size (px)

Citation preview

Page 1: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 1/34

Using Python In LHCbUsing Python In LHCb

E. Rodrigues, NIKHEFE. Rodrigues, NIKHEF

NIKHEFNIKHEF

A Practical IntroductionA Practical Introduction

Page 2: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 2/34

What this tutorial is notWhat this tutorial is not

A course on PythonA course on Python A course on GaudiPythonA course on GaudiPython A technical presentationA technical presentation

What this tutorial isWhat this tutorial is

An incentive to start exploiting Python in our everyday work An incentive to start exploiting Python in our everyday work A presentation a la “learning by examples”A presentation a la “learning by examples” An informal tutorialAn informal tutorial

We will have a session devoted to Python at the LHCb Software Week on theWe will have a session devoted to Python at the LHCb Software Week on the

2020thth … with a more technical flavour … … with a more technical flavour …

Disclaimer

Page 3: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 3/34

What is Python?What is Python?

OO scripting languageOO scripting language Interpreted – no compilation neededInterpreted – no compilation needed Dynamically typedDynamically typed

Why should I use it?Why should I use it?

Very easy to use, powerful, elegantVery easy to use, powerful, elegant Fast learning curveFast learning curve Extensive set of modules available on marketExtensive set of modules available on market Ideal for interactive work/analysis, testing, prototyping new ideas, …Ideal for interactive work/analysis, testing, prototyping new ideas, … Allows to work with different applications at the same timeAllows to work with different applications at the same time

e.g.: Gaudi + ROOTe.g.: Gaudi + ROOT

Not convinced yet? Relax, wait and see … ;-)Not convinced yet? Relax, wait and see … ;-)

Why should I use Python?

Before …Before … … … and afterand after

Page 4: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 4/34

Basics of using PythonBasics of using Python

Apologies for some technical bits …Apologies for some technical bits …

Page 5: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 5/34

Python and Dictionaries

Python – C++ bindingsPython – C++ bindings

Python knows about our C++ objects via dictionariesPython knows about our C++ objects via dictionaries All is nicely done “behind the scenes” …All is nicely done “behind the scenes” …

DictionariesDictionaries

All our XML-defined event classes have the corresponding dictionaries All our XML-defined event classes have the corresponding dictionaries built automaticallybuilt automatically

Other (event) classes defined in .h & .cpp needed some extra “hand-Other (event) classes defined in .h & .cpp needed some extra “hand-made” files for producing the dictionariesmade” files for producing the dictionaries

Page 6: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 6/34

C++ to Python Mapping

:: (the global namespace) gaudimodule.gbl

Namespace::Class gaudimodule.gbl.Namespace.Class

object = new Class( … ) object = Class( … )

enum::item enum.item

Null pointer None

Examples will be given throughout the next transparencies …Examples will be given throughout the next transparencies …

Page 7: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 7/34

Python Packages available (1/2)

GaudiPythonGaudiPython

Top-level framework for working with Gaudi applications in PythonTop-level framework for working with Gaudi applications in Python Interface of Gaudi to PythonInterface of Gaudi to Python Contains a series of modules:Contains a series of modules: e.g.: gaudimodule: e.g.: gaudimodule: main module, allows instantiation of ApplicationManagermain module, allows instantiation of ApplicationManager

GaudiAlgs : GaudiAlgs : for using GaudiAlgorithm, GaudiTupleAlg, etc.for using GaudiAlgorithm, GaudiTupleAlg, etc.

units : units : standards HEP units as in Geant4 standards HEP units as in Geant4

PyRootPyRoot

Exposes ROOT to PythonExposes ROOT to Python RooFit is now also available!RooFit is now also available! ROOT ROOT modulemodule

Purely descriptive – examples will follow …Purely descriptive – examples will follow …

Page 8: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 8/34

Tr/TrackPythonTr/TrackPython

Introduced to expose main tracking tools to PythonIntroduced to expose main tracking tools to Python Access to extrapolators, fitter, projectors, clone finder, etc.Access to extrapolators, fitter, projectors, clone finder, etc. Note: simple module that is likely to evolve as GaudiPython evolves too …Note: simple module that is likely to evolve as GaudiPython evolves too … gtracktools gtracktools modulemodule

Event/LinkerInstancesEvent/LinkerInstances

Facilitates access to main linker classes LinkedTo & LinkedFrom in Facilitates access to main linker classes LinkedTo & LinkedFrom in Event/LinkerEventEvent/LinkerEvent

Easy manipulation of links to MC-truth in PythonEasy manipulation of links to MC-truth in Python eventassoc eventassoc modulemodule

Python Packages available (2/2)

Page 9: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 9/34

use TrackPython v* Tr

use EventInstances v* Event

use GaudiPython v*

Setting the Environment

In the CMT requirements fileIn the CMT requirements file

Software managementSoftware management

LHCb software managed via CMTLHCb software managed via CMT CMT sets up the consistent environment for a given applicationCMT sets up the consistent environment for a given application

For using GaudiPythonFor using GaudiPython

For using some tracking tools and the association tablesFor using some tracking tools and the association tables

Page 10: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 10/34

Start a Python promptStart a Python prompt

directly from within Emacsdirectly from within Emacs

Python interpreter inside Emacs (1/2)

Neat way ofNeat way of

editing and runningediting and running

in the same environmentin the same environment

Page 11: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 11/34

Checking what Checking what

gaudimodule gaudimodule

containscontains

Python interpreter inside Emacs (2/2)

Code in the file can be Code in the file can be highlighted and run highlighted and run

piece-by-piecepiece-by-piece

Page 12: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 12/34

Common ApplicationsCommon Applications

with GaudiPythonwith GaudiPython

Page 13: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 13/34

Reading a Gaudi file

/Event

/Event/Gen

/Event/MC

/Event/MC/Header

# some lines skipped ...

/Event/Link/Rec

/Event/Link/Rec/Track

/Event/Link/Rec/Track/Forward

/Event/Link/Rec/Track/RZVelo

/Event/Link/Rec/Track/Velo

# some lines skipped ...

/Event/Rec

/Event/Rec/Header

/Event/Rec/Status

/Event/Rec/Track

/Event/Rec/Track/Forward

/Event/Rec/Track/RZVelo

/Event/Rec/Track/Velo

# some lines skipped ...

>>> import gaudimodule

>>> appMgr = gaudimodule.AppMgr( outputlevel=3,

joboptions=‘$EVENTSYSROOT/options/PoolDicts.opts' )

>>> SEL = appMgr.evtSel()

>>> SEL.open( ‘PFN:rfio:/castor/cern.ch/user/c/cattanem/Boole/v11r5/0601-11144100.digi' )

>>> appMgr.run( 1 )

>>> EVT = appMgr.evtSvc()

>>> EVT.dump()

Content of the TESContent of the TES

(not all content is shown by default …)(not all content is shown by default …)

OUTPUT OF EVT.dump()OUTPUT OF EVT.dump()

Minimum requiredMinimum required

to read a fileto read a file

Reading only needs Reading only needs

dictionariesdictionaries

Page 14: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 14/34

Running a Gaudi Application

>>> import gaudimodule

>>> appMgr = gaudimodule.AppMgr( outputlevel=3, joboptions=‘../options/v200601.opts' )

>>> appMgr.run( 1 )

# feel like having a look at the TES?

>>> EVT = appMgr.evtSvc()

>>> EVT.dump()

Example: to run BrunelExample: to run Brunel

>>> SEL = appMgr.evtSel()

>>> dir(SEL)

['__class__', '__delattr__', '__dict__', '__doc__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_ip', '_isvc', '_name', '_optsvc', '_svcloc', 'finalize', 'g', 'getInterface', 'initialize', 'isnumber', 'isvector', 'name', 'open', 'properties', 'reinitialize', 'retrieveInterface', 'rewind', 'typecnv']

# say you need more printout of the algorithms/tools names …

>>> MSG = appMgr.service( 'MessageSvc‘ )

>>> MSG.Format = "% F%60W%S%7W%R%T %0W%M";

>>> SEL.rewind()

# off you go again …

>>> appMgr.run( 1 )

Making use of interactivity …Making use of interactivity …

Just one possibility …Just one possibility …

Page 15: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 15/34

Retrieving objects from the TES

>>> tracks = EVT[ ‘Rec/Track/Forward’ ]

>>> print tracks.size()

11

>>> mcps = EVT[ ‘MC/Particles’ ]

>>> for mcp im mcps:

>>> print mcp.particleID.pid(), mcp.p()

From now on let us assume we’ve always run at least 1 event …From now on let us assume we’ve always run at least 1 event …

appMgr.loaddict( ‘MCEventDict’ )

appMgr.loaddict( ‘TrackEventDict’ )

>>> import gaudimodule

>>> appMgr = gaudimodule.AppMgr( outputlevel=3, joboptions=‘../options/v200601.opts' )

>>> appMgr.run( 1 )

>>> EVT = appMgr.evtSvc()

One might need to load some dictionaries for inspecting objectsOne might need to load some dictionaries for inspecting objects

This will becone unnecessaryThis will becone unnecessary

in the future …in the future …

Looping over the containerLooping over the container

Page 16: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 16/34

Using the Event Model Classes (1/2)

>>> Track = gaudimodule.gbl.LHCb.Track

>>> Track

<class '__main__.LHCb::Track'>

>>> defaultTrack = gaudimodule.gbl.LHCb.Track()

>>> defaultTrack

{ chi2PerDoF : 0

nDoF : 0 flags : 0

lhcbIDs :

states :

measurements :

nodes :

}

Get hold of the class definitionGet hold of the class definition

Our classes are defined in theOur classes are defined in the

LHCb namespaceLHCb namespace

Track class instantiationTrack class instantiation

Track data membersTrack data members

>>> aLineTraj = gaudimodule.gbl.LHCb.LineTraj()

>>> aStateTraj = gaudimodule.gbl.LHCb.StateTraj()

>>> otMeas = gaudimodule.gbl.LHCb.OTMeasurement()

appMgr.loaddict( ‘TrackFitEventDict’ )

appMgr.loaddict( ‘LHCbKernelDict’ )

Page 17: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 17/34

>>> State = gaudimodule.gbl.LHCb.State

>>> State.LocationUnknown

0

>>> State.AtT

5

>>> State.BegRich2

8

>>> Measurement = gaudimodule.gbl.LHCb.Measurement

>>> Measurement.Unknown

0

>>> Measurement.VeloR

1

>>> Measurement.TT

3

Using the Event Model Classes (2/2)

Playing with the enums …Playing with the enums …

Neat way of using the enums:Neat way of using the enums:

As close as possible to the C++ syntaxAs close as possible to the C++ syntax

e.g.: State::AtT -> State.AtTe.g.: State::AtT -> State.AtT

Page 18: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 18/34

User-defined Algorithm

Modules from GaudPythonModules from GaudPython

My class definitionMy class definition

Algorithm’s main methodsAlgorithm’s main methods

Page 19: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 19/34

Tracking in PythonTracking in Python

LHCb Note 2006-014 for further explanationsLHCb Note 2006-014 for further explanations

Page 20: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 20/34

Tracking Classes (1/3)

>>> track = tracks[0]

>>> dir(track)

['AlreadyUsed', 'Backward', 'CnvForward', 'CnvKsTrack', 'CnvMatch', 'CnvSeed', 'CnvVelo', 'CnvVeloBack', 'CnvVeloTT', 'Downstream', 'FitFailed', 'FitUnknown', 'Fitted', 'HistoryUnknown', 'IPSelected', 'Invalid', 'IsA', 'Kalman', 'Long', 'PIDSelected', 'PatForward', 'PatKShort', 'PatRecIDs', 'PatRecMeas', 'PatVelo', 'PatVeloTT', 'ShowMembers', 'StatusUnknown', 'Streamer', 'StreamerNVirtual', 'TrackIdealPR', 'TrackKShort', 'TrackMatching', 'TrackSeeding', 'TrackVeloTT', 'TrgForward', 'TsaTrack', 'Ttrack', 'TypeUnknown', 'Unique', 'Upstream', 'Velo', 'VeloR', '__class__', '__delattr__',

# a few lines skipped ...

'__weakref__', 'addToAncestors', 'addToLhcbIDs', 'addToMeasurements', 'addToNodes', 'addToStates', 'ancestors', 'charge', 'checkFlag', 'checkHistory', 'checkHistoryFit', 'checkStatus', 'checkType', 'chi2', 'chi2PerDoF', 'clID', 'classID', 'clearAncestors', 'clearStates', 'clone', 'cloneWithKey', 'closestState', 'copy', 'fillStream', 'firstState', 'flag', 'flags', 'hasKey', 'hasStateAt', 'history', 'historyFit', 'index', 'isMeasurementOnTrack', 'isOnTrack', 'key', 'lhcbIDs', 'measurement', 'measurements', 'momentum', 'nDoF', 'nLHCbIDs', 'nMeasurements', 'nMeasurementsRemoved', 'nStates', 'nodes', 'p', 'parent', 'posMomCovariance', 'position', 'positionAndMomentum', 'pt', 'removeFromAncestors', 'removeFromLhcbIDs', 'removeFromMeasurements', 'removeFromNodes', 'removeFromStates', 'reset', 'serialize', 'setChi2PerDoF', 'setFlag', 'setFlags', 'setHistory', 'setHistoryFit', 'setLhcbIDs', 'setNDoF', 'setParent', 'setSpecific', 'setStatus', 'setType', 'slopes', 'specific', 'stateAt', 'states', 'status', 'type']

If you ever thought the Track class cannot answer many questions …If you ever thought the Track class cannot answer many questions …

Page 21: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 21/34

Tracking Classes (2/3)

>>> track.checkType( Track.Long ), track.type() == Track.Long

(1, True)

>>> track.checkHistory( Track.PatForward )

1

>>> track.checkStatus( Track.Fitted )

0

Operations on the enumsOperations on the enums

>>> track.charge()

1

>>> track.nDoF()

12

Basic propertiesBasic properties

>>> track.nStates()

2L

>>> state = track.states()[0]

>>> state.x(), state.y(), state.z()

(16.987653188753605, 0.0, 397.76935188731028)

Track contentsTrack contents

Page 22: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 22/34

Tracking Classes (3/3)

>>> newtrack = track.clone()

>>> newtrack.setFlag( Track.Clone, True )

>>> newtrack.checkFlag( Track.Clone )

1

The Track can also be modified …The Track can also be modified …

>>> print track.nLHCbIDs()

32

>>> print track.nMeasurements()

0

>>> ids = track.lhcbIDs()

>>> ids

<ROOT.vector<LHCb::LHCbID> object at 0xf4eab24>

What’s on the track?What’s on the track?

Page 23: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 23/34

Extrapolators (1/2)

>>> from gtracktools import setToolSvc, extrapolator

>>> setToolSvc( appMgr )

>>> linprop = extrapolator( 'TrackLinearExtrapolator' )

>>> dir(linprop)

# some lines skipped ...

'__setattr__', '__str__', '__weakref__', 'addRef', 'finalize',

'initialize', 'interfaceID', 'momentum', 'name', 'p', 'parent',

'position', 'positionAndMomentum', 'propagate', 'pt',

'queryInterface', 'release', 'slopes', 'transportMatrix', 'type']

>>>

>>> help(linprop.propagate)

# one gets several lines of documentation

# Helper dict. of package with gtracktools module

appMgr.loaddict( ‘TrackPythonDict’ )

Needs to be called only onceNeeds to be called only once

(may become unnecessary …)(may become unnecessary …)

Get hold of the Linear extrapolatorGet hold of the Linear extrapolator

Page 24: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 24/34

Extrapolators (2/2) # get hold of the Track to be extrapolated

>>> track = tracks[3]

# instantiate a State, to retrieve the result of the extrapolation

>>> state = gaudimodule.gbl.LHCb.State()

>>> state.x(), state.y(), state.z()

(0.0, 0.0, 0.0)

# instantiate the parabolic extrapolator

>>> parprop = extrapolator( 'TrackParabolicExtrapolator' )

# define the z-position to extrapolate to

>>> znew = 100.

>>> parprop.propagate( track, znew, state )

SUCCESS

>>> state.x(), state.y(), state.z()

(-5.859069220236659, -1.5738179596044015, 100.0)

# "state" variable contains some random State

>>> state.x(), state.y(), state.z()

(491.95847296136429, -39.394353509484759, 9520.0)

>>> newstate = state.clone()

>>> linprop.propagate( newstate, 5000. )

SUCCESS

>>> newstate.x(), newstate.y(), newstate.z()

(72.562676254077573, -21.114433639356392, 5000.0)

Page 25: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 25/34

Checking on Clone Tracks

>>> track0 = tracks[0]

>>> track1 = tracks[1]

>>> TrackCloneFinder.areClones( track0, track1 ) == True

False

>>> track1 = track0.clone()

>>> TrackCloneFinder.areClones( track0, track1 ) == True

True

GETTING HOLD OF THE GETTING HOLD OF THE CLONES FINDERCLONES FINDER

>>> from gtracktools import cloneFinder

>>> CLONEFINDER = cloneFinder( 'TrackCloneFinder' )

Pick up some 2 tracksPick up some 2 tracks

Are they clones?Are they clones?

Page 26: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 26/34

Fitting a Tracking "from A to Z"

# Fitting tracks with the default options cannot get simpler.

# The "complete job", i.e. fitting and setting of the appropriate flags, only takes a few lines:

>>> track = tracks[0]

>>> sc = MASTERFITTER.fit( track )

>>> if sc == gaudimodule.SUCCESS:

... track.setStatus( Track.Fitted )

... else:

... track.setStatus( Track.FitFailed )

... track.setFlag( Track.Invalid, True )

GETTING HOLD OF THE GETTING HOLD OF THE MASTER FITTERMASTER FITTER

>>> from gtracktools import fitter

>>> MASTERFITTER = fitter( 'TrackMasterFitter' )

# one gets some printout at this level ...

Pick up some track and fit itPick up some track and fit it

Done! Set Status flagDone! Set Status flag

Page 27: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 27/34

>>> track = tracks[7]

>>> mcp = LT.first(track)

>>> mcp.key()

849

>>> mcp

{ momentum : (-673.62,-416.03,11761.6,11789)

particleID : { pid : 211

}

}

>>> mcp = LT.next()

>>> mcp == None

True

Linker Tables of Tracks (1/2)

>>> location = 'Rec/Track/Velo'

>>> tracks = EVT[ location ]

>>> from eventassoc import linkedTo

>>> Track = gaudimodule.gbl.LHCb.Track

>>> MCParticle = gaudimodule.gbl.LHCb.MCParticle

>>> LT = linkedTo( MCParticle, Track, location )

>>> LT

<ROOT.LinkedTo<LHCb::MCParticle,LHCb::Track> object at 0xf485460>

>>> LT.notFound() == False

True

Finding the Linker table Track - MCParticleFinding the Linker table Track - MCParticle

Get some tracks Get some tracks (e.g. VELO tracks)(e.g. VELO tracks)

Class definitionsClass definitions

Retrieve Linker tableRetrieve Linker table

Get link with heighest weightGet link with heighest weight

Get next linked MCParticle, if anyGet next linked MCParticle, if any

Page 28: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 28/34

Linker Tables of Tracks (2/2)

>>> from eventassoc import linkedFrom

>>> LF = linkedFrom(Track,MCParticle,location)

>>> LF

<ROOT.LinkedFrom<LHCb::Track,LHCb::MCParticle> object at 0xf4d6210>

>>> LF.notFound() == False

True

>>> track.key()

7

>>> mcp = LT.first(track)

>>> mcp.key()

849

>>> trk = LF.first(mcp)

>>> trk.key()

7

Going «  back and forth» with links …Going «  back and forth» with links …

>>> range = LT.range(track)

>>> range

<ROOT.vector<LHCb::MCParticle*> object at 0xfe27e90>

>>> range.size()

1L

>>> mcp = range[0]

>>> mcp.key()

849

With the looks of the Associators …With the looks of the Associators …

Page 29: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 29/34

Python version of GaudiAlgorithmPython version of GaudiAlgorithm

Standard HEP unitsStandard HEP units

Algorithm definitionAlgorithm definition

Algorithm’s main methodsAlgorithm’s main methods

Save the ROOT histo to a fileSave the ROOT histo to a file

Using what is available …

Page 30: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 30/34

Second part of the file

All of this will execute if the whole file is run asAll of this will execute if the whole file is run aspython -i myJob.py with this bit:python -i myJob.py with this bit:

# with the « -i » option the user gets back control on the prompt …

>>> f = ROOT.TFile( LongTrackPAlgo.root’, 'READ' )

# play with the contents …

>>> appMgr = gaudimodule.AppMgr( outputlevel=3, joboptions='../options/v200601.opts' )

>>> appMgr.loaddict( 'TrackEventDict' )

>>> appMgr.loaddict( 'TrackPythonDict' )

>>> EVT = appMgr.evtSvc()

>>> appMgr.addAlgorithm( LongTrackPAlgo( 'LongTrackP' ) )

>>> appMgr.run( 250 )

>>> from ROOT import TCanvas

>>> histo.Draw()

# not necessary unless you really want to finish everything:

#appMgr.finalize()

# run some more events!

>>> appMgr.run( 100 )

# continue playing interactively …

Page 31: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 31/34

Playing with ROOT & RooFitPlaying with ROOT & RooFit

Page 32: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 32/34

ROOT from DOSROOT from DOS

Instantiation of the TBrowserInstantiation of the TBrowser

Page 33: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 33/34

Instantiation of the TBrowser from the Python promptInstantiation of the TBrowser from the Python prompt

ROOT from the Python Prompt

Page 34: NIKHEF, 13th June. 2006 1/34 Using Python In LHCb E. Rodrigues, NIKHEF NIKHEF A Practical Introduction

NIKHEF, 13th June. 2006 34/34

Using ROOT

def fit_histo( h ):

max = h.GetMaximum()

doubleGaussian = ROOT.TF1( "Double Gaussian", "gaus(0) + gaus(3)" )

doubleGaussian.SetParameters( max, h.GetMean(), h.GetRMS(), max/100., h.GetMean(), h.GetRMS()*10. )

h.Fit( doubleGaussian )

return doubleGaussian.GetParameter(2) # RMS of core Gaussian

Defining a user-made fitting functionDefining a user-made fitting function

from ROOT import TStyle, TF1, TFile, TCanvas

def rootSettings():

global myStyle

myStyle = ROOT.TStyle( 'myStyle', 'My personal ROOT style' )

myStyle.SetCanvasColor( 0 )

myStyle.SetPadColor( 0 )

myStyle.SetOptStat( 111111 )

myStyle.SetOptFit( 1111 )

ROOT.gROOT.SetStyle( 'myStyle' )

ROOT.gROOT.ForceStyle()

Defining some looks!Defining some looks!