#include "TROOT.h"
#include "AliRun.h"
#include "AliRunLoader.h"
#include "AliTRDptrgLUT.h"
#include "AliTRDptrgParam.h"
#include "AliTRDptrgCBAC.h"
#include "AliTRDptrgTLMU.h"
#include "AliTRDptrgCBB.h"
#include "AliLog.h"
ClassImp(AliTRDptrgCBB)
AliTRDptrgCBB::AliTRDptrgCBB(AliRunLoader *rl)
: TObject(),
fRunLoader(rl),
fParam(0),
fOperatingMode(AliTRDptrgParam::kDigits),
fCBA(0),
fCBC(0),
fTLMU(0),
fLUTArray(0),
fPTmasks(0x0)
{
AliError("default ctor - usage not recommended\n");
}
AliTRDptrgCBB::AliTRDptrgCBB(AliRunLoader *rl, AliTRDptrgParam* param,
AliTRDptrgParam::AliTRDptrgOperatingMode_t operatingMode)
: TObject(),
fRunLoader(rl),
fParam(param),
fOperatingMode(operatingMode),
fCBA(0),
fCBC(0),
fTLMU(0),
fLUTArray(0),
fPTmasks(0x0)
{
this->fCBA = new AliTRDptrgCBAC(rl, AliTRDptrgParam::kA, operatingMode, param);
this->fCBC = new AliTRDptrgCBAC(rl, AliTRDptrgParam::kC, operatingMode, param);
this->fTLMU = new AliTRDptrgTLMU(rl, param, operatingMode);
this->LoadParams();
}
AliTRDptrgCBB::~AliTRDptrgCBB()
{
if (this->fCBA != 0x0) {
delete this->fCBA;
this->fCBA = 0x0;
}
if (this->fCBC != 0x0) {
delete this->fCBC;
this->fCBC = 0x0;
}
if (this->fTLMU != 0x0) {
delete this->fTLMU;
this->fTLMU = 0x0;
}
this->fLUTArray.Delete();
}
Bool_t AliTRDptrgCBB::LoadParams()
{
if (this->fParam != 0x0) {
AliTRDptrgLUT* LUT = new AliTRDptrgLUT();
LUT->InitTable(12, 12, this->fParam->GetCBLUT(0, 0), kFALSE);
this->fLUTArray.AddLast(LUT);
LUT = new AliTRDptrgLUT();
LUT->InitTable(12, 12, this->fParam->GetCBLUT(0, 1), kFALSE);
this->fLUTArray.AddLast(LUT);
LUT = new AliTRDptrgLUT();
LUT->InitTable(12, 12, this->fParam->GetCBLUT(0, 2), kFALSE);
this->fLUTArray.AddLast(LUT);
this->fPTmasks = this->fParam->GetPTmasks();
}
else {
AliTRDptrgLUT* lut = new AliTRDptrgLUT();
this->fLUTArray.AddLast(lut);
lut = new AliTRDptrgLUT();
this->fLUTArray.AddLast(lut);
lut = new AliTRDptrgLUT();
this->fLUTArray.AddLast(lut);
Int_t* initData = new Int_t[4096];
lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(0));
if (lut) {
for (Int_t i = 0; i < 4096; i++ ) {
initData[i] = i;
}
lut->InitTable(12, 12, initData, kTRUE);
}
lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(0));
if (lut) {
for (Int_t i = 0; i < 4096; i++ ) {
initData[i] = i;
}
lut->InitTable(12, 12, initData, kTRUE);
}
lut = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray.At(1));
if (lut) {
for (Int_t i = 4096; i > 0; i--) {
initData[4096 - i] = i;
}
lut->InitTable(12, 12, initData, kTRUE);
}
delete [] initData;
AliTRDptrgParam::AliTRDptrgPTmasks* masks =
new AliTRDptrgParam::AliTRDptrgPTmasks();
masks->fLUTs[0] = kTRUE;
masks->fLUTs[1] = kTRUE;
masks->fLUTs[2] = kTRUE;
this->fPTmasks = masks;
}
return false;
}
Int_t* AliTRDptrgCBB::Simulate()
{
Int_t nLUTs = this->fLUTArray.GetEntries();
Int_t inputVector = 0x0;
Int_t** partResults = 0x0;
partResults = new Int_t* [3];
partResults[0] = this->fCBA->Simulate();
partResults[1] = this->fCBC->Simulate();
partResults[2] = this->fTLMU->Simulate();
Int_t mask = 0x1;
for (Int_t i = 0; i < 3 ; i++) {
for (Int_t j = 1; j <= partResults[i][0]; j++) {
if (partResults[i][j] > 0) {
inputVector |= mask;
}
mask <<= 1;
}
}
AliDebug(5, Form("Inputvectors: 0x%x", inputVector));
Int_t* result = new Int_t[nLUTs + 2];
result[0] = nLUTs + 1;
for (Int_t iLUT = 0; iLUT < nLUTs; iLUT++) {
AliTRDptrgLUT *lutTmp = dynamic_cast<AliTRDptrgLUT*>(this->fLUTArray[iLUT]);
if (lutTmp) {
result[iLUT + 1] = lutTmp->LookUp(inputVector);
}
AliDebug(4, Form("CBB result[%d] = 0x%x\n",(iLUT + 1),result[iLUT + 1]));
}
result[nLUTs + 1] = 0;
for (Int_t i = 0; i < 2; i++) {
if (this->fPTmasks->fCBA[i] && partResults[0][i + 1]) {
result[nLUTs + 1]++;
}
if (this->fPTmasks->fCBC[i] && partResults[1][i + 1]) {
result[nLUTs + 1]++;
}
if (this->fPTmasks->fLUTs[i] && result[i + 1]) {
result[nLUTs + 1]++;
}
}
if (this->fPTmasks->fLUTs[2] && result[3]) {
result[nLUTs + 1]++;
}
for (Int_t i = 0; i < 8; i++) {
if (this->fPTmasks->fTLMU[i] && partResults[2][i + 1]) {
result[nLUTs + 1]++;
}
}
AliDebug(4, Form("CBB TRD Wake up result = %d", result[nLUTs + 1]));
delete [] partResults;
return result;
}
Bool_t AliTRDptrgCBB::GetPT() {
Int_t* LUTresults = this->Simulate();
if (LUTresults[(LUTresults[0] - 1)]) {
delete[] LUTresults;
return kTRUE;
}
else {
delete[] LUTresults;
return kFALSE;
}
}