CMS 3D CMS Logo

List of all members | Public Member Functions | Private Attributes
CSCSPEvent Class Reference

#include <CSCSPEvent.h>

Public Member Functions

const CSCSPCounterscounters (void) const throw ()
 
 CSCSPEvent (void)
 
const CSCSPHeaderheader (void) const throw ()
 
const CSCSPRecordrecord (unsigned int tbin) const throw ()
 
const CSCSPTrailertrailer (void) const throw ()
 
bool unpack (const unsigned short *&buf) throw ()
 

Private Attributes

CSCSPCounters counters_
 
CSCSPHeader header_
 
CSCSPRecord record_ [7]
 
CSCSPTrailer trailer_
 

Detailed Description

Definition at line 9 of file CSCSPEvent.h.

Constructor & Destructor Documentation

◆ CSCSPEvent()

CSCSPEvent::CSCSPEvent ( void  )
inline

Definition at line 25 of file CSCSPEvent.h.

25 {}

Member Function Documentation

◆ counters()

const CSCSPCounters& CSCSPEvent::counters ( void  ) const
throw (
)
inline

◆ header()

const CSCSPHeader& CSCSPEvent::header ( void  ) const
throw (
)
inline

Definition at line 17 of file CSCSPEvent.h.

17 { return header_; }

References header_.

Referenced by CSCTFUnpacker::produce().

◆ record()

const CSCSPRecord& CSCSPEvent::record ( unsigned int  tbin) const
throw (
)
inline

Definition at line 21 of file CSCSPEvent.h.

21 { return record_[tbin]; }

References record_.

Referenced by CSCTFUnpacker::produce().

◆ trailer()

const CSCSPTrailer& CSCSPEvent::trailer ( void  ) const
throw (
)
inline

Definition at line 19 of file CSCSPEvent.h.

19 { return trailer_; }

References trailer_.

◆ unpack()

bool CSCSPEvent::unpack ( const unsigned short *&  buf)
throw (
)

if( track.ME1_tbin()>2 ) unpackError |= true; // because bxaDepth<=2

if( track.ME2_tbin()>2 ) unpackError |= true; // because bxaDepth<=2

if( track.ME3_tbin()>2 ) unpackError |= true; // because bxaDepth<=2

if( track.ME4_tbin()>2 ) unpackError |= true; // because bxaDepth<=2

if( track.MB_tbin()>2 ) unpackError |= true; // because bxaDepth<=2

Definition at line 6 of file CSCSPEvent.cc.

6  {
7  bool unpackError = false;
8 
9  if ((buf[0] & 0xF000) != 0x9000 || (buf[1] & 0xF000) != 0x9000 || (buf[2] & 0xF000) != 0x9000 ||
10  (buf[3] & 0xF000) != 0x9000 || (buf[4] & 0xF000) != 0xA000 || (buf[5] & 0xF000) != 0xA000 ||
11  (buf[6] & 0xF000) != 0xA000 || (buf[7] & 0xF000) != 0xA000)
12  return true;
13  else
14  unpackError |= header_.unpack(buf);
15 
16  if (!header_.empty()) {
17  // Block of Counters is added in format version 4.3 (dated by 05/27/2007)
18  if (header_.format_version())
19  unpackError |= counters_.unpack(buf);
20 
21  if (header_.format_version() < 3 || !header_.suppression()) {
22  for (unsigned short tbin = 0; tbin < header_.nTBINs(); tbin++)
23  unpackError |= record_[tbin].unpack(buf, header_.active(), header_.suppression(), tbin);
24  } else {
25  // For the v.5.3 zero supression tbin has to be identified from the Data Block Header (BH2d word), as opposed to plain counting when empty records are not suppressed
26  for (unsigned short tbin = 0, actual_tbin = (buf[7] >> 8) & 0x7; tbin < header_.nTBINs(); tbin++) {
27  bzero(&(record_[tbin]), sizeof(record_[tbin]));
28  // Check if we ran into the trailer (happens once all the records were read out)
29  if ((buf[0] & 0xF000) == 0xF000 && (buf[1] & 0xF000) == 0xF000 && (buf[2] & 0xF000) == 0xF000 &&
30  (buf[3] & 0xF000) == 0xF000 && (buf[4] & 0xF000) == 0xE000 && (buf[5] & 0xF000) == 0xE000 &&
31  (buf[6] & 0xF000) == 0xE000 && (buf[7] & 0xF000) == 0xE000)
32  break;
33  // Skip supressed empty tbins in the format version >=5.3
34  if (tbin + 1 != actual_tbin)
35  continue;
36  // Unpack the record
37  unpackError |= record_[tbin].unpack(buf, header_.active(), header_.suppression(), tbin);
38  actual_tbin = (buf[7] >> 8) & 0x7;
39  }
40  }
41 
42  // Link initial LCTs to the tracks in each time bin
43  for (unsigned short tbin = 0; tbin < header_.nTBINs(); tbin++) {
44  for (unsigned short trk = 0; trk < 3; trk++) {
45  CSCSP_SPblock &track = record_[tbin].sp[trk];
46  if (track.ME1_id() == 0 && track.ME2_id() == 0 && track.ME3_id() == 0 && track.ME4_id() == 0 &&
47  track.MB_id() == 0)
48  continue;
49  // The key LCT identified by the BXA algorithm is the second earliest LCT
50  int second_earliest_lct_delay =
51  -1; // this is going to be a # tbins the key LCT was delayed to allign with the latest LCT
52  if (track.mode() != 15 && track.mode() != 11) { // BXA works only on non halo tracks and non-singles
53  // BXA algorithm is not trivial: first let's order all the delays (MEx_tbin), which are aligning LCTs to the tbin of the latest LCT
54  std::map<int, std::list<int> > timeline;
55  if (track.ME1_id())
56  timeline[track.ME1_tbin()].push_back(1);
57  if (track.ME2_id())
58  timeline[track.ME2_tbin()].push_back(2);
59  if (track.ME3_id())
60  timeline[track.ME3_tbin()].push_back(3);
61  if (track.ME4_id())
62  timeline[track.ME4_tbin()].push_back(4);
63  if (track.MB_id())
64  timeline[track.MB_tbin()].push_back(5);
65  int earliest_lct_delay = -1; //, second_earliest_lct_delay = -1;
66  // Going from largest to smallest delay (earliest LCT pops up first in the loop)
67  for (int delay = 7; delay >= 0 && second_earliest_lct_delay == -1; delay--) {
68  std::list<int>::const_iterator iter = timeline[delay].begin();
69  while (iter != timeline[delay].end() && second_earliest_lct_delay == -1) {
70  if (earliest_lct_delay == -1)
71  earliest_lct_delay = delay;
72  else if (second_earliest_lct_delay == -1)
73  second_earliest_lct_delay = delay;
74  iter++;
75  }
76  }
77  } else
78  second_earliest_lct_delay = 0;
79 
80  // MEx_tbin are LCTs delays shifting all of them to the bx of last LCT used to build a track
81  // let's convert delays to TBINs keeping in mind that absolute_lct_tbin = track_tbin + (second_earliest_delay - lct_delay)
82  if (track.ME1_id()) { // if track contains LCT from the ME1
83  unsigned int mpc = (track.ME1_id() > 3 ? 1 : 0);
84  int ME1_tbin = tbin + second_earliest_lct_delay - track.ME1_tbin();
86  if (ME1_tbin >= 0 && ME1_tbin < 7) {
87  std::vector<CSCSP_MEblock> lcts = record_[ME1_tbin].LCTs(mpc);
88  for (std::vector<CSCSP_MEblock>::const_iterator lct = lcts.begin(); lct != lcts.end(); lct++)
89  // Due to old MPC firmware link information was not accessible for some data:
90  //if( lct->link()==(mpc?track.ME1_id()-3:track.ME1_id()) ){
91  if (((lct->spInput() - 1) % 3 + 1) == (mpc ? track.ME1_id() - 3 : track.ME1_id())) {
92  track.lct_[0] = *lct;
93  track.lctFilled[0] = true;
94  }
95  }
96  }
97  if (track.ME2_id()) { // ... ME2
98  int ME2_tbin = tbin + second_earliest_lct_delay - track.ME2_tbin();
100  if (ME2_tbin >= 0 && ME2_tbin < 7) {
101  std::vector<CSCSP_MEblock> lcts = record_[ME2_tbin].LCTs(2);
102  for (std::vector<CSCSP_MEblock>::const_iterator lct = lcts.begin(); lct != lcts.end(); lct++)
103  // Due to old MPC firmware link information was not accessible for some data:
104  //if( lct->link()==track.ME2_id() ){
105  if (((lct->spInput() - 1) % 3 + 1) == track.ME2_id()) {
106  track.lct_[1] = *lct;
107  track.lctFilled[1] = true;
108  }
109  }
110  }
111  if (track.ME3_id()) { // ... ME3
112  int ME3_tbin = tbin + second_earliest_lct_delay - track.ME3_tbin();
114  if (ME3_tbin >= 0 && ME3_tbin < 7) {
115  std::vector<CSCSP_MEblock> lcts = record_[ME3_tbin].LCTs(3);
116  for (std::vector<CSCSP_MEblock>::const_iterator lct = lcts.begin(); lct != lcts.end(); lct++)
117  // Due to old MPC firmware link information was not accessible for some data:
118  //if( lct->link()==track.ME3_id() ){
119  if (((lct->spInput() - 1) % 3 + 1) == track.ME3_id()) {
120  track.lct_[2] = *lct;
121  track.lctFilled[2] = true;
122  }
123  }
124  }
125  if (track.ME4_id()) { // ... fourth station
126  int ME4_tbin = tbin + second_earliest_lct_delay - track.ME4_tbin();
128  if (ME4_tbin >= 0 && ME4_tbin < 7) {
129  std::vector<CSCSP_MEblock> lcts = record_[ME4_tbin].LCTs(4);
130  for (std::vector<CSCSP_MEblock>::const_iterator lct = lcts.begin(); lct != lcts.end(); lct++)
131  // Due to old MPC firmware link information was not accessible for some data:
132  //if( lct->link()==track.ME4_id() ){
133  if (((lct->spInput() - 1) % 3 + 1) == track.ME4_id()) {
134  track.lct_[3] = *lct;
135  track.lctFilled[3] = true;
136  }
137  }
138  }
139  if (track.MB_id()) { // ... barrel
140  int MB_tbin = tbin + second_earliest_lct_delay - track.MB_tbin();
142  if (MB_tbin >= 0 && MB_tbin < 7) {
143  std::vector<CSCSP_MBblock> stubs = record_[MB_tbin].mbStubs();
144  for (std::vector<CSCSP_MBblock>::const_iterator stub = stubs.begin(); stub != stubs.end(); stub++)
145  if ((stub->id() == 1 && track.MB_id() % 2 == 1) || (stub->id() == 2 && track.MB_id() % 2 == 0)) {
146  track.dt_ = *stub;
147  track.dtFilled = true;
148  }
149  }
150  }
151  }
152  }
153  }
154  unpackError |= trailer_.unpack(buf);
155 
156  return unpackError;
157 }

References visDQMUpload::buf, phase2TrackerDigitizer_cfi::delay, end, HLT_2018_cff::track, and unpack().

Referenced by unpack().

Member Data Documentation

◆ counters_

CSCSPCounters CSCSPEvent::counters_
private

Definition at line 12 of file CSCSPEvent.h.

Referenced by counters().

◆ header_

CSCSPHeader CSCSPEvent::header_
private

Definition at line 11 of file CSCSPEvent.h.

Referenced by header().

◆ record_

CSCSPRecord CSCSPEvent::record_[7]
private

Definition at line 13 of file CSCSPEvent.h.

Referenced by record().

◆ trailer_

CSCSPTrailer CSCSPEvent::trailer_
private

Definition at line 14 of file CSCSPEvent.h.

Referenced by trailer().

CSCSPRecord::sp
CSCSP_SPblock sp[3]
Definition: CSCSPRecord.h:62
CSCSPTrailer::unpack
bool unpack(const unsigned short *&buf)
Definition: CSCSPTrailer.h:72
end
#define end
Definition: vmac.h:39
CSCSPHeader::active
unsigned int active(void) const
Definition: CSCSPHeader.h:102
CSCSPEvent::trailer_
CSCSPTrailer trailer_
Definition: CSCSPEvent.h:14
CSCSPEvent::unpack
bool unpack(const unsigned short *&buf)
Definition: CSCSPEvent.cc:6
CSCSPRecord::unpack
bool unpack(const unsigned short *&buf, unsigned int nonmasked_data_blocks, bool empty_blocks_suppressed, unsigned int tbin)
Definition: CSCSPRecord.cc:5
CSCSPHeader::unpack
bool unpack(const unsigned short *&buf)
Definition: CSCSPHeader.h:109
CSCSPEvent::record_
CSCSPRecord record_[7]
Definition: CSCSPEvent.h:13
CSCSP_SPblock
Definition: CSCSP_SPblock.h:8
CSCSPHeader::nTBINs
unsigned int nTBINs(void) const
Definition: CSCSPHeader.h:97
visDQMUpload.buf
buf
Definition: visDQMUpload.py:154
CSCSPHeader::empty
bool empty(void) const
Definition: CSCSPHeader.h:104
CSCSPHeader::format_version
int format_version(void) const
Definition: CSCSPHeader.h:106
CSCSPRecord::LCTs
std::vector< CSCSP_MEblock > LCTs(void) const
Definition: CSCSPRecord.cc:78
CSCSPHeader::suppression
bool suppression(void) const
Definition: CSCSPHeader.h:99
CSCSPEvent::counters_
CSCSPCounters counters_
Definition: CSCSPEvent.h:12
CSCSPRecord::mbStubs
std::vector< CSCSP_MBblock > mbStubs(void) const
Definition: CSCSPRecord.cc:115
HLT_2018_cff.track
track
Definition: HLT_2018_cff.py:10352
CSCSPEvent::header_
CSCSPHeader header_
Definition: CSCSPEvent.h:11
phase2TrackerDigitizer_cfi.delay
delay
Definition: phase2TrackerDigitizer_cfi.py:67
CSCSPCounters::unpack
bool unpack(const unsigned short *&buf)
Definition: CSCSPCounters.h:27