From d7d318d834aeef96de829be6775588a4cd5a4ecd Mon Sep 17 00:00:00 2001 From: Marco Link Date: Wed, 8 Dec 2021 16:55:03 +0100 Subject: [PATCH 1/5] add secondary vertex properties to OfflineDQM --- DQMOffline/RecoB/plugins/BuildFile.xml | 2 +- DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc | 94 +++++++++++++++++++ DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h | 50 ++++++++++ DQMOffline/RecoB/python/bTagMiniDQM_cff.py | 24 ++++- 4 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc create mode 100644 DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h diff --git a/DQMOffline/RecoB/plugins/BuildFile.xml b/DQMOffline/RecoB/plugins/BuildFile.xml index c43ed279fba3a..96c7675095bda 100644 --- a/DQMOffline/RecoB/plugins/BuildFile.xml +++ b/DQMOffline/RecoB/plugins/BuildFile.xml @@ -14,7 +14,7 @@ - + diff --git a/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc new file mode 100644 index 0000000000000..f3f6ff16f243b --- /dev/null +++ b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc @@ -0,0 +1,94 @@ +#include "DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/Framework/interface/Event.h" + +MiniAODSVAnalyzer::MiniAODSVAnalyzer(const edm::ParameterSet& pSet) + : jetToken_(consumes>(pSet.getParameter("JetTag"))), + svTagInfo_(pSet.getParameter("svTagInfo")), + jetPtMin_(pSet.getParameter("JetptMin")), + etaMax_(pSet.getParameter("EtaMax")) + +{} + +MiniAODSVAnalyzer::~MiniAODSVAnalyzer() {} + +void MiniAODSVAnalyzer::bookHistograms(DQMStore::IBooker& ibook, edm::Run const& run, edm::EventSetup const& es) { + ibook.setCurrentFolder("Btag/SV"); + + n_sv_ = ibook.book1D("n_sv", "number of SV in jet", 5, 0, 5); + n_sv_->setAxisTitle("number of SV"); + + sv_mass_ = ibook.book1D("sv_mass", "SV mass", 30, 0., 6.); + sv_mass_->setAxisTitle("SV mass"); + + sv_pt_ = ibook.book1D("sv_pt", "SV transverse momentum", 40, 0., 120.); + sv_pt_->setAxisTitle("SV pt"); + + sv_ntracks_ = ibook.book1D("sv_ntracks", "SV number of daugthers", 10, 0, 10); + sv_ntracks_->setAxisTitle("SV tracks"); + + sv_chi2norm_ = ibook.book1D("sv_chi2norm", "normalized Chi2 of vertex", 30, 0, 15); + sv_chi2norm_->setAxisTitle("normalized Chi2"); + + sv_chi2prob_ = ibook.book1D("sv_chi2prob", "Chi2 probability of vertex", 20, 0., 1.); + sv_chi2prob_->setAxisTitle("Chi2 probability"); + + sv_ptrel_ = ibook.book1D("sv_ptrel_", "SV jet transverse momentum ratio", 25, 0., 1.); + sv_ptrel_->setAxisTitle("pt(SV)/pt(jet)"); + + sv_energyratio_ = ibook.book1D("sv_energyratio", "SV jet energy ratio", 25, 0., 1.); + sv_energyratio_->setAxisTitle("E(SV)/E(jet)"); + + sv_deltaR_ = ibook.book1D("sv_deltaR", "SV jet deltaR", 40, 0., 0.4); + sv_deltaR_->setAxisTitle("deltaR(jet, SV)"); + + sv_dxy_ = ibook.book1D("sv_dxy", "2D flight distance", 40, 0., 8.); + sv_dxy_->setAxisTitle("dxy"); + + sv_dxysig_ = ibook.book1D("sv_dxysig", "2D flight distance significance", 25, 0., 250.); + sv_dxysig_->setAxisTitle("dxy significance"); + + sv_d3d_ = ibook.book1D("sv_d3d", "3D flight distance", 40, 0., 8.); + sv_d3d_->setAxisTitle("d3d"); + + sv_d3dsig_ = ibook.book1D("sv_d3dsig", "3D flight distance significance", 25, 0., 250.); + sv_d3dsig_->setAxisTitle("d3d significance"); +} + +void MiniAODSVAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) { + edm::Handle> jetCollection; + iEvent.getByToken(jetToken_, jetCollection); + + // Loop over the pat::Jets + for (std::vector::const_iterator jet = jetCollection->begin(); jet != jetCollection->end(); ++jet) { + // jet selection + if (jet->hasTagInfo(svTagInfo_) && jet->pt() > jetPtMin_ && std::abs(jet->eta()) < etaMax_) { + const reco::CandSecondaryVertexTagInfo* taginfo = + static_cast(jet->tagInfo(svTagInfo_)); + n_sv_->Fill(taginfo->nVertices()); + + // loop secondary vertices + for (unsigned int i = 0; i < taginfo->nVertices(); i++) { + const reco::VertexCompositePtrCandidate sv = taginfo->secondaryVertex(i); + + sv_mass_->Fill(sv.mass()); + sv_pt_->Fill(sv.pt()); + sv_ntracks_->Fill(sv.numberOfDaughters()); + sv_chi2norm_->Fill(sv.vertexNormalizedChi2()); + sv_chi2prob_->Fill(ChiSquaredProbability(sv.vertexChi2(), sv.vertexNdof())); + + sv_ptrel_->Fill(sv.pt() / jet->pt()); + sv_energyratio_->Fill(sv.energy() / jet->energy()); + sv_deltaR_->Fill(reco::deltaR(sv, jet->momentum())); + + sv_dxy_->Fill(taginfo->flightDistance(i, 2).value()); + sv_dxysig_->Fill(taginfo->flightDistance(i, 2).significance()); + sv_d3d_->Fill(taginfo->flightDistance(i, 3).value()); + sv_d3dsig_->Fill(taginfo->flightDistance(i, 3).significance()); + } + } + } +} + +//define this as a plug-in +DEFINE_FWK_MODULE(MiniAODSVAnalyzer); diff --git a/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h new file mode 100644 index 0000000000000..02d625c14754d --- /dev/null +++ b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h @@ -0,0 +1,50 @@ +#ifndef MiniAODSVAnalyzer_H +#define MiniAODSVAnalyzer_H + +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "DQMServices/Core/interface/DQMEDAnalyzer.h" +#include "DataFormats/PatCandidates/interface/Jet.h" +#include "DataFormats/BTauReco/interface/SecondaryVertexTagInfo.h" +#include "CommonTools/Statistics/interface/ChiSquaredProbability.h" + +/** \class MiniAODSVAnalyzer + * + * Secondary Vertex Analyzer to run on MiniAOD + * + */ + +class MiniAODSVAnalyzer : public DQMEDAnalyzer { +public: + explicit MiniAODSVAnalyzer(const edm::ParameterSet& pSet); + ~MiniAODSVAnalyzer() override; + + void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override; + +private: + void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override; + + const edm::EDGetTokenT > jetToken_; + const std::string svTagInfo_; + const double jetPtMin_; + const double etaMax_; + + MonitorElement* n_sv_; + + MonitorElement* sv_mass_; + MonitorElement* sv_pt_; + MonitorElement* sv_ntracks_; + MonitorElement* sv_chi2norm_; + MonitorElement* sv_chi2prob_; + + // relation to jet + MonitorElement* sv_ptrel_; + MonitorElement* sv_energyratio_; + MonitorElement* sv_deltaR_; + + MonitorElement* sv_dxy_; + MonitorElement* sv_dxysig_; + MonitorElement* sv_d3d_; + MonitorElement* sv_d3dsig_; +}; + +#endif diff --git a/DQMOffline/RecoB/python/bTagMiniDQM_cff.py b/DQMOffline/RecoB/python/bTagMiniDQM_cff.py index a515c4cfa707e..0cd7fd55c0a57 100644 --- a/DQMOffline/RecoB/python/bTagMiniDQM_cff.py +++ b/DQMOffline/RecoB/python/bTagMiniDQM_cff.py @@ -5,6 +5,26 @@ from DQMOffline.RecoB.bTagMiniDQMDeepFlavour import * from DQMOffline.RecoB.bTagMiniDQMDeepCSV import * +from PhysicsTools.PatAlgos.producersLayer1.jetProducer_cff import patJets + + + +# add jets with pfSecondaryVertexTagInfos +patJetsSVInfo = patJets.clone( + tagInfoSources = cms.VInputTag('pfSecondaryVertexTagInfos'), + addTagInfos = True +) +patJetsSVInfoTask = cms.Task(patJetsSVInfo) + + +bTagSVDQM = DQMEDAnalyzer('MiniAODSVAnalyzer', + cms.PSet(JetTag = cms.InputTag('patJetsSVInfo'), + svTagInfo = cms.string('pfSecondaryVertex'), + JetptMin = cms.double(30.), + EtaMax = cms.double(2.5), + ) + ) + bTagMiniDQMGlobal = cms.PSet( JetTag = cms.InputTag('slimmedJets'), @@ -52,7 +72,7 @@ def addSequences(Analyzer, Harvester, discriminators, regions, globalPSet, label -bTagMiniDQMSource = cms.Sequence() +bTagMiniDQMSource = cms.Sequence(bTagSVDQM, patJetsSVInfoTask) bTagMiniDQMHarvesting = cms.Sequence() addSequences(bTagMiniDQMSource, @@ -77,7 +97,7 @@ def addSequences(Analyzer, Harvester, discriminators, regions, globalPSet, label MClevel = 1 # produce flavour plots for b, c ,light (dusg) ) -bTagMiniValidationSource = cms.Sequence() +bTagMiniValidationSource = cms.Sequence(bTagSVDQM, patJetsSVInfoTask) bTagMiniValidationHarvesting = cms.Sequence() From f1634fb593949870cbf9e39806aa3154f8e68d7a Mon Sep 17 00:00:00 2001 From: Marco Link Date: Tue, 11 Jan 2022 14:23:34 +0100 Subject: [PATCH 2/5] some label updates in BTV OfflineDQM --- DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc index f3f6ff16f243b..57c9c7925fd18 100644 --- a/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc +++ b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc @@ -16,7 +16,7 @@ void MiniAODSVAnalyzer::bookHistograms(DQMStore::IBooker& ibook, edm::Run const& ibook.setCurrentFolder("Btag/SV"); n_sv_ = ibook.book1D("n_sv", "number of SV in jet", 5, 0, 5); - n_sv_->setAxisTitle("number of SV"); + n_sv_->setAxisTitle("number of SV in jet"); sv_mass_ = ibook.book1D("sv_mass", "SV mass", 30, 0., 6.); sv_mass_->setAxisTitle("SV mass"); @@ -25,15 +25,15 @@ void MiniAODSVAnalyzer::bookHistograms(DQMStore::IBooker& ibook, edm::Run const& sv_pt_->setAxisTitle("SV pt"); sv_ntracks_ = ibook.book1D("sv_ntracks", "SV number of daugthers", 10, 0, 10); - sv_ntracks_->setAxisTitle("SV tracks"); + sv_ntracks_->setAxisTitle("number of tracks at SV"); sv_chi2norm_ = ibook.book1D("sv_chi2norm", "normalized Chi2 of vertex", 30, 0, 15); - sv_chi2norm_->setAxisTitle("normalized Chi2"); + sv_chi2norm_->setAxisTitle("normalized Chi2 of SV"); sv_chi2prob_ = ibook.book1D("sv_chi2prob", "Chi2 probability of vertex", 20, 0., 1.); - sv_chi2prob_->setAxisTitle("Chi2 probability"); + sv_chi2prob_->setAxisTitle("Chi2 probability of SV"); - sv_ptrel_ = ibook.book1D("sv_ptrel_", "SV jet transverse momentum ratio", 25, 0., 1.); + sv_ptrel_ = ibook.book1D("sv_ptrel", "SV jet transverse momentum ratio", 25, 0., 1.); sv_ptrel_->setAxisTitle("pt(SV)/pt(jet)"); sv_energyratio_ = ibook.book1D("sv_energyratio", "SV jet energy ratio", 25, 0., 1.); @@ -69,7 +69,7 @@ void MiniAODSVAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& // loop secondary vertices for (unsigned int i = 0; i < taginfo->nVertices(); i++) { - const reco::VertexCompositePtrCandidate sv = taginfo->secondaryVertex(i); + const reco::VertexCompositePtrCandidate& sv = taginfo->secondaryVertex(i); sv_mass_->Fill(sv.mass()); sv_pt_->Fill(sv.pt()); From 1e9d2ec5937e46be51adbc877ae554fef2a3815d Mon Sep 17 00:00:00 2001 From: Marco Link Date: Fri, 28 Jan 2022 10:50:07 +0100 Subject: [PATCH 3/5] add jet cuts to discriminators in BTV OfflineDQM --- DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc | 6 +-- DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h | 2 +- .../RecoB/plugins/MiniAODTaggerAnalyzer.cc | 45 ++++++++++--------- DQMOffline/RecoB/python/bTagMiniDQM_cff.py | 4 +- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc index 57c9c7925fd18..ef06b3ef64615 100644 --- a/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc +++ b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.cc @@ -5,8 +5,8 @@ MiniAODSVAnalyzer::MiniAODSVAnalyzer(const edm::ParameterSet& pSet) : jetToken_(consumes>(pSet.getParameter("JetTag"))), svTagInfo_(pSet.getParameter("svTagInfo")), - jetPtMin_(pSet.getParameter("JetptMin")), - etaMax_(pSet.getParameter("EtaMax")) + ptMin_(pSet.getParameter("ptMin")), + etaMax_(pSet.getParameter("etaMax")) {} @@ -62,7 +62,7 @@ void MiniAODSVAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& // Loop over the pat::Jets for (std::vector::const_iterator jet = jetCollection->begin(); jet != jetCollection->end(); ++jet) { // jet selection - if (jet->hasTagInfo(svTagInfo_) && jet->pt() > jetPtMin_ && std::abs(jet->eta()) < etaMax_) { + if (jet->hasTagInfo(svTagInfo_) && jet->pt() > ptMin_ && std::abs(jet->eta()) < etaMax_) { const reco::CandSecondaryVertexTagInfo* taginfo = static_cast(jet->tagInfo(svTagInfo_)); n_sv_->Fill(taginfo->nVertices()); diff --git a/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h index 02d625c14754d..5fa26dd361a8e 100644 --- a/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h +++ b/DQMOffline/RecoB/plugins/MiniAODSVAnalyzer.h @@ -25,7 +25,7 @@ class MiniAODSVAnalyzer : public DQMEDAnalyzer { const edm::EDGetTokenT > jetToken_; const std::string svTagInfo_; - const double jetPtMin_; + const double ptMin_; const double etaMax_; MonitorElement* n_sv_; diff --git a/DQMOffline/RecoB/plugins/MiniAODTaggerAnalyzer.cc b/DQMOffline/RecoB/plugins/MiniAODTaggerAnalyzer.cc index b9e28b7ba2006..377cdd94519cd 100644 --- a/DQMOffline/RecoB/plugins/MiniAODTaggerAnalyzer.cc +++ b/DQMOffline/RecoB/plugins/MiniAODTaggerAnalyzer.cc @@ -44,36 +44,39 @@ void MiniAODTaggerAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSe // Loop over the pat::Jets for (std::vector::const_iterator jet = jetCollection->begin(); jet != jetCollection->end(); ++jet) { - // fill numerator - float numerator = 0; - for (const auto& discrLabel : discrNumerator_) { - numerator += jet->bDiscriminator(discrLabel); - } + // apply basic jet cuts + if (jet->pt() > ptMin_ && std::abs(jet->eta()) < etaMax_) { + // fill numerator + float numerator = 0; + for (const auto& discrLabel : discrNumerator_) { + numerator += jet->bDiscriminator(discrLabel); + } - // fill denominator - float denominator; - if (discrDenominator_.empty()) { - denominator = 1; // no division performed - } else { - denominator = 0; + // fill denominator + float denominator; + if (discrDenominator_.empty()) { + denominator = 1; // no division performed + } else { + denominator = 0; - for (const auto& discrLabel : discrDenominator_) { - denominator += jet->bDiscriminator(discrLabel); + for (const auto& discrLabel : discrDenominator_) { + denominator += jet->bDiscriminator(discrLabel); + } } - } - const float jec = 1.; // JEC not implemented! + const float jec = 1.; // JEC not implemented! - // only add to histograms when discriminator values are valid - if (numerator >= 0 && denominator > 0) { - reco::Jet recoJet = *jet; - if (jetTagPlotter_->etaPtBin().inBin(recoJet, jec)) { - jetTagPlotter_->analyzeTag(recoJet, jec, numerator / denominator, jet->partonFlavour()); + // only add to histograms when discriminator values are valid + if (numerator >= 0 && denominator > 0) { + reco::Jet recoJet = *jet; + if (jetTagPlotter_->etaPtBin().inBin(recoJet, jec)) { + jetTagPlotter_->analyzeTag(recoJet, jec, numerator / denominator, jet->partonFlavour()); + } } } } - // fill JetMultiplicity + // fill JetMultiplicity (once per event) if (mclevel_ > 0) { jetTagPlotter_->analyzeTag(1.); } else { diff --git a/DQMOffline/RecoB/python/bTagMiniDQM_cff.py b/DQMOffline/RecoB/python/bTagMiniDQM_cff.py index 0cd7fd55c0a57..0fbe4b1aa42da 100644 --- a/DQMOffline/RecoB/python/bTagMiniDQM_cff.py +++ b/DQMOffline/RecoB/python/bTagMiniDQM_cff.py @@ -20,8 +20,8 @@ bTagSVDQM = DQMEDAnalyzer('MiniAODSVAnalyzer', cms.PSet(JetTag = cms.InputTag('patJetsSVInfo'), svTagInfo = cms.string('pfSecondaryVertex'), - JetptMin = cms.double(30.), - EtaMax = cms.double(2.5), + ptMin = cms.double(30.), + etaMax = cms.double(2.5), ) ) From c2a0f5a54cf267b5ac543d4cd7fa0772b7bb424f Mon Sep 17 00:00:00 2001 From: Marco Link Date: Wed, 2 Feb 2022 16:06:40 +0100 Subject: [PATCH 4/5] fix handling of negative parton flavour --- DQMOffline/RecoB/interface/FlavourHistorgrams.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DQMOffline/RecoB/interface/FlavourHistorgrams.h b/DQMOffline/RecoB/interface/FlavourHistorgrams.h index 4ad9cf42d7f77..edad2e0c2b2fe 100644 --- a/DQMOffline/RecoB/interface/FlavourHistorgrams.h +++ b/DQMOffline/RecoB/interface/FlavourHistorgrams.h @@ -640,7 +640,7 @@ void FlavourHistograms::fillVariable(const int& flavour, const T& var, const if (!mcPlots_ || (theBaseNameDescription == "Jet Multiplicity" && flavour == -1)) return; - switch (flavour) { + switch (std::abs(flavour)) { case 1: if (mcPlots_ > 2) { theHisto_d->Fill(var, w); From 188ec488d7b46f0bb47a979c6fb9dbbb37a47a19 Mon Sep 17 00:00:00 2001 From: Marco Link Date: Wed, 9 Mar 2022 13:10:51 +0100 Subject: [PATCH 5/5] disable secondary vertex OfflineDQM for some workflows --- DQMOffline/RecoB/python/bTagMiniDQM_cff.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/DQMOffline/RecoB/python/bTagMiniDQM_cff.py b/DQMOffline/RecoB/python/bTagMiniDQM_cff.py index 0fbe4b1aa42da..0dcb2acc32b02 100644 --- a/DQMOffline/RecoB/python/bTagMiniDQM_cff.py +++ b/DQMOffline/RecoB/python/bTagMiniDQM_cff.py @@ -114,3 +114,13 @@ def addSequences(Analyzer, Harvester, discriminators, regions, globalPSet, label regions={'Global': Etaregions['Global']}, # only for global Eta range globalPSet=bTagMiniValidationGlobal, label='bTagDeepCSVValidation') + + + +from Configuration.ProcessModifiers.pp_on_AA_cff import pp_on_AA +from Configuration.ProcessModifiers.miniAOD_skip_trackExtras_cff import miniAOD_skip_trackExtras +from Configuration.Eras.Modifier_run2_miniAOD_94XFall17_cff import run2_miniAOD_94XFall17 + +_mAOD = (pp_on_AA | miniAOD_skip_trackExtras | run2_miniAOD_94XFall17) +_mAOD.toReplaceWith(bTagMiniDQMSource, bTagMiniDQMSource.copyAndExclude([bTagSVDQM, patJetsSVInfoTask])) +_mAOD.toReplaceWith(bTagMiniValidationSource, bTagMiniValidationSource.copyAndExclude([bTagSVDQM, patJetsSVInfoTask]))