#include <TSystem.h>
#include "AliTOFFEEReader.h"
#include "AliTOFFEEConfig.h"
#include "AliTOFFEElightConfig.h"
#include "AliTOFRawStream.h"
#include "AliTOFGeometry.h"
#include "AliTOFcalibHisto.h"
#include "AliLog.h"
#include <fstream>
ClassImp(AliTOFFEEReader)
AliTOFFEEReader::AliTOFFEEReader() :
TObject(),
fFEEConfig(new AliTOFFEEConfig()),
fFEElightConfig(new AliTOFFEElightConfig()),
fChannelEnabled(),
fMatchingWindow(),
fLatencyWindow()
{
Reset();
}
AliTOFFEEReader::AliTOFFEEReader(const AliTOFFEEReader &source) :
TObject(source),
fFEEConfig(new AliTOFFEEConfig()),
fFEElightConfig(new AliTOFFEElightConfig())
{
Reset();
memcpy(fFEEConfig, source.fFEEConfig, sizeof(AliTOFFEEConfig));
memcpy(fFEElightConfig, source.fFEElightConfig, sizeof(AliTOFFEElightConfig));
}
AliTOFFEEReader &
AliTOFFEEReader::operator=(const AliTOFFEEReader &source)
{
TObject::operator=(source);
memcpy(fFEEConfig, source.fFEEConfig, sizeof(AliTOFFEEConfig));
memcpy(fFEElightConfig, source.fFEElightConfig, sizeof(AliTOFFEElightConfig));
return *this;
}
AliTOFFEEReader::~AliTOFFEEReader()
{
delete fFEEConfig;
delete fFEElightConfig;
}
void
AliTOFFEEReader::ResetChannelEnabledArray()
{
for (Int_t iIndex = 0; iIndex < GetNumberOfIndexes(); iIndex++)
fChannelEnabled[iIndex] = kFALSE;
}
void
AliTOFFEEReader::ResetTriggerMaskArray()
{
for (Int_t iddl = 0; iddl < GetNumberOfDDLs(); iddl++)
fTriggerMask[iddl] = 0x0;
}
void
AliTOFFEEReader::Reset()
{
for (Int_t iIndex = 0; iIndex < GetNumberOfIndexes(); iIndex++) {
fChannelEnabled[iIndex] = kFALSE;
fMatchingWindow[iIndex] = 0;
fLatencyWindow[iIndex] = 0;
}
for (Int_t iddl = 0; iddl < GetNumberOfDDLs(); iddl++)
fTriggerMask[iddl] = 0x0;
}
void
AliTOFFEEReader::LoadFEEConfig(const Char_t *FileName) const
{
Char_t *expandedFileName = gSystem->ExpandPathName(FileName);
std::ifstream is;
is.open(expandedFileName, std::ios::binary);
is.read((Char_t *)fFEEConfig, sizeof(AliTOFFEEConfig));
is.close();
}
void
AliTOFFEEReader::LoadFEElightConfig(const Char_t *FileName) const
{
Char_t *expandedFileName = gSystem->ExpandPathName(FileName);
std::ifstream is;
is.open(expandedFileName, std::ios::binary);
is.read((Char_t *)fFEElightConfig, sizeof(AliTOFFEElightConfig));
is.close();
}
Int_t
AliTOFFEEReader::ParseFEEConfig()
{
AliInfo("parsing TOF FEE config");
AliTOFRawStream rawStream;
Int_t nEnabled = 0;
Int_t volume[5], index;
Int_t temp;
Reset();
for (Int_t iDDL = 0; iDDL < GetNumberOfDDLs(); iDDL++)
for (Int_t iTRM = 0; iTRM < GetNumberOfTRMs(); iTRM++)
for (Int_t iChain = 0; iChain < GetNumberOfChains(); iChain++)
for (Int_t iTDC = 0; iTDC < GetNumberOfTDCs(); iTDC++)
for (Int_t iChannel = 0; iChannel < GetNumberOfChannels(); iChannel++)
if (IsChannelEnabled(iDDL, iTRM + 3, iChain, iTDC, iChannel)) {
rawStream.EquipmentId2VolumeId(iDDL, iTRM + 3, iChain, iTDC, iChannel, volume);
temp = volume[4]; volume[4] = volume[3]; volume[3] = temp;
if (volume[0] < 0 || volume[0] > 17 ||
volume[1] < 0 || volume[1] > 4 ||
volume[2] < 0 || volume[2] > 18 ||
volume[3] < 0 || volume[3] > 1 ||
volume[4] < 0 || volume[4] > 47)
continue;
index = AliTOFGeometry::GetIndex(volume);
if (index != -1 && index < GetNumberOfIndexes()) {
fChannelEnabled[index] = kTRUE;
fMatchingWindow[index] = GetMatchingWindow(iDDL, iTRM + 3, iChain, iTDC, iChannel);
nEnabled++;
}
}
return nEnabled;
}
Int_t
AliTOFFEEReader::ParseFEElightConfig()
{
AliInfo("parsing TOF FEElight config");
Reset();
AliTOFcalibHisto calibHisto;
calibHisto.LoadCalibHisto();
Int_t nEnabled = 0, index;
AliTOFFEEchannelConfig *channelConfig = NULL;
for (Int_t i = 0; i < GetNumberOfIndexesEO(); i++) {
channelConfig = fFEElightConfig->GetChannelConfig(i);
if (!channelConfig->IsEnabled()) continue;
index = (Int_t)calibHisto.GetCalibMap(AliTOFcalibHisto::kIndex, i);
if (index == -1) continue;
nEnabled++;
fChannelEnabled[index] = channelConfig->IsEnabled();
fMatchingWindow[index] = channelConfig->GetMatchingWindow();
fLatencyWindow[index] = channelConfig->GetLatencyWindow();
}
AliTOFFEEtriggerConfig *triggerConfig = NULL;
for (Int_t iddl = 0; iddl < GetNumberOfDDLs(); iddl++) {
triggerConfig = fFEElightConfig->GetTriggerConfig(iddl);
fTriggerMask[iddl] = triggerConfig->GetStatusMap();
}
return nEnabled;
}
Bool_t
AliTOFFEEReader::IsChannelEnabled(Int_t iDDL, Int_t iTRM, Int_t iChain, Int_t iTDC, Int_t iChannel) const
{
AliTOFFEEConfig *feeConfig;
AliTOFCrateConfig *crateConfig;
AliTOFTRMConfig *trmConfig;
Int_t maskPB, maskTDC, activeChip;
if (!(feeConfig = GetFEEConfig()))
return kFALSE;
if (!(crateConfig = feeConfig->GetCrateConfig(iDDL)))
return kFALSE;
if (!(trmConfig = crateConfig->GetTRMConfig(iTRM - 3)))
return kFALSE;
if (!crateConfig->IsDRMEnabled())
return kFALSE;
if (!crateConfig->IsTRMEnabled(iTRM - 3))
return kFALSE;
switch (iChain) {
case 0:
if (trmConfig->GetChainAFlag() != 1)
return kFALSE;
activeChip = trmConfig->GetActiveChipA();
switch (iTDC) {
case 0: case 1: case 2:
maskPB = trmConfig->GetMaskPB0();
break;
case 3: case 4: case 5:
maskPB = trmConfig->GetMaskPB1();
break;
case 6: case 7: case 8:
maskPB = trmConfig->GetMaskPB2();
break;
case 9: case 10: case 11:
maskPB = trmConfig->GetMaskPB3();
break;
case 12: case 13: case 14:
maskPB = trmConfig->GetMaskPB4();
break;
default:
return kFALSE;
break;
}
break;
case 1:
if (trmConfig->GetChainBFlag() != 1)
return kFALSE;
activeChip = trmConfig->GetActiveChipB();
switch (iTDC) {
case 0: case 1: case 2:
maskPB = trmConfig->GetMaskPB5();
break;
case 3: case 4: case 5:
maskPB = trmConfig->GetMaskPB6();
break;
case 6: case 7: case 8:
maskPB = trmConfig->GetMaskPB7();
break;
case 9: case 10: case 11:
maskPB = trmConfig->GetMaskPB8();
break;
case 12: case 13: case 14:
maskPB = trmConfig->GetMaskPB9();
break;
default:
return kFALSE;
break;
}
break;
default:
return kFALSE;
break;
}
if (!(activeChip & (0x1 << iTDC)))
return kFALSE;
maskTDC = (maskPB & (0xFF << ((iTDC % 3) * 8))) >> ((iTDC % 3) * 8);
if (maskTDC & (0x1 << iChannel))
return kTRUE;
else
return kFALSE;
}
Int_t
AliTOFFEEReader::GetMatchingWindow(Int_t iDDL, Int_t iTRM, Int_t, Int_t, Int_t) const
{
AliTOFFEEConfig *feeConfig;
AliTOFCrateConfig *crateConfig;
AliTOFTRMConfig *trmConfig;
if (!(feeConfig = GetFEEConfig()))
return 0;
if (!(crateConfig = feeConfig->GetCrateConfig(iDDL)))
return 0;
if (!(trmConfig = crateConfig->GetTRMConfig(iTRM - 3)))
return 0;
if (!crateConfig->IsDRMEnabled())
return 0;
if (!crateConfig->IsTRMEnabled(iTRM - 3))
return 0;
return trmConfig->GetMatchingWindow();
}
void
AliTOFFEEReader::DumpFEEConfig()
{
AliTOFFEEConfig *feeConfig = GetFEEConfig();
AliTOFCrateConfig *crateConfig;
AliTOFDRMConfig *drmConfig;
AliTOFLTMConfig *ltmConfig;
AliTOFTRMConfig *trmConfig;
AliInfo("-------------------------------------");
AliInfo("dumping TOF FEE config");
AliInfo("-------------------------------------");
AliInfo(Form("version: %d", feeConfig->GetVersion()));
AliInfo(Form("dump time: %d", (Int_t)feeConfig->GetDumpTime()));
AliInfo(Form("run number: %d", feeConfig->GetRunNumber()));
AliInfo(Form("run type: %d", feeConfig->GetRunType()));
AliInfo("-------------------------------------");
for (Int_t iCrate = 0; iCrate < AliTOFFEEConfig::GetNumberOfCrates(); iCrate++) {
crateConfig = feeConfig->GetCrateConfig(iCrate);
if (!crateConfig)
continue;
if (!crateConfig->IsDRMEnabled())
continue;
AliInfo(Form("crate id: %02d", iCrate));
drmConfig = crateConfig->GetDRMConfig();
AliInfo(Form("DRM is enabled: drmId=%d, slotMask=%03x", drmConfig->GetDRMId(), drmConfig->GetSlotMask()));
if (crateConfig->IsLTMEnabled()) {
ltmConfig = crateConfig->GetLTMConfig();
AliInfo(Form("LTM is enabled: threshold=%d", ltmConfig->GetThreshold()));
}
if (crateConfig->IsCPDMEnabled()) {
AliInfo(Form("CPDM is enabled"));
}
for (Int_t iTRM = 0; iTRM < AliTOFCrateConfig::GetNumberOfTRMs(); iTRM++) {
trmConfig = crateConfig->GetTRMConfig(iTRM);
if (!trmConfig)
continue;
if (!crateConfig->IsTRMEnabled(iTRM))
continue;
AliInfo(Form("TRM%02d is enabled: matchWin=%d, latWin=%d, packFlag=%d", iTRM + 3, trmConfig->GetMatchingWindow(), trmConfig->GetLatencyWindow(), trmConfig->GetPackingFlag()));
if (trmConfig->GetChainAFlag() == 1) {
AliInfo(Form("TRM%02d chainA is enabled: activeChip=%04X, PB0=%06X, PB1=%06X, PB2=%06X, PB3=%06X, PB4=%06X", iTRM + 3, trmConfig->GetActiveChipA(), trmConfig->GetMaskPB0(), trmConfig->GetMaskPB1(), trmConfig->GetMaskPB2(), trmConfig->GetMaskPB3(), trmConfig->GetMaskPB4()));
}
if (trmConfig->GetChainBFlag() == 1) {
AliInfo(Form("TRM%02d chainB is enabled: activeChip=%04X, PB5=%06X, PB6=%06X, PB7=%06X, PB8=%06X, PB9=%06X", iTRM + 3, trmConfig->GetActiveChipB(), trmConfig->GetMaskPB5(), trmConfig->GetMaskPB6(), trmConfig->GetMaskPB7(), trmConfig->GetMaskPB8(), trmConfig->GetMaskPB9()));
}
}
AliInfo("-------------------------------------");
}
}
void
AliTOFFEEReader::CreateFEElightConfig(const Char_t *filename)
{
AliTOFFEElightConfig lightConfig;
for (Int_t i = 0; i < GetNumberOfIndexes(); i++) {
if (fChannelEnabled[i]) {
lightConfig.GetChannelConfig(i)->SetStatus(AliTOFFEEchannelConfig::kStatusEnabled);
lightConfig.GetChannelConfig(i)->SetMatchingWindow(fMatchingWindow[i]);
lightConfig.GetChannelConfig(i)->SetLatencyWindow(fLatencyWindow[i]);
}
else {
lightConfig.GetChannelConfig(i)->SetStatus(0x0);
lightConfig.GetChannelConfig(i)->SetMatchingWindow(0);
lightConfig.GetChannelConfig(i)->SetLatencyWindow(0);
}
}
Char_t *expandedFileName = gSystem->ExpandPathName(filename);
std::ofstream os;
os.open(expandedFileName, std::ios::binary);
os.write((Char_t *)&lightConfig, sizeof(AliTOFFEElightConfig));
os.close();
}