CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
List of all members | Public Member Functions | Protected Member Functions
DCCEBEventBlock Class Reference

#include <DCCEBEventBlock.h>

Inheritance diagram for DCCEBEventBlock:
DCCEventBlock

Public Member Functions

 DCCEBEventBlock (DCCDataUnpacker *u, EcalElectronicsMapper *m, bool hU, bool srpU, bool tccU, bool feU, bool memU, bool forceToKeepFRdata)
 
void unpack (const uint64_t *buffer, size_t bufferSize, unsigned int expFedId) override
 
- Public Member Functions inherited from DCCEventBlock
unsigned int bx ()
 
 DCCEventBlock (DCCDataUnpacker *u, EcalElectronicsMapper *m, bool hU, bool srpU, bool tccU, bool feU, bool memU, bool forceToKeepFRdata)
 
void display (std::ostream &o)
 
void enableFeIdChecks ()
 
void enableSyncChecks ()
 
unsigned int fov ()
 
short getHLTChannel (int channel)
 
unsigned int l1A ()
 
unsigned int mem ()
 
void reset ()
 
void setFESyncNumbers (short l1, short bx, short id)
 
void setHLTChannel (int channel, short value)
 
void setSRPSyncNumbers (short l1, short bx)
 
void setTCCSyncNumbers (short l1, short bx, short id)
 
unsigned int smId ()
 
DCCDataUnpackerunpacker ()
 
void updateCollectors ()
 
virtual ~DCCEventBlock ()
 

Protected Member Functions

int unpackTCCBlocks () override
 
- Protected Member Functions inherited from DCCEventBlock
void addHeaderToCollection ()
 
unsigned int next_tower_search (const unsigned int current_tower_id)
 

Additional Inherited Members

- Protected Attributes inherited from DCCEventBlock
unsigned int blockLength_
 
unsigned int bx_
 
const uint64_t * data_
 
unsigned int dccErrors_
 
std::unique_ptr
< EcalRawDataCollection > * 
dccHeaders_
 
unsigned int detailedTriggerType_
 
unsigned int dwToEnd_
 
unsigned int eventSize_
 
std::vector< short > feBx_
 
std::vector< short > feChStatus_
 
unsigned int fedId_
 
std::vector< short > feLv1_
 
bool feUnpacking_
 
bool forceToKeepFRdata_
 
unsigned int fov_
 
bool headerUnpacking_
 
std::vector< short > hlt_
 
unsigned int l1_
 
EcalElectronicsMappermapper_
 
unsigned int mem_
 
DCCMemBlockmemBlock_
 
bool memUnpacking_
 
unsigned int orbitCounter_
 
unsigned int runNumber_
 
unsigned int runType_
 
unsigned int smId_
 
unsigned int sr_
 
unsigned int srChStatus_
 
DCCSRPBlocksrpBlock_
 
short srpBx_
 
short srpLv1_
 
bool srpUnpacking_
 
DCCTCCBlocktccBlock_
 
std::vector< short > tccBx_
 
std::vector< short > tccChStatus_
 
std::vector< short > tccLv1_
 
bool tccUnpacking_
 
DCCFEBlocktowerBlock_
 
unsigned int triggerType_
 
unsigned int tzs_
 
DCCDataUnpackerunpacker_
 
unsigned int zs_
 

Detailed Description

Definition at line 23 of file DCCEBEventBlock.h.

Constructor & Destructor Documentation

DCCEBEventBlock::DCCEBEventBlock ( DCCDataUnpacker u,
EcalElectronicsMapper m,
bool  hU,
bool  srpU,
bool  tccU,
bool  feU,
bool  memU,
bool  forceToKeepFRdata 
)

Definition at line 16 of file DCCEBEventBlock.cc.

References DCCEventBlock::feUnpacking_, DCCEventBlock::forceToKeepFRdata_, DCCEventBlock::mem_, DCCEventBlock::srpBlock_, DCCEventBlock::srpUnpacking_, DCCEventBlock::tccBlock_, DCCEventBlock::tccUnpacking_, and DCCEventBlock::towerBlock_.

24  : DCCEventBlock(u, m, hU, srpU, tccU, feU, memU, forceToKeepFRdata) {
25  //Builds a tower unpacker block
27 
28  //Builds a srp unpacker block
29  srpBlock_ = new DCCEBSRPBlock(u, m, this, srpUnpacking_);
30 
31  //Builds a tcc unpacker block
32  tccBlock_ = new DCCEBTCCBlock(u, m, this, tccUnpacking_);
33 
34  // This field is not used in EB
35  mem_ = 0;
36 }
bool forceToKeepFRdata_
DCCEventBlock(DCCDataUnpacker *u, EcalElectronicsMapper *m, bool hU, bool srpU, bool tccU, bool feU, bool memU, bool forceToKeepFRdata)
DCCFEBlock * towerBlock_
DCCSRPBlock * srpBlock_
unsigned int mem_
DCCTCCBlock * tccBlock_

Member Function Documentation

void DCCEBEventBlock::unpack ( const uint64_t *  buffer,
size_t  bufferSize,
unsigned int  expFedId 
)
overridevirtual

Reimplemented from DCCEventBlock.

Definition at line 38 of file DCCEBEventBlock.cc.

References DCCEventBlock::addHeaderToCollection(), B_MASK, BLOCK_UNPACKED, DCCEventBlock::blockLength_, edmScanValgrind::buffer, DCCEventBlock::bx_, CALIBRATIONTRIGGER, CH_DISABLED, CH_FORCEDZS1, CH_HEADERERR, CH_IFIFOFULL, CH_L1AIFIFOFULL, CH_LENGTHERR, CH_LINKERR, CH_SUPPRESS, CH_TIMEOUT, DCCEventBlock::data_, DCCEventBlock::dccErrors_, DCCEventBlock::detailedTriggerType_, DCCEventBlock::dwToEnd_, EMPTYEVENTSIZE, DCCEventBlock::eventSize_, DCCEventBlock::feChStatus_, DCCEventBlock::fedId_, DCCEventBlock::feUnpacking_, DCCEventBlock::fov_, DCCDataUnpacker::getCCUValue(), H_BX_B, H_BX_MASK, H_CHSTATUS_MASK, H_DET_TTYPE_B, H_DET_TTYPE_MASK, H_ERRORS_B, H_ERRORS_MASK, H_EVLENGTH_MASK, H_FEDID_B, H_FEDID_MASK, H_FOV_B, H_FOV_MASK, H_L1_B, H_L1_MASK, H_ORBITCOUNTER_B, H_ORBITCOUNTER_MASK, H_RNUMB_B, H_RNUMB_MASK, H_RTYPE_MASK, H_SR_B, H_SRCHSTATUS_B, H_TCC1CHSTATUS_B, H_TCC2CHSTATUS_B, H_TCC3CHSTATUS_B, H_TCC4CHSTATUS_B, H_TTYPE_B, H_TTYPE_MASK, H_TZS_B, H_ZS_B, HEADERLENGTH, HEADERSIZE, DCCEventBlock::headerUnpacking_, mps_fire::i, DCCEventBlock::l1_, DCCEventBlock::memBlock_, DCCEventBlock::memUnpacking_, DCCEventBlock::next_tower_search(), DCCEventBlock::orbitCounter_, PHYSICTRIGGER, DCCEventBlock::reset(), DCCEventBlock::runNumber_, DCCEventBlock::runType_, edm::shift, DCCDataUnpacker::silentMode_, SKIP_BLOCK_UNPACKING, DCCEventBlock::sr_, DCCEventBlock::srChStatus_, DCCSRPBlock::srFlag(), SRP_FULLREADOUT, SRP_NUMBFLAGS, SRP_SRVAL_MASK, DCCEventBlock::srpBlock_, DCCEventBlock::srpUnpacking_, STOP_EVENT_UNPACKING, DCCEventBlock::tccChStatus_, DCCEventBlock::towerBlock_, DCCEventBlock::triggerType_, DCCEventBlock::tzs_, DCCFEBlock::unpack(), DCCSRPBlock::unpack(), DCCMemBlock::unpack(), DCCEventBlock::unpacker_, unpackTCCBlocks(), hgcalPerformanceValidation::val, and DCCEventBlock::zs_.

Referenced by DCCDataUnpacker::unpack().

38  {
39  reset();
40 
41  eventSize_ = numbBytes;
42  data_ = buffer;
43 
44  // First Header Word of fed block
45  fedId_ = ((*data_) >> H_FEDID_B) & H_FEDID_MASK;
46  bx_ = ((*data_) >> H_BX_B) & H_BX_MASK;
47  l1_ = ((*data_) >> H_L1_B) & H_L1_MASK;
48  triggerType_ = ((*data_) >> H_TTYPE_B) & H_TTYPE_MASK;
49 
50  // Check if fed id is the same as expected...
51  if (fedId_ != expFedId) {
53  edm::LogWarning("IncorrectEvent") << "\n For event L1A: " << l1_ << "\n Expected FED id is: " << expFedId
54  << " while current FED id is: " << fedId_
55  << "\n => Skipping to next fed block...";
56  }
57 
58  //TODO : add this to an error event collection
59 
60  return;
61  }
62 
63  // Check if this event is an empty event
64  if (eventSize_ == EMPTYEVENTSIZE) {
66  edm::LogWarning("IncorrectEvent") << "\n Event L1A: " << l1_ << " is empty for fed: " << fedId_
67  << "\n => Skipping to next fed block...";
68  }
69  return;
70 
71  }
72 
73  //Check if event size allows at least building the header
74  else if (eventSize_ < HEADERSIZE) {
76  edm::LogError("IncorrectEvent") << "\n Event L1A: " << l1_ << " in fed: " << fedId_ << "\n Event size is "
77  << eventSize_ << " bytes while the minimum is " << HEADERSIZE << " bytes"
78  << "\n => Skipping to next fed block...";
79  }
80 
81  //TODO : add this to a dcc size error collection
82 
83  return;
84  }
85 
86  //Second Header Word of fed block
87  data_++;
88 
89  blockLength_ = (*data_) & H_EVLENGTH_MASK;
90  dccErrors_ = ((*data_) >> H_ERRORS_B) & H_ERRORS_MASK;
91  runNumber_ = ((*data_) >> H_RNUMB_B) & H_RNUMB_MASK;
92 
93  if (eventSize_ != blockLength_ * 8) {
95  edm::LogError("IncorrectEvent") << "\n Event L1A: " << l1_ << " in fed: " << fedId_ << "\n size is " << eventSize_
96  << " bytes while " << (blockLength_ * 8) << " are set in the event header "
97  << "\n => Skipping to next fed block...";
98  //TODO : add this to a dcc size error collection
99  }
100  return;
101  }
102 
103  //Third Header Word of fed block
104  data_++;
105 
106  // bits 0.. 31 of the 3rd DCC header word
107  runType_ = (*data_) & H_RTYPE_MASK;
108 
109  fov_ = ((*data_) >> H_FOV_B) & H_FOV_MASK;
110 
111  // bits 32.. 47 of the 3rd DCC header word
113 
114  //Forth Header Word
115  data_++;
117  sr_ = ((*data_) >> H_SR_B) & B_MASK;
118  zs_ = ((*data_) >> H_ZS_B) & B_MASK;
119  tzs_ = ((*data_) >> H_TZS_B) & B_MASK;
120  srChStatus_ = ((*data_) >> H_SRCHSTATUS_B) & H_CHSTATUS_MASK;
121 
122  bool ignoreSR(true);
123 
124  // getting TCC channel status bits
125  tccChStatus_[0] = ((*data_) >> H_TCC1CHSTATUS_B) & H_CHSTATUS_MASK;
126  tccChStatus_[1] = ((*data_) >> H_TCC2CHSTATUS_B) & H_CHSTATUS_MASK;
127  tccChStatus_[2] = ((*data_) >> H_TCC3CHSTATUS_B) & H_CHSTATUS_MASK;
128  tccChStatus_[3] = ((*data_) >> H_TCC4CHSTATUS_B) & H_CHSTATUS_MASK;
129 
130  // FE channel Status data
131  int channel(0);
132  for (int dw = 0; dw < 5; dw++) {
133  data_++;
134  for (int i = 0; i < 14; i++, channel++) {
135  unsigned int shift = i * 4; //each channel has 4 bits
136  feChStatus_[channel] = ((*data_) >> shift) & H_CHSTATUS_MASK;
137  }
138  }
139 
140  // debugging
141  //display(cout);
142 
143  // Update number of available dwords
145 
146  int STATUS = unpackTCCBlocks();
147 
148  if (STATUS != STOP_EVENT_UNPACKING && (feUnpacking_ || srpUnpacking_)) {
149  //NMGA note : SR comes before TCC blocks
150  // Emmanuelle please change this in the digi to raw
151 
152  // Unpack SRP block
155  if (STATUS == BLOCK_UNPACKED) {
156  ignoreSR = false;
157  }
158  }
159  }
160 
161  // See number of FE channels that we need according to the trigger type //
162  // TODO : WHEN IN LOCAL MODE WE SHOULD CHECK RUN TYPE
163  unsigned int numbChannels(0);
164 
165  if (triggerType_ == PHYSICTRIGGER) {
166  numbChannels = 68;
167  } else if (triggerType_ == CALIBRATIONTRIGGER) {
168  numbChannels = 70;
169  } else {
171  edm::LogError("IncorrectEvent") << "\n Event L1A: " << l1_ << " in fed: " << fedId_
172  << "\n Event has an unsupported trigger type " << triggerType_
173  << "\n => Skipping to next fed block...";
174  //TODO : add this to a dcc trigger type error collection
175  }
176  return;
177  }
178 
179  // note: there is no a-priori check that number_active_channels_from_header
180  // equals number_channels_found_in_data.
181  // The checks are doing f.e. by f.e. only.
182 
183  if (feUnpacking_ || memUnpacking_) {
184  // pointer for the
185  std::vector<short>::iterator it = feChStatus_.begin();
186 
187  // fields for tower recovery code
188  unsigned int next_tower_id = 1000;
189  const uint64_t* next_data = data_;
190  unsigned int next_dwToEnd = dwToEnd_;
191 
192  // looping over FE channels, i.e. tower blocks
193  for (unsigned int chNumber = 1; chNumber <= numbChannels && STATUS != STOP_EVENT_UNPACKING; chNumber++, it++) {
194  //for( unsigned int i=1; chNumber<= numbChannels; chNumber++, it++ ){
195 
196  const short chStatus(*it);
197 
198  // regular cases
199  const bool regular = (chStatus == CH_DISABLED || chStatus == CH_SUPPRESS);
200 
201  // problematic cases
202  const bool problematic = (chStatus == CH_TIMEOUT || chStatus == CH_HEADERERR || chStatus == CH_LINKERR ||
203  chStatus == CH_LENGTHERR || chStatus == CH_IFIFOFULL || chStatus == CH_L1AIFIFOFULL);
204 
205  // issuiung messages for problematic cases, even though handled by the DCC
206  if (problematic) {
208  const int val = unpacker_->getCCUValue(fedId_, chNumber);
209  const bool ttProblem = (val == 13) || (val == 14);
210  if (!ttProblem) {
211  edm::LogWarning("IncorrectBlock") << "Bad DCC channel status: " << chStatus << " (LV1 " << l1_ << " fed "
212  << fedId_ << " tower " << chNumber << ")\n"
213  << " => DCC channel is not being unpacked";
214  }
215  }
216  }
217 
218  // skip unpack in case of bad status
219  if (regular || problematic) {
220  continue;
221  }
222 
223  // preserve data pointer
224  const uint64_t* const prev_data = data_;
225  const unsigned int prev_dwToEnd = dwToEnd_;
226 
227  // skip corrupted/problematic data block
228  if (chNumber >= next_tower_id) {
229  data_ = next_data;
230  dwToEnd_ = next_dwToEnd;
231  next_tower_id = 1000;
232  }
233 
234  // Unpack Tower (Xtal Block)
235  if (feUnpacking_ && chNumber <= 68) {
236  // in case of SR (data are 0 suppressed)
237  if (sr_) {
238  const bool applyZS = (fov_ == 0) || // backward compatibility with FOV = 0;
239  ignoreSR || (chStatus == CH_FORCEDZS1) ||
240  ((srpBlock_->srFlag(chNumber) & SRP_SRVAL_MASK) != SRP_FULLREADOUT);
241 
242  STATUS = towerBlock_->unpack(&data_, &dwToEnd_, applyZS, chNumber);
243 
244  // If there is an action to suppress SR channel the associated channel status should be updated
245  // so we can remove this piece of code
246  // if ( ( srpBlock_->srFlag(chNumber) & SRP_SRVAL_MASK) != SRP_NREAD ){
247  //
248  // STATUS = towerBlock_->unpack(&data_,&dwToEnd_,applyZS,chNumber);
249  //}
250  }
251  // no SR (possibly 0 suppression flags)
252  else {
253  // if tzs_ data are not really suppressed, even though zs flags are calculated
254  if (tzs_) {
255  zs_ = false;
256  }
257  STATUS = towerBlock_->unpack(&data_, &dwToEnd_, zs_, chNumber);
258  }
259  }
260 
261  // Unpack Mem blocks
262  if (memUnpacking_ && chNumber > 68) {
263  STATUS = memBlock_->unpack(&data_, &dwToEnd_, chNumber);
264  }
265 
266  // corruption recovery
267  if (STATUS == SKIP_BLOCK_UNPACKING) {
268  data_ = prev_data;
269  dwToEnd_ = prev_dwToEnd;
270 
271  next_tower_id = next_tower_search(chNumber);
272 
273  next_data = data_;
274  next_dwToEnd = dwToEnd_;
275 
276  data_ = prev_data;
277  dwToEnd_ = prev_dwToEnd;
278  }
279  }
280  // closing loop over FE/TTblock channels
281 
282  } // check if we need to perform unpacking of FE or mem data
283 
284  if (headerUnpacking_)
286 }
unsigned int runType_
DCCFEBlock * towerBlock_
DCCSRPBlock * srpBlock_
unsigned int dwToEnd_
Definition: DCCEventBlock.h:84
int unpack(const uint64_t **data, unsigned int *dwToEnd, bool zs, unsigned int expectedTowerID)
Definition: DCCFEBlock.cc:22
DCCMemBlock * memBlock_
unsigned int srChStatus_
Definition: DCCEventBlock.h:99
Log< level::Error, false > LogError
unsigned int detailedTriggerType_
unsigned int blockLength_
unsigned int triggerType_
const uint64_t * data_
Definition: DCCEventBlock.h:82
DCCDataUnpacker * unpacker_
Definition: DCCEventBlock.h:81
unsigned int runNumber_
unsigned int sr_
static std::atomic< bool > silentMode_
unsigned short srFlag(unsigned int feChannel)
Definition: DCCSRPBlock.h:38
unsigned int l1_
int unpackTCCBlocks() override
unsigned int eventSize_
Definition: DCCEventBlock.h:83
uint16_t getCCUValue(const int fed, const int ccu) const
unsigned int orbitCounter_
std::vector< short > feChStatus_
Definition: DCCEventBlock.h:88
unsigned long long uint64_t
Definition: Time.h:13
unsigned int fov_
unsigned int bx_
int unpack(const uint64_t **data, unsigned int *dwToEnd, unsigned int numbFlags=SRP_NUMBFLAGS)
Definition: DCCSRPBlock.cc:16
static unsigned int const shift
unsigned int zs_
void addHeaderToCollection()
unsigned int next_tower_search(const unsigned int current_tower_id)
unsigned int tzs_
Log< level::Warning, false > LogWarning
std::vector< short > tccChStatus_
Definition: DCCEventBlock.h:89
unsigned int fedId_
int unpack(const uint64_t **data, unsigned int *dwToEnd, unsigned int expectedTowerID)
Definition: DCCMemBlock.cc:34
unsigned int dccErrors_
int DCCEBEventBlock::unpackTCCBlocks ( )
overrideprotectedvirtual

Reimplemented from DCCEventBlock.

Definition at line 289 of file DCCEBEventBlock.cc.

References BLOCK_UNPACKED, CH_DISABLED, CH_TIMEOUT, DCCEventBlock::data_, DCCEventBlock::dwToEnd_, DCCEventBlock::tccBlock_, DCCEventBlock::tccChStatus_, and DCCTCCBlock::unpack().

Referenced by unpack().

289  {
290  if (tccChStatus_[0] != CH_TIMEOUT && tccChStatus_[0] != CH_DISABLED)
291  return tccBlock_->unpack(&data_, &dwToEnd_, 0);
292  else
293  return BLOCK_UNPACKED;
294 }
int unpack(const uint64_t **data, unsigned int *dwToEnd, short tccChId=0)
Definition: DCCTCCBlock.cc:10
unsigned int dwToEnd_
Definition: DCCEventBlock.h:84
const uint64_t * data_
Definition: DCCEventBlock.h:82
DCCTCCBlock * tccBlock_
std::vector< short > tccChStatus_
Definition: DCCEventBlock.h:89