CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
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 (m_config == nullptr)
64  m_config = new L1MuBMTFConfig(ps);
65 
66  if (L1MuBMTFConfig::Debug(1))
67  cout << endl;
68  if (L1MuBMTFConfig::Debug(1))
69  cout << "**** entering L1MuBMTrackFinder ****" << endl;
70  if (L1MuBMTFConfig::Debug(1))
71  cout << endl;
72 
73  m_spmap = new L1MuBMSecProcMap();
74  m_epvec.reserve(12);
75  m_wsvec.reserve(12);
76  m_ms = nullptr;
77 
79  m_mbParamsToken = iC.esConsumes();
80 }
81 
82 //--------------
83 // Destructor --
84 //--------------
85 
87  delete m_spmap;
88 
89  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
90  while (it_ep != m_epvec.end()) {
91  delete (*it_ep);
92  it_ep++;
93  }
94  m_epvec.clear();
95 
96  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
97  while (it_ws != m_wsvec.end()) {
98  delete (*it_ws);
99  it_ws++;
100  }
101  m_wsvec.clear();
102 
103  delete m_ms;
104 
105  if (m_config)
106  delete m_config;
107  m_config = nullptr;
108 }
109 
110 //--------------
111 // Operations --
112 //--------------
113 
114 //
115 // setup MTTF configuration
116 //
118  // build the barrel Muon Trigger Track Finder
119 
120  if (L1MuBMTFConfig::Debug(1))
121  cout << endl;
122  if (L1MuBMTFConfig::Debug(1))
123  cout << "**** L1MuBMTrackFinder building ****" << endl;
124  if (L1MuBMTFConfig::Debug(1))
125  cout << endl;
126 
127  // create new sector processors
128  for (int wh = -3; wh <= 3; wh++) {
129  if (wh == 0)
130  continue;
131  for (int sc = 0; sc < 12; sc++) {
132  L1MuBMSecProcId tmpspid(wh, sc);
133  L1MuBMSectorProcessor* sp = new L1MuBMSectorProcessor(*this, tmpspid, std::move(iC));
134  if (L1MuBMTFConfig::Debug(2))
135  cout << "creating " << tmpspid << endl;
136  m_spmap->insert(tmpspid, sp);
137  }
138  }
139 
140  // create new eta processors and wedge sorters
141  for (int sc = 0; sc < 12; sc++) {
142  L1MuBMEtaProcessor* ep = new L1MuBMEtaProcessor(*this, sc, std::move(iC));
143  if (L1MuBMTFConfig::Debug(2))
144  cout << "creating Eta Processor " << sc << endl;
145  m_epvec.push_back(ep);
146  L1MuBMWedgeSorter* ws = new L1MuBMWedgeSorter(*this, sc);
147  if (L1MuBMTFConfig::Debug(2))
148  cout << "creating Wedge Sorter " << sc << endl;
149  m_wsvec.push_back(ws);
150  }
151 
152  // create new muon sorter
153  if (L1MuBMTFConfig::Debug(2))
154  cout << "creating BM Muon Sorter " << endl;
155  m_ms = new L1MuBMMuonSorter(*this);
156 }
157 
158 //
159 // run MTTF
160 //
163  int bx_min = L1MuBMTFConfig::getBxMin();
164  int bx_max = L1MuBMTFConfig::getBxMax();
165 
166  //Resize the bx range according to the config file
167  _cache0.setBXRange(bx_min, bx_max);
168  _cache.setBXRange(bx_min, bx_max);
169 
170  // run the barrel Muon Trigger Track Finder
172  e.getByToken(m_DTDigiToken, dttrig);
173  if (dttrig->getContainer()->empty())
174  return;
175 
176  if (L1MuBMTFConfig::Debug(2))
177  cout << endl;
178  if (L1MuBMTFConfig::Debug(2))
179  cout << "**** L1MuBMTrackFinder processing ------****" << endl;
180  if (L1MuBMTFConfig::Debug(2))
181  cout << endl;
182 
183  for (int bx = bx_min; bx <= bx_max; bx++) {
184  if (dttrig->bxEmpty(bx))
185  continue;
186 
187  if (L1MuBMTFConfig::Debug(2))
188  cout << "L1MuBMTrackFinder processing bunch-crossing : " << bx << endl;
189 
190  // reset MTTF
191  reset();
192 
193  // run sector processors
195  while (it_sp != m_spmap->end()) {
196  if (L1MuBMTFConfig::Debug(2))
197  cout << "running " << (*it_sp).second->id() << endl;
198  if ((*it_sp).second)
199  (*it_sp).second->run(bx, e, c);
200  if (L1MuBMTFConfig::Debug(2) && (*it_sp).second)
201  (*it_sp).second->print();
202  it_sp++;
203  }
204 
205  // run eta processors
206  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
207  while (it_ep != m_epvec.end()) {
208  if (L1MuBMTFConfig::Debug(2))
209  cout << "running Eta Processor " << (*it_ep)->id() << endl;
210  if (*it_ep)
211  (*it_ep)->run(bx, e, c);
212  if (L1MuBMTFConfig::Debug(2) && *it_ep)
213  (*it_ep)->print();
214  it_ep++;
215  }
216 
217  // read sector processors
218  it_sp = m_spmap->begin();
219  while (it_sp != m_spmap->end()) {
220  if (L1MuBMTFConfig::Debug(2))
221  cout << "reading " << (*it_sp).second->id() << endl;
222  for (int number = 0; number < 2; number++) {
223  const L1MuBMTrack* cand = (*it_sp).second->tracK(number);
224 
225  if (cand && !cand->empty()) {
227 
228  // max value in LUTs is 117
229  if (cand->hwEta() > -117 || cand->hwEta() < 117)
230  rmc.setHwEta(cand->hwEta());
231  else
232  rmc.setHwEta(-1000);
233 
234  rmc.setHwPt(cand->pt());
235  int abs_add_1 = setAdd(1, cand->address(1));
236  int abs_add_2 = setAdd(2, cand->address(2));
237  int abs_add_3 = setAdd(3, cand->address(3));
238  int abs_add_4 = setAdd(4, cand->address(4));
239 
240  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, cand->spid().wheel() < 0); // this has to be set!
242  abs(cand->spid().wheel()) - 1); // this has to be set!
251  rmc.setHwHF(cand->hwHF());
252 
253  rmc.setHwPhi(cand->hwPhi());
254  rmc.setHwSign(cand->hwSign() == 1 ? 0 : 1);
255  rmc.setHwSignValid(cand->hwSignValid());
256  rmc.setHwQual(cand->hwQual());
258 
259  _cache0.push_back(cand->bx(), rmc);
260  _cache2.insert(std::end(_cache2), std::begin(cand->getTSphi()), std::end(cand->getTSphi()));
261  _cache3.insert(std::end(_cache3), std::begin(cand->getTSeta()), std::end(cand->getTSeta()));
262  }
263  }
264  it_sp++;
265  }
266 
267  // run wedge sorters
268  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
269  while (it_ws != m_wsvec.end()) {
270  if (L1MuBMTFConfig::Debug(2))
271  cout << "running Wedge Sorter " << (*it_ws)->id() << endl;
272  if (*it_ws)
273  (*it_ws)->run();
274  if (L1MuBMTFConfig::Debug(2) && *it_ws)
275  (*it_ws)->print();
276 
277  // store found track candidates in container (cache)
278  if ((*it_ws)->anyMuonCands()) {
279  const vector<const L1MuBMTrack*>& mttf_cont = (*it_ws)->tracks();
280 
281  vector<const L1MuBMTrack*>::const_iterator iter;
282  for (iter = mttf_cont.begin(); iter != mttf_cont.end(); iter++) {
283  if (!*iter)
284  continue;
286  rmc.setHwPt((*iter)->hwPt());
287  int abs_add_1 = setAdd(1, (*iter)->address(1));
288  int abs_add_2 = setAdd(2, (*iter)->address(2));
289  int abs_add_3 = setAdd(3, (*iter)->address(3));
290  int abs_add_4 = setAdd(4, (*iter)->address(4));
291 
293  (*iter)->spid().wheel() < 0); // this has to be set!
295  abs((*iter)->spid().wheel()) - 1); // this has to be set!
304  rmc.setHwHF((*iter)->hwHF());
305 
306  rmc.setHwPhi((*iter)->hwPhi());
307  if ((*iter)->hwEta() > -117 || (*iter)->hwEta() < 117)
308  // rmc.setHwEta(eta_map[(*iter)->hwEta()]);
309  rmc.setHwEta((*iter)->hwEta());
310  else
311  rmc.setHwEta(-1000);
312  rmc.setHwSign((*iter)->hwSign() == 1 ? 0 : 1);
313  rmc.setHwSignValid((*iter)->hwSignValid());
314  rmc.setHwQual((*iter)->hwQual());
315  rmc.setTFIdentifiers((*iter)->spid().sector(), l1t::tftype::bmtf);
316 
317  if (*iter) {
318  _cache.push_back((*iter)->bx(), rmc);
319  _cache1.push_back(**iter);
320  }
321  }
322  }
323 
324  it_ws++;
325 
326  } //end wedge sorting
327 
328  /* // run muon sorter
329  if ( L1MuBMTFConfig::Debug(2) ) cout << "running BM Muon Sorter" << endl;
330  if ( m_ms ) m_ms->run();
331  if ( L1MuBMTFConfig::Debug(2) && m_ms ) m_ms->print();
332 
333 
334  // store found track candidates in container (cache)
335  if ( m_ms->numberOfTracks() > 0 ) {
336  const vector<const L1MuBMTrack*>& mttf_cont = m_ms->tracks();
337  vector<const L1MuBMTrack*>::const_iterator iter;
338  for ( iter = mttf_cont.begin(); iter != mttf_cont.end(); iter++ ) {
339 
340  l1t::RegionalMuonCand rmc;
341  rmc.setHwPt((*iter)->hwPt());
342  int abs_add_1 = setAdd(1,(*iter)->address(1));
343  int abs_add_2 = setAdd(2,(*iter)->address(2));
344  int abs_add_3 = setAdd(3,(*iter)->address(3));
345  int abs_add_4 = setAdd(4,(*iter)->address(4));
346 
347  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, (*iter)->spid().wheel() < 0); // this has to be set!
348  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelNum, abs((*iter)->spid().wheel()) - 1); // this has to be set!
349  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat1, abs_add_1);
350  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat2, abs_add_2);
351  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat3, abs_add_3);
352  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat4, abs_add_4);
353  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat1, 0);
354  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat2, 0);
355  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat3, 0);
356  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat4, 0);
357 
358 
359  rmc.setHwPhi((*iter)->hwPhi());
360  if((*iter)->hwEta()>-33 || (*iter)->hwEta()<32 )
361  rmc.setHwEta(eta_map[(*iter)->hwEta()]);
362  else
363  rmc.setHwEta(-1000);
364  rmc.setHwSign((*iter)->hwSign() == 1 ? 0 : 1);
365  rmc.setHwSignValid((*iter)->hwSignValid());
366  rmc.setHwQual((*iter)->hwQual());
367  rmc.setTFIdentifiers((*iter)->spid().sector(),l1t::tftype::bmtf);
368 
369  if ( *iter ){ _cache.push_back((*iter)->bx(), rmc);}
370  }
371  }
372  */
373 
374  } //end of bx loop
375 }
376 
377 //
378 // reset MTTF
379 //
382  while (it_sp != m_spmap->end()) {
383  if ((*it_sp).second)
384  (*it_sp).second->reset();
385  it_sp++;
386  }
387 
388  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
389  while (it_ep != m_epvec.end()) {
390  if (*it_ep)
391  (*it_ep)->reset();
392  it_ep++;
393  }
394 
395  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
396  while (it_ws != m_wsvec.end()) {
397  if (*it_ws)
398  (*it_ws)->reset();
399  it_ws++;
400  }
401 
402  if (m_ms)
403  m_ms->reset();
404 }
405 
406 //
407 // return Sector Processor container
408 //
409 const L1MuBMSectorProcessor* L1MuBMTrackFinder::sp(const L1MuBMSecProcId& id) const { return m_spmap->sp(id); }
410 
411 //
412 // return number of muon candidates found by the barrel MTTF
413 //
415  int num = 0;
416  for (int bx = _cache.getFirstBX(); bx < _cache.getLastBX(); ++bx) {
417  num += _cache.size(bx);
418  }
419  return num;
420 }
421 
423 
425 
427  _cache.clear();
428  _cache0.clear();
429  _cache1.clear();
430  _cache2.clear();
431  _cache3.clear();
432 }
433 
434 //
435 // return number of muon candidates found by the barrel MTTF at a given bx
436 //
438 
439 //
440 // Convert Relative to Absolute Track Addresses
441 //
442 
443 int L1MuBMTrackFinder::setAdd(int ust, int rel_add) {
444  unsigned int uadd = rel_add;
445 
446  switch (uadd) {
447  case 0: {
448  rel_add = 8;
449  break;
450  }
451  case 1: {
452  rel_add = 9;
453  break;
454  }
455  case 2: {
456  rel_add = 0;
457  break;
458  }
459  case 3: {
460  rel_add = 1;
461  break;
462  }
463  case 8: {
464  rel_add = 10;
465  break;
466  }
467  case 9: {
468  rel_add = 11;
469  break;
470  }
471  case 10: {
472  rel_add = 2;
473  break;
474  }
475  case 11: {
476  rel_add = 3;
477  break;
478  }
479  case 4: {
480  rel_add = 12;
481  break;
482  }
483  case 5: {
484  rel_add = 13;
485  break;
486  }
487  case 6: {
488  rel_add = 4;
489  break;
490  }
491  case 7: {
492  rel_add = 5;
493  break;
494  }
495  case 15: {
496  rel_add = 15;
497  break;
498  }
499  default: {
500  rel_add = 15;
501  break;
502  }
503  }
504 
505  if (ust != 1)
506  return rel_add;
507 
508  switch (uadd) {
509  case 0: {
510  rel_add = 2;
511  break;
512  }
513  case 1: {
514  rel_add = 1;
515  break;
516  }
517  case 15: {
518  rel_add = 3;
519  break;
520  }
521  default: {
522  rel_add = 3;
523  break;
524  }
525  }
526  return rel_add;
527 }
528 
529 // static data members
530 
static int getBxMax()
const_iterator end(int bx) const
const std::vector< L1MuBMTrackSegEta > & getTSeta() const
return all eta track segments of the muon candidate
Definition: L1MuBMTrack.h:121
L1MuBMSectorProcessor * sp(const L1MuBMSecProcId &) const
return pointer to Sector Processor
edm::EDGetTokenT< L1MuDTChambPhContainer > m_DTDigiToken
unsigned int pt() const
get pt-code (5 bits)
Definition: L1MuBMTrack.h:70
void setHwPhi(int bits)
Set compressed relative phi as transmitted by hardware LSB = 2*pi/576 (8 bits)
const edm::EventSetup & c
int numberOfTracks()
get number of muon candidates found by the barrel MTTF
unsigned size(int bx) const
const int hwSignValid() const
Get charge sign valid bit (0 - not valid (high pT muon); 1 - valid)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:539
L1MuBMMuonSorter * m_ms
BM Muon Sorter.
L1MuBMAddressArray address() const
get address-array for this muon candidate
Definition: L1MuBMTrack.h:97
const L1MuBMSecProcId & spid() const
return Sector Processor in which the muon candidate was found
Definition: L1MuBMTrack.h:94
SPmap::iterator SPmap_iter
L1MuBMTrackSegEtaCollection _cache3
const L1MuBMWedgeSorter * ws(int id) const
get a pointer to a Wedge Sorter, index [0-11]
bool getData(T &iHolder) const
Definition: EventSetup.h:128
int sector() const
return sector number
const int hwQual() const
Get quality code.
L1MuBMTrackFinder(const edm::ParameterSet &ps, edm::ConsumesCollector &&iC)
constructor
void setDefaultsES(const L1TMuonBarrelParams &)
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.
def move
Definition: eostools.py:511
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.
const L1MuBMSectorProcessor * sp(const L1MuBMSecProcId &) const
get a pointer to a Sector Processor
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const int hwHF() const
Get HF (halo / fine eta) bit (EMTF: halo -&gt; 1; BMTF: fine eta -&gt; 1)
void setHwHF(bool bit)
Set HF (halo / fine eta) bit (EMTF: halo -&gt; 1; BMTF: fine eta -&gt; 1)
const int hwEta() const
Get compressed eta (returned int * 0.010875 = eta)
SPmap_iter begin()
return iterator which points to the first entry of the container
void insert(const L1MuBMSecProcId &, L1MuBMSectorProcessor *sp)
insert a Sector Processor into the container
const int hwPhi() const
Get compressed local phi (returned int * 2*pi/576 = local phi in rad)
int bx() const
get the bunch crossing for this muon candidate
Definition: L1MuBMTrack.h:103
L1MuBMTrackSegPhiCollection _cache2
void run(const edm::Event &e, const edm::EventSetup &c)
run the barrel MTTF
static L1MuBMTFConfig * m_config
Track Finder configuration.
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)
int getFirstBX() 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
l1t::RegionalMuonCandBxCollection::const_iterator TFtracks_const_iter
container for muon candidates
int setAdd(int ust, int rel_add)
int getLastBX() const
string end
Definition: dataset.py:937
const int hwSign() const
Get charge sign bit (charge = (-1)^(sign))
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
tuple cout
Definition: gather_cfg.py:144
SPmap_iter end()
return iterator which points to the one-past-last entry of the container
const_iterator begin(int bx) const
bool empty() const
is it an empty muon candidate?
Definition: L1MuBMTrack.h:91
const L1MuBMEtaProcessor * ep(int id) const
get a pointer to an Eta Processor, index [0-11]
const std::vector< L1MuBMTrackSegPhi > & getTSphi() const
return all phi track segments of the muon candidate
Definition: L1MuBMTrack.h:112
L1MuBMSecProcMap * m_spmap
Sector Processors.
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
int wheel() const
return wheel number
edm::ESGetToken< L1TMuonBarrelParams, L1TMuonBarrelParamsRcd > m_mbParamsToken