DESY Hbb Analysis Framework
ntuplizer_94X_mc_2017_fall17-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_mc2017_realistic_v17')
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(True),
192  ## Monte Carlo only
193  CrossSection = cms.double(1.), # in pb
194  GenFilterInfo = cms.InputTag("genFilterEfficiencyProducer"),
195  GenRunInfo = cms.InputTag("generator"),
196  GenEventInfo = cms.InputTag("generator"),
197  GenJets = cms.VInputTag(cms.InputTag("slimmedGenJets")),
198  GenParticles = cms.VInputTag(cms.InputTag("prunedGenParticles")),
199  PileupInfo = cms.InputTag("slimmedAddPileupInfo"),
200  ###################
201  TotalEvents = cms.InputTag ('TotalEvents'),
202  FilteredEvents = cms.InputTag ('FilteredEvents'),
203  PatJets = cms.VInputTag( cms.InputTag('updatedPatJets'), cms.InputTag('updatedPatJetsPuppi'), cms.InputTag('updatedPatJetsAK8'), ),
204  JECRecords = cms.vstring ( 'AK4PFchs', 'AK4PFPuppi', 'AK8PFchs', ), # for the JEC uncertainties
205  JERRecords = cms.vstring ( 'AK4PFchs', 'AK4PFPuppi', 'AK8PFchs', ), # for the JER uncertainties
206  FixedGridRhoAll = cms.InputTag ('fixedGridRhoAll'),
207  PatMuons = cms.VInputTag(cms.InputTag('slimmedMuons') ),
208  PrimaryVertices = cms.VInputTag(cms.InputTag('offlineSlimmedPrimaryVertices') ),
209  TriggerResults = cms.VInputTag(cms.InputTag('TriggerResults','','HLT') ),
210  L1TJets = cms.VInputTag(cms.InputTag('caloStage2Digis','Jet','RECO'), ),
211  L1TMuons = cms.VInputTag(cms.InputTag('gmtStage2Digis','Muon','RECO'), ),
212  TriggerObjectStandAlone = cms.VInputTag(cms.InputTag('slimmedPatTrigger'), ),
213 
214 )
215 
216 
217 #process.p1 = cms.Path(process.task)
218 
219 process.p = cms.Path(process.TotalEvents +
220 # process.triggerSelection +
221  process.primaryVertexFilter +
222  process.FilteredEvents +
223  process.MssmHbb,
224  process.PuppiJetSpecific,
225  process.BJetRegression,
226  process.BtagDeepFlavour,
227  process.BtagDeepFlavourPuppi,
228  process.AK8Jets,
229  )
230 
231 readFiles = cms.untracked.vstring()
232 secFiles = cms.untracked.vstring()
233 process.source = cms.Source ('PoolSource',fileNames = readFiles, secondaryFileNames = secFiles)
234 readFiles.extend( [
235 # '/store/mc/RunIIFall17MiniAOD/SUSYGluGluToBBHToBB_M-350_TuneCP5_13TeV-pythia8/MINIAODSIM/94X_mc2017_realistic_v11-v1/00000/02D5DD76-241B-E811-A02E-0CC47A2B0214.root',
236 # '/store/mc/RunIIFall17MiniAODv2/SUSYGluGluToBBHToBB_NarrowWidth_M-350_TuneCP5_13TeV-pythia8/MINIAODSIM/PU2017_12Apr2018_94X_mc2017_realistic_v14-v1/20000/5CCCC2D7-BB41-E811-8AD3-FA163EF96190.root',
237  '/store/mc/RunIIFall17MiniAODv2/SUSYGluGluToBBHToBB_M-500_TuneCP5_13TeV-amcatnlo-pythia8/MINIAODSIM/PU2017_12Apr2018_94X_mc2017_realistic_v14-v1/120000/0C677CBE-1FC5-E811-B002-0242AC1C0505.root',
238 
239 ] );
240 
241 
242 secFiles.extend( [
243  ] )
244 
245 # ============ Output MiniAOD ======================
246 # process.out = cms.OutputModule("PoolOutputModule",
247 # fileName = cms.untracked.string('patTuple.root'),
248 # outputCommands = cms.untracked.vstring('keep *' )
249 # )
250 # process.outpath = cms.EndPath(process.out)
251 #
252 # ## ============ JSON Certified data =============== BE CAREFUL!!!
253 # ## Don't use with CRAB!!!
254 # import FWCore.PythonUtilities.LumiList as LumiList
255 # import FWCore.ParameterSet.Types as CfgTypes
256 # process.source.lumisToProcess = CfgTypes.untracked(CfgTypes.VLuminosityBlockRange())
257 # JSONfile = 'json.txt'
258 # myLumis = LumiList.LumiList(filename = JSONfile).getCMSSWString().split(',')
259 # process.source.lumisToProcess.extend(myLumis)
============ Jet energy correctiosn update ============== (not really running!???) ...