CMS 3D CMS Logo

L1MuBMSectorReceiver.cc
Go to the documentation of this file.
1 //-------------------------------------------------
2 //
3 // Class: L1MuBMSectorReceiver
4 //
5 // Description: Sector Receiver
6 //
7 //
8 //
9 // Author :
10 // N. Neumeister CERN EP
11 // J. Troconiz UAM Madrid
12 //
13 //--------------------------------------------------
14 
15 //-----------------------
16 // This Class's Header --
17 //-----------------------
18 
20 
21 //---------------
22 // C++ Headers --
23 //---------------
24 
25 #include <iostream>
26 #include <cmath>
27 
28 //-------------------------------
29 // Collaborating Class Headers --
30 //-------------------------------
31 
37 
42 
43 using namespace std;
44 
45 // --------------------------------
46 // class L1MuBMSectorReceiver
47 //---------------------------------
48 
49 //----------------
50 // Constructors --
51 //----------------
53  : m_sp(sp),
54  m_bmtfParamsToken(iC.esConsumes()),
55  m_DTDigiToken(iC.consumes<L1MuDTChambPhContainer>(L1MuBMTFConfig::getBMDigiInputTag())) {}
56 
57 //--------------
58 // Destructor --
59 //--------------
61  // reset();
62 }
63 
64 //--------------
65 // Operations --
66 //--------------
67 
68 //
69 // receive track segment data from the BBMX chamber triggers
70 //
72  const L1TMuonBarrelParams& bmtfParams = c.getData(m_bmtfParamsToken);
73  msks = bmtfParams.l1mudttfmasks;
74  pars = bmtfParams.l1mudttfparams;
75  //pars.print();
76  //msks.print();
77 
78  // get track segments from BBMX chamber trigger
80 }
81 
82 //
83 // clear
84 //
86 
87 //
88 // receive track segment data from the BBMX chamber trigger
89 //
92  //e.getByLabel(L1MuBMTFConfig::getBMDigiInputTag(),dttrig);
93  e.getByToken(m_DTDigiToken, dttrig);
94  L1MuDTChambPhDigi const* ts = nullptr;
95 
96  // const int bx_offset = dttrig->correctBX();
97  int bx_offset = 0;
98  bx = bx + bx_offset;
99  // get BBMX phi track segments
100  int address = 0;
101  for (int station = 1; station <= 4; station++) {
102  int max_address = (station == 1) ? 2 : 12;
103  for (int reladr = 0; reladr < max_address; reladr++) {
104  address++;
105  //if ( m_sp.ovl() && (reladr/2)%2 != 0 ) continue;
106  int wheel = address2wheel(reladr);
107  int sector = address2sector(reladr);
108  //if ( (wheel==2 || wheel==-2) && station==1 ) continue;
109 
110  if (reladr % 2 == 0)
111  ts = dttrig->chPhiSegm1(wheel, station, sector, bx);
112  if (reladr % 2 == 1)
113  ts = dttrig->chPhiSegm2(wheel, station, sector, bx - 1);
114  if (ts) {
115  int phi = ts->phi();
116  // int phib = ts->phiB();
117  int phib = 0;
118  if (station != 3)
119  phib = ts->phiB();
120 
121  int qual = ts->code();
122  bool tag = (reladr % 2 == 1) ? true : false;
123 
124  int lwheel = m_sp.id().wheel();
125  lwheel = abs(lwheel) / lwheel * (abs(wheel) + 1);
126 
127  if (station == 1) {
128  if (msks.get_inrec_chdis_st1(lwheel, sector))
129  continue;
130  if (qual < pars.get_inrec_qual_st1(lwheel, sector))
131  continue;
132  } else if (station == 2) {
133  if (msks.get_inrec_chdis_st2(lwheel, sector))
134  continue;
135  if (qual < pars.get_inrec_qual_st2(lwheel, sector))
136  continue;
137  } else if (station == 3) {
138  if (msks.get_inrec_chdis_st3(lwheel, sector))
139  continue;
140  if (qual < pars.get_inrec_qual_st3(lwheel, sector))
141  continue;
142  } else if (station == 4) {
143  if (msks.get_inrec_chdis_st4(lwheel, sector))
144  continue;
145  if (qual < pars.get_inrec_qual_st4(lwheel, sector))
146  continue;
147  }
148 
149  if (reladr / 2 == 1 && qual < pars.get_soc_stdis_n(m_sp.id().wheel(), m_sp.id().sector()))
150  continue;
151  if (reladr / 2 == 2 && qual < pars.get_soc_stdis_wl(m_sp.id().wheel(), m_sp.id().sector()))
152  continue;
153  if (reladr / 2 == 3 && qual < pars.get_soc_stdis_zl(m_sp.id().wheel(), m_sp.id().sector()))
154  continue;
155  if (reladr / 2 == 4 && qual < pars.get_soc_stdis_wr(m_sp.id().wheel(), m_sp.id().sector()))
156  continue;
157  if (reladr / 2 == 5 && qual < pars.get_soc_stdis_zr(m_sp.id().wheel(), m_sp.id().sector()))
158  continue;
159 
160  //
161  // out-of-time TS filter (compare TS at +-1 bx)
162  //
163  bool skipTS = false;
164 
165  bool nbx_del = pars.get_soc_nbx_del(m_sp.id().wheel(), m_sp.id().sector());
166  if (L1MuBMTFConfig::getTSOutOfTimeFilter() || nbx_del) {
167  int sh_phi = 12 - L1MuBMTFConfig::getNbitsExtPhi();
169 
170  L1MuDTChambPhDigi const* tsPreviousBX_1 = dttrig->chPhiSegm1(wheel, station, sector, bx - 1);
171  if (tsPreviousBX_1) {
172  int phiBX = tsPreviousBX_1->phi();
173  int qualBX = tsPreviousBX_1->code();
174  if (abs((phi >> sh_phi) - (phiBX >> sh_phi)) <= tolerance && qualBX > qual)
175  skipTS = true;
176  }
177 
178  L1MuDTChambPhDigi const* tsPreviousBX_2 = dttrig->chPhiSegm2(wheel, station, sector, bx - 1);
179  if (tsPreviousBX_2) {
180  int phiBX = tsPreviousBX_2->phi();
181  int qualBX = tsPreviousBX_2->code();
182  if (abs((phi >> sh_phi) - (phiBX >> sh_phi)) <= tolerance && qualBX > qual)
183  skipTS = true;
184  }
185 
186  L1MuDTChambPhDigi const* tsNextBX_1 = dttrig->chPhiSegm1(wheel, station, sector, bx + 1);
187  if (tsNextBX_1) {
188  int phiBX = tsNextBX_1->phi();
189  int qualBX = tsNextBX_1->code();
190  if (abs((phi >> sh_phi) - (phiBX >> sh_phi)) <= tolerance && qualBX > qual)
191  skipTS = true;
192  }
193 
194  L1MuDTChambPhDigi const* tsNextBX_2 = dttrig->chPhiSegm2(wheel, station, sector, bx + 1);
195  if (tsNextBX_2) {
196  int phiBX = tsNextBX_2->phi();
197  int qualBX = tsNextBX_2->code();
198  if (abs((phi >> sh_phi) - (phiBX >> sh_phi)) <= tolerance && qualBX > qual)
199  skipTS = true;
200  }
201  }
202 
203  if (!skipTS) {
204  /* if(reladr%2 == 0) {
205  L1MuBMTrackSegPhi tmpts(wheel,sector,station,phi,phib,
206  static_cast<L1MuBMTrackSegPhi::TSQuality>(qual),
207  tag,bx-bx_offset);
208  m_sp.data()->addTSphi(address-1,tmpts);
209  }
210  if(reladr%2 == 1) {
211  L1MuBMTrackSegPhi tmpts(wheel,sector,station,phi,phib,
212  static_cast<L1MuBMTrackSegPhi::TSQuality>(qual),
213  tag,bx+1);
214  m_sp.data()->addTSphi(address-1,tmpts);
215  }*/
216  L1MuBMTrackSegPhi tmpts(
217  wheel, sector, station, phi, phib, static_cast<L1MuBMTrackSegPhi::TSQuality>(qual), tag, bx - bx_offset);
218  m_sp.data()->addTSphi(address - 1, tmpts);
219  }
220  }
221  }
222  }
223 }
224 
225 //
226 // find the right sector for a given address
227 //
229  int sector = m_sp.id().sector();
230 
231  if (adr >= 4 && adr <= 7)
232  sector = (sector + 13) % 12; // +1
233  if (adr >= 8 && adr <= 11)
234  sector = (sector + 11) % 12; // -1
235 
236  return sector;
237 }
238 
239 //
240 // find the right wheel for a given address
241 //
243  int wheel = m_sp.id().locwheel();
244 
245  // for 2, 3, 6, 7, 10, 11
246  if ((adr / 2) % 2 == 1)
247  wheel = m_sp.id().wheel();
248 
249  return wheel;
250 }
const L1MuBMSecProcId & id() const
return Sector Processor identifier
L1MuDTTFParameters l1mudttfparams
static int getTSOutOfTimeWindow()
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
int address2sector(int adr) const
find the right sector for a given address
L1MuDTTFParameters pars
void run(int bx, const edm::Event &e, const edm::EventSetup &c)
receive track segment data from the BBMX and CSC chamber triggers
static int getNbitsExtPhi()
void addTSphi(int adr, const L1MuBMTrackSegPhi &)
add new phi track segment to the Data Buffer
unsigned short int get_inrec_qual_st2(int wh, int sc) const
const double tolerance
int wheel() const
return wheel number
bool get_inrec_chdis_st4(int wh, int sc) const
unsigned short int get_soc_stdis_zl(int wh, int sc) const
int locwheel() const
return physical wheel number (-2,-1,0,+1,+2)
L1MuBMSectorReceiver(L1MuBMSectorProcessor &, edm::ConsumesCollector &&iC)
constructor
edm::EDGetTokenT< L1MuDTChambPhContainer > m_DTDigiToken
virtual ~L1MuBMSectorReceiver()
destructor
const L1MuBMDataBuffer * data() const
return pointer to Data Buffer
L1MuDTTFMasks l1mudttfmasks
bool get_inrec_chdis_st1(int wh, int sc) const
int address2wheel(int adr) const
find the right wheel for a given address
L1MuBMSectorProcessor & m_sp
unsigned short int get_soc_stdis_wl(int wh, int sc) const
unsigned short int get_soc_stdis_wr(int wh, int sc) const
unsigned short int get_soc_stdis_n(int wh, int sc) const
bool get_soc_nbx_del(int wh, int sc) const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
static bool getTSOutOfTimeFilter()
unsigned short int get_soc_stdis_zr(int wh, int sc) const
L1MuDTChambPhDigi const * chPhiSegm2(int wheel, int stat, int sect, int bx) const
void receiveBBMXData(int bx, const edm::Event &e)
receive track segment data from BBMX chamber trigger
int sector() const
return sector number
unsigned short int get_inrec_qual_st3(int wh, int sc) const
void reset()
clear Sector Receiver
unsigned short int get_inrec_qual_st1(int wh, int sc) const
unsigned short int get_inrec_qual_st4(int wh, int sc) const
bool get_inrec_chdis_st2(int wh, int sc) const
bool get_inrec_chdis_st3(int wh, int sc) const
edm::ESGetToken< L1TMuonBarrelParams, L1TMuonBarrelParamsRcd > m_bmtfParamsToken
L1MuDTChambPhDigi const * chPhiSegm1(int wheel, int stat, int sect, int bx) const