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 }
L1MuBMEUX::m_address
unsigned short int m_address
Definition: L1MuBMEUX.h:116
L1MuBMEUX::reset
void reset() override
reset Extrapolator
Definition: L1MuBMEUX.cc:238
edm::ESHandle::product
T const * product() const
Definition: ESHandle.h:86
change_name.diff
diff
Definition: change_name.py:13
L1MuBMEUX::operator==
bool operator==(const L1MuBMEUX &) const
equal operator
Definition: L1MuBMEUX.cc:76
L1MuBMEUX::L1MuBMEUX
L1MuBMEUX(const L1MuBMSectorProcessor &sp, const L1MuBMSEU &seu, int id)
constructor
Definition: L1MuBMEUX.cc:50
L1MuBMEUX::pars
L1MuDTTFParameters pars
Definition: L1MuBMEUX.h:130
L1MuBMEUX::sec_mod
int sec_mod(int) const
output sector numbers in the range -6 to +5
Definition: L1MuBMEUX.cc:258
L1MuBMTrackSegPhi
Definition: L1MuBMTrackSegPhi.h:41
L1MuBMLUTHandler::getHigh
int getHigh(int ext_ind, int address) const
get high_value for a given address
Definition: L1MuBMLUTHandler.cc:261
EX13
Definition: L1MuDTExtParam.h:22
funct::false
false
Definition: Factorize.h:29
L1MuDTTFParameters::get_soc_openlut_extr
bool get_soc_openlut_extr(int wh, int sc) const
Definition: L1MuDTTFParameters.cc:270
L1MuDTTFParameters.h
L1MuBMEUX::load
void load(const L1MuBMTrackSegPhi *start_ts, const L1MuBMTrackSegPhi *target_ts)
load data into EUX
Definition: L1MuBMEUX.cc:223
gather_cfg.cout
cout
Definition: gather_cfg.py:144
L1TMuonBarrelParams::l1mudttfparams
L1MuDTTFParameters l1mudttfparams
Definition: L1TMuonBarrelParams.h:65
L1MuDTExtLut.h
L1MuBMEUX
Definition: L1MuBMEUX.h:52
L1MuBMTrackSegPhi.h
L1MuBMLUTHandler::getLow
int getLow(int ext_ind, int address) const
get low_value for a given address
Definition: L1MuBMLUTHandler.cc:247
L1MuBMLUTHandler
Definition: L1MuBMLUTHandler.h:26
L1MuBMEUX::m_quality
unsigned short int m_quality
Definition: L1MuBMEUX.h:115
L1MuDTExtLutRcd.h
L1MuBMEUX::m_target
const L1MuBMTrackSegPhi * m_target
Definition: L1MuBMEUX.h:119
L1MuBMSectorProcessor
Definition: L1MuBMSectorProcessor.h:54
L1MuBMSecProcId::sector
int sector() const
return sector number
Definition: L1MuBMSecProcId.h:58
L1MuBMSecProcId::wheel
int wheel() const
return wheel number
Definition: L1MuBMSecProcId.h:55
EX34
Definition: L1MuDTExtParam.h:22
L1MuBMEUX::m_sp
const L1MuBMSectorProcessor & m_sp
Definition: L1MuBMEUX.h:110
L1MuBMTrackSegPhi::quality
int quality() const
return quality code
Definition: L1MuBMTrackSegPhi.h:103
EX15
Definition: L1MuDTExtParam.h:22
L1MuBMEUX.h
L1MuBMTrackSegPhi::wheel
int wheel() const
return wheel
Definition: L1MuBMTrackSegPhi.h:85
L1MuDTTFParameters::get_soc_qcut_st4
unsigned short int get_soc_qcut_st4(int wh, int sc) const
Definition: L1MuDTTFParameters.cc:210
L1MuBMEUX::result
bool result() const
return extrapolation result
Definition: L1MuBMEUX.h:97
L1MuBMSEU.h
L1MuBMEUX::ts
std::pair< const L1MuBMTrackSegPhi *, const L1MuBMTrackSegPhi * > ts() const
return pointer to start and target track segment
Definition: L1MuBMEUX.cc:250
L1MuDTExtParam.h
L1MuBMTFConfig::Debug
static bool Debug()
Definition: L1MuBMTFConfig.h:52
EX21
Definition: L1MuDTExtParam.h:22
L1MuBMTFConfig::getopenLUTs
static bool getopenLUTs()
Definition: L1MuBMTFConfig.h:61
L1MuBMEUX::nbit_phib
unsigned const short nbit_phib
Definition: L1MuBMEUX.h:127
L1MuBMEUX::m_id
int m_id
Definition: L1MuBMEUX.h:112
L1MuBMSectorProcessor::id
const L1MuBMSecProcId & id() const
return Sector Processor identifier
Definition: L1MuBMSectorProcessor.h:75
EX23
Definition: L1MuDTExtParam.h:22
EX12
Definition: L1MuDTExtParam.h:22
L1MuBMEUX::m_seu
const L1MuBMSEU & m_seu
Definition: L1MuBMEUX.h:111
L1MuBMEUX::bmtfParamsHandle
edm::ESHandle< L1TMuonBarrelParams > bmtfParamsHandle
Definition: L1MuBMEUX.h:121
L1MuBMTFConfig.h
EX25
Definition: L1MuDTExtParam.h:22
L1AbstractProcessor::run
virtual void run()
run processor logic
Definition: L1AbstractProcessor.h:40
EX24
Definition: L1MuDTExtParam.h:22
L1MuBMSEU::ext
Extrapolation ext() const
return extrapolation type
Definition: L1MuBMSEU.h:78
L1MuBMEUX::~L1MuBMEUX
~L1MuBMEUX() override
destructor
Definition: L1MuBMEUX.cc:67
edm::EventSetup
Definition: EventSetup.h:58
L1MuBMEUX::id
int id() const
return Extrapolation identifier
Definition: L1MuBMEUX.h:94
L1MuBMEUX::m_start
const L1MuBMTrackSegPhi * m_start
Definition: L1MuBMEUX.h:118
L1MuBMEUX::address
unsigned short int address() const
return extrapolation address (0-11) (address = 15 indicates negative ext. result)
Definition: L1MuBMEUX.h:103
L1MuBMTrackSegPhi::phib
int phib() const
return phib
Definition: L1MuBMTrackSegPhi.h:100
L1MuDTTFParameters::get_soc_qcut_st2
unsigned short int get_soc_qcut_st2(int wh, int sc) const
Definition: L1MuDTTFParameters.cc:198
LaserClient_cfi.high
high
Definition: LaserClient_cfi.py:50
std
Definition: JetResolutionObject.h:76
triggerObjects_cff.id
id
Definition: triggerObjects_cff.py:29
L1MuBMEUX::quality
unsigned int quality() const
return extrapolation quality
Definition: L1MuBMEUX.h:100
L1MuBMEUX::theExtLUTs
L1MuBMLUTHandler * theExtLUTs
Definition: L1MuBMEUX.h:124
edm::eventsetup::EventSetupRecordImplementation::get
PRODUCT const & get(ESGetToken< PRODUCT, T > const &iToken) const
Definition: EventSetupRecordImplementation.h:74
L1TMuonBarrelParams
Definition: L1TMuonBarrelParams.h:23
EX14
Definition: L1MuDTExtParam.h:22
L1MuBMTrackSegPhi::sector
int sector() const
return sector
Definition: L1MuBMTrackSegPhi.h:88
L1MuBMTrackSegPhi::phi
int phi() const
return phi
Definition: L1MuBMTrackSegPhi.h:97
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
L1MuDTTFParametersRcd.h
c
auto & c
Definition: CAHitNtupletGeneratorKernelsImpl.h:56
L1MuBMTFConfig
Definition: L1MuBMTFConfig.h:39
hltrates_dqm_sourceclient-live_cfg.offset
offset
Definition: hltrates_dqm_sourceclient-live_cfg.py:82
L1MuDTTFParameters::get_soc_qcut_st1
unsigned short int get_soc_qcut_st1(int wh, int sc) const
Definition: L1MuDTTFParameters.cc:186
LaserClient_cfi.low
low
Definition: LaserClient_cfi.py:52
L1MuBMEUX::nbit_phi
unsigned const short nbit_phi
Definition: L1MuBMEUX.h:126
L1TMuonBarrelParamsRcd
Definition: L1TMuonBarrelParamsRcd.h:14
L1MuBMSectorProcessor.h
L1MuBMSEU
Definition: L1MuBMSEU.h:48
L1MuBMEUX::m_result
bool m_result
Definition: L1MuBMEUX.h:114