CMS 3D CMS Logo

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