CMS 3D CMS Logo

DCCEBEventBlock.cc
Go to the documentation of this file.
1 
6 
11 #include <sys/time.h>
12 
13 #include <iomanip>
14 #include <sstream>
15 
18  bool hU,
19  bool srpU,
20  bool tccU,
21  bool feU,
22  bool memU,
23  bool forceToKeepFRdata)
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 }
37 
38 void DCCEBEventBlock::unpack(const uint64_t* buffer, size_t numbBytes, unsigned int expFedId) {
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 }
287 
288 // Unpack TCC blocks
290  if (tccChStatus_[0] != CH_TIMEOUT && tccChStatus_[0] != CH_DISABLED)
291  return tccBlock_->unpack(&data_, &dwToEnd_, 0);
292  else
293  return BLOCK_UNPACKED;
294 }
bool forceToKeepFRdata_
int unpack(const uint64_t **data, unsigned int *dwToEnd, short tccChId=0)
Definition: DCCTCCBlock.cc:10
unsigned int runType_
DCCFEBlock * towerBlock_
DCCSRPBlock * srpBlock_
unsigned int dwToEnd_
Definition: DCCEventBlock.h:84
unsigned int mem_
void unpack(const uint64_t *buffer, size_t bufferSize, unsigned int expFedId) override
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
uint16_t getCCUValue(const int fed, const int ccu) const
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
DCCEBEventBlock(DCCDataUnpacker *u, EcalElectronicsMapper *m, bool hU, bool srpU, bool tccU, bool feU, bool memU, bool forceToKeepFRdata)
unsigned int orbitCounter_
DCCTCCBlock * tccBlock_
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_