Skip to content

Commit 0168294

Browse files
author
Javier Garcia
committed
Same code, working with release 15_0_0_pre2
1 parent e40866a commit 0168294

9 files changed

+881
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<use name="FWCore/Framework"/>
2+
<use name="FWCore/PluginManager"/>
3+
<use name="FWCore/ParameterSet"/>
4+
<use name="DQMServices/Core"/>
5+
<use name="CLHEP"/>
6+
<use name="DataFormats/PatCandidates"/>
7+
<use name="DataFormats/Scouting"/>
8+
<use name="L1Trigger/L1TGlobal"/>
9+
<use name="DataFormats/L1TGlobal"/>
10+
<use name="FWCore/Utilities"/>
11+
<use name="TrackingTools/Records"/>
12+
<use name="HLTrigger/HLTcore"/>
13+
<use name="DataFormats/HLTReco"/>
14+
<flags EDM_PLUGIN="1"/>

HLTriggerOffline/Scouting/plugins/ScoutingMuonTagProbeAnalyzer.cc

Lines changed: 262 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
/*
2+
Class definition for ScoutingMuonTagProbeAnalyzer.cc. Declares each
3+
histogram (MonitorElement), numerator and denominator histogram structure
4+
(kProbeKinematicMuonHistos), and any functions used in
5+
ScoutingMuonTagProbeAnalyzer.cc. Also declares the token to read the
6+
scouting muon and scouting vertex collections.
7+
8+
Author: Javier Garcia de Castro, email:[email protected]
9+
*/
10+
11+
12+
//Files to include
13+
#ifndef DQMOffline_Scouting_ScoutingMuonTagProbeAnalyzer_h
14+
#define DQMOffline_Scouting_ScoutingMuonTagProbeAnalyzer_h
15+
#include <string>
16+
#include <vector>
17+
#include <iostream>
18+
#include "DQMServices/Core/interface/DQMGlobalEDAnalyzer.h"
19+
#include "DataFormats/PatCandidates/interface/Muon.h"
20+
#include "DataFormats/Scouting/interface/Run3ScoutingMuon.h"
21+
#include "DataFormats/Scouting/interface/Run3ScoutingVertex.h"
22+
#include "FWCore/Framework/interface/Event.h"
23+
#include "FWCore/Framework/interface/Frameworkfwd.h"
24+
#include "FWCore/Framework/interface/MakerMacros.h"
25+
#include "FWCore/ParameterSet/interface/ParameterSet.h"
26+
27+
struct kProbeKinematicMuonHistos{
28+
dqm::reco::MonitorElement* hPt;
29+
dqm::reco::MonitorElement* hEta;
30+
dqm::reco::MonitorElement* hPhi;
31+
dqm::reco::MonitorElement* hInvMass;
32+
dqm::reco::MonitorElement* hNormChisq;
33+
dqm::reco::MonitorElement* hTrk_dxy;
34+
dqm::reco::MonitorElement* hTrk_dz;
35+
dqm::reco::MonitorElement* hnPixel;
36+
dqm::reco::MonitorElement* hnTracker;
37+
dqm::reco::MonitorElement* htrk_qoverp;
38+
dqm::reco::MonitorElement* htype;
39+
dqm::reco::MonitorElement* hcharge;
40+
dqm::reco::MonitorElement* hecalIso;
41+
dqm::reco::MonitorElement* hhcalIso;
42+
dqm::reco::MonitorElement* htrackIso;
43+
dqm::reco::MonitorElement* hnValidStandAloneMuonHits;
44+
dqm::reco::MonitorElement* hnStandAloneMuonMatchedStations;
45+
dqm::reco::MonitorElement* hnValidRecoMuonHits;
46+
dqm::reco::MonitorElement* hnRecoMuonChambers;
47+
dqm::reco::MonitorElement* hnRecoMuonChambersCSCorDT;
48+
dqm::reco::MonitorElement* hnRecoMuonMatches;
49+
dqm::reco::MonitorElement* hnRecoMuonMatchedStations;
50+
dqm::reco::MonitorElement* hnRecoMuonExpectedMatchedStations;
51+
dqm::reco::MonitorElement* hnValidPixelHits;
52+
dqm::reco::MonitorElement* hnValidStripHits;
53+
dqm::reco::MonitorElement* hnPixelLayersWithMeasurement;
54+
dqm::reco::MonitorElement* hnTrackerLayersWithMeasurement;
55+
dqm::reco::MonitorElement* htrk_chi2;
56+
dqm::reco::MonitorElement* htrk_ndof;
57+
dqm::reco::MonitorElement* htrk_lambda;
58+
dqm::reco::MonitorElement* htrk_pt;
59+
dqm::reco::MonitorElement* htrk_eta;
60+
dqm::reco::MonitorElement* htrk_dxyError;
61+
dqm::reco::MonitorElement* htrk_dzError;
62+
dqm::reco::MonitorElement* htrk_qoverpError;
63+
dqm::reco::MonitorElement* htrk_lambdaError;
64+
dqm::reco::MonitorElement* htrk_phiError;
65+
dqm::reco::MonitorElement* htrk_dsz;
66+
dqm::reco::MonitorElement* htrk_dszError;
67+
dqm::reco::MonitorElement* htrk_vx;
68+
dqm::reco::MonitorElement* htrk_vy;
69+
dqm::reco::MonitorElement* htrk_vz;
70+
dqm::reco::MonitorElement* hLxy;
71+
dqm::reco::MonitorElement* hXError;
72+
dqm::reco::MonitorElement* hYError;
73+
dqm::reco::MonitorElement* hChi2;
74+
dqm::reco::MonitorElement* hZ;
75+
dqm::reco::MonitorElement* hx;
76+
dqm::reco::MonitorElement* hy;
77+
dqm::reco::MonitorElement* hZerror;
78+
dqm::reco::MonitorElement* htracksSize;
79+
};
80+
81+
struct kTagProbeMuonHistos {
82+
kProbeKinematicMuonHistos resonanceJ_numerator;
83+
kProbeKinematicMuonHistos resonanceJ_denominator;
84+
};
85+
86+
class ScoutingMuonTagProbeAnalyzer: public DQMGlobalEDAnalyzer<kTagProbeMuonHistos> {
87+
public:
88+
explicit ScoutingMuonTagProbeAnalyzer(const edm::ParameterSet& conf);
89+
~ScoutingMuonTagProbeAnalyzer() override;
90+
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
91+
92+
private:
93+
void dqmAnalyze(const edm::Event & e, const edm::EventSetup & c, kTagProbeMuonHistos const&) const override;
94+
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &, kTagProbeMuonHistos &) const override;
95+
void bookHistograms_resonance(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &, kProbeKinematicMuonHistos &, const std::string &) const;
96+
void fillHistograms_resonance(const kProbeKinematicMuonHistos histos, const Run3ScoutingMuon mu, const Run3ScoutingVertex vertex, const float inv_mass, const float lxy) const;
97+
bool scoutingMuonID(const Run3ScoutingMuon mu) const;
98+
99+
std::string outputInternalPath_;
100+
edm::EDGetTokenT<std::vector<Run3ScoutingMuon>> scoutingMuonCollection_;
101+
edm::EDGetTokenT<std::vector<Run3ScoutingVertex>> scoutingVtxCollection_;
102+
Bool_t runWithoutVtx_;
103+
};
104+
#endif
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
/*
2+
Scouting Muon DQM for L1 seeds. This code does the following:
3+
1) Reads pat muon and scouting muon collections, and writes an array of scouting muon
4+
triggers (selected in python/ScoutingMuonTriggerAnalyzer_cfi.py)
5+
2) For each event, if the event passes a logical OR of HLTriggers it is added to
6+
the denominator, and if it passes any of the scouting muon triggers it is
7+
added to the numerator of that specific trigger.
8+
3) Fills histograms for both leading and subleading muon in the event.
9+
Author: Javier Garcia de Castro, email:[email protected]
10+
*/
11+
12+
//Files to include
13+
#include "ScoutingMuonTriggerAnalyzer.h"
14+
#include "FWCore/MessageLogger/interface/MessageLogger.h"
15+
#include <iostream>
16+
#include <cmath>
17+
18+
//Read the collections and triggers
19+
ScoutingMuonTriggerAnalyzer::ScoutingMuonTriggerAnalyzer(const edm::ParameterSet& iConfig) :
20+
outputInternalPath_(iConfig.getParameter<std::string>("OutputInternalPath")),
21+
triggerCache_(triggerExpression::Data(iConfig.getParameterSet("triggerConfiguration"), consumesCollector())),
22+
vtriggerSelection_(iConfig.getParameter<vector<string>>("triggerSelection"))
23+
{
24+
scoutingMuonCollection_ = consumes<std::vector<Run3ScoutingMuon>>(iConfig.getParameter<edm::InputTag>("ScoutingMuonCollection"));
25+
vtriggerSelector_.reserve(vtriggerSelection_.size());
26+
for (auto const& vt:vtriggerSelection_) vtriggerSelector_.push_back(triggerExpression::parse(vt));
27+
algToken_ = consumes<BXVector<GlobalAlgBlk>>(iConfig.getParameter<edm::InputTag>("AlgInputTag"));
28+
l1GtUtils_ = std::make_shared<l1t::L1TGlobalUtil>(iConfig, consumesCollector(), l1t::UseEventSetupIn::RunAndEvent);
29+
l1Seeds_ = iConfig.getParameter<std::vector<std::string> >("l1Seeds");
30+
for (unsigned int i = 0; i < l1Seeds_.size(); i++){
31+
const auto& l1seed(l1Seeds_.at(i));
32+
l1Names[i] = TString(l1seed);
33+
}
34+
}
35+
36+
ScoutingMuonTriggerAnalyzer::~ScoutingMuonTriggerAnalyzer(){
37+
}
38+
39+
//Core of the implementation
40+
void ScoutingMuonTriggerAnalyzer::analyze(edm::Event const& iEvent, edm::EventSetup const& iSetup) {
41+
edm::Handle<std::vector<Run3ScoutingMuon> > sctMuons;
42+
iEvent.getByToken(scoutingMuonCollection_, sctMuons);
43+
if (sctMuons.failedToGet()) {
44+
edm::LogWarning("ScoutingMonitoring")
45+
<< "Run3ScoutingMuon collection not found.";
46+
return;
47+
}
48+
49+
//Check whether events pass any of the HLTriggers to add to the denominator
50+
bool passHLTDenominator = false;
51+
if (triggerCache_.setEvent(iEvent, iSetup)){
52+
for (unsigned int i = 0; i < vtriggerSelector_.size(); i++){
53+
auto& vts(vtriggerSelector_.at(i));
54+
bool result = false;
55+
if (vts){
56+
if (triggerCache_.configurationUpdated()) vts->init(triggerCache_);
57+
result = (*vts)(triggerCache_);
58+
}
59+
if (result)
60+
passHLTDenominator = true;
61+
}
62+
}
63+
64+
//Find leading and subleading muon from the event
65+
if (sctMuons->size() > 0) {
66+
Run3ScoutingMuon leading_mu;
67+
Run3ScoutingMuon subleading_mu;
68+
69+
std::vector<Run3ScoutingMuon> sorted_mu;
70+
for (const auto& muon : *sctMuons) {
71+
sorted_mu.push_back(muon);
72+
}
73+
std::sort(std::begin(sorted_mu),std::end(sorted_mu), [&](Run3ScoutingMuon mu1, Run3ScoutingMuon mu2){return mu1.pt() > mu2.pt();});
74+
leading_mu = sorted_mu.at(0);
75+
if (sorted_mu.size() > 1)
76+
subleading_mu = sorted_mu.at(1);
77+
78+
l1GtUtils_->retrieveL1(iEvent, iSetup, algToken_);
79+
80+
math::PtEtaPhiMLorentzVector mu1(leading_mu.pt(), leading_mu.eta(), leading_mu.phi(), leading_mu.m());
81+
math::PtEtaPhiMLorentzVector mu2(subleading_mu.pt(), subleading_mu.eta(), subleading_mu.phi(), subleading_mu.m());
82+
float invMass = (mu1 + mu2).mass();
83+
//If event passed and of the HLTs, add to denominator
84+
if (passHLTDenominator){
85+
h_invMass_denominator->Fill(invMass);
86+
h_pt1_l1_denominator->Fill(leading_mu.pt());
87+
h_eta1_l1_denominator->Fill(leading_mu.eta());
88+
h_phi1_l1_denominator->Fill(leading_mu.phi());
89+
h_dxy1_l1_denominator->Fill(leading_mu.trk_dxy());
90+
if (sorted_mu.size() > 1){
91+
h_pt2_l1_denominator->Fill(subleading_mu.pt());
92+
h_eta2_l1_denominator->Fill(subleading_mu.eta());
93+
h_phi2_l1_denominator->Fill(subleading_mu.phi());
94+
h_dxy2_l1_denominator->Fill(subleading_mu.trk_dxy());
95+
}
96+
//For each L1 seed, if the event passes the trigger plot distributions in the numerator
97+
for (unsigned int i = 0; i < l1Seeds_.size(); i++){
98+
const auto& l1seed(l1Seeds_.at(i));
99+
bool l1htbit = 0;
100+
double prescale = -1;
101+
l1GtUtils_->getFinalDecisionByName(l1seed, l1htbit);
102+
l1GtUtils_->getPrescaleByName(l1seed, prescale);
103+
l1Result[i] = l1htbit;
104+
if (l1Result[i] == 1) {
105+
h_invMass_numerators[i]->Fill(invMass);
106+
h_pt1_l1_numerators[i]->Fill(leading_mu.pt());
107+
h_eta1_l1_numerators[i]->Fill(leading_mu.eta());
108+
h_phi1_l1_numerators[i]->Fill(leading_mu.phi());
109+
h_dxy1_l1_numerators[i]->Fill(leading_mu.trk_dxy());
110+
if (sorted_mu.size() > 1){
111+
h_pt2_l1_numerators[i]->Fill(subleading_mu.pt());
112+
h_eta2_l1_numerators[i]->Fill(subleading_mu.eta());
113+
h_phi2_l1_numerators[i]->Fill(subleading_mu.phi());
114+
h_dxy2_l1_numerators[i]->Fill(subleading_mu.trk_dxy());
115+
}
116+
}
117+
}
118+
}
119+
}
120+
}
121+
122+
//Histogram axes labels, bin number and range
123+
void ScoutingMuonTriggerAnalyzer::bookHistograms(DQMStore::IBooker& ibook, edm::Run const& run, edm::EventSetup const& iSetup) {
124+
ibook.setCurrentFolder(outputInternalPath_);
125+
h_invMass_denominator = ibook.book1D("h_invMass_denominator", ";Invariant Mass (GeV); Muons", 100, 0.0, 20.0);
126+
h_pt1_l1_denominator = ibook.book1D("h_pt1_denominator", ";Leading muon pt (GeV); Muons", 100, 0, 50.0);
127+
h_eta1_l1_denominator = ibook.book1D("h_eta1_denominator", ";Leading muon eta; Muons", 100, -5.0, 5.0);
128+
h_phi1_l1_denominator = ibook.book1D("h_phi1_denominator", ";Leading muon phi; Muons", 100, -3.3, 3.3);
129+
h_dxy1_l1_denominator = ibook.book1D("h_dxy1_denominator", ";Leading muon dxy; Muons", 100, 0, 5.0);
130+
h_pt2_l1_denominator = ibook.book1D("h_pt2_denominator", ";Subleading muon pt (GeV); Muons", 100, 0, 50.0);
131+
h_eta2_l1_denominator = ibook.book1D("h_eta2_denominator", ";Subleading muon eta; Muons", 100, -5.0, 5.0);
132+
h_phi2_l1_denominator = ibook.book1D("h_phi2_denominator", ";Subleading muon phi; Muons", 100, -3.3, 3.3);
133+
h_dxy2_l1_denominator = ibook.book1D("h_dxy2_denominator", ";Subleaing muon dxy; Muons", 100, 0, 5.0);
134+
135+
for (unsigned int i = 0; i < l1Seeds_.size(); i++) {
136+
const auto& l1seed = l1Seeds_.at(i);
137+
h_invMass_numerators.push_back(ibook.book1D(Form("h_invMass_numerator_%s", l1seed.c_str()), ";Invariant mass (GeV); Muons", 100, 0.0, 20.0));
138+
h_pt1_l1_numerators.push_back(ibook.book1D(Form("h_pt1_numerator_%s", l1seed.c_str()), ";Leading muon pt (GeV); Muons", 100, 0, 50.0));
139+
h_eta1_l1_numerators.push_back(ibook.book1D(Form("h_eta1_numerator_%s", l1seed.c_str()),";Leading muon eta; Muons", 100, -5.0, 5.0));
140+
h_phi1_l1_numerators.push_back(ibook.book1D(Form("h_phi1_numerator_%s", l1seed.c_str()), ";Leading muon phi; Muons", 100, 3.3, -3.3));
141+
h_dxy1_l1_numerators.push_back(ibook.book1D(Form("h_dxy1_numerator_%s", l1seed.c_str()), ";Leading muon dxy; Muons", 100, 0, 5.0));
142+
h_pt2_l1_numerators.push_back(ibook.book1D(Form("h_pt2_numerator_%s", l1seed.c_str()), ";Subleading muon pt (GeV); Muons", 100, 0, 50.0));
143+
h_eta2_l1_numerators.push_back(ibook.book1D(Form("h_eta2_numerator_%s", l1seed.c_str()),";Subleading muon eta; Muons", 100, -5.0, 5.0));
144+
h_phi2_l1_numerators.push_back(ibook.book1D(Form("h_phi2_numerator_%s", l1seed.c_str()), ";Subleading muon phi; Muons", 100, 3.3, -3.3));
145+
h_dxy2_l1_numerators.push_back(ibook.book1D(Form("h_dxy2_numerator_%s", l1seed.c_str()), ";Subleading muon dxy; Muons", 100, 0, 5.0));
146+
}
147+
}
148+
149+
//Input tags to read collections and L1 seeds
150+
void ScoutingMuonTriggerAnalyzer::fillDescriptions(
151+
edm::ConfigurationDescriptions& descriptions) {
152+
edm::ParameterSetDescription desc;
153+
desc.add<std::string>("OutputInternalPath", "MY_FOLDER");
154+
desc.add<edm::InputTag>("AlgInputTag", edm::InputTag("gtStage2Digis"));
155+
desc.add<edm::InputTag>("l1tAlgBlkInputTag", edm::InputTag("gtStage2Digis"));
156+
desc.add<edm::InputTag>("l1tExtBlkInputTag", edm::InputTag("gtStage2Digis"));
157+
desc.setUnknown();
158+
descriptions.addDefault(desc);
159+
descriptions.add("ScoutingMuonTriggerAnalyzer", desc);
160+
}
161+
162+
DEFINE_FWK_MODULE(ScoutingMuonTriggerAnalyzer);
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/*
2+
Class declaration for ScoutingMuonTriggerAnalyzer.cc. Declares each
3+
histogram (MonitorElement), and any functions used in
4+
ScoutingMuonTriggerAnalyzer.cc. Also declares the token to read the
5+
scouting muon collection and to access trigers selected in
6+
(selected in python/ScoutingMuonTriggerAnalyzer_cfi.py)
7+
8+
Author: Javier Garcia de Castro, email:[email protected]
9+
*/
10+
11+
//Files to include
12+
#ifndef DQMOffline_Scouting_ScoutingMuonTriggerAnalyzer_h
13+
#define DQMOffline_Scouting_ScoutingMuonTriggerAnalyzer_h
14+
#include <string>
15+
#include <vector>
16+
#include "DQMServices/Core/interface/DQMGlobalEDAnalyzer.h"
17+
#include "DQMServices/Core/interface/DQMEDAnalyzer.h"
18+
#include "DataFormats/PatCandidates/interface/Muon.h"
19+
#include "DataFormats/Scouting/interface/Run3ScoutingMuon.h"
20+
#include "DataFormats/Scouting/interface/Run3ScoutingVertex.h"
21+
#include "FWCore/Framework/interface/Event.h"
22+
#include "FWCore/Framework/interface/Frameworkfwd.h"
23+
#include "FWCore/Framework/interface/MakerMacros.h"
24+
#include "FWCore/ParameterSet/interface/ParameterSet.h"
25+
#include "L1Trigger/L1TGlobal/interface/L1TGlobalUtil.h"
26+
#include "DataFormats/L1TGlobal/interface/GlobalAlgBlk.h"
27+
#include "FWCore/Framework/interface/ConsumesCollector.h"
28+
#include "FWCore/Common/interface/TriggerNames.h"
29+
#include "DataFormats/Common/interface/TriggerResults.h"
30+
#include "DataFormats/HLTReco/interface/TriggerEvent.h"
31+
#include "HLTrigger/HLTcore/interface/TriggerExpressionData.h"
32+
#include "HLTrigger/HLTcore/interface/TriggerExpressionEvaluator.h"
33+
#include "HLTrigger/HLTcore/interface/TriggerExpressionParser.h"
34+
35+
//Classes to be declared
36+
class ScoutingMuonTriggerAnalyzer: public DQMEDAnalyzer {
37+
public:
38+
explicit ScoutingMuonTriggerAnalyzer(const edm::ParameterSet& conf);
39+
~ScoutingMuonTriggerAnalyzer() override;
40+
static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
41+
42+
private:
43+
void analyze(const edm::Event & e, const edm::EventSetup & c) override;
44+
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override;
45+
std::string outputInternalPath_;
46+
edm::EDGetTokenT<std::vector<pat::Muon>> muonCollection_;
47+
edm::EDGetTokenT<std::vector<Run3ScoutingMuon>> scoutingMuonCollection_;
48+
triggerExpression::Data triggerCache_;
49+
std::vector<triggerExpression::Evaluator*> vtriggerSelector_;
50+
std::vector<std::string> vtriggerSelection_;
51+
edm::EDGetToken algToken_;
52+
std::shared_ptr<l1t::L1TGlobalUtil> l1GtUtils_;
53+
std::vector<std::string> l1Seeds_;
54+
TString l1Names[100] = {""};
55+
Bool_t l1Result[100] = {false};
56+
57+
//Histogram declaration
58+
//DENOMINATORS:
59+
dqm::reco::MonitorElement* h_invMass_denominator;
60+
dqm::reco::MonitorElement* h_pt1_l1_denominator;
61+
dqm::reco::MonitorElement* h_eta1_l1_denominator;
62+
dqm::reco::MonitorElement* h_phi1_l1_denominator;
63+
dqm::reco::MonitorElement* h_dxy1_l1_denominator;
64+
dqm::reco::MonitorElement* h_pt2_l1_denominator;
65+
dqm::reco::MonitorElement* h_eta2_l1_denominator;
66+
dqm::reco::MonitorElement* h_phi2_l1_denominator;
67+
dqm::reco::MonitorElement* h_dxy2_l1_denominator;
68+
69+
//NUMERATORS:
70+
std::vector<dqm::reco::MonitorElement*> h_invMass_numerators;
71+
std::vector<dqm::reco::MonitorElement*> h_pt1_l1_numerators;
72+
std::vector<dqm::reco::MonitorElement*> h_eta1_l1_numerators;
73+
std::vector<dqm::reco::MonitorElement*> h_phi1_l1_numerators;
74+
std::vector<dqm::reco::MonitorElement*> h_dxy1_l1_numerators;
75+
std::vector<dqm::reco::MonitorElement*> h_pt2_l1_numerators;
76+
std::vector<dqm::reco::MonitorElement*> h_eta2_l1_numerators;
77+
std::vector<dqm::reco::MonitorElement*> h_phi2_l1_numerators;
78+
std::vector<dqm::reco::MonitorElement*> h_dxy2_l1_numerators;
79+
};
80+
81+
#endif

0 commit comments

Comments
 (0)