beta | |
RMS (or dR2Mean) | |
jet dR profile | |
charged and neutral multiplicities |
git remote add ahinzmann git@github.com:ahinzmann/cmssw.git git fetch ahinzmann PUidMiniAODfix80 git cherry-pick ca33756e1747aec27d13971bcfd0874b16724e7fAn example how to re-calculate the pileup jet ID and re-calibrate the jets on MiniAOD is below:
import FWCore.ParameterSet.Config as cms process = cms.Process("PATUPDATE") process.load("FWCore.MessageLogger.MessageLogger_cfi") process.source = cms.Source("PoolSource", fileNames = cms.untracked.vstring(["/RelValTTbar_13/CMSSW_8_0_5- PU25ns_80X_mcRun2_asymptotic_2016_miniAODv2_v0_gs71xJecGT-v1/MINIAODSIM"]) ) process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(10000) ) process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") from Configuration.AlCa.GlobalTag import GlobalTag process.GlobalTag = GlobalTag(process.GlobalTag, '80X_mcRun2_asymptotic_2016_miniAODv2') process.load("RecoJets.JetProducers.PileupJetID_cfi") process.pileupJetIdUpdated = process.pileupJetId.clone( jets=cms.InputTag("slimmedJets"), inputIsCorrected=True, applyJec=True, vertexes=cms.InputTag("offlineSlimmedPrimaryVertices") ) print process.pileupJetId.dumpConfig() process.load("PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cff") process.patJetCorrFactorsReapplyJEC = process.updatedPatJetCorrFactors.clone( src = cms.InputTag("slimmedJets"), levels = ['L1FastJet', 'L2Relative', 'L3Absolute'] ) process.updatedJets = process.updatedPatJets.clone( jetSource = cms.InputTag("slimmedJets"), jetCorrFactorsSource = cms.VInputTag(cms.InputTag("patJetCorrFactorsReapplyJEC")) ) process.updatedJets.userData.userFloats.src += ['pileupJetIdUpdated:fullDiscriminant'] process.p = cms.Path( process.pileupJetIdUpdated + process.patJetCorrFactorsReapplyJEC + process. updatedJets ) process.out = cms.OutputModule("PoolOutputModule", fileName = cms.untracked.string("patTupleUpdatedFromMiniAOD.root"), outputCommands = cms.untracked.vstring('keep *') ) process.endpath = cms.EndPath(process.out)
# import ROOT in batch mode import sys oldargv = sys.argv[:] sys.argv = [ '-b-' ] import ROOT ROOT.gROOT.SetBatch(True) sys.argv = oldargv # load FWLite C++ libraries ROOT.gSystem.Load("libFWCoreFWLite.so"); ROOT.gSystem.Load("libDataFormatsFWLite.so"); ROOT.AutoLibraryLoader.enable() # load FWlite python libraries from DataFormats.FWLite import Handle, Events from PhysicsTools.HeppyCore.utils.deltar import deltaR jets, jetLabel = Handle("std::vector<pat::Jet>"), "slimmedJets" # open file (you can use 'edmFileUtil -d /store/whatever.root' to get the physical file name) events = Events("file:////afs/cern.ch/user/h/hinzmann/workspace/tmp/MiniAOD.root") for iev,event in enumerate(events): #if iev >= 10: break event.getByLabel(jetLabel, jets) print "\nEvent %d: run %6d, lumi %4d, event %12d" % (iev,event.eventAuxiliary().run(), event.eventAuxiliary().luminosityBlock(),event.eventAuxiliary().event()) # Jets (standard AK4) for i,j in enumerate(jets.product()): if j.pt() < 20: continue print "jet %3d: pt %5.1f (raw pt %5.1f, matched-calojet pt %5.1f), eta %+4.2f, pileup mva disc %+.2f" % ( i, j.pt(), j.pt()*j.jecFactor('Uncorrected'), j.userFloat("caloJetMap:pt"), j.eta(), j.userFloat("pileupJetIdUpdated:fullDiscriminant")) print "Passes loose: ", bool(j.userInt("pileupJetIdUpdated:fullId") & (1 << 2)), "medium: ", bool(j.userInt("pileupJetIdUpdated:fullId") & (1 << 1)), "tight: ", bool(j.userInt("pileupJetIdUpdated:fullId") & (1 << 0))
cmsrel CMSSW_7_6_4 cd CMSSW_7_6_4/src/ cmsenv git cms-init git cms-merge-topic jbrands:pileupJetId76X git cherry-pick 7c23237a87181e9320874c6f1f913a43fe849499 cd RecoJets/JetProducers/data/ wget https://github.com/jbrands/RecoJets-JetProducers/raw/3dad903ed25d025f68be94d6f781ca957d6f86ac/pileupJetId_76x_Eta0to2p5_BDT.weights.xml.gz wget https://github.com/jbrands/RecoJets-JetProducers/raw/3dad903ed25d025f68be94d6f781ca957d6f86ac/pileupJetId_76x_Eta2p5to2p75_BDT.weights.xml.gz wget https://github.com/jbrands/RecoJets-JetProducers/raw/3dad903ed25d025f68be94d6f781ca957d6f86ac/pileupJetId_76x_Eta2p75to3_BDT.weights.xml.gz wget https://github.com/jbrands/RecoJets-JetProducers/raw/3dad903ed25d025f68be94d6f781ca957d6f86ac/pileupJetId_76x_Eta3to5_BDT.weights.xml.gz cd ../../.. scram b -j5Pileup jet ID calculator can recalibrate jets with JEC if necessary. Therefore it is important to load the correct global tag or DB file with the latest corrections (example below). An example how to calculate the pileup jet ID and re-calibrate the jets on MiniAOD is below:
import FWCore.ParameterSet.Config as cms process = cms.Process("PATUPDATE") process.load("FWCore.MessageLogger.MessageLogger_cfi") process.source = cms.Source("PoolSource", fileNames = cms.untracked.vstring(["/store/relval/CMSSW_7_6_2/RelValZMM_13/MINIAODSIM/PU25ns_76X_mcRun2_asymptotic_v12-v1/00000/C86BA73E-D09C-E511-AD68-002590596468.root"]) # fileNames = cms.untracked.vstring(["root://xrootd.unl.edu//store/relval/CMSSW_7_6_2/RelValTTbar_13/MINIAODSIM/PU25ns_76X_mcRun2_asymptotic_v12-v1/00000/DC900947-DC9C-E511-B3AC-0CC47A4C8F0A.root"]) ) process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(10000) ) process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") from Configuration.AlCa.GlobalTag import GlobalTag process.GlobalTag = GlobalTag(process.GlobalTag, '76X_mcRun2_asymptotic_RunIIFall15DR76_v1') process.load("RecoJets.JetProducers.PileupJetID_cfi") process.pileupJetIdUpdated = process.pileupJetId.clone( jets=cms.InputTag("slimmedJets"), inputIsCorrected=True, applyJec=True, vertexes=cms.InputTag("offlineSlimmedPrimaryVertices") ) print process.pileupJetId.dumpConfig() process.load("PhysicsTools.PatAlgos.producersLayer1.jetUpdater_cff") process.patJetCorrFactorsReapplyJEC = process.updatedPatJetCorrFactors.clone( src = cms.InputTag("slimmedJets"), levels = ['L1FastJet', 'L2Relative', 'L3Absolute'] ) process.updatedJets = process.updatedPatJets.clone( jetSource = cms.InputTag("slimmedJets"), jetCorrFactorsSource = cms.VInputTag(cms.InputTag("patJetCorrFactorsReapplyJEC")) ) process.updatedJets.userData.userFloats.src += ['pileupJetIdUpdated:fullDiscriminant'] process.p = cms.Path( process.pileupJetIdUpdated + process.patJetCorrFactorsReapplyJEC + process. updatedJets ) process.out = cms.OutputModule("PoolOutputModule", fileName = cms.untracked.string("patTupleUpdatedFromMiniAOD.root"), outputCommands = cms.untracked.vstring('keep *') ) process.endpath = cms.EndPath(process.out)
import FWCore.ParameterSet.Config as cms process = cms.Process("PATUPDATE") process.load("FWCore.MessageLogger.MessageLogger_cfi") process.source = cms.Source("PoolSource", fileNames = cms.untracked.vstring(["/store/relval/CMSSW_7_6_2/RelValZMM_13/GEN-SIM-RECO/PU25ns_76X_mcRun2_asymptotic_v12-v1/00000/56F71722-CC9C-E511-9FCF-0CC47A4D7668.root"]) ) process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(100) ) process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") from Configuration.AlCa.GlobalTag import GlobalTag process.GlobalTag = GlobalTag(process.GlobalTag, '76X_mcRun2_asymptotic_RunIIFall15DR76_v1') process.load("RecoJets.JetProducers.PileupJetID_cfi") process.pileupJetId.jets=cms.InputTag("ak4PFJetsCHS") process.pileupJetId.inputIsCorrected=False process.pileupJetId.applyJec=True process.pileupJetId.vertexes=cms.InputTag("offlinePrimaryVertices") print process.pileupJetId.dumpConfig() process.p = cms.Path(process.pileupJetId) process.out = cms.OutputModule("PoolOutputModule", fileName = cms.untracked.string("patTuplePuIdFromAOD.root"), outputCommands = cms.untracked.vstring('keep *') ) process.endpath = cms.EndPath(process.out)
# import ROOT in batch mode import sys oldargv = sys.argv[:] sys.argv = [ '-b-' ] import ROOT ROOT.gROOT.SetBatch(True) sys.argv = oldargv # load FWLite C++ libraries ROOT.gSystem.Load("libFWCoreFWLite.so"); ROOT.gSystem.Load("libDataFormatsFWLite.so"); ROOT.AutoLibraryLoader.enable() # load FWlite python libraries from DataFormats.FWLite import Handle, Events from PhysicsTools.HeppyCore.utils.deltar import deltaR jets, jetLabel = Handle("std::vector<pat::Jet>"), "updatedJets" pujetids, pujetidLabel = Handle("edm::ValueMap<StoredPileupJetIdentifier>"), "pileupJetIdUpdated" pujetidDiscriminant, pujetidDiscriminantLabel = Handle("edm::ValueMap<float>") , "pileupJetIdUpdated:fullDiscriminant" pujetidFullId, pujetidFullIdLabel = Handle("edm::ValueMap<int>") , "pileupJetIdUpdated:fullId" # open file (you can use 'edmFileUtil -d /store/whatever.root' to get the physical file name) events = Events("file:////afs/cern.ch/user/h/hinzmann/workspace/tmp/patTupleUpdatedFromMiniAOD.root") #eff_loose=0 #eff_medium=0 #eff_tight=0 #num_jets=0 for iev,event in enumerate(events): #if iev >= 10: break event.getByLabel(jetLabel, jets) event.getByLabel(pujetidLabel, pujetids) event.getByLabel(pujetidDiscriminantLabel, pujetidDiscriminant) event.getByLabel(pujetidFullIdLabel, pujetidFullId) print "\nEvent %d: run %6d, lumi %4d, event %12d" % (iev,event.eventAuxiliary().run(), event.eventAuxiliary().luminosityBlock(),event.eventAuxiliary().event()) # Jets (standard AK4) for i,j in enumerate(jets.product()): if j.pt() < 20: continue print "jet %3d: pt %5.1f (raw pt %5.1f, matched-calojet pt %5.1f), eta %+4.2f, pileup mva disc %+.2f" % ( i, j.pt(), j.pt()*j.jecFactor('Uncorrected'), j.userFloat("caloJetMap:pt"), j.eta(), j.userFloat("pileupJetIdUpdated:fullDiscriminant")) print "Passes loose: ", bool(pujetidFullId.product().get(i) & (1 << 2)), "medium: ", bool(pujetidFullId.product().get(i) & (1 << 1)), "tight: ", bool(pujetidFullId.product().get(i) & (1 << 0)) #string="" #string+="MVA=%.3f, " % (pujetidDiscriminant.product().get(i)) #variables=['RMS', 'beta', 'betaClassic', 'betaStar', 'betaStarClassic', 'dR2Mean', 'dRMatch', 'dRMean', 'dZ', 'frac01', 'frac02', 'frac03', 'frac04', 'frac05', 'frac06', 'frac07', 'jetEta', 'jetPt', 'jetR', 'jetRchg', 'majW', 'minW', 'nCharged', 'nNeutrals', 'nParticles', 'nTrueInt', 'nvtx', 'ptD', 'pull', 'rho'] #for var in variables: # string+=var+"=%.3f, " % (getattr(pujetids.product().get(i),var)()) #print string #try: genJetMatch=deltaR(j.genJet().eta(),j.genJet().phi(),j.eta(),j.phi())<0.2 and ((abs(j.partonFlavour()) > 0 and abs(j.partonFlavour()) < 6) or (j.partonFlavour() == 21)) #except: genJetMatch=0 #if genJetMatch: # num_jets+=1. # eff_loose+=bool(pujetidFullId.product().get(i) & (1 << 2)) # eff_medium+=bool(pujetidFullId.product().get(i) & (1 << 1)) # eff_tight+=bool(pujetidFullId.product().get(i) & (1 << 0)) #print num_jets #print eff_loose/num_jets #print eff_medium/num_jets #print eff_tight/num_jets
edm::Handle<edm::View<pat::Jet > >; jets; iEvent.getByLabel("selectedPatJets",jets); Handle<ValueMap<float> >; puJetIdMVA; iEvent.getByLabel("pileupJetIdUpdated:fullDiscriminant",puJetMva); Handle<ValueMap<int> >; puJetIdFlag; iEvent.getByLabel("pileupJetIdUpdated:fullId",puJetMva); for ( unsigned int i=0; i<jets->size(); ++i ) { const pat::Jet & patjet = jets->at(i); float mva = (*puJetIdMVA)[jets->refAt(i)]; int idflag = (*puJetIdFlag)[jets->refAt(i)]; cout << "jet " << i << " pt " << patjet.pt() << " eta " << patjet.eta() << " PU JetID MVA " << mva; if( PileupJetIdentifier::passJetId( idflag, PileupJetIdentifier::kLoose ) { cout << " pass loose wp"; } if( PileupJetIdentifier::passJetId( idflag, PileupJetIdentifier::kMedium ) { cout << " pass medium wp"; } if( PileupJetIdentifier::passJetId( idflag, PileupJetIdentifier::kTight ) { cout << " pass tight wp"; } cout << endl; }
CMSSW 4X | V00-03-04 | Automatically detects CMSSW version and used ultimate 4X weights when running on 4X |
CMSSW 5X | V00-03-04 | Used for ICHEP analyses in 5X |
cvs co -r <TAG> -d CMGTools/External UserCode /CMG/CMGTools/External cd CMGTools/External scram b -j 5The procedure to run on PAT jets or plain reco jets is different, due to the different treatment of jet energy correction. In fact, while the input variables are independent of the jet energy corrections, the value of the final MVA depends on the corrected jet energy.
# load the PU JetID sequence process.load("CMGTools.External.pujetidsequence_cff") # run the PU JetID sequence process.p = cms.Path(process.patSequence * process.puJetIdSqeuence) # keep the PU JetID products process.out.extend(["keep *_puJetId_*_*", # input variables "keep *_puJetMva_*_*" # final MVAs and working point flags ])This will produce the following output:
edmDumpEventContent patTuple.root | grep puJet edm::ValueMap<StoredPileupJetIdentifier> "puJetId" "" "PAT" edm::ValueMap<float> "puJetMva" "fullDiscriminant" "PAT" edm::ValueMap<float> "puJetMva" "cutbasedDiscriminant" "PAT" edm::ValueMap<float> "puJetMva" "simpleDiscriminant" "PAT" edm::ValueMap<int> "puJetMva" "fullId" "PAT" edm::ValueMap<int> "puJetMva" "cutbased" "PAT" edm::ValueMap<int> "puJetMva" "simpleId" "PAT"For each type of algorithm (cut-based, simple and full BDTs), the producer outputs two ValueMap, one (*Discriminan) with the value of the MVA and a second (*Id) encoding the working point evaluation. This information can be accessed at analysis level in the following way:
edm::Handle<edm::View<pat::Jet> > jets; iEvent.getByLabel("selectedPatJets",jets); Handle<ValueMap<float> > puJetIdMVA; iEvent.getByLabel("fullDiscriminant",puJetMva); Handle<ValueMap<int> > puJetIdFlag; iEvent.getByLabel("fullId",puJetMva); for ( unsigned int i=0; i<jets->size(); ++i ) { const pat::Jet & patjet = jets->at(i); float mva = (*puJetIdMVA)[jets->refAt(i)]; int idflag = (*puJetIdFlag)[jets->refAt(i)]; cout << "jet " << i << " pt " << patjet.pt() << " eta " << patjet.eta() << " PU JetID MVA " << mva; if( PileupJetIdentifier::passJetId( idflag, PileupJetIdentifier::kLoose ) { cout << " pass loose wp"; } if( PileupJetIdentifier::passJetId( idflag, PileupJetIdentifier::kMedium ) { cout << " pass medium wp"; } if( PileupJetIdentifier::passJetId( idflag, PileupJetIdentifier::kTight ) { cout << " pass tight wp"; } cout << endl; }The ValueMap with StoredPileupJetIdentifier can be used to check the inputs to the algorithm and it allows to re-evaluate the final MVA and working points at a later stage directly on the PAT-tuples. This can be done in the following way.
# load the PU JetID sequence process.load("CMGTools.External.pujetidsequence_cff") # re-evaluate PU JetID MVA process.p = cms.Path(process.puJetMva) # keep the PU JetID products process.out.extend(["keep *_puJetId_*_*", # input variables "keep *_puJetMva_*_*" # final MVAs and working point flags ])
puJetId
with puJetIdChs
and similarly puJetMva
with puJetMvaChs
.
applyJec
flag to False
and the inputIsCorrected
to True
.
from CMGTools.External.pujetidsequence_cff import puJetId process.recoPuJetId = puJetId.clone( jets = cms.InputTag("ak5PFJets"), applyJec = cms.bool(True), inputIsCorrected = cms.bool(False), ) process.recoPuJetMva = puJetMva.clone( jets = cms.InputTag("ak5PFJets"), jetids = cms.InputTag("recoPuJetId"), applyJec = cms.bool(True), inputIsCorrected = cms.bool(False), ) process.recoPuJetIdSqeuence(process.recoPuJetId * process.recoPuJetMva )