CMS 3D CMS Logo

L1TMuonProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: L1TMuonProducer
4 // Class: L1TMuonProducer
5 //
13 //
14 // Original Author: Joschka Philip Lingemann,40 3-B01,+41227671598,
15 // Created: Thu Oct 3 16:31:34 CEST 2013
16 // $Id$
17 //
18 //
19 
20 // system include files
21 #include <memory>
22 #include <fstream>
23 
24 // user include files
29 
32 
35 
42 
46 
52 
53 #include "TMath.h"
54 //
55 // class declaration
56 //
57 using namespace l1t;
58 
60 public:
61  explicit L1TMuonProducer(const edm::ParameterSet&);
62  ~L1TMuonProducer() override;
63 
64  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
65 
66 private:
67  void produce(edm::Event&, const edm::EventSetup&) override;
68 
69  void beginRun(edm::Run const&, edm::EventSetup const&) override;
70  void endRun(edm::Run const&, edm::EventSetup const&) override;
71  void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override;
72  void endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override;
73 
74  static bool compareMuons(const std::shared_ptr<MicroGMTConfiguration::InterMuon>& mu1,
75  const std::shared_ptr<MicroGMTConfiguration::InterMuon>& mu2);
76 
77  void sortMuons(MicroGMTConfiguration::InterMuonList&, unsigned) const;
78 
79  void calculateRank(MicroGMTConfiguration::InterMuonList& muons) const;
80 
81  void splitAndConvertMuons(edm::Handle<MicroGMTConfiguration::InputCollection> const& in,
84  GMTInternalWedges& wedges_pos,
85  GMTInternalWedges& wedges_neg,
86  int bx) const;
87 
90  GMTInternalWedges& wedges,
91  int bx) const;
92 
93  int computeMuonIdx(const RegionalMuonCand& mu, int currentLink, int muIdxAuto) const;
94 
95  void addMuonsToCollections(MicroGMTConfiguration::InterMuonList& coll,
97  std::unique_ptr<MuonBxCollection>& out,
98  int bx) const;
99 
100  // ----------member data ---------------------------
102  int m_bxMin;
103  int m_bxMax;
105  std::bitset<72> m_inputsToDisable;
106  std::bitset<28> m_caloInputsToDisable;
107  std::bitset<12> m_bmtfInputsToDisable;
108  std::bitset<12> m_omtfInputsToDisable;
109  std::bitset<12> m_emtfInputsToDisable;
110  std::bitset<72> m_maskedInputs;
111  std::bitset<28> m_maskedCaloInputs;
112  std::bitset<12> m_maskedBmtfInputs;
113  std::bitset<12> m_maskedOmtfInputs;
114  std::bitset<12> m_maskedEmtfInputs;
115  std::unique_ptr<L1TMuonGlobalParamsHelper> microGMTParamsHelper;
120  std::shared_ptr<MicroGMTRankPtQualLUT> m_rankPtQualityLUT;
123  std::ofstream m_debugOut;
126 
133 };
134 
135 //
136 // constants, enums and typedefs
137 //
138 
139 //
140 // static data member definitions
141 //
142 
143 //
144 // constructors and destructor
145 //
147  : m_debugOut("test/debug/iso_debug.dat"),
148  m_bmtfCancelMode(cancelmode::tracks),
149  m_emtfCancelMode(cancelmode::coordinate) {
150  // edm::InputTag barrelTfInputTag = iConfig.getParameter<edm::InputTag>("barrelTFInput");
151  // edm::InputTag overlapTfInputTag = iConfig.getParameter<edm::InputTag>("overlapTFInput");
152  // edm::InputTag forwardTfInputTag = iConfig.getParameter<edm::InputTag>("forwardTFInput");
153 
154  m_barrelTfInputTag = iConfig.getParameter<edm::InputTag>("barrelTFInput");
155  m_overlapTfInputTag = iConfig.getParameter<edm::InputTag>("overlapTFInput");
156  m_endcapTfInputTag = iConfig.getParameter<edm::InputTag>("forwardTFInput");
157  m_trigTowerTag = iConfig.getParameter<edm::InputTag>("triggerTowerInput");
158 
159  m_autoBxRange = iConfig.getParameter<bool>("autoBxRange");
160  m_bxMin = iConfig.getParameter<int>("bxMin");
161  m_bxMax = iConfig.getParameter<int>("bxMax");
162 
163  m_autoCancelMode = iConfig.getParameter<bool>("autoCancelMode");
164  if (!m_autoCancelMode) {
165  if (iConfig.getParameter<std::string>("bmtfCancelMode").find("kftracks") == 0) {
167  }
168  if (iConfig.getParameter<std::string>("emtfCancelMode").find("tracks") == 0) {
170  }
171  }
172 
173  m_barrelTfInputToken = consumes<MicroGMTConfiguration::InputCollection>(m_barrelTfInputTag);
174  m_overlapTfInputToken = consumes<MicroGMTConfiguration::InputCollection>(m_overlapTfInputTag);
175  m_endcapTfInputToken = consumes<MicroGMTConfiguration::InputCollection>(m_endcapTfInputTag);
176  m_caloTowerInputToken = consumes<MicroGMTConfiguration::CaloInputCollection>(m_trigTowerTag);
177  m_microGMTParamsToken = esConsumes<L1TMuonGlobalParams, L1TMuonGlobalParamsRcd, edm::Transition::BeginRun>();
178  m_o2oProtoToken = esConsumes<L1TMuonGlobalParams, L1TMuonGlobalParamsO2ORcd, edm::Transition::BeginRun>();
179 
180  //register your products
181  produces<MuonBxCollection>();
182  produces<MuonBxCollection>("imdMuonsBMTF");
183  produces<MuonBxCollection>("imdMuonsEMTFPos");
184  produces<MuonBxCollection>("imdMuonsEMTFNeg");
185  produces<MuonBxCollection>("imdMuonsOMTFPos");
186  produces<MuonBxCollection>("imdMuonsOMTFNeg");
187 }
188 
190 
191 //
192 // member functions
193 //
194 
195 // ------------ method called to produce the data ------------
197  using namespace edm;
198  std::unique_ptr<MuonBxCollection> outMuons(new MuonBxCollection());
199  std::unique_ptr<MuonBxCollection> imdMuonsBMTF(new MuonBxCollection());
200  std::unique_ptr<MuonBxCollection> imdMuonsEMTFPos(new MuonBxCollection());
201  std::unique_ptr<MuonBxCollection> imdMuonsEMTFNeg(new MuonBxCollection());
202  std::unique_ptr<MuonBxCollection> imdMuonsOMTFPos(new MuonBxCollection());
203  std::unique_ptr<MuonBxCollection> imdMuonsOMTFNeg(new MuonBxCollection());
204 
209 
210  iEvent.getByToken(m_barrelTfInputToken, bmtfMuons);
211  iEvent.getByToken(m_endcapTfInputToken, emtfMuons);
212  iEvent.getByToken(m_overlapTfInputToken, omtfMuons);
213  iEvent.getByToken(m_caloTowerInputToken, trigTowers);
214 
215  // find out the BX range from the inputs
216  // the smallest BX window defines the output BX window
217  if (m_autoBxRange) {
218  int bxMin = -1000;
219  int bxMax = 1000;
220  if (!(m_caloInputsToDisable.all() || m_maskedCaloInputs.all())) {
221  bxMin = std::max(bxMin, trigTowers->getFirstBX());
222  bxMax = std::min(bxMax, trigTowers->getLastBX());
223  }
224  if (!(m_bmtfInputsToDisable.all() || m_maskedBmtfInputs.all())) {
225  bxMin = std::max(bxMin, bmtfMuons->getFirstBX());
226  bxMax = std::min(bxMax, bmtfMuons->getLastBX());
227  }
228  if (!(m_omtfInputsToDisable.all() || m_maskedOmtfInputs.all())) {
229  bxMin = std::max(bxMin, omtfMuons->getFirstBX());
230  bxMax = std::min(bxMax, omtfMuons->getLastBX());
231  }
232  if (!(m_emtfInputsToDisable.all() || m_maskedEmtfInputs.all())) {
233  bxMin = std::max(bxMin, emtfMuons->getFirstBX());
234  bxMax = std::min(bxMax, emtfMuons->getLastBX());
235  }
236  if (bxMin > 0) {
237  bxMin = 0;
238  }
239  if (bxMax < 0) {
240  bxMax = 0;
241  }
242  if (bxMin > -1000) {
243  m_bxMin = bxMin;
244  } else {
245  m_bxMin = 0;
246  }
247  if (bxMax < 1000) {
248  m_bxMax = bxMax;
249  } else {
250  m_bxMax = 0;
251  }
252  }
253 
254  // set BX range for outputs
255  outMuons->setBXRange(m_bxMin, m_bxMax);
256  imdMuonsBMTF->setBXRange(m_bxMin, m_bxMax);
257  imdMuonsEMTFPos->setBXRange(m_bxMin, m_bxMax);
258  imdMuonsEMTFNeg->setBXRange(m_bxMin, m_bxMax);
259  imdMuonsOMTFPos->setBXRange(m_bxMin, m_bxMax);
260  imdMuonsOMTFNeg->setBXRange(m_bxMin, m_bxMax);
261 
262  for (int bx = m_bxMin; bx <= m_bxMax; ++bx) {
263  m_isolationUnit.setTowerSums(*trigTowers, bx);
264  MicroGMTConfiguration::InterMuonList internMuonsBmtf;
265  MicroGMTConfiguration::InterMuonList internMuonsEmtfPos;
266  MicroGMTConfiguration::InterMuonList internMuonsEmtfNeg;
267  MicroGMTConfiguration::InterMuonList internMuonsOmtfPos;
268  MicroGMTConfiguration::InterMuonList internMuonsOmtfNeg;
269 
270  // These wedges contain shared pointers to the ones in the InterMuonList
271  GMTInternalWedges omtfNegWedges;
272  GMTInternalWedges bmtfWedges;
273  GMTInternalWedges emtfPosWedges;
274  GMTInternalWedges emtfNegWedges;
275  GMTInternalWedges omtfPosWedges;
276 
277  // this converts the InputMuon type to the InternalMuon type and splits them into
278  // positive / negative eta collections necessary as LUTs may differ for pos / neg.
279  convertMuons(bmtfMuons, internMuonsBmtf, bmtfWedges, bx);
280  splitAndConvertMuons(emtfMuons, internMuonsEmtfPos, internMuonsEmtfNeg, emtfPosWedges, emtfNegWedges, bx);
281  splitAndConvertMuons(omtfMuons, internMuonsOmtfPos, internMuonsOmtfNeg, omtfPosWedges, omtfNegWedges, bx);
282 
283  // cancel out within the track finders:
289 
290  // cancel out between track finder acceptance overlaps:
295 
296  m_isolationUnit.extrapolateMuons(internMuonsBmtf);
297  m_isolationUnit.extrapolateMuons(internMuonsEmtfNeg);
298  m_isolationUnit.extrapolateMuons(internMuonsEmtfPos);
299  m_isolationUnit.extrapolateMuons(internMuonsOmtfNeg);
300  m_isolationUnit.extrapolateMuons(internMuonsOmtfPos);
301 
302  // the rank calculated here is used in the sort below
303  calculateRank(internMuonsBmtf);
304  calculateRank(internMuonsEmtfNeg);
305  calculateRank(internMuonsEmtfPos);
306  calculateRank(internMuonsOmtfNeg);
307  calculateRank(internMuonsOmtfPos);
308 
309  // The sort function both sorts and removes all but best "nSurvivors"
310  sortMuons(internMuonsBmtf, 8);
311  sortMuons(internMuonsOmtfPos, 4);
312  sortMuons(internMuonsOmtfNeg, 4);
313  sortMuons(internMuonsEmtfPos, 4);
314  sortMuons(internMuonsEmtfNeg, 4);
315 
316  // This combines the 5 streams into one InternalMuon collection for
317  // the final global sort.
319  addMuonsToCollections(internMuonsEmtfPos, internalMuons, imdMuonsEMTFPos, bx);
320  addMuonsToCollections(internMuonsOmtfPos, internalMuons, imdMuonsOMTFPos, bx);
321  addMuonsToCollections(internMuonsBmtf, internalMuons, imdMuonsBMTF, bx);
322  addMuonsToCollections(internMuonsOmtfNeg, internalMuons, imdMuonsOMTFNeg, bx);
323  addMuonsToCollections(internMuonsEmtfNeg, internalMuons, imdMuonsEMTFNeg, bx);
324 
325  // sort internal muons and delete all but best 8
326  sortMuons(internalMuons, 8);
327 
328  m_isolationUnit.isolatePreSummed(internalMuons);
329  // copy muons to output collection...
330  for (const auto& mu : internalMuons) {
331  if (mu->hwPt() > 0) {
333  (mu->hwPt() - 1) * 0.5, mu->hwEta() * 0.010875, mu->hwGlobalPhi() * 0.010908, 0.0};
334  int iso = mu->hwAbsIso() + (mu->hwRelIso() << 1);
335  int outMuQual = MicroGMTConfiguration::setOutputMuonQuality(mu->hwQual(), mu->trackFinderType(), mu->hwHF());
336  Muon outMu{vec,
337  mu->hwPt(),
338  mu->hwEta(),
339  mu->hwGlobalPhi(),
340  outMuQual,
341  mu->hwSign(),
342  mu->hwSignValid(),
343  iso,
344  mu->tfMuonIndex(),
345  0,
346  true,
347  mu->hwIsoSum(),
348  mu->hwDPhi(),
349  mu->hwDEta(),
350  mu->hwRank()};
351 
352  // Set coordinates at the vertex
353  outMu.setHwEtaAtVtx(MicroGMTConfiguration::calcMuonHwEtaExtra(outMu));
354  outMu.setHwPhiAtVtx(MicroGMTConfiguration::calcMuonHwPhiExtra(outMu));
355  outMu.setEtaAtVtx(MicroGMTConfiguration::calcMuonEtaExtra(outMu));
356  outMu.setPhiAtVtx(MicroGMTConfiguration::calcMuonPhiExtra(outMu));
357 
358  // Set displacement information
359  int hwPtUnconstrained{mu->hwPtUnconstrained()};
360  outMu.setPtUnconstrained(
361  hwPtUnconstrained == 0
362  ? 0
363  : (hwPtUnconstrained - 1)); // Don't want negative pT, unconstr. pT has LSB of 1 GeV.
364  outMu.setHwPtUnconstrained(hwPtUnconstrained);
365  outMu.setHwDXY(mu->hwDXY());
366 
367  if (mu->hwSignValid()) {
368  outMu.setCharge(1 - 2 * mu->hwSign());
369  } else {
370  outMu.setCharge(0);
371  }
372  m_debugOut << mu->hwCaloPhi() << " " << mu->hwCaloEta() << std::endl;
373  outMuons->push_back(bx, outMu);
374  }
375  }
376  }
377 
378  iEvent.put(std::move(outMuons));
379  iEvent.put(std::move(imdMuonsBMTF), "imdMuonsBMTF");
380  iEvent.put(std::move(imdMuonsEMTFPos), "imdMuonsEMTFPos");
381  iEvent.put(std::move(imdMuonsEMTFNeg), "imdMuonsEMTFNeg");
382  iEvent.put(std::move(imdMuonsOMTFPos), "imdMuonsOMTFPos");
383  iEvent.put(std::move(imdMuonsOMTFNeg), "imdMuonsOMTFNeg");
384 }
385 
386 bool L1TMuonProducer::compareMuons(const std::shared_ptr<MicroGMTConfiguration::InterMuon>& mu1,
387  const std::shared_ptr<MicroGMTConfiguration::InterMuon>& mu2) {
388  return (mu1->hwWins() >= mu2->hwWins());
389 }
390 
392  MicroGMTConfiguration::InterMuonList::iterator mu1;
393  // reset from previous sort stage
394  for (mu1 = muons.begin(); mu1 != muons.end(); ++mu1) {
395  (*mu1)->setHwWins(0);
396  }
397 
398  int nCancelled = 0;
399  for (mu1 = muons.begin(); mu1 != muons.end(); ++mu1) {
400  int mu1CancelBit = (*mu1)->hwCancelBit();
401  nCancelled += mu1CancelBit;
402  auto mu2 = mu1;
403  mu2++;
404  for (; mu2 != muons.end(); ++mu2) {
405  if (mu1CancelBit != 1 && (*mu2)->hwCancelBit() != 1) {
406  if ((*mu1)->hwRank() >= (*mu2)->hwRank()) {
407  (*mu1)->increaseWins();
408  } else {
409  (*mu2)->increaseWins();
410  }
411  } else if (mu1CancelBit != 1) {
412  (*mu1)->increaseWins();
413  } else if ((*mu2)->hwCancelBit() != 1) {
414  (*mu2)->increaseWins();
415  }
416  }
417  }
418 
419  size_t nMuonsBefore = muons.size();
420  int minWins = nMuonsBefore - nSurvivors;
421 
422  // remove all muons that were cancelled or that do not have sufficient rank
423  // (reduces the container size to nSurvivors)
424  muons.remove_if([&minWins](auto muon) { return ((muon->hwWins() < minWins) || (muon->hwCancelBit() == 1)); });
426 }
427 
429  for (auto& mu1 : muons) {
430  int rank = m_rankPtQualityLUT->lookup(mu1->hwPt(), mu1->hwQual());
431  mu1->setHwRank(rank);
432  }
433 }
434 
437  std::unique_ptr<MuonBxCollection>& out,
438  int bx) const {
439  for (auto& mu : coll) {
440  interout.push_back(mu);
441  math::PtEtaPhiMLorentzVector vec{(mu->hwPt() - 1) * 0.5, mu->hwEta() * 0.010875, mu->hwGlobalPhi() * 0.010908, 0.0};
442  int outMuQual = MicroGMTConfiguration::setOutputMuonQuality(mu->hwQual(), mu->trackFinderType(), mu->hwHF());
443  // set tfMuonIndex and iso to 0 like in the FW
444  Muon outMu{vec,
445  mu->hwPt(),
446  mu->hwEta(),
447  mu->hwGlobalPhi(),
448  outMuQual,
449  mu->hwSign(),
450  mu->hwSignValid(),
451  0,
452  0,
453  0,
454  true,
455  0,
456  mu->hwDPhi(),
457  mu->hwDEta(),
458  mu->hwRank()};
459 
460  int hwPtUnconstrained{mu->hwPtUnconstrained()};
461  outMu.setPtUnconstrained(hwPtUnconstrained == 0
462  ? 0
463  : (hwPtUnconstrained - 1)); // Don't want negative pT, unconstr. pT has LSB of 1 GeV.
464  outMu.setHwPtUnconstrained(hwPtUnconstrained);
465  outMu.setHwDXY(mu->hwDXY());
466 
467  if (mu->hwSignValid()) {
468  outMu.setCharge(1 - 2 * mu->hwSign());
469  } else {
470  outMu.setCharge(0);
471  }
472 
473  out->push_back(bx, outMu);
474  }
475 }
476 
480  GMTInternalWedges& wedges_pos,
481  GMTInternalWedges& wedges_neg,
482  int bx) const {
483  // initialize the wedge collections:
484  for (int i = 0; i < 6; ++i) {
485  wedges_pos[i] = std::vector<std::shared_ptr<GMTInternalMuon>>();
486  wedges_pos[i].reserve(3);
487  wedges_neg[i] = std::vector<std::shared_ptr<GMTInternalMuon>>();
488  wedges_neg[i].reserve(3);
489  }
490  if (bx < in->getFirstBX() || bx > in->getLastBX())
491  return;
492  int muIdxAuto = 0;
493  int currentLink = 0;
494  for (size_t i = 0; i < in->size(bx); ++i, ++muIdxAuto) {
495  if (in->at(bx, i).hwPt() > 0) {
496  int link = in->at(bx, i).link();
497  if (m_inputsToDisable.test(link) || m_maskedInputs.test(link)) {
498  continue; // only process if input link is enabled and not masked
499  }
500  if (currentLink != link) {
501  muIdxAuto = 0;
502  currentLink = link;
503  }
504  int gPhi = MicroGMTConfiguration::calcGlobalPhi(
505  in->at(bx, i).hwPhi(), in->at(bx, i).trackFinderType(), in->at(bx, i).processor());
506  int tfMuonIdx{computeMuonIdx(in->at(bx, i), currentLink, muIdxAuto)};
507  std::shared_ptr<GMTInternalMuon> out = std::make_shared<GMTInternalMuon>(in->at(bx, i), gPhi, tfMuonIdx);
508  if (in->at(bx, i).hwEta() > 0) {
509  out_pos.push_back(out);
510  wedges_pos[in->at(bx, i).processor()].push_back(out);
511  } else {
512  out_neg.emplace_back(out);
513  wedges_neg[in->at(bx, i).processor()].push_back(out);
514  }
515  }
516  }
517  for (int i = 0; i < 6; ++i) {
518  if (wedges_pos[i].size() > 3)
519  edm::LogWarning("Input Mismatch") << " too many inputs per processor for emtf+ / omtf+. Wedge " << i << ": Size "
520  << wedges_pos[i].size() << std::endl;
521  if (wedges_neg[i].size() > 3)
522  edm::LogWarning("Input Mismatch") << " too many inputs per processor for emtf- / omtf-. Wedge " << i << ": Size "
523  << wedges_neg[i].size() << std::endl;
524  }
525 }
526 
529  GMTInternalWedges& wedges,
530  int bx) const {
531  // initialize the wedge collection:
532  for (int i = 0; i < 12; ++i) {
533  wedges[i] = std::vector<std::shared_ptr<GMTInternalMuon>>();
534  wedges[i].reserve(3);
535  }
536  if (bx < in->getFirstBX() || bx > in->getLastBX()) {
537  return;
538  }
539  int muIdxAuto = 0;
540  int currentLink = 0;
541  for (size_t i = 0; i < in->size(bx); ++i, ++muIdxAuto) {
542  if (in->at(bx, i).hwPt() > 0) {
543  int link = in->at(bx, i).link();
544  if (m_inputsToDisable.test(link) || m_maskedInputs.test(link)) {
545  continue; // only process if input link is enabled and not masked
546  }
547  if (currentLink != link) {
548  muIdxAuto = 0;
549  currentLink = link;
550  }
551  int gPhi = MicroGMTConfiguration::calcGlobalPhi(
552  in->at(bx, i).hwPhi(), in->at(bx, i).trackFinderType(), in->at(bx, i).processor());
553  int tfMuonIdx{computeMuonIdx(in->at(bx, i), currentLink, muIdxAuto)};
554  std::shared_ptr<GMTInternalMuon> outMu = std::make_shared<GMTInternalMuon>(in->at(bx, i), gPhi, tfMuonIdx);
555  out.emplace_back(outMu);
556  wedges[in->at(bx, i).processor()].push_back(outMu);
557  }
558  }
559  for (int i = 0; i < 12; ++i) {
560  if (wedges[i].size() > 3) {
561  edm::LogWarning("Input Mismatch") << " too many inputs per processor for barrel. Wedge " << i << ": Size "
562  << wedges[i].size() << std::endl;
563  }
564  }
565 }
566 
567 int L1TMuonProducer::computeMuonIdx(const RegionalMuonCand& mu, int currentLink, int muIdxAuto) const {
568  // If the muon index was set in the data format we should use that. Otherwise we use the value computed from the position in the vector.
569  if (mu.muIdx() != -1) {
570  return 3 * (currentLink - 36) + mu.muIdx();
571  } else {
572  return 3 * (currentLink - 36) + muIdxAuto;
573  }
574 }
575 
576 // ------------ method called when starting to processes a run ------------
579 
580  std::unique_ptr<L1TMuonGlobalParams_PUBLIC> microGMTParams(
582  if (microGMTParams->pnodes_.empty()) {
584  microGMTParamsHelper = std::make_unique<L1TMuonGlobalParamsHelper>(*o2oProtoHandle.product());
585  } else
587  std::make_unique<L1TMuonGlobalParamsHelper>(cast_to_L1TMuonGlobalParams(*microGMTParams.get()));
588 
589  //microGMTParamsHelper->print(std::cout);
590  m_inputsToDisable = microGMTParamsHelper->inputsToDisable();
591  edm::LogVerbatim("L1TMuonProducer")
592  << "uGMT inputsToDisable: " << m_inputsToDisable
593  << "\n EMTF-|OMTF-| BMTF |OMTF+|EMTF+| CALO | res 0";
594  m_caloInputsToDisable = microGMTParamsHelper->caloInputsToDisable();
595  m_bmtfInputsToDisable = microGMTParamsHelper->bmtfInputsToDisable();
596  m_omtfInputsToDisable = microGMTParamsHelper->omtfInputsToDisable();
597  m_emtfInputsToDisable = microGMTParamsHelper->emtfInputsToDisable();
598  m_maskedInputs = microGMTParamsHelper->maskedInputs();
599  edm::LogVerbatim("L1TMuonProducer")
600  << "uGMT maskedInputs: " << m_maskedInputs
601  << "\n EMTF-|OMTF-| BMTF |OMTF+|EMTF+| CALO | res 0";
602  m_maskedCaloInputs = microGMTParamsHelper->maskedCaloInputs();
603  m_maskedBmtfInputs = microGMTParamsHelper->maskedBmtfInputs();
604  m_maskedOmtfInputs = microGMTParamsHelper->maskedOmtfInputs();
605  m_maskedEmtfInputs = microGMTParamsHelper->maskedEmtfInputs();
610 
611  if (m_autoCancelMode) {
612  if (microGMTParamsHelper->fwVersion() >= 0x6000000) {
614  }
615  // TODO: No decision yet on when to use EMTF track addresses for cancel-out.
616  // if (microGMTParamsHelper->fwVersion() > 0x5000000) {
617  // m_emtfCancelMode = cancelmode::tracks;
618  // }
619  }
620 }
621 
622 // ------------ method called when ending the processing of a run ------------
624 
625 // ------------ method called when starting to processes a luminosity block ------------
627 
628 // ------------ method called when ending the processing of a luminosity block ------------
630 
631 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
633  //The following says we do not know what parameters are allowed so do no validation
634  // Please change this to state exactly what you do use, even if it is no parameters
636  desc.setUnknown();
637  descriptions.addDefault(desc);
638 }
639 
640 //define this as a plug-in
size
Write out results.
const L1TMuonGlobalParams & cast_to_L1TMuonGlobalParams(const L1TMuonGlobalParams_PUBLIC &x)
int getLastBX() const
Log< level::Info, true > LogVerbatim
void beginRun(edm::Run const &, edm::EventSetup const &) override
void endLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) override
void setCancelOutBitsOverlapEndcap(GMTInternalWedges &, GMTInternalWedges &, cancelmode)
Cancel-out between overlap and endcap track finders.
int getFirstBX() const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
void extrapolateMuons(MicroGMTConfiguration::InterMuonList &) const
void initialise(L1TMuonGlobalParamsHelper *)
Initialisation from ES record.
std::ofstream m_debugOut
void setCancelOutBitsOverlapBarrel(GMTInternalWedges &, GMTInternalWedges &, cancelmode)
Cancel-out between overlap and barrel track finders.
edm::EDGetTokenT< MicroGMTConfiguration::InputCollection > m_endcapTfInputToken
std::unique_ptr< L1TMuonGlobalParamsHelper > microGMTParamsHelper
std::bitset< 12 > m_bmtfInputsToDisable
void convertMuons(edm::Handle< MicroGMTConfiguration::InputCollection > const &in, MicroGMTConfiguration::InterMuonList &out, GMTInternalWedges &wedges, int bx) const
void setTowerSums(const MicroGMTConfiguration::CaloInputCollection &inputs, int bx)
int computeMuonIdx(const RegionalMuonCand &mu, int currentLink, int muIdxAuto) const
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
edm::EDGetTokenT< MicroGMTConfiguration::InputCollection > m_overlapTfInputToken
edm::EDGetTokenT< MicroGMTConfiguration::CaloInputCollection > m_caloTowerInputToken
MicroGMTIsolationUnit m_isolationUnit
delete x;
Definition: CaloConfig.h:22
l1t::cancelmode m_emtfCancelMode
edm::ESGetToken< L1TMuonGlobalParams, L1TMuonGlobalParamsO2ORcd > m_o2oProtoToken
void calculateRank(MicroGMTConfiguration::InterMuonList &muons) const
std::shared_ptr< MicroGMTRankPtQualLUT > m_rankPtQualityLUT
void isolatePreSummed(MicroGMTConfiguration::InterMuonList &muons) const
void sortMuons(MicroGMTConfiguration::InterMuonList &, unsigned) const
PtEtaPhiMLorentzVectorD PtEtaPhiMLorentzVector
Lorentz vector with cartesian internal representation.
Definition: LorentzVector.h:25
static ReturnType create(const std::string &filename, const int fwVersion, const unsigned ptFactor, const unsigned qualFactor)
edm::InputTag m_overlapTfInputTag
std::bitset< 12 > m_emtfInputsToDisable
int iEvent
Definition: GenABIO.cc:224
T const * product() const
Definition: ESHandle.h:86
void addDefault(ParameterSetDescription const &psetDescription)
Definition: Muon.py:1
void addMuonsToCollections(MicroGMTConfiguration::InterMuonList &coll, MicroGMTConfiguration::InterMuonList &interout, std::unique_ptr< MuonBxCollection > &out, int bx) const
void endRun(edm::Run const &, edm::EventSetup const &) override
void splitAndConvertMuons(edm::Handle< MicroGMTConfiguration::InputCollection > const &in, MicroGMTConfiguration::InterMuonList &out_pos, MicroGMTConfiguration::InterMuonList &out_neg, GMTInternalWedges &wedges_pos, GMTInternalWedges &wedges_neg, int bx) const
GMTInternalMuonList InterMuonList
edm::InputTag m_barrelTfInputTag
ESHandle< T > getHandle(const ESGetToken< T, R > &iToken) const
Definition: EventSetup.h:151
edm::InputTag m_endcapTfInputTag
void produce(edm::Event &, const edm::EventSetup &) override
std::bitset< 12 > m_maskedBmtfInputs
BXVector< Muon > MuonBxCollection
Definition: Muon.h:11
void setCancelOutBits(GMTInternalWedges &, tftype, cancelmode)
Cancel out between sectors/wedges in one track finder.
auto const & tracks
cannot be loose
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
~L1TMuonProducer() override
edm::ESGetToken< L1TMuonGlobalParams, L1TMuonGlobalParamsRcd > m_microGMTParamsToken
edm::EDGetTokenT< MicroGMTConfiguration::InputCollection > m_barrelTfInputToken
HLT enums.
void beginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) override
std::bitset< 12 > m_maskedEmtfInputs
const L1TMuonGlobalParams_PUBLIC & cast_to_L1TMuonGlobalParams_PUBLIC(const L1TMuonGlobalParams &x)
l1t::cancelmode m_bmtfCancelMode
static bool compareMuons(const std::shared_ptr< MicroGMTConfiguration::InterMuon > &mu1, const std::shared_ptr< MicroGMTConfiguration::InterMuon > &mu2)
std::map< int, std::vector< std::shared_ptr< GMTInternalMuon > > > GMTInternalWedges
std::bitset< 72 > m_maskedInputs
std::bitset< 12 > m_maskedOmtfInputs
std::bitset< 72 > m_inputsToDisable
std::bitset< 28 > m_caloInputsToDisable
L1TMuonProducer(const edm::ParameterSet &)
std::bitset< 12 > m_omtfInputsToDisable
Log< level::Warning, false > LogWarning
MicroGMTCancelOutUnit m_cancelOutUnit
void initialise(L1TMuonGlobalParamsHelper *)
Initialisation from ES record.
edm::InputTag m_trigTowerTag
def move(src, dest)
Definition: eostools.py:511
Definition: Run.h:45
std::bitset< 28 > m_maskedCaloInputs