CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
21 // system include files
22 #include <memory>
23 #include <fstream>
24 #include <sstream>
25 
26 // user include files
31 
34 
36 
43 
47 
50 
51 #include "TMath.h"
52 //
53 // class declaration
54 //
55 using namespace l1t;
56 
58  public:
59  explicit L1TMuonProducer(const edm::ParameterSet&);
60  ~L1TMuonProducer();
61 
62  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
63 
64  private:
65  virtual void beginJob() ;
66  virtual void produce(edm::Event&, const edm::EventSetup&);
67  virtual void endJob() ;
68 
69  virtual void beginRun(edm::Run const&, edm::EventSetup const&);
70  virtual void endRun(edm::Run const&, edm::EventSetup const&);
71  virtual void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&);
72  virtual void endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&);
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 
88  void convertMuons(edm::Handle<MicroGMTConfiguration::InputCollection> const& in,
90  GMTInternalWedges& wedges,
91  int bx) const;
92 
93  void addMuonsToCollections(MicroGMTConfiguration::InterMuonList& coll,
95  std::auto_ptr<MuonBxCollection>& out,
96  int bx) const;
97 
98  // ----------member data ---------------------------
99  int m_bxMin;
100  int m_bxMax;
101  std::unique_ptr<L1TMuonGlobalParams> microGMTParams;
106  std::shared_ptr<MicroGMTRankPtQualLUT> m_rankPtQualityLUT;
109  std::ofstream m_debugOut;
110 
115 
116  };
117 
118 //
119 // constants, enums and typedefs
120 //
121 
122 
123 //
124 // static data member definitions
125 //
126 
127 //
128 // constructors and destructor
129 //
130 L1TMuonProducer::L1TMuonProducer(const edm::ParameterSet& iConfig) : m_debugOut("test/debug/iso_debug.dat")
131 {
132  // edm::InputTag barrelTfInputTag = iConfig.getParameter<edm::InputTag>("barrelTFInput");
133  // edm::InputTag overlapTfInputTag = iConfig.getParameter<edm::InputTag>("overlapTFInput");
134  // edm::InputTag forwardTfInputTag = iConfig.getParameter<edm::InputTag>("forwardTFInput");
135 
136  m_barrelTfInputTag = iConfig.getParameter<edm::InputTag>("barrelTFInput");
137  m_overlapTfInputTag = iConfig.getParameter<edm::InputTag>("overlapTFInput");
138  m_endcapTfInputTag = iConfig.getParameter<edm::InputTag>("forwardTFInput");
139  m_trigTowerTag = iConfig.getParameter<edm::InputTag>("triggerTowerInput");
140 
141  m_barrelTfInputToken = consumes<MicroGMTConfiguration::InputCollection>(m_barrelTfInputTag);
142  m_overlapTfInputToken = consumes<MicroGMTConfiguration::InputCollection>(m_overlapTfInputTag);
143  m_endcapTfInputToken = consumes<MicroGMTConfiguration::InputCollection>(m_endcapTfInputTag);
144  m_caloTowerInputToken = consumes<MicroGMTConfiguration::CaloInputCollection>(m_trigTowerTag);
145 
146  //register your products
147  produces<MuonBxCollection>();
148  produces<MuonBxCollection>("imdMuonsBMTF");
149  produces<MuonBxCollection>("imdMuonsEMTFPos");
150  produces<MuonBxCollection>("imdMuonsEMTFNeg");
151  produces<MuonBxCollection>("imdMuonsOMTFPos");
152  produces<MuonBxCollection>("imdMuonsOMTFNeg");
153 }
154 
156 {
157  m_debugOut.close();
158 }
159 
160 
161 //
162 // member functions
163 //
164 
165 
166 
167 // ------------ method called to produce the data ------------
168 void
170 {
171  using namespace edm;
172  std::auto_ptr<MuonBxCollection> outMuons (new MuonBxCollection());
173  std::auto_ptr<MuonBxCollection> imdMuonsBMTF (new MuonBxCollection());
174  std::auto_ptr<MuonBxCollection> imdMuonsEMTFPos (new MuonBxCollection());
175  std::auto_ptr<MuonBxCollection> imdMuonsEMTFNeg (new MuonBxCollection());
176  std::auto_ptr<MuonBxCollection> imdMuonsOMTFPos (new MuonBxCollection());
177  std::auto_ptr<MuonBxCollection> imdMuonsOMTFNeg (new MuonBxCollection());
178 
179 
184 
185  iEvent.getByToken(m_barrelTfInputToken, bmtfMuons);
186  iEvent.getByToken(m_endcapTfInputToken, emtfMuons);
187  iEvent.getByToken(m_overlapTfInputToken, omtfMuons);
188  iEvent.getByToken(m_caloTowerInputToken, trigTowers);
189 
190  // set BX range for outputs
191  outMuons->setBXRange(m_bxMin, m_bxMax);
192  imdMuonsBMTF->setBXRange(m_bxMin, m_bxMax);
193  imdMuonsEMTFPos->setBXRange(m_bxMin, m_bxMax);
194  imdMuonsEMTFNeg->setBXRange(m_bxMin, m_bxMax);
195  imdMuonsOMTFPos->setBXRange(m_bxMin, m_bxMax);
196  imdMuonsOMTFNeg->setBXRange(m_bxMin, m_bxMax);
197 
198  for (int bx = m_bxMin; bx <= m_bxMax; ++bx) {
199  m_isolationUnit.setTowerSums(*trigTowers, bx);
200  MicroGMTConfiguration::InterMuonList internMuonsBmtf;
201  MicroGMTConfiguration::InterMuonList internMuonsEmtfPos;
202  MicroGMTConfiguration::InterMuonList internMuonsEmtfNeg;
203  MicroGMTConfiguration::InterMuonList internMuonsOmtfPos;
204  MicroGMTConfiguration::InterMuonList internMuonsOmtfNeg;
205 
206  // These wedges contain shared pointers to the ones in the InterMuonList
207  GMTInternalWedges omtfNegWedges;
208  GMTInternalWedges bmtfWedges;
209  GMTInternalWedges emtfPosWedges;
210  GMTInternalWedges emtfNegWedges;
211  GMTInternalWedges omtfPosWedges;
212 
213  // this converts the InputMuon type to the InternalMuon type and splits them into
214  // positive / negative eta collections necessary as LUTs may differ for pos / neg.
215  convertMuons(bmtfMuons, internMuonsBmtf, bmtfWedges, bx);
216  splitAndConvertMuons(emtfMuons, internMuonsEmtfPos, internMuonsEmtfNeg, emtfPosWedges, emtfNegWedges, bx);
217  splitAndConvertMuons(omtfMuons, internMuonsOmtfPos, internMuonsOmtfNeg, omtfPosWedges, omtfNegWedges, bx);
218 
219  // cancel out within the track finders:
223  // cancel-out for endcap will be done in the sorter
226 
227  // cancel out between track finder acceptance overlaps:
232 
233  m_isolationUnit.extrapolateMuons(internMuonsBmtf);
234  m_isolationUnit.extrapolateMuons(internMuonsEmtfNeg);
235  m_isolationUnit.extrapolateMuons(internMuonsEmtfPos);
236  m_isolationUnit.extrapolateMuons(internMuonsOmtfNeg);
237  m_isolationUnit.extrapolateMuons(internMuonsOmtfPos);
238 
239  // the rank calculated here is used in the sort below
240  calculateRank(internMuonsBmtf);
241  calculateRank(internMuonsEmtfNeg);
242  calculateRank(internMuonsEmtfPos);
243  calculateRank(internMuonsOmtfNeg);
244  calculateRank(internMuonsOmtfPos);
245 
246  // The sort function both sorts and removes all but best "nSurvivors"
247  sortMuons(internMuonsBmtf, 8);
248  sortMuons(internMuonsOmtfPos, 4);
249  sortMuons(internMuonsOmtfNeg, 4);
250  sortMuons(internMuonsEmtfPos, 4);
251  sortMuons(internMuonsEmtfNeg, 4);
252 
253  // This combines the 5 streams into one InternalMuon collection for
254  // the final global sort.
256  addMuonsToCollections(internMuonsEmtfPos, internalMuons, imdMuonsEMTFPos, bx);
257  addMuonsToCollections(internMuonsOmtfPos, internalMuons, imdMuonsOMTFPos, bx);
258  addMuonsToCollections(internMuonsBmtf, internalMuons, imdMuonsBMTF, bx);
259  addMuonsToCollections(internMuonsOmtfNeg, internalMuons, imdMuonsOMTFNeg, bx);
260  addMuonsToCollections(internMuonsEmtfNeg, internalMuons, imdMuonsEMTFNeg, bx);
261 
262  // sort internal muons and delete all but best 8
263  sortMuons(internalMuons, 8);
264 
265  m_isolationUnit.isolatePreSummed(internalMuons);
266  // copy muons to output collection...
267  for (const auto& mu : internalMuons) {
268  if (mu->hwPt() > 0) {
269  math::PtEtaPhiMLorentzVector vec{(mu->hwPt()-1)*0.5, mu->hwEta()*0.010875, mu->hwGlobalPhi()*0.010908, 0.0};
270  int iso = mu->hwAbsIso() + (mu->hwRelIso() << 1);
271  Muon outMu{vec, mu->hwPt(), mu->hwEta(), mu->hwGlobalPhi(), mu->hwQual(), mu->hwSign(), mu->hwSignValid(), iso, -1, 0, true, mu->hwIsoSum(), mu->hwDPhi(), mu->hwDEta(), mu->hwRank()};
272  if (mu->hwSignValid()) {
273  outMu.setCharge(1 - 2 * mu->hwSign());
274  } else {
275  outMu.setCharge(0);
276  }
277  m_debugOut << mu->hwCaloPhi() << " " << mu->hwCaloEta() << std::endl;
278  outMuons->push_back(bx, outMu);
279  }
280  }
281  }
282 
283  iEvent.put(outMuons);
284  iEvent.put(imdMuonsBMTF, "imdMuonsBMTF");
285  iEvent.put(imdMuonsEMTFPos, "imdMuonsEMTFPos");
286  iEvent.put(imdMuonsEMTFNeg, "imdMuonsEMTFNeg");
287  iEvent.put(imdMuonsOMTFPos, "imdMuonsOMTFPos");
288  iEvent.put(imdMuonsOMTFNeg, "imdMuonsOMTFNeg");
289 }
290 
291 
292 bool
293 L1TMuonProducer::compareMuons(const std::shared_ptr<MicroGMTConfiguration::InterMuon>& mu1,
294  const std::shared_ptr<MicroGMTConfiguration::InterMuon>& mu2) {
295  return (mu1->hwWins() >= mu2->hwWins());
296 }
297 
298 void
300  MicroGMTConfiguration::InterMuonList::iterator mu1;
301  // reset from previous sort stage
302  for (mu1 = muons.begin(); mu1 != muons.end(); ++mu1) {
303  (*mu1)->setHwWins(0);
304  }
305 
306  int nCancelled = 0;
307  for (mu1 = muons.begin(); mu1 != muons.end(); ++mu1) {
308  int mu1CancelBit = (*mu1)->hwCancelBit();
309  nCancelled += mu1CancelBit;
310  auto mu2 = mu1;
311  mu2++;
312  for ( ; mu2 != muons.end(); ++mu2) {
313  if (mu1CancelBit != 1 && (*mu2)->hwCancelBit() != 1) {
314  if ((*mu1)->hwRank() >= (*mu2)->hwRank()) {
315  (*mu1)->increaseWins();
316  } else {
317  (*mu2)->increaseWins();
318  }
319  } else if (mu1CancelBit != 1) {
320  (*mu1)->increaseWins();
321  } else if ((*mu2)->hwCancelBit() != 1) {
322  (*mu2)->increaseWins();
323  }
324  }
325  }
326 
327  size_t nMuonsBefore = muons.size();
328  int minWins = nMuonsBefore - nCancelled - nSurvivors;
329 
330  // remove all muons that were cancelled or that do not have sufficient rank
331  // (reduces the container size to nSurvivors)
332  mu1 = muons.begin();
333  while (mu1 != muons.end()) {
334  if ((*mu1)->hwWins() < minWins || (*mu1)->hwCancelBit() == 1) {
335  muons.erase(mu1);
336  }
337  ++mu1;
338  }
339  muons.sort(L1TMuonProducer::compareMuons);
340 }
341 
342 
343 
344 void
346 {
347  for (auto& mu1 : muons) {
348  int rank = m_rankPtQualityLUT->lookup(mu1->hwPt(), mu1->hwQual());
349  mu1->setHwRank(rank);
350  }
351 }
352 
353 
354 void
357  std::auto_ptr<MuonBxCollection>& out, int bx) const
358 {
359  for (auto& mu : coll) {
360  interout.push_back(mu);
361  math::PtEtaPhiMLorentzVector vec{(mu->hwPt()-1)*0.5, mu->hwEta()*0.010875, mu->hwGlobalPhi()*0.010908, 0.0};
362  // FIXME: once we debugged the change global -> local: Change hwLocalPhi -> hwGlobalPhi to test offsets
363  // FIXME: set tfMuonIndex to actual index
364  Muon outMu{vec, mu->hwPt(), mu->hwEta(), mu->hwGlobalPhi(), mu->hwQual(), mu->hwSign(), mu->hwSignValid(), -1, -1, 0, true, -1, mu->hwDPhi(), mu->hwDEta(), mu->hwRank()};
365  if (mu->hwSignValid()) {
366  outMu.setCharge(1 - 2 * mu->hwSign());
367  } else {
368  outMu.setCharge(0);
369  }
370 
371  out->push_back(bx, outMu);
372  }
373 }
374 
375 void
379  GMTInternalWedges& wedges_pos,
380  GMTInternalWedges& wedges_neg,
381  int bx) const
382 {
383  // initialize the wedge collections:
384  for (int i = 0; i < 6; ++i) {
385  wedges_pos[i] = std::vector<std::shared_ptr<GMTInternalMuon>>();
386  wedges_pos[i].reserve(3);
387  wedges_neg[i] = std::vector<std::shared_ptr<GMTInternalMuon>>();
388  wedges_neg[i].reserve(3);
389  }
390  if (bx < in->getFirstBX() || bx > in->getLastBX()) return;
391  for (size_t i = 0; i < in->size(bx); ++i) {
392  int gPhi = MicroGMTConfiguration::calcGlobalPhi(in->at(bx, i).hwPhi(), in->at(bx, i).trackFinderType(), in->at(bx, i).processor());
393  std::shared_ptr<GMTInternalMuon> out = std::make_shared<GMTInternalMuon>(in->at(bx, i), gPhi);
394  if(in->at(bx, i).hwEta() > 0) {
395  out_pos.push_back(out);
396  wedges_pos[in->at(bx, i).processor()].push_back(out);
397  } else {
398  out_neg.emplace_back(out);
399  wedges_neg[in->at(bx, i).processor()].push_back(out);
400  }
401  }
402  for (int i = 0; i < 6; ++i) {
403  if(wedges_pos[i].size() > 3) edm::LogWarning("Input Mismatch") << " too many inputs per processor for emtf+ / omtf+. Wedge " << i << ": Size " << wedges_pos[i].size() << std::endl;
404  if(wedges_neg[i].size() > 3) edm::LogWarning("Input Mismatch") << " too many inputs per processor for emtf- / omtf-. Wedge " << i << ": Size " << wedges_neg[i].size() << std::endl;
405  }
406 }
407 
408 void
411  GMTInternalWedges& wedges, int bx) const
412 {
413  // initialize the wedge collection:
414  for (int i = 0; i < 12; ++i) {
415  wedges[i] = std::vector<std::shared_ptr<GMTInternalMuon>>();
416  wedges[i].reserve(3);
417  }
418  if (bx < in->getFirstBX() || bx > in->getLastBX()) return;
419  for (size_t i = 0; i < in->size(bx); ++i) {
420  int gPhi = MicroGMTConfiguration::calcGlobalPhi(in->at(bx, i).hwPhi(), in->at(bx, i).trackFinderType(), in->at(bx, i).processor());
421  std::shared_ptr<GMTInternalMuon> outMu = std::make_shared<GMTInternalMuon>(in->at(bx, i), gPhi);
422  out.emplace_back(outMu);
423  wedges[in->at(bx, i).processor()].push_back(outMu);
424  }
425  for (int i = 0; i < 12; ++i) {
426  if(wedges[i].size() > 3) edm::LogWarning("Input Mismatch") << " too many inputs per processor for barrel. Wedge " << i << ": Size " << wedges[i].size() << std::endl;
427  }
428 }
429 
430 // ------------ method called once each job just before starting event loop ------------
431 void
433 {
434 }
435 
436 // ------------ method called once each job just after ending the event loop ------------
437 void
439 }
440 
441 // ------------ method called when starting to processes a run ------------
442 void
444 {
445  const L1TMuonGlobalParamsRcd& microGMTParamsRcd = iSetup.get<L1TMuonGlobalParamsRcd>();
446  edm::ESHandle<L1TMuonGlobalParams> microGMTParamsHandle;
447  microGMTParamsRcd.get(microGMTParamsHandle);
448 
449  microGMTParams = std::unique_ptr<L1TMuonGlobalParams>(new L1TMuonGlobalParams(*microGMTParamsHandle.product()));
450  if (!microGMTParams) {
451  edm::LogError("L1TMuonProducer") << "Could not retrieve parameters from Event Setup" << std::endl;
452  }
453 
454  //microGMTParams->print(std::cout);
455  m_bxMin = microGMTParams->bxMin();
456  m_bxMax = microGMTParams->bxMax();
457  m_rankPtQualityLUT = l1t::MicroGMTRankPtQualLUTFactory::create(microGMTParams->sortRankLUTPath(), microGMTParams->fwVersion(), microGMTParams->sortRankLUTPtFactor(), microGMTParams->sortRankLUTQualFactor());
460 }
461 
462 // ------------ method called when ending the processing of a run ------------
463 void
465 {
466 }
467 
468 // ------------ method called when starting to processes a luminosity block ------------
469 void
471 {
472 }
473 
474 // ------------ method called when ending the processing of a luminosity block ------------
475 void
477 {
478 }
479 
480 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
481 void
483  //The following says we do not know what parameters are allowed so do no validation
484  // Please change this to state exactly what you do use, even if it is no parameters
486  desc.setUnknown();
487  descriptions.addDefault(desc);
488 }
489 
490 //define this as a plug-in
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
void extrapolateMuons(MicroGMTConfiguration::InterMuonList &) const
void setCancelOutBitsOverlapEndcap(GMTInternalWedges &, GMTInternalWedges &, cancelmode)
Cancel-out between overlap and endcap track finders.
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::ofstream m_debugOut
void setCancelOutBitsOverlapBarrel(GMTInternalWedges &, GMTInternalWedges &, cancelmode)
Cancel-out between overlap and barrel track finders.
edm::EDGetTokenT< MicroGMTConfiguration::InputCollection > m_endcapTfInputToken
virtual void beginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &)
virtual void endJob()
void convertMuons(edm::Handle< MicroGMTConfiguration::InputCollection > const &in, MicroGMTConfiguration::InterMuonList &out, GMTInternalWedges &wedges, int bx) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:462
void initialise(L1TMuonGlobalParams *)
Initialisation from ES record.
void setTowerSums(const MicroGMTConfiguration::CaloInputCollection &inputs, int bx)
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
edm::EDGetTokenT< MicroGMTConfiguration::InputCollection > m_overlapTfInputToken
edm::EDGetTokenT< MicroGMTConfiguration::CaloInputCollection > m_caloTowerInputToken
MicroGMTIsolationUnit m_isolationUnit
virtual void endRun(edm::Run const &, edm::EventSetup const &)
void beginJob()
Definition: Breakpoints.cc:15
virtual void produce(edm::Event &, const edm::EventSetup &)
std::shared_ptr< MicroGMTRankPtQualLUT > m_rankPtQualityLUT
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
int iEvent
Definition: GenABIO.cc:230
void addDefault(ParameterSetDescription const &psetDescription)
virtual void beginJob()
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:121
void calculateRank(MicroGMTConfiguration::InterMuonList &muons) const
void get(HolderT &iHolder) const
void sortMuons(MicroGMTConfiguration::InterMuonList &, unsigned) const
void initialise(L1TMuonGlobalParams *)
Initialisation from ES record.
const int mu
Definition: Constants.h:22
GMTInternalMuonList InterMuonList
edm::InputTag m_barrelTfInputTag
edm::InputTag m_endcapTfInputTag
virtual void endLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &)
Definition: Muon.h:16
void addMuonsToCollections(MicroGMTConfiguration::InterMuonList &coll, MicroGMTConfiguration::InterMuonList &interout, std::auto_ptr< MuonBxCollection > &out, int bx) const
BXVector< Muon > MuonBxCollection
Definition: Muon.h:10
void setCancelOutBits(GMTInternalWedges &, tftype, cancelmode)
Cancel out between sectors/wedges in one track finder.
JetCorrectorParametersCollection coll
Definition: classes.h:10
tuple tracks
Definition: testEve_cfg.py:39
const T & get() const
Definition: EventSetup.h:56
edm::EDGetTokenT< MicroGMTConfiguration::InputCollection > m_barrelTfInputToken
tuple muons
Definition: patZpeak.py:38
static bool compareMuons(const std::shared_ptr< MicroGMTConfiguration::InterMuon > &mu1, const std::shared_ptr< MicroGMTConfiguration::InterMuon > &mu2)
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
std::map< int, std::vector< std::shared_ptr< GMTInternalMuon > > > GMTInternalWedges
L1TMuonProducer(const edm::ParameterSet &)
std::unique_ptr< L1TMuonGlobalParams > microGMTParams
MicroGMTCancelOutUnit m_cancelOutUnit
edm::InputTag m_trigTowerTag
void isolatePreSummed(MicroGMTConfiguration::InterMuonList &muons) const
virtual void beginRun(edm::Run const &, edm::EventSetup const &)
tuple size
Write out results.
Definition: Run.h:43