// //
///////////////////////////////////////////////////////////////////////////////
-#include <Riostream.h>
-#include <TTree.h>
-
+//#include <Riostream.h>
+//#include <TTree.h>
+#include <TMap.h>
#include "AliT0.h"
#include "AliT0RawData.h"
#include "AliT0digit.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()
+ 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)
+
+
{
/*
- 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;
+ //open the output file
+ // char fileName[15];
+ // strcpy(fileName,AliDAQ::DdlFileName("T0",0)); //The name of the output file
+ TString fileName = Form("%s",AliDAQ::DdlFileName("T0",0));
+ fFile = new AliFstream(fileName.Data());
memset(fBuffer,0,512*sizeof(UInt_t));
- //open the output file
- char fileName[15];
- sprintf(fileName,"T0_%d.ddl", 0xd00);
- fFile = new AliFstream(fileName);
//get event number
- AliRunLoader *runloader = AliRunLoader::GetRunLoader();
+ AliRunLoader *runloader = AliRunLoader::Instance();
if (runloader) {
fEventNumber = runloader->GetEventNumber();
}
+
+ // Inverse lookup table for simulation
+
+ fParam = AliT0Parameters::Instance();
+ fParam->Init();
+ AliT0LookUpKey* lookkey;//= new AliT0LookUpKey();
+ AliT0LookUpValue* lookvalue;//= new AliT0LookUpValue();
+ 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);
+ //lookkey= new AliT0LookUpKey();
+ //lookvalue= new AliT0LookUpValue();
+ }
+
}
//_____________________________________________________________________________
-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),
+ fParam(0),
+ fLookUp(0)
+
{
//
// AliT0rawData copy constructor
//
// Destructor
//
- if (fDigits) {
- delete fDigits;
- fDigits = NULL;
- }
delete fTimeCFD;
delete fADC1;
delete fTimeLED;
delete fADC0;
+ delete fFile;
}
//_____________________________________________________________________________
//_____________________________________________________________________________
void AliT0RawData::GetDigits(AliT0digit *fDigits)
+//void AliT0RawData::GetDigits(fDigits)
{
//This method packs the T0 digits in a proper 32 bits structure
// 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 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);
+ Int_t timeA = fDigits->BestTimeC();
+ Int_t timeC = fDigits->BestTimeA();
+
+
+ // TArrayI *allData = new TArrayI(110);
+ 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->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[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;
+
+ // 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(1, 1); //
+ // fIndex++;
// 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++) {
- time = allData->At(det);
-
- if (time >0) {
- FillTime(channel, iTDC, time);
- trm1words++;
- }
- if (channel < 6) channel +=2;
- else {
- channel = 0;
- iTDC++;
- if (iTDC>15) { chain++; iTDC=0;}
+ Int_t itrm=7;
+ Int_t inside =0;
+ Int_t isData = 0;
+ AliT0LookUpKey * lookkey = new AliT0LookUpKey();
+ AliT0LookUpValue * lookvalue ;//= new AliT0LookUpValue(trm,tdc,chain,channel);
+ 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); // 1st chain trailer
+ fIndex++;
+ WriteChainDataHeader(2, 1);
+ // fIndex++;
+ 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;
+ // break;
+ }
}
+
}
-
- WriteTrailer(0,0,fEventNumber,1); // 1st chain trailer
- WriteTrailer(15,0,fEventNumber,5); // 1st TRM trailer
- fWordsIn1stTRM = trm1words + 4;
- WriteTRMDataHeader(3, trm1words , positionOfTRMHeader);
-
-
- //space for 2st TRM header
- fIndex ++;
- positionOfTRMHeader= fIndex;
-
- //space for chain header
- fIndex ++;
-
-
- 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) {
- FillTime(channel, iTDC, time);
- trm2words++;}
- if (channel < 6) channel +=2;
- else {
- channel = 0;
- iTDC++;
- if (iTDC>15) { chain++; iTDC=0;}
- }
+ if (inside==0) {
+ WriteChainDataTrailer(1); // 1st chain trailer
+ fIndex++;
+ WriteChainDataHeader(2, 1);
}
-
- WriteTrailer(0,0,fEventNumber,1); // 1st chain trailer
+ // WriteChainDataHeader(2, 1); //
+ WriteChainDataTrailer(3); // 2st chain trailer
WriteTrailer(15,0,fEventNumber,5); // 1st TRM trailer
- WriteTRMDataHeader(5,trm2words,positionOfTRMHeader);
-
- WriteTrailer(1,fEventNumber,0,5); //DRM trailer
- WriteDRMDataHeader();
-
-}
-//------------------------------------------------------------------------------
-void AliT0RawData::PackWord(UInt_t &BaseWord, UInt_t Word, Int_t StartBit, Int_t StopBit)
-{
- // Build mask
- Int_t len=StopBit-StartBit+1;
- UInt_t mask=0;
- for(Int_t jb=0; jb<len; mask|=1<<jb++);
- // Check consistency
- if(Word > mask){
- Error("PackWord", "Word to be filled is not within desired length\n"
- "Word:%d Start bit:%d Stop Bit:%d",Word,StartBit,StopBit);
- return;
- }
- BaseWord=(BaseWord&~(mask<<StartBit))|Word<<StartBit;
-
+
+ trm1words = fIndex - startTRM;
+ //space for 2st TRM header
+
+ WriteTRMDataHeader(itrm, trm1words , positionOfTRMHeader);
+
+ //DRM trailer
+ WriteTrailer(1,0,fEventNumber,5);
+
+ WriteDRMDataHeader();
+
}
-
//_____________________________________________________________________________
void AliT0RawData::WriteDRMDataHeader()
//fill DRM headers
//DRM Global Header
word = 1;
- PackWord(baseWord,word,0, 3); // 0001
+ AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
word = fIndex ;
- PackWord(baseWord,word,4, 20); // event words
+ AliBitPacking::PackWord(word,baseWord,4, 20); // event words
word=124;
- PackWord(baseWord,word,21,27); // DRM ID for T0 - 124
+ AliBitPacking::PackWord(word,baseWord, 21, 27); // event words
word=4;
- PackWord(baseWord,word,28,31); // 0100 marks header
+ AliBitPacking::PackWord(word,baseWord,28, 31);// 0100 marks header
fBuffer[0]= baseWord;
+
//DRM status header 1
word = 1;
- PackWord(baseWord,word,0, 3); // 0001
+ AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
word = 1;
- PackWord(baseWord,word,4, 14); // slotID now 0000000001
+ AliBitPacking::PackWord(word,baseWord,4, 14); // slotID now 0000000001
word = 1;
- PackWord(baseWord,word,15, 15); //if 1 LHC clock is coorectly recieved from CPDM
+ AliBitPacking::PackWord(word,baseWord,15, 15); //if 1 LHC clock is coorectly recieved from CPDM
word=0;
- PackWord(baseWord,word,16,27); // reserve for future use
+ AliBitPacking::PackWord(word,baseWord,16,27); // reserve for future use
word=4;
- PackWord(baseWord,word,28,31); // 0100 marks header
- fBuffer[1] = baseWord;
-
- word=0;
- baseWord=0;
-
- //DRM status header 2
- word = 1;
- PackWord(baseWord,word, 0, 3); // 0001
- word = 3;
- PackWord(baseWord,word, 4, 14); //enable slotID now 00000000011
- word = 0;
- PackWord(baseWord,word, 15, 15); // something
- word=0;
- PackWord(baseWord,word, 16, 27); // fault ID for simulation 0
- word=4;
- PackWord(baseWord,word,28,31); // 0100 marks header
- fBuffer[2]= baseWord;
-
-
- word=0;
- baseWord=0;
- //DRM status header 3
- word = 1;
- PackWord(baseWord,word,0, 3); // 0001
+ AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
+ fBuffer[1] = baseWord;
+
+ word=0;
+ baseWord=0;
+
+ //DRM status header 2
+ word = 1;
+ AliBitPacking::PackWord(word,baseWord, 0, 3); // 0001
+ word = 3;
+ AliBitPacking::PackWord(word,baseWord, 4, 14); //enable slotID now 00000000011
+ word = 0;
+ AliBitPacking::PackWord(word,baseWord, 15, 15); // something
+ word=0;
+ AliBitPacking::PackWord(word,baseWord, 16, 27); // fault ID for simulation 0
+ word=4;
+ AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
+ fBuffer[2]= baseWord;
+
+ word=0;
+ baseWord=0;
+ //DRM status header 3
+ word = 1;
+ AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
word = 0;
- PackWord(baseWord,word,4, 27); // TTC event counter
+ AliBitPacking::PackWord(word,baseWord,4, 27); // TTC event counter
word=4;
- PackWord(baseWord,word,28,31); // 0100 marks header
+ AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
fBuffer[3]= baseWord;
-
+ // new DRM format
+ fBuffer[4]= baseWord;
+ fBuffer[5]= baseWord;
+
word=0;
baseWord=0;
//fill TRM headers
//TRM Global Header
word = slotID;
- PackWord(baseWord,word,0, 3); // slotID
+ AliBitPacking::PackWord(word,baseWord,0, 3); // slotID
word = nWordsInTRM;
//+this word - DRM header
- PackWord(baseWord,word,4, 16); // event words
+ AliBitPacking::PackWord(word,baseWord,4, 16); // event words
word=0;
- PackWord(baseWord,word,17,18); // ACQ
+ AliBitPacking::PackWord(word,baseWord,17,18); // ACQ
word=0;
- PackWord(baseWord,word,19,19); // L SEY inside LUT
+ AliBitPacking::PackWord(word,baseWord,19,19); // L SEY inside LUT
word=0;
- PackWord(baseWord,word,20,27); // MBZ
+ AliBitPacking::PackWord(word,baseWord,20,27); // MBZ
word=4;
- PackWord(baseWord,word,28,31); // 0100 marks header
+ AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
fBuffer[positionOfTRMHeader] = baseWord;
-
+
word=0;
baseWord=0;
//fill TRM headers
//TRM Global Header
word = slotID; // ask Tatiana 7 or 9
- PackWord(baseWord,word,0, 3); // slotID
+ AliBitPacking::PackWord(word,baseWord,0, 3); // slotID
word = 0;
- PackWord(baseWord,word,4, 15); // bunchID
+ AliBitPacking::PackWord(word,baseWord,4, 15); // bunchID
word=0;
- PackWord(baseWord,word,16,23); // PB24 temperature
+ AliBitPacking::PackWord(word,baseWord,16,23); // PB24 temperature
word=0;
- PackWord(baseWord,word,24,26); // PB24 ID
+ AliBitPacking::PackWord(word,baseWord,24,26); // PB24 ID
word=0;
- PackWord(baseWord,word,27,27); // TS
+ AliBitPacking::PackWord(word,baseWord,27,27); // TS
word=chainNumber;
- PackWord(baseWord,word,28,31); // 0100 marks header
- fBuffer[4] = baseWord;
+ AliBitPacking::PackWord(word,baseWord,28,31); // 0100 marks header
+ fBuffer[fIndex] = baseWord;
+ //cout<<" chain header "<<baseWord<<" number "<<chainNumber<<endl;
+ 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
+ AliBitPacking::PackWord(word,baseWord,0, 3); // status
+ word = 0;
+ AliBitPacking::PackWord(word,baseWord,4, 15); // MBZ
+ word=fEventNumber;
+ AliBitPacking::PackWord(word,baseWord,16,27); // event counter
+ word=chainNumber;
+ AliBitPacking::PackWord(word,baseWord,28,31); // chain number
+ fIndex++;
+ fBuffer[fIndex] = baseWord;
word=0;
baseWord=0;
void AliT0RawData::WriteTrailer(UInt_t slot, Int_t word1, UInt_t word2, UInt_t word3)
{
+//Write a (dummy or real) DDL Chain data trailer
UInt_t word;
UInt_t baseWord=0;
word = slot;
- PackWord(baseWord,word,0, 3); // 0001
+ AliBitPacking::PackWord(word,baseWord,0, 3); // 0001
word=word1;
- PackWord(baseWord,word,4, 15); // CRC ?
+ AliBitPacking::PackWord(word,baseWord,4, 15); // CRC ?
word = word2;
- PackWord(baseWord,word,16,27); // event counter
+ AliBitPacking::PackWord(word,baseWord,16,27); // event counter
word=word3;
- PackWord(baseWord,word,28,31); // marks trailer
+ AliBitPacking::PackWord(word,baseWord,28,31); // marks trailer
fIndex++;
fBuffer[fIndex] = baseWord;
-
+
word=0;
baseWord=0;
//---------------------------------------------------------------------------------------
void AliT0RawData::FillTime(Int_t ch, Int_t iTDC, Int_t time)
{
+ // put all time fields thother in 1 word
+
UInt_t word;
UInt_t baseWord=0;
word=time;
- PackWord(baseWord,word, 0, 20); // Time
+ AliBitPacking::PackWord(word,baseWord, 0, 20); // Time
word=ch;
- PackWord(baseWord,word, 21, 23); // number of channel
+ AliBitPacking::PackWord(word,baseWord, 21, 23); // number of channel
word=iTDC;
- PackWord(baseWord,word, 24, 27); // TDC ID
+ AliBitPacking::PackWord(word,baseWord, 24, 27); // TDC ID
word=0;
- PackWord(baseWord,word, 28, 28); // E = 0 in simulation
+ AliBitPacking::PackWord(word,baseWord, 28, 28); // E = 0 in simulation
word=0;
- PackWord(baseWord,word, 29, 30); // PS bit data 00
+ AliBitPacking::PackWord(word,baseWord, 29, 30); // PS bit data 00
word=1;
- PackWord(baseWord,word, 31, 31); // 1
+ AliBitPacking::PackWord(word,baseWord, 31, 31); // 1
fIndex++;
fBuffer[fIndex]=baseWord;
+
word=0;
baseWord=0;
-
}
//---------------------------------------------------------------------------------------
Int_t AliT0RawData::RawDataT0(AliT0digit *fDigits)
+ //Int_t AliT0RawData::RawDataT0(*fDigits)
{
//This method creates the Raw data files for T0 detector
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);