CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros 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 //--------------------------------------------------
15 
16 //-----------------------
17 // This Class's Header --
18 //-----------------------
19 
21 
22 //---------------
23 // C++ Headers --
24 //---------------
25 
26 #include <iostream>
27 #include <string>
28 
29 //-------------------------------
30 // Collaborating Class Headers --
31 //-------------------------------
32 
35 
44 
46 
47 using namespace std;
48 
49 //---------------------------------
50 // class L1MuBMTrackFinder
51 //---------------------------------
52 
53 
54 //----------------
55 // Constructors --
56 //----------------
57 //:
59 _cache0(144,-9,8),_cache(36, -9, 8) {
60  // set configuration parameters
61  if ( m_config == 0 ) m_config = new L1MuBMTFConfig(ps);
62 
63  if ( L1MuBMTFConfig::Debug(1) ) cout << endl;
64  if ( L1MuBMTFConfig::Debug(1) ) cout << "**** entering L1MuBMTrackFinder ****" << endl;
65  if ( L1MuBMTFConfig::Debug(1) ) cout << endl;
66 
67  m_spmap = new L1MuBMSecProcMap();
68  m_epvec.reserve(12);
69  m_wsvec.reserve(12);
70  m_ms = 0;
71 
73 }
74 
75 
76 //--------------
77 // Destructor --
78 //--------------
79 
81 
82  delete m_spmap;
83 
84  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
85  while ( it_ep != m_epvec.end() ) {
86  delete (*it_ep);
87  it_ep++;
88  }
89  m_epvec.clear();
90 
91  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
92  while ( it_ws != m_wsvec.end() ) {
93  delete (*it_ws);
94  it_ws++;
95  }
96  m_wsvec.clear();
97 
98  delete m_ms;
99 
100  if ( m_config ) delete m_config;
101  m_config = 0;
102 
103 }
104 
105 
106 //--------------
107 // Operations --
108 //--------------
109 
110 //
111 // setup MTTF configuration
112 //
114 
115  // build the barrel Muon Trigger Track Finder
116 
117  if ( L1MuBMTFConfig::Debug(1) ) cout << endl;
118  if ( L1MuBMTFConfig::Debug(1) ) cout << "**** L1MuBMTrackFinder building ****" << endl;
119  if ( L1MuBMTFConfig::Debug(1) ) cout << endl;
120 
121  // create new sector processors
122  for ( int wh = -3; wh <= 3; wh++ ) {
123  if ( wh == 0 ) continue;
124  for ( int sc = 0; sc < 12; sc++ ) {
125  L1MuBMSecProcId tmpspid(wh,sc);
126  L1MuBMSectorProcessor* sp = new L1MuBMSectorProcessor(*this,tmpspid,std::move(iC));
127  if ( L1MuBMTFConfig::Debug(2) ) cout << "creating " << tmpspid << endl;
128  m_spmap->insert(tmpspid,sp);
129  }
130  }
131 
132  // create new eta processors and wedge sorters
133  for ( int sc = 0; sc < 12; sc++ ) {
134  L1MuBMEtaProcessor* ep = new L1MuBMEtaProcessor(*this,sc, std::move(iC));
135  if ( L1MuBMTFConfig::Debug(2) ) cout << "creating Eta Processor " << sc << endl;
136  m_epvec.push_back(ep);
137  L1MuBMWedgeSorter* ws = new L1MuBMWedgeSorter(*this,sc);
138  if ( L1MuBMTFConfig::Debug(2) ) cout << "creating Wedge Sorter " << sc << endl;
139  m_wsvec.push_back(ws);
140  }
141 
142  // create new muon sorter
143  if ( L1MuBMTFConfig::Debug(2) ) cout << "creating BM Muon Sorter " << endl;
144  m_ms = new L1MuBMMuonSorter(*this);
145 
146 }
147 
148 
149 //
150 // run MTTF
151 //
153 
155  // run the barrel Muon Trigger Track Finder
157  e.getByToken(m_DTDigiToken,dttrig);
158  if ( dttrig->getContainer()->size() == 0 ) return;
159 
160  if ( L1MuBMTFConfig::Debug(2) ) cout << endl;
161  if ( L1MuBMTFConfig::Debug(2) ) cout << "**** L1MuBMTrackFinder processing ------****" << endl;
162  if ( L1MuBMTFConfig::Debug(2) ) cout << endl;
163 
164  int bx_min = L1MuBMTFConfig::getBxMin();
165  int bx_max = L1MuBMTFConfig::getBxMax();
166 
168  _cache0.setBXRange(bx_min,bx_max);
169  _cache.setBXRange(bx_min,bx_max);
170 
171  for ( int bx = bx_min; bx <= bx_max; bx++ ) {
172  if ( dttrig->bxEmpty(bx) ) continue;
173 
174  if ( L1MuBMTFConfig::Debug(2) ) cout << "L1MuBMTrackFinder processing bunch-crossing : " << bx << endl;
175 
176  // reset MTTF
177  reset();
178 
179  // run sector processors
181  while ( it_sp != m_spmap->end() ) {
182  if ( L1MuBMTFConfig::Debug(2) ) cout << "running "
183  << (*it_sp).second->id() << endl;
184  if ( (*it_sp).second ) (*it_sp).second->run(bx,e,c);
185  if ( L1MuBMTFConfig::Debug(2) && (*it_sp).second ) (*it_sp).second->print();
186  it_sp++;
187  }
188 
189  // run eta processors
190  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
191  while ( it_ep != m_epvec.end() ) {
192  if ( L1MuBMTFConfig::Debug(2) ) cout << "running Eta Processor "
193  << (*it_ep)->id() << endl;
194  if ( *it_ep ) (*it_ep)->run(bx,e,c);
195  if ( L1MuBMTFConfig::Debug(2) && *it_ep ) (*it_ep)->print();
196  it_ep++;
197  }
198 
199  // read sector processors
200  it_sp = m_spmap->begin();
201  while ( it_sp != m_spmap->end() ) {
202  if ( L1MuBMTFConfig::Debug(2) ) cout << "reading "
203  << (*it_sp).second->id() << endl;
204  for ( int number = 0; number < 2; number++ ) {
205  const L1MuBMTrack* cand = (*it_sp).second->tracK(number);
206 
207  if ( cand && !cand->empty() ) {
208 
210 
211  if(cand->hwEta()>-33 || cand->hwEta()<32 )
212  rmc.setHwEta(eta_map[cand->hwEta()]);
213  else
214  rmc.setHwEta(-1000);
215 
216  rmc.setHwPt(cand->pt());
217  int abs_add_1 = setAdd(1,cand->address(1));
218  int abs_add_2 = setAdd(2,cand->address(2));
219  int abs_add_3 = setAdd(3,cand->address(3));
220  int abs_add_4 = setAdd(4,cand->address(4));
221 
222  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, cand->spid().wheel() < 0); // this has to be set!
223  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelNum, abs(cand->spid().wheel()) - 1); // this has to be set!
232  rmc.setHwHF(cand->hwHF());
233 
234  rmc.setHwPhi(cand->hwPhi());
235  rmc.setHwSign(cand->hwSign() == 1 ? 0 : 1 );
236  rmc.setHwSignValid(cand->hwSignValid());
237  rmc.setHwQual(cand->hwQual());
239 
240  _cache0.push_back(cand->bx(), rmc);
241 
242  }
243  }
244  it_sp++;
245  }
246 
247  // run wedge sorters
248  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
249  while ( it_ws != m_wsvec.end() ) {
250  if ( L1MuBMTFConfig::Debug(2) ) cout << "running Wedge Sorter "
251  << (*it_ws)->id() << endl;
252  if ( *it_ws ) (*it_ws)->run();
253  if ( L1MuBMTFConfig::Debug(2) && *it_ws ) (*it_ws)->print();
254 
255  // store found track candidates in container (cache)
256  if ( (*it_ws)->anyMuonCands() ) {
257  const vector<const L1MuBMTrack*>& mttf_cont = (*it_ws)->tracks();
258 
259  vector<const L1MuBMTrack*>::const_iterator iter;
260  for ( iter = mttf_cont.begin(); iter != mttf_cont.end(); iter++ ) {
261  if(!*iter) continue;
263  rmc.setHwPt((*iter)->hwPt());
264  int abs_add_1 = setAdd(1,(*iter)->address(1));
265  int abs_add_2 = setAdd(2,(*iter)->address(2));
266  int abs_add_3 = setAdd(3,(*iter)->address(3));
267  int abs_add_4 = setAdd(4,(*iter)->address(4));
268 
269  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, (*iter)->spid().wheel() < 0); // this has to be set!
270  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelNum, abs((*iter)->spid().wheel()) - 1); // this has to be set!
279  rmc.setHwHF((*iter)->hwHF());
280 
281  rmc.setHwPhi((*iter)->hwPhi());
282  if((*iter)->hwEta()>-33 || (*iter)->hwEta()<32 )
283  rmc.setHwEta(eta_map[(*iter)->hwEta()]);
284  else
285  rmc.setHwEta(-1000);
286  rmc.setHwSign((*iter)->hwSign() == 1 ? 0 : 1);
287  rmc.setHwSignValid((*iter)->hwSignValid());
288  rmc.setHwQual((*iter)->hwQual());
289  rmc.setTFIdentifiers((*iter)->spid().sector(),l1t::tftype::bmtf);
290 
291  if ( *iter ){ _cache.push_back((*iter)->bx(), rmc);}
292  }
293  }
294 
295  it_ws++;
296 
297  }//end wedge sorting
298 
299  /* // run muon sorter
300  if ( L1MuBMTFConfig::Debug(2) ) cout << "running BM Muon Sorter" << endl;
301  if ( m_ms ) m_ms->run();
302  if ( L1MuBMTFConfig::Debug(2) && m_ms ) m_ms->print();
303 
304 
305  // store found track candidates in container (cache)
306  if ( m_ms->numberOfTracks() > 0 ) {
307  const vector<const L1MuBMTrack*>& mttf_cont = m_ms->tracks();
308  vector<const L1MuBMTrack*>::const_iterator iter;
309  for ( iter = mttf_cont.begin(); iter != mttf_cont.end(); iter++ ) {
310 
311  l1t::RegionalMuonCand rmc;
312  rmc.setHwPt((*iter)->hwPt());
313  int abs_add_1 = setAdd(1,(*iter)->address(1));
314  int abs_add_2 = setAdd(2,(*iter)->address(2));
315  int abs_add_3 = setAdd(3,(*iter)->address(3));
316  int abs_add_4 = setAdd(4,(*iter)->address(4));
317 
318  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelSide, (*iter)->spid().wheel() < 0); // this has to be set!
319  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kWheelNum, abs((*iter)->spid().wheel()) - 1); // this has to be set!
320  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat1, abs_add_1);
321  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat2, abs_add_2);
322  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat3, abs_add_3);
323  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kStat4, abs_add_4);
324  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat1, 0);
325  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat2, 0);
326  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat3, 0);
327  rmc.setTrackSubAddress(l1t::RegionalMuonCand::kSegSelStat4, 0);
328 
329 
330  rmc.setHwPhi((*iter)->hwPhi());
331  if((*iter)->hwEta()>-33 || (*iter)->hwEta()<32 )
332  rmc.setHwEta(eta_map[(*iter)->hwEta()]);
333  else
334  rmc.setHwEta(-1000);
335  rmc.setHwSign((*iter)->hwSign() == 1 ? 0 : 1);
336  rmc.setHwSignValid((*iter)->hwSignValid());
337  rmc.setHwQual((*iter)->hwQual());
338  rmc.setTFIdentifiers((*iter)->spid().sector(),l1t::tftype::bmtf);
339 
340  if ( *iter ){ _cache.push_back((*iter)->bx(), rmc);}
341  }
342  }
343  */
344 
345  }//end of bx loop
346 }
347 
348 
349 //
350 // reset MTTF
351 //
353 
355  while ( it_sp != m_spmap->end() ) {
356  if ( (*it_sp).second ) (*it_sp).second->reset();
357  it_sp++;
358  }
359 
360  vector<L1MuBMEtaProcessor*>::iterator it_ep = m_epvec.begin();
361  while ( it_ep != m_epvec.end() ) {
362  if ( *it_ep ) (*it_ep)->reset();
363  it_ep++;
364  }
365 
366  vector<L1MuBMWedgeSorter*>::iterator it_ws = m_wsvec.begin();
367  while ( it_ws != m_wsvec.end() ) {
368  if ( *it_ws ) (*it_ws)->reset();
369  it_ws++;
370  }
371 
372  if ( m_ms ) m_ms->reset();
373 
374 }
375 
376 
377 //
378 // return Sector Processor container
379 //
381 
382  return m_spmap->sp(id);
383 
384 }
385 
386 
387 //
388 // return number of muon candidates found by the barrel MTTF
389 //
391  int num = 0;
392  for (int bx = _cache.getFirstBX(); bx < _cache.getLastBX(); ++bx) {
393  num += _cache.size(bx);
394  }
395  return num;
396 }
397 
398 
400 
401  return _cache.begin(bx);
402 
403 }
404 
405 
407 
408  return _cache.end(bx);
409 
410 }
411 
412 
414 
415  _cache.clear();
416  _cache0.clear();
417 
418 }
419 
420 
421 //
422 // return number of muon candidates found by the barrel MTTF at a given bx
423 //
425  return _cache.size(0);
426 }
427 
428 
429 //
430 // Convert Relative to Absolute Track Addresses
431 //
432 
433 int L1MuBMTrackFinder::setAdd(int ust, int rel_add) {
434  unsigned int uadd = rel_add;
435 
436  switch (uadd) {
437  case 0: { rel_add = 8; break; }
438  case 1: { rel_add = 9; break; }
439  case 2: { rel_add = 0; break; }
440  case 3: { rel_add = 1; break; }
441  case 8: { rel_add = 10; break; }
442  case 9: { rel_add = 11; break; }
443  case 10: { rel_add = 2; break; }
444  case 11: { rel_add = 3; break; }
445  case 4: { rel_add = 12; break; }
446  case 5: { rel_add = 13; break; }
447  case 6: { rel_add = 4; break; }
448  case 7: { rel_add = 5; break; }
449  case 15: { rel_add = 15; break; }
450  default: { rel_add = 15; break; }
451  }
452 
453  if (ust!=1) return rel_add;
454 
455  switch (uadd) {
456  case 0: { rel_add = 2; break; }
457  case 1: { rel_add = 1; break; }
458  case 15: { rel_add = 3; break; }
459  default: { rel_add = 3; break; }
460  }
461  return rel_add;
462 }
463 
464 
465 // static data members
466 
static int getBxMax()
const_iterator end(int bx) const
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:76
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:462
L1MuBMMuonSorter * m_ms
BM Muon Sorter.
L1MuBMAddressArray address() const
get address-array for this muon candidate
Definition: L1MuBMTrack.h:103
const L1MuBMSecProcId & spid() const
return Sector Processor in which the muon candidate was found
Definition: L1MuBMTrack.h:100
SPmap::iterator SPmap_iter
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.
std::map< int, int > eta_map
L1MuBMTrackFinder(const edm::ParameterSet &ps, edm::ConsumesCollector &&iC)
constructor
virtual 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:510
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:109
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)
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
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:145
Definition: sp.h:21
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:97
const L1MuBMEtaProcessor * ep(int id) const
get a pointer to an Eta Processor, index [0-11]
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