//*-- AUTHOR : Ilse Koenig, Tomasz Wojcik, Wolfgang Koenig
//*-- Created : 17/01/2005
//_HADES_CLASS_DESCRIPTION
/////////////////////////////////////////////////////////////
//
// HWallRaw
//
// Class for the raw data class of the Forward Wall
// (see TOF unpacker for subevent information)
//
/////////////////////////////////////////////////////////////
using namespace std;
#include "hwallunpacker.h"
#include "walldef.h"
#include "hwalllookup.h"
#include "hwallraw.h"
#include "hdebug.h"
#include "hades.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hruntimedb.h"
#include "hcategory.h"
#include "hldsubevt.h"
#include "heventheader.h"
#include <iostream>
#include <iomanip>
#include <stdlib.h>
ClassImp(HWallUnpacker)
HWallUnpacker::HWallUnpacker(UInt_t id) {
// constructor
subEvtId=id;
pRawCat=NULL;
lookup=0;
}
Bool_t HWallUnpacker::init(void) {
// creates the raw category and gets the pointer to the lookup table
pRawCat=gHades->getCurrentEvent()->getCategory(catWallRaw);
if (!pRawCat) {
pRawCat=gHades->getSetup()->getDetector("Wall")->buildCategory(catWallRaw);
if (!pRawCat) return kFALSE;
gHades->getCurrentEvent()->addCategory(catWallRaw,pRawCat,"Wall");
}
loc.set(1,0);
lookup=(HWallLookup*)(gHades->getRuntimeDb()->getContainer("WallLookup"));
return kTRUE;
}
Int_t HWallUnpacker::execute(void) {
// This function fills the Forward Wall raw data structure.
// see TOF unpacker for subevent information
HWallRaw* pRaw=0;
Int_t nCrate=-1, nChannel=0, nCell=-1;
Int_t nEvt = 0; //Evt Id
UInt_t nSlot = 0;
UInt_t uWordCount = 0; //auxiliary
UInt_t uBlockSize = 0; //Number of data words in one block
UInt_t uBoardType = 0; // 1 - Struck, 0 - TDC
UInt_t *uTmp = NULL; //auxiliary
Char_t dcType='U';
if (gHades->isCalibration()){
//calibration event
//nothing to do for forward wall
return 1;
}
if (pSubEvt) {
UInt_t* data = pSubEvt->getData();
UInt_t* end = pSubEvt->getEnd();
nEvt = gHades->getCurrentEvent()->getHeader()->getEventSeqNumber();
//Loop over all data in this subevt
while ( ++data<end && *data!=0x0 ) {
#if DEBUG_LEVEL>4
printf("Data word: %p\n",*data);
#endif
//Scan for TIP-block header ( TYPE 0 )
//TIP-block appears only in the new data structure
if ( ((*data >>24) & 0x6)==0 ) {
uBlockSize = (*data) & 0x0000003ff;
uBoardType = (*data >> 12 ) & 0x1;
//latch or scaler
if (uBoardType==1) {
data+=uBlockSize;
continue;
}
//next Should (can) be tdc header
else if (uBoardType==0) {
//Do a normal TDC scanning
#if DEBUG_LEVEL>2
printf("TIP-block 0x%08x Size %i Board %i\n",
*data,uBlockSize,uBoardType);
#endif
continue;
} else {
#if DEBUG_LEVEL>2
Warning("execute","Uknown BoardType=%i",uBoardType);
#endif
}
}
//Scan for TDC header
else if ( ((*data>>24) & 0x6)==2 ){
//Found valid TDC header
uBlockSize = ( (*data) >> 8 ) & 0xff;
nCrate = ( (*data) >> 16 ) & 0xff;
nSlot = ( (*data) >> 27 ) & 0x1f;
//Check if also trailer exists
if ((*(data + uBlockSize+1) >>24 & 0x6)!=4) {
Warning("execute","Header found but no trailer!!!");
continue;
}
//Check trigger tag in the trailer
if ((*(data+uBlockSize+1)&0xff)!=((UInt_t)pSubEvt->getTrigNr()&0xFF)) {
Error("execute","Trigger tag mismatch!");
exit(EXIT_FAILURE);
}
//Scan all data words
#if DEBUG_LEVEL>4
printf("TDC header 0x%08x.Size: %i.Crate: %i.Slot: %i.\n",
*data,uBlockSize,nCrate,nSlot);
#endif
uTmp=data;
HWallLookupSlot* dc=lookup->getSlot(nCrate-1,nSlot-1);
if (dc && (dcType=dc->getType())!='U') {
uWordCount=0;
while( ++data && data<(uTmp + uBlockSize+1) && *data!=0x0 ) {
uWordCount++;
if (nSlot!=(*data>>27)&0x1f) {
Warning("execute",
"Slot (%d) different that in header(%d)",
nSlot,(*data>>27)&0x1f);
continue;
}
nChannel = (*(data) >> 16 ) & 0x003f;
HWallLookupChan* dcs=dc->getChannel(nChannel);
if (dcs) {
nCell=dcs->getCell();
loc[0]=nCell;
pRaw=(HWallRaw *)pRawCat->getObject(loc);
if (!pRaw) {
pRaw=(HWallRaw *)pRawCat->getSlot(loc);
if (pRaw) {
pRaw=new (pRaw) HWallRaw;
pRaw->setCell(nCell);
} else {
Error("execute()","Can't get slot\n");
return -1;
}
} else {
#if DEBUG_LEVEL>4
Info("execute()","Slot already exists!\n");
#endif
}
Float_t val = (*data & 0xfff);
if (dcType=='T') pRaw->setTime(val);
else pRaw->setCharge(val);
} else Info("execute()","TDC channel: %i not found",nChannel);
} // end while
if (uWordCount!=uBlockSize) {
//Corrupted block
Warning("execute()",
"Found %i but expecting % words!!!",
uWordCount,uBlockSize);
continue;
}
} else {
//Skip this block
data+=uBlockSize+1;
#if DEBUG_LEVEL>4
Info("execute()",
"Can not get TDC for crate %i and slot %i",
nCrate-1,nSlot-1);
#endif
}
} else if ( ((*data>>24) & 0x6)==6 ) {
//invalid data word
// skip this filler word
#if DEBUG_LEVEL>2
Warning("execute()",
"Evt: %i, Invalid Data Word! Type: %d,Skipping 0x%08x",
nEvt,((*data>>24) & 0x6),*data);
#if DEBUG_LEVEL>4
pSubEvt->dumpIt();
#endif
#endif
} else if ( ((*data>>24) & 0x6)==0 ) {
Warning("execute()",
"Evt: %i, Data follow, but no header",nEvt);
} else {
Warning("execute()",
"Evt: %i, Unknow raw data type %i",
nEvt,((*data>>24) & 0x6));
}
} //end of data
}
return 1;
}
ROOT page - Class index - Class Hierarchy - Top of the page
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.