#include <TMap.h>
#include "AliT0.h"
#include "AliT0RawData.h"
#include "AliT0digit.h"
#include "AliBitPacking.h"
#include "AliRawDataHeader.h"
#include "AliRawDataHeaderSim.h"
#include "AliBitPacking.h"
#include "AliFstream.h"
#include "AliRunLoader.h"
#include "AliDAQ.h"
#include "AliT0LookUpValue.h"
#include "AliT0LookUpKey.h"
using std::cout;
using std::endl;
ClassImp(AliT0RawData)
AliT0RawData::AliT0RawData():TObject(),
fVerbose(0),
fIndex(-1) ,
fEventNumber(0),
fTimeCFD(new TArrayI(24)),
fADC1( new TArrayI(24)),
fTimeLED( new TArrayI(24)),
fADC0( new TArrayI(24)),
fFile(0x0),
fDataHeaderPos(0),
fDRMDataHeaderPos(0),
fTRMDataHeaderPos(0),
fParam(0),
fLookUp(0)
{
TString fileName = Form("%s",AliDAQ::DdlFileName("T0",0));
fFile = new AliFstream(fileName.Data());
memset(fBuffer,0,512*sizeof(UInt_t));
AliRunLoader *runloader = AliRunLoader::Instance();
if (runloader) {
fEventNumber = runloader->GetEventNumber();
}
fParam = AliT0Parameters::Instance();
fParam->Init();
AliT0LookUpKey* lookkey;
AliT0LookUpValue* lookvalue;
TMap *lookup = fParam->GetMapLookup();
TMapIter iter(lookup);
for( Int_t iline=0; iline<106; iline++)
{
lookvalue = ( AliT0LookUpValue*) iter.Next();
lookkey = (AliT0LookUpKey*) lookup->GetValue(lookvalue);
fLookUp.Add(lookkey, lookvalue);
}
}
AliT0RawData::AliT0RawData(const AliT0RawData &r):TObject(),
fVerbose(0),
fIndex(-1) ,
fEventNumber(0),
fTimeCFD(new TArrayI(24)),
fADC1( new TArrayI(24)),
fTimeLED( new TArrayI(24)),
fADC0( new TArrayI(24)),
fFile(0x0),
fDataHeaderPos(0),
fDRMDataHeaderPos(0),
fTRMDataHeaderPos(0),
fParam(0),
fLookUp(0)
{
((AliT0RawData &) r).Copy(*this);
}
AliT0RawData::~AliT0RawData()
{
delete fTimeCFD;
delete fADC1;
delete fTimeLED;
delete fADC0;
delete fFile;
}
AliT0RawData &AliT0RawData::operator=(const AliT0RawData &r)
{
if (this != &r) ((AliT0RawData &) r).Copy(*this);
return *this;
}
void AliT0RawData::GetDigits(AliT0digit *fDigits)
{
Int_t time, positionOfTRMHeader;
fDigits->GetTimeCFD(*fTimeCFD);
fDigits->GetQT0(*fADC1);
fDigits->GetTimeLED(*fTimeLED);
fDigits->GetQT1(*fADC0);
Int_t meantime = fDigits->MeanTime();
Int_t timediff = fDigits->TimeDiff();
Int_t mult0=fDigits->SumMult();
Int_t mult1=fDigits->SumMult();
Int_t timeA = fDigits->BestTimeC();
Int_t timeC = fDigits->BestTimeA();
Int_t allData[110][1];
for (Int_t i=0; i<110; i++) allData[i][0] = 0;
allData[0][0]=0;
for (Int_t i=1; i<13; i++) {
allData[i][0] = fTimeCFD->At(i-1);
allData[i+12][0] = fTimeLED->At(i-1);
allData[i+56][0] = fTimeCFD->At(i-1+12);
allData[i+68][0] = fTimeLED->At(i-1+12);
}
for (Int_t iii=0; iii<12; iii++) {
allData[2*iii+25][0] = fADC1->At(iii);
allData[2*iii+26][0] = fADC0->At(iii);
}
for (Int_t ii=12; ii<24; ii++) {
allData[2*ii+57][0] = fADC1->At(ii);
allData[2*ii+58][0] = fADC0->At(ii);
}
allData[49][0] = meantime;
allData[50][0] = timediff;
allData[51][0] = timeA;
allData[52][0] = timeC;
allData[53][0] = mult0;
allData[54][0] = mult1;
allData[55][0] = mult0;
allData[56][0] = mult1;
fIndex += 6;
Int_t startTRM=fIndex;
fIndex ++;
positionOfTRMHeader= fIndex;
fIndex ++;
WriteChainDataHeader(1, 1);
Int_t chain=0;
Int_t iTDC = 0;
Int_t channel=0;
Int_t trm1words=0;
Int_t itrm=7;
Int_t inside =0;
Int_t isData = 0;
AliT0LookUpKey * lookkey = new AliT0LookUpKey();
AliT0LookUpValue * lookvalue ;
for (Int_t det = 0; det < 105; det++) {
time = allData[det][0];
if (time >0 && time !=99999) {
lookkey->SetKey(det);
lookvalue = (AliT0LookUpValue*) fLookUp.GetValue((TObject*)lookkey);
if (lookvalue )
{
isData++;
itrm= lookvalue->GetTRM();
if (det >56 &&inside == 0) {
WriteChainDataTrailer(1);
fIndex++;
WriteChainDataHeader(2, 1);
inside++;
}
chain = lookvalue->GetChain();
iTDC = lookvalue->GetTDC();
channel = lookvalue->GetChannel();
FillTime(channel, iTDC, time);
AliDebug(1,Form("look %i itrm %i , chain %i , iTDC %i, channel %i time %i", det,itrm,chain,iTDC,channel, time));
}
else
{
cout<<" no lookup value for key "<<det<<endl;
}
}
}
if (inside==0) {
WriteChainDataTrailer(1);
fIndex++;
WriteChainDataHeader(2, 1);
}
WriteChainDataTrailer(3);
WriteTrailer(15,0,fEventNumber,5);
trm1words = fIndex - startTRM;
WriteTRMDataHeader(itrm, trm1words , positionOfTRMHeader);
WriteTrailer(1,0,fEventNumber,5);
WriteDRMDataHeader();
}
void AliT0RawData::WriteDRMDataHeader()
{
UInt_t word;
UInt_t baseWord=0;
word = 1;
AliBitPacking::PackWord(word,baseWord,0, 3);
word = fIndex ;
AliBitPacking::PackWord(word,baseWord,4, 20);
word=124;
AliBitPacking::PackWord(word,baseWord, 21, 27);
word=4;
AliBitPacking::PackWord(word,baseWord,28, 31);
fBuffer[0]= baseWord;
word = 1;
AliBitPacking::PackWord(word,baseWord,0, 3);
word = 1;
AliBitPacking::PackWord(word,baseWord,4, 14);
word = 1;
AliBitPacking::PackWord(word,baseWord,15, 15);
word=0;
AliBitPacking::PackWord(word,baseWord,16,27);
word=4;
AliBitPacking::PackWord(word,baseWord,28,31);
fBuffer[1] = baseWord;
word=0;
baseWord=0;
word = 1;
AliBitPacking::PackWord(word,baseWord, 0, 3);
word = 3;
AliBitPacking::PackWord(word,baseWord, 4, 14);
word = 0;
AliBitPacking::PackWord(word,baseWord, 15, 15);
word=0;
AliBitPacking::PackWord(word,baseWord, 16, 27);
word=4;
AliBitPacking::PackWord(word,baseWord,28,31);
fBuffer[2]= baseWord;
word=0;
baseWord=0;
word = 1;
AliBitPacking::PackWord(word,baseWord,0, 3);
word = 0;
AliBitPacking::PackWord(word,baseWord,4, 27);
word=4;
AliBitPacking::PackWord(word,baseWord,28,31);
fBuffer[3]= baseWord;
fBuffer[4]= baseWord;
fBuffer[5]= baseWord;
word=0;
baseWord=0;
}
void AliT0RawData::WriteTRMDataHeader(UInt_t slotID, Int_t nWordsInTRM,
Int_t positionOfTRMHeader)
{
UInt_t word;
UInt_t baseWord=0;
word = slotID;
AliBitPacking::PackWord(word,baseWord,0, 3);
word = nWordsInTRM;
AliBitPacking::PackWord(word,baseWord,4, 16);
word=0;
AliBitPacking::PackWord(word,baseWord,17,18);
word=0;
AliBitPacking::PackWord(word,baseWord,19,19);
word=0;
AliBitPacking::PackWord(word,baseWord,20,27);
word=4;
AliBitPacking::PackWord(word,baseWord,28,31);
fBuffer[positionOfTRMHeader] = baseWord;
word=0;
baseWord=0;
}
void AliT0RawData::WriteChainDataHeader(UInt_t chainNumber,UInt_t slotID)
{
UInt_t word;
UInt_t baseWord=0;
word = slotID;
AliBitPacking::PackWord(word,baseWord,0, 3);
word = 0;
AliBitPacking::PackWord(word,baseWord,4, 15);
word=0;
AliBitPacking::PackWord(word,baseWord,16,23);
word=0;
AliBitPacking::PackWord(word,baseWord,24,26);
word=0;
AliBitPacking::PackWord(word,baseWord,27,27);
word=chainNumber;
AliBitPacking::PackWord(word,baseWord,28,31);
fBuffer[fIndex] = baseWord;
word=0;
baseWord=0;
}
void AliT0RawData::WriteChainDataTrailer(UInt_t chainNumber )
{
UInt_t word;
UInt_t baseWord=0;
word = 0;
AliBitPacking::PackWord(word,baseWord,0, 3);
word = 0;
AliBitPacking::PackWord(word,baseWord,4, 15);
word=fEventNumber;
AliBitPacking::PackWord(word,baseWord,16,27);
word=chainNumber;
AliBitPacking::PackWord(word,baseWord,28,31);
fIndex++;
fBuffer[fIndex] = baseWord;
word=0;
baseWord=0;
}
void AliT0RawData::WriteDataHeader(Bool_t dummy, Bool_t compressed)
{
AliRawDataHeaderSim header;
if (dummy) {
fDataHeaderPos = fFile->Tellp();
fFile->WriteBuffer((char*)(&header), sizeof(header));
} else {
UInt_t currentFilePos = fFile->Tellp();
fFile->Seekp(fDataHeaderPos);
header.fSize = currentFilePos-fDataHeaderPos;
header.SetAttribute(0);
if (compressed) header.SetAttribute(1);
fFile->WriteBuffer((char*)(&header), sizeof(header));
fFile->Seekp(currentFilePos);
}
}
void AliT0RawData::WriteTrailer(UInt_t slot, Int_t word1, UInt_t word2, UInt_t word3)
{
UInt_t word;
UInt_t baseWord=0;
word = slot;
AliBitPacking::PackWord(word,baseWord,0, 3);
word=word1;
AliBitPacking::PackWord(word,baseWord,4, 15);
word = word2;
AliBitPacking::PackWord(word,baseWord,16,27);
word=word3;
AliBitPacking::PackWord(word,baseWord,28,31);
fIndex++;
fBuffer[fIndex] = baseWord;
word=0;
baseWord=0;
}
void AliT0RawData::FillTime(Int_t ch, Int_t iTDC, Int_t time)
{
UInt_t word;
UInt_t baseWord=0;
word=time;
AliBitPacking::PackWord(word,baseWord, 0, 20);
word=ch;
AliBitPacking::PackWord(word,baseWord, 21, 23);
word=iTDC;
AliBitPacking::PackWord(word,baseWord, 24, 27);
word=0;
AliBitPacking::PackWord(word,baseWord, 28, 28);
word=0;
AliBitPacking::PackWord(word,baseWord, 29, 30);
word=1;
AliBitPacking::PackWord(word,baseWord, 31, 31);
fIndex++;
fBuffer[fIndex]=baseWord;
word=0;
baseWord=0;
}
Int_t AliT0RawData::RawDataT0(AliT0digit *fDigits)
{
fIndex=-1;
WriteDataHeader(kTRUE, kFALSE);
GetDigits(fDigits);
fFile->WriteBuffer((char*) fBuffer,((fIndex+1)*sizeof(UInt_t)));
WriteDataHeader(kFALSE, kFALSE);
return 0;
}