#include "AliCTPRawStream.h"
#include "AliRawReader.h"
#include "AliLog.h"
#include "AliDAQ.h"
#include "AliTriggerIR.h"
ClassImp(AliCTPRawStream)
AliCTPRawStream::AliCTPRawStream(AliRawReader* rawReader) :
fIRArray("AliTriggerIR",3),
fOrbit(0),
fBC(0),
fL0TriggerInputs(0),
fL1TriggerInputs(0),
fL2TriggerInputs(0),
fClassMask(0),
fClassMaskNext50(0),
fClusterMask(0),
fRawReader(rawReader)
{
fRawReader->Reset();
AliDebug(1,Form("Selecting raw data for detector %d",AliDAQ::DetectorID("TRG")));
fRawReader->Select("TRG");
}
AliCTPRawStream::AliCTPRawStream(const AliCTPRawStream& stream) :
TObject(stream),
fIRArray("AliTriggerIR",3),
fOrbit(0),
fBC(0),
fL0TriggerInputs(0),
fL1TriggerInputs(0),
fL2TriggerInputs(0),
fClassMask(0),
fClassMaskNext50(0),
fClusterMask(0),
fRawReader(NULL)
{
AliFatal("Copy constructor not implemented");
}
AliCTPRawStream& AliCTPRawStream::operator = (const AliCTPRawStream&
)
{
AliFatal("Assignment operator not implemented");
return *this;
}
AliCTPRawStream::~AliCTPRawStream()
{
fIRArray.Delete();
}
void AliCTPRawStream::Reset()
{
fIRArray.Clear();
fClassMask = fClusterMask = 0;
fClassMaskNext50 = 0;
if (fRawReader) fRawReader->Reset();
}
Bool_t AliCTPRawStream::Next()
{
UChar_t *data = NULL;
fRawReader->RequireHeader(kFALSE);
if (!fRawReader->ReadNextData(data)) {
fRawReader->RequireHeader(kTRUE);
return kFALSE;
}
if ((fRawReader->GetDataSize()) < 32 ||
((fRawReader->GetDataSize() % 4) != 0)) {
AliError(Form("Wrong CTP raw data size: %d",fRawReader->GetDataSize()));
fRawReader->RequireHeader(kTRUE);
return kFALSE;
}
fBC = data[0];
fBC |= (data[1] & 0xF) << 8;
fOrbit = data[4] << 12;
fOrbit |= (data[5] & 0xF) << 20;
fOrbit |= data[8];
fOrbit |= (data[9] & 0xF) << 8;
UInt_t version=data[13] & 0x10;
if(version == 0){
return GetPayloadRun1(data);
}
else{
return GetPayloadRun2(data);
}
}
Bool_t AliCTPRawStream::GetPayloadRun2(UChar_t *data)
{
fClusterMask = data[12]&0xef;
fClassMaskNext50 = ((ULong64_t)data[16] & 0xf) << 46;
fClassMaskNext50 |= ((ULong64_t)data[21] & 0xF) << 42;
fClassMaskNext50 |= (ULong64_t)data[20] << 34;
fClassMaskNext50 |= ((ULong64_t)data[25] & 0xF) << 30;
fClassMaskNext50 |= (ULong64_t)data[24] << 22;
fClassMaskNext50 |= ((ULong64_t)data[29] & 0xF) << 18;
fClassMaskNext50 |= (ULong64_t)data[28] << 10;
fClassMaskNext50 |= ((ULong64_t)data[33] & 0xf ) << 6;
fClassMaskNext50 |= ((ULong64_t)data[32] & 0xfc )>> 2;
fClassMask = ((ULong64_t)data[32] & 0x3 ) << 48;
fClassMask |= ((ULong64_t)data[37] & 0xf) << 44;
fClassMask |= (ULong64_t)data[36] << 36;
fClassMask |= ((ULong64_t)data[41] & 0xf) << 32;
fClassMask |= (ULong64_t)data[40] << 24;
fClassMask |= ((ULong64_t)data[45] & 0xf) << 20;
fClassMask |= (ULong64_t)data[44] << 12;
fClassMask |= ((ULong64_t)data[49] & 0xf) << 8;
fClassMask |= (ULong64_t)data[48] << 0;
if (fRawReader->GetDataSize() == 52) {
AliDebug(1,"No trigger input and interaction records found");
fRawReader->RequireHeader(kTRUE);
return kTRUE;
}
if (fRawReader->GetDataSize() < 72) {
AliError(Form("Wrong CTP raw data size: %d",fRawReader->GetDataSize()));
fRawReader->RequireHeader(kTRUE);
return kFALSE;
}
fL0TriggerInputs = data[52] << 12;
fL0TriggerInputs |= (data[53] & 0xF) << 20;
fL0TriggerInputs |= data[56];
fL0TriggerInputs |= (data[57] & 0xF) << 8;
fL1TriggerInputs = data[60] << 12;
fL1TriggerInputs |= (data[61] & 0xF) << 20;
fL1TriggerInputs |= data[64];
fL1TriggerInputs |= (data[65] & 0xF) << 8;
fL2TriggerInputs = data[68] << 12;
fL2TriggerInputs |= (data[69] & 0xF) << 20;
if (fRawReader->GetDataSize() == 72) {
AliDebug(1,"No interaction records found");
fRawReader->RequireHeader(kTRUE);
return kTRUE;
}
Int_t iword = 52;
UChar_t level = 0;
UInt_t *irdata = NULL;
UInt_t irsize = 0;
UInt_t orbit = 0;
Bool_t incomplete = kFALSE, transerr = kFALSE;
while (iword < fRawReader->GetDataSize()) {
if (data[iword+1] & 0x80) {
UChar_t flag = ((data[iword+1] >> 4) & 0x3);
if (flag == 0) {
if (irdata) {
new (fIRArray[fIRArray.GetEntriesFast()])
AliTriggerIR(orbit,irsize,irdata,incomplete,transerr);
irdata = NULL; irsize = 0;
}
level = 1;
orbit = data[iword] << 12;
orbit |= (data[iword+1] & 0xF) << 20;
transerr = ((data[iword+1] >> 6) & 0x1);
iword += 4;
continue;
}
else if (flag == 3) {
if (level == 1) {
level = 2;
orbit |= data[iword];
orbit |= ((data[iword+1] & 0xF) << 8);
iword += 4;
AliDebug(1,Form("Orbit=0x%x\n",orbit));
continue;
}
}
UShort_t bc = data[iword];
bc |= ((data[iword+1] & 0xF) << 8);
AliDebug(1,Form("BC=0x%x\n",bc));
if (bc == 0xFFF) {
incomplete = kTRUE;
}
else {
if (level == 2) {
level = 3;
irdata = (UInt_t *)&data[iword];
irsize = 0;
}
if (level == 3) {
irsize++;
}
}
}
else
AliWarning(Form("Invalid interaction record (%d %d)",iword,fRawReader->GetDataSize()));
iword += 4;
}
if (irdata) {
new (fIRArray[fIRArray.GetEntriesFast()])
AliTriggerIR(orbit,irsize,irdata,incomplete,transerr);
irdata = NULL; irsize = 0;
}
fRawReader->RequireHeader(kTRUE);
return kTRUE;
}
Bool_t AliCTPRawStream::GetPayloadRun1(UChar_t *data)
{
fClusterMask = data[12] >> 2;
fClassMask = ((ULong64_t)data[12] & 0x3) << 48;
fClassMask |= (ULong64_t)data[16] << 36;
fClassMask |= ((ULong64_t)data[17] & 0xF) << 44;
fClassMask |= (ULong64_t)data[20] << 24;
fClassMask |= ((ULong64_t)data[21] & 0xF) << 32;
fClassMask |= (ULong64_t)data[24] << 12;
fClassMask |= ((ULong64_t)data[25] & 0xF) << 20;
fClassMask |= (ULong64_t)data[28];
fClassMask |= ((ULong64_t)data[29] & 0xF) << 8;
if (fRawReader->GetDataSize() == 32) {
AliDebug(1,"No trigger input and interaction records found");
fRawReader->RequireHeader(kTRUE);
return kTRUE;
}
if (fRawReader->GetDataSize() < 52) {
AliError(Form("Wrong CTP raw data size: %d",fRawReader->GetDataSize()));
fRawReader->RequireHeader(kTRUE);
return kFALSE;
}
fL0TriggerInputs = data[32] << 12;
fL0TriggerInputs |= (data[33] & 0xF) << 20;
fL0TriggerInputs |= data[36];
fL0TriggerInputs |= (data[37] & 0xF) << 8;
fL1TriggerInputs = data[40] << 12;
fL1TriggerInputs |= (data[41] & 0xF) << 20;
fL1TriggerInputs |= data[44];
fL1TriggerInputs |= (data[45] & 0xF) << 8;
fL2TriggerInputs = data[48] << 12;
fL2TriggerInputs |= (data[49] & 0xF) << 20;
if (fRawReader->GetDataSize() == 52) {
AliDebug(1,"No interaction records found");
fRawReader->RequireHeader(kTRUE);
return kTRUE;
}
Int_t iword = 52;
UChar_t level = 0;
UInt_t *irdata = NULL;
UInt_t irsize = 0;
UInt_t orbit = 0;
Bool_t incomplete = kFALSE, transerr = kFALSE;
while (iword < fRawReader->GetDataSize()) {
if (data[iword+1] & 0x80) {
UChar_t flag = ((data[iword+1] >> 4) & 0x3);
if (flag == 0) {
if (irdata) {
new (fIRArray[fIRArray.GetEntriesFast()])
AliTriggerIR(orbit,irsize,irdata,incomplete,transerr);
irdata = NULL; irsize = 0;
}
level = 1;
orbit = data[iword] << 12;
orbit |= (data[iword+1] & 0xF) << 20;
transerr = ((data[iword+1] >> 6) & 0x1);
iword += 4;
continue;
}
else if (flag == 3) {
if (level == 1) {
level = 2;
orbit |= data[iword];
orbit |= ((data[iword+1] & 0xF) << 8);
iword += 4;
AliDebug(1,Form("Orbit=0x%x\n",orbit));
continue;
}
}
UShort_t bc = data[iword];
bc |= ((data[iword+1] & 0xF) << 8);
AliDebug(1,Form("BC=0x%x\n",bc));
if (bc == 0xFFF) {
incomplete = kTRUE;
}
else {
if (level == 2) {
level = 3;
irdata = (UInt_t *)&data[iword];
irsize = 0;
}
if (level == 3) {
irsize++;
}
}
}
else
AliWarning(Form("Invalid interaction record (%d %d)",iword,fRawReader->GetDataSize()));
iword += 4;
}
if (irdata) {
new (fIRArray[fIRArray.GetEntriesFast()])
AliTriggerIR(orbit,irsize,irdata,incomplete,transerr);
irdata = NULL; irsize = 0;
}
fRawReader->RequireHeader(kTRUE);
return kTRUE;
}