CMS 3D CMS Logo

L1TTauOffline.cc
Go to the documentation of this file.
1 
10 
14 
15 #include "TLorentzVector.h"
16 
17 #include <iomanip>
18 #include <cstdio>
19 #include <string>
20 #include <sstream>
21 #include <cmath>
22 #include <algorithm>
23 
24 using namespace reco;
25 using namespace trigger;
26 using namespace edm;
27 using namespace std;
28 
29 TauL1TPair::TauL1TPair(const TauL1TPair& tauL1tPair) {
30  m_tau = tauL1tPair.m_tau;
31  m_regTau = tauL1tPair.m_regTau;
32 
33  m_eta = tauL1tPair.m_eta;
34  m_phi_bar = tauL1tPair.m_phi_bar;
35  m_phi_end = tauL1tPair.m_phi_end;
36 }
37 
38 double TauL1TPair::dR() { return deltaR(m_regTau->eta(), m_regTau->phi(), eta(), phi()); }
39 const std::map<std::string, unsigned int> L1TTauOffline::PlotConfigNames = {
40  {"nVertex", PlotConfig::nVertex}, {"ETvsET", PlotConfig::ETvsET}, {"PHIvsPHI", PlotConfig::PHIvsPHI}};
41 
42 //
43 // -------------------------------------- Constructor --------------------------------------------
44 //
46  : theTauCollection_(consumes<reco::PFTauCollection>(ps.getUntrackedParameter<edm::InputTag>("tauInputTag"))),
47  AntiMuInputTag_(
48  consumes<reco::TauDiscriminatorContainer>(ps.getUntrackedParameter<edm::InputTag>("antiMuInputTag"))),
49  AntiMuWP_(ps.getUntrackedParameter<std::string>("antiMuWP")),
50  AntiEleInputTag_(
51  consumes<reco::TauDiscriminatorContainer>(ps.getUntrackedParameter<edm::InputTag>("antiEleInputTag"))),
52  AntiEleWP_(ps.getUntrackedParameter<std::string>("antiEleWP")),
53  DecayModeFindingInputTag_(
54  consumes<reco::PFTauDiscriminator>(ps.getUntrackedParameter<edm::InputTag>("decayModeFindingInputTag"))),
55  comb3TInputTag_(
56  consumes<reco::TauDiscriminatorContainer>(ps.getUntrackedParameter<edm::InputTag>("comb3TInputTag"))),
57  comb3TWP_(ps.getUntrackedParameter<std::string>("comb3TWP")),
58  MuonInputTag_(consumes<reco::MuonCollection>(ps.getUntrackedParameter<edm::InputTag>("muonInputTag"))),
59  MetInputTag_(consumes<reco::PFMETCollection>(ps.getUntrackedParameter<edm::InputTag>("metInputTag"))),
60  VtxInputTag_(consumes<reco::VertexCollection>(ps.getUntrackedParameter<edm::InputTag>("vtxInputTag"))),
61  BsInputTag_(consumes<reco::BeamSpot>(ps.getUntrackedParameter<edm::InputTag>("bsInputTag"))),
62  triggerEvent_(consumes<trigger::TriggerEvent>(ps.getUntrackedParameter<edm::InputTag>("trigInputTag"))),
63  trigProcess_(ps.getUntrackedParameter<string>("trigProcess")),
64  triggerResults_(consumes<edm::TriggerResults>(ps.getUntrackedParameter<edm::InputTag>("trigProcess_token"))),
65  triggerPath_(ps.getUntrackedParameter<vector<std::string>>("triggerNames")),
66  histFolder_(ps.getParameter<std::string>("histFolder")),
67  efficiencyFolder_(histFolder_ + "/efficiency_raw"),
68  stage2CaloLayer2TauToken_(consumes<l1t::TauBxCollection>(ps.getUntrackedParameter<edm::InputTag>("l1tInputTag"))),
69  tauEfficiencyThresholds_(ps.getParameter<std::vector<int>>("tauEfficiencyThresholds")),
70  tauEfficiencyBins_(ps.getParameter<std::vector<double>>("tauEfficiencyBins")),
71  histDefinitions_(dqmoffline::l1t::readHistDefinitions(ps.getParameterSet("histDefinitions"), PlotConfigNames)),
72  m_TightMuons(),
73  m_ProbeTaus(),
74  m_TauL1tPairs(),
75  m_RecoTaus(),
76  m_L1tTaus(),
77  m_RecoRecoTaus(),
78  m_L1tL1tTaus(),
79  m_L1tPtCuts(),
80  m_MaxTauEta(99999),
81  m_MaxL1tTauDR(99999),
82  m_MaxHltTauDR(99999),
83  m_trigIndices(),
84  h_nVertex_(),
85  h_tagAndProbeMass_(),
86  h_L1TauETvsTauET_EB_(),
87  h_L1TauETvsTauET_EE_(),
88  h_L1TauETvsTauET_EB_EE_(),
89  h_L1TauPhivsTauPhi_EB_(),
90  h_L1TauPhivsTauPhi_EE_(),
91  h_L1TauPhivsTauPhi_EB_EE_(),
92  h_L1TauEtavsTauEta_(),
93  h_resolutionTauET_EB_(),
94  h_resolutionTauET_EE_(),
95  h_resolutionTauET_EB_EE_(),
96  h_resolutionTauPhi_EB_(),
97  h_resolutionTauPhi_EE_(),
98  h_resolutionTauPhi_EB_EE_(),
99  h_resolutionTauEta_(),
100  h_efficiencyIsoTauET_EB_pass_(),
101  h_efficiencyIsoTauET_EE_pass_(),
102  h_efficiencyIsoTauET_EB_EE_pass_(),
103  h_efficiencyNonIsoTauET_EB_pass_(),
104  h_efficiencyNonIsoTauET_EE_pass_(),
105  h_efficiencyNonIsoTauET_EB_EE_pass_(),
106  h_efficiencyIsoTauET_EB_total_(),
107  h_efficiencyIsoTauET_EE_total_(),
108  h_efficiencyIsoTauET_EB_EE_total_(),
109  h_efficiencyNonIsoTauET_EB_total_(),
110  h_efficiencyNonIsoTauET_EE_total_(),
111  h_efficiencyNonIsoTauET_EB_EE_total_() {
112  edm::LogInfo("L1TTauOffline") << "Constructor "
113  << "L1TTauOffline::L1TTauOffline " << std::endl;
115 }
116 
117 //
118 // -- Destructor
119 //
121  edm::LogInfo("L1TTauOffline") << "Destructor L1TTauOffline::~L1TTauOffline " << std::endl;
122 }
123 
124 //
125 // -------------------------------------- beginRun --------------------------------------------
126 //
128 // void L1TTauOffline::dqmBeginRun(edm::Run const &, edm::EventSetup const &)
129 {
130  bool changed = true;
131  m_hltConfig.init(run, iSetup, trigProcess_, changed);
132 
133  edm::LogInfo("L1TTauOffline") << "L1TTauOffline::beginRun" << std::endl;
134 }
135 
136 //
137 // -------------------------------------- bookHistos --------------------------------------------
138 //
140  edm::LogInfo("L1TTauOffline") << "L1TTauOffline::bookHistograms" << std::endl;
141 
142  // book at beginRun
143  bookTauHistos(ibooker);
144 
145  for (auto trigNamesIt = triggerPath_.begin(); trigNamesIt != triggerPath_.end(); trigNamesIt++) {
146  std::string tNameTmp = (*trigNamesIt);
147  std::string tNamePattern = "";
148  std::size_t found0 = tNameTmp.find('*');
149  if (found0 != std::string::npos)
150  tNamePattern = tNameTmp.substr(0, tNameTmp.size() - 1);
151  else
152  tNamePattern = tNameTmp;
153 
154  int tIndex = -1;
155 
156  for (unsigned ipath = 0; ipath < m_hltConfig.size(); ++ipath) {
157  std::string tmpName = m_hltConfig.triggerName(ipath);
158 
159  std::size_t found = tmpName.find(tNamePattern);
160  if (found != std::string::npos) {
161  tIndex = int(ipath);
162  m_trigIndices.push_back(tIndex);
163  }
164  }
165  }
166 }
167 
168 //
169 // -------------------------------------- Analyze --------------------------------------------
170 //
171 void L1TTauOffline::analyze(edm::Event const& e, edm::EventSetup const& eSetup) {
172  m_MaxTauEta = 2.1;
173  m_MaxL1tTauDR = 0.5;
174  m_MaxHltTauDR = 0.5;
175 
177  e.getByToken(theTauCollection_, taus);
178 
179  if (!taus.isValid()) {
180  edm::LogWarning("L1TTauOffline") << "invalid collection: reco::PFTauCollection " << std::endl;
181  return;
182  }
183 
185  e.getByToken(MuonInputTag_, muons);
186 
187  if (!muons.isValid()) {
188  edm::LogWarning("L1TTauOffline") << "invalid collection: reco::MuonCollection " << std::endl;
189  return;
190  }
191 
193  e.getByToken(BsInputTag_, beamSpot);
194 
195  if (!beamSpot.isValid()) {
196  edm::LogWarning("L1TTauOffline") << "invalid collection: reco::BeamSpot " << std::endl;
197  return;
198  }
199 
201  e.getByToken(VtxInputTag_, vertex);
202 
203  if (!vertex.isValid()) {
204  edm::LogWarning("L1TTauOffline") << "invalid collection: reco::VertexCollection " << std::endl;
205  return;
206  }
207 
209  e.getByToken(stage2CaloLayer2TauToken_, l1tCands);
210 
211  if (!l1tCands.isValid()) {
212  edm::LogWarning("L1TTauOffline") << "invalid collection: l1t::TauBxCollection " << std::endl;
213  return;
214  }
215 
217  e.getByToken(triggerResults_, trigResults);
218 
219  if (!trigResults.isValid()) {
220  edm::LogWarning("L1TTauOffline") << "invalid collection: edm::TriggerResults " << std::endl;
221  return;
222  }
223 
225  e.getByToken(triggerEvent_, trigEvent);
226 
227  if (!trigEvent.isValid()) {
228  edm::LogWarning("L1TTauOffline") << "invalid collection: trigger::TriggerEvent " << std::endl;
229  return;
230  }
231 
233  e.getByToken(MetInputTag_, mets);
234 
235  if (!mets.isValid()) {
236  edm::LogWarning("L1TTauOffline") << "invalid collection: reco::PFMETCollection " << std::endl;
237  return;
238  }
239 
240  m_BField = eSetup.getHandle(mFieldToken_);
241 
243 
246  getTauL1tPairs(l1tCands);
247 
248  vector<l1t::Tau> l1tContainer;
249  l1tContainer.reserve(l1tCands->size() + 1);
250 
251  for (auto tau = l1tCands->begin(0); tau != l1tCands->end(0); ++tau) {
252  l1tContainer.push_back(*tau);
253  }
254 
255  for (auto tauL1tPairsIt = m_TauL1tPairs.begin(); tauL1tPairsIt != m_TauL1tPairs.end(); ++tauL1tPairsIt) {
256  float eta = tauL1tPairsIt->eta();
257  float phi = tauL1tPairsIt->phi();
258  float pt = tauL1tPairsIt->pt();
259 
260  // unmatched gmt cands have l1tPt = -1.
261  float l1tPt = tauL1tPairsIt->l1tPt();
262 
263  int counter = 0;
264 
265  for (auto threshold : tauEfficiencyThresholds_) {
266  std::string str_threshold = std::to_string(threshold);
267 
268  int l1tPtCut = threshold;
269  bool l1tAboveCut = (l1tPt >= l1tPtCut);
270 
271  stringstream ptCutToTag;
272  ptCutToTag << l1tPtCut;
273  string ptTag = ptCutToTag.str();
274 
275  if (fabs(eta) < m_MaxTauEta) {
276  if (counter == 0) {
277  if (fabs(eta) < 1.5) {
278  h_L1TauETvsTauET_EB_->Fill(pt, l1tPt);
279  h_L1TauPhivsTauPhi_EB_->Fill(phi, tauL1tPairsIt->l1tPhi());
280  h_resolutionTauET_EB_->Fill((l1tPt - pt) / pt);
281  h_resolutionTauPhi_EB_->Fill(tauL1tPairsIt->l1tPhi() - phi);
282  } else {
283  h_L1TauETvsTauET_EE_->Fill(pt, l1tPt);
284  h_L1TauPhivsTauPhi_EE_->Fill(phi, tauL1tPairsIt->l1tPhi());
285  h_resolutionTauET_EE_->Fill((l1tPt - pt) / pt);
286  h_resolutionTauPhi_EE_->Fill(tauL1tPairsIt->l1tPhi() - phi);
287  }
289  h_L1TauPhivsTauPhi_EB_EE_->Fill(phi, tauL1tPairsIt->l1tPhi());
290  h_L1TauEtavsTauEta_->Fill(eta, tauL1tPairsIt->l1tEta());
291  h_resolutionTauET_EB_EE_->Fill((l1tPt - pt) / pt);
292  h_resolutionTauPhi_EB_EE_->Fill(tauL1tPairsIt->l1tPhi() - phi);
293  h_resolutionTauEta_->Fill(tauL1tPairsIt->l1tEta() - eta);
294 
295  ++counter;
296  }
297 
298  if (fabs(eta) < 1.5) {
301  } else {
304  }
307 
308  if (l1tAboveCut) {
309  if (fabs(eta) < 1.5)
311  else
314 
315  if (tauL1tPairsIt->l1tIso() > 0.5) {
316  if (fabs(eta) < 1.5)
318  else
321  }
322  }
323  }
324  }
325  } // loop over tau-L1 pairs
326 }
327 
328 //
329 // -------------------------------------- endRun --------------------------------------------
330 //
331 //
332 // -------------------------------------- book histograms --------------------------------------------
333 //
335  ibooker.cd();
336  ibooker.setCurrentFolder(histFolder_);
338  h_nVertex_ = ibooker.book1D(nVertexDef.name, nVertexDef.title, nVertexDef.nbinsX, nVertexDef.xmin, nVertexDef.xmax);
339  h_tagAndProbeMass_ = ibooker.book1D("tagAndProbeMass", "Invariant mass of tag & probe pair", 100, 40, 140);
340 
342  h_L1TauETvsTauET_EB_ = ibooker.book2D("L1TauETvsTauET_EB",
343  "L1 Tau E_{T} vs PFTau E_{T} (EB); PFTau E_{T} (GeV); L1 Tau E_{T} (GeV)",
344  templateETvsET.nbinsX,
345  &templateETvsET.binsX[0],
346  templateETvsET.nbinsY,
347  &templateETvsET.binsY[0]);
348  h_L1TauETvsTauET_EE_ = ibooker.book2D("L1TauETvsTauET_EE",
349  "L1 Tau E_{T} vs PFTau E_{T} (EE); PFTau E_{T} (GeV); L1 Tau E_{T} (GeV)",
350  templateETvsET.nbinsX,
351  &templateETvsET.binsX[0],
352  templateETvsET.nbinsY,
353  &templateETvsET.binsY[0]);
354  h_L1TauETvsTauET_EB_EE_ = ibooker.book2D("L1TauETvsTauET_EB_EE",
355  "L1 Tau E_{T} vs PFTau E_{T} (EB+EE); PFTau E_{T} (GeV); L1 Tau E_{T} (GeV)",
356  templateETvsET.nbinsX,
357  &templateETvsET.binsX[0],
358  templateETvsET.nbinsY,
359  &templateETvsET.binsY[0]);
360 
363  ibooker.book2D("L1TauPhivsTauPhi_EB",
364  "#phi_{tau}^{L1} vs #phi_{tau}^{offline} (EB); #phi_{tau}^{offline}; #phi_{tau}^{L1}",
365  templatePHIvsPHI.nbinsX,
366  templatePHIvsPHI.xmin,
367  templatePHIvsPHI.xmax,
368  templatePHIvsPHI.nbinsY,
369  templatePHIvsPHI.ymin,
370  templatePHIvsPHI.ymax);
372  ibooker.book2D("L1TauPhivsTauPhi_EE",
373  "#phi_{tau}^{L1} vs #phi_{tau}^{offline} (EE); #phi_{tau}^{offline}; #phi_{tau}^{L1}",
374  templatePHIvsPHI.nbinsX,
375  templatePHIvsPHI.xmin,
376  templatePHIvsPHI.xmax,
377  templatePHIvsPHI.nbinsY,
378  templatePHIvsPHI.ymin,
379  templatePHIvsPHI.ymax);
381  ibooker.book2D("L1TauPhivsTauPhi_EB_EE",
382  "#phi_{tau}^{L1} vs #phi_{tau}^{offline} (EB+EE); #phi_{tau}^{offline}; #phi_{tau}^{L1}",
383  templatePHIvsPHI.nbinsX,
384  templatePHIvsPHI.xmin,
385  templatePHIvsPHI.xmax,
386  templatePHIvsPHI.nbinsY,
387  templatePHIvsPHI.ymin,
388  templatePHIvsPHI.ymax);
389 
391  ibooker.book2D("L1TauEtavsTauEta", "L1 Tau #eta vs PFTau #eta; PFTau #eta; L1 Tau #eta", 100, -3, 3, 100, -3, 3);
392 
393  // tau resolutions
394  h_resolutionTauET_EB_ = ibooker.book1D(
395  "resolutionTauET_EB", "tau ET resolution (EB); (L1 Tau E_{T} - PFTau E_{T})/PFTau E_{T}; events", 50, -1, 1.5);
396  h_resolutionTauET_EE_ = ibooker.book1D(
397  "resolutionTauET_EE", "tau ET resolution (EE); (L1 Tau E_{T} - PFTau E_{T})/PFTau E_{T}; events", 50, -1, 1.5);
399  ibooker.book1D("resolutionTauET_EB_EE",
400  "tau ET resolution (EB+EE); (L1 Tau E_{T} - PFTau E_{T})/PFTau E_{T}; events",
401  50,
402  -1,
403  1.5);
404 
405  h_resolutionTauPhi_EB_ = ibooker.book1D("resolutionTauPhi_EB",
406  "#phi_{tau} resolution (EB); #phi_{tau}^{L1} - #phi_{tau}^{offline}; events",
407  120,
408  -0.3,
409  0.3);
410  h_resolutionTauPhi_EE_ = ibooker.book1D(
411  "resolutionTauPhi_EE", "tau #phi resolution (EE); #phi_{tau}^{L1} - #phi_{tau}^{offline}; events", 120, -0.3, 0.3);
413  ibooker.book1D("resolutionTauPhi_EB_EE",
414  "tau #phi resolution (EB+EE); #phi_{tau}^{L1} - #phi_{tau}^{offline}; events",
415  120,
416  -0.3,
417  0.3);
418 
420  ibooker.book1D("resolutionTauEta", "tau #eta resolution (EB); L1 Tau #eta - PFTau #eta; events", 120, -0.3, 0.3);
421 
422  // tau turn-ons
424  std::vector<float> tauBins(tauEfficiencyBins_.begin(), tauEfficiencyBins_.end());
425  int nBins = tauBins.size() - 1;
426  float* tauBinArray = &(tauBins[0]);
427 
428  for (auto threshold : tauEfficiencyThresholds_) {
429  std::string str_threshold = std::to_string(int(threshold));
431  ibooker.book1D("efficiencyIsoTauET_EB_threshold_" + str_threshold + "_Num",
432  "iso tau efficiency (EB); PFTau E_{T} (GeV); events",
433  nBins,
434  tauBinArray);
436  ibooker.book1D("efficiencyIsoTauET_EE_threshold_" + str_threshold + "_Num",
437  "iso tau efficiency (EE); PFTau E_{T} (GeV); events",
438  nBins,
439  tauBinArray);
441  ibooker.book1D("efficiencyIsoTauET_EB_EE_threshold_" + str_threshold + "_Num",
442  "iso tau efficiency (EB+EE); PFTau E_{T} (GeV); events",
443  nBins,
444  tauBinArray);
445 
447  ibooker.book1D("efficiencyIsoTauET_EB_threshold_" + str_threshold + "_Den",
448  "iso tau efficiency (EB); PFTau E_{T} (GeV); events",
449  nBins,
450  tauBinArray);
452  ibooker.book1D("efficiencyIsoTauET_EE_threshold_" + str_threshold + "_Den",
453  "iso tau efficiency (EE); PFTau E_{T} (GeV); events",
454  nBins,
455  tauBinArray);
457  ibooker.book1D("efficiencyIsoTauET_EB_EE_threshold_" + str_threshold + "_Den",
458  "iso tau efficiency (EB+EE); PFTau E_{T} (GeV); events",
459  nBins,
460  tauBinArray);
461 
462  // non iso
464  ibooker.book1D("efficiencyNonIsoTauET_EB_threshold_" + str_threshold + "_Num",
465  "inclusive tau efficiency (EB); PFTau E_{T} (GeV); events",
466  nBins,
467  tauBinArray);
469  ibooker.book1D("efficiencyNonIsoTauET_EE_threshold_" + str_threshold + "_Num",
470  "inclusive tau efficiency (EE); PFTau E_{T} (GeV); events",
471  nBins,
472  tauBinArray);
474  ibooker.book1D("efficiencyNonIsoTauET_EB_EE_threshold_" + str_threshold + "_Num",
475  "inclusive tau efficiency (EB+EE); PFTau E_{T} (GeV); events",
476  nBins,
477  tauBinArray);
478 
480  ibooker.book1D("efficiencyNonIsoTauET_EB_threshold_" + str_threshold + "_Den",
481  "inclusive tau efficiency (EB); PFTau E_{T} (GeV); events",
482  nBins,
483  tauBinArray);
485  ibooker.book1D("efficiencyNonIsoTauET_EE_threshold_" + str_threshold + "_Den",
486  "inclusive tau efficiency (EE); PFTau E_{T} (GeV); events",
487  nBins,
488  tauBinArray);
490  ibooker.book1D("efficiencyNonIsoTauET_EB_EE_threshold_" + str_threshold + "_Den",
491  "inclusive tau efficiency (EB+EE); PFTau E_{T} (GeV); events",
492  nBins,
493  tauBinArray);
494  }
495 
496  ibooker.cd();
497 
498  return;
499 }
500 
503  reco::Vertex::Point posVtx;
504  reco::Vertex::Error errVtx;
505 
506  bool hasPrimaryVertex = false;
507 
508  if (vertex.isValid()) {
509  for (auto vertexIt = vertex->begin(); vertexIt != vertex->end(); ++vertexIt) {
510  if (vertexIt->isValid() && !vertexIt->isFake()) {
511  posVtx = vertexIt->position();
512  errVtx = vertexIt->error();
513  hasPrimaryVertex = true;
514  break;
515  }
516  }
517  }
518 
519  if (!hasPrimaryVertex) {
520  posVtx = beamSpot->position();
521  errVtx(0, 0) = beamSpot->BeamWidthX();
522  errVtx(1, 1) = beamSpot->BeamWidthY();
523  errVtx(2, 2) = beamSpot->sigmaZ();
524  }
525 
526  const reco::Vertex primaryVertex(posVtx, errVtx);
527 
528  return primaryVertex;
529 }
530 
532  double matchDeltaR = 9999;
533 
535 
536  for (auto& trigIndex : m_trigIndices) {
537  const vector<string> moduleLabels(m_hltConfig.moduleLabels(trigIndex));
538  // V.M. 2023.03.08 Same issue as in the L1TMuonDQMOffline.cc - some modules are behind hltBoolEnd, but we want the last one before the "hltBoolEnd"
539  int moduleIndex = 999999;
540  for (int ii = moduleLabels.size() - 1; ii > 0; ii--) {
541  if (moduleLabels[ii] == "hltBoolEnd") {
542  moduleIndex = ii - 1;
543  break;
544  }
545  }
546  if (moduleIndex == 999999) {
547  edm::LogError("L1TMuonDQMOffline") << "Found no module label in trigger " << trigIndex;
548  continue;
549  }
550  const unsigned hltFilterIndex = triggerEvent->filterIndex(InputTag(moduleLabels[moduleIndex], "", trigProcess_));
551 
552  if (hltFilterIndex < triggerEvent->sizeFilters()) {
553  const Keys triggerKeys(triggerEvent->filterKeys(hltFilterIndex));
554  const Vids triggerVids(triggerEvent->filterIds(hltFilterIndex));
555 
556  const unsigned nTriggers = triggerVids.size();
557  for (size_t iTrig = 0; iTrig < nTriggers; ++iTrig) {
558  const TriggerObject trigObject = trigObjs[triggerKeys[iTrig]];
559 
560  double dRtmp = deltaR((*muon), trigObject);
561  if (dRtmp < matchDeltaR)
562  matchDeltaR = dRtmp;
563  }
564  }
565  }
566  return (matchDeltaR < m_MaxHltTauDR);
567 }
568 
570  m_TauL1tPairs.clear();
571 
572  vector<l1t::Tau> l1tContainer;
573  l1tContainer.reserve(l1tCands->size() + 1);
574 
575  for (auto tau = l1tCands->begin(0); tau != l1tCands->end(0); ++tau) {
576  l1tContainer.push_back(*tau);
577  }
578 
579  for (auto probeTauIt = m_ProbeTaus.begin(); probeTauIt != m_ProbeTaus.end(); ++probeTauIt) {
580  TauL1TPair pairBestCand((*probeTauIt), nullptr);
581 
582  for (auto l1tIt = l1tContainer.begin(); l1tIt != l1tContainer.end(); ++l1tIt) {
583  TauL1TPair pairTmpCand((*probeTauIt), &(*l1tIt));
584 
585  if (pairTmpCand.dR() < m_MaxL1tTauDR && pairTmpCand.l1tPt() > pairBestCand.l1tPt())
586  pairBestCand = pairTmpCand;
587  }
588 
589  m_TauL1tPairs.push_back(pairBestCand);
590  }
591 }
592 
595  const reco::Vertex& vertex,
597  m_TightMuons.clear();
598 
599  const reco::PFMET* pfmet = nullptr;
600  pfmet = &(mets->front());
601 
602  int nb_mu = 0;
603 
604  for (auto muonIt2 = muons->begin(); muonIt2 != muons->end(); ++muonIt2) {
605  if (fabs(muonIt2->eta()) < 2.4 && muonIt2->pt() > 10 && muon::isLooseMuon((*muonIt2)) &&
606  (muonIt2->pfIsolationR04().sumChargedHadronPt +
607  max(muonIt2->pfIsolationR04().sumNeutralHadronEt + muonIt2->pfIsolationR04().sumPhotonEt -
608  0.5 * muonIt2->pfIsolationR04().sumPUPt,
609  0.0)) /
610  muonIt2->pt() <
611  0.3) {
612  ++nb_mu;
613  }
614  }
615  bool foundTightMu = false;
616  for (auto muonIt = muons->begin(); muonIt != muons->end(); ++muonIt) {
617  if (!matchHlt(trigEvent, &(*muonIt)))
618  continue;
619  float muiso = (muonIt->pfIsolationR04().sumChargedHadronPt +
620  max(muonIt->pfIsolationR04().sumNeutralHadronEt + muonIt->pfIsolationR04().sumPhotonEt -
621  0.5 * muonIt->pfIsolationR04().sumPUPt,
622  0.0)) /
623  muonIt->pt();
624 
625  if (muiso < 0.1 && nb_mu < 2 && !foundTightMu && fabs(muonIt->eta()) < 2.1 && muonIt->pt() > 24 &&
626  muon::isLooseMuon((*muonIt))) {
627  float mt = sqrt(pow(muonIt->pt() + pfmet->pt(), 2) - pow(muonIt->px() + pfmet->px(), 2) -
628  pow(muonIt->py() + pfmet->py(), 2));
629  if (mt < 30) {
630  m_TightMuons.push_back(&(*muonIt));
631  foundTightMu = true;
632  }
633  }
634  }
635 }
636 
640  const reco::Vertex& vertex) {
641  m_ProbeTaus.clear();
642 
644  iEvent.getByToken(AntiMuInputTag_, antimu);
645  if (!antimu.isValid()) {
646  edm::LogWarning("L1TTauOffline") << "invalid collection: reco::PFTauDiscriminator anti-mu";
647  return;
648  }
649 
651  iEvent.getByToken(DecayModeFindingInputTag_, dmf);
652  if (!dmf.isValid()) {
653  edm::LogWarning("L1TTauOffline") << "invalid collection: reco::PFTauDiscriminator decay mode finding input";
654  return;
655  }
656  m_AntiEleExists = true;
657 
659  iEvent.getByToken(AntiEleInputTag_, antiele);
660  if (!antiele.isValid()) {
661  //V.M. 16.3.2023. Bypassing the return option for now, as the anti-ele discr. is not available.
662  m_AntiEleExists = false;
663  }
664 
666  iEvent.getByToken(comb3TInputTag_, comb3T);
667  if (!comb3T.isValid()) {
668  edm::LogWarning("L1TTauOffline") << "invalid collection: reco::PFTauDiscriminator comb3T";
669  return;
670  }
671 
672  if (!m_TightMuons.empty()) {
673  TLorentzVector mymu;
674  mymu.SetPtEtaPhiE(m_TightMuons[0]->pt(), m_TightMuons[0]->eta(), m_TightMuons[0]->phi(), m_TightMuons[0]->energy());
675  int iTau = 0;
676 
677  // load indices from input provenance config if process history changed, in particular for the first event
678  if (iEvent.processHistoryID() != phID_) {
679  phID_ = iEvent.processHistoryID();
680  {
681  const edm::Provenance* prov = antimu.provenance();
682  const std::vector<edm::ParameterSet> psetsFromProvenance =
683  edm::parameterSet(prov->stable(), iEvent.processHistory())
684  .getParameter<std::vector<edm::ParameterSet>>("IDWPdefinitions");
685  for (uint i = 0; i < psetsFromProvenance.size(); i++) {
686  if (psetsFromProvenance[i].getParameter<std::string>("IDname") == AntiMuWP_)
687  AntiMuWPIndex_ = i;
688  }
689  }
690  {
691  if (m_AntiEleExists) {
692  const edm::Provenance* prov = antiele.provenance();
693  const std::vector<std::string> psetsFromProvenance =
694  edm::parameterSet(prov->stable(), iEvent.processHistory())
695  .getParameter<std::vector<std::string>>("workingPoints");
696  for (unsigned int i = 0; i < psetsFromProvenance.size(); i++) {
697  if (psetsFromProvenance[i] == AntiEleWP_)
698  AntiEleWPIndex_ = i;
699  }
700  }
701  }
702  {
703  const edm::Provenance* prov = comb3T.provenance();
704  const std::vector<edm::ParameterSet> psetsFromProvenance =
705  edm::parameterSet(prov->stable(), iEvent.processHistory())
706  .getParameter<std::vector<edm::ParameterSet>>("IDWPdefinitions");
707  for (uint i = 0; i < psetsFromProvenance.size(); i++) {
708  if (psetsFromProvenance[i].getParameter<std::string>("IDname") == comb3TWP_)
709  comb3TWPIndex_ = i;
710  }
711  }
712  }
713 
714  for (auto tauIt = taus->begin(); tauIt != taus->end(); ++tauIt, ++iTau) {
715  reco::PFTauRef tauCandidate(taus, iTau);
716  TLorentzVector mytau;
717  mytau.SetPtEtaPhiE(tauIt->pt(), tauIt->eta(), tauIt->phi(), tauIt->energy());
718 
719  if ((*antimu)[tauCandidate].workingPoints.empty()) {
720  edm::LogWarning("L1TTauOffline") << "This offline tau has no antimu discriminator, skipping";
721  continue;
722  }
723  if (m_AntiEleExists) {
724  if ((*antiele)[tauCandidate].workingPoints.empty()) {
725  edm::LogWarning("L1TTauOffline") << "This offline tau has no antiele discriminator, skipping";
726  continue;
727  }
728  }
729  if ((*comb3T)[tauCandidate].workingPoints.empty()) {
730  edm::LogWarning("L1TTauOffline") << "This offline tau has no comb3T discriminator, skipping";
731  continue;
732  }
733  bool antiele_condition = true;
734 
735  if (m_AntiEleExists)
736  antiele_condition = (*antiele)[tauCandidate].workingPoints[AntiEleWPIndex_];
737 
738  if (fabs(tauIt->charge()) == 1 && fabs(tauIt->eta()) < 2.1 && tauIt->pt() > 20 &&
739  (*antimu)[tauCandidate].workingPoints[AntiMuWPIndex_] && antiele_condition && (*dmf)[tauCandidate] > 0.5 &&
740  (*comb3T)[tauCandidate].workingPoints[comb3TWPIndex_]) {
741  if (mymu.DeltaR(mytau) > 0.5 && (mymu + mytau).M() > 40 && (mymu + mytau).M() < 80 &&
742  m_TightMuons[0]->charge() * tauIt->charge() < 0) {
743  m_ProbeTaus.push_back(&(*tauIt));
744  }
745  }
746  }
747  }
748 }
749 
751  std::vector<MonitorElement*> monElementstoNormalize = {h_L1TauETvsTauET_EB_,
758 
759  for (auto mon : monElementstoNormalize) {
760  if (mon != nullptr) {
761  auto h = mon->getTH2F();
762  if (h != nullptr) {
763  h->Scale(1, "width");
764  }
765  }
766  }
767 }
768 // define this as a plug-in
std::vector< float > binsX
const std::string & triggerName(unsigned int triggerIndex) const
edm::EDGetTokenT< reco::VertexCollection > VtxInputTag_
std::vector< std::string > triggerPath_
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
edm::ESGetToken< MagneticField, IdealMagneticFieldRecord > mFieldToken_
std::vector< PFTau > PFTauCollection
collection of PFTau objects
Definition: PFTauFwd.h:9
~L1TTauOffline() override
double pt() const final
transverse momentum
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:25
double m_phi_bar
Definition: L1TTauOffline.h:76
std::map< double, MonitorElement * > h_efficiencyIsoTauET_EB_pass_
std::vector< int > m_trigIndices
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
std::vector< TauL1TPair > m_TauL1tPairs
const Point & position() const
position
Definition: Vertex.h:127
MonitorElement * h_L1TauPhivsTauPhi_EB_
void bookTauHistos(DQMStore::IBooker &)
edm::ESHandle< MagneticField > m_BField
void dqmBeginRun(const edm::Run &run, const edm::EventSetup &iSetup) override
math::Error< dimension >::type Error
covariance error matrix (3x3)
Definition: Vertex.h:44
static const std::map< std::string, unsigned int > PlotConfigNames
Definition: L1TTauOffline.h:87
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
constexpr int pow(int x)
Definition: conifer.h:24
std::vector< double > tauEfficiencyBins_
std::map< double, MonitorElement * > h_efficiencyNonIsoTauET_EB_EE_pass_
delete x;
Definition: CaloConfig.h:22
edm::EDGetTokenT< reco::TauDiscriminatorContainer > AntiMuInputTag_
MonitorElement * h_nVertex_
std::map< double, MonitorElement * > h_efficiencyIsoTauET_EE_pass_
std::map< double, MonitorElement * > h_efficiencyNonIsoTauET_EB_total_
Log< level::Error, false > LogError
std::map< double, MonitorElement * > h_efficiencyNonIsoTauET_EB_pass_
std::string efficiencyFolder_
void getProbeTaus(const edm::Event &e, edm::Handle< reco::PFTauCollection > const &taus, edm::Handle< reco::MuonCollection > const &muons, const reco::Vertex &vertex)
BXVector< Tau > TauBxCollection
Definition: Tau.h:10
Provenance const * provenance() const
Definition: HandleBase.h:74
ParameterSet const & parameterSet(StableProvenance const &provenance, ProcessHistory const &history)
Definition: Provenance.cc:11
std::string AntiEleWP_
std::string histFolder_
std::map< double, MonitorElement * > h_efficiencyNonIsoTauET_EB_EE_total_
static std::string to_string(const XMLCh *ch)
std::vector< Muon > MuonCollection
collection of Muon objects
Definition: MuonFwd.h:9
MonitorElement * h_resolutionTauPhi_EB_
bool isLooseMuon(const reco::Muon &)
edm::ProcessHistoryID phID_
L1TTauOffline(const edm::ParameterSet &ps)
MonitorElement * h_L1TauPhivsTauPhi_EE_
const_iterator begin(int bx) const
unsigned size(int bx) const
void normalise2DHistogramsToBinArea()
void Fill(long long x)
std::vector< int > tauEfficiencyThresholds_
HLTConfigProvider m_hltConfig
double px() const final
x coordinate of momentum vector
std::vector< const reco::PFTau * > m_ProbeTaus
int iEvent
Definition: GenABIO.cc:224
void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override
MonitorElement * h_resolutionTauPhi_EB_EE_
edm::EDGetTokenT< reco::TauDiscriminatorContainer > comb3TInputTag_
std::string comb3TWP_
const reco::Vertex getPrimaryVertex(edm::Handle< reco::VertexCollection > const &vertex, edm::Handle< reco::BeamSpot > const &beamSpot)
unsigned int size() const
number of trigger paths in trigger table
T sqrt(T t)
Definition: SSEVec.h:19
const l1t::Tau * m_regTau
Definition: L1TTauOffline.h:73
const std::vector< std::string > & moduleLabels(unsigned int trigger) const
label(s) of module(s) on a trigger path
std::map< double, MonitorElement * > h_efficiencyIsoTauET_EB_total_
MonitorElement * h_resolutionTauPhi_EE_
math::XYZPoint Point
point in the space
Definition: Vertex.h:40
std::map< double, MonitorElement * > h_efficiencyIsoTauET_EB_EE_pass_
MonitorElement * h_L1TauEtavsTauEta_
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::EDGetTokenT< l1t::TauBxCollection > stage2CaloLayer2TauToken_
std::map< double, MonitorElement * > h_efficiencyIsoTauET_EB_EE_total_
double py() const final
y coordinate of momentum vector
double l1tPt() const
Definition: L1TTauOffline.h:66
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:130
MonitorElement * h_resolutionTauEta_
double m_eta
Definition: L1TTauOffline.h:75
std::map< double, MonitorElement * > h_efficiencyNonIsoTauET_EE_total_
edm::EDGetTokenT< reco::BeamSpot > BsInputTag_
ii
Definition: cuy.py:589
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
edm::EDGetTokenT< reco::PFMETCollection > MetInputTag_
MonitorElement * h_resolutionTauET_EB_EE_
edm::EDGetTokenT< edm::TriggerResults > triggerResults_
edm::EDGetTokenT< reco::TauDiscriminatorContainer > AntiEleInputTag_
std::vector< TriggerObject > TriggerObjectCollection
collection of trigger physics objects (e.g., all isolated muons)
Definition: TriggerObject.h:75
Log< level::Info, false > LogInfo
HistDefinitions readHistDefinitions(const edm::ParameterSet &ps, const std::map< std::string, unsigned int > &mapping)
std::vector< const reco::Muon * > m_TightMuons
MonitorElement * h_resolutionTauET_EE_
std::map< double, MonitorElement * > h_efficiencyIsoTauET_EE_total_
const reco::PFTau * m_tau
Definition: L1TTauOffline.h:69
edm::EDGetTokenT< reco::MuonCollection > MuonInputTag_
std::string trigProcess_
std::vector< float > binsY
edm::EDGetTokenT< reco::PFTauDiscriminator > DecayModeFindingInputTag_
MonitorElement * h_tagAndProbeMass_
std::vector< size_type > Keys
double dR()
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:212
void getTauL1tPairs(edm::Handle< l1t::TauBxCollection > const &l1tCands)
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
TauL1TPair(const reco::PFTau *tau, const l1t::Tau *regTau)
Definition: L1TTauOffline.h:55
bool isValid() const
Definition: HandleBase.h:70
ParameterSet const & getParameterSet(ParameterSetID const &id)
edm::EDGetTokenT< trigger::TriggerEvent > triggerEvent_
const_iterator end(int bx) const
fixed size matrix
HLT enums.
static std::atomic< unsigned int > counter
bool matchHlt(edm::Handle< trigger::TriggerEvent > const &triggerEvent, const reco::Muon *muon)
dqmoffline::l1t::HistDefinitions histDefinitions_
edm::EDGetTokenT< reco::PFTauCollection > theTauCollection_
MonitorElement * h_L1TauETvsTauET_EB_EE_
std::string AntiMuWP_
MonitorElement * h_L1TauETvsTauET_EE_
Log< level::Warning, false > LogWarning
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
MonitorElement * h_L1TauPhivsTauPhi_EB_EE_
void getTightMuons(edm::Handle< reco::MuonCollection > const &muons, edm::Handle< reco::PFMETCollection > const &mets, const reco::Vertex &vertex, edm::Handle< trigger::TriggerEvent > const &trigEvent)
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
MonitorElement * h_resolutionTauET_EB_
primaryVertex
hltOfflineBeamSpot for HLTMON
StableProvenance const & stable() const
Definition: Provenance.h:42
MonitorElement * h_L1TauETvsTauET_EB_
std::vector< int > Vids
std::map< double, MonitorElement * > h_efficiencyNonIsoTauET_EE_pass_
Definition: Run.h:45
double m_phi_end
Definition: L1TTauOffline.h:77
Collection of PF MET.