diff --git a/DQMOffline/RecoB/python/bTagCommon_cff.py b/DQMOffline/RecoB/python/bTagCommon_cff.py index ae7c6c679e18d..2491cd3390491 100644 --- a/DQMOffline/RecoB/python/bTagCommon_cff.py +++ b/DQMOffline/RecoB/python/bTagCommon_cff.py @@ -29,6 +29,8 @@ softLeptonInfo = cms.InputTag("softPFElectronsTagInfos"), # Section for the jet flavour identification jetMCSrc = cms.InputTag("mcJetFlavour"), + caloJetMCSrc = cms.InputTag(""), #To define only if you use the old flavour tool + useOldFlavourTool = cms.bool(False), #Recommended only for CaloJets, if True then define caloJetMCSrc and ignore jetMCSrc # eta and pt ranges ptRanges = cms.vdouble(50.0, 80.0, 120.0), etaRanges = cms.vdouble(0.0, 1.4, 2.4), diff --git a/DQMOffline/RecoB/python/bTagSequences_cff.py b/DQMOffline/RecoB/python/bTagSequences_cff.py index 261c8c1d634a9..19b0767bbb69b 100644 --- a/DQMOffline/RecoB/python/bTagSequences_cff.py +++ b/DQMOffline/RecoB/python/bTagSequences_cff.py @@ -3,8 +3,6 @@ #define you jet ID jetID = cms.InputTag("ak4PFJetsCHS") - - #JTA for your jets from RecoJets.JetAssociationProducers.j2tParametersVX_cfi import * myak4JetTracksAssociatorAtVertex = cms.EDProducer("JetTracksAssociatorAtVertex", @@ -20,11 +18,20 @@ softPFElectronsTagInfos.jets = jetID #for MC do the matching with you jet collection +from PhysicsTools.JetMCAlgos.HadronAndPartonSelector_cfi import selectedHadronsAndPartons +from PhysicsTools.JetMCAlgos.AK4PFJetsMCFlavourInfos_cfi import ak4JetFlavourInfos +ak4JetFlavourInfos.jets = jetID + from PhysicsTools.JetMCAlgos.CaloJetsMCFlavour_cfi import * AK4byRef.jets = jetID #do the matching : only for MC flavourSeq = cms.Sequence( + selectedHadronsAndPartons * + ak4JetFlavourInfos + ) + +oldFlavourSeq = cms.Sequence( myPartons * AK4Flavour ) @@ -42,17 +49,3 @@ from HLTrigger.HLTfilters.hltHighLevel_cfi import * bTagHLT = hltHighLevel.clone(TriggerResultsTag = "TriggerResults::HLT", HLTPaths = ["HLT_PFJet40_v*"]) -#for the use of JEC, could change with time : be careful if recommandations change for the correctors -#define you sequence like process.JECAlgo = cms.Sequence(process.ak4PFJetsJEC * process.PFJetsFilter) -JetCut=cms.string("neutralHadronEnergyFraction < 0.99 && neutralEmEnergyFraction < 0.99 && nConstituents > 1 && chargedHadronEnergyFraction > 0.0 && chargedMultiplicity > 0.0 && chargedEmEnergyFraction < 0.99") -#JetCut=cms.string("chargedEmEnergyFraction < 99999") - -from JetMETCorrections.Configuration.DefaultJEC_cff import * -from JetMETCorrections.Configuration.JetCorrectionServices_cff import * - - -PFJetsFilter = cms.EDFilter("PFJetSelector", - src = cms.InputTag("ak4PFJetsL2L3"), - cut = JetCut, - filter = cms.bool(True) - ) diff --git a/DQMOffline/RecoB/python/dqmAnalyzer_cff.py b/DQMOffline/RecoB/python/dqmAnalyzer_cff.py index fe59b13576f86..d9c02ab6aabb9 100644 --- a/DQMOffline/RecoB/python/dqmAnalyzer_cff.py +++ b/DQMOffline/RecoB/python/dqmAnalyzer_cff.py @@ -17,8 +17,10 @@ ########## MC ############ #Matching -from PhysicsTools.JetMCAlgos.CaloJetsMCFlavour_cfi import * -AK4byRef.jets = cms.InputTag("ak4PFJetsCHS") +from PhysicsTools.JetMCAlgos.HadronAndPartonSelector_cfi import selectedHadronsAndPartons +from PhysicsTools.JetMCAlgos.AK4PFJetsMCFlavourInfos_cfi import ak4JetFlavourInfos +myak4JetFlavourInfos = ak4JetFlavourInfos.clone(jets = cms.InputTag("ak4PFJetsCHS")) + #Get gen jet collection for real jets ak4GenJetsForPUid = cms.EDFilter("GenJetSelector", src = cms.InputTag("ak4GenJets"), @@ -36,7 +38,7 @@ # Module execution for MC from Validation.RecoB.bTagAnalysis_cfi import * -bTagValidation.jetMCSrc = 'AK4byValAlgo' +bTagValidation.jetMCSrc = 'myak4JetFlavourInfos' bTagValidation.ptRanges = cms.vdouble(0.0) bTagValidation.etaRanges = cms.vdouble(0.0) bTagValidation.doJetID = True @@ -44,7 +46,7 @@ bTagValidation.JECsource = cms.string("ak4PFCHSL1FastL2L3") bTagValidation.genJetsMatched = cms.InputTag("newpatJetGenJetMatch") #to run on fastsim -prebTagSequenceMC = cms.Sequence(ak4GenJetsForPUid*newpatJetGenJetMatch*myPartons*AK4Flavour) +prebTagSequenceMC = cms.Sequence(ak4GenJetsForPUid*newpatJetGenJetMatch*selectedHadronsAndPartons*myak4JetFlavourInfos) bTagPlotsMC = cms.Sequence(bTagValidation) #to run on fullsim in the validation sequence, all histograms produced in the dqmoffline sequence diff --git a/Validation/RecoB/plugins/BTagPerformanceAnalyzerMC.cc b/Validation/RecoB/plugins/BTagPerformanceAnalyzerMC.cc index bc06d7ef642bf..a1df69af452aa 100644 --- a/Validation/RecoB/plugins/BTagPerformanceAnalyzerMC.cc +++ b/Validation/RecoB/plugins/BTagPerformanceAnalyzerMC.cc @@ -7,7 +7,7 @@ using namespace edm; using namespace std; using namespace RecoBTag; -typedef std::pair JetWithFlavour; +typedef std::pair JetWithFlavour; BTagPerformanceAnalyzerMC::BTagPerformanceAnalyzerMC(const edm::ParameterSet& pSet) : jetSelector( @@ -22,6 +22,7 @@ BTagPerformanceAnalyzerMC::BTagPerformanceAnalyzerMC(const edm::ParameterSet& pS ), etaRanges(pSet.getParameter< vector >("etaRanges")), ptRanges(pSet.getParameter< vector >("ptRanges")), + useOldFlavourTool(pSet.getParameter( "useOldFlavourTool" )), JECsource(pSet.getParameter( "JECsource" )), doJEC(pSet.getParameter( "doJEC" )), ptHatWeight(pSet.getParameter< bool >("applyPtHatWeight")), @@ -51,7 +52,8 @@ BTagPerformanceAnalyzerMC::BTagPerformanceAnalyzerMC(const edm::ParameterSet& pS genToken = mayConsume(edm::InputTag("generator")); genJetsMatchedToken = mayConsume>(pSet.getParameter("genJetsMatched")); - jetToken = consumes(pSet.getParameter("jetMCSrc")); + jetToken = consumes(pSet.getParameter("jetMCSrc")); + caloJetToken = mayConsume(pSet.getParameter("caloJetMCSrc")); slInfoToken = consumes(pSet.getParameter("softLeptonInfo")); for (vector::const_iterator iModule = moduleConfig.begin(); iModule != moduleConfig.end(); ++iModule) { @@ -243,17 +245,37 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve LogDebug("Info") << "Event weight is: " << weight; - edm::Handle jetMC; FlavourMap flavours; LeptonMap leptons; - iEvent.getByToken(jetToken, jetMC); - for (JetFlavourMatchingCollection::const_iterator iter = jetMC->begin(); - iter != jetMC->end(); ++iter) { - unsigned int fl = std::abs(iter->second.getFlavour()); - flavours.insert(std::make_pair(iter->first, fl)); - const reco::JetFlavour::Leptons &lep = iter->second.getLeptons(); - leptons.insert(std::make_pair(iter->first, lep)); + + if(!useOldFlavourTool) { + edm::Handle jetMC; + iEvent.getByToken(jetToken, jetMC); + for (JetFlavourInfoMatchingCollection::const_iterator iter = jetMC->begin(); + iter != jetMC->end(); ++iter) { + unsigned int fl = std::abs(iter->second.getPartonFlavour()); + flavours.insert(std::make_pair(iter->first, fl)); + const GenParticleRefVector &lep = iter->second.getLeptons(); + reco::JetFlavour::Leptons lepCount; + for (unsigned int i=0; ipdgId())==11) lepCount.electron++; + else if(abs(lep.at(0)->pdgId())==13) lepCount.muon++; + else if(abs(lep.at(0)->pdgId())==15) lepCount.tau++; + } + leptons.insert(std::make_pair(iter->first, lepCount)); + } + } + else { + edm::Handle jetMC; + iEvent.getByToken(caloJetToken, jetMC); + for (JetFlavourMatchingCollection::const_iterator iter = jetMC->begin(); + iter != jetMC->end(); ++iter) { + unsigned int fl = std::abs(iter->second.getFlavour()); + flavours.insert(std::make_pair(iter->first, fl)); + const reco::JetFlavour::Leptons &lep = iter->second.getLeptons(); + leptons.insert(std::make_pair(iter->first, lep)); + } } edm::Handle infoHandle; @@ -292,8 +314,7 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve ((electronPlots && !leptons[tagI->first].electron) || (muonPlots && !leptons[tagI->first].muon) || (tauPlots && !leptons[tagI->first].tau))) - continue; - + continue; //JEC reco::Jet correctedJet = *(tagI->first); double jec = 1.0; @@ -304,7 +325,7 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve JetWithFlavour jetWithFlavour; if (!getJetWithFlavour(tagI->first, flavours, jetWithFlavour, iSetup, genJetsMatched)) continue; - if (!jetSelector(jetWithFlavour.first, std::abs(jetWithFlavour.second.getFlavour()), infoHandle, jec)) + if (!jetSelector(jetWithFlavour.first, std::abs(jetWithFlavour.second.getPartonFlavour()), infoHandle, jec)) continue; for (int iPlotter = 0; iPlotter != plotterSize; ++iPlotter) { @@ -312,7 +333,7 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve inBin = binJetTagPlotters[iJetLabel][iPlotter]->etaPtBin().inBin(jetWithFlavour.first, jec); // Fill histograms if in desired pt/rapidity bin. if (inBin) - binJetTagPlotters[iJetLabel][iPlotter]->analyzeTag(jetWithFlavour.first, jec, tagI->second, std::abs(jetWithFlavour.second.getFlavour()),weight); + binJetTagPlotters[iJetLabel][iPlotter]->analyzeTag(jetWithFlavour.first, jec, tagI->second, std::abs(jetWithFlavour.second.getPartonFlavour()),weight); } } for (int iPlotter = 0; iPlotter != plotterSize; ++iPlotter) { @@ -339,7 +360,7 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve (muonPlots && !leptons[tagI->first].muon) || (tauPlots && !leptons[tagI->first].tau))) continue; - + //JEC reco::Jet correctedJet = *(tagI->first); double jec = 1.0; @@ -350,7 +371,7 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve JetWithFlavour jetWithFlavour; if (!getJetWithFlavour(tagI->first, flavours, jetWithFlavour, iSetup, genJetsMatched)) continue; - if (!jetSelector(jetWithFlavour.first, std::abs(jetWithFlavour.second.getFlavour()), infoHandle, jec)) + if (!jetSelector(jetWithFlavour.first, std::abs(jetWithFlavour.second.getPartonFlavour()), infoHandle, jec)) continue; for(int iPlotter = 0; iPlotter != plotterSize; ++iPlotter) { @@ -360,7 +381,7 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve if(inBin) { double discr2 = tagColl2[tagI->first]; - binTagCorrelationPlotters[iJetLabel][iPlotter]->analyzeTags(tagI->second, discr2, std::abs(jetWithFlavour.second.getFlavour()),weight); + binTagCorrelationPlotters[iJetLabel][iPlotter]->analyzeTags(tagI->second, discr2, std::abs(jetWithFlavour.second.getPartonFlavour()),weight); } } } @@ -431,7 +452,7 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve (muonPlots && !leptons[jetRef].muon) || (tauPlots && !leptons[jetRef].tau))) continue; - + //JEC reco::Jet correctedJet = *(jetRef); double jec = 1.0; @@ -442,7 +463,7 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve JetWithFlavour jetWithFlavour; if (!getJetWithFlavour(jetRef, flavours, jetWithFlavour, iSetup, genJetsMatched)) continue; - if (!jetSelector(jetWithFlavour.first, std::abs(jetWithFlavour.second.getFlavour()), infoHandle, jec)) + if (!jetSelector(jetWithFlavour.first, std::abs(jetWithFlavour.second.getPartonFlavour()), infoHandle, jec)) continue; for (int iPlotter = 0; iPlotter != plotterSize; ++iPlotter) { @@ -450,7 +471,7 @@ void BTagPerformanceAnalyzerMC::analyze(const edm::Event& iEvent, const edm::Eve inBin = binTagInfoPlotters[iJetLabel][iPlotter]->etaPtBin().inBin(*jetRef, jec); // Fill histograms if in desired pt/rapidity bin. if (inBin) - binTagInfoPlotters[iJetLabel][iPlotter]->analyzeTag(baseTagInfos, jec, std::abs(jetWithFlavour.second.getFlavour()),weight); + binTagInfoPlotters[iJetLabel][iPlotter]->analyzeTag(baseTagInfos, jec, std::abs(jetWithFlavour.second.getPartonFlavour()),weight); } } } @@ -505,11 +526,11 @@ bool BTagPerformanceAnalyzerMC::getJetWithFlavour(edm::RefToBase jetRef, c if(!isNotPU) flavour=20; } - jetWithFlavour.second = reco::JetFlavour(jetWithFlavour.first.p4(), math::XYZPoint (0,0,0), flavour); + jetWithFlavour.second = reco::JetFlavourInfo(flavour, flavour); - LogTrace("Info") << "Found jet with flavour "< JetWithFlavour; + typedef std::pair JetWithFlavour; typedef std::map, unsigned int, JetRefCompare> FlavourMap; typedef std::map, reco::JetFlavour::Leptons, JetRefCompare> LeptonMap; @@ -57,6 +59,7 @@ class BTagPerformanceAnalyzerMC : public DQMEDAnalyzer { std::vector tiDataFormatType; AcceptJet jetSelector; // Decides if jet and parton satisfy kinematic cuts. std::vector etaRanges, ptRanges; + bool useOldFlavourTool; std::string JECsource; bool doJEC; @@ -89,7 +92,8 @@ class BTagPerformanceAnalyzerMC : public DQMEDAnalyzer { //add consumes edm::EDGetTokenT genToken; edm::EDGetTokenT> genJetsMatchedToken; - edm::EDGetTokenT jetToken; + edm::EDGetTokenT jetToken; + edm::EDGetTokenT caloJetToken; edm::EDGetTokenT slInfoToken; std::vector< edm::EDGetTokenT > jetTagToken; std::vector< std::pair, edm::EDGetTokenT> > tagCorrelationToken; diff --git a/Validation/RecoB/test/GridValidation/validation_FirstStepOnGrid.py b/Validation/RecoB/test/GridValidation/validation_FirstStepOnGrid.py index e32d737d37e76..fadbe1892959d 100644 --- a/Validation/RecoB/test/GridValidation/validation_FirstStepOnGrid.py +++ b/Validation/RecoB/test/GridValidation/validation_FirstStepOnGrid.py @@ -3,109 +3,93 @@ import FWCore.ParameterSet.Config as cms -whichJets = "ak4PFCHS" # default value, allowed : "ak4PF", "ak4PFCHS", add "NoJEC" to run the code with no JEC applied +whichJets = "ak4PFJetsCHS" +applyJEC = True +corrLabel = 'ak4PFCHSL1FastL2L3' +tag = 'MCRUN2_74_V7::All' useTrigger = False +triggerPath = "HLT_PFJet80_v*" runOnMC = True -tag = 'POSTLS172_V3::All' +#Flavour plots for MC: "all" = plots for all jets ; "dusg" = plots for d, u, s, dus, g independently ; not mandatory and any combinations are possible +#b, c, light (dusg), non-identified (NI), PU jets plots are always produced +flavPlots = "allbcldusg" ###prints### print "jet collcetion asked : ", whichJets -print "trigger will be used ? : ", useTrigger -print "is it MC ? : ", runOnMC +print "JEC applied?", applyJEC, ", correction:", corrLabel +print "trigger will be used ? : ", useTrigger, ", Trigger paths:", triggerPath +print "is it MC ? : ", runOnMC, ", Flavours:", flavPlots print "Global Tag : ", tag ############ process = cms.Process("validation") process.load("DQMServices.Components.DQMEnvironment_cfi") - -#keep the logging output to a nice level -process.load("FWCore.MessageLogger.MessageLogger_cfi") -process.MessageLogger.cerr.FwkReport.reportEvery = 100 - -# load the full reconstraction configuration, to make sure we're getting all needed dependencies -process.load("Configuration.StandardSequences.MagneticField_cff") -#process.load("Configuration.StandardSequences.GeometryRecoDB_cff") #old one, to use for old releases -process.load("Configuration.StandardSequences.GeometryRecoDB_cff") -#process.load('Configuration.Geometry.GeometryExtended2017Reco_cff') -#process.load('Configuration.Geometry.GeometryExtended2019Reco_cff') -#process.load('Configuration.Geometry.GeometryExtended2019_cff') -process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") -process.load("Configuration.StandardSequences.Reconstruction_cff") -process.GlobalTag.globaltag = tag - process.load("DQMServices.Core.DQM_cfg") process.load("DQMOffline.RecoB.bTagSequences_cff") -#process.bTagHLT.HLTPaths = ["HLT_PFJet80_v*"] #uncomment this line if you want to use different trigger - -newjetID=cms.InputTag("ak4PFJetsCHS") +process.load("JetMETCorrections.Configuration.JetCorrectionServices_cff") process.jetSequences = cms.Sequence(process.goodOfflinePrimaryVertices * process.btagSequence) -if "NoJEC" in whichJets and not "CHS" in whichJets : newjetID=cms.InputTag("ak4PFJets") -if not "NoJEC" in whichJets: - process.JECAlgo = cms.Sequence(process.ak4JetsJEC * process.PFJetsFilter) - process.jetSequences = cms.Sequence(process.goodOfflinePrimaryVertices * process.JECAlgo * process.btagSequence) - newjetID=cms.InputTag("PFJetsFilter") - if whichJets=="ak4PF": - process.ak4JetsJEC.src = 'ak4PFJets' - process.ak4JetsJEC.correctors = ['ak4PFL1FastL2L3'] -process.myak4JetTracksAssociatorAtVertex.jets = newjetID -process.pfImpactParameterTagInfos.jets = newjetID -process.softPFMuonsTagInfos.jets = newjetID -process.softPFElectronsTagInfos.jets = newjetID -process.AK4byRef.jets = newjetID - -### +if not "ak4PFJetsCHS" in whichJets: + newjetID=cms.InputTag(whichJets) + process.myak4JetTracksAssociatorAtVertex.jets = newjetID + process.pfImpactParameterTagInfos.jets = newjetID + process.softPFMuonsTagInfos.jets = newjetID + process.softPFElectronsTagInfos.jets = newjetID + process.ak4JetFlavourInfos.jets = newjetID + process.patJetGenJetMatch.src = newjetID + +### print "inputTag : ", process.myak4JetTracksAssociatorAtVertex.jets -### - +### process.load("Validation.RecoB.bTagAnalysis_firststep_cfi") if runOnMC: - process.bTagValidationFirstStep.jetMCSrc = 'AK4byValAlgo' + process.bTagValidationFirstStep.jetMCSrc = 'ak4JetFlavourInfos' process.bTagValidationFirstStep.applyPtHatWeight = False - process.bTagValidationFirstStep.flavPlots = "allbcl" #if contains "all" plots for all jets booked, if contains "bcl" histograms for b, c and light jets booked, if contains "dusg" all histograms booked - #process.bTagValidation.ptRecJetMin = cms.double(20.) - process.bTagValidation.genJetsMatched = cms.InputTag("patJetGenJetMatch") - process.bTagValidation.doPUid = cms.bool(True) + process.bTagValidationFirstStep.doJetID = True + process.bTagValidationFirstStep.doJEC = applyJEC + process.bTagValidationFirstStep.JECsource = cms.string(corrLabel) + process.bTagValidationFirstStep.flavPlots = flavPlots + #process.bTagValidationFirstStep.ptRecJetMin = cms.double(20.) + process.bTagValidationFirstStep.genJetsMatched = cms.InputTag("patJetGenJetMatch") + process.bTagValidationFirstStep.doPUid = cms.bool(True) process.ak4GenJetsForPUid = cms.EDFilter("GenJetSelector", src = cms.InputTag("ak4GenJets"), cut = cms.string('pt > 8.'), filter = cms.bool(False) ) process.load("PhysicsTools.PatAlgos.mcMatchLayer0.jetMatch_cfi") - process.patJetGenJetMatch.src = newjetID process.patJetGenJetMatch.matched = cms.InputTag("ak4GenJetsForPUid") process.patJetGenJetMatch.maxDeltaR = cms.double(0.25) process.patJetGenJetMatch.resolveAmbiguities = cms.bool(True) -else : - process.ak4JetsJEC.correctors[0] += 'Residual' - +else: + process.bTagValidationFirstStepData.doJEC = applyJEC + process.bTagValidationFirstStepData.JECsource = cms.string(corrLabel) + process.maxEvents = cms.untracked.PSet( - input = cms.untracked.int32(100) + input = cms.untracked.int32(10) ) - process.source = cms.Source("PoolSource", fileNames = cms.untracked.vstring() ) -process.EDM = cms.OutputModule("PoolOutputModule", +process.EDM = cms.OutputModule("DQMRootOutputModule", outputCommands = cms.untracked.vstring('drop *', "keep *_MEtoEDMConverter_*_*"), fileName = cms.untracked.string('MEtoEDMConverter.root') ) -process.load("DQMServices.Components.MEtoEDMConverter_cfi") -process.jetSequences = cms.Sequence(process.goodOfflinePrimaryVertices * process.JECAlgo * process.btagSequence) +if useTrigger : process.bTagHLT.HLTPaths = [triggerPath] if runOnMC: - process.dqmSeq = cms.Sequence(process.ak4GenJetsForPUid * process.patJetGenJetMatch * process.flavourSeq * process.bTagValidationFirstStep * process.MEtoEDMConverter) + process.dqmSeq = cms.Sequence(process.ak4GenJetsForPUid * process.patJetGenJetMatch * process.flavourSeq * process.bTagValidationFirstStep) else: - process.dqmSeq = cms.Sequence(bTagValidationFirstStepData * process.MEtoEDMConverter) - + process.dqmSeq = cms.Sequence(process.bTagValidationFirstStepData) + if useTrigger: process.plots = cms.Path(process.bTagHLT * process.jetSequences * process.dqmSeq) else: process.plots = cms.Path(process.jetSequences * process.dqmSeq) - + process.outpath = cms.EndPath(process.EDM) process.dqmEnv.subSystemFolder = 'BTAG' @@ -116,6 +100,16 @@ process.dqmSaver.saveAtJobEnd =cms.untracked.bool(True) process.dqmSaver.forceRunNumber = cms.untracked.int32(1) process.PoolSource.fileNames = [ - ] +#keep the logging output to a nice level +process.load("FWCore.MessageLogger.MessageLogger_cfi") +process.MessageLogger.cerr.FwkReport.reportEvery = 100 + +# load the full reconstraction configuration, to make sure we're getting all needed dependencies +process.load("Configuration.StandardSequences.MagneticField_cff") +process.load("Configuration.StandardSequences.GeometryRecoDB_cff") +process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") +process.load("Configuration.StandardSequences.Reconstruction_cff") +process.GlobalTag.globaltag = tag + diff --git a/Validation/RecoB/test/validation_customJet_cfg.py b/Validation/RecoB/test/validation_customJet_cfg.py index a82f97b28aa34..2acb865da6ce6 100644 --- a/Validation/RecoB/test/validation_customJet_cfg.py +++ b/Validation/RecoB/test/validation_customJet_cfg.py @@ -7,7 +7,7 @@ options = VarParsing.VarParsing ('analysis') options.register ('jets', - "ak4PFCHS", # default value, allowed : "ak4PF", "ak4PFCHS", add "NoJEC" to run the code with no JEC applied + "ak4PFJetsCHS", # default value, examples : "ak4PFJets", "ak4PFJetsCHS" VarParsing.VarParsing.multiplicity.singleton, VarParsing.VarParsing.varType.string, "jet collection to use") @@ -15,55 +15,41 @@ options.parseArguments() whichJets = options.jets +applyJEC = True +corrLabel = 'ak4PFCHSL1FastL2L3' +tag = 'MCRUN2_74_V7::All' useTrigger = False +triggerPath = "HLT_PFJet80_v*" runOnMC = True -tag = 'POSTLS172_V3::All' +#Flavour plots for MC: "all" = plots for all jets ; "dusg" = plots for d, u, s, dus, g independently ; not mandatory and any combinations are possible +#b, c, light (dusg), non-identified (NI), PU jets plots are always produced +flavPlots = "allbcldusg" ###prints### print "jet collcetion asked : ", whichJets -print "trigger will be used ? : ", useTrigger -print "is it MC ? : ", runOnMC +print "JEC applied?", applyJEC, ", correction:", corrLabel +print "trigger will be used ? : ", useTrigger, ", Trigger paths:", triggerPath +print "is it MC ? : ", runOnMC, ", Flavours:", flavPlots print "Global Tag : ", tag ############ process = cms.Process("validation") process.load("DQMServices.Components.DQMEnvironment_cfi") - -#keep the logging output to a nice level -process.load("FWCore.MessageLogger.MessageLogger_cfi") -process.MessageLogger.cerr.FwkReport.reportEvery = 100 - -# load the full reconstraction configuration, to make sure we're getting all needed dependencies -process.load("Configuration.StandardSequences.MagneticField_cff") -#process.load("Configuration.StandardSequences.GeometryRecoDB_cff") #old one, to use for old releases -process.load("Configuration.StandardSequences.GeometryRecoDB_cff") -#process.load('Configuration.Geometry.GeometryExtended2017Reco_cff') -#process.load('Configuration.Geometry.GeometryExtended2019Reco_cff') -#process.load('Configuration.Geometry.GeometryExtended2019_cff') -process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") -process.load("Configuration.StandardSequences.Reconstruction_cff") -process.GlobalTag.globaltag = tag - process.load("DQMServices.Core.DQM_cfg") process.load("DQMOffline.RecoB.bTagSequences_cff") -#process.bTagHLT.HLTPaths = ["HLT_PFJet80_v*"] #uncomment this line if you want to use different trigger - -newjetID=cms.InputTag("ak4PFJetsCHS") +process.load("JetMETCorrections.Configuration.JetCorrectionServices_cff") +process.load("PhysicsTools.PatAlgos.mcMatchLayer0.jetMatch_cfi") process.jetSequences = cms.Sequence(process.goodOfflinePrimaryVertices * process.btagSequence) -if "NoJEC" in whichJets and not "CHS" in whichJets : newjetID=cms.InputTag("ak4PFJets") -if not "NoJEC" in whichJets: - process.JECAlgo = cms.Sequence(process.ak4JetsJEC * process.PFJetsFilter) - process.jetSequences = cms.Sequence(process.goodOfflinePrimaryVertices * process.JECAlgo * process.btagSequence) - newjetID=cms.InputTag("PFJetsFilter") - if whichJets=="ak4PF": - process.ak4JetsJEC.src = 'ak4PFJets' - process.ak4JetsJEC.correctors = ['ak4PFL1FastL2L3'] -process.myak4JetTracksAssociatorAtVertex.jets = newjetID -process.pfImpactParameterTagInfos.jets = newjetID -process.softPFMuonsTagInfos.jets = newjetID -process.softPFElectronsTagInfos.jets = newjetID -process.AK4byRef.jets = newjetID +if not "ak4PFJetsCHS" in whichJets: + newjetID=cms.InputTag(whichJets) + process.myak4JetTracksAssociatorAtVertex.jets = newjetID + process.pfImpactParameterTagInfos.jets = newjetID + process.softPFMuonsTagInfos.jets = newjetID + process.softPFElectronsTagInfos.jets = newjetID + process.ak4JetFlavourInfos.jets = newjetID + process.AK4byRef.jets = newjetID + process.patJetGenJetMatch.src = newjetID ### print "inputTag : ", process.myak4JetTracksAssociatorAtVertex.jets @@ -71,10 +57,17 @@ if runOnMC: process.load("Validation.RecoB.bTagAnalysis_cfi") - process.bTagValidation.jetMCSrc = 'AK4byValAlgo' + process.bTagValidation.jetMCSrc = 'ak4JetFlavourInfos' + if "Calo" in whichJets: + process.bTagValidation.caloJetMCSrc = 'AK4byValAlgo' + process.bTagValidation.useOldFlavourTool = True + process.flavourSeq = cms.Sequence(process.oldFlavourSeq) process.bTagValidation.applyPtHatWeight = False - process.bTagValidation.flavPlots = "allbcl" #if contains "all" plots for all jets booked, if contains "bcl" histograms for b, c and light jets booked, if contains "dusg" all histograms booked - process.bTagHarvestMC.flavPlots = "allbcl" + process.bTagValidation.doJetID = True + process.bTagValidation.doJEC = applyJEC + process.bTagValidation.JECsource = cms.string(corrLabel) + process.bTagValidation.flavPlots = flavPlots + process.bTagHarvestMC.flavPlots = flavPlots #process.bTagValidation.ptRecJetMin = cms.double(20.) process.bTagValidation.genJetsMatched = cms.InputTag("patJetGenJetMatch") process.bTagValidation.doPUid = cms.bool(True) @@ -83,14 +76,13 @@ cut = cms.string('pt > 8.'), filter = cms.bool(False) ) - process.load("PhysicsTools.PatAlgos.mcMatchLayer0.jetMatch_cfi") - process.patJetGenJetMatch.src = newjetID process.patJetGenJetMatch.matched = cms.InputTag("ak4GenJetsForPUid") process.patJetGenJetMatch.maxDeltaR = cms.double(0.25) process.patJetGenJetMatch.resolveAmbiguities = cms.bool(True) -else : - process.ak4JetsJEC.correctors[0] += 'Residual' +else: process.load("DQMOffline.RecoB.bTagAnalysisData_cfi") + process.bTagAnalysis.doJEC = applyJEC + process.bTagAnalysis.JECsource = cms.string(corrLabel) process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(-1) @@ -99,6 +91,8 @@ fileNames = cms.untracked.vstring() ) +if useTrigger : process.bTagHLT.HLTPaths = [triggerPath] + if runOnMC: process.dqmSeq = cms.Sequence(process.ak4GenJetsForPUid * process.patJetGenJetMatch * process.flavourSeq * process.bTagValidation * process.bTagHarvestMC * process.dqmSaver) else: @@ -117,6 +111,16 @@ process.dqmSaver.saveAtJobEnd =cms.untracked.bool(True) process.dqmSaver.forceRunNumber = cms.untracked.int32(1) process.PoolSource.fileNames = [ - ] +#keep the logging output to a nice level +process.load("FWCore.MessageLogger.MessageLogger_cfi") +process.MessageLogger.cerr.FwkReport.reportEvery = 100 + +# load the full reconstraction configuration, to make sure we're getting all needed dependencies +process.load("Configuration.StandardSequences.MagneticField_cff") +process.load("Configuration.StandardSequences.GeometryRecoDB_cff") +process.load("Configuration.StandardSequences.FrontierConditions_GlobalTag_cff") +process.load("Configuration.StandardSequences.Reconstruction_cff") +process.GlobalTag.globaltag = tag + diff --git a/Validation/RecoB/test/validation_fromRECO_cfg.py b/Validation/RecoB/test/validation_fromRECO_cfg.py index ae7901bcf5cbb..8d9f7410cf44c 100644 --- a/Validation/RecoB/test/validation_fromRECO_cfg.py +++ b/Validation/RecoB/test/validation_fromRECO_cfg.py @@ -8,6 +8,9 @@ #Enter here the Global tags tag = 'POSTLS172_V3::All' +#Do you want to apply JEC? For data, no need to add 'Residual', the code is checking if events are Data or MC and add 'Residual' for Data. +applyJEC = True +corrLabel = 'ak4PFCHSL1FastL2L3' #Data or MC? runOnMC = True #Flavour plots for MC: "all" = plots for all jets ; "dusg" = plots for d, u, s, dus, g independently ; not mandatory and any combinations are possible @@ -43,20 +46,23 @@ if runOnMC: #for MC jet flavour - process.load("PhysicsTools.JetMCAlgos.CaloJetsMCFlavour_cfi") - process.AK4byRef.jets = cms.InputTag("ak4PFJetsCHS") + process.load("PhysicsTools.JetMCAlgos.HadronAndPartonSelector_cfi") + process.load("PhysicsTools.JetMCAlgos.AK4PFJetsMCFlavourInfos_cfi") + process.ak4JetFlavourInfos.jets = cms.InputTag("ak4PFJetsCHS") process.flavourSeq = cms.Sequence( - process.myPartons * - process.AK4Flavour + process.selectedHadronsAndPartons * + process.ak4JetFlavourInfos ) #Validation sequence process.load("Validation.RecoB.bTagAnalysis_cfi") - process.bTagValidation.jetMCSrc = 'AK4byValAlgo' + process.bTagValidation.jetMCSrc = 'ak4JetFlavourInfos' process.bTagValidation.tagConfig = tagConfig process.bTagHarvestMC.tagConfig = tagConfig process.bTagValidation.flavPlots = flavPlots process.bTagHarvestMC.flavPlots = flavPlots process.bTagValidation.doPUid = cms.bool(PUid) + process.bTagValidation.doJEC = applyJEC + process.bTagValidation.JECsource = cms.string(corrLabel) process.ak4GenJetsForPUid = cms.EDFilter("GenJetSelector", src = cms.InputTag("ak4GenJets"), cut = cms.string('pt > 8.'), @@ -70,6 +76,8 @@ process.load("DQMOffline.RecoB.bTagAnalysisData_cfi") process.bTagAnalysis.tagConfig = tagConfig process.bTagHarvest.tagConfig = tagConfig + process.bTagAnalysis.doJEC = applyJEC + process.bTagAnalysis.JECsource = cms.string(corrLabel) # load the full reconstraction configuration, to make sure we're getting all needed dependencies process.load("Configuration.StandardSequences.MagneticField_cff")