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