CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
L1MuBMAssignmentUnit.cc
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
3 // Class: L1MuBMAssignmentUnit
4 //
5 // Description: Assignment Unit
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 
20 #include "L1MuBMAssignmentUnit.h"
21 
22 //---------------
23 // C++ Headers --
24 //---------------
25 
26 #include <iostream>
27 #include <cmath>
28 #include <cassert>
29 
30 //-------------------------------
31 // Collaborating Class Headers --
32 //-------------------------------
33 
34 #include "L1MuBMTFConfig.h"
35 #include "L1MuBMSectorProcessor.h"
36 #include "L1MuBMDataBuffer.h"
37 #include "L1MuBMTrackSegPhi.h"
38 #include "L1MuBMTrackSegLoc.h"
39 #include "L1MuBMTrackAssembler.h"
40 #include "L1MuBMTrackAssParam.h"
41 
42 #include <iostream>
43 #include <iomanip>
44 
45 using namespace std;
46 // --------------------------------
47 // class L1MuBMAssignmentUnit
48 //---------------------------------
49 
50 //----------------
51 // Constructors --
52 //----------------
53 
55  m_sp(sp), m_id(id),
56  m_addArray(), m_TSphi(), m_ptAssMethod(L1MuBMLUTHandler::NODEF ) {
57 
58  m_TSphi.reserve(4); // a track candidate can consist of max 4 TS
59  reset();
60  setPrecision();
61 
62 }
63 
64 
65 //--------------
66 // Destructor --
67 //--------------
68 
70 }
71 
72 
73 //--------------
74 // Operations --
75 //--------------
76 
77 //
78 // run Assignment Unit
79 //
81 
82  // enable track candidate
83  m_sp.track(m_id)->enable();
84  m_sp.tracK(m_id)->enable();
85 
86  // set track class
87  TrackClass tc = m_sp.TA()->trackClass(m_id);
88  m_sp.track(m_id)->setTC(tc);
89  m_sp.tracK(m_id)->setTC(tc);
90 
91  // get relative addresses of matching track segments
95 
96  // get track segments (track segment router)
97  TSR();
100 
101  // set bunch-crossing (use first track segment)
102  vector<const L1MuBMTrackSegPhi*>::const_iterator iter = m_TSphi.begin();
103  int bx = (*iter)->bx();
104  m_sp.track(m_id)->setBx(bx);
105  m_sp.tracK(m_id)->setBx(bx);
106 
107  // assign phi
108  PhiAU(c);
109 
110  // assign pt and charge
111  PtAU(c);
112 
113  // assign quality
114  QuaAU();
115 
116 }
117 
118 
119 //
120 // reset Assignment Unit
121 //
123 
124  m_addArray.reset();
125  m_TSphi.clear();
127 
128 }
129 
130 
131 //
132 // assign phi with 8 bit precision
133 //
135 
136  const L1TMuonBarrelParamsRcd& bmtfParamsRcd = c.get<L1TMuonBarrelParamsRcd>();
137  bmtfParamsRcd.get(bmtfParamsHandle);
138  const L1TMuonBarrelParams& bmtfParams = *bmtfParamsHandle.product();
139  thePhiLUTs = new L1MuBMLUTHandler(bmtfParams);
140  //thePhiLUTs->print();
141  // calculate phi at station 2 using 8 bits (precision = 0.625 degrees)
142  int sh_phi = 12 - L1MuBMTFConfig::getNbitsPhiPhi();
143  int sh_phib = 10 - L1MuBMTFConfig::getNbitsPhiPhib();
144 
145  const L1MuBMTrackSegPhi* second = getTSphi(2); // track segment at station 2
146  const L1MuBMTrackSegPhi* first = getTSphi(1); // track segment at station 1
147  const L1MuBMTrackSegPhi* forth = getTSphi(4); // track segment at station 4
148 
149  int phi2 = 0; // phi-value at station 2
150  int sector = 0;
151  if ( second ) {
152  phi2 = second->phi() >> sh_phi;
153  sector = second->sector();
154  }
155  else if ( second == 0 && first ) {
156  phi2 = first->phi() >> sh_phi;
157  sector = first->sector();
158  }
159  else if ( second == 0 && forth ) {
160  phi2 = forth->phi() >> sh_phi;
161  sector = forth->sector();
162  }
163 
164  int sector0 = m_sp.id().sector();
165 
166  // convert sector difference to values in the range -6 to +5
167 
168  int sectordiff = (sector - sector0)%12;
169  if ( sectordiff >= 6 ) sectordiff -= 12;
170  if ( sectordiff < -6 ) sectordiff += 12;
171 
172  // convert phi to 0.625 degree precision
173  int phi_precision = 4096 >> sh_phi;
174  const double k = 57.2958/0.625/static_cast<float>(phi_precision);
175  double phi_f = static_cast<double>(phi2);
176  int phi_8 = static_cast<int>(floor(phi_f*k));
177 
178  if ( second == 0 && first ) {
179  int bend_angle = (first->phib() >> sh_phib) << sh_phib;
180  phi_8 = phi_8 + thePhiLUTs->getDeltaPhi(0,bend_angle);
181  //phi_8 = phi_8 + getDeltaPhi(0, bend_angle, bmtfParams->phi_lut());
182  }
183  else if ( second == 0 && forth ) {
184 
185  int bend_angle = (forth->phib() >> sh_phib) << sh_phib;
186  phi_8 = phi_8 + thePhiLUTs->getDeltaPhi(1,bend_angle);
187  //phi_8 = phi_8 + getDeltaPhi(1, bend_angle, bmtfParams->phi_lut());
188  }
189 
190  //If muon is found at the neighbour sector - second station
191  //a shift is needed by 48
192  phi_8 += sectordiff*48;
193 
194  int phi = phi_8 + 24;
195  if (phi > 55) phi = 55;
196  if (phi < -8) phi = -8;
197 
198  m_sp.track(m_id)->setPhi(phi); // Regional
199  m_sp.tracK(m_id)->setPhi(phi);
200 
201 delete thePhiLUTs;
202 }
203 
204 
205 //
206 // assign pt with 5 bit precision
207 //
209 
210  const L1TMuonBarrelParamsRcd& bmtfParamsRcd = c.get<L1TMuonBarrelParamsRcd>();
211  bmtfParamsRcd.get(bmtfParamsHandle);
212  const L1TMuonBarrelParams& bmtfParams = *bmtfParamsHandle.product();
213  thePtaLUTs = new L1MuBMLUTHandler(bmtfParams);
214  //thePtaLUTs->print();
215  // get pt-assignment method as function of track class and TS phib values
216  //m_ptAssMethod = getPtMethod(bmtfParams);
218  // get input address for look-up table
219  int bend_angle = getPtAddress(m_ptAssMethod);
220  int bend_carga = getPtAddress(m_ptAssMethod, 1);
221 
222  // retrieve pt value from look-up table
223  int lut_idx = m_ptAssMethod;
224  int pt = thePtaLUTs->getPt(lut_idx,bend_angle );
225  //int pt = getPt(lut_idx, bend_angle, bmtfParams->pta_lut());
226  m_sp.track(m_id)->setPt(pt);
227  m_sp.tracK(m_id)->setPt(pt);
228 
229  // assign charge
230  int chsign = getCharge(m_ptAssMethod);
231  int charge = ( bend_carga >= 0 ) ? chsign : -1 * chsign;
232  m_sp.track(m_id)->setCharge(charge);
233  m_sp.tracK(m_id)->setCharge(charge);
234  delete thePtaLUTs;
235 
236 }
237 
238 
239 //
240 // assign 3 bit quality code
241 //
243 
244  unsigned int quality = 0;
245 
246  const TrackClass tc = m_sp.TA()->trackClass(m_id);
247 
248  switch ( tc ) {
249  case T1234 : { quality = 7; break; }
250  case T123 : { quality = 6; break; }
251  case T124 : { quality = 6; break; }
252  case T134 : { quality = 5; break; }
253  case T234 : { quality = 4; break; }
254  case T12 : { quality = 3; break; }
255  case T13 : { quality = 3; break; }
256  case T14 : { quality = 3; break; }
257  case T23 : { quality = 2; break; }
258  case T24 : { quality = 2; break; }
259  case T34 : { quality = 1; break; }
260  default : { quality = 0; break; }
261  }
262 
263  m_sp.track(m_id)->setQuality(quality);
264  m_sp.tracK(m_id)->setQuality(quality);
265 
266 }
267 
268 
269 //
270 // Track Segment Router (TSR)
271 //
273 
274  // get the track segments from the data buffer
275  const L1MuBMTrackSegPhi* ts = 0;
276  for ( int stat = 1; stat <= 4; stat++ ) {
277  int adr = m_addArray.station(stat);
278  if ( adr != 15 ) {
279  ts = m_sp.data()->getTSphi(stat,adr);
280  if ( ts != 0 ) m_TSphi.push_back( ts );
281  }
282  }
283 
284 }
285 
286 
287 //
288 // get track segment from a given station
289 //
291 
292  vector<const L1MuBMTrackSegPhi*>::const_iterator iter;
293  for ( iter = m_TSphi.begin(); iter != m_TSphi.end(); iter++ ) {
294  int stat = (*iter)->station();
295  if ( station == stat ) {
296  return (*iter);
297  break;
298  }
299  }
300 
301  return 0;
302 
303 }
304 
305 
306 //
307 // convert sector Id to a precision of 2.5 degrees using 8 bits (= sector center)
308 //
310 
311  // assert( sector >=0 && sector < 12 );
312  const int sectorvalues[12] = { 0, 12, 24, 36, 48, 60, 72, 84,
313  96, 108, 120, 132 };
314 
315  return sectorvalues[sector];
316 
317 }
318 
319 
320 //
321 // determine charge
322 //
324 
325  int chargesign = 0;
326  switch ( method ) {
327  case L1MuBMLUTHandler::PT12L : { chargesign = -1; break; }
328  case L1MuBMLUTHandler::PT12H : { chargesign = -1; break; }
329  case L1MuBMLUTHandler::PT13L : { chargesign = -1; break; }
330  case L1MuBMLUTHandler::PT13H : { chargesign = -1; break; }
331  case L1MuBMLUTHandler::PT14L : { chargesign = -1; break; }
332  case L1MuBMLUTHandler::PT14H : { chargesign = -1; break; }
333  case L1MuBMLUTHandler::PT23L : { chargesign = -1; break; }
334  case L1MuBMLUTHandler::PT23H : { chargesign = -1; break; }
335  case L1MuBMLUTHandler::PT24L : { chargesign = -1; break; }
336  case L1MuBMLUTHandler::PT24H : { chargesign = -1; break; }
337  case L1MuBMLUTHandler::PT34L : { chargesign = 1; break; }
338  case L1MuBMLUTHandler::PT34H : { chargesign = 1; break; }
339 
340  case L1MuBMLUTHandler::NODEF : { chargesign = 0;
341  // cerr << "AssignmentUnit::getCharge : undefined PtAssMethod!"
342  // << endl;
343  break;
344  }
345  }
346 
347  return chargesign;
348 
349 }
350 
351 
352 //
353 // determine pt-assignment method
354 //
355 //PtAssMethod L1MuBMAssignmentUnit::getPtMethod(L1TMuonBarrelParams *l1tbmparams) const {
357 
358  // determine which pt-assignment method should be used as a function
359  // of the track class and
360  // of the phib values of the track segments making up this track candidate.
361 
362  // get bitmap of track candidate
363  const bitset<4> s = m_sp.TA()->trackBitMap(m_id);
364 
365  int method = -1;
366 
367  if ( s.test(0) && s.test(3) ) method = 2; // stations 1 and 4
368  if ( s.test(0) && s.test(2) ) method = 1; // stations 1 and 3
369  if ( s.test(0) && s.test(1) ) method = 0; // stations 1 and 2
370  if ( !s.test(0) && s.test(1) && s.test(3) ) method = 4; // stations 2 and 4
371  if ( !s.test(0) && s.test(1) && s.test(2) ) method = 3; // stations 2 and 3
372  if ( !s.test(0) && !s.test(1) && s.test(2) && s.test(3) ) method = 5; // stations 3 and 4
373  int threshold = thePtaLUTs->getPtLutThreshold(method);
374 
375  // phib values of track segments from stations 1, 2 and 4
376  int phib1 = ( getTSphi(1) != 0 ) ? getTSphi(1)->phib() : 0;
377  int phib2 = ( getTSphi(2) != 0 ) ? getTSphi(2)->phib() : 0;
378  int phib4 = ( getTSphi(4) != 0 ) ? getTSphi(4)->phib() : 0;
379 
381 
382  switch ( method ) {
383  case 0 : { pam = ( abs(phib1) < threshold ) ? L1MuBMLUTHandler::PT12H : L1MuBMLUTHandler::PT12L; break; }
384  case 1 : { pam = ( abs(phib1) < threshold ) ? L1MuBMLUTHandler::PT13H : L1MuBMLUTHandler::PT13L; break; }
385  case 2 : { pam = ( abs(phib1) < threshold ) ? L1MuBMLUTHandler::PT14H : L1MuBMLUTHandler::PT14L; break; }
386  case 3 : { pam = ( abs(phib2) < threshold ) ? L1MuBMLUTHandler::PT23H : L1MuBMLUTHandler::PT23L; break; }
387  case 4 : { pam = ( abs(phib2) < threshold ) ? L1MuBMLUTHandler::PT24H : L1MuBMLUTHandler::PT24L; break; }
388  case 5 : { pam = ( abs(phib4) < threshold ) ? L1MuBMLUTHandler::PT34H : L1MuBMLUTHandler::PT34L; break; }
389  default : ;
390  //cout << "L1MuBMAssignmentUnit : Error in PT ass method evaluation" << endl;
391  }
392 
393  return pam;
394 
395 }
396 
397 
398 //
399 // calculate bend angle
400 //
402 
403  // calculate bend angle as difference of two azimuthal positions
404 
405  int bendangle = 0;
406  switch (method) {
407  case L1MuBMLUTHandler::PT12L : { bendangle = phiDiff(1,2); break; }
408  case L1MuBMLUTHandler::PT12H : { bendangle = phiDiff(1,2); break; }
409  case L1MuBMLUTHandler::PT13L : { bendangle = phiDiff(1,3); break; }
410  case L1MuBMLUTHandler::PT13H : { bendangle = phiDiff(1,3); break; }
411  case L1MuBMLUTHandler::PT14L : { bendangle = phiDiff(1,4); break; }
412  case L1MuBMLUTHandler::PT14H : { bendangle = phiDiff(1,4); break; }
413  case L1MuBMLUTHandler::PT23L : { bendangle = phiDiff(2,3); break; }
414  case L1MuBMLUTHandler::PT23H : { bendangle = phiDiff(2,3); break; }
415  case L1MuBMLUTHandler::PT24L : { bendangle = phiDiff(2,4); break; }
416  case L1MuBMLUTHandler::PT24H : { bendangle = phiDiff(2,4); break; }
417  case L1MuBMLUTHandler::PT34L : { bendangle = phiDiff(4,3); break; }
418  case L1MuBMLUTHandler::PT34H : { bendangle = phiDiff(4,3); break; }
419  case L1MuBMLUTHandler::NODEF : { bendangle = 0;
420  // cerr << "AssignmentUnit::getPtAddress : undefined PtAssMethod" << endl;
421  break;
422  }
423  }
424 
425  int signo = 1;
426  bendangle = (bendangle+8192)%4096;
427  if ( bendangle > 2047 ) bendangle -= 4096;
428  if ( bendangle < 0 ) signo = -1;
429 
430  if (bendcharge) return signo;
431 
432  bendangle = (bendangle+2048)%1024;
433  if ( bendangle > 511 ) bendangle -= 1024;
434 
435  return bendangle;
436 
437 }
438 
439 
440 //
441 // build difference of two phi values
442 //
443 int L1MuBMAssignmentUnit::phiDiff(int stat1, int stat2) const {
444 
445  // calculate bit shift
446 
447  int sh_phi = 12 - nbit_phi;
448 
449  // get 2 phi values and add offset (30 degrees ) for adjacent sector
450  int sector1 = getTSphi(stat1)->sector();
451  int sector2 = getTSphi(stat2)->sector();
452  int phi1 = getTSphi(stat1)->phi() >> sh_phi;
453  int phi2 = getTSphi(stat2)->phi() >> sh_phi;
454 
455  // convert sector difference to values in the range -6 to +5
456 
457  int sectordiff = (sector2 - sector1)%12;
458  if ( sectordiff >= 6 ) sectordiff -= 12;
459  if ( sectordiff < -6 ) sectordiff += 12;
460 
461  // assert( abs(sectordiff) <= 1 );
462 
463  int offset = (2144 >> sh_phi) * sectordiff;
464  int bendangle = (phi2 - phi1 + offset) << sh_phi;
465 
466  return bendangle;
467 
468 }
469 
470 
471 //
472 // set precision for pt-assignment of phi and phib
473 // default is 12 bits for phi and 10 bits for phib
474 //
476 
479 
480 }
481 
482 
483 // static data members
484 
485 unsigned short int L1MuBMAssignmentUnit::nbit_phi = 12;
486 unsigned short int L1MuBMAssignmentUnit::nbit_phib = 10;
L1MuBMLUTHandler::PtAssMethod getPtMethod() const
determine pt assignment method
void setTC(TrackClass tc)
set track-class of muon candidate
Definition: L1MuBMTrack.h:145
static int getNbitsPhiPhi()
void setPt(int pt)
set pt-code of muon candidate
Definition: L1MuBMTrack.h:157
static int getNbitsPhiPhib()
L1MuBMAssignmentUnit(L1MuBMSectorProcessor &sp, int id)
constructor
edm::ESHandle< L1TMuonBarrelParams > bmtfParamsHandle
void QuaAU()
assign quality
int getPt(int pta_ind, int address) const
get pt-value for a given address
void PtAU(const edm::EventSetup &c)
assign pt and charge
void setQuality(unsigned int quality)
set quality of muon candidate
Definition: L1MuBMTrack.h:166
void setPhi(int phi)
set phi-code of muon candidate
Definition: L1MuBMTrack.h:148
int getPtAddress(L1MuBMLUTHandler::PtAssMethod, int bendcharge=0) const
calculate bend angle
void setAddresses(const L1MuBMAddressArray &addr)
set relative addresses of muon candidate
Definition: L1MuBMTrack.h:169
static int getNbitsPtaPhi()
void setCharge(int charge)
set charge of muon candidate
Definition: L1MuBMTrack.h:160
L1MuBMLUTHandler * thePtaLUTs
pt-assignment look-up tables
int getPtLutThreshold(int pta_ind) const
get pt-assignment LUT threshold
unsigned short station(int stat) const
get address of a given station [1-4]
void TSR()
Track Segment Router.
void enable()
enable muon candidate
Definition: L1MuBMTrack.h:136
std::vector< const L1MuBMTrackSegPhi * > m_TSphi
U second(std::pair< T, U > const &p)
L1MuBMTrack * tracK(int id) const
return pointer to muon candidate, index [0,1]
int sector() const
return sector number
int phib() const
return phib
static int getNbitsPtaPhib()
static int convertSector(int)
convert sector Id to 8 bit code (= sector center)
L1MuBMLUTHandler * thePhiLUTs
phi-assignment look-up tables
static unsigned short nbit_phib
of bits used for pt-assignment
static void setPrecision()
set precision of phi and phib
TrackClass trackClass(int id) const
return Track Class of found track
virtual void run()
run processor logic
void get(HolderT &iHolder) const
virtual ~L1MuBMAssignmentUnit()
destructor
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const L1MuBMTrackAssembler * TA() const
return pointer to Track Assembler
void setBx(int bx)
set charge of muon candidate
Definition: L1MuBMTrack.h:163
const L1MuBMSecProcId & id() const
return Sector Processor identifier
L1MuBMTrack * track(int id) const
return pointer to muon candidate, index [0,1]
int phi() const
return phi
m_id("(unknown)")
int getDeltaPhi(int idx, int address) const
get delta-phi for a given address (bend-angle)
void setTSphi(const std::vector< const L1MuBMTrackSegPhi * > &tsList)
set phi track segments used to form the muon candidate
Definition: L1MuBMTrack.cc:170
const T & get() const
Definition: EventSetup.h:56
T const * product() const
Definition: ESHandle.h:86
L1MuBMAddressArray m_addArray
virtual void reset()
reset Assignment Unit
const L1MuBMTrackSegPhi * getTSphi(int station) const
get track segment from a given station
const TSPhivector & getTSphi() const
get all track segments from the buffer
static int getCharge(L1MuBMLUTHandler::PtAssMethod)
determine charge
void reset()
reset address array
const std::bitset< 4 > & trackBitMap(int id) const
return bitmap of found track
const L1MuBMDataBuffer * data() const
return pointer to Data Buffer
int station() const
return station
int phiDiff(int stat1, int stat2) const
build difference of two phi values
Definition: sp.h:21
L1MuBMSectorProcessor & m_sp
void PhiAU(const edm::EventSetup &c)
assign phi
static unsigned short nbit_phi
of bits used for pt-assignment
int sector() const
return sector
L1MuBMLUTHandler::PtAssMethod m_ptAssMethod
int address(int id, int stat) const
get address of a single station of selected track candidate