DESY Hbb Analysis Framework
ntuplizer_94X_2017_rereco31Mar18-v4.py
Go to the documentation of this file.
1 # To be used with the following installation
2 #
3 # cmsrel CMSSW_9_4_12
4 # cd CMSSW_9_4_12/src
5 # cmsenv
6 #
7 # git cms-init
8 #
9 # git cms-merge-topic cms-nanoAOD:master-94X
10 # git checkout -b nanoAOD cms-nanoAOD/master-94X
11 # git clone https://github.com/cms-nanoAOD/nanoAOD-tools.git PhysicsTools/NanoAODTools
12 #
13 # git cms-addpkg RecoBTag/TensorFlow
14 # git cherry-pick 94ceae257f846998c357fcad408986cc8a039152
15 #
16 # git clone git@github.com:robervalwalsh/analysis-ntuplizer.git Analysis/Ntuplizer ### latest commit 9fad3dd274a59394188b70d1984039c64f18f158
17 #________________________________________________________________________________________________________________________________________________
18 
19 
20 # For the ntuple production
21 import FWCore.ParameterSet.Config as cms
22 
23 from Configuration.StandardSequences.Eras import eras
24 
25 #process = cms.Process('MssmHbb',eras.Run2_2017,eras.run2_nanoAOD_94XMiniAODv2)
26 # lack reference -PPD twiki???
27 process = cms.Process('MssmHbb',eras.Run2_2017,eras.run2_nanoAOD_94XMiniAODv2,eras.run2_miniAOD_94XFall17)
28 
29 process.load('FWCore.MessageService.MessageLogger_cfi')
30 process.MessageLogger.cerr.FwkReport.reportEvery = cms.untracked.int32(100000)
31 
32 ## Using MINIAOD. GlobalTag just in case jet re-clustering, L1 trigger filter etc is needed to be done
33 process.load('Configuration.StandardSequences.MagneticField_AutoFromDBCurrent_cff')
34 process.load('Configuration.Geometry.GeometryRecoDB_cff')
35 process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff')
36 from Configuration.AlCa.GlobalTag import GlobalTag
37 process.GlobalTag = GlobalTag(process.GlobalTag, '94X_dataRun2_v11')
38 
39 process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(100) )
40 
41 ## TFileService
42 output_file = 'ntuple.root'
43 process.TFileService = cms.Service('TFileService',
44  fileName = cms.string(output_file)
45 )
46 
47 ### ==== Analysis imports ==== ###
54 process.load('Analysis.Ntuplizer.run2017.v4.BJetRegression_cff')
55 
56 ### ==== btagging ==== ###
57 # only needed if discriminator is new or recommended not for JEC
58 bTagDiscriminators = [
59  'pfDeepFlavourJetTags:probb',
60  'pfDeepFlavourJetTags:probbb',
61  'pfDeepFlavourJetTags:problepb',
62  'pfDeepFlavourJetTags:probc',
63  'pfDeepFlavourJetTags:probuds',
64  'pfDeepFlavourJetTags:probg'
65 ]
66 
67 ## ============ TRIGGER FILTER ===============
68 ## Enable below at cms.Path if needed - DATA ONLY!!!
69 process.triggerSelection = cms.EDFilter( 'TriggerResultsFilter',
70  MssmHbbTriggerResultsFilter,
71  hltResults = cms.InputTag( 'TriggerResults', '', 'HLT' ),
72  l1tResults = cms.InputTag( '' ),
73  l1tIgnoreMask = cms.bool( False ),
74  l1techIgnorePrescales = cms.bool( False ),
75  daqPartitions = cms.uint32( 1 ),
76  throw = cms.bool( False )
77 )
78 
79 ### ==== Puppi specific ==== ####
80 from PhysicsTools.PatAlgos.tools.helpers import getPatAlgosToolsTask
81 patAlgosToolsTask = getPatAlgosToolsTask(process)
82 from PhysicsTools.PatAlgos.patPuppiJetSpecificProducer_cfi import patPuppiJetSpecificProducer
83 process.patPuppiJetSpecificProducer = patPuppiJetSpecificProducer.clone(
84  src=cms.InputTag("slimmedJetsPuppi"),
85 )
86 patAlgosToolsTask.add(process.patPuppiJetSpecificProducer)
87 updateJetCollection(
88  process,
89  labelName = 'PuppiJetSpecific',
90  jetSource = cms.InputTag('slimmedJetsPuppi'),
91 )
92 process.updatedPatJetsPuppiJetSpecific.userData.userFloats.src = ['patPuppiJetSpecificProducer:puppiMultiplicity', 'patPuppiJetSpecificProducer:neutralPuppiMultiplicity', 'patPuppiJetSpecificProducer:neutralHadronPuppiMultiplicity', 'patPuppiJetSpecificProducer:photonPuppiMultiplicity', 'patPuppiJetSpecificProducer:HFHadronPuppiMultiplicity', 'patPuppiJetSpecificProducer:HFEMPuppiMultiplicity' ]
93 process.PuppiJetSpecific = cms.Task()
94 process.PuppiJetSpecific.add(process.patPuppiJetSpecificProducer)
95 process.PuppiJetSpecific.add(process.updatedPatJetsPuppiJetSpecific)
96 
97 
98 
99 ### ============ Jet energy correctiosn update ==============
100 ## Update the slimmedJets in miniAOD: corrections from the chosen Global Tag are applied and the b-tag discriminators are re-evaluated
101 updateJetCollection(
102  process,
103  labelName = 'Tmp',
104  jetSource = cms.InputTag('slimmedJetsWithUserDataWithReg'),
105  pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'),
106  svSource = cms.InputTag('slimmedSecondaryVertices'),
107  jetCorrections = ('AK4PFchs', cms.vstring(['L1FastJet', 'L2Relative', 'L3Absolute', 'L2L3Residual']), 'None'),
108  btagDiscriminators = bTagDiscriminators,
109 )
110 process.BtagDeepFlavour = cms.Task()
111 # corrections on slimmedJets with regresssion
112 process.BtagDeepFlavour.add(process.patJetCorrFactorsTmp)
113 process.BtagDeepFlavour.add(process.patJetCorrFactorsTransientCorrectedTmp)
114 process.BtagDeepFlavour.add(process.selectedUpdatedPatJetsTmp)
115 process.BtagDeepFlavour.add(process.updatedPatJetsTmp)
116 process.BtagDeepFlavour.add(process.updatedPatJetsTransientCorrectedTmp)
117 # deepFlavour on corrected slimmedJets with regression
118 process.BtagDeepFlavour.add(process.pfDeepCSVTagInfosTmp)
119 process.BtagDeepFlavour.add(process.pfDeepFlavourJetTagsTmp)
120 process.BtagDeepFlavour.add(process.pfDeepFlavourTagInfosTmp)
121 process.BtagDeepFlavour.add(process.pfImpactParameterTagInfosTmp)
122 process.BtagDeepFlavour.add(process.pfInclusiveSecondaryVertexFinderTagInfosTmp)
123 # tradition: using the default name for the jet collection in the analysis
124 process.updatedPatJets = process.selectedUpdatedPatJetsTmp.clone()
125 process.BtagDeepFlavour.add(process.updatedPatJets)
126 
127 
128 ### ============ Jet energy correctiosn update ==============
129 ## Update the slimmedJetsPuppi in miniAOD: corrections from the chosen Global Tag are applied and the b-tag discriminators are re-evaluated
130 updateJetCollection(
131  process,
132  labelName = 'PuppiTmp',
133  jetSource = cms.InputTag('updatedPatJetsPuppiJetSpecific'),
134  pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'),
135  svSource = cms.InputTag('slimmedSecondaryVertices'),
136  jetCorrections = ('AK4PFPuppi', cms.vstring(['L1FastJet', 'L2Relative', 'L3Absolute', 'L2L3Residual']), 'None'),
137  btagDiscriminators = bTagDiscriminators,
138 )
139 process.BtagDeepFlavourPuppi = cms.Task()
140 # corrections on slimmedJets with regresssion
141 process.BtagDeepFlavourPuppi.add(process.patJetCorrFactorsPuppiTmp)
142 process.BtagDeepFlavourPuppi.add(process.patJetCorrFactorsTransientCorrectedPuppiTmp)
143 process.BtagDeepFlavourPuppi.add(process.selectedUpdatedPatJetsPuppiTmp)
144 process.BtagDeepFlavourPuppi.add(process.updatedPatJetsPuppiTmp)
145 process.BtagDeepFlavourPuppi.add(process.updatedPatJetsTransientCorrectedPuppiTmp)
146 # deepFlavour on corrected slimmedJets with regression
147 process.BtagDeepFlavourPuppi.add(process.pfDeepCSVTagInfosPuppiTmp)
148 process.BtagDeepFlavourPuppi.add(process.pfDeepFlavourJetTagsPuppiTmp)
149 process.BtagDeepFlavourPuppi.add(process.pfDeepFlavourTagInfosPuppiTmp)
150 process.BtagDeepFlavourPuppi.add(process.pfImpactParameterTagInfosPuppiTmp)
151 process.BtagDeepFlavourPuppi.add(process.pfInclusiveSecondaryVertexFinderTagInfosPuppiTmp)
152 # tradition: using the default name for the jet collection in the analysis
153 process.updatedPatJetsPuppi = process.selectedUpdatedPatJetsPuppiTmp.clone()
154 process.BtagDeepFlavourPuppi.add(process.updatedPatJetsPuppi)
155 
156 
157 ### ============ Jet energy correctiosn update ==============
158 ## Update the slimmedJetsAK8 in miniAOD: corrections from the chosen Global Tag are applied
159 updateJetCollection(
160  process,
161  labelName = 'AK8',
162  pvSource = cms.InputTag('offlineSlimmedPrimaryVertices'),
163  svSource = cms.InputTag('slimmedSecondaryVertices'),
164  jetSource = cms.InputTag('slimmedJetsAK8'),
165  jetCorrections = ('AK8PFchs', cms.vstring(['L1FastJet', 'L2Relative', 'L3Absolute', 'L2L3Residual']), 'None'),
166 )
167 process.AK8Jets = cms.Task()
168 process.AK8Jets.add(process.patJetCorrFactorsAK8)
169 process.AK8Jets.add(process.updatedPatJetsAK8)
170 
171 ## ============ EVENT FILTER COUNTER ===============
172 ## Filter counter (maybe more useful for MC)
173 process.TotalEvents = cms.EDProducer('EventCountProducer')
174 process.FilteredEvents = cms.EDProducer('EventCountProducer')
175 
176 ## ============ PRIMARY VERTEX FILTER ===============
177 process.primaryVertexFilter = cms.EDFilter('VertexSelector',
178  src = cms.InputTag('offlineSlimmedPrimaryVertices'), # primary vertex collection name
179  cut = cms.string('!isFake && ndof > 4 && abs(z) <= 24 && position.Rho <= 2'), # ndof>thr=4 corresponds to sum(track_weigths) > (thr+3)/2 = 3.5 so typically 4 good tracks
180  filter = cms.bool(True), # otherwise it won't filter the events, just produce an empty vertex collection.
181 )
182 
183 ## ============ THE NTUPLIZER!!! ===============
184 process.MssmHbb = cms.EDAnalyzer('Ntuplizer',
185  # Imported settings (always at the beginning)
186  MssmHbbNtuplizerBtag,
187  MssmHbbNtuplizerTriggerPaths,
188  MssmHbbNtuplizerL1Seeds,
189  MssmHbbNtuplizerTriggerObjects,
190 
191  MonteCarlo = cms.bool(False),
192  ###################
193  TotalEvents = cms.InputTag ('TotalEvents'),
194  FilteredEvents = cms.InputTag ('FilteredEvents'),
195 # PatJets = cms.VInputTag( cms.InputTag('slimmedJets'), cms.InputTag('slimmedJetsPuppi'), cms.InputTag('slimmedJetsAK8'), ),
196  PatJets = cms.VInputTag( cms.InputTag('updatedPatJets'), cms.InputTag('updatedPatJetsPuppi'), cms.InputTag('updatedPatJetsAK8'), ),
197  JECRecords = cms.vstring ( 'AK4PFchs', 'AK4PFPuppi', 'AK8PFchs', ), # for the JEC uncertainties
198  JERRecords = cms.vstring ( 'AK4PFchs', 'AK4PFPuppi', 'AK8PFchs', ), # for the JER uncertainties
199 # PatJets = cms.VInputTag( cms.InputTag('updatedPatJets'), ),
200 # JECRecords = cms.vstring ( 'AK4PFchs', ), # for the JEC uncertainties
201 # JERRecords = cms.vstring ( 'AK4PFchs', ), # for the JER uncertainties
202  FixedGridRhoAll = cms.InputTag ('fixedGridRhoAll'),
203  PatMuons = cms.VInputTag(cms.InputTag('slimmedMuons') ),
204  PrimaryVertices = cms.VInputTag(cms.InputTag('offlineSlimmedPrimaryVertices') ),
205  TriggerResults = cms.VInputTag(cms.InputTag('TriggerResults','','HLT') ),
206  L1TJets = cms.VInputTag(cms.InputTag('caloStage2Digis','Jet','RECO'), ),
207  L1TMuons = cms.VInputTag(cms.InputTag('gmtStage2Digis','Muon','RECO'), ),
208  TriggerObjectStandAlone = cms.VInputTag(cms.InputTag('slimmedPatTrigger'), ),
209 
210 )
211 
212 
213 #process.p1 = cms.Path(process.task)
214 
215 process.p = cms.Path(process.TotalEvents +
216  process.triggerSelection +
217  process.primaryVertexFilter +
218  process.FilteredEvents +
219  process.MssmHbb,
220  process.PuppiJetSpecific,
221  process.BJetRegression,
222  process.BtagDeepFlavour,
223  process.BtagDeepFlavourPuppi,
224  process.AK8Jets,
225  )
226 
227 readFiles = cms.untracked.vstring()
228 secFiles = cms.untracked.vstring()
229 process.source = cms.Source ('PoolSource',fileNames = readFiles, secondaryFileNames = secFiles)
230 readFiles.extend( [
231 # '/store/data/Run2017F/BTagCSV/MINIAOD/17Nov2017-v1/00000/0202DCDF-4CFF-E711-8269-141877642F9D.root',
232  '/store/data/Run2017F/BTagCSV/MINIAOD/31Mar2018-v1/30000/78B5C4F9-3837-E811-A7DA-0025901D08B0.root'
233 
234 ] );
235 
236 
237 secFiles.extend( [
238  ] )
239 
240 # ============ Output MiniAOD ======================
241 # process.out = cms.OutputModule("PoolOutputModule",
242 # fileName = cms.untracked.string('patTuple.root'),
243 # outputCommands = cms.untracked.vstring('keep *' )
244 # )
245 # process.outpath = cms.EndPath(process.out)
246 #
247 # ## ============ JSON Certified data =============== BE CAREFUL!!!
248 # ## Don't use with CRAB!!!
249 # import FWCore.PythonUtilities.LumiList as LumiList
250 # import FWCore.ParameterSet.Types as CfgTypes
251 # process.source.lumisToProcess = CfgTypes.untracked(CfgTypes.VLuminosityBlockRange())
252 # JSONfile = 'json.txt'
253 # myLumis = LumiList.LumiList(filename = JSONfile).getCMSSWString().split(',')
254 # process.source.lumisToProcess.extend(myLumis)
============ Jet energy correctiosn update ============== (not really running!???) ...