PAT Examples: Electroweak Analysis
Contents
Introduction
In this tutorial we will show how to make a PAT-based analysis
in the context of the EWK PAG.
The inclusive Z->mumu analysis, which exploits PAT objects as muons and tracks,
will be taken as an example. If you are interested in EWK electron analysis, please
refer to the
EWK Electron tutorial
The Z->mumu analysis is performed in two steps.
In the first step we run the dimuon skim over the original AOD collections.
The skim makes a HLT-based preselection of events, creates PAT objects from
the "official" muons and tracks provided by the CMS reconstruction, and
builds dimuon candidates to be stored into the skim output.
In the second step we run an analyzer on the skim output which selects the dimuon candidates
compatible with a Z->mumu decay and plots their invariant mass distribution.
You will learn:
- how to run the dimuon skim
- how to access some variables from the PAT objects in order to make a signal selection
How to get the dimuon skim code
The tutorial analysis works in
CMSSW_4_2_4
release.
So, first create a project area based on 4_2_4:
cmsrel CMSSW_4_2_4
cd CMSSW_4_2_4/src/
cmsenv
Then, get the package for the skim and compile:
addpkg ElectroWeakAnalysis/Skimming V01-01-12
cd ElectroWeakAnalysis/Skimming
scram b
How to run the dimuon skim
Go to the test directory of the package:
cd ElectroWeakAnalysis/Skimming/test/
Specify a Z->mumu MC collection to be given in input by editing the
following parameter in the cfg file
dimuonsSkim.py
:
process.source = cms.Source("PoolSource",
fileNames = cms.untracked.vstring(
'rfio:/castor/cern.ch/user/f/fabozzi/tutorial/sep2010/62C86D62-BFAF-DF11-85B3-003048678A6C.root'
)
)
Specify the number of events to be processed (a few hundred is enough for the tutorial):
process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(200) )
Run the skim [
Before running, make sure the input file is accessible and the corresponding global tag]:
cmsRun dimuonsSkim.py
At the end you will get a skimmed collection
containing AOD + dimuon candidates objects:
testDimuonSkim.root
Find out more about the skim configuration
Look at files into
ElectroWeakAnalysis/Skimming/python/
if you want to
inspect the configuration of the dimuon skim.
In order to check the relevant configurations for PAT muons and tracks, have
a look at:
ElectroWeakAnalysis/Skimming/python/patCandidatesForDimuonsSequences_cff.py
Comment lines in this file should help you in following the description below.
PAT muons are created by calling standard PAT configuration files:
CMS.PhysicsTools/PatAlgos/python/mcMatchLayer0/muonMatch_cfi.py
CMS.PhysicsTools/PatAlgos/python/producersLayer1/muonProducer_cfi.py
CMS.PhysicsTools/PatAlgos/python/selectionLayer1/muonSelector_cfi.py
Note that there are changes of the default parameters of the module
making MC matching of PAT muons to generated muons:
from CMS.PhysicsTools.PatAlgos.mcMatchLayer0.muonMatch_cfi import *
muonMatch.maxDeltaR = 0.15
muonMatch.maxDPtRel = 1.0
muonMatch.resolveAmbiguities = True
muonMatch.resolveByMatchQuality = True
We also compute custom tracker, ecal, and hcal isolation variables to be embedded
in PAT muons:
from CMS.PhysicsTools.PatAlgos.producersLayer1.muonProducer_cfi import *
patMuons.isoDeposits = cms.PSet(
tracker = cms.InputTag("muIsoDepositTk"),
ecal = cms.InputTag("muIsoDepositCalByAssociatorTowers","ecal"),
hcal = cms.InputTag("muIsoDepositCalByAssociatorTowers","hcal"),
)
patMuons.userIsolation = cms.PSet(
hcal = cms.PSet(
src = cms.InputTag("muIsoDepositCalByAssociatorTowers","hcal"),
deltaR = cms.double(0.3)
),
tracker = cms.PSet(
veto = cms.double(0.015),
src = cms.InputTag("muIsoDepositTk"),
deltaR = cms.double(0.3),
threshold = cms.double(1.5)
),
ecal = cms.PSet(
src = cms.InputTag("muIsoDepositCalByAssociatorTowers","ecal"),
deltaR = cms.double(0.3)
)
)
We apply a (dummy) selection to
patMuons
obtaining the PAT muon objects
called
selectedPatMuons
.
Finally we perform trigger matching between
selectedPatMuons
and
the HLT muons firing the
HLT_Mu9
trigger path.
The collection of PAT muons embedding the trigger matching
result is called
selectedPatMuonsTriggerMatch
.
Standard and custom configuration files are used to make PAT tracks.
Intermediate candidates (
patAODTrackCands
) are first created.
Only tracks above a certain pT threshold (10
GeV/c) are considered.
Note that at this level, IsoDeposits in tracker and calorimeters associated to
the tracks are computed from AOD, and MC matching to generated muons
is performed.
PAT tracks (
allPatTracks
) are built by the standard producer
for PAT generic particles:
CMS.PhysicsTools/PatAlgos/python/producersLayer1/genericParticleProducer_cfi.py
The following parameters are specified in order to embed some variables into PAT
tracks (MC match to generated muons, IsoDeposits, tracker, ecal, and
hcal pre-computed isolation values):
allPatTracks = patGenericParticles.clone(
src = cms.InputTag("patAODTrackCands"),
# isolation configurables
userIsolation = cms.PSet(
tracker = cms.PSet(
veto = cms.double(0.015),
src = cms.InputTag("patAODTrackIsoDepositCtfTk"),
deltaR = cms.double(0.3),
threshold = cms.double(1.5)
),
ecal = cms.PSet(
src = cms.InputTag("patAODTrackIsoDepositCalByAssociatorTowers","ecal"),
deltaR = cms.double(0.3)
),
hcal = cms.PSet(
src = cms.InputTag("patAODTrackIsoDepositCalByAssociatorTowers","hcal"),
deltaR = cms.double(0.3)
),
),
isoDeposits = cms.PSet(
tracker = cms.InputTag("patAODTrackIsoDepositCtfTk"),
ecal = cms.InputTag("patAODTrackIsoDepositCalByAssociatorTowers","ecal"),
hcal = cms.InputTag("patAODTrackIsoDepositCalByAssociatorTowers","hcal")
),
addGenMatch = cms.bool(True),
genParticleMatch = cms.InputTag("trackMuMatch")
)
We apply a selection to the tracks (again a pT threshold of 10
GeV/c)
and thus we are left with the PAT track objects called
selectedPatTracks
.
No track cleaning is applied.
Dimuon candidates are built starting from
selectedPatMuonsTriggerMatch
and
SelectedPatTracks
.
You can check the following files:
dimuons_cfi.py, dimuonsOneTrack_cfi.py
.
Event preselection based on HLT is defined in
dimuonsHLTFilter_cfi.py
.
The skim paths are defined into
dimuons_SkimPaths_cff.py
.
The event content of the skim output is defined into
dimuonsOutputModule_cfi.py
.
How to get the analyzer code
The tutorial analyzer has been tested in
CMSSW_3_8_2
release.
So, in a 3_8_2 project area checkout and compile the analyzer
in the
CMS.PhysicsTools/PatExamples
package:
cvs co -r CMSSW_3_8_2 PhysicsTools/PatExamples
cd PhysicsTools/PatExamples/plugins
scram b
How to run the analyzer
Go to the test directory of the package:
cd PhysicsTools/PatExamples/test/
You can run on the skimmed collection made in the previous step.
Alternatively, if you want to run on more events, a skimmed collection (made from
1007 events) is available on castor.
Specify the path of the skimmed collection by editing the following parameter in
the cfg file
zMuMuTutorialAnalysis.py
:
process.source = cms.Source(
"PoolSource",
fileNames =
cms.untracked.vstring("rfio:/castor/cern.ch/user/f/fabozzi/tutorial/sep2010/testDimuonSkim.root")
)
Run the analysis [
The file is dead. The instructions will be updated soon.]:
cmsRun zMuMuTutorialAnalysis.py
At the end you will get an output root file
containing a few invariant mass histograms:
zmumu_plot.root
Find out more about the analyzer
Have a look at
CMS.PhysicsTools/PatExamples/plugins/ZMuMuTutorialAnalyzer.cc
.
The comment lines in the file should help you in following the description below.
The module takes as input parameter a certain category
of dimuons candidates and applies cuts to the muon daughters
in order to select candidates compatible with a Z->mu+mu- decay.
The selection is the following:
- Both muons must be global muons
- The net charge of the pair must be 0
- Each muon must satisfy geometrical and kinematical acceptance cuts
- Each muon must satisfy an isolation cut. Note the two alternative ways to get muon isolation. In the first case we just get the pre-computed tracker isolation variable. In the second case we compute the isolation variable from the embedded IsoDeposits (this is useful when, for instance, you want to test alternative isolation definitions).
- The invariant mass of the pair must be within a certain interval
The invariant mass of the dimuon candidates passing these cuts
is plotted. We study also the generated muons which are MC-matched to the Z candidates daughters:
we exploits the mother-daughter relationships of the generated particles in order to identify the
Z candidates which correspond to a true Z->mumu(gamma) decay.
The dimuon candidates to be analyzed and the analysis cuts are specified
at cfg level in
zMuMuTutorialAnalysis.py
.
Make changes by yourself
- Plot the pT spectrum of the highest momentum muon coming from the Z and the pT spectrum of the lowest momentum muon coming from the Z. Do that for reconstructed muons and generated muons.
- Plot the pre-computed Ecal isolation for both muons coming from the Z (before applying tracker isolation). Make the same for the sum of Ecal and Tracker isolations. Try also to compute by yourself an Ecal isolation from IsoDeposits by using a dR isolation cone of 0.2.
- Repeat the analysis but require that one muon must be a global muon and the other muon must be a standalone muon
- Repeat the analysis but give in input the
dimuonsOneTrack
collection. Require in the analysis that the PAT muon must be a global muon.
How to get more information
Refer to the EWK twiki for more general informations about PAG analyses
and MC collections:
https://twiki.cern.ch/twiki/bin/view/CMS/TWikiEWK
EWK Electron analysis tutorial
Refer to the following twiki:
https://twiki.cern.ch/twiki/bin/view/CMS/PATExampleElectroweakElectrons
Review status
Responsible:
FrancescoFabozzi
Last reviewed by: most recent reviewer and date