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