Tutorial AthenaRootAccess

Download Report

Transcript Tutorial AthenaRootAccess

Tutorial AthenaRootAccess
Fany Dudziak
Réunion de Physique ATLAS LAL
Le 22 novembre 2007
Déroulement du tutorial
• Le tutorial s’est déroulé le 9 novembre au CERN
• il a été présenté par :
•
•
•
•
•
S. Binet, LBL 2007, CERN
Jyothsna Komaragiri, Simon Fraser University
Sven Menke, MPI München
Stahes Paganis, University of Sheffield
R.D. Schaffer, LAL
• Il était composé de trois parties:
• Une introduction sur l’utilisation interactive d’Athena,
• Une description de la sélection possible d’événements en
utilisant les TAGs,
• Un exemple d’utilisation d’AthenaRootAccess.
http://indico.cern.ch/conferenceDisplay.py?confId=21825
Principe de fonctionnement
AOD
User-Data
Skimming: event selection
Thinning: remove objects
Slimming: remove properties
DPD=thinAOD+UD
Perform actual
analysis
DPD is the AOD + User-Variables
ARA
Athena ‘Interactive’
(ROOT)
Final Results
Utiliser Athena en intéractif
• Les DPD-AOD sont accessibles via Athena et Root.
• Avec Athena on peut utiliser 2 méthodes :
• Un code c++ compilé sur les AOD
• Un code en python utilisable directement sous Athena
interactif ou en batch.
• En interactif -> simple d’utilisation : après avoir
configuré son environnement de travail, il faut créer une
routine en python :
– -> Transparents de Stathes:
Simple to start with
myInit.py
include( "AthenaPoolCnvSvc/ReadAthenaPool_jobOptions.py" )
EventSelector = Service ( "EventSelector" )
EventSelector.InputCollections =[
"rfio:/castor/cern.ch/user/p/paganis/13.0.30/AOD.016473._00001.pool.root.1" ]
include("ParticleBuilderOptions/AOD_PoolCnv_jobOptions.py")
include("PyAnalysisCore/InitPyAnalysisCore.py")
input
file(s)
to read AODs
theApp.initialize()
Python
analysis tools
[myName@lxplus217]~/run% athena -i myInit.py
.............................
.............................
ApplicationMgr INFO Application Manager Initialized successfully
Athena
INFO entered interactive mode - have fun!
Athena
INFO you can call theApp.run() to execute and use ctrl-d to exit
athena>
ready to go…
Open the book at the table of
contents…
athena> theApp.nextEvent()
PyAthenaEventLo...
PyAthenaEventLo...
SUCCESS
INFO
INFO
athena> dumpSG()
===>>>
===>>>
run 1 event to get pointers to containers
start of event 35312
end of event 35312
<<<===
<<<===
dump data store contents (StoreGate)
<<<<<<<<<<<<<<<<< Data Store Dump >>>>>>>>>>>>>>>
StoreGateSvc(StoreGateSvc)::dump():
...........................................
...........................................
Found 1 proxy for ClassID 2101 (EventInfo):
flags: ( valid, UNLOCKED, reset) --- data: 0xcc68710 --- key:
...........................................
Found 1 proxy for ClassID 28494668 (TriggerDecision):
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
...........................................
Found 23 proxies for ClassID 75817330 (MissingET):
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
...........................................
...........................................
Found 1 proxy for ClassID 1094973728 (PhotonContainer):
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
...........................................
Found 8 proxies for ClassID 1118613496 (ParticleJetContainer):
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
...........................................
...........................................
Found 1 proxy for ClassID 1341992142 (ElectronContainer):
flags: ( valid, UNLOCKED, reset) --- data:
0 --- key:
...........................................
...........................................
StreamingEventInfo
MyTriggerDecision
MET_Base
MET_Calib
MET_CellOut
MET_CorrTopo
MET_Cryo
.............
.............
container
names and
keys to
retrieve them
PhotonCollection
Cone4TopoParticleJets
Cone4TowerParticleJets
ConeTopoParticleJets
.......................
.......................
ElectronCollection
now look
at this…
athena> econ = PyParticleTools.getElectrons( "ElectronAODCollection“ )
athena> dir( econ )
[..., 'at', 'back', 'begin', 'capacity', 'clear', 'empty', 'end', 'erase', 'front', 'insert',
'max_size', 'pop_back', 'print', 'push_back', 'reserve', 'resize', '
athena> econ.size()
6
size',
'sort', ...]
how many electrons in this event?
athena> e1 = econ[0]; dir( e1 )
[..., 'author', 'charge', 'cluster', 'clusterLink',
get the
electron
container
and list
its
methods
get the first one and see its structure
'conversionAngleMatch',
'conversionTrackMatch', 'cosTh', 'cotTh', 'dataType', 'e', 'eg', 'electronID', 'et', 'eta',
'fillToken', 'hasCharge', 'hasPdgId', 'hasTrack', 'hlv', 'iPt', 'isEM', 'isEM_softElectron', 'm',
'm2', 'numberOfBLayerHits', 'numberOfBLayerSharedHits', 'numberOfGangedPixels', ... 'p', 'p2',
'parameter', 'pdgId', 'phi', 'pt', 'px', 'py', 'pz', ..., 'sinTh', 'track', 'trackLink']
athena> e1.pt()
23185.0512295
athena> clus1 = e1.cluster();
read its pT
navigate the substructures
dir( clus1 )
[..., 'begin', 'beginMoment', 'cell_begin', 'cell_end', 'checkRecoStatus', 'contains', 'cosTh',
'cotTh', 'e', 'eSample', 'end', 'endMoment', 'energy', 'energyBE', 'energy_max', 'et', 'eta',
'eta0', 'etaBE', 'etaSample', 'etamax', 'etasize', 'fillToken', 'getBasicEnergy',
'getCellContainer', 'getCellIndex', 'getCellWeight', 'getContainer', 'getEInSamples',
'getEtaInSamples', 'getIndex', 'getMoment', 'getMomentType', 'getMomentValue', 'getNumberOfCells',
'getParameter', 'getPhiInSamples', 'getRecoStatus', 'getTime', 'getVariable', 'hasSampling', 'hlv',
'iPt', 'inBarrel', 'inEndcap', ..., 'isEMSampling', 'is_valid_sampling', 'm', 'm2', 'nSamples',
'p', 'p2', 'phi', 'phi0', 'phiBE', 'phiSample', 'phimax', 'phisize', 'pt', 'putElement', 'px',
'py', 'pz', 'remove', 'removeAll', 'removeCell', 'removeCells', 'removeRecoStatus',
'retrieveMoment', 'reweight', 'reweightCell', ..., 'sinTh', 'size']
athena> clus1.inEndcap()
0
and so on…
Instantaneous back-navigation
add two lines in the
initialization file
(and put the ESD in the
same directory as the AOD)
...
include( "ParticleBuilderOptions/ESD_PoolCnv_jobOptions.py" )
EventSelector.BackNavigation = TRUE
...
myInit.py
athena> dir( e1 )
[..., 'author', 'charge', 'cluster', 'clusterLink', 'conversionAngleMatch', 'conversionTrackMatch',
'cosTh', 'cotTh', 'dataType', 'e', 'eg', 'electronID', 'et', 'eta', 'fillToken', 'hasCharge',
'hasPdgId', 'hasTrack', 'hlv', 'iPt', 'isEM', 'isEM_softElectron', 'm', 'm2', 'numberOfBLayerHits',
'numberOfBLayerSharedHits', 'numberOfGangedPixels', ... 'p', 'p2', 'parameter', 'pdgId', 'phi',
'pt', 'px', 'py', 'pz', ..., 'sinTh', 'track', 'trackLink']
athena> eg1 = e1.eg()
Domain[ROOT_All]: level[Info] -> Access
DbDatabase
READ
[ROOT_All]
streamtest.004980.inclEle.recon.ESD.v12000604_tid008366._00029.pool.root.1
streamtest.004980.inclEle.recon.ESD.v12000604_tid008366._00029.pool.root.1:
level[Always] Root file version:51000
use the pointer to the
egamma container to
“open the door” of the
ESD
athena> dir( eg1 )
[..., 'cosTh', 'cotTh', 'e', 'et', 'eta', 'fillToken', 'get_Cluster', 'get_ClusterElementLink',
'get_EMBremFit', 'get_EMConvert', 'get_EMShower', 'get_EMTrackMatch', 'get_TrackParticle',
'get_TrackParticleElementLink', 'get_egammaID', 'hlv', 'iPt', 'isem', 'isemse', 'm', 'm2', 'p',
'p2', 'phi', 'print', 'pt', 'px', 'py', 'pz', ...]
Quelques mots sur les TAGS
• Description abrégée
d’énénements :
– On peut chercher
rapidement l’information
qui nous intéresse grace à
leur petite taille
– On n’utilise que les
évènements qui nous
intéresse pour notre
analyse.
– Concrètement on prend un
fichier AOD et on en extrait
uniquement ce qui nous
intéresse.
Datatype
Size
RAW
1.6-2MB
ESD
500KB
AOD
100KB
TAG
1KB
https://twiki.cern.ch/twiki/bin/view/Atlas/StreamsTestRelationalTagDatabase
Utilisation de AthenaRootAccess
• Trois manière différents d’effectuer son analyse , avec:
• Une macro CINT
• Un programme compilé en c++
• Un script en python
• Par exemple, on commence par utiliser un script
« test.py » : (cf back slides)
• Ensuite il suffit de démarré root:
–
–
–
–
root [0] TPython::ExecScript("test.py");
root [1] CollectionTree_trans = (TTree *)gROOT->
FindObjectAny("CollectionTree_trans");
root [2] TBrowser tb;
• On a accés directement aux AOD et aux containers .
Utilisation de AthenaRootAccess
• On peut utiliser aussi une classe compilée en c++ pour
faire notre analyse : dans ce cas il suffit de faire:
–
–
–
–
root [0] TPython::ExecScript("test.py");
root [1] CollectionTree_trans = (TTree *)gROOT->FindObjectAny("CollectionTree_trans");
root [2] ClusterExample ce;
root [3] ce.plot(CollectionTree_trans);
– >
Et on voit apparaître ses premiers histogrammes !!
L’équivalent existe en python et CINT
http://indico.cern.ch/getFile.py/access?contribId=0&resId=0&materialId=slides&confI
d=21825
Conclusion
• Lecture simplifiée des AOD
• Analyse plus rapide permise
• Souplesse de l’écriture car on a la possibilité d’utiliser
différents langages (C++, CINT, python)
• Mais attention:
• pour l’instant on ne peut pas tout faire avec chaque
langage
• Chaque langage a ses spécificités :
– Python : facile à écrire, pas:c besoin de compiler, pas de
déclaration, mais bugs pour les boucles for/if. De plus, sa
rapidité d’exécution n’est pas sure (/c++) pour de
nombreux événements.
– CINT moins rapide que le c++.
Back Slides
import user # look for .pythonrc.py for user init
import ROOT
import PyCintex
import AthenaROOTAccess.transientTree
# Put your AOD file here.
aodFile = 'AOD.013611._00065.pool.root.14'
f = ROOT.TFile.Open (aodFile)
assert f.IsOpen()
# Fill this in if you want to change the names of the transient branches.
branchNames = {}
#branchNames['ElectronCollection'] = 'ele'
#branchNames['PhotonCollection'] = 'gam'
tt = AthenaROOTAccess.transientTree.makeTree(f, branchNames = branchNames)
# tt is the transient tree "CollectionTree_trans" containing the (proxies) to
# all available transient data object in the file f.
# The original, persistent tree is declared as a friend
# of CollectionTree_trans, so that the transient tree will provide
# access to both transient data objects and to their persistent counterparts.
##############################################################################
#
# Now you should be able to do things like:
#
def tryThingsOut() :
tt.Scan('ElectronAODCollection.e():ElectronAODCollection.cluster().e()')
tt.Draw('PhotonAODCollection.phi()')
#NOT YET tree.Show(0)
#NOT YET tree.StartViewer()
for iEvt in range(3):
tt.GetEntry(iEvt)
print tt.ElectronAODCollection[0].eta()
#
#
#tryThingsOut()