CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FUResource.cc
Go to the documentation of this file.
1 //
3 // FUResource
4 // ----------
5 //
6 // 12/10/2006 Philipp Schieferdecker <philipp.schieferdecker@cern.ch>
8 
9 
14 
15 #include "EvffedFillerRB.h"
16 
17 #include "interface/shared/frl_header.h"
18 #include "interface/shared/fed_header.h"
19 #include "interface/shared/fed_trailer.h"
20 #include "interface/shared/i2oXFunctionCodes.h"
21 #include "interface/evb/i2oEVBMsgs.h"
22 
23 
24 #include "xdaq/Application.h"
25 #include "toolbox/mem/Reference.h"
26 #include "xcept/tools.h"
27 
28 #include <sstream>
29 #include <sys/shm.h>
30 
31 
32 #define FED_HCTRLID 0x50000000
33 #define FED_TCTRLID 0xa0000000
34 #define REAL_SOID_MASK 0x0003FF00
35 #define FED_RBIT_MASK 0x0000C004
36 
37 
38 using namespace std;
39 using namespace evf;
40 
41 
43 // initialize static members
45 
46 //______________________________________________________________________________
47 bool FUResource::doFedIdCheck_ = true;
48 bool FUResource::useEvmBoard_ = true;
50 unsigned int FUResource::gtpDaqId_ = FEDNumbering::MAXTriggerGTPFEDID;
52 
54 // construction/destruction
56 
57 //______________________________________________________________________________
58 FUResource::FUResource(UInt_t fuResourceId
59  , log4cplus::Logger logger
60  , EvffedFillerRB *frb
61  , xdaq::Application *app)
62  : log_(logger)
63  , fuResourceId_(fuResourceId)
64  , superFragHead_(0)
65  , superFragTail_(0)
66  , nbBytes_(0)
67  , superFragSize_(0)
68  , frb_(frb)
69  , app_(app)
70  , nextEventWillHaveCRCError_(false)
71 {
72  release();
73 }
74 
75 
76 //______________________________________________________________________________
78 {
79 
80 }
81 
82 
84 // implementation of member functions
86 
87 //______________________________________________________________________________
89 {
90  //release();
92  shmCell_->clear();
98 }
99 
100 
101 //______________________________________________________________________________
103 {
104  doCrcCheck_ =false;
105  fatalError_ =false;
106 
107  buResourceId_ =0xffffffff;
108  evtNumber_ =0xffffffff;
109 
110  if (0!=superFragHead_) {
111  try {
112  superFragHead_->release();
113  }
114  catch (xcept::Exception& e) {
115  LOG4CPLUS_ERROR(log_,"Failed to release superFragHead: "
116  <<xcept::stdformat_exception_history(e));
117  }
118  }
119 
120  superFragHead_=0;
121  superFragTail_=0;
122 
123  iBlock_ =0;
124  nBlock_ =0xffffffff;
125  iSuperFrag_ =0;
126  nSuperFrag_ =0xffffffff;
127 
128  nbSent_ =0;
129 
130  nbErrors_ =0;
131  nbCrcErrors_ =0;
132 
133  for (UInt_t i=0;i<1024;i++) fedSize_[i]=0;
134  eventSize_ =0;
135 
136  if (0!=shmCell_) {
137  shmdt(shmCell_);
138  shmCell_=0;
139  }
140 }
141 
142 
143 //______________________________________________________________________________
145 {
146  if (fatalError()) {
147  LOG4CPLUS_WARN(log_,"THIS SHOULD *NEVER* HAPPEN!."); // DEBUG
148  bufRef->release();
149  return;
150  }
151 
152  MemRef_t* itBufRef = bufRef;
153  while(0!=itBufRef&&!fatalError()) {
154  MemRef_t* next=itBufRef->getNextReference();
155  itBufRef->setNextReference(0);
156  try {
157  processDataBlock(itBufRef);
158  }
159  catch (xcept::Exception& e) {
160  LOG4CPLUS_ERROR(log_,"EVENT LOST:"
161  <<xcept::stdformat_exception_history(e));
162  fatalError_=true;
163  itBufRef->setNextReference(next);
164  }
165 
166  itBufRef=next;
167  }
168  if(isComplete()){
170  frb_->putTrailer();
171  fedSize_[frb_->fedId()]=frb_->size();
172  UChar_t *startPos = shmCell_->writeData(frb_->getPayload(),frb_->size());
175  nbErrors_++;
176  stringstream oss;
177  oss<<"Failed to mark super fragment in shared mem buffer."
178  <<" fuResourceId:"<<fuResourceId_
179  <<" evtNumber:"<<evtNumber_
180  <<" iSuperFrag:"<<iSuperFrag_;
181  XCEPT_RAISE(evf::Exception,oss.str());
182  }
183 
184  if (!shmCell_->markFed(frb_->fedId(),frb_->size(),startPos)) {
185  nbErrors_++;
186  stringstream oss;
187  oss<<"Failed to mark fed in buffer."
188  <<" evtNumber:"<<evtNumber_
189  <<" fedId:"<<frb_->fedId()
190  <<" fedSize:"<<frb_->size()
191  <<" fedAddr:0x"<<hex<<(unsigned long)frb_->getPayload()<<dec;
192  XCEPT_RAISE(evf::Exception,oss.str());
193  }
194 
195  }
196  return;
197 }
198 
199 
200 //______________________________________________________________________________
202  throw (evf::Exception)
203 {
204  // reset iBlock_/nBlock_ counters
205  if (iBlock_==nBlock_) {
206  iBlock_=0;
207  nBlock_=0xffffffff;
208  }
209 
210  I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME *block=
211  (I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME*)bufRef->getDataLocation();
212 
213  UInt_t iBlock =block->blockNb;
214  UInt_t nBlock =block->nbBlocksInSuperFragment;
215  UInt_t iSuperFrag =block->superFragmentNb;
216  UInt_t nSuperFrag =block->nbSuperFragmentsInEvent;
217 
218  UInt_t fuResourceId=block->fuTransactionId;
219  UInt_t buResourceId=block->buResourceId;
220  UInt_t evtNumber =block->eventNumber;
221  stringstream oss;
222  oss << "TransId:" << fuResourceId << " BUResourceId:"
223  << buResourceId << " eventNumber:" << evtNumber << " ";
224  // check fuResourceId consistency
225  if (fuResourceId!=fuResourceId_) {
226  nbErrors_++;
227 
228  oss<<"RU/FU fuResourceId mismatch."
229  <<" Received:"<<fuResourceId
230  <<" Expected:"<<fuResourceId_;
231  XCEPT_RAISE(evf::Exception,oss.str());
232  }
233 
234  // check iBlock consistency
235  if (iBlock!=iBlock_) {
236  nbErrors_++;
237  oss<<"RU/FU block number mismatch."
238  <<" Received:"<<iBlock
239  <<" Expected:"<<iBlock_;
240  XCEPT_RAISE(evf::Exception,oss.str());
241  }
242 
243  // check iSuperFrag consistency
244  if (iSuperFrag!=iSuperFrag_) {
245  nbErrors_++;
246  oss<<"RU/FU superfragment number mismatch."
247  <<" Received:"<<iSuperFrag
248  <<" Expected:"<<iSuperFrag_;
249  XCEPT_RAISE(evf::Exception,oss.str());
250  }
251 
252  // assign nBlock_
253  if (iBlock==0) {
254  nBlock_=nBlock;
255  }
256  else {
257  // check nBlock_
258  if (nBlock!=nBlock_) {
259  nbErrors_++;
260  oss<<"RU/FU number of blocks mismatch."
261  <<" Received:"<<nBlock
262  <<" Expected:"<<nBlock_;
263  XCEPT_RAISE(evf::Exception,oss.str());
264  }
265  }
266 
267 
268  // if this is the first block in the event,
269  // *assign* evtNumber,buResourceId,nSuperFrag ...
270  if (iBlock==0&&iSuperFrag==0) {
271  evtNumber_ =evtNumber;
272  buResourceId_=buResourceId;
273  nSuperFrag_ =nSuperFrag;
274 
275  shmCell_->setEvtNumber(evtNumber);
276  shmCell_->setBuResourceId(buResourceId);
277 
278  // check that buffers are allocated for nSuperFrag superfragments
279  if(nSuperFrag_>nSuperFragMax_) {
280  nbErrors_++;
281  oss<<"Invalid maximum number of superfragments."
282  <<" fuResourceId:"<<fuResourceId_
283  <<" evtNumber:"<<evtNumber_
284  <<" nSuperFrag:"<<nSuperFrag_
285  <<" nSuperFragMax:"<<nSuperFragMax_;
286  XCEPT_RAISE(evf::Exception,oss.str());
287  }
288  }
289  // ... otherwise,
290  // *check* evtNumber,buResourceId,nSuperFrag
291  else {
292  // check evtNumber
293  if (evtNumber!=evtNumber_) {
294  nbErrors_++;
295  oss<<"RU/FU evtNumber mismatch."
296  <<" Received:"<<evtNumber
297  <<" Expected:"<<evtNumber_;
298  XCEPT_RAISE(evf::Exception,oss.str());
299  }
300 
301  // check buResourceId
302  if (buResourceId!=buResourceId_) {
303  nbErrors_++;
304  oss<<"RU/FU buResourceId mismatch."
305  <<" Received:"<<buResourceId
306  <<" Expected:"<<buResourceId_;
307  XCEPT_RAISE(evf::Exception,oss.str());
308  }
309 
310  // check nSuperFrag
311  if (nSuperFrag!=nSuperFrag_) {
312  nbErrors_++;
313  oss<<"RU/FU number of superfragments mismatch."
314  <<" Received:"<<nSuperFrag
315  <<" Expected:"<<nSuperFrag_;
316  XCEPT_RAISE(evf::Exception,oss.str());
317  }
318  }
319 
320 
321  // check payload
322  try {
323  checkDataBlockPayload(bufRef);
324  }
325  catch (xcept::Exception& e) {
326  oss<<"data block payload failed check."
327  <<" evtNumber:"<<evtNumber_
328  <<" buResourceId:"<<buResourceId_
329  <<" iSuperFrag:"<<iSuperFrag_;
330  XCEPT_RETHROW(evf::Exception,oss.str(),e);
331  }
332 
333  appendBlockToSuperFrag(bufRef);
334 
335  // increment iBlock_, as expected for the next message
336  iBlock_++;
337 
338  // superfragment complete ...
339  bool lastBlockInSuperFrag=(iBlock==nBlock-1);
340  if (lastBlockInSuperFrag) {
341 
342  // ... fill the FED buffers contained in the superfragment
343  try {
344  superFragSize();
345  fillSuperFragPayload();
346  findFEDs();
347  }
348  catch (xcept::Exception& e) {
349  oss<<"Invalid super fragment."
350  <<" evtNumber:"<<evtNumber_
351  <<" buResourceId:"<<buResourceId_
352  <<" iSuperFrag:"<<iSuperFrag_;
353  removeLastAppendedBlockFromSuperFrag();
354  XCEPT_RETHROW(evf::Exception,oss.str(),e);
355  }
356 
357  // ... release the buffers associated with the superfragment
358  try {
359  releaseSuperFrag();
360  }
361  catch (xcept::Exception& e) {
362  nbErrors_++;
363  oss<<"Failed to release super fragment."
364  <<" evtNumber:"<<evtNumber_
365  <<" buResourceId:"<<buResourceId_
366  <<" iSuperFrag:"<<iSuperFrag_;
367  XCEPT_RETHROW(evf::Exception,oss.str(),e);
368  }
369 
370  // increment iSuperFrag_, as expected for the next message(s)
371  iSuperFrag_++;
372 
373  } // lastBlockInSuperFragment
374 
375  return;
376 }
377 
378 
379 //______________________________________________________________________________
381  throw (evf::Exception)
382 {
383  UInt_t frameSize =0;
384  UInt_t bufSize =0;
385  UInt_t segSize =0;
386  UInt_t segSizeExpected=0;
387 
388  frlh_t *frlHeader =0;
389 
390  UChar_t *blockAddr =0;
391  UChar_t *frlHeaderAddr =0;
392 
393  frameSize =sizeof(I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME);
394 
395  blockAddr =(UChar_t*)bufRef->getDataLocation();
396  frlHeaderAddr=blockAddr+frameSize;
397  frlHeader =(frlh_t*)frlHeaderAddr;
398 
399  I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME *block
400  =(I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME*)blockAddr;
401 
402 
403  // check that FRL trigno is consistent with FU evtNumber
404  if(evtNumber_!=frlHeader->trigno) {
405  nbErrors_++;
406  std::stringstream oss;
407  oss<<"FRL header \"trigno\" does not match "
408  <<"FU \"evtNumber\"."
409  <<" trigno:"<<frlHeader->trigno
410  <<" evtNumber:"<<evtNumber_;
411  XCEPT_RAISE(evf::Exception,oss.str());
412  }
413 
414 
415  // check that FRL trigno is consistent with RU eventNumber
416  if(block->eventNumber!=frlHeader->trigno) {
417  nbErrors_++;
418  std::stringstream oss;
419  oss<<"FRL header \"trigno\" does not match "
420  <<"RU builder header \"eventNumber\"."
421  <<" trigno:"<<frlHeader->trigno
422  <<" eventNumber:"<<block->eventNumber;
423  XCEPT_RAISE(evf::Exception,oss.str());
424  }
425 
426 
427  // check that block numbers reported by FRL / RU are consistent
428  if(block->blockNb!=frlHeader->segno) {
429  nbErrors_++;
430  std::stringstream oss;
431  oss<<"FRL header \"segno\" does not match"
432  <<"RU builder header \"blockNb\"."
433  <<" segno:"<<frlHeader->segno
434  <<" blockNb:"<<block->blockNb;
435  XCEPT_RAISE(evf::Exception,oss.str());
436  }
437 
438 
439  // reported block number consistent with expectation
440  if(block->blockNb!=iBlock_) {
441  nbErrors_++;
442  std::stringstream oss;
443  oss<<"Incorrect block number."
444  <<" Expected:"<<iBlock_
445  <<" Received:"<<block->blockNb;
446  XCEPT_RAISE(evf::Exception, oss.str());
447  }
448 
449 
450  // reported payload size consistent with expectation
451  bufSize =bufRef->getDataSize();
452  segSizeExpected=bufSize-frameSize-sizeof(frlh_t);
453  segSize =frlHeader->segsize & FRL_SEGSIZE_MASK;
454  if(segSize!=segSizeExpected) {
455  nbErrors_++;
456  std::stringstream oss;
457  oss<<"FRL header segment size is not as expected."
458  <<" Expected:"<<segSizeExpected
459  <<" Received:"<<segSize;
460  XCEPT_RAISE(evf::Exception, oss.str());
461  }
462 
463 
464  // Check that FU and FRL headers agree on end of super-fragment
465  bool fuLastBlockInSuperFrag =(block->blockNb==(block->nbBlocksInSuperFragment-1));
466  bool frlLastBlockInSuperFrag=((frlHeader->segsize & FRL_LAST_SEGM)!=0);
467  if (fuLastBlockInSuperFrag!=frlLastBlockInSuperFrag) {
468  nbErrors_++;
469  std::stringstream oss;
470  oss<<"FU / FRL header end-of-superfragment mismatch."
471  <<" FU header:"<<fuLastBlockInSuperFrag
472  <<" FRL header:"<<frlLastBlockInSuperFrag;
473  XCEPT_RAISE(evf::Exception,oss.str());
474  }
475 
476  return;
477 }
478 
479 
480 //______________________________________________________________________________
482 {
483  if (0==superFragHead_) {
484  superFragHead_=bufRef;
485  superFragTail_=bufRef;
486  }
487  else {
488  superFragTail_->setNextReference(bufRef);
489  superFragTail_=bufRef;
490  }
491  return;
492 }
493 
494 //______________________________________________________________________________
496 {
497  if (0==superFragHead_) {
498  //nothing to do... why did we get here then ???
499  }
500  else if(superFragHead_==superFragTail_){
501  superFragHead_ = 0;
502  superFragTail_ = 0;
503  }
504  else{
505  MemRef_t *next = 0;
507  while((next=current->getNextReference()) != superFragTail_){
508  //get to the next-to-last block
509  }
511  current->setNextReference(0);
512  }
513  return;
514 }
515 
516 
517 //______________________________________________________________________________
519 {
520  UChar_t *blockAddr =0;
521  UChar_t *frlHeaderAddr=0;
522  frlh_t *frlHeader =0;
523 
524  superFragSize_=0;
525 
526  UInt_t frameSize=sizeof(I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME);
527  MemRef_t* bufRef=superFragHead_;
528 
529  while (0!=bufRef) {
530  blockAddr =(UChar_t*)bufRef->getDataLocation();
531  frlHeaderAddr =blockAddr+frameSize;
532  frlHeader =(frlh_t*)frlHeaderAddr;
533  superFragSize_+=frlHeader->segsize & FRL_SEGSIZE_MASK;
534  bufRef =bufRef->getNextReference();
535  }
536 
538 
540  nbErrors_++;
541  stringstream oss;
542  oss<<"Event size exceeds maximum size."
543  <<" fuResourceId:"<<fuResourceId_
544  <<" evtNumber:"<<evtNumber_
545  <<" iSuperFrag:"<<iSuperFrag_
546  <<" eventSize:"<<eventSize_
547  <<" eventPayloadSize:"<<eventPayloadSize_;
548  XCEPT_RAISE(evf::Exception,oss.str());
549  }
550 
551 }
552 
553 
554 //______________________________________________________________________________
556 {
557  UChar_t *blockAddr =0;
558  UChar_t *frlHeaderAddr=0;
559  UChar_t *fedAddr =0;
560  UInt_t nbBytes =0;
561  UInt_t nbBytesTot =0;
562  frlh_t *frlHeader =0;
563  UChar_t *bufferPos =0;
564  UChar_t *startPos =0;
565 
566  MemRef_t* bufRef=superFragHead_;
567  while(bufRef != 0) {
568  blockAddr =(UChar_t*)bufRef->getDataLocation();
569  frlHeaderAddr=blockAddr+sizeof(I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME);
570  fedAddr =frlHeaderAddr+sizeof(frlh_t);
571  frlHeader =(frlh_t*)frlHeaderAddr;
572  nbBytes =frlHeader->segsize & FRL_SEGSIZE_MASK;
573  nbBytesTot +=nbBytes;
574 
575  // check if still within limits
576  if(nbBytesTot>superFragSize_) {
577  nbErrors_++;
578  stringstream oss;
579  oss<<"Reached end of buffer."
580  <<" fuResourceId:"<<fuResourceId_
581  <<" evtNumber:"<<evtNumber_
582  <<" iSuperFrag:"<<iSuperFrag_;
583  XCEPT_RAISE(evf::Exception,oss.str());
584  }
585 
586  bufferPos=shmCell_->writeData(fedAddr,nbBytes);
587  if (0==startPos) startPos=bufferPos;
588 
589  nbBytes_+=nbBytes;
590  bufRef=bufRef->getNextReference();
591  }
592 
594  nbErrors_++;
595  stringstream oss;
596  oss<<"Failed to mark super fragment in shared mem buffer."
597  <<" fuResourceId:"<<fuResourceId_
598  <<" evtNumber:"<<evtNumber_
599  <<" iSuperFrag:"<<iSuperFrag_;
600  XCEPT_RAISE(evf::Exception,oss.str());
601  }
602 
603  return;
604 }
605 
606 
607 //______________________________________________________________________________
609 {
610  UChar_t* superFragAddr =0;
612 
613  UChar_t *fedTrailerAddr=0;
614  UChar_t *fedHeaderAddr =0;
615 
616  UInt_t fedSize =0;
617  UInt_t sumOfFedSizes =0;
618  UInt_t evtNumber =0;
619 
620  UShort_t crc =0;
621  UShort_t crcChk =0;
622 
623  fedt_t *fedTrailer =0;
624  fedh_t *fedHeader =0;
625 
626 
627 
628  superFragAddr =shmCell_->superFragAddr(iSuperFrag_);
629  superFragSize =shmCell_->superFragSize(iSuperFrag_);
630  fedTrailerAddr=superFragAddr+superFragSize-sizeof(fedt_t);
631 
632  while (fedTrailerAddr>superFragAddr) {
633 
634  fedTrailer =(fedt_t*)fedTrailerAddr;
635  fedSize =(fedTrailer->eventsize & FED_EVSZ_MASK) << 3;
636  sumOfFedSizes+=fedSize;
637 
638  // check for fed trailer id
639  if ((fedTrailer->eventsize & FED_TCTRLID_MASK)!=FED_TCTRLID) {
640  nbErrors_++;
641  stringstream oss;
642  oss<<"Missing FED trailer id."
643  <<" evtNumber:"<<evtNumber_
644  <<" iSuperFrag:"<<iSuperFrag_;
645  XCEPT_RAISE(evf::Exception,oss.str());
646  }
647 
648  fedHeaderAddr=fedTrailerAddr-fedSize+sizeof(fedt_t);
649 
650  // check that fed header is within buffer
651  if(fedHeaderAddr<superFragAddr) {
652  nbErrors_++;
653  stringstream oss;
654  oss<<"FED header address out-of-bounds."
655  <<" evtNumber:"<<evtNumber_
656  <<" iSuperFrag:"<<iSuperFrag_;
657  XCEPT_RAISE(evf::Exception,oss.str());
658  }
659 
660  // check that payload starts within buffer
661  if((fedHeaderAddr+sizeof(fedh_t))>(superFragAddr+superFragSize)) {
662  nbErrors_++;
663  stringstream oss;
664  oss<<"FED payload out-of-bounds."
665  <<" evtNumber:"<<evtNumber_
666  <<" iSuperFrag:"<<iSuperFrag_;
667  XCEPT_RAISE(evf::Exception,oss.str());
668  }
669 
670  fedHeader =(fedh_t*)fedHeaderAddr;
671 
672  // check for fed header id
673  if ((fedHeader->eventid & FED_HCTRLID_MASK)!=FED_HCTRLID) {
674  nbErrors_++;
675  stringstream oss;
676  oss<<"Missing FED header id."
677  <<" evtNumber:"<<evtNumber_
678  <<" iSuperFrag:"<<iSuperFrag_;
679  XCEPT_RAISE(evf::Exception,oss.str());
680  }
681 
682  UInt_t fedId=(fedHeader->sourceid & REAL_SOID_MASK) >> 8;
683 
684  // check evtNumber consisency
685  evtNumber=fedHeader->eventid & FED_LVL1_MASK;
686  if (evtNumber!=evtNumber_) {
687  nbErrors_++;
688  stringstream oss;
689  oss<<"FU / FED evtNumber mismatch."
690  <<" FU:"<<evtNumber_
691  <<" FED:"<<evtNumber
692  <<" fedid:"<<fedId;
693  XCEPT_RAISE(evf::Exception,oss.str());
694  }
695 
696  // check that fedid is within valid ranges
697  if (fedId>=1024||
698  (doFedIdCheck_&&(!FEDNumbering::inRange(fedId)))) {
699  LOG4CPLUS_WARN(log_,"Invalid fedid. Data will still be logged"
700  <<" evtNumber:"<<evtNumber_
701  <<" fedid:"<<fedId);
702  nbErrors_++;
703  }
704 
705  // check if a previous fed has already claimed same fed id
706 
707  if(fedSize_[fedId]!=0) {
708  LOG4CPLUS_ERROR(log_,"Duplicated fedid. Data will be lost for"
709  <<" evtNumber:"<<evtNumber_
710  <<" fedid:"<<fedId);
711  nbErrors_++;
712  }
713 
714  if (fedId<1024) fedSize_[fedId]=fedSize;
715 
716  //if gtp EVM block is available set cell event number to global partition-independent trigger number
717  //daq block partition-independent event number is left as an option in case of problems
718 
719  if(fedId == gtpeId_)
720  if(evf::evtn::gtpe_board_sense(fedHeaderAddr)) shmCell_->setEvtNumber(evf::evtn::gtpe_get(fedHeaderAddr));
721  if(useEvmBoard_ && (fedId == gtpEvmId_))
722  if(evf::evtn::evm_board_sense(fedHeaderAddr,fedSize)) {
723  shmCell_->setEvtNumber(evf::evtn::get(fedHeaderAddr, true));
724  shmCell_->setLumiSection(evf::evtn::getlbn(fedHeaderAddr));
725  }
726  if(!useEvmBoard_ && (fedId == gtpDaqId_))
727  if(evf::evtn::daq_board_sense(fedHeaderAddr)) {
728  shmCell_->setEvtNumber(evf::evtn::get(fedHeaderAddr, false));
729  }
730  // crc check
731  if (doCrcCheck_) {
732  UInt_t conscheck=fedTrailer->conscheck;
733  crc=((fedTrailer->conscheck & FED_CRCS_MASK) >> FED_CRCS_SHIFT);
734  fedTrailer->conscheck &= (~FED_CRCS_MASK);
735  fedTrailer->conscheck &= (~FED_RBIT_MASK);
736  crcChk=compute_crc(fedHeaderAddr,fedSize);
737  if(nextEventWillHaveCRCError_ && random() > RAND_MAX/2){
738  crc--;
740  }
741  if (crc!=crcChk) {
742  std::ostringstream oss;
743  oss << "crc check failed."
744  <<" evtNumber:"<<evtNumber_
745  <<" fedid:"<<fedId
746  <<" crc:"<<crc
747  <<" chk:"<<crcChk;
748  LOG4CPLUS_INFO(log_,oss.str());
749  XCEPT_DECLARE(evf::Exception,
750  sentinelException, oss.str());
751  app_->notifyQualified("error",sentinelException);
752  nbErrors_++;
753  nbCrcErrors_++;
754  }
755  fedTrailer->conscheck=conscheck;
756  }
757 
758 
759  // mark fed
760  if (!shmCell_->markFed(fedId,fedSize,fedHeaderAddr)) {
761  nbErrors_++;
762  stringstream oss;
763  oss<<"Failed to mark fed in buffer."
764  <<" evtNumber:"<<evtNumber_
765  <<" fedId:"<<fedId
766  <<" fedSize:"<<fedSize
767  <<" fedAddr:0x"<<hex<<(unsigned long)fedHeaderAddr<<dec;
768  XCEPT_RAISE(evf::Exception,oss.str());
769  }
770 
771  // Move to the next fed trailer
772  fedTrailerAddr=fedTrailerAddr-fedSize;
773  }
774 
775  // check that we indeed end up on the starting address of the buffer
776  if ((fedTrailerAddr+sizeof(fedh_t))!=superFragAddr) {
777  std::stringstream oss;
778  oss<<"First FED in superfragment ouf-of-bound."
779  <<" evtNumber:"<<evtNumber_
780  <<" iSuperFrag:"<<iSuperFrag_;
781  XCEPT_RAISE(evf::Exception,oss.str());
782  }
783 
784  return;
785 }
786 
787 
788 //______________________________________________________________________________
790 {
791  if (0==superFragHead_) return;
792  superFragHead_->release(); // throws xcept::Exception
793  superFragHead_=0;
794  superFragTail_=0;
795  return;
796 }
797 
798 
799 //______________________________________________________________________________
801 {
803  if (reset) nbErrors_=0;
804  return result;
805 }
806 
807 
808 //______________________________________________________________________________
810 {
812  if (reset) nbCrcErrors_=0;
813  return result;
814 }
815 
816 
817 //______________________________________________________________________________
819 {
821  if (reset) nbBytes_=0;
822  return result;
823 }
#define REAL_SOID_MASK
Definition: FUResource.cc:34
int i
Definition: DBlmapReader.cc:9
UInt_t nbErrors_
Definition: FUResource.h:112
static bool doFedIdCheck_
Definition: FUResource.h:88
void process(MemRef_t *bufRef)
Definition: FUResource.cc:144
UInt_t fuResourceId_
Definition: FUResource.h:94
unsigned short UShort_t
Definition: FUTypes.h:13
void releaseSuperFrag()
Definition: FUResource.cc:789
struct fedt_struct fedt_t
EvffedFillerRB * frb_
Definition: FUResource.h:121
unsigned int size() const
bool fatalError() const
Definition: FUResource.h:62
virtual ~FUResource()
Definition: FUResource.cc:77
#define FED_TCTRLID_MASK
Definition: fed_trailer.h:37
bool gtpe_board_sense(const unsigned char *p)
void appendBlockToSuperFrag(MemRef_t *bufRef)
Definition: FUResource.cc:481
UInt_t nbErrors(bool reset=true)
Definition: FUResource.cc:800
unsigned int get(const unsigned char *, bool)
UInt_t nbBytes(bool reset=true)
Definition: FUResource.cc:818
unsigned char * writeData(unsigned char *data, unsigned int dataSize)
static unsigned int gtpEvmId_
std::ostream & logger()
Definition: fwLog.cc:41
static bool useEvmBoard_
Definition: FUResource.h:90
toolbox::mem::Reference MemRef_t
Definition: FUTypes.h:10
#define FED_HCTRLID
Definition: FUResource.cc:32
void fillSuperFragPayload()
Definition: FUResource.cc:555
bool markFed(unsigned int i, unsigned int size, unsigned char *addr)
TRandom random
Definition: MVATrainer.cc:138
MemRef_t * superFragHead_
Definition: FUResource.h:98
unsigned int fedId() const
log4cplus::Logger log_
Definition: FUResource.h:85
evf::FUShmRawCell * shmCell_
Definition: FUResource.h:120
unsigned int sourceid
Definition: fed_header.h:32
static unsigned int gtpDaqId_
Definition: FUResource.h:127
static unsigned int gtpeId_
Definition: DaqSource.cc:53
unsigned int conscheck
Definition: fed_trailer.h:32
void checkDataBlockPayload(MemRef_t *bufRef)
Definition: FUResource.cc:380
MemRef_t * superFragTail_
Definition: FUResource.h:99
unsigned int getlbn(const unsigned char *)
void removeLastAppendedBlockFromSuperFrag()
Definition: FUResource.cc:495
UInt_t evtNumber_
Definition: FUResource.h:96
unsigned char UChar_t
Definition: FUTypes.h:14
unsigned short compute_crc(unsigned char *buffer, unsigned int bufSize)
Definition: CRC16.h:67
tuple result
Definition: query.py:137
void superFragSize()
Definition: FUResource.cc:518
void setEventTypeData()
Definition: FUShmRawCell.h:57
UInt_t fedSize_[1024]
Definition: FUResource.h:116
unsigned char * superFragAddr(unsigned int i) const
bool markSuperFrag(unsigned int i, unsigned int size, unsigned char *addr)
bool isComplete() const
Definition: FUResource.h:146
void setEvtNumber(unsigned int evt)
Definition: FUShmRawCell.h:45
bool evm_board_sense(const unsigned char *p, size_t size)
UInt_t iSuperFrag_
Definition: FUResource.h:107
#define FED_CRCS_SHIFT
Definition: fed_trailer.h:51
unsigned int payloadSize() const
Definition: FUShmRawCell.h:30
UInt_t eventPayloadSize_
Definition: FUResource.h:101
unsigned int UInt_t
Definition: FUTypes.h:12
evf::FUShmRawCell * shmCell()
Definition: FUResource.h:77
UInt_t evtNumber() const
Definition: FUResource.h:68
#define FED_LVL1_MASK
Definition: fed_header.h:39
unsigned char *const getPayload()
#define FED_CRCS_MASK
Definition: fed_trailer.h:40
unsigned int superFragSize(unsigned int i) const
void setFuResourceId(unsigned int id)
Definition: FUShmRawCell.h:43
UInt_t nbCrcErrors_
Definition: FUResource.h:113
void processDataBlock(MemRef_t *bufRef)
Definition: FUResource.cc:201
static unsigned int gtpeId_
Definition: FUResource.h:129
unsigned int eventid
Definition: fed_header.h:33
UInt_t superFragSize_
Definition: FUResource.h:117
#define FED_RBIT_MASK
Definition: FUResource.cc:35
UInt_t buResourceId_
Definition: FUResource.h:95
xdaq::Application * app_
Definition: FUResource.h:123
unsigned int eventsize
Definition: fed_trailer.h:33
void setLumiSection(unsigned int)
#define FED_HCTRLID_MASK
Definition: fed_header.h:37
static unsigned int gtpEvmId_
Definition: FUResource.h:128
static bool inRange(int)
unsigned int nFed() const
Definition: FUShmRawCell.h:33
UInt_t nSuperFrag_
Definition: FUResource.h:108
#define FED_EVSZ_MASK
Definition: fed_trailer.h:38
UInt_t eventSize_
Definition: FUResource.h:118
unsigned int nSuperFrag() const
Definition: FUShmRawCell.h:37
UInt_t nbCrcErrors(bool reset=true)
Definition: FUResource.cc:809
unsigned int gtpe_get(const unsigned char *)
UInt_t nSuperFragMax_
Definition: FUResource.h:103
bool daq_board_sense(const unsigned char *p)
bool nextEventWillHaveCRCError_
Definition: FUResource.h:125
#define FED_TCTRLID
Definition: FUResource.cc:33
void reset(double vett[256])
Definition: TPedValues.cc:11
void allocate(FUShmRawCell *shmCell)
Definition: FUResource.cc:88
void putHeader(unsigned int l1id, unsigned int bxid)