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 &)
 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

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 46 of file L1MuDTSectorReceiver.h.

Constructor & Destructor Documentation

L1MuDTSectorReceiver::L1MuDTSectorReceiver ( L1MuDTSectorProcessor sp)

constructor

Definition at line 55 of file L1MuDTSectorReceiver.cc.

55  :
56  m_sp(sp) {
57 
58 }
L1MuDTSectorProcessor & m_sp
L1MuDTSectorReceiver::~L1MuDTSectorReceiver ( )
virtual

destructor

Definition at line 64 of file L1MuDTSectorReceiver.cc.

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

Member Function Documentation

int L1MuDTSectorReceiver::address2sector ( int  adr) const
private

find the right sector for a given address

Definition at line 292 of file L1MuDTSectorReceiver.cc.

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

Referenced by receiveDTBXData().

292  {
293 
294  int sector = m_sp.id().sector();
295 
296  if ( adr >= 4 && adr <= 7 ) sector = (sector+13)%12; // +1
297  if ( adr >= 8 && adr <= 11 ) sector = (sector+11)%12; // -1
298 
299  return sector;
300 
301 }
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 307 of file L1MuDTSectorReceiver.cc.

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

Referenced by receiveDTBXData().

307  {
308 
309  int wheel = m_sp.id().locwheel();
310 
311  // for 2, 3, 6, 7, 10, 11
312  if ( (adr/2)%2 == 1 ) wheel = m_sp.id().wheel();
313 
314  return wheel;
315 
316 }
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 221 of file L1MuDTSectorReceiver.cc.

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

Referenced by run().

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

References funct::abs(), address2sector(), address2wheel(), L1MuDTDataBuffer::addTSphi(), L1MuDTChambPhDigi::code(), L1MuDTSectorProcessor::data(), edm::Event::getByLabel(), L1MuDTTFConfig::getDTDigiInputTag(), L1MuDTTFConfig::getNbitsExtPhi(), L1MuDTTFConfig::getTSOutOfTimeFilter(), L1MuDTTFConfig::getTSOutOfTimeWindow(), L1MuDTSectorProcessor::id(), 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().

105  {
106 
109 
110  L1MuDTChambPhDigi const* ts=0;
111 
112  // const int bx_offset = dttrig->correctBX();
113  int bx_offset=0;
114  bx = bx + bx_offset;
115 
116  // get DTBX phi track segments
117  int address = 0;
118  for ( int station = 1; station <= 4; station++ ) {
119  int max_address = (station == 1) ? 2 : 12;
120  for (int reladr =0; reladr < max_address; reladr++) {
121  address++;
122  if ( m_sp.ovl() && (reladr/2)%2 != 0 ) continue;
123  int wheel = address2wheel(reladr);
124  int sector = address2sector(reladr);
125  if ( reladr%2 == 0 ) ts = dttrig->chPhiSegm1(wheel,station,sector,bx);
126  if ( reladr%2 == 1 ) ts = dttrig->chPhiSegm2(wheel,station,sector,bx);
127  if ( ts ) {
128  int phi = ts->phi();
129  int phib = ts->phiB();
130  int qual = ts->code();
131  bool tag = (reladr%2 == 1) ? true : false;
132 
133  int lwheel = m_sp.id().wheel();
134  lwheel = abs(lwheel)/lwheel*(abs(wheel)+1);
135 
136  if ( station == 1 ) {
137  if ( msks->get_inrec_chdis_st1(lwheel, sector) ) continue;
138  if ( qual < pars->get_inrec_qual_st1(lwheel, sector) ) continue;
139  }
140  else if ( station == 2 ) {
141  if ( msks->get_inrec_chdis_st2(lwheel, sector) ) continue;
142  if ( qual < pars->get_inrec_qual_st2(lwheel, sector) ) continue;
143  }
144  else if ( station == 3 ) {
145  if ( msks->get_inrec_chdis_st3(lwheel, sector) ) continue;
146  if ( qual < pars->get_inrec_qual_st3(lwheel, sector) ) continue;
147  }
148  else if ( station == 4 ) {
149  if ( msks->get_inrec_chdis_st4(lwheel, sector) ) continue;
150  if ( qual < pars->get_inrec_qual_st4(lwheel, sector) ) continue;
151  }
152 
153  if ( reladr/2 == 1 && qual < pars->get_soc_stdis_n(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
154  if ( reladr/2 == 2 && qual < pars->get_soc_stdis_wl(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
155  if ( reladr/2 == 3 && qual < pars->get_soc_stdis_zl(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
156  if ( reladr/2 == 4 && qual < pars->get_soc_stdis_wr(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
157  if ( reladr/2 == 5 && qual < pars->get_soc_stdis_zr(m_sp.id().wheel(), m_sp.id().sector()) ) continue;
158 
159  //
160  // out-of-time TS filter (compare TS at +-1 bx)
161  //
162  bool skipTS = false;
163 
164  bool nbx_del = pars->get_soc_nbx_del(m_sp.id().wheel(), m_sp.id().sector());
165  if ( L1MuDTTFConfig::getTSOutOfTimeFilter() || nbx_del ) {
166 
167  int sh_phi = 12 - L1MuDTTFConfig::getNbitsExtPhi();
168  int tolerance = L1MuDTTFConfig::getTSOutOfTimeWindow();
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 &&
175  qualBX > qual ) 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 &&
183  qualBX > qual ) 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 &&
191  qualBX > qual ) 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 &&
199  qualBX > qual ) skipTS = true;
200  }
201 
202  }
203 
204  if ( !skipTS ) {
205  L1MuDTTrackSegPhi tmpts(wheel,sector,station,phi,phib,
206  static_cast<L1MuDTTrackSegPhi::TSQuality>(qual),
207  tag,bx-bx_offset);
208  m_sp.data()->addTSphi(address-1,tmpts);
209  }
210  }
211 
212  }
213  }
214 
215 }
int address2sector(int adr) const
find the right sector for a given address
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
bool getByLabel(InputTag const &tag, Handle< PROD > &result) const
Definition: Event.h:402
int address2wheel(int adr) const
find the right wheel for a given address
static int getTSOutOfTimeWindow()
static edm::InputTag getDTDigiInputTag()
void addTSphi(int adr, const L1MuDTTrackSegPhi &)
add new phi track segment to the Data Buffer
int wheel() const
return wheel number
bool ovl() const
is it an overlap region Sector Processor?
Definition: DDAxes.h:10
void L1MuDTSectorReceiver::reset ( void  )

clear Sector Receiver

Definition at line 97 of file L1MuDTSectorReceiver.cc.

Referenced by L1MuDTSectorProcessor::reset().

97  {
98 
99 }
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 78 of file L1MuDTSectorReceiver.cc.

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

Referenced by L1MuDTSectorProcessor::run().

78  {
79 
80  c.get< L1MuDTTFParametersRcd >().get( pars );
81  c.get< L1MuDTTFMasksRcd >().get( msks );
82 
83  // get track segments from DTBX chamber trigger
84  receiveDTBXData(bx, e, c);
85 
86  // get track segments from CSC chamber trigger
87  if ( L1MuDTTFConfig::overlap() && m_sp.ovl() ) {
88  receiveCSCData(bx, e, c);
89  }
90 
91 }
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:55
bool ovl() const
is it an overlap region Sector Processor?

Member Data Documentation

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

Definition at line 81 of file L1MuDTSectorReceiver.h.

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

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

Definition at line 80 of file L1MuDTSectorReceiver.h.

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