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