1 |
dgele |
1.1 |
import FWCore.ParameterSet.Config as cms
|
2 |
|
|
|
3 |
|
|
def makeAODTrackCandidates(process, label='TrackCands', ## output collection will be <'patAOD'+label>
|
4 |
|
|
tracks=cms.InputTag('generalTracks'), ## input tracks
|
5 |
|
|
particleType="pi+", ## particle type (for mass)
|
6 |
|
|
candSelection='pt > 10'): ## preselection cut on candidates
|
7 |
|
|
process.load("SimGeneral.HepPDTESSource.pythiapdt_cfi");
|
8 |
|
|
setattr(process, 'patAOD' + label + 'Unfiltered',
|
9 |
|
|
cms.EDProducer("ConcreteChargedCandidateProducer",
|
10 |
|
|
src = tracks,
|
11 |
|
|
particleType = cms.string(particleType) ) )
|
12 |
|
|
setattr(process, 'patAOD' + label,
|
13 |
|
|
cms.EDFilter("CandViewSelector",
|
14 |
|
|
src = cms.InputTag('patAOD' + label + 'Unfiltered'),
|
15 |
|
|
cut = cms.string(candSelection) ) )
|
16 |
|
|
process.patAODCoreReco += getattr(process, 'patAOD' + label + 'Unfiltered') * getattr(process, 'patAOD' + label)
|
17 |
|
|
|
18 |
|
|
def makePATTrackCandidates(process,
|
19 |
|
|
label='TrackCands', # output will be 'allLayer1'+label , 'selectedLayer1' + label
|
20 |
|
|
input=cms.InputTag('patAODTrackCands'), # Name of input collection
|
21 |
|
|
selection='pt > 10', # Selection on PAT Layer 1 objects;
|
22 |
|
|
# The output will be 'selectedLayer1' + label
|
23 |
|
|
isolation={'tracker':0.3, # Isolations to use ('source':deltaR)
|
24 |
|
|
'ecalTowers':0.3, # 'tracker' => as muon track iso
|
25 |
|
|
'hcalTowers':0.3}, # 'ecalTowers', 'hcalTowers' => as muon iso from calo towers.
|
26 |
|
|
isodeposits=['tracker','ecalTowers','hcalTowers'],
|
27 |
|
|
mcAs=cms.InputTag("muons"), # Replicate MC match as the one used by PAT on this AOD collection (None = no mc match)
|
28 |
|
|
triggerAs=[]): # Replicate trigger match as all the ones used by PAT on these AOD collections (None = no trig.)
|
29 |
|
|
from PhysicsTools.PatAlgos.producersLayer1.genericParticleProducer_cfi import allLayer1GenericParticles
|
30 |
|
|
from PhysicsTools.PatAlgos.cleaningLayer1.genericTrackCleaner_cfi import cleanLayer1Tracks
|
31 |
|
|
# Define Modules
|
32 |
|
|
# producer
|
33 |
|
|
setattr(process, 'allLayer1' + label, allLayer1GenericParticles.clone(src = input))
|
34 |
|
|
# selector
|
35 |
|
|
setattr(process, 'selectedLayer1' + label,
|
36 |
|
|
cms.EDFilter("PATGenericParticleSelector",
|
37 |
|
|
src = cms.InputTag("allLayer1"+label),
|
38 |
|
|
cut = cms.string(selection)
|
39 |
|
|
)
|
40 |
|
|
)
|
41 |
|
|
# cleaner
|
42 |
|
|
setattr(process, 'cleanLayer1' + label, cleanLayer1Tracks.clone(src = cms.InputTag('selectedLayer1' + label)))
|
43 |
|
|
# Get them as variables, so we can put them in the sequences and/or configure them
|
44 |
|
|
l1cands = getattr(process, 'allLayer1' + label)
|
45 |
|
|
selectedL1cands = getattr(process, 'selectedLayer1' + label)
|
46 |
|
|
cleanL1cands = getattr(process, 'cleanLayer1' + label)
|
47 |
|
|
# Insert in sequence, after electrons
|
48 |
|
|
process.allLayer1Objects.replace(process.allLayer1Electrons, l1cands + process.allLayer1Electrons)
|
49 |
|
|
process.selectedLayer1Objects.replace(process.selectedLayer1Electrons, process.selectedLayer1Electrons + selectedL1cands)
|
50 |
|
|
process.cleanLayer1Objects.replace(process.cleanLayer1Electrons, process.cleanLayer1Electrons + cleanL1cands)
|
51 |
|
|
# Add to Summary Tables
|
52 |
|
|
process.aodSummary.candidates += [ input ]
|
53 |
|
|
process.allLayer1Summary.candidates += [ cms.InputTag("allLayer1"+label) ]
|
54 |
|
|
process.selectedLayer1Summary.candidates += [ cms.InputTag("selectedLayer1"+label) ]
|
55 |
|
|
process.cleanLayer1Summary.candidates += [ cms.InputTag("cleanLayer1"+label) ]
|
56 |
|
|
|
57 |
|
|
# Isolation: start with empty config
|
58 |
|
|
isoModules = []
|
59 |
|
|
runIsoDeps = { 'tracker':False, 'caloTowers':False }
|
60 |
|
|
for (source,deltaR) in isolation.items():
|
61 |
|
|
if source == 'tracker':
|
62 |
|
|
runIsoDeps['tracker'] = True
|
63 |
|
|
l1cands.isolation.tracker = cms.PSet(
|
64 |
|
|
src = cms.InputTag('pat'+label+'IsoDepositTracks'),
|
65 |
|
|
deltaR = cms.double(deltaR),
|
66 |
|
|
)
|
67 |
|
|
elif source == 'ecalTowers':
|
68 |
|
|
runIsoDeps['caloTowers'] = True
|
69 |
|
|
l1cands.isolation.ecal = cms.PSet(
|
70 |
|
|
src = cms.InputTag('pat'+label+'IsoDepositCaloTowers', 'ecal'),
|
71 |
|
|
deltaR = cms.double(deltaR),
|
72 |
|
|
)
|
73 |
|
|
elif source == 'hcalTowers':
|
74 |
|
|
runIsoDeps['caloTowers'] = True
|
75 |
|
|
l1cands.isolation.hcal = cms.PSet(
|
76 |
|
|
src = cms.InputTag('pat'+label+'IsoDepositCaloTowers', 'hcal'),
|
77 |
|
|
deltaR = cms.double(deltaR),
|
78 |
|
|
)
|
79 |
|
|
for source in isodeposits:
|
80 |
|
|
if source == 'tracker':
|
81 |
|
|
runIsoDeps['tracker'] = True
|
82 |
|
|
l1cands.isoDeposits.tracker = cms.InputTag('pat'+label+'IsoDepositTracks')
|
83 |
|
|
elif source == 'ecalTowers':
|
84 |
|
|
runIsoDeps['caloTowers'] = True
|
85 |
|
|
l1cands.isoDeposits.ecal = cms.InputTag('pat'+label+'IsoDepositCaloTowers', 'ecal')
|
86 |
|
|
elif source == 'hcalTowers':
|
87 |
|
|
runIsoDeps['caloTowers'] = True
|
88 |
|
|
l1cands.isoDeposits.hcal = cms.InputTag('pat'+label+'IsoDepositCaloTowers', 'hcal')
|
89 |
|
|
for dep in [ dep for dep,runme in runIsoDeps.items() if runme == True ]:
|
90 |
|
|
if dep == 'tracker':
|
91 |
|
|
from RecoMuon.MuonIsolationProducers.trackExtractorBlocks_cff import MIsoTrackExtractorCtfBlock
|
92 |
|
|
setattr(process, 'pat'+label+'IsoDepositTracks',
|
93 |
|
|
cms.EDProducer("CandIsoDepositProducer",
|
94 |
|
|
src = input,
|
95 |
|
|
trackType = cms.string('best'),
|
96 |
|
|
MultipleDepositsFlag = cms.bool(False),
|
97 |
|
|
ExtractorPSet = cms.PSet( MIsoTrackExtractorCtfBlock )
|
98 |
|
|
) )
|
99 |
|
|
isoModules.append( getattr(process, 'pat'+label+'IsoDepositTracks') )
|
100 |
|
|
elif dep == 'caloTowers':
|
101 |
|
|
from RecoMuon.MuonIsolationProducers.caloExtractorByAssociatorBlocks_cff import MIsoCaloExtractorByAssociatorTowersBlock
|
102 |
|
|
setattr(process, 'pat'+label+'IsoDepositCaloTowers',
|
103 |
|
|
cms.EDProducer("CandIsoDepositProducer",
|
104 |
|
|
src = input,
|
105 |
|
|
trackType = cms.string('best'),
|
106 |
|
|
MultipleDepositsFlag = cms.bool(True),
|
107 |
|
|
ExtractorPSet = cms.PSet( MIsoCaloExtractorByAssociatorTowersBlock )
|
108 |
|
|
) )
|
109 |
|
|
isoModules.append( getattr(process, 'pat'+label+'IsoDepositCaloTowers') )
|
110 |
|
|
for m in isoModules: process.patAODExtraReco += m
|
111 |
|
|
# MC and trigger
|
112 |
|
|
from PhysicsTools.PatAlgos.tools.jetTools import MassSearchParamVisitor;
|
113 |
|
|
if type(mcAs) != type(None): # otherwise it complains that 'None' is not a valid InputTag :-(
|
114 |
|
|
searchMC = MassSearchParamVisitor('src', mcAs);
|
115 |
|
|
process.patMCTruth.visit(searchMC)
|
116 |
|
|
modulesMC = searchMC.modules()
|
117 |
|
|
if len(modulesMC) != 1: raise RuntimeError, "Can't find MC-Truth match for '%s', or it's not unique."%(mcAs,)
|
118 |
|
|
setattr(process, 'pat'+label+'MCMatch', modulesMC[0].clone(src = input))
|
119 |
|
|
process.patMCTruth.replace( modulesMC[0], modulesMC[0] + getattr(process, 'pat'+label+'MCMatch'))
|
120 |
|
|
l1cands.addGenMatch = True
|
121 |
|
|
l1cands.genParticleMatch = cms.InputTag('pat'+label+'MCMatch')
|
122 |
|
|
if triggerAs != None and triggerAs != []:
|
123 |
|
|
modulesTR = []; labelsTR = []
|
124 |
|
|
for t in triggerAs:
|
125 |
|
|
searchTR = MassSearchParamVisitor('src', cms.InputTag(t));
|
126 |
|
|
process.patTrigMatch.visit(searchTR)
|
127 |
|
|
modulesTR += searchTR.modules()
|
128 |
|
|
if len(modulesTR) == 0: raise RuntimeError, "Can't find any trigger match among %s" % (triggerAs)
|
129 |
|
|
def ucfirst(x): return x[0].upper() + x[1:]
|
130 |
|
|
for m in modulesTR:
|
131 |
|
|
lbl = 'pat'+label+'TrigMatchAs' + ucfirst(m.label())
|
132 |
|
|
setattr(process, lbl, m.clone(src = input))
|
133 |
|
|
process.patTrigMatch.replace( m, m + getattr(process, lbl))
|
134 |
|
|
labelsTR.append (cms.InputTag(lbl))
|
135 |
|
|
l1cands.addTrigMatch = cms.bool(True)
|
136 |
|
|
l1cands.trigPrimMatch = cms.VInputTag(*labelsTR)
|
137 |
|
|
|
138 |
|
|
def makeTrackCandidates(process,
|
139 |
|
|
label='TrackCands', # output collection will be 'allLayer'+(0/1)+label , 'selectedLayer1' + label
|
140 |
|
|
tracks=cms.InputTag('generalTracks'), # input track collection
|
141 |
|
|
particleType="pi+", # particle type (for assigning a mass)
|
142 |
|
|
preselection='pt > 10', # preselection cut on candidates
|
143 |
|
|
selection='pt > 10', # Selection on PAT Layer 1 objects. The output will be 'selectedLayer1' + label
|
144 |
|
|
isolation={'tracker': 0.3, # Isolations to use ({'source':deltaR, ...}; use {} for none)
|
145 |
|
|
'ecalTowers':0.3, # 'tracker' => as muon track iso
|
146 |
|
|
'hcalTowers':0.3}, # 'ecalTowers', 'hcalTowers' => as muon iso from calo towers.
|
147 |
|
|
isodeposits=['tracker','ecalTowers','hcalTowers'], # IsoDeposits to save ([] for none)
|
148 |
|
|
mcAs=cms.InputTag("muons"), # Replicate MC match as the one used by PAT on this AOD collection (None = no mc match)
|
149 |
|
|
triggerAs=[]): # Replicate trigger match as all the ones used by PAT on these AOD collections ([] = none)
|
150 |
|
|
makeAODTrackCandidates(process, tracks=tracks, particleType=particleType, candSelection=preselection, label=label)
|
151 |
|
|
makePATTrackCandidates(process, label=label, input=cms.InputTag('patAOD' + label),
|
152 |
|
|
isolation=isolation, isodeposits=isodeposits, mcAs=mcAs, triggerAs=triggerAs, selection=selection)
|