ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/Betchart/TopRefTuple/python/pf2pat.py
Revision: 1.13
Committed: Fri Jan 11 21:45:47 2013 UTC (12 years, 3 months ago) by bbetchar
Content type: text/x-python
Branch: MAIN
CVS Tags: V00-02-01, V00-02-00
Changes since 1.12: +7 -3 lines
Log Message:
use correct jets for met and smearing (all patJets pt>10)

File Contents

# User Rev Content
1 bbetchar 1.1 import operator,sys,os
2     from FWCore.ParameterSet import Config as cms
3     from PhysicsTools.PatAlgos.tools import coreTools,pfTools
4    
5     def tags(stuff) :
6     return ( cms.InputTag(stuff) if type(stuff)!=list else
7     cms.VInputTag([tags(item) for item in stuff]) )
8    
9     class TopRefPF2PAT(object) :
10     '''Implement the Top Reference configuration of PF2PAT.
11    
12     https://twiki.cern.ch/twiki/bin/viewauth/CMS/TWikiTopRefEventSel
13 bbetchar 1.2 Modify the PF selections to match the PAT selections, for consistent TopProjection cross-cleaning.
14 bbetchar 1.1 '''
15    
16     def __init__(self, process, options) :
17     self.stdout = sys.stdout
18     sys.stdout = open(os.devnull, 'w')
19 bbetchar 1.2 print >>self.stdout, "usePF2PAT() output suppressed. (%s)"%__file__
20 bbetchar 1.1
21     self.before = set(dir(process))
22     process.load( "PhysicsTools.PatAlgos.patSequences_cff" )
23     pfTools.usePF2PAT( process,
24     runPF2PAT = True,
25     postfix = options.postfix,
26     runOnMC = not options.isData,
27     pvCollection = tags( 'goodOfflinePrimaryVertices' ),
28     typeIMetCorrections = True,
29     jetAlgo = 'AK5',
30     jetCorrections = ('AK5PFchs', ['L1FastJet','L2Relative','L3Absolute','L2L3Residual'][:None if options.isData else -1] )
31     )
32 bbetchar 1.8
33 bbetchar 1.7 getattr( process, 'pfPileUp'+options.postfix).checkClosestZVertex = False # https://twiki.cern.ch/twiki/bin/view/CMSPublic/WorkBookJetEnergyCorrections#JetEnCorPFnoPU2012
34 bbetchar 1.1 getattr( process, 'pfPileUpIso'+options.postfix).checkClosestZVertex = True
35 bbetchar 1.8 getattr( process, 'patJetCorrFactors'+options.postfix).flavorType = 'T' # top events, not dijets, but only relevant for L5Flavor,L7Parton
36     #getattr( process, 'patJetCorrFactors'+options.postfix).levels.append('L5Flavor') # apparently not available in GlobalTags
37 bbetchar 1.1 if options.isData: coreTools.runOnData( process, names = [ 'PFAll' ], postfix = options.postfix )
38     coreTools.removeSpecificPATObjects( process, names = [ 'Photons', 'Taus' ], postfix = options.postfix )
39    
40 bbetchar 1.2 self.isoValues = {'el':0.15,'mu':0.20}
41     self.eleID = 'mvaTrigV0'
42     self.minEleID = 0.
43 bbetchar 1.9 self.isoEA = 'elPFIsoValueEA03'
44 bbetchar 1.12 self.dBFactorEl = -1.0 if options.doElectronEA else -0.5
45 bbetchar 1.9 self.dBFactorMu = -0.5
46 bbetchar 1.3 self.cuts = {'el': ['abs(eta)<2.5',
47     'pt>20.',
48 bbetchar 1.2 'gsfTrackRef.isNonnull',
49     'gsfTrackRef.trackerExpectedHitsInner.numberOfLostHits<2',
50 bbetchar 1.12 '(chargedHadronIso+max(0.,neutralHadronIso+photonIso%+.1f*%s))/pt < %.2f'%(self.dBFactorEl, 'userIsolation("User1Iso")' if options.doElectronEA else 'puChargedHadronIso',self.isoValues['el']),
51 bbetchar 1.9 'electronID("%s") > %.2f'%(self.eleID,self.minEleID),
52 bbetchar 1.2 ],
53 bbetchar 1.3 'mu' :['abs(eta)<2.5',
54     'pt>10.',
55 bbetchar 1.9 '(chargedHadronIso+neutralHadronIso+photonIso%+.2f*puChargedHadronIso)/pt < %.2f'%(self.dBFactorMu, self.isoValues['mu']),
56 bbetchar 1.3 '(isPFMuon && (isGlobalMuon || isTrackerMuon) )',
57 bbetchar 1.2 ],
58 bbetchar 1.13 'jet' : ['abs(eta)<2.5',
59 bbetchar 1.2 'pt > 15.',
60     # PF jet ID:
61     'numberOfDaughters > 1',
62     'neutralHadronEnergyFraction < 0.99',
63     'neutralEmEnergyFraction < 0.99',
64     '(chargedEmEnergyFraction < 0.99 || abs(eta) >= 2.4)',
65     '(chargedHadronEnergyFraction > 0. || abs(eta) >= 2.4)',
66     '(chargedMultiplicity > 0 || abs(eta) >= 2.4)']
67     }
68    
69 bbetchar 1.1 self.process = process
70     self.options = options
71     self.fix = options.postfix
72     self.patSeq = getattr(process, 'patPF2PATSequence' + self.fix)
73 bbetchar 1.6 self.btags = self.options.btags
74 bbetchar 1.1 self.taginfos = ["impactParameter","secondaryVertex"]
75    
76     self.configTopProjections()
77     self.configPfLepton('el', iso3 = True)
78     self.configPfLepton('mu', iso3 = False)
79     self.configPatMuons()
80     self.configPatElectrons()
81     self.configPatJets()
82 bbetchar 1.2 self.configLeptonFilter()
83 bbetchar 1.1 self.removeCruft()
84     sys.stdout = self.stdout
85    
86     def attr(self, item) : return getattr(self.process, item)
87 bbetchar 1.2 def show(self, item) : print >> (sys.stdout if self.options.quiet else self.stdout), item, '=', self.attr(item).dumpPython() if hasattr(self.process, item) else 'Not Found.'
88 bbetchar 1.1
89     def configTopProjections(self) :
90     '''Enable TopProjections except for Taus (do not remove tau cands from jet collection).'''
91    
92     for key,val in {'PileUp':1,'Muon':1,'Electron':1,'Jet':1,'Tau':0}.items() :
93     self.attr('pfNo'+key+self.fix).enable = bool(val)
94 bbetchar 1.2 self.attr('pfNoElectron').verbose = True
95 bbetchar 1.1 return
96    
97     def configPfLepton(self, lep, iso3) :
98     full = {'el':'Electrons','mu':'Muons'}[lep] + self.fix
99     iso = self.attr('pfIsolated'+full)
100 bbetchar 1.2 iso.isolationCut = self.isoValues[lep]
101 bbetchar 1.1 iso.doDeltaBetaCorrection = True
102 bbetchar 1.9 iso.deltaBetaFactor = getattr(self, 'dBFactor' + full[:2])
103 bbetchar 1.2 sel = self.attr('pfSelected'+full)
104     sel.cut = ' && '.join(self.cuts[lep][:-2])
105 bbetchar 1.9 isoEA = getattr(self.process, self.isoEA)
106 bbetchar 1.2 print >>self.stdout, ""
107     if lep == 'el' :
108     idName = 'pfIdentifiedElectrons'+self.fix
109     id = cms.EDFilter("ElectronIDPFCandidateSelector",
110     src = cms.InputTag('pfElectronsFromVertex'+self.fix),
111     recoGsfElectrons = cms.InputTag("gsfElectrons"),
112     electronIdMap = cms.InputTag(self.eleID),
113     electronIdCut = cms.double(self.minEleID))
114     setattr(self.process, idName, id )
115 bbetchar 1.9 self.patSeq.replace( sel, id*sel*isoEA)
116 bbetchar 1.2 sel.src = idName
117 bbetchar 1.11 isoEA.pfElectrons = 'pfSelectedElectrons'+self.fix
118 bbetchar 1.9 if not iso3 : isoEA.EffectiveAreaType = "kEleGammaAndNeutralHadronIso04"
119 bbetchar 1.2 self.show(idName)
120    
121 bbetchar 1.1 if iso3:
122     pf = {'el':'PFId','mu':''}[lep] + self.fix
123     for item in ['pf','pfIsolated'] :
124     col = self.attr( item+full )
125     col.deltaBetaIsolationValueMap = tags( lep+'PFIsoValuePU03'+pf )
126     col.isolationValueMapsCharged = tags( [lep+'PFIsoValueCharged03'+pf] )
127     col.isolationValueMapsNeutral = tags( [ lep+'PFIsoValueNeutral03'+pf, lep+'PFIsoValueGamma03'+pf] )
128     val = self.attr( 'pat'+full ).isolationValues
129     val.pfNeutralHadrons = tags( lep+'PFIsoValueNeutral03' + pf )
130     val.pfChargedAll = tags( lep+'PFIsoValueChargedAll03' + pf )
131     val.pfPUChargedHadrons = tags( lep+'PFIsoValuePU03' + pf )
132     val.pfPhotons = tags( lep+'PFIsoValueGamma03' + pf )
133     val.pfChargedHadrons = tags( lep+'PFIsoValueCharged03' + pf )
134 bbetchar 1.2
135 bbetchar 1.12 if lep == 'el' and self.options.doElectronEA :
136 bbetchar 1.10 self.attr( 'pfIsolated' + full).deltaBetaIsolationValueMap = self.isoEA
137 bbetchar 1.9
138 bbetchar 1.2 self.show('pfSelected'+full)
139     self.show('pfIsolated'+full)
140 bbetchar 1.1 return
141    
142     def configPatMuons(self) :
143     for mod,attr,val in [('patMuons','usePV',False), # use beam spot rather than PV, which is necessary for 'dB' cut
144     ('patMuons','embedTrack',True), # embedded track needed for muon ID cuts
145 bbetchar 1.2 ('selectedPatMuons','cut', ' && '.join(self.cuts['mu'])),
146 bbetchar 1.1 ] : setattr( self.attr(mod+self.fix), attr, val )
147     self.show('selectedPatMuons'+self.fix)
148     return
149    
150     def configPatElectrons(self) :
151 bbetchar 1.2 electronIDSources = cms.PSet(**dict([(i,tags(i)) for i in [self.eleID]]))
152     for mod,attr,val in [('patElectrons','electronIDSources', electronIDSources),
153     ('selectedPatElectrons','cut', ' && '.join(c for c in self.cuts['el'] if 'gsfTrackRef' not in c)),
154 bbetchar 1.1 ] : setattr( self.attr( mod+self.fix), attr, val )
155 bbetchar 1.9 self.attr('patElectrons'+self.fix).isolationValues.user = tags( [self.isoEA] )
156    
157 bbetchar 1.1 self.show('selectedPatElectrons'+self.fix)
158     return
159    
160     def configPatJets(self) :
161 bbetchar 1.13 sel = self.attr('selectedPatJets'+self.fix)
162     self.process.selectedPatJetsForAnalysis = sel.clone( cut = ' && '.join(self.cuts['jet']))
163     self.patSeq.replace(sel,sel+self.process.selectedPatJetsForAnalysis)
164 bbetchar 1.1 for mod,attr,val in [('patJets','discriminatorSources',[tags(tag+'BJetTagsAOD'+self.fix) for tag in self.btags]),
165     ('patJets','tagInfoSources',[tags(tag+'TagInfosAOD'+self.fix) for tag in self.taginfos]),
166     ('patJets','addTagInfos',True),
167 bbetchar 1.13 ('selectedPatJets','cut', ' pt > 10'),
168 bbetchar 1.1 ] : setattr( self.attr(mod+self.fix), attr, val )
169     self.show('selectedPatJets'+self.fix)
170 bbetchar 1.13 self.show('selectedPatJetsForAnalysis')
171 bbetchar 1.1 return
172    
173 bbetchar 1.2 def configLeptonFilter(self) :
174     if not self.options.requireLepton : return
175 bbetchar 1.5 muons20Name = 'pfIsolatedMuons20'+self.fix
176 bbetchar 1.2 leptonsName = 'pfLeptons'+self.fix
177     requireLeptonName = 'requireLepton'+self.fix
178 bbetchar 1.5
179     muons20 = cms.EDFilter("GenericPFCandidateSelector", src = tags('pfIsolatedMuons'+self.fix), cut = cms.string('pt>20 && abs(eta) < 2.4'))
180     leptons = cms.EDProducer("CandViewMerger", src = tags(['pfIsolated%s%s'%(lep,self.fix) for lep in ['Electrons','Muons20']]))
181 bbetchar 1.2 requireLepton = cms.EDFilter("CandViewCountFilter", src = tags(leptonsName), minNumber = cms.uint32(1) )
182 bbetchar 1.5
183     setattr(self.process, muons20Name, muons20)
184 bbetchar 1.2 setattr(self.process, leptonsName, leptons)
185     setattr(self.process, requireLeptonName, requireLepton)
186    
187     jets = self.attr('pfJets'+self.fix)
188 bbetchar 1.5 self.patSeq.replace(jets, muons20*leptons*requireLepton*jets)
189    
190     self.show(muons20Name)
191 bbetchar 1.2 self.show(leptonsName)
192     self.show(requireLeptonName)
193     return
194 bbetchar 1.1
195     def removeCruft(self) :
196     nothanks = [mod for mod in set(str(self.patSeq).split('+'))
197 bbetchar 1.13 if ( any( keyword in mod for keyword in ['count','Legacy','pfJetsPiZeros','ak7','soft','iterativeCone','pfNoJet',
198 bbetchar 1.1 'tauIsoDeposit','tauGenJet','hpsPFTau','tauMatch','pfTau','hpsSelection',
199     'photonMatch','phPFIso','pfIsolatedPhotons','pfCandsNotInJet','pfCandMETcorr',
200     'Negative','ToVertex','particleFlowDisplacedVertex',
201     'ype2Corr','ype0','patType1p2CorrectedPFMet','atCandidateSummaryTR','atPFParticles'] ) or
202     ( 'JetTagsAOD' in mod and not any( (btag+'B') in mod for btag in self.btags ) ) or
203     ( 'TagInfosAOD' in mod and not any( (info+'TagInfosAOD') in mod for info in self.taginfos ) ) or
204     ( 'elPFIsoValue' in mod and ('04' in mod or 'NoPFId' in mod ) ) or
205     ( 'muPFIsoValue' in mod and ('03' in mod))) ]
206     for mod in nothanks : self.patSeq.remove( self.attr(mod) )
207    
208     nothanks = ['ic5','kt4','kt6','JPT','ak7','ak5Calo']
209     now = set(dir(self.process))
210     for item in now - self.before - set(str(self.patSeq).split('+')) :
211     if any(part in item for part in nothanks) :
212     delattr(self.process,item)
213     return