CMS 3D CMS Logo

L1MuBMTrackFinder.cc
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
3 // Class: L1MuBMTrackFinder
4 //
5 // Description: L1 barrel Muon Trigger Track Finder
6 //
7 //
8 //
9 // Author :
10 // N. Neumeister CERN EP
11 // J. Troconiz UAM Madrid
12 // Modifications:
13 // G. Flouris U.Ioannina
14 // G. Karathanasis U. Athens
15 //--------------------------------------------------
16 
17 //-----------------------
18 // This Class's Header --
19 //-----------------------
20 
22 
23 //---------------
24 // C++ Headers --
25 //---------------
26 
27 #include <iostream>
28 #include <string>
29 
30 //-------------------------------
31 // Collaborating Class Headers --
32 //-------------------------------
33 
36 
43 
49 
50 using namespace std;
51 
52 //---------------------------------
53 // class L1MuBMTrackFinder
54 //---------------------------------
55 
56 //----------------
57 // Constructors --
58 //----------------
59 //:
61  : _cache0(144, -9, 8), _cache(36, -9, 8) {
62  // set configuration parameters
63  if (not m_config) {
64  auto temp = std::make_shared<L1MuBMTFConfig>(ps);
65  std::shared_ptr<L1MuBMTFConfig> empty;
66  std::atomic_compare_exchange_strong(&m_config, &empty, temp);
67  }
68 
69  if (L1MuBMTFConfig::Debug(1))
70  cout << endl;
71  if (L1MuBMTFConfig::Debug(1))
72  cout << "**** entering L1MuBMTrackFinder ****" << endl;
73  if (L1MuBMTFConfig::Debug(1))
74  cout << endl;
75 
76  m_spmap = new L1MuBMSecProcMap();
77  m_epvec.reserve(12);
78  m_wsvec.reserve(12);
79  m_ms = nullptr;
80 
82  m_mbParamsToken = iC.esConsumes();
83 }
84 
85 //--------------
86 // Destructor --
87 //--------------
88 
90  delete m_spmap;
91 
92  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
93  while (it_ep != m_epvec.end()) {
94  delete (*it_ep);
95  it_ep++;
96  }
97  m_epvec.clear();
98 
99  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
100  while (it_ws != m_wsvec.end()) {
101  delete (*it_ws);
102  it_ws++;
103  }
104  m_wsvec.clear();
105 
106  delete m_ms;
107 }
108 
109 //--------------
110 // Operations --
111 //--------------
112 
113 //
114 // setup MTTF configuration
115 //
117  // build the barrel Muon Trigger Track Finder
118 
119  if (L1MuBMTFConfig::Debug(1))
120  cout << endl;
121  if (L1MuBMTFConfig::Debug(1))
122  cout << "**** L1MuBMTrackFinder building ****" << endl;
123  if (L1MuBMTFConfig::Debug(1))
124  cout << endl;
125 
126  // create new sector processors
127  for (int wh = -3; wh <= 3; wh++) {
128  if (wh == 0)
129  continue;
130  for (int sc = 0; sc < 12; sc++) {
131  L1MuBMSecProcId tmpspid(wh, sc);
132  L1MuBMSectorProcessor* sp = new L1MuBMSectorProcessor(*this, tmpspid, std::move(iC));
133  if (L1MuBMTFConfig::Debug(2))
134  cout << "creating " << tmpspid << endl;
135  m_spmap->insert(tmpspid, sp);
136  }
137  }
138 
139  // create new eta processors and wedge sorters
140  for (int sc = 0; sc < 12; sc++) {
141  L1MuBMEtaProcessor* ep = new L1MuBMEtaProcessor(*this, sc, std::move(iC));
142  if (L1MuBMTFConfig::Debug(2))
143  cout << "creating Eta Processor " << sc << endl;
144  m_epvec.push_back(ep);
145  L1MuBMWedgeSorter* ws = new L1MuBMWedgeSorter(*this, sc);
146  if (L1MuBMTFConfig::Debug(2))
147  cout << "creating Wedge Sorter " << sc << endl;
148  m_wsvec.push_back(ws);
149  }
150 
151  // create new muon sorter
152  if (L1MuBMTFConfig::Debug(2))
153  cout << "creating BM Muon Sorter " << endl;
154  m_ms = new L1MuBMMuonSorter(*this);
155 }
156 
157 //
158 // run MTTF
159 //
161  m_config->setDefaultsES(c.getData(m_mbParamsToken));
162  int bx_min = L1MuBMTFConfig::getBxMin();
163  int bx_max = L1MuBMTFConfig::getBxMax();
164 
165  //Resize the bx range according to the config file
166  _cache0.setBXRange(bx_min, bx_max);
167  _cache.setBXRange(bx_min, bx_max);
168 
169  // run the barrel Muon Trigger Track Finder
171  e.getByToken(m_DTDigiToken, dttrig);
172  if (dttrig->getContainer()->empty())
173  return;
174 
175  if (L1MuBMTFConfig::Debug(2))
176  cout << endl;
177  if (L1MuBMTFConfig::Debug(2))
178  cout << "**** L1MuBMTrackFinder processing ------****" << endl;
179  if (L1MuBMTFConfig::Debug(2))
180  cout << endl;
181 
182  for (int bx = bx_min; bx <= bx_max; bx++) {
183  if (dttrig->bxEmpty(bx))
184  continue;
185 
186  if (L1MuBMTFConfig::Debug(2))
187  cout << "L1MuBMTrackFinder processing bunch-crossing : " << bx << endl;
188 
189  // reset MTTF
190  reset();
191 
192  // run sector processors
194  while (it_sp != m_spmap->end()) {
195  if (L1MuBMTFConfig::Debug(2))
196  cout << "running " << (*it_sp).second->id() << endl;
197  if ((*it_sp).second)
198  (*it_sp).second->run(bx, e, c);
199  if (L1MuBMTFConfig::Debug(2) && (*it_sp).second)
200  (*it_sp).second->print();
201  it_sp++;
202  }
203 
204  // run eta processors
205  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
206  while (it_ep != m_epvec.end()) {
207  if (L1MuBMTFConfig::Debug(2))
208  cout << "running Eta Processor " << (*it_ep)->id() << endl;
209  if (*it_ep)
210  (*it_ep)->run(bx, e, c);
211  if (L1MuBMTFConfig::Debug(2) && *it_ep)
212  (*it_ep)->print();
213  it_ep++;
214  }
215 
216  // read sector processors
217  it_sp = m_spmap->begin();
218  while (it_sp != m_spmap->end()) {
219  if (L1MuBMTFConfig::Debug(2))
220  cout << "reading " << (*it_sp).second->id() << endl;
221  for (int number = 0; number < 2; number++) {
222  const L1MuBMTrack* cand = (*it_sp).second->tracK(number);
223 
224  if (cand && !cand->empty()) {
226 
227  // max value in LUTs is 117
228  if (cand->hwEta() > -117 || cand->hwEta() < 117)
229  rmc.setHwEta(cand->hwEta());
230  else
231  rmc.setHwEta(-1000);
232 
233  rmc.setHwPt(cand->pt());
234  int abs_add_1 = setAdd(1, cand->address(1));
235  int abs_add_2 = setAdd(2, cand->address(2));
236  int abs_add_3 = setAdd(3, cand->address(3));
237  int abs_add_4 = setAdd(4, cand->address(4));
238 
239  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, cand->spid().wheel() < 0); // this has to be set!
241  abs(cand->spid().wheel()) - 1); // this has to be set!
250  rmc.setHwHF(cand->hwHF());
251 
252  rmc.setHwPhi(cand->hwPhi());
253  rmc.setHwSign(cand->hwSign() == 1 ? 0 : 1);
254  rmc.setHwSignValid(cand->hwSignValid());
255  rmc.setHwQual(cand->hwQual());
256  rmc.setTFIdentifiers(cand->spid().sector(), l1t::tftype::bmtf);
257 
258  _cache0.push_back(cand->bx(), rmc);
259  _cache2.insert(std::end(_cache2), std::begin(cand->getTSphi()), std::end(cand->getTSphi()));
260  _cache3.insert(std::end(_cache3), std::begin(cand->getTSeta()), std::end(cand->getTSeta()));
261  }
262  }
263  it_sp++;
264  }
265 
266  // run wedge sorters
267  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
268  while (it_ws != m_wsvec.end()) {
269  if (L1MuBMTFConfig::Debug(2))
270  cout << "running Wedge Sorter " << (*it_ws)->id() << endl;
271  if (*it_ws)
272  (*it_ws)->run();
273  if (L1MuBMTFConfig::Debug(2) && *it_ws)
274  (*it_ws)->print();
275 
276  // store found track candidates in container (cache)
277  if ((*it_ws)->anyMuonCands()) {
278  const vector<const L1MuBMTrack*>& mttf_cont = (*it_ws)->tracks();
279 
280  vector<const L1MuBMTrack*>::const_iterator iter;
281  for (iter = mttf_cont.begin(); iter != mttf_cont.end(); iter++) {
282  if (!*iter)
283  continue;
285  rmc.setHwPt((*iter)->hwPt());
286  int abs_add_1 = setAdd(1, (*iter)->address(1));
287  int abs_add_2 = setAdd(2, (*iter)->address(2));
288  int abs_add_3 = setAdd(3, (*iter)->address(3));
289  int abs_add_4 = setAdd(4, (*iter)->address(4));
290 
292  (*iter)->spid().wheel() < 0); // this has to be set!
294  abs((*iter)->spid().wheel()) - 1); // this has to be set!
303  rmc.setHwHF((*iter)->hwHF());
304 
305  rmc.setHwPhi((*iter)->hwPhi());
306  if ((*iter)->hwEta() > -117 || (*iter)->hwEta() < 117)
307  // rmc.setHwEta(eta_map[(*iter)->hwEta()]);
308  rmc.setHwEta((*iter)->hwEta());
309  else
310  rmc.setHwEta(-1000);
311  rmc.setHwSign((*iter)->hwSign() == 1 ? 0 : 1);
312  rmc.setHwSignValid((*iter)->hwSignValid());
313  rmc.setHwQual((*iter)->hwQual());
314  rmc.setTFIdentifiers((*iter)->spid().sector(), l1t::tftype::bmtf);
315 
316  if (*iter) {
317  _cache.push_back((*iter)->bx(), rmc);
318  _cache1.push_back(**iter);
319  }
320  }
321  }
322 
323  it_ws++;
324 
325  } //end wedge sorting
326 
327  /* // run muon sorter
328  if ( L1MuBMTFConfig::Debug(2) ) cout << "running BM Muon Sorter" << endl;
329  if ( m_ms ) m_ms->run();
330  if ( L1MuBMTFConfig::Debug(2) && m_ms ) m_ms->print();
331 
332 
333  // store found track candidates in container (cache)
334  if ( m_ms->numberOfTracks() > 0 ) {
335  const vector<const L1MuBMTrack*>& mttf_cont = m_ms->tracks();
336  vector<const L1MuBMTrack*>::const_iterator iter;
337  for ( iter = mttf_cont.begin(); iter != mttf_cont.end(); iter++ ) {
338 
339  l1t::RegionalMuonCand rmc;
340  rmc.setHwPt((*iter)->hwPt());
341  int abs_add_1 = setAdd(1,(*iter)->address(1));
342  int abs_add_2 = setAdd(2,(*iter)->address(2));
343  int abs_add_3 = setAdd(3,(*iter)->address(3));
344  int abs_add_4 = setAdd(4,(*iter)->address(4));
345 
346  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, (*iter)->spid().wheel() < 0); // this has to be set!
347  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelNum, abs((*iter)->spid().wheel()) - 1); // this has to be set!
348  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat1, abs_add_1);
349  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat2, abs_add_2);
350  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat3, abs_add_3);
351  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat4, abs_add_4);
352  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat1, 0);
353  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat2, 0);
354  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat3, 0);
355  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat4, 0);
356 
357 
358  rmc.setHwPhi((*iter)->hwPhi());
359  if((*iter)->hwEta()>-33 || (*iter)->hwEta()<32 )
360  rmc.setHwEta(eta_map[(*iter)->hwEta()]);
361  else
362  rmc.setHwEta(-1000);
363  rmc.setHwSign((*iter)->hwSign() == 1 ? 0 : 1);
364  rmc.setHwSignValid((*iter)->hwSignValid());
365  rmc.setHwQual((*iter)->hwQual());
366  rmc.setTFIdentifiers((*iter)->spid().sector(),l1t::tftype::bmtf);
367 
368  if ( *iter ){ _cache.push_back((*iter)->bx(), rmc);}
369  }
370  }
371  */
372 
373  } //end of bx loop
374 }
375 
376 //
377 // reset MTTF
378 //
381  while (it_sp != m_spmap->end()) {
382  if ((*it_sp).second)
383  (*it_sp).second->reset();
384  it_sp++;
385  }
386 
387  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
388  while (it_ep != m_epvec.end()) {
389  if (*it_ep)
390  (*it_ep)->reset();
391  it_ep++;
392  }
393 
394  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
395  while (it_ws != m_wsvec.end()) {
396  if (*it_ws)
397  (*it_ws)->reset();
398  it_ws++;
399  }
400 
401  if (m_ms)
402  m_ms->reset();
403 }
404 
405 //
406 // return Sector Processor container
407 //
408 const L1MuBMSectorProcessor* L1MuBMTrackFinder::sp(const L1MuBMSecProcId& id) const { return m_spmap->sp(id); }
409 
410 //
411 // return number of muon candidates found by the barrel MTTF
412 //
414  int num = 0;
415  for (int bx = _cache.getFirstBX(); bx < _cache.getLastBX(); ++bx) {
416  num += _cache.size(bx);
417  }
418  return num;
419 }
420 
422 
424 
426  _cache.clear();
427  _cache0.clear();
428  _cache1.clear();
429  _cache2.clear();
430  _cache3.clear();
431 }
432 
433 //
434 // return number of muon candidates found by the barrel MTTF at a given bx
435 //
437 
438 //
439 // Convert Relative to Absolute Track Addresses
440 //
441 
442 int L1MuBMTrackFinder::setAdd(int ust, int rel_add) {
443  unsigned int uadd = rel_add;
444 
445  switch (uadd) {
446  case 0: {
447  rel_add = 8;
448  break;
449  }
450  case 1: {
451  rel_add = 9;
452  break;
453  }
454  case 2: {
455  rel_add = 0;
456  break;
457  }
458  case 3: {
459  rel_add = 1;
460  break;
461  }
462  case 8: {
463  rel_add = 10;
464  break;
465  }
466  case 9: {
467  rel_add = 11;
468  break;
469  }
470  case 10: {
471  rel_add = 2;
472  break;
473  }
474  case 11: {
475  rel_add = 3;
476  break;
477  }
478  case 4: {
479  rel_add = 12;
480  break;
481  }
482  case 5: {
483  rel_add = 13;
484  break;
485  }
486  case 6: {
487  rel_add = 4;
488  break;
489  }
490  case 7: {
491  rel_add = 5;
492  break;
493  }
494  case 15: {
495  rel_add = 15;
496  break;
497  }
498  default: {
499  rel_add = 15;
500  break;
501  }
502  }
503 
504  if (ust != 1)
505  return rel_add;
506 
507  switch (uadd) {
508  case 0: {
509  rel_add = 2;
510  break;
511  }
512  case 1: {
513  rel_add = 1;
514  break;
515  }
516  case 15: {
517  rel_add = 3;
518  break;
519  }
520  default: {
521  rel_add = 3;
522  break;
523  }
524  }
525  return rel_add;
526 }
527 
528 // static data members
529 
530 std::shared_ptr<L1MuBMTFConfig> L1MuBMTrackFinder::m_config;
static int getBxMax()
int getLastBX() const
const L1MuBMSectorProcessor * sp(const L1MuBMSecProcId &) const
get a pointer to a Sector Processor
const L1MuBMWedgeSorter * ws(int id) const
get a pointer to a Wedge Sorter, index [0-11]
edm::EDGetTokenT< L1MuDTChambPhContainer > m_DTDigiToken
int getFirstBX() const
void setHwPhi(int bits)
Set compressed relative phi as transmitted by hardware LSB = 2*pi/576 (8 bits)
int numberOfTracks()
get number of muon candidates found by the barrel MTTF
const L1MuBMEtaProcessor * ep(int id) const
get a pointer to an Eta Processor, index [0-11]
L1MuBMSectorProcessor * sp(const L1MuBMSecProcId &) const
return pointer to Sector Processor
L1MuBMMuonSorter * m_ms
BM Muon Sorter.
SPmap::iterator SPmap_iter
L1MuBMTrackSegEtaCollection _cache3
const_iterator begin(int bx) const
unsigned size(int bx) const
L1MuBMTrackFinder(const edm::ParameterSet &ps, edm::ConsumesCollector &&iC)
constructor
L1MuBMTrackCollection _cache1
void reset()
reset Muon Sorter
void setTFIdentifiers(int processor, tftype trackFinder)
Set the processor ID, track-finder type. From these two, the link is set.
TFtracks_const_iter begin(int bx)
static int getBxMin()
static edm::InputTag getBMDigiInputTag()
std::vector< L1MuBMWedgeSorter * > m_wsvec
Wedge Sorters.
void setTrackSubAddress(bmtfAddress subAddress, int value)
Set a part of the muon candidates track address; specialised for BMTF.
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void setHwHF(bool bit)
Set HF (halo / fine eta) bit (EMTF: halo -> 1; BMTF: fine eta -> 1)
SPmap_iter begin()
return iterator which points to the first entry of the container
bool bxEmpty(int step) const
void insert(const L1MuBMSecProcId &, L1MuBMSectorProcessor *sp)
insert a Sector Processor into the container
L1MuBMTrackSegPhiCollection _cache2
void run(const edm::Event &e, const edm::EventSetup &c)
run the barrel MTTF
void setHwQual(int bits)
Set compressed quality code as transmitted by hardware (4 bits)
void setHwPt(int bits)
Set compressed pT as transmitted by hardware LSB = 0.5 (9 bits)
l1t::RegionalMuonCandBxCollection _cache0
void setHwEta(int bits)
Set compressed eta as transmitted by hardware LSB = 0.010875 (9 bits)
Phi_Container const * getContainer() const
TFtracks_const_iter end(int bx)
std::vector< L1MuBMEtaProcessor * > m_epvec
Eta Processors.
void clear()
void setBXRange(int bxFirst, int bxLast)
static bool Debug()
l1t::RegionalMuonCandBxCollection _cache
const_iterator end(int bx) const
l1t::RegionalMuonCandBxCollection::const_iterator TFtracks_const_iter
container for muon candidates
int setAdd(int ust, int rel_add)
void setHwSignValid(int bits)
Set whether charge measurement is valid (0 for high pT muons)
void setup(edm::ConsumesCollector &&)
build the structure of the barrel MTTF
static std::shared_ptr< L1MuBMTFConfig > m_config
Track Finder configuration.
SPmap_iter end()
return iterator which points to the one-past-last entry of the container
L1MuBMSecProcMap * m_spmap
Sector Processors.
def move(src, dest)
Definition: eostools.py:511
void push_back(int bx, T object)
void setHwSign(int bits)
Set charge sign bit (charge = (-1)^(sign))
virtual ~L1MuBMTrackFinder()
destructor
void reset()
reset the barrel MTTF
edm::ESGetToken< L1TMuonBarrelParams, L1TMuonBarrelParamsRcd > m_mbParamsToken