using namespace std;
#include "hlatchunpacker.h"
#include "hevent.h"
#include "hldsubevt.h"
#include "heventheader.h"
#include "hades.h"
#include "hdebug.h"
#include "hdatasource.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
ClassImp(HLatchUnpacker)
HLatchUnpacker::HLatchUnpacker(Int_t id) {
subEvtId=id;
}
Int_t HLatchUnpacker::execute() {
#if DEBUG_LEVEL>4
gDebuger->enterFunc("HLatchUnpacker::execute\n");
#endif
Bool_t bIsOld = kFALSE;
Int_t nCrate = 0;
Int_t nSlot = 0;
Int_t nChannel = 0;
Int_t nEvtId = 0;
Int_t nEvt = 0;
UInt_t uOldCalType = 0;
UInt_t uWordCount = 0;
UInt_t uTrigbits = 0;
UInt_t uBlockSize = 0;
UInt_t uBoardType = 0;
UInt_t uStruck = 0;
UInt_t* uTmp = NULL;
if (subEvtId==412) {
if (pSubEvt) {
UInt_t* data = pSubEvt->getData();
UInt_t* end = pSubEvt->getEnd();
#if DEBUG_LEVEL>4
printf("Next SubEvt. data between: %p and %p\n",data,end);
pSubEvt->dumpIt();
#endif
nEvtId=gHades->getCurrentEvent()->getHeader()->getId();
nEvt=gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();
uOldCalType=(*data & 0xf00);
uTmp=data;
bIsOld=gHades->getCurrentEvent()->getHeader()->isOldDAQ();
while (++data<end && *data!=0x0) {
#if DEBUG_LEVEL>2
printf("Data word: %p\n",*data);
#endif
if (nEvtId==5 && (*(data) == 0x8000000) && bIsOld && uOldCalType==0x900) {
data--;
data = skipScaler(data,kTRUE);
} else {
if (((*data >>24) & 0x6)==0) {
uBlockSize=(*data) & 0x0000003ff;
uBoardType=(*data >> 12 ) & 0x1;
uStruck =(*data >> 10 ) & 0x3f;
#if DEBUG_LEVEL>4
cout<<"Struck "<<uStruck <<" BoardType:"<< uBoardType<<endl;
#endif
if (uBoardType==1) {
if (uStruck == SCALER){
uTrigbits=uTrigbits | 0x100;
data=skipScaler(data,kFALSE,SCALER);
} else if (uStruck == SCALER_JAN04){
data=skipScaler(data,kFALSE,SCALER_JAN04);
} else if ( uStruck == LATCH ){
data=fillLatch(data);
} else if (uStruck == DEBUG){
Info("execute","DEBUG block, size: %i",uBlockSize);
data+=uBlockSize;
continue;
} else{
Error("execute","Uknown type=%i",uStruck);
}
} else if (uBoardType==0) {
#if DEBUG_LEVEL>2
printf("TIP-block 0x%08x Size %i Board %i\n",
*data,uBlockSize,uBoardType);
#endif
} else{
Error("execute","Uknown BoardType=%i",uBoardType);
}
} else if (((*data>>24) & 0x6)==2) {
uBlockSize=((*data) >> 8) & 0xff;
nCrate =((*data) >> 16) & 0xff;
nSlot =((*data) >> 27) & 0x1f;
if ((*(data + uBlockSize+1) >>24 & 0x6)!=4) {
Error("execute","Header found but no trailer!!");
continue;
}
if ((*(data+uBlockSize+1)&0xff)!=((UInt_t)pSubEvt->getTrigNr()&0xFF)) {
Error("execute","Trigger tag mismatch: EventSeqNumber= %i! Skip event...",nEvt);
}
#if DEBUG_LEVEL>4
printf("TDC header 0x%08x.Size: %i.Crate: %i.Slot: %i.\n",
*data,uBlockSize,nCrate,nSlot);
#endif
uTmp=data;
uWordCount=0;
while (++data && data<(uTmp + uBlockSize+1) && *data!=0x0) {
uWordCount++;
nChannel=(*(data) >> 16) & 0x003f;
if (bIsOld && (nSlot==11) && (nCrate==2)) {
if (nChannel==24) uTrigbits = uTrigbits | 0x1;
if (nChannel==25) uTrigbits = uTrigbits | 0x2;
if (nChannel==26) uTrigbits = uTrigbits | 0x4;
if (nChannel==27) uTrigbits = uTrigbits | 0x8;
if (nChannel==28) uTrigbits = uTrigbits | 0x10;
if (nChannel==29) uTrigbits = uTrigbits | 0x20;
if (nChannel==30) uTrigbits = uTrigbits | 0x40;
if (nChannel==31) uTrigbits = uTrigbits | 0x80;
}
}
if (uWordCount!=uBlockSize) {
Error("execute()","Found %i but expecting % words!!!",
uWordCount,uBlockSize);
}
} else if (((*data>>24) & 0x6)==6) {
#if DEBUG_LEVEL>2
Error("execute()","Evt: %i, Invalid Data Word! Type: %d,Skipping 0x%08x",
nEvt,((*data>>24) & 0x6),*data);
pSubEvt->dumpIt();
#endif
} else if (((*data>>24) & 0x6)==0){
Error("execute()","Evt: %i, Data follow, but no header",nEvt);
} else {
Error("execute()","Evt: %i, Unknow raw data type %i",
nEvt,((*data>>24) & 0x6));
}
}
}
}
if (bIsOld) gHades->getCurrentEvent()->getHeader()->setTBit(uTrigbits);
} else if(subEvtId==416) {
if (pSubEvt) {
UInt_t* data = pSubEvt->getData();
UInt_t* end = pSubEvt->getEnd();
#if DEBUG_LEVEL>4
printf("Next SubEvt. data between: %p and %p\n",data,end);
pSubEvt->dumpIt();
#endif
nEvtId=gHades->getCurrentEvent()->getHeader()->getId();
nEvt=gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();
while (++data<end && *data!=0x0) {
#if DEBUG_LEVEL>2
printf("Data word: %p\n",*data);
#endif
if (((*data >>24) & 0x6)==0 && (((*data) & 0x3fffff )!=0)) {
uBlockSize = (*data) & 0x0000003ff;
uBoardType = (*data >> 10 ) & 0x3f;
#if DEBUG_LEVEL>4
printf("BoardType: %d\n ",uBoardType);
#endif
if (uBoardType==SCALER_AUG04) {
#if DEBUG_LEVEL>4
printf("Total scalers block size is :%d \n",uBlockSize);
#endif
UInt_t* pScalerTrailer=0;
UInt_t uScalerSize=0;
UInt_t uScalerTotalSize=0;
UInt_t* pScalerHeader = 0;
while( uScalerTotalSize < uBlockSize ) {
pScalerTrailer = data+uBlockSize-uScalerTotalSize;
uScalerSize=((*pScalerTrailer) & 0x7fffff)/4;
pScalerHeader = pScalerTrailer-uScalerSize+1;
uScalerTotalSize = uScalerTotalSize+uScalerSize;
if ((*pScalerHeader & 0x3fffff )!=0) {
data+=uBlockSize;
break;
}
}
data+=uBlockSize;
} else if (uBoardType==0) {
#if DEBUG_LEVEL>2
printf("TIP-block 0x%08x Size %i Board %i Next is tdc header\n",
*data,uBlockSize,uBoardType);
#endif
} else {
Error("execute","Uknown BoardType=%i",uBoardType);
}
} else if (((*data>>24) & 0x6)==2) {
uBlockSize = ( (*data) >> 8 ) & 0xff;
if ((*(data + uBlockSize+1) >>24 & 0x6)!=4) {
Error("execute","Header found but no trailer!!");
continue;
}
if ((*(data+uBlockSize+1)&0xff)!=((UInt_t)pSubEvt->getTrigNr()&0xFF)) {
Error("execute","Trigger tag mismatch: EventSeqNumber= %i! Skip event...",nEvt);
if(!gHades->getForceNoSkip()) return kDsSkip;
}
uTmp=data;
uWordCount=0;
while( ++data && data<(uTmp + uBlockSize+1) && *data!=0x0 ){
uWordCount++;
}
if (uWordCount!=uBlockSize) {
Error("execute()","Found %i but expecting % words!!!",
uWordCount,uBlockSize);
}
} else if (((*data) & 0x3fffff )==0) {
UInt_t uGeo = (*data)>>27 &0x1F;
#if DEBUG_LEVEL>4
printf("Trying to find the size \n");
#endif
UInt_t* pLatchTmp=data;
if (++pLatchTmp && ((*pLatchTmp)>>27 &0x1F)==uGeo) {
Warning("execute()","Empty LATCH !!!!!!");
} else if (++pLatchTmp && ((*pLatchTmp)>>27 &0x1F)==uGeo){
#if DEBUG_LEVEL>4
printf("Size of latch 0x%08x block is :%d\n",
(*pLatchTmp),((*pLatchTmp) & 0x7fffff)/4 );
printf("Latch data is 0x%08x\n",*(pLatchTmp-1));
#endif
gHades->getCurrentEvent()->getHeader()->setTBit(*(pLatchTmp-1));
} else {
Error("execute()","Wrong latch data!");
}
data=pLatchTmp;
} else if ( ((*data>>24) & 0x6)==6 ){
#if DEBUG_LEVEL>2
Error("execute()","Evt: %i, Invalid Data Word! Type: %d,Skipping 0x%08x",
nEvt,((*data>>24) & 0x6),*data);
pSubEvt->dumpIt();
#endif
} else if (((*data>>24) & 0x6)==0) {
Error("execute()","Evt: %i, Data follow, but no header",nEvt);
} else {
Error("execute()","Evt: %i, Unknow raw data type %i",
nEvt,((*data>>24) & 0x6));
}
}
}
}
#if DEBUG_LEVEL>4
gDebuger->leaveFunc("HLatchUnpacker::execute\n");
#endif
return 1;
}
UInt_t* HLatchUnpacker::fillLatch(UInt_t* pData) {
UInt_t uWordCount = 0;
UInt_t* uTmp = NULL;
UInt_t uBlockSize = 0;
uBlockSize = (*pData) & 0x0000003ff;
#if DEBUG_LEVEL>2
printf("Latch data 0x%08x Size: %d\n",*pData,uBlockSize);
#endif
if (*++pData == 0x8000000) {
#warning FIXME latch trailer !!!!
if ((*(pData+uBlockSize-1)>>24)!=0x8) {
Error("fillLatch","Header found but no trailer!!");
} else {
uTmp=pData;
uWordCount=0;
while (++pData && pData<uTmp+uBlockSize-1 && *pData!=0x0) {
uWordCount++;
if (uWordCount== 1){
gHades->getCurrentEvent()->getHeader()->setTBit(*pData);
} else {
Error("fillLatch","Too many data words for Latch!!!!");
return pSubEvt->getEnd();
}
}
if (uWordCount!=(uBlockSize-2)) {
Error("fillLatch()",
"Found %i but expecting %i words!!!", uWordCount,uBlockSize);
return pSubEvt->getEnd();
}
}
} else{
Error("fillLatch",
"Header for latch data not found!");
return pData;
}
return pData;
}
UInt_t* HLatchUnpacker::skipScaler(UInt_t* pData,Bool_t bOld,Int_t nType){
UInt_t uWordCount = 0;
UInt_t* uTmp = NULL;
UInt_t uBlockSize = 0;
Int_t nCountBox = 0;
uBlockSize = (*pData) & 0x0000003ff;
if (bOld) {
uBlockSize=34;
}
#if DEBUG_LEVEL>2
printf("Scaler data 0x%08x Size: %d\n",*pData,uBlockSize);
#endif
if (*++pData == 0x08000000 || nType==SCALER_JAN04) {
#warning FIXME scaler trailer !!!!
if (!bOld && (*(pData+uBlockSize-1)>>24)!=0x8 && nType!=SCALER_JAN04) {
Error("skipScaler","Header found but no trailer!!");
return pSubEvt->getEnd();
} else {
uTmp=pData;
if (nType==SCALER_JAN04) {
uTmp=pData;
pData--;
}
uWordCount=0;
nCountBox=0;
while (++pData && pData<uTmp+uBlockSize && (*pData>>8) != 0x80000) {
uWordCount++;
if(nCountBox < 32) {
nCountBox++;
} else {
Error("skipScaler","Evt %d. Too many data words for scaler",
gHades->getCurrentEvent()->getHeader()->getEventSeqNumber());
return pSubEvt->getEnd();
}
}
if (!bOld && ((nType==SCALER_JAN04 && uWordCount!=uBlockSize) || (nType!=SCALER_JAN04 && uWordCount!=(uBlockSize-2)))) {
Error("skipScaler",
"Found %i but expecting %i words!!!", uWordCount,uBlockSize);
return pSubEvt->getEnd();
}
if (nType==SCALER_JAN04) pData--;
}
} else {
Error("skipScaler",
"Header for scaler data %p not found!",*pData);
}
return pData;
}
Last change: Sat May 22 12:58:54 2010
Last generated: 2010-05-22 12:58
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.