#include <TObjArray.h>
#include <TString.h>
#include <TSystem.h>
#include <Riostream.h>
#include <stdio.h>
#include <stdlib.h>
#include "AliAltroBufferV3.h"
#include "AliTPCAltroMapping.h"
#include "AliTPCDDLRawData.h"
#include "AliDAQ.h"
using std::ios;
ClassImp(AliTPCDDLRawData)
AliTPCDDLRawData::AliTPCDDLRawData(const AliTPCDDLRawData &source):
TObject(source),
fVerbose(0)
{
fVerbose=source.fVerbose;
return;
}
AliTPCDDLRawData& AliTPCDDLRawData::operator=(const AliTPCDDLRawData &source){
if (this == &source) return (*this);
fVerbose=source.fVerbose;
return *this;
}
void AliTPCDDLRawData::RawData(const char* inputFileName){
ifstream f;
#ifndef __DECCXX
f.open(inputFileName,ios::binary);
#else
f.open(inputFileName);
#endif
if(!f){Error("RawData", "File doesn't exist !!");return;}
struct DataPad{
Int_t Sec;
Int_t SubSec;
Int_t Row;
Int_t Pad;
Int_t Dig;
Int_t Time;
};
DataPad data;
char filename[101];
Int_t ddlNumber=0;
AliAltroBuffer *buffer=NULL;
Int_t pSecNumber=-1;
Int_t pRowNumber=-1;
Int_t pPadNumber=-1;
Int_t pTimeBin=-1;
Int_t pSubSector=-1;
Int_t bunchLength=0;
Int_t nwords=0;
UInt_t numPackets=0;
TString path = gSystem->Getenv("ALICE_ROOT");
path += "/TPC/mapping/Patch";
TString path2;
AliTPCAltroMapping *mapping[6];
for(Int_t i = 0; i < 6; i++) {
path2 = path;
path2 += i;
path2 += ".data";
mapping[i] = new AliTPCAltroMapping(path2.Data());
}
while (f.read((char*)(&data),sizeof(data))){
if (pPadNumber==-1){
pSecNumber=data.Sec;
pRowNumber=data.Row;
pPadNumber=data.Pad;
pTimeBin=data.Time;
pSubSector=data.SubSec;
if(data.Sec<36)
ddlNumber=data.Sec*2+data.SubSec;
else
ddlNumber=72+(data.Sec-36)*4+data.SubSec;
strncpy(filename,AliDAQ::DdlFileName("TPC",ddlNumber),100);
Int_t patchIndex = data.SubSec;
if(data.Sec>=36) patchIndex += 2;
buffer=new AliAltroBufferV3(filename,mapping[patchIndex]);
buffer->WriteDataHeader(kTRUE,kFALSE);
bunchLength=1;
buffer->FillBuffer(data.Dig);
nwords++;
}
else{
if ( (data.Time==(pTimeBin+1)) &&
(pPadNumber==data.Pad) &&
(pRowNumber==data.Row) &&
(pSecNumber==data.Sec) &&
(pSubSector==data.SubSec)){
bunchLength++;
}
else{
buffer->FillBuffer(pTimeBin);
buffer->FillBuffer(bunchLength+2);
nwords+=2;
if ((pPadNumber!=data.Pad)||(pRowNumber!=data.Row)||(pSecNumber!=data.Sec)||(pSubSector!=data.SubSec)){
buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
numPackets++;
nwords=0;
if(pSecNumber!=data.Sec || pSubSector!=data.SubSec){
buffer->Flush();
buffer->WriteDataHeader(kFALSE,kFALSE);
delete buffer;
if(data.Sec<36)
ddlNumber=data.Sec*2+data.SubSec;
else
ddlNumber=72+(data.Sec-36)*4+data.SubSec;
strncpy(filename,AliDAQ::DdlFileName("TPC",ddlNumber),100);
Int_t patchIndex = data.SubSec;
if(data.Sec>=36) patchIndex += 2;
buffer=new AliAltroBufferV3(filename,mapping[patchIndex]);
buffer->WriteDataHeader(kTRUE,kFALSE);
pSubSector=data.SubSec;
}
}
bunchLength=1;
pPadNumber=data.Pad;
pRowNumber=data.Row;
pSecNumber=data.Sec;
}
pTimeBin=data.Time;
buffer->FillBuffer(data.Dig);
nwords++;
}
}
if (buffer) {
buffer->FillBuffer(pTimeBin);
buffer->FillBuffer(bunchLength+2);
nwords+=2;
buffer->WriteTrailer(nwords,pPadNumber,pRowNumber,pSecNumber);
buffer->Flush();
buffer->WriteDataHeader(kFALSE,kFALSE);
delete buffer;
}
for(Int_t i = 0; i < 6; i++) delete mapping[i];
f.close();
return;
}