#include "AliBitPacking.h"
#include "AliFstream.h"
#include "AliRunLoader.h"
+#include "AliDAQ.h"
ClassImp(AliT0RawData)
//_____________________________________________________________________________
-AliT0RawData::AliT0RawData():TObject()
+ 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),
+ fDigits(0)
+
{
/*
- 48 channels (2 words each as in TOF DDL) for :
uncertances
*/
- fIndex=-1;
- fDigits = NULL;
-
- fTimeCFD = new TArrayI(24);
- fADC1 = new TArrayI(24);
- fTimeLED = new TArrayI(24);
- fADC0 = new TArrayI(24);
- fFile = NULL;
- fDataHeaderPos = 0;
- fDRMDataHeaderPos = 0;
- memset(fBuffer,0,512*sizeof(UInt_t));
-
//open the output file
char fileName[15];
- sprintf(fileName,"T0_%d.ddl", 0xd00);
+ strcpy(fileName,AliDAQ::DdlFileName("T0",0)); //The name of the output file
fFile = new AliFstream(fileName);
+ memset(fBuffer,0,512*sizeof(UInt_t));
+
//get event number
AliRunLoader *runloader = AliRunLoader::GetRunLoader();
if (runloader) {
}
//_____________________________________________________________________________
-AliT0RawData::AliT0RawData(const AliT0RawData &r):TObject()
+
+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),
+ fDigits(0)
+
{
//
// AliT0rawData copy constructor
// Int_t error=0;
Int_t time, positionOfTRMHeader;
-
- // Get the digits array
-
- fDigits->GetTime(*fTimeCFD);
- fDigits->GetADC(*fADC1);
- fDigits->GetTimeAmp(*fTimeLED);
- fDigits->GetADCAmp(*fADC0);
+
+ // Get the digits array
+
+ 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->BestTimeLeft();
- Int_t timeC = fDigits->BestTimeRight();
-
-
- TArrayI *allData = new TArrayI(107);
+ Int_t timeA = fDigits->BestTimeC();
+ Int_t timeC = fDigits->BestTimeA();
+
+
+ TArrayI *allData = new TArrayI(110);
Int_t i=0;
- for (i=0; i<24; i++) {
- allData->AddAt(fTimeLED->At(i),i);
- allData->AddAt(fTimeCFD->At(i),i+24);
- allData->AddAt(fADC0->At(i),i+54);
- allData->AddAt(fADC1->At(i),i+78);
+ allData->AddAt(0,0);
+ for (i=1; i<25; i++) {
+ allData->AddAt(fTimeLED->At(i-1),i);
+ allData->AddAt(fTimeCFD->At(i-1),i+24);
+ allData->AddAt(fADC0->At(i-1),i+54);
+ allData->AddAt(fADC1->At(i-1),i+78);
+
}
- allData->AddAt(meantime,48);
- allData->AddAt(timediff,49);
- allData->AddAt(timediff,102); //trigger vertex
- allData->AddAt(timeA,50);
- allData->AddAt(timeA,103); //trigger T0A
- allData->AddAt(timeC,51);
- allData->AddAt(timeC,104); //trigger T0C
- allData->AddAt(mult0,52);
- allData->AddAt(mult1,105); //trigger central
- allData->AddAt(mult1,53);
- allData->AddAt(mult1,106); //trigger semi-central
+ allData->AddAt(meantime,49);
+ allData->AddAt(timediff,50);
+ allData->AddAt(timediff,103); //trigger vertex
+ allData->AddAt(timeA,51);
+ allData->AddAt(timeA,104); //trigger T0A
+ allData->AddAt(timeC,52);
+ allData->AddAt(timeC,105); //trigger T0C
+ allData->AddAt(mult0,53);
+ allData->AddAt(mult1,106); //trigger central
+ allData->AddAt(mult1,54);
+ allData->AddAt(mult1,107); //trigger semi-central
+
+ // cout.setf( ios_base::hex, ios_base::basefield );
+
//space for DRM header
- fIndex += 4;
+ fIndex += 6;
+ Int_t startTRM=fIndex;
//space for 1st TRM header
fIndex ++;
positionOfTRMHeader= fIndex;
//space for chain header
fIndex ++;
-
+ WriteChainDataHeader(0, 0); //
// Loop through all PMT
Int_t chain=0;
Int_t iTDC = 0;
Int_t channel=0;
Int_t trm1words=0;
- Int_t fWordsIn1stTRM=0;
+
//LED
- for (Int_t det = 0; det < 54; det++) {
+ for (Int_t det = 0; det < 55; det++) {
time = allData->At(det);
-
- if (time >0) {
+ if (time >0)
FillTime(channel, iTDC, time);
- trm1words++;
- }
if (channel < 6) channel +=2;
else {
channel = 0;
}
}
- WriteTrailer(0,0,fEventNumber,1); // 1st chain trailer
+
+ WriteChainDataTrailer(1); // 1st chain trailer
+ fIndex++;
+ WriteChainDataHeader(2, 1); //
+ WriteChainDataTrailer(3); // 2st chain trailer
WriteTrailer(15,0,fEventNumber,5); // 1st TRM trailer
- fWordsIn1stTRM = trm1words + 4;
- WriteTRMDataHeader(3, trm1words , positionOfTRMHeader);
+ trm1words = fIndex - startTRM;
+ WriteTRMDataHeader(0, trm1words , positionOfTRMHeader);
//space for 2st TRM header
+ startTRM=fIndex;
fIndex ++;
positionOfTRMHeader= fIndex;
-
- //space for chain header
+
+ // chain header
fIndex ++;
-
-
+ WriteChainDataHeader(0, 0); //
chain=0;
iTDC = 0;
channel=0;
- Int_t trm2words=0;
- for (Int_t det = 54; det < 107; det++) {
- time = allData->At(det);
- if (time >0) {
+ for (Int_t det = 55; det < 108; det++) {
+ time = allData->At(det);
+
+ if (time >0)
FillTime(channel, iTDC, time);
- trm2words++;}
+
if (channel < 6) channel +=2;
else {
channel = 0;
iTDC++;
if (iTDC>15) { chain++; iTDC=0;}
}
+
+
}
+ WriteChainDataTrailer(1); // 1st chain trailer
+ fIndex++;
+ WriteChainDataHeader(2, 1); //
+ WriteChainDataTrailer(3); // 2st chain trailer
+ WriteTrailer(15,0,fEventNumber,5); // 1st TRM trailer
+ trm1words = fIndex - startTRM;
+ WriteTRMDataHeader(1, trm1words , positionOfTRMHeader);
+ //DRM trailer
+ WriteTrailer(1,0,fEventNumber,5); // 1st TRM trailer
+
+ WriteDRMDataHeader();
- WriteTrailer(0,0,fEventNumber,1); // 1st chain trailer
- WriteTrailer(15,0,fEventNumber,5); // 1st TRM trailer
- WriteTRMDataHeader(5,trm2words,positionOfTRMHeader);
-
- WriteTrailer(1,fEventNumber,0,5); //DRM trailer
- WriteDRMDataHeader();
+ delete allData;
}
//------------------------------------------------------------------------------
PackWord(baseWord,word,28,31); // 0100 marks header
fBuffer[0]= baseWord;
+
//DRM status header 1
word = 1;
PackWord(baseWord,word,0, 3); // 0001
PackWord(baseWord,word,28,31); // 0100 marks header
fBuffer[1] = baseWord;
- word=0;
- baseWord=0;
+
+ word=0;
+ baseWord=0;
//DRM status header 2
word = 1;
word=4;
PackWord(baseWord,word,28,31); // 0100 marks header
fBuffer[2]= baseWord;
+
word=0;
PackWord(baseWord,word,28,31); // 0100 marks header
fBuffer[3]= baseWord;
-
+ // new DRM format
+ fBuffer[4]= baseWord;
+ fBuffer[5]= baseWord;
+
word=0;
baseWord=0;
word=4;
PackWord(baseWord,word,28,31); // 0100 marks header
fBuffer[positionOfTRMHeader] = baseWord;
-
+
word=0;
baseWord=0;
PackWord(baseWord,word,27,27); // TS
word=chainNumber;
PackWord(baseWord,word,28,31); // 0100 marks header
- fBuffer[4] = baseWord;
+ fBuffer[fIndex] = baseWord;
+
+ word=0;
+ baseWord=0;
+
+}
+//_____________________________________________________________________________
+
+void AliT0RawData::WriteChainDataTrailer(UInt_t chainNumber )
+{
+//Write a (dummy or real) DDL Chain data trailer
+//set the compression bit if compressed
+// chainNumber 00 or 10
+ UInt_t word;
+ UInt_t baseWord=0;
+ word = 0; // ask Tatiana 7 or 9
+ PackWord(baseWord,word,0, 3); // status
+ word = 0;
+ PackWord(baseWord,word,4, 15); // MBZ
+ word=fEventNumber;
+ PackWord(baseWord,word,16,27); // event counter
+ word=chainNumber;
+ PackWord(baseWord,word,28,31); // chain number
+ fIndex++;
+ fBuffer[fIndex] = baseWord;
word=0;
baseWord=0;
PackWord(baseWord,word,28,31); // marks trailer
fIndex++;
fBuffer[fIndex] = baseWord;
-
+
word=0;
baseWord=0;
fIndex=-1;
AliRawDataHeaderSim header;
- //loop over TOF DDL files
- //write Dummy DATA HEADER
WriteDataHeader(kTRUE, kFALSE);
GetDigits(fDigits);
//write packing digits
+
+
fFile->WriteBuffer((char*) fBuffer,((fIndex+1)*sizeof(UInt_t)));
//write real data header on its place
WriteDataHeader(kFALSE, kFALSE);