Aod ntuple

From Atlas Wiki
Jump to navigation Jump to search

This page contains basic prescriptions to get physics objects from the AOD and the AOD-based Root ntuple (from now on defined as Woutuple).

Some comments on quality selection cuts will be added as work progresses.

--Barison 18:12, 19 May 2005 (MET DST)

Monte Carlo Truth Particles

The ntuples contain the full MC truth information ("truth") that is contained in the AOD. For the T1 (ttbar) sample there is an additional block ("hardtruth") with the hard scatter information remade from the ESD by Eric Cogneras. In the Analysis Skeleton there is an example where some of the information is printed to the screen.

For each truth_particle the 4-vector, PDG code, status code and decay tree navigation information: references to decay products of any given truth particle are stored in tidx_dg0_truth through tidx_dg9_truth, which contain the indices of the decay products in the truth ntuple block. The actual number of daughters for a given decay is specified by numdg_truth. tidx_moth_truth contains the index of the mother particle in the truth ntuple block. If a given link does not exists (e.g. a particle has no mother), then the link index value is set to -1. For convenience, direct 'jump links' exist to the top quark and anti-top quark in the event (if present) in tidx_top_truth and tidx_antitop_truth. Direct jump links to the decay producs of the top (a W and a b quark) are also stored in tidx_Wplus_truth, tidx_Wminus_truth, tidx_b_truth and tidx_antib_truth

Note: Due to some problems with the decoding of the HERWIG truth block it is not always very clear how to extract the kinematics from the top, the W and the b correctly. Please check this information before you use it and, if necessary, get the truth from these particles yourself from the full block.


Electron in AOD/Woutuple
AOD Container Name AOD Variable Woutuple Variable Variable Type Comment
ElectronCollection (*elecTES)->size() n_elec Int Number of electrons in the Woutuple
(*elecItr)->hlv().x() px_elec Double Px
(*elecItr)->hlv().y() py_elec Double Py
(*elecItr)->hlv().z() pz_elec Double Pz
(*elecItr)->hlv().perp() pt_elec Double Pt
(*elecItr)->hlv().eta() eta_elec Double Eta
(*elecItr)->hlv().phi() phi_elec Double Phi
(*elecItr)->isEM() isem_elec Int isEM flag (see below)
(*elecItr)->hasTrack() hastrk_elec Int (bool) HasTrack flag: presence of charged track in the Inner Detector
(*elecItr)->z0wrtPrimVtx() z0vtx_elec Double Intersection (z) of track with the beam axis
(*elecItr)->d0wrtPrimVtx() d0vtx_elec Double Transverse impact parameter d0
(*elecItr)->numberOfBLayerHits() nblayerhits_elec Int Number of hits in the Pixel B-layer
(*elecItr)->numberOfPixelHits() npixelhits_elec Int Number of hits in the Pixel detector
(*elecItr)->numberOfSCTHits() nscthits_elec Int Number of hits in the SCT
(*elecItr)->numberOfTRTHits() ntrthits_elec Int Number of hits in the TRT
(*elecItr)->numberOfTRTHighThresholdHits() ntrththits_elec Int Number of high threshold hits in the TRT
(*elecItr)->author() auth_elec Int (enum) Algorithm used to create the electron: unknown=0, egamma=1, softe=2
(*elecItr)->parameter(ElectronParameters::EoverP) eoverp_elec Double E/P ratio
(*elecItr)->parameter(ElectronParameters::etcone) etcone_elec Double Energy deposition in a cone dR=0.45 around the electron cluster
(*elecItr)->parameter(ElectronParameters::etcone20) etcone20_elec Double Energy deposition in a cone dR=0.20 around the electron cluster. Standard cone size for ATLFAST
(*elecItr)->parameter(ElectronParameters::etcone30) etcone30_elec Double Energy deposition in a cone dR=0.30 around the electron cluster. Currently empty
(*elecItr)->parameter(ElectronParameters::etcone40) etcone40_elec Double Energy deposition in a cone dR=0.40 around the electron cluster
(*elecItr)->parameter(ElectronParameters::emWeight) emwgt_elec Double Weight for electrons (see below)
(*elecItr)->parameter(ElectronParameters::pionWeight) piwgt_elec Double Weight for pions (see below)

There are 3 types of quality cuts you can perform on the electron candidates:

  1. Cuts based on the isEM flag
  2. Cuts based on likelihood
  3. Cuts based on NeuralNet output

1. The isEM flag uses both calorimeter and tracking information in addition to TRT information. The flag is a bit field which marks whether the candidate passed or not some safety checks.

The bit field marks the following checks:

  Cluster based egamma
  ClusterEtaRange        =  0,
  ClusterHadronicLeakage =  1,
  ClusterMiddleSampling  =  2,
  ClusterFirstSampling   =  3,
  Track based egamma
  TrackEtaRange          =  8,
  TrackHitsA0            =  9,
  TrackMatchAndEoP       = 10,
  TrackTRT               = 11

In 9.0.4 there is a problem with TRT simulation so one has to mask TRT bit to recover the lost efficiency.

To get the flag in your AOD analysis you should use:


To mask the TRT bits you should use: (*elec)->isEM()&0x7FF==0

If you use isEM then you will select electrons with an overall efficiency of about 80% in the barrel but much lower in the crack and endcap.

2. The likelihood ratio is constructed using the following variables: energy in different calorimeter samplings, shower shapes in both eta and phi and E/P ration. No TRT information is used here. You need to access two variables called emweight and pionweight then you can construct the likelihood ratio, defined by: emweight/(emweight+pionweight).

In AOD, you use the following code:

ElecEMWeight = elec*->parameter(ElectronParameters::emWeight); ElecPiWeight = elec*->parameter(ElectronParameters::pionWeight);

Then form the variable: X = ElecEMWeight/(ElecEMWeight+ElecPiWeight);

Requiring X > 0.6 will give you more than 90% efficiency for electrons.

3. The NeuralNet variable uses as inputs the same variables used for likelihood. To use it in AOD you should proceed as follow:

ElecepiNN = elec*->parameter(ElectronParameters::epiNN);

Requiring ElecepiNN > 0.6 will give you about 90% eff for electrons.

However, you should be aware that the NN was trained in full eta range while the likelihood was computed in 3 bins in eta: barrel, crack and endcap. So I would suggest to use likelihood for now.

To require an isolated electron, you have to cut on the energy deposited in the cone around the electron cluster. ATLFAST for example requires Et<10 GeV in a cone of dR=0.2. You can simulate the ATLFAST cut by requiring etcone20<10.*GeV


We did not investigate this.


Muon in AOD/Woutuple
AOD Container Name AOD Variable Woutuple Variable Variable Type Comment
MuonCollection (*muonTES)->size() n_muon Int Number of muons in the Woutuple
(*muonItr)->hlv().x() px_muon Double Px
(*muonItr)->hlv().y() py_muon Double Py
(*muonItr)->hlv().z() pz_muon Double Pz
(*muonItr)->hlv().perp() pt_muon Double Pt
(*muonItr)->hlv().eta() eta_muon Double Eta
(*muonItr)->hlv().phi() phi_muon Double Phi
(*muonItr)->author() auth_muon Int (enum) Algorithm used to create the muon: unknown=0, highPt=1, lowPt=2
(*muonItr)->chi2() chi2_muon Double Chi2 of the track fit. Empty for now (see below)
(*muonItr)->getConeIsol()[0] coneiso0_muon Double
(*muonItr)->getEtIsol()[0] etiso0_muon Double
(*muonItr)->hasCombinedMuon() hascombi_muon Int (bool)
(*muonItr)->hasInDetTrackParticle() hasindettp_muon Int (bool)
(*muonItr)->hasMuonSpectrometerTrackParticle() hasmuspectp_muon Int (bool)
(*muonItr)->hasMuonExtrapolatedTrackParticle() hasmmuextrtp_muon Int (bool)
(*muonItr)->hasCombinedMuonTrackParticle() hascombimutp_muon Int (bool)
(*muonItr)->hasCluster() hasclus_muon Int (bool)
(*muonItr)->isHighPt() ishipt_muon Int (bool) Is the muon produced with the highPt algorithm? (see also author())
(*muonItr)->isLowPt() islopt_muon Int (bool) Is the muon produced with the lowPt algorithm? (see also author())
(*muonItr)->numberOfBLayerHits() nblayerhits_muon Int
(*muonItr)->numberOfPixelHits( npixelhits_muon Int
(*muonItr)->numberOfSCTHits() nscthits_muon Int
(*muonItr)->numberOfTRTHits() ntrthits_muon Int
(*muonItr)->numberOfMDTHits() nmdthits_muon Int
(*muonItr)->numberOfCSCEtaHits() ncscetahits_muon Int
(*muonItr)->numberOfCSCPhiHits() ncscphihits_muon Int
(*muonItr)->numberOfRPCEtaHits() nrpcetahits_muon Int
(*muonItr)->numberOfRPCPhiHits( nrpcphihits_muon Int
(*muonItr)->numberOfTGCEtaHits() ntgcetahits_muon Int
(*muonItr)->numberOfTGCPhiHits() ntgcphihits_muon Int
(*muonItr)->z0wrtPrimVtx() z0vtx_muon Double
(*muonItr)->d0wrtPrimVtx() d0vtx_muon Double

temporary: The muons have highPt and lowPt algorithms. The overlap is removed, but you may want to only use the highPt ones. The chi2() method is always 0 in 10.0.1, so you will have to access the CombinedMuon through something like

 const Rec::TrackParticle* cbndMuon = (*muonItr)->get_CombinedMuonTrackParticle();
 if( cbndMuon ) {
   double chi2 = cbndMuon->fitQuality()->chiSquared();
   int ndof =  cbndMuon->fitQuality()->numberDoF();
   if( ndof > 0 ) chi2 = chi2/ndof;
   return chi2;


We did not investigate this.


There are three collections of jets which are all stored in the ntuple. The ntuple variable algo_jet tells you which jet clustering algorithm created the jet. Be sure to cut on algo_jet when you loop over the jets, otherwise you'll see many jets 3 times.

  • KtTowerParticleJets (Kt algorithm with parameter D=1, algo_jet=0)
  • Cone4TowerParticleJets (Cone algorithm with R=0.4, algo_jet=1)
  • ConeTowerParticleJets (Cone algorithm with R=0.7, algo_jet=2)

All three alogrithms have a common data structure.

You can get the energy contributions to a jet from different calorimeter samplings. Each calorimeter (Barrel and Endcap) has up to 4 samplings:

PreSamplerB, EMB1, EMB2, EMB3,    //   LAr barrel
PreSamplerE, EME1, EME2, EME3,    //   LAr EM endcap  
HEC0, HEC1, HEC2, HEC3,           //   Hadronic end cap cal. 
TileBar0, TileBar1, TileBar2,     //   Tile barrel 
TileGap1, TileGap2, TileGap3,     //   Tile gap (ITC & scint) 
TileExt0, TileExt1, TileExt2,     //   Tile extended barrel 
FCAL0, FCAL1, FCAL2,              //   Forward EM endcap 

Overlapping jets and fake jets: A trick used in CDF is to neglect jets which are close to an Electron (typically dR<0.7). The same trick should be applied for Photons and Taus.

Jet in AOD/Woutuple
AOD Container Name AOD Variable Woutuple Variable Variable Type Comment
KtTowerParticleJets Cone4TowerParticleJets ConeTowerParticleJets (*jetTES)->size() n_jet Int Number of jets in the Woutuple
(*jetItr)->hlv().x() px_jet Double Px
(*jetItr)->hlv().y() py_jet Double Py
(*jetItr)->hlv().z() pz_jet Double Pz
(*jetItr)->hlv().perp() pt_jet Double Pt
(*jetItr)->hlv().eta() eta_jet Double Eta
(*jetItr)->hlv().phi() phi_jet Double Phi
(*jetItr)->pCalo().x() px_calo_jet Double
(*jetItr)->pCalo().y() py_calo_jet Double
(*jetItr)->pCalo().z() pz_calo_jet Double
(*jetItr)->etEM(0) etem0_jet Double Et from EM_Calo Sample_1(B+E) and Presampler (B+E)
(*jetItr)->etEM(1) etem1_jet Double Et from EM_Calo Sample_2(B+E)
(*jetItr)->etEM(2) etem2_jet Double Et from EM_Calo Sample_3(B+E)
(*jetItr)->etHad(0) ethad0_jet Double Et from HAD_Calo Sample_0(B+E)
(*jetItr)->etHad(1) ethad1_jet Double Et from HAD_Calo Sample_1(B+E)
(*jetItr)->etHad(2) ethad2_jet Double Et from HAD_Calo Sample_2(B+E)
(*jetItr)->energyInSample(CaloSampling::PreSamplerB) epresb_jet Double Energy in PreSampler (Barrel)
(*jetItr)->energyInSample(CaloSampling::EMB1) eemb1_jet Double Energy in EM_Calo Sample_1 (Barrel)
(*jetItr)->energyInSample(CaloSampling::EMB2) eemb2_jet Double Energy in EM_Calo Sample_2 (Barrel)
(*jetItr)->energyInSample(CaloSampling::EMB3) eemb3_jet Double Energy in EM_Calo Sample_3 (Barrel)
(*jetItr)->energyInSample(CaloSampling::PreSamplerE) eprese_jet Double Energy in PreSampler (Endcap)
(*jetItr)->energyInSample(CaloSampling::EME1) eeme1_jet Double Energy in EM_Calo Sample_1 (Endcap)
(*jetItr)->energyInSample(CaloSampling::EME2) eeme2_jet Double Energy in EM_Calo Sample_2 (Endcap)
(*jetItr)->energyInSample(CaloSampling::EME3) eeme3_jet Double Energy in EM_Calo Sample_3 (Endcap)
(*jetItr)->energyInSample(CaloSampling::HEC0) ehec0_jet Double Energy in HAD_Calo Sample_0 (Endcap)
(*jetItr)->energyInSample(CaloSampling::HEC1) ehec1_jet Double Energy in HAD_Calo Sample_1 (Endcap)
(*jetItr)->energyInSample(CaloSampling::HEC2) ehec2_jet Double Energy in HAD_Calo Sample_2 (Endcap)
(*jetItr)->energyInSample(CaloSampling::HEC3) ehec3_jet Double Energy in HAD_Calo Sample_3 (Endcap)
(*jetItr)->energyInSample(CaloSampling::TileBar0) etilebar0_jet Double Energy in HAD_Calo Sample_0 (Barrel)
(*jetItr)->energyInSample(CaloSampling::TileBar1) etilebar1_jet Double Energy in HAD_Calo Sample_1 (Barrel)
(*jetItr)->energyInSample(CaloSampling::TileBar2) etilebar2_jet Double Energy in HAD_Calo Sample_2 (Barrel)
(*jetItr)->energyInSample(CaloSampling::TileGap1) etilegap1_jet Double Energy in Tile_gap Sample_1
(*jetItr)->energyInSample(CaloSampling::TileGap2) etilegap2_jet Double Energy in Tile_gap Sample_2
(*jetItr)->energyInSample(CaloSampling::TileGap3) etilegap3_jet Double Energy in Tile_gap Sample_3
(*jetItr)->energyInSample(CaloSampling::TileExt0) etileext0_jet Double Energy in Tile Extended Barrel Sample_0
(*jetItr)->energyInSample(CaloSampling::TileExt1) etileext1_jet Double Energy in Tile Extended Barrel Sample_1
(*jetItr)->energyInSample(CaloSampling::TileExt2) etileext2_jet Double Energy in Tile Extended Barrel Sample_2
(*jetItr)->energyInSample(CaloSampling::FCAL0) efcal0_jet Double Energy in FCAL Sample_0
(*jetItr)->energyInSample(CaloSampling::FCAL1) efcal1_jet Double Energy in FCAL Sample_1
(*jetItr)->energyInSample(CaloSampling::FCAL2) efcal2_jet Double Energy in FCAL Sample_2
(*jetItr)->energyInSample(CaloSampling::Unknown) eunknown_jet Double WTF???
(*jetItr)->energyInCryostat() ; ecryo_jet Double Energy lost in the cryostat — empiric evaluation sqrt(EMB3 * TileBar0)

Truth Jets

Truth jets are formed by running the jet reconstruction algorithm on final Truth particles from the simulation. Jets created this way do not contain the effects of detector energy resolution and other experimental issues. The Woutuple contains truth jets generated with the same three jet algorithms as for reconstruction level jets (Cone,Cone4 and Kt). The author of each jet in the trujet block can be determined from the algo_trujet integer, which has the same meaning as the algo_jet variable in the reco-level jet block


The default b-tagging algorithm is run on cone jets with R=0.7

It is possible to run a b-tagging refit completely on AOD. Andi Wildauer has done a lot of work on this and documented it on:

BTagging refit on AOD

For the top group this was done by Eric (T1 sample only) which is why for the T1 sample there is also a block containing the btag information for R=0.4 jets. The user can choose this by setting the bjet_algo to 1 in the Analysis Skeleton.

Missing Et

There are seven(!) Missing Et objects available in AOD. The Woutuple contains all of them

Missing Et objects available in AOD
Type AOD Container Name Include File Comment
Missing Et MET_Base MissingEtCalo.h uncalibrated ETMiss
Missing Et calibrated MET_Calib calibrated ETMiss
Missing Et Truth MET_Truth MissingEtTruth.h ETMiss from Truth
Missing Et Muon MET_Muon MissingET.h ETMiss from Muons
Missing Et Final MET_Final ETMiss for Physics analysis : calib+muons+cryostat correction
Missing Et Cryostat correction MET_Cryo Cryostat term
Missing Et Topological Clusters MET_Topo ETMiss from Topological Jet Clusters

The calibration of the MET is obtained by using a H1 algorithm. This algorithm corrects the cell energy as a function of the energy density in the cell:

The weights are stored in a lookup table here: Code for H1 calibration

Missing Et objects available in Woutuple
AOD Container Name AOD Variable Woutuple Variable Variable Type Comment
MET_Base et_base_etm Double_t Missing Et (uncalibrated)
ht_base_etm Double_t Total Ht (uncalibrated)
px_base_etm Double_t Missing Px (uncalibrated)
py_base_etm Double_t Missing Py (uncalibrated)
compet_base_etm[7] Double_t* Missing Et (uncalibrated)
7 calorimeter samples
see MissingEtCalo.h
comppx_base_etm[7] Double_t* Missing Px (uncalibrated)
7 calorimeter samples
see MissingEtCalo.h
comppy_base_etm[7] Double_t* Missing Py (uncalibrated)
7 calorimeter samples
see MissingEtCalo.h
MET_Calib et_calib_etm Double_t Missing Et (calibrated)
ht_calib_etm Double_t Total Ht (calibrated)
px_calib_etm Double_t Missing Px (calibrated)
py_calib_etm Double_t Missing Py (calibrated)
compet_calib_etm[7] Double_t* Missing Et (calibrated)
7 calorimeter samples
see MissingEtCalo.h
comppx_calib_etm[7] Double_t* Missing Px (calibrated)
7 calorimeter samples
see MissingEtCalo.h
comppy_calib_etm[7] Double_t* Missing Py (calibrated)
7 calorimeter samples
see MissingEtCalo.h
MET_Truth et_truth_etm Double_t Missing Et (MC Truth)
ht_truth_etm Double_t Total Ht (MC Truth)
px_truth_etm Double_t Missing Px (MC Truth)
py_truth_etm Double_t Missing Py (MC Truth)
truet_truth_etm[6] Double_t* Missing Et (MC Truth)
6 components
see MissingEtTruth.h
trupx_truth_etm[6] Double_t* Missing Px (MC Truth)
6 components
see MissingEtTruth.h
trupy_truth_etm[6] Double_t* Missing Py (MC Truth)
6 components
see MissingEtTruth.h
MET_Muon et_muon_etm Double_t Missing Et (Muon Spectrometer)
ht_muon_etm Double_t Total Ht (Muon Spectrometer)
px_muon_etm Double_t Missing Px (Muon Spectrometer)
py_muon_etm Double_t Missing Py (Muon Spectrometer)
MET_Final et_final_etm Double_t Missing Et
(Final — default for physical analysis)
ht_final_etm Double_t Total Ht
(Final — default for physical analysis)
px_final_etm Double_t Missing Px
(Final — default for physical analysis)
py_final_etm Double_t Missing Py
(Final — default for physical analysis)
MET_Cryo et_cryo_etm Double_t Missing Et (Cryostat)
ht_cryo_etm Double_t Total Ht (Cryostat)
px_cryo_etm Double_t Missing Px (Cryostat)
py_cryo_etm Double_t Missing Py (Cryostat)
MET_Topo et_topo_etm Double_t Missing Et (Topological clustering)
ht_topo_etm Double_t Total Ht (Topological clustering)
px_topo_etm Double_t Missing Px (Topological clustering)
py_topo_etm Double_t Missing Py (Topological clustering)

The best variables for evaluating missing Et are MET_Final or a vector sum of (MET_Topo+MET_Cryo+MET_Muon)

External References

Container/Object Names for AOD

Storegate Keys For AOD 10.x

Particle Preselection Cuts