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 //----------------
58 // Constructors --
59 //----------------
60 //:
62 _cache0(144,-9,8),_cache(36, -9, 8) {
63  // set configuration parameters
64  if ( m_config == nullptr ) m_config = new L1MuBMTFConfig(ps);
65 
66  if ( L1MuBMTFConfig::Debug(1) ) cout << endl;
67  if ( L1MuBMTFConfig::Debug(1) ) cout << "**** entering L1MuBMTrackFinder ****" << endl;
68  if ( L1MuBMTFConfig::Debug(1) ) cout << endl;
69 
70  m_spmap = new L1MuBMSecProcMap();
71  m_epvec.reserve(12);
72  m_wsvec.reserve(12);
73  m_ms = nullptr;
74 
76 }
77 
78 
79 //--------------
80 // Destructor --
81 //--------------
82 
84 
85  delete m_spmap;
86 
87  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
88  while ( it_ep != m_epvec.end() ) {
89  delete (*it_ep);
90  it_ep++;
91  }
92  m_epvec.clear();
93 
94  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
95  while ( it_ws != m_wsvec.end() ) {
96  delete (*it_ws);
97  it_ws++;
98  }
99  m_wsvec.clear();
100 
101  delete m_ms;
102 
103  if ( m_config ) delete m_config;
104  m_config = nullptr;
105 
106 }
107 
108 
109 //--------------
110 // Operations --
111 //--------------
112 
113 //
114 // setup MTTF configuration
115 //
117 
118  // build the barrel Muon Trigger Track Finder
119 
120  if ( L1MuBMTFConfig::Debug(1) ) cout << endl;
121  if ( L1MuBMTFConfig::Debug(1) ) cout << "**** L1MuBMTrackFinder building ****" << endl;
122  if ( L1MuBMTFConfig::Debug(1) ) cout << endl;
123 
124  // create new sector processors
125  for ( int wh = -3; wh <= 3; wh++ ) {
126  if ( wh == 0 ) continue;
127  for ( int sc = 0; sc < 12; sc++ ) {
128  L1MuBMSecProcId tmpspid(wh,sc);
129  L1MuBMSectorProcessor* sp = new L1MuBMSectorProcessor(*this,tmpspid,std::move(iC));
130  if ( L1MuBMTFConfig::Debug(2) ) cout << "creating " << tmpspid << endl;
131  m_spmap->insert(tmpspid,sp);
132  }
133  }
134 
135  // create new eta processors and wedge sorters
136  for ( int sc = 0; sc < 12; sc++ ) {
138  if ( L1MuBMTFConfig::Debug(2) ) cout << "creating Eta Processor " << sc << endl;
139  m_epvec.push_back(ep);
141  if ( L1MuBMTFConfig::Debug(2) ) cout << "creating Wedge Sorter " << sc << endl;
142  m_wsvec.push_back(ws);
143  }
144 
145  // create new muon sorter
146  if ( L1MuBMTFConfig::Debug(2) ) cout << "creating BM Muon Sorter " << endl;
147  m_ms = new L1MuBMMuonSorter(*this);
148 
149 }
150 
151 
152 //
153 // run MTTF
154 //
156 
158  int bx_min = L1MuBMTFConfig::getBxMin();
159  int bx_max = L1MuBMTFConfig::getBxMax();
160 
161  //Resize the bx range according to the config file
162  _cache0.setBXRange(bx_min,bx_max);
163  _cache.setBXRange(bx_min,bx_max);
164 
165 
166 
167 // run the barrel Muon Trigger Track Finder
169  e.getByToken(m_DTDigiToken,dttrig);
170  if ( dttrig->getContainer()->empty() ) return;
171 
172  if ( L1MuBMTFConfig::Debug(2) ) cout << endl;
173  if ( L1MuBMTFConfig::Debug(2) ) cout << "**** L1MuBMTrackFinder processing ------****" << endl;
174  if ( L1MuBMTFConfig::Debug(2) ) cout << endl;
175 
176  for ( int bx = bx_min; bx <= bx_max; bx++ ) {
177  if ( dttrig->bxEmpty(bx) ) continue;
178 
179  if ( L1MuBMTFConfig::Debug(2) ) cout << "L1MuBMTrackFinder processing bunch-crossing : " << bx << endl;
180 
181  // reset MTTF
182  reset();
183 
184  // run sector processors
186  while ( it_sp != m_spmap->end() ) {
187  if ( L1MuBMTFConfig::Debug(2) ) cout << "running "
188  << (*it_sp).second->id() << endl;
189  if ( (*it_sp).second ) (*it_sp).second->run(bx,e,c);
190  if ( L1MuBMTFConfig::Debug(2) && (*it_sp).second ) (*it_sp).second->print();
191  it_sp++;
192  }
193 
194  // run eta processors
195  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
196  while ( it_ep != m_epvec.end() ) {
197  if ( L1MuBMTFConfig::Debug(2) ) cout << "running Eta Processor "
198  << (*it_ep)->id() << endl;
199  if ( *it_ep ) (*it_ep)->run(bx,e,c);
200  if ( L1MuBMTFConfig::Debug(2) && *it_ep ) (*it_ep)->print();
201  it_ep++;
202  }
203 
204  // read sector processors
205  it_sp = m_spmap->begin();
206  while ( it_sp != m_spmap->end() ) {
207  if ( L1MuBMTFConfig::Debug(2) ) cout << "reading "
208  << (*it_sp).second->id() << endl;
209  for ( int number = 0; number < 2; number++ ) {
210  const L1MuBMTrack* cand = (*it_sp).second->tracK(number);
211 
212  if ( cand && !cand->empty() ) {
213 
215 
216  // max value in LUTs is 117
217  if(cand->hwEta()>-117 || cand->hwEta()<117 )
218  rmc.setHwEta(cand->hwEta());
219  else
220  rmc.setHwEta(-1000);
221 
222  rmc.setHwPt(cand->pt());
223  int abs_add_1 = setAdd(1,cand->address(1));
224  int abs_add_2 = setAdd(2,cand->address(2));
225  int abs_add_3 = setAdd(3,cand->address(3));
226  int abs_add_4 = setAdd(4,cand->address(4));
227 
228  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, cand->spid().wheel() < 0); // this has to be set!
229  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelNum, abs(cand->spid().wheel()) - 1); // this has to be set!
238  rmc.setHwHF(cand->hwHF());
239 
240  rmc.setHwPhi(cand->hwPhi());
241  rmc.setHwSign(cand->hwSign() == 1 ? 0 : 1 );
242  rmc.setHwSignValid(cand->hwSignValid());
243  rmc.setHwQual(cand->hwQual());
245 
246  _cache0.push_back(cand->bx(), rmc);
247  _cache2.insert(std::end(_cache2), std::begin(cand->getTSphi()), std::end(cand->getTSphi()));
248  _cache3.insert(std::end(_cache3), std::begin(cand->getTSeta()), std::end(cand->getTSeta()));
249  }
250  }
251  it_sp++;
252  }
253 
254  // run wedge sorters
255  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
256  while ( it_ws != m_wsvec.end() ) {
257  if ( L1MuBMTFConfig::Debug(2) ) cout << "running Wedge Sorter "
258  << (*it_ws)->id() << endl;
259  if ( *it_ws ) (*it_ws)->run();
260  if ( L1MuBMTFConfig::Debug(2) && *it_ws ) (*it_ws)->print();
261 
262  // store found track candidates in container (cache)
263  if ( (*it_ws)->anyMuonCands() ) {
264  const vector<const L1MuBMTrack*>& mttf_cont = (*it_ws)->tracks();
265 
266  vector<const L1MuBMTrack*>::const_iterator iter;
267  for ( iter = mttf_cont.begin(); iter != mttf_cont.end(); iter++ ) {
268  if(!*iter) continue;
270  rmc.setHwPt((*iter)->hwPt());
271  int abs_add_1 = setAdd(1,(*iter)->address(1));
272  int abs_add_2 = setAdd(2,(*iter)->address(2));
273  int abs_add_3 = setAdd(3,(*iter)->address(3));
274  int abs_add_4 = setAdd(4,(*iter)->address(4));
275 
276  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, (*iter)->spid().wheel() < 0); // this has to be set!
277  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelNum, abs((*iter)->spid().wheel()) - 1); // this has to be set!
286  rmc.setHwHF((*iter)->hwHF());
287 
288  rmc.setHwPhi((*iter)->hwPhi());
289  if((*iter)->hwEta()>-117 || (*iter)->hwEta()<117 )
290  // rmc.setHwEta(eta_map[(*iter)->hwEta()]);
291  rmc.setHwEta((*iter)->hwEta());
292  else
293  rmc.setHwEta(-1000);
294  rmc.setHwSign((*iter)->hwSign() == 1 ? 0 : 1);
295  rmc.setHwSignValid((*iter)->hwSignValid());
296  rmc.setHwQual((*iter)->hwQual());
297  rmc.setTFIdentifiers((*iter)->spid().sector(),l1t::tftype::bmtf);
298 
299  if ( *iter ){
300  _cache.push_back((*iter)->bx(), rmc);
301  _cache1.push_back(**iter);
302  }
303  }
304  }
305 
306  it_ws++;
307 
308  }//end wedge sorting
309 
310  /* // run muon sorter
311  if ( L1MuBMTFConfig::Debug(2) ) cout << "running BM Muon Sorter" << endl;
312  if ( m_ms ) m_ms->run();
313  if ( L1MuBMTFConfig::Debug(2) && m_ms ) m_ms->print();
314 
315 
316  // store found track candidates in container (cache)
317  if ( m_ms->numberOfTracks() > 0 ) {
318  const vector<const L1MuBMTrack*>& mttf_cont = m_ms->tracks();
319  vector<const L1MuBMTrack*>::const_iterator iter;
320  for ( iter = mttf_cont.begin(); iter != mttf_cont.end(); iter++ ) {
321 
322  l1t::RegionalMuonCand rmc;
323  rmc.setHwPt((*iter)->hwPt());
324  int abs_add_1 = setAdd(1,(*iter)->address(1));
325  int abs_add_2 = setAdd(2,(*iter)->address(2));
326  int abs_add_3 = setAdd(3,(*iter)->address(3));
327  int abs_add_4 = setAdd(4,(*iter)->address(4));
328 
329  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, (*iter)->spid().wheel() < 0); // this has to be set!
330  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelNum, abs((*iter)->spid().wheel()) - 1); // this has to be set!
331  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat1, abs_add_1);
332  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat2, abs_add_2);
333  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat3, abs_add_3);
334  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat4, abs_add_4);
335  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat1, 0);
336  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat2, 0);
337  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat3, 0);
338  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat4, 0);
339 
340 
341  rmc.setHwPhi((*iter)->hwPhi());
342  if((*iter)->hwEta()>-33 || (*iter)->hwEta()<32 )
343  rmc.setHwEta(eta_map[(*iter)->hwEta()]);
344  else
345  rmc.setHwEta(-1000);
346  rmc.setHwSign((*iter)->hwSign() == 1 ? 0 : 1);
347  rmc.setHwSignValid((*iter)->hwSignValid());
348  rmc.setHwQual((*iter)->hwQual());
349  rmc.setTFIdentifiers((*iter)->spid().sector(),l1t::tftype::bmtf);
350 
351  if ( *iter ){ _cache.push_back((*iter)->bx(), rmc);}
352  }
353  }
354  */
355 
356  }//end of bx loop
357 }
358 
359 
360 //
361 // reset MTTF
362 //
364 
366  while ( it_sp != m_spmap->end() ) {
367  if ( (*it_sp).second ) (*it_sp).second->reset();
368  it_sp++;
369  }
370 
371  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
372  while ( it_ep != m_epvec.end() ) {
373  if ( *it_ep ) (*it_ep)->reset();
374  it_ep++;
375  }
376 
377  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
378  while ( it_ws != m_wsvec.end() ) {
379  if ( *it_ws ) (*it_ws)->reset();
380  it_ws++;
381  }
382 
383  if ( m_ms ) m_ms->reset();
384 
385 }
386 
387 
388 //
389 // return Sector Processor container
390 //
392 
393  return m_spmap->sp(id);
394 
395 }
396 
397 
398 //
399 // return number of muon candidates found by the barrel MTTF
400 //
402  int num = 0;
403  for (int bx = _cache.getFirstBX(); bx < _cache.getLastBX(); ++bx) {
404  num += _cache.size(bx);
405  }
406  return num;
407 }
408 
409 
411 
412  return _cache.begin(bx);
413 
414 }
415 
416 
418 
419  return _cache.end(bx);
420 
421 }
422 
423 
425 
426  _cache.clear();
427  _cache0.clear();
428  _cache1.clear();
429  _cache2.clear();
430  _cache3.clear();
431 }
432 
433 
434 //
435 // return number of muon candidates found by the barrel MTTF at a given bx
436 //
438  return _cache.size(0);
439 }
440 
441 
442 //
443 // Convert Relative to Absolute Track Addresses
444 //
445 
446 int L1MuBMTrackFinder::setAdd(int ust, int rel_add) {
447  unsigned int uadd = rel_add;
448 
449  switch (uadd) {
450  case 0: { rel_add = 8; break; }
451  case 1: { rel_add = 9; break; }
452  case 2: { rel_add = 0; break; }
453  case 3: { rel_add = 1; break; }
454  case 8: { rel_add = 10; break; }
455  case 9: { rel_add = 11; break; }
456  case 10: { rel_add = 2; break; }
457  case 11: { rel_add = 3; break; }
458  case 4: { rel_add = 12; break; }
459  case 5: { rel_add = 13; break; }
460  case 6: { rel_add = 4; break; }
461  case 7: { rel_add = 5; break; }
462  case 15: { rel_add = 15; break; }
463  default: { rel_add = 15; break; }
464  }
465 
466  if (ust!=1) return rel_add;
467 
468  switch (uadd) {
469  case 0: { rel_add = 2; break; }
470  case 1: { rel_add = 1; break; }
471  case 15: { rel_add = 3; break; }
472  default: { rel_add = 3; break; }
473  }
474  return rel_add;
475 }
476 
477 
478 // static data members
479 
static int getBxMax()
const_iterator end(int bx) const
void reset() override
reset Muon Sorter
const std::vector< L1MuBMTrackSegEta > & getTSeta() const
return all eta track segments of the muon candidate
Definition: L1MuBMTrack.h:126
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:75
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
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:508
L1MuBMMuonSorter * m_ms
BM Muon Sorter.
L1MuBMAddressArray address() const
get address-array for this muon candidate
Definition: L1MuBMTrack.h:102
bool bxEmpty(int step) const
const L1MuBMSecProcId & spid() const
return Sector Processor in which the muon candidate was found
Definition: L1MuBMTrack.h:99
SPmap::iterator SPmap_iter
L1MuBMTrackSegEtaCollection _cache3
const L1MuBMWedgeSorter * ws(int id) const
get a pointer to a Wedge Sorter, index [0-11]
int sector() const
return sector number
const int hwQual() const
Get quality code.
L1MuBMTrackFinder(const edm::ParameterSet &ps, edm::ConsumesCollector &&iC)
constructor
L1MuBMTrackCollection _cache1
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.
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 -> 1; BMTF: fine eta -> 1)
void setHwHF(bool bit)
Set HF (halo / fine eta) bit (EMTF: halo -> 1; BMTF: fine eta -> 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
#define end
Definition: vmac.h:37
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:108
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 setDefaultsES(const edm::EventSetup &c)
Phi_Container const * getContainer() const
void setBXRange(int bxFirst, int bxLast)
static bool Debug()
l1t::RegionalMuonCandBxCollection _cache
#define begin
Definition: vmac.h:30
l1t::RegionalMuonCandBxCollection::const_iterator TFtracks_const_iter
container for muon candidates
int setAdd(int ust, int rel_add)
int getLastBX() const
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
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:96
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:117
L1MuBMSecProcMap * m_spmap
Sector Processors.
def move(src, dest)
Definition: eostools.py:510
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