#include <stdio.h>
#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliLog.h"
#include "AliTRDptrgParam.h"
#include "AliTRDptrgFEB.h"
#include "AliTRDptrgLUT.h"
#include "AliTRDptrgCBAC.h"
ClassImp(AliTRDptrgCBAC)
AliTRDptrgCBAC::AliTRDptrgCBAC(AliRunLoader *rl)
: TObject(),
fRunLoader(rl),
fLUTArray(),
fFEBArray(),
fPosition(AliTRDptrgParam::kUnknown),
fOperatingMode(AliTRDptrgParam::kDigits),
fParam(0x0)
{
AliError("default ctor - usage not recommended");
}
AliTRDptrgCBAC::AliTRDptrgCBAC(AliRunLoader *rl,
AliTRDptrgParam::AliTRDptrgFEBPosition_t position,
AliTRDptrgParam::AliTRDptrgOperatingMode_t operatingMode,
AliTRDptrgParam *param)
: TObject(),
fRunLoader(rl),
fLUTArray(),
fFEBArray(),
fPosition(position),
fOperatingMode(operatingMode),
fParam(param)
{
this->LoadParams();
AliTRDptrgFEB *FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kTZERO,
this->fOperatingMode, this->fPosition,
0, this->fParam);
this->fFEBArray.AddLast(FEB);
FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode,
this->fPosition, 1, this->fParam);
this->fFEBArray.AddLast(FEB);
FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode,
this->fPosition, 2, this->fParam);
this->fFEBArray.AddLast(FEB);
FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode,
this->fPosition, 3, this->fParam);
this->fFEBArray.AddLast(FEB);
FEB = new AliTRDptrgFEB(this->fRunLoader, AliTRDptrgParam::kVZERO, this->fOperatingMode,
this->fPosition, 4, this->fParam);
this->fFEBArray.AddLast(FEB);
}
Bool_t AliTRDptrgCBAC::LoadParams()
{
if (this->fParam != 0x0) {
AliTRDptrgLUT* lut = 0x0;
lut = new AliTRDptrgLUT();
lut->InitTable(10, 10, this->fParam->GetCBLUT(this->fPosition, 0), kFALSE);
this->fLUTArray.AddLast(lut);
lut = new AliTRDptrgLUT();
lut->InitTable(10, 10, this->fParam->GetCBLUT(this->fPosition, 1), kFALSE);
this->fLUTArray.AddLast(lut);
}
else {
AliTRDptrgLUT* lut = new AliTRDptrgLUT();
this->fLUTArray.AddLast(lut);
lut = new AliTRDptrgLUT();
this->fLUTArray.AddLast(lut);
lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(0));
if (lut) {
Int_t* initData = new Int_t[1024];
for (Int_t i = 0; i < 1024; i++ ) {
initData[i] = i;
}
lut->InitTable(10, 10, initData, kTRUE);
lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(1));
if (lut) {
for (Int_t i = 1023; i >= 0; i--) {
initData[31 - i] = i;
}
lut->InitTable(10, 10, initData, kTRUE);
}
}
}
return false;
}
AliTRDptrgCBAC::~AliTRDptrgCBAC()
{
this->fLUTArray.Delete();
this->fFEBArray.Delete();
}
Int_t* AliTRDptrgCBAC::Simulate()
{
Int_t nFEBs = this->fFEBArray.GetEntries();
Int_t nLUTs = this->fLUTArray.GetEntries();
Int_t inputVector = 0x0;
Int_t** partResults = 0x0;
partResults = new Int_t* [nFEBs];
for (Int_t iFEB = 0; iFEB < nFEBs; iFEB++) {
AliTRDptrgFEB *feb = 0x0;
if ((feb = dynamic_cast<AliTRDptrgFEB*>(this->fFEBArray.At(iFEB)))) {
partResults[iFEB] = feb->Simulate();
}
}
Int_t iBit = 0;
Int_t mask = 0x1;
for (Int_t iFEB = 0; iFEB < nFEBs ; iFEB++) {
for (Int_t j = 1; j <= partResults[iFEB][0]; j++) {
AliTRDptrgLUT *lut0 = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[0]);
AliTRDptrgLUT *lut1 = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[1]);
if (lut0 && lut1) {
if ((iBit > lut0->GetInputWidth())
|| (iBit > lut1->GetInputWidth())) {
AliError("FEB result width does not match CB-A/C input with!");
}
}
iBit++;
if (partResults[iFEB][j] > 0) {
inputVector |= mask;
mask <<= 1;
}
}
}
AliDebug(5, Form("Inputvector: 0x%x", inputVector));
Int_t* result = new Int_t[nLUTs + 1];
result[0] = nLUTs;
for (Int_t iLUT = 0; iLUT < nLUTs; iLUT++) {
AliTRDptrgLUT *lutTmp = 0x0;
if ((lutTmp = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[iLUT]))) {
result[iLUT + 1] = lutTmp->LookUp(inputVector);
}
AliDebug(4, Form("CBAC result[%d] = 0x%x",(iLUT + 1),result[iLUT + 1]));
}
delete [] partResults;
return result;
}