CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
List of all members | Public Member Functions | Private Member Functions | Private Attributes
L1MuDTSectorReceiver Class Reference

#include <L1MuDTSectorReceiver.h>

Public Member Functions

 L1MuDTSectorReceiver (L1MuDTSectorProcessor &, edm::ConsumesCollector &&iC)
 constructor More...
 
void reset ()
 clear Sector Receiver More...
 
void run (int bx, const edm::Event &e, const edm::EventSetup &c)
 receive track segment data from the DTBX and CSC chamber triggers More...
 
virtual ~L1MuDTSectorReceiver ()
 destructor More...
 

Private Member Functions

int address2sector (int adr) const
 find the right sector for a given address More...
 
int address2wheel (int adr) const
 find the right wheel for a given address More...
 
void receiveCSCData (int bx, const edm::Event &e, const edm::EventSetup &c)
 receive track segment data from CSC chamber trigger More...
 
void receiveDTBXData (int bx, const edm::Event &e, const edm::EventSetup &c)
 receive track segment data from DTBX chamber trigger More...
 

Private Attributes

edm::EDGetTokenT
< CSCTriggerContainer
< csctf::TrackStub > > 
m_CSCTrSToken
 
edm::EDGetTokenT
< L1MuDTChambPhContainer
m_DTDigiToken
 
L1MuDTSectorProcessorm_sp
 
edm::ESHandle< L1MuDTTFMasksmsks
 
edm::ESHandle< L1MuDTTFParameterspars
 

Detailed Description

Sector Receiver:

The Sector Receiver receives track segment data from the DTBX and CSC chamber triggers and stores it into the Data Buffer

N. Neumeister CERN EP J. Troconiz UAM Madrid

Definition at line 53 of file L1MuDTSectorReceiver.h.

Constructor & Destructor Documentation

L1MuDTSectorReceiver::L1MuDTSectorReceiver ( L1MuDTSectorProcessor sp,
edm::ConsumesCollector &&  iC 
)

constructor

Definition at line 55 of file L1MuDTSectorReceiver.cc.

55  :
56  m_sp(sp),
59 }
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
EDGetTokenT< ProductType > mayConsume(edm::InputTag const &tag)
L1MuDTSectorProcessor & m_sp
static edm::InputTag getDTDigiInputTag()
edm::EDGetTokenT< L1MuDTChambPhContainer > m_DTDigiToken
edm::EDGetTokenT< CSCTriggerContainer< csctf::TrackStub > > m_CSCTrSToken
static edm::InputTag getCSCTrSInputTag()
L1MuDTSectorReceiver::~L1MuDTSectorReceiver ( )
virtual

destructor

Definition at line 65 of file L1MuDTSectorReceiver.cc.

65  {
66 
67 // reset();
68 
69 }

Member Function Documentation

int L1MuDTSectorReceiver::address2sector ( int  adr) const
private

find the right sector for a given address

Definition at line 293 of file L1MuDTSectorReceiver.cc.

References L1MuDTSectorProcessor::id(), m_sp, and L1MuDTSecProcId::sector().

Referenced by receiveDTBXData().

293  {
294 
295  int sector = m_sp.id().sector();
296 
297  if ( adr >= 4 && adr <= 7 ) sector = (sector+13)%12; // +1
298  if ( adr >= 8 && adr <= 11 ) sector = (sector+11)%12; // -1
299 
300  return sector;
301 
302 }
L1MuDTSectorProcessor & m_sp
int sector() const
return sector number
const L1MuDTSecProcId & id() const
return Sector Processor identifier
int L1MuDTSectorReceiver::address2wheel ( int  adr) const
private

find the right wheel for a given address

Definition at line 308 of file L1MuDTSectorReceiver.cc.

References L1MuDTSectorProcessor::id(), L1MuDTSecProcId::locwheel(), m_sp, and L1MuDTSecProcId::wheel().

Referenced by receiveDTBXData().

308  {
309 
310  int wheel = m_sp.id().locwheel();
311 
312  // for 2, 3, 6, 7, 10, 11
313  if ( (adr/2)%2 == 1 ) wheel = m_sp.id().wheel();
314 
315  return wheel;
316 
317 }
L1MuDTSectorProcessor & m_sp
const L1MuDTSecProcId & id() const
return Sector Processor identifier
int locwheel() const
return physical wheel number (-2,-1,0,+1,+2)
int wheel() const
return wheel number
void L1MuDTSectorReceiver::receiveCSCData ( int  bx,
const edm::Event e,
const edm::EventSetup c 
)
private

receive track segment data from CSC chamber trigger

Definition at line 222 of file L1MuDTSectorReceiver.cc.

References L1MuDTDataBuffer::addTSphi(), L1MuDTSectorProcessor::data(), edm::Event::getByToken(), L1MuDTTFConfig::getCSCTrSInputTag(), L1MuDTTFConfig::getEtaCanc(), L1MuDTSectorProcessor::id(), diffTwoXMLs::label, m_CSCTrSToken, m_sp, msks, pars, phi, L1MuDTSecProcId::sector(), relativeConstraints::station, GlobalPosition_Frontier_DevDB_cff::tag, and L1MuDTSecProcId::wheel().

Referenced by run().

222  {
223 
224  if ( (L1MuDTTFConfig::getCSCTrSInputTag()).label() == "none" ) return;
225 
226  if ( bx < -6 || bx > 6 ) return;
227 
229  e.getByToken(m_CSCTrSToken,csctrig);
230 
231  const int bxCSC = 6;
232 
233  vector<csctf::TrackStub> csc_list;
234  vector<csctf::TrackStub>::const_iterator csc_iter;
235 
236  int station = 1; // only ME13
237  int wheel = m_sp.id().wheel();
238  int side = ( wheel == 3 ) ? 1 : 2;
239  int sector = m_sp.id().sector();
240  int csc_sector = ( sector == 0 ) ? 6 : (sector+1)/2;
241  int subsector = ( sector%2 == 0 ) ? 2 : 1;
242 
243  csc_list = csctrig->get(side,station,csc_sector,subsector,bxCSC+bx);
244  int ncsc = 0;
245  for ( csc_iter = csc_list.begin(); csc_iter != csc_list.end(); csc_iter++ ) {
246  bool etaFlag = ( csc_iter->etaPacked() > 17 );
247  int qualCSC = csc_iter->getQuality();
248 
249  // convert CSC quality code to DTBX quality code
250  unsigned int qual = 7;
251  if ( qualCSC == 2 ) qual = 0;
252  if ( qualCSC == 6 ) qual = 1;
253  if ( qualCSC == 7 ) qual = 2;
254  if ( qualCSC == 8 ) qual = 2;
255  if ( qualCSC == 9 ) qual = 3;
256  if ( qualCSC == 10 ) qual = 3;
257  if ( qualCSC == 11 ) qual = 4;
258  if ( qualCSC == 12 ) qual = 5;
259  if ( qualCSC == 13 ) qual = 5;
260  if ( qualCSC == 14 ) qual = 6;
261  if ( qualCSC == 15 ) qual = 6;
262  if ( qual == 7 ) continue;
263 
264  // convert CSC phi to DTBX phi
265  int phi = csc_iter->phiPacked();
266  if ( phi > 2047 ) phi -= 4096;
267  if ( phi < -2048 || phi > 2047 ) continue;
268 
269  if ( msks->get_inrec_chdis_csc(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
270  if ( qual < pars->get_soc_qual_csc(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
271  if ( pars->get_soc_csc_etacanc(m_sp.id().wheel(), m_sp.id().sector()) && etaFlag ) continue;
272  if ( L1MuDTTFConfig::getEtaCanc() && etaFlag ) continue;
273 
274  if ( ncsc < 2 ) {
275  int address = 16 + ncsc;
276  bool tag = (ncsc == 1 ) ? true : false;
277  L1MuDTTrackSegPhi tmpts(wheel,sector,station+2,phi,0,
278  static_cast<L1MuDTTrackSegPhi::TSQuality>(qual),
279  tag,bx,etaFlag);
280  m_sp.data()->addTSphi(address,tmpts);
281  ncsc++;
282  }
283  // else cout << "too many CSC track segments!" << endl;
284  }
285 
286 }
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
L1MuDTSectorProcessor & m_sp
int sector() const
return sector number
const L1MuDTDataBuffer * data() const
return pointer to Data Buffer
edm::ESHandle< L1MuDTTFParameters > pars
edm::ESHandle< L1MuDTTFMasks > msks
const L1MuDTSecProcId & id() const
return Sector Processor identifier
static bool getEtaCanc()
void addTSphi(int adr, const L1MuDTTrackSegPhi &)
add new phi track segment to the Data Buffer
edm::EDGetTokenT< CSCTriggerContainer< csctf::TrackStub > > m_CSCTrSToken
int wheel() const
return wheel number
static edm::InputTag getCSCTrSInputTag()
void L1MuDTSectorReceiver::receiveDTBXData ( int  bx,
const edm::Event e,
const edm::EventSetup c 
)
private

receive track segment data from DTBX chamber trigger

Definition at line 106 of file L1MuDTSectorReceiver.cc.

References funct::abs(), address2sector(), address2wheel(), L1MuDTDataBuffer::addTSphi(), L1MuDTChambPhDigi::code(), L1MuDTSectorProcessor::data(), edm::Event::getByToken(), L1MuDTTFConfig::getNbitsExtPhi(), L1MuDTTFConfig::getTSOutOfTimeFilter(), L1MuDTTFConfig::getTSOutOfTimeWindow(), L1MuDTSectorProcessor::id(), m_DTDigiToken, m_sp, msks, L1MuDTSectorProcessor::ovl(), pars, phi, L1MuDTChambPhDigi::phi(), L1MuDTChambPhDigi::phiB(), L1MuDTSecProcId::sector(), relativeConstraints::station, GlobalPosition_Frontier_DevDB_cff::tag, and L1MuDTSecProcId::wheel().

Referenced by run().

106  {
107 
109  e.getByToken(m_DTDigiToken,dttrig);
110 
111  L1MuDTChambPhDigi const* ts=0;
112 
113  // const int bx_offset = dttrig->correctBX();
114  int bx_offset=0;
115  bx = bx + bx_offset;
116 
117  // get DTBX phi track segments
118  int address = 0;
119  for ( int station = 1; station <= 4; station++ ) {
120  int max_address = (station == 1) ? 2 : 12;
121  for (int reladr =0; reladr < max_address; reladr++) {
122  address++;
123  if ( m_sp.ovl() && (reladr/2)%2 != 0 ) continue;
124  int wheel = address2wheel(reladr);
125  int sector = address2sector(reladr);
126  if ( reladr%2 == 0 ) ts = dttrig->chPhiSegm1(wheel,station,sector,bx);
127  if ( reladr%2 == 1 ) ts = dttrig->chPhiSegm2(wheel,station,sector,bx);
128  if ( ts ) {
129  int phi = ts->phi();
130  int phib = ts->phiB();
131  int qual = ts->code();
132  bool tag = (reladr%2 == 1) ? true : false;
133 
134  int lwheel = m_sp.id().wheel();
135  lwheel = abs(lwheel)/lwheel*(abs(wheel)+1);
136 
137  if ( station == 1 ) {
138  if ( msks->get_inrec_chdis_st1(lwheel, sector) ) continue;
139  if ( qual < pars->get_inrec_qual_st1(lwheel, sector) ) continue;
140  }
141  else if ( station == 2 ) {
142  if ( msks->get_inrec_chdis_st2(lwheel, sector) ) continue;
143  if ( qual < pars->get_inrec_qual_st2(lwheel, sector) ) continue;
144  }
145  else if ( station == 3 ) {
146  if ( msks->get_inrec_chdis_st3(lwheel, sector) ) continue;
147  if ( qual < pars->get_inrec_qual_st3(lwheel, sector) ) continue;
148  }
149  else if ( station == 4 ) {
150  if ( msks->get_inrec_chdis_st4(lwheel, sector) ) continue;
151  if ( qual < pars->get_inrec_qual_st4(lwheel, sector) ) continue;
152  }
153 
154  if ( reladr/2 == 1 && qual < pars->get_soc_stdis_n(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
155  if ( reladr/2 == 2 && qual < pars->get_soc_stdis_wl(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
156  if ( reladr/2 == 3 && qual < pars->get_soc_stdis_zl(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
157  if ( reladr/2 == 4 && qual < pars->get_soc_stdis_wr(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
158  if ( reladr/2 == 5 && qual < pars->get_soc_stdis_zr(m_sp.id().wheel(), m_sp.id().sector()) ) 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 ( L1MuDTTFConfig::getTSOutOfTimeFilter() || nbx_del ) {
167 
168  int sh_phi = 12 - L1MuDTTFConfig::getNbitsExtPhi();
169  int tolerance = L1MuDTTFConfig::getTSOutOfTimeWindow();
170 
171  L1MuDTChambPhDigi const * tsPreviousBX_1 = dttrig->chPhiSegm1(wheel,station,sector,bx-1);
172  if ( tsPreviousBX_1 ) {
173  int phiBX = tsPreviousBX_1->phi();
174  int qualBX = tsPreviousBX_1->code();
175  if ( abs( (phi >> sh_phi) - (phiBX >> sh_phi) ) <= tolerance &&
176  qualBX > qual ) skipTS = true;
177  }
178 
179  L1MuDTChambPhDigi const * tsPreviousBX_2 = dttrig->chPhiSegm2(wheel,station,sector,bx-1);
180  if ( tsPreviousBX_2 ) {
181  int phiBX = tsPreviousBX_2->phi();
182  int qualBX = tsPreviousBX_2->code();
183  if ( abs( (phi >> sh_phi) - (phiBX >> sh_phi) ) <= tolerance &&
184  qualBX > qual ) skipTS = true;
185  }
186 
187  L1MuDTChambPhDigi const * tsNextBX_1 = dttrig->chPhiSegm1(wheel,station,sector,bx+1);
188  if ( tsNextBX_1 ) {
189  int phiBX = tsNextBX_1->phi();
190  int qualBX = tsNextBX_1->code();
191  if ( abs( (phi >> sh_phi) - (phiBX >> sh_phi) ) <= tolerance &&
192  qualBX > qual ) skipTS = true;
193  }
194 
195  L1MuDTChambPhDigi const * tsNextBX_2 = dttrig->chPhiSegm2(wheel,station,sector,bx+1);
196  if ( tsNextBX_2 ) {
197  int phiBX = tsNextBX_2->phi();
198  int qualBX = tsNextBX_2->code();
199  if ( abs( (phi >> sh_phi) - (phiBX >> sh_phi) ) <= tolerance &&
200  qualBX > qual ) skipTS = true;
201  }
202 
203  }
204 
205  if ( !skipTS ) {
206  L1MuDTTrackSegPhi tmpts(wheel,sector,station,phi,phib,
207  static_cast<L1MuDTTrackSegPhi::TSQuality>(qual),
208  tag,bx-bx_offset);
209  m_sp.data()->addTSphi(address-1,tmpts);
210  }
211  }
212 
213  }
214  }
215 
216 }
int address2sector(int adr) const
find the right sector for a given address
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:464
L1MuDTSectorProcessor & m_sp
static int getNbitsExtPhi()
static bool getTSOutOfTimeFilter()
int sector() const
return sector number
const L1MuDTDataBuffer * data() const
return pointer to Data Buffer
edm::ESHandle< L1MuDTTFParameters > pars
edm::ESHandle< L1MuDTTFMasks > msks
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const L1MuDTSecProcId & id() const
return Sector Processor identifier
int address2wheel(int adr) const
find the right wheel for a given address
static int getTSOutOfTimeWindow()
void addTSphi(int adr, const L1MuDTTrackSegPhi &)
add new phi track segment to the Data Buffer
edm::EDGetTokenT< L1MuDTChambPhContainer > m_DTDigiToken
int wheel() const
return wheel number
bool ovl() const
is it an overlap region Sector Processor?
void L1MuDTSectorReceiver::reset ( void  )

clear Sector Receiver

Definition at line 98 of file L1MuDTSectorReceiver.cc.

Referenced by L1MuDTSectorProcessor::reset().

98  {
99 
100 }
void L1MuDTSectorReceiver::run ( int  bx,
const edm::Event e,
const edm::EventSetup c 
)

receive track segment data from the DTBX and CSC chamber triggers

Definition at line 79 of file L1MuDTSectorReceiver.cc.

References edm::EventSetup::get(), m_sp, msks, L1MuDTTFConfig::overlap(), L1MuDTSectorProcessor::ovl(), pars, receiveCSCData(), and receiveDTBXData().

Referenced by L1MuDTSectorProcessor::run().

79  {
80 
81  c.get< L1MuDTTFParametersRcd >().get( pars );
82  c.get< L1MuDTTFMasksRcd >().get( msks );
83 
84  // get track segments from DTBX chamber trigger
85  receiveDTBXData(bx, e, c);
86 
87  // get track segments from CSC chamber trigger
88  if ( L1MuDTTFConfig::overlap() && m_sp.ovl() ) {
89  receiveCSCData(bx, e, c);
90  }
91 
92 }
void receiveCSCData(int bx, const edm::Event &e, const edm::EventSetup &c)
receive track segment data from CSC chamber trigger
void receiveDTBXData(int bx, const edm::Event &e, const edm::EventSetup &c)
receive track segment data from DTBX chamber trigger
L1MuDTSectorProcessor & m_sp
static bool overlap()
edm::ESHandle< L1MuDTTFParameters > pars
edm::ESHandle< L1MuDTTFMasks > msks
const T & get() const
Definition: EventSetup.h:56
bool ovl() const
is it an overlap region Sector Processor?

Member Data Documentation

edm::EDGetTokenT<CSCTriggerContainer<csctf::TrackStub> > L1MuDTSectorReceiver::m_CSCTrSToken
private

Definition at line 87 of file L1MuDTSectorReceiver.h.

Referenced by receiveCSCData().

edm::EDGetTokenT<L1MuDTChambPhContainer> L1MuDTSectorReceiver::m_DTDigiToken
private

Definition at line 86 of file L1MuDTSectorReceiver.h.

Referenced by receiveDTBXData().

L1MuDTSectorProcessor& L1MuDTSectorReceiver::m_sp
private
edm::ESHandle< L1MuDTTFMasks > L1MuDTSectorReceiver::msks
private

Definition at line 90 of file L1MuDTSectorReceiver.h.

Referenced by receiveCSCData(), receiveDTBXData(), and run().

edm::ESHandle< L1MuDTTFParameters > L1MuDTSectorReceiver::pars
private

Definition at line 89 of file L1MuDTSectorReceiver.h.

Referenced by receiveCSCData(), receiveDTBXData(), and run().