CMS 3D CMS Logo

L1MuBMEUX.cc
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
3 // Class: L1MuBMEUX
4 //
5 // Description: Extrapolator
6 //
7 //
8 //
9 // Author :
10 // N. Neumeister CERN EP
11 //
12 //--------------------------------------------------
13 
14 //-----------------------
15 // This Class's Header --
16 //-----------------------
17 
19 
20 //---------------
21 // C++ Headers --
22 //---------------
23 
24 #include <iostream>
25 
26 //-------------------------------
27 // Collaborating Class Headers --
28 //-------------------------------
29 
34 
41 
42 using namespace std;
43 
44 // --------------------------------
45 // class L1MuBMEUX
46 //---------------------------------
47 
48 //----------------
49 // Constructors --
50 //----------------
51 
53  : m_sp(sp),
54  m_seu(seu),
55  m_id(id),
56  m_result(false),
57  m_quality(0),
58  m_address(15),
59  m_start(nullptr),
60  m_target(nullptr),
61  theExtFilter(L1MuBMTFConfig::getExtTSFilter()),
62  nbit_phi(L1MuBMTFConfig::getNbitsExtPhi()),
63  nbit_phib(L1MuBMTFConfig::getNbitsExtPhib()) {}
64 
65 //--------------
66 // Destructor --
67 //--------------
68 
70 
71 //--------------
72 // Operations --
73 //--------------
74 
75 //
76 // Equal operator
77 //
78 bool L1MuBMEUX::operator==(const L1MuBMEUX& eux) const {
79  if (m_id != eux.id())
80  return false;
81  if (m_result != eux.result())
82  return false;
83  if (m_quality != eux.quality())
84  return false;
85  if (m_address != eux.address())
86  return false;
87  return true;
88 }
89 
90 //
91 // run EUX
92 //
93 void L1MuBMEUX::run(const L1TMuonBarrelParams& bmtfParams) {
94  pars = bmtfParams.l1mudttfparams;
95  theExtLUTs = new L1MuBMLUTHandler(bmtfParams);
96 
97  if (L1MuBMTFConfig::Debug(4))
98  cout << "Run EUX " << m_id << endl;
99  if (L1MuBMTFConfig::Debug(4))
100  cout << "start : " << *m_start << endl;
101  if (L1MuBMTFConfig::Debug(4))
102  cout << "target : " << *m_target << endl;
103 
104  if (m_start == nullptr || m_target == nullptr) {
105  if (L1MuBMTFConfig::Debug(4))
106  cout << "Error: EUX has no data loaded" << endl;
107  delete theExtLUTs;
108  return;
109  }
110 
111  // start sector
112  int sector_st = m_start->sector();
113 
114  // target sector
115  int sector_ta = m_target->sector();
116 
117  // get index of look-up table
118  int lut_idx = m_seu.ext();
119  if (abs(m_target->wheel()) == 3) {
120  switch (m_seu.ext()) {
121  case EX13: {
122  lut_idx = EX15;
123  break;
124  }
125  case EX23: {
126  lut_idx = EX25;
127  break;
128  }
129  default: {
130  lut_idx = m_seu.ext();
131  break;
132  }
133  }
134  }
135 
136  if (L1MuBMTFConfig::Debug(5))
137  cout << "EUX : using look-up table : " << static_cast<Extrapolation>(lut_idx) << endl;
138 
139  // Extrapolation TS quality filter
140  int qcut = 0;
141  if (m_seu.ext() == EX12)
142  qcut = pars.get_soc_qcut_st1(m_sp.id().wheel(), m_sp.id().sector());
143  if (m_seu.ext() == EX13)
144  qcut = pars.get_soc_qcut_st1(m_sp.id().wheel(), m_sp.id().sector());
145  if (m_seu.ext() == EX14)
146  qcut = pars.get_soc_qcut_st1(m_sp.id().wheel(), m_sp.id().sector());
147  if (m_seu.ext() == EX21)
148  qcut = pars.get_soc_qcut_st2(m_sp.id().wheel(), m_sp.id().sector());
149  if (m_seu.ext() == EX23)
150  qcut = pars.get_soc_qcut_st2(m_sp.id().wheel(), m_sp.id().sector());
151  if (m_seu.ext() == EX24)
152  qcut = pars.get_soc_qcut_st2(m_sp.id().wheel(), m_sp.id().sector());
153  if (m_seu.ext() == EX34)
154  qcut = pars.get_soc_qcut_st4(m_sp.id().wheel(), m_sp.id().sector());
155 
156  if (m_start->quality() < qcut) {
157  delete theExtLUTs;
158  return;
159  }
160  // calculate bit shift
161  int sh_phi = 12 - nbit_phi;
162  int sh_phib = 10 - nbit_phib;
163 
164  int phi_target = m_target->phi() >> sh_phi;
165  int phi_start = m_start->phi() >> sh_phi;
166  int phib_start = l1t::bitShift((m_start->phib() >> sh_phib), sh_phib);
167  if (phib_start < 0)
168  phib_start += (1 << sh_phib) - 1;
169 
170  // compute difference in phi
171  int diff = phi_target - phi_start;
172 
173  // get low and high values from look-up table
174  // and add offset (30 degrees ) for extrapolation to adjacent sector
175  int offset = -2144 >> sh_phi;
176  offset *= sec_mod(sector_ta - sector_st);
177  int low = theExtLUTs->getLow(lut_idx, phib_start);
178  int high = theExtLUTs->getHigh(lut_idx, phib_start);
179  if (low < 0)
180  low += (1 << sh_phi) - 1;
181  if (high < 0)
182  high += (1 << sh_phi) - 1;
183  low = (low >> sh_phi) + offset;
184  high = (high >> sh_phi) + offset;
185 
186  int phi_offset = phi_target - offset;
187  if ((lut_idx == EX34) || (lut_idx == EX21))
188  phi_offset = phi_start + offset;
189  if (phi_offset >= (1 << (nbit_phi - 1)) - 1) {
190  delete theExtLUTs;
191  return;
192  }
193  if (phi_offset < -(1 << (nbit_phi - 1)) + 1) {
194  delete theExtLUTs;
195  return;
196  }
197  // is phi-difference within the extrapolation window?
198  bool openlut = pars.get_soc_openlut_extr(m_sp.id().wheel(), m_sp.id().sector());
199  if ((diff >= low && diff <= high) || L1MuBMTFConfig::getopenLUTs() || openlut) {
200  m_result = true;
201  int qual_st = m_start->quality();
202  int qual_ta = m_target->quality();
203  if (m_seu.ext() == EX34 || m_seu.ext() == EX21) {
204  m_quality = (qual_st == 7) ? 0 : qual_st + 1;
205  } else {
206  m_quality = (qual_ta == 7) ? 0 : qual_ta + 1;
207  }
208  m_address = m_id;
209  }
210  delete theExtLUTs;
211  if (L1MuBMTFConfig::Debug(5))
212  cout << "diff : " << low << " " << diff << " " << high << " : " << m_result << " " << endl;
213 }
214 
215 //
216 // load data into EUX
217 //
218 void L1MuBMEUX::load(const L1MuBMTrackSegPhi* start_ts, const L1MuBMTrackSegPhi* target_ts) {
219  m_start = start_ts;
220  m_target = target_ts;
221 
222  // in case of EX34 and EX21 exchange start and target
223  if ((m_seu.ext() == EX34) || (m_seu.ext() == EX21)) {
224  m_start = target_ts;
225  m_target = start_ts;
226  }
227 }
228 
229 //
230 // reset this EUX
231 //
232 
234  m_result = false;
235  m_quality = 0;
236  m_address = 15;
237 
238  m_start = nullptr;
239  m_target = nullptr;
240 }
241 
242 //
243 // return pointer to start and target track segment
244 //
245 pair<const L1MuBMTrackSegPhi*, const L1MuBMTrackSegPhi*> L1MuBMEUX::ts() const {
246  return pair<const L1MuBMTrackSegPhi*, const L1MuBMTrackSegPhi*>(m_start, m_target);
247 }
248 
249 //
250 // symmetric modulo function for sectors
251 // output values in the range -6 to +5
252 //
253 int L1MuBMEUX::sec_mod(int sector) const {
254  int new_sector = sector % 12;
255  if (new_sector >= 6)
256  new_sector = new_sector - 12;
257  if (new_sector < -6)
258  new_sector = new_sector + 12;
259 
260  return new_sector;
261 }
const L1MuBMSEU & m_seu
Definition: L1MuBMEUX.h:109
L1MuBMLUTHandler * theExtLUTs
Definition: L1MuBMEUX.h:119
const L1MuBMSecProcId & id() const
return Sector Processor identifier
L1MuDTTFParameters l1mudttfparams
unsigned int quality() const
return extrapolation quality
Definition: L1MuBMEUX.h:98
static bool getopenLUTs()
void reset()
reset Extrapolator
Definition: L1MuBMEUX.cc:233
int m_id
Definition: L1MuBMEUX.h:110
unsigned short int m_address
Definition: L1MuBMEUX.h:114
int wheel() const
return wheel
int wheel() const
return wheel number
const L1MuBMTrackSegPhi * m_target
Definition: L1MuBMEUX.h:117
L1MuDTTFParameters pars
Definition: L1MuBMEUX.h:124
unsigned short int get_soc_qcut_st2(int wh, int sc) const
unsigned short int get_soc_qcut_st1(int wh, int sc) const
const L1MuBMTrackSegPhi * m_start
Definition: L1MuBMEUX.h:116
unsigned short int get_soc_qcut_st4(int wh, int sc) const
std::pair< const L1MuBMTrackSegPhi *, const L1MuBMTrackSegPhi * > ts() const
return pointer to start and target track segment
Definition: L1MuBMEUX.cc:245
int quality() const
return quality code
const L1MuBMSectorProcessor & m_sp
Definition: L1MuBMEUX.h:108
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int phib() const
return phib
Extrapolation
bool operator==(const L1MuBMEUX &) const
equal operator
Definition: L1MuBMEUX.cc:78
int getHigh(int ext_ind, int address) const
get high_value for a given address
int sector() const
return sector number
int getLow(int ext_ind, int address) const
get low_value for a given address
int sec_mod(int) const
output sector numbers in the range -6 to +5
Definition: L1MuBMEUX.cc:253
bool m_result
Definition: L1MuBMEUX.h:112
bool result() const
return extrapolation result
Definition: L1MuBMEUX.h:95
static bool Debug()
unsigned short const nbit_phi
Definition: L1MuBMEUX.h:121
void load(const L1MuBMTrackSegPhi *start_ts, const L1MuBMTrackSegPhi *target_ts)
load data into EUX
Definition: L1MuBMEUX.cc:218
unsigned short const nbit_phib
Definition: L1MuBMEUX.h:122
int sector() const
return sector
int phi() const
return phi
~L1MuBMEUX()
destructor
Definition: L1MuBMEUX.cc:69
unsigned short int m_quality
Definition: L1MuBMEUX.h:113
unsigned short int address() const
return extrapolation address (0-11) (address = 15 indicates negative ext. result) ...
Definition: L1MuBMEUX.h:101
int id() const
return Extrapolation identifier
Definition: L1MuBMEUX.h:92
void run(const L1TMuonBarrelParams &c)
run Extrapolator
Definition: L1MuBMEUX.cc:93
Extrapolation ext() const
return extrapolation type
Definition: L1MuBMSEU.h:78
int bitShift(int num, int bits)
Definition: BitShift.h:6
L1MuBMEUX(const L1MuBMSectorProcessor &sp, const L1MuBMSEU &seu, int id)
constructor
Definition: L1MuBMEUX.cc:52
bool get_soc_openlut_extr(int wh, int sc) const