using namespace std;
#include <stdio.h>
#include "hades.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hldsubevt.h"
#include "hevent.h"
#include "hmdcraw.h"
#include "hmdcrawstruct.h"
#include "hmdcraweventheader.h"
#include "hspectrometer.h"
#include "hmdcdetector.h"
#include "hruntimedb.h"
#include "heventheader.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include "TROOT.h"
#include "hmdcdataword.h"
#include "hmdcunpacker.h"
Bool_t HMdcDataWord::noComment=kFALSE;
ClassImp(HMdcDataWord)
HMdcDataWord::HMdcDataWord()
{
clearAll();
noComment=HMdcUnpacker::getQuietMode();
}
Bool_t HMdcDataWord::decode( const UInt_t data, UInt_t version, Bool_t consistencyCheck)
{
switch(version)
{
case 0:
sam = ((data & m31) >> 26 & m5)-1;
samP = (data & m31) >> 25 & m1;
roc = ((data & m31) >> 22 & m3);
rocP = (data & m31) >> 21 & m1;
mboNb = ((data & m31) >> 19 & m2);
tdcNb = ((data & m31) >> 15 & m4)-1;
chan = (data & m31) >> 12 & m3;
hit = (data & m31) >> 11 & m1;
time = (data & m31) & m11;
break;
case 1:
sam = ((data & m31) >> 26 & m5);
samP = (data & m31) >> 25 & m1;
roc = ((data & m31) >> 22 & m3);
rocP = (data & m31) >> 21 & m1;
mboNb = ((data & m31) >> 19 & m2);
tdcNb = ((data & m31) >> 15 & m4)-1;
chan = (data & m31) >> 12 & m3;
hit = (data & m31) >> 11 & m1;
time = (data & m31) & m11;
break;
default:
if(!noComment) Error("decode","decoding version %i not a valid number",version);
return kFALSE;
}
if (consistencyCheck) return checkConsistency(version, data);
return kTRUE;
}
UInt_t HMdcDataWord::getCodedDataWord( UInt_t version )
{
UInt_t code = 0;
switch(version)
{
case 0:
code |= ((sam+1) & m5 ) << 26;
code |= ( samP & m1 ) << 25;
code |= ( roc & m3 ) << 22;
code |= ( rocP & m1 ) << 21;
code |= ( mboNb & m2 ) << 19;
code |= ((tdcNb+1) & m4 ) << 15;
code |= ( chan & m3 ) << 12;
code |= ( hit & m1 ) << 11;
code |= ( time & m11);
break;
case 1:
code |= ( sam & m5 ) << 26;
code |= ( samP & m1 ) << 25;
code |= ( roc & m3 ) << 22;
code |= ( rocP & m1 ) << 21;
code |= ( mboNb & m2 ) << 19;
code |= ((tdcNb+1) & m4 ) << 15;
code |= ( chan & m3 ) << 12;
code |= ( hit & m1 ) << 11;
code |= ( time & m11);
break;
default:
if(!noComment) Error("getCodedDataWord","decoding version %i not a valid number",version);
return 0;
}
return code;
}
void HMdcDataWord::dump(UInt_t version)
{
Info(" dump()","----------------------------------------");
if (gHades) Info(" dump()","--- EvtSeqNr: %i\n", ((HEventHeader*)((HEvent*)(gHades->getCurrentEvent())->getHeader()))->getEventSeqNumber());
print(version);
Info(" dump()","----------------------------------------");
}
Bool_t HMdcDataWord::subHeader( const UInt_t* data, UInt_t version, Bool_t consistencyCheck)
{
if (version==1) version--;
switch(version)
{
case 0:
evNb = *data & m16;
subevtSize = *(data+1) & m16;
trigType = *(data+2) & m4;
rocNb = *(data+2) >> 8 & m4;
errorFlag = *(data+2) >> 12 & m4;
break;
default:
if(!noComment)Error("subHeader","decoding version %i not a valid number",version);
return kFALSE;
}
if (consistencyCheck) return checkConsistencyRocHeader(version);
return kTRUE;
}
Bool_t HMdcDataWord::checkConsistency(UInt_t version, UInt_t data)
{
if (version==1) version--;
switch(version)
{
case 0:
{
Int_t samMin = 0;
Int_t samMax = 31;
Int_t samPMin = 0;
Int_t samPMax = 1;
Int_t rocMin = 1;
Int_t rocMax = 5;
Int_t rocPMin = 0;
Int_t rocPMax = 1;
Int_t mboNbMin = 1;
Int_t mboNbMax = 3;
Int_t tdcNbMin = 1;
Int_t tdcNbMax = 12;
tdcNbMin --;
tdcNbMax --;
Int_t chanMin = 0;
Int_t chanMax = 7;
Int_t hitMin = 0;
Int_t hitMax = 1;
Int_t timeMin = 0;
Int_t timeMax = 0x7ff;
if (sam < samMin || sam > samMax )
{
if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "SAM number", sam, samMin, samMax, data );
return kFALSE;
}
if (samP < samPMin || samP > samPMax )
{
if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "SAM Position", samP, samPMin, samPMax, data );
return kFALSE;
}
if (roc < rocMin || roc > rocMax )
{
if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "ROC Number", roc, rocMin, rocMax, data );
return kFALSE;
}
if (rocP < rocPMin || rocP > rocPMax )
{
if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "LVL1 Slot", rocP, rocPMin, rocPMax, data );
return kFALSE;
}
if (mboNb < mboNbMin || mboNb > mboNbMax )
{
if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "MBO Position", mboNb, mboNbMin, mboNbMax, data );
return kFALSE;
}
if (tdcNb < tdcNbMin || tdcNb > tdcNbMax )
{
if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "TDC Number", tdcNb, tdcNbMin, tdcNbMax, data );
return kFALSE;
}
if (chan < chanMin || chan > chanMax )
{
if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "Channel Number", chan, chanMin, chanMax, data );
return kFALSE;
}
if (hit < hitMin || hit > hitMax )
{
if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%i] while decoding: 0x%08x", "Hit Number (modulo 2)", hit, hitMin, hitMax, data );
return kFALSE;
}
if (time < timeMin || time > timeMax )
{
if(!noComment)Error("checkConsistency()","%s = %i out of range [%i,%x] while decoding: 0x%08x", "Time", time, timeMin, timeMax, data );
return kFALSE;
}
}
break;
default:
if(!noComment)Error("checkConsistency()","decoding version %i not valid",version);
return kFALSE;
}
return kTRUE;
};
Bool_t HMdcDataWord::checkConsistencyRocHeader(UInt_t version)
{
if (version==1) version--;
switch(version)
{
case 0:
{
Int_t evNbMin = 0;
Int_t evNbMax = 0xffff;
Int_t subevtSizeMin = 0;
Int_t subevtSizeMax = 0xffff;
Int_t trigTypeMin = 0;
Int_t trigTypeMax = 0xf;
Int_t rocNbMin = 1;
Int_t rocNbMax = 0x5;
Int_t errorFlagMin = 0;
Int_t errorFlagMax = 0xf;
if (evNb < evNbMin || evNb > evNbMax )
{
if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%x]", "Event Number number", evNb, evNbMin, evNbMax );
return kFALSE;
}
if (subevtSize < subevtSizeMin || subevtSize > subevtSizeMax )
{
if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%x]", "Subevent size number", subevtSize, subevtSizeMin, subevtSizeMax );
return kFALSE;
}
if (trigType < trigTypeMin || trigType > trigTypeMax )
{
if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%x]", "Trigger Type", trigType, trigTypeMin, trigTypeMax );
return kFALSE;
}
if (rocNb < rocNbMin || rocNb > rocNbMax )
{
if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%i]", "ROC Number", rocNb, rocNbMin, rocNbMax );
return kFALSE;
}
if (errorFlag < errorFlagMin || errorFlag > errorFlagMax )
{
if(!noComment)Error("checkConsistencyRocHeader()","%s = %i out of range [%i,%x]", "Error Flag", errorFlag, errorFlagMin, errorFlagMax );
return kFALSE;
}
}
break;
default:
if(!noComment)Error("checkConsistency()","decoding version %i not valid",version);
return kFALSE;
}
return kTRUE;
};
void HMdcDataWord::print(UInt_t version)
{
switch(version)
{
case 0:
printf("\t%s: ",ClassName());
printf("\n\t>>>>> DataWord : ");
printf("%s: %2i | ","sam" ,sam);
printf("%s: %2i | ","samP",samP);
printf("%s: %2i | ","roc" ,roc);
printf("%s: %2i | ","rocP",rocP);
printf("%s: %2i | ","mboNb" ,mboNb);
printf("%s: %2i | ","tdcNb" ,tdcNb);
printf("%s: %2i | ","chan",chan);
printf("%s: %2i | ","hit" ,hit);
printf("%s: %4i ","time",time);
printf("\n\t >>> ROC-Header : ");
printf("%s: %4i | ","event number" ,evNb);
printf("%s: %2i | ","roc number" ,rocNb);
printf("%s: %2i | ","trigger type" ,trigType);
printf("%s: %2i | ","error flag" ,errorFlag);
printf("%s: %4i ","subevent size",subevtSize);
printf("\n\t >>> RAW-Address: ");
printf("%s: %2i | ","sector" ,sector);
printf("%s: %2i | ","module" ,module);
printf("%s: %2i | ","mbo" ,mbo);
printf("%s: %2i | ","tdc" ,tdc);
printf("%s: %2i ","entry# ",entry);
printf("\n");
break;
case 1:
printf("\t%s: ",ClassName());
printf("\n\t>>>>> DataWord : ");
printf("%s: %2i | ","virtualSamNr" ,getVirtualSamNr());
printf("%s: %2i | ","sam" ,sam);
printf("%s: %2i | ","samP",samP);
printf("%s: %2i | ","roc" ,roc);
printf("%s: %2i | ","rocP",rocP);
printf("%s: %2i | ","mboNb" ,mboNb);
printf("%s: %2i | ","tdcNb" ,tdcNb);
printf("%s: %2i | ","chan",chan);
printf("%s: %2i | ","hit" ,hit);
printf("%s: %4i ","time",time);
printf("\n\t >>> ROC-Header : ");
printf("%s: %4i | ","event number" ,evNb);
printf("%s: %2i | ","roc number" ,rocNb);
printf("%s: %2i | ","trigger type" ,trigType);
printf("%s: %2i | ","error flag" ,errorFlag);
printf("%s: %4i ","subevent size",subevtSize);
printf("\n\t >>> RAW-Address: ");
printf("%s: %2i | ","sector" ,sector);
printf("%s: %2i | ","module" ,module);
printf("%s: %2i | ","mbo" ,mbo);
printf("%s: %2i | ","tdc" ,tdc);
printf("%s: %2i ","entry# ",entry);
printf("\n");
break;
default:
Error("print()","decoding version %i not valid",version);
}
}
Last change: Sat May 22 13:01:21 2010
Last generated: 2010-05-22 13:01
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.