#include <cstdlib>
#include "AliMpDDLStore.h"
#include "AliMpExMapIterator.h"
#include "AliMpConstants.h"
#include "AliMpDEStore.h"
#include "AliMpFrtCrocusConstants.h"
#include "AliMpDDL.h"
#include "AliMpFiles.h"
#include "AliMpDataStreams.h"
#include "AliMpHelper.h"
#include "AliMpDEManager.h"
#include "AliMpManuStore.h"
#include "AliMpDetElement.h"
#include "AliMpBusPatch.h"
#include "AliMpTriggerCrate.h"
#include "AliMpLocalBoard.h"
#include "AliMpSegmentation.h"
#include "AliMpVSegmentation.h"
#include "AliMpStringObjMap.h"
#include "AliMpEncodePair.h"
#include "AliMpIntPair.h"
#include "AliLog.h"
#include <Riostream.h>
#include <TList.h>
#include <TObjArray.h>
#include <TString.h>
#include <TObjString.h>
#include <TClass.h>
ClassImp(AliMpDDLStore)
AliMpDDLStore* AliMpDDLStore::fgInstance = 0;
const Int_t AliMpDDLStore::fgkNofDDLs = 20;
const Int_t AliMpDDLStore::fgkNofTriggerDDLs = 2;
const TString& AliMpDDLStore::GetRevertKeyword()
{
static const TString kRevertKeyword = "REVERT";
return kRevertKeyword;
}
const TString& AliMpDDLStore::GetExplicitKeyword()
{
static const TString kExplicitKeyword = "EXPLICIT";
return kExplicitKeyword;
}
AliMpDDLStore* AliMpDDLStore::Instance(Bool_t warn)
{
if ( ! fgInstance && warn ) {
AliWarningClass("DDL Store has not been loaded");
}
return fgInstance;
}
AliMpDDLStore* AliMpDDLStore::ReadData(const AliMpDataStreams& dataStreams,
Bool_t warn)
{
if ( fgInstance ) {
if ( warn )
AliWarningClass("DDL Store has been already loaded");
return fgInstance;
}
if ( dataStreams.GetReadFromFiles() )
AliInfoClass("Reading DDL Store from ASCII files.");
fgInstance = new AliMpDDLStore(dataStreams);
return fgInstance;
}
AliMpDDLStore::AliMpDDLStore(const AliMpDataStreams& dataStreams)
: TObject(),
fDDLs(fgkNofDDLs+fgkNofTriggerDDLs),
fBusPatches(),
fManuList12(),
fManuBridge2(),
fRegionalTrigger()
{
AliDebug(1,"");
fDDLs.SetOwner(true);
fBusPatches.SetOwner(true);
fBusPatches.SetSize(900);
if ( ! AliMpSegmentation::Instance(false) )
AliMpSegmentation::ReadData(dataStreams, true);
ReadDDLs(dataStreams);
ReadTrigger(dataStreams);
SetTriggerDDLs();
SetManus();
ReadBusPatchSpecial(dataStreams);
SetPatchModules();
ReadBusPatchInfo(dataStreams);
}
AliMpDDLStore::AliMpDDLStore(TRootIOCtor* ioCtor)
: TObject(),
fDDLs(),
fBusPatches(ioCtor),
fRegionalTrigger(ioCtor)
{
AliDebug(1,"");
fgInstance = this;
}
AliMpDDLStore::~AliMpDDLStore()
{
AliDebug(1,"");
fgInstance = 0;
}
Int_t AliMpDDLStore::GetManuListIndex(Int_t detElemId) const
{
return AliMpDEManager::GetChamberId(detElemId)*4 + (detElemId % 100);
}
Int_t AliMpDDLStore::GetBusPatchIndex(Int_t detElemId, Int_t manuId) const
{
Int_t pos = 0;
AliMp::StationType stationType = AliMpDEManager::GetStationType(detElemId);
static Int_t manuMask = AliMpConstants::ManuMask(AliMp::kNonBendingPlane) - 1;
if( stationType == AliMp::kStation345) {
pos = (manuId & manuMask)/100;
} else {
Int_t idx = GetManuListIndex(detElemId);
for (pos = fManuList12[idx].GetSize()-1; pos >= 0; --pos)
if ( manuId >= fManuList12[idx].At(pos))
break;
}
return pos;
}
Bool_t AliMpDDLStore::ReadDDLs(const AliMpDataStreams& dataStreams)
{
istream& in
= dataStreams.
CreateDataStream(AliMpFiles::BusPatchFilePath());
char line[255];
while ( in.getline(line,255) ) {
if ( line[0] == '#' )
continue;
TString tmp(AliMpHelper::Normalize(line));
TObjArray* stringList = tmp.Tokenize(TString(" "));
TString sDE = ((TObjString*)stringList->At(0))->GetString();
Int_t idDE = atoi(sDE.Data());
if ( ! AliMpDEManager::IsValidDetElemId(idDE, false) ) {
AliErrorStream() << "DetElemId "<< idDE << " not valid." << endl;
delete stringList;
return false;
}
TString busPatch = ((TObjString*)stringList->At(1))->GetString();
TString sDDL = ((TObjString*)stringList->At(2))->GetString();
Int_t iDDL = atoi(sDDL.Data());
if ( iDDL < 0 || iDDL >= fgkNofDDLs ) {
AliErrorStream() << "DDL id "<< iDDL << " outside limits." << endl;
delete stringList;
return false;
}
AliDebugStream(3)
<< "idDE " << idDE << " buspatch " << busPatch.Data() << " iDDL " << iDDL
<< endl;
if(AliMpDEManager::GetStationType(idDE) != AliMp::kStation345) {
TString sManu = ((TObjString*)stringList->At(3))->GetString();
AliMpHelper::DecodeName(sManu,',',fManuList12[GetManuListIndex(idDE)]);
if(AliMpDEManager::GetStation12Type(idDE) == AliMq::kStation2) {
TString sManuBridge = ((TObjString*)stringList->At(4))->GetString();
AliMpHelper::DecodeName(sManuBridge,',',fManuBridge2[GetManuListIndex(idDE)]);
}
}
delete stringList;
AliMpDDL* ddl = GetDDL(iDDL, false);
if ( !ddl) {
ddl = new AliMpDDL(iDDL);
fDDLs.AddAt(ddl, iDDL);
}
ddl->AddDE(idDE);
TArrayI busPatchList;
AliMpHelper::DecodeName(busPatch,';',busPatchList);
AliMpDetElement* de = AliMpDEManager::GetDetElement(idDE);
de->SetDdlId(iDDL);
for (Int_t i = 0; i < busPatchList.GetSize(); i++) {
fBusPatches.Add(busPatchList[i],
new AliMpBusPatch(busPatchList[i], idDE, iDDL));
de->AddBusPatch(busPatchList[i]);
}
}
for ( Int_t i=0; i<fDDLs.GetEntriesFast(); i++ ) {
AliMpDDL* ddl = (AliMpDDL*) fDDLs.At(i);
ddl->FillBusPatchIds();
}
delete ∈
return true;
}
Bool_t AliMpDDLStore::ReadTrigger(const AliMpDataStreams& dataStreams)
{
if ( ! fRegionalTrigger.ReadData(dataStreams) ) return false;
return true;
}
Bool_t
AliMpDDLStore::SetTriggerDDLs()
{
Int_t iDDL = -1;
TIter next(fRegionalTrigger.CreateCrateIterator());
AliMpTriggerCrate* crate;
while ( ( crate = static_cast<AliMpTriggerCrate*>(next()) ) )
{
TString crateName = crate->GetName();
if (crateName.Contains("R"))
iDDL = fgkNofDDLs;
else
iDDL = fgkNofDDLs + 1;
AliMpDDL* ddl = (AliMpDDL*)fDDLs.At(iDDL);
if ( !ddl) {
ddl = new AliMpDDL(iDDL);
fDDLs.AddAt(ddl, iDDL);
}
crate->SetDdlId(iDDL);
if ( !ddl->HasTriggerCrateId(crate->GetId()) )
ddl->AddTriggerCrate(crate->GetId());
for ( Int_t j=0; j<crate->GetNofLocalBoards(); ++j )
{
Int_t localBoardId = crate->GetLocalBoardId(j);
AliMpLocalBoard* localBoard
= fRegionalTrigger.FindLocalBoard(localBoardId);
if (!localBoard ) {
AliFatalClass("Cannot find local board.");
return kFALSE;
}
for ( Int_t k=0; k<localBoard->GetNofDEs(); ++k )
{
Int_t deId = localBoard->GetDEId(k);
AliMpDetElement* de = AliMpDEManager::GetDetElement(deId);
if ( de->GetDdlId() == -1 ) de->SetDdlId(iDDL);
if ( ! ddl->HasDEId(deId) ) ddl->AddDE(deId);
}
}
}
return kTRUE;
}
Bool_t AliMpDDLStore::SetManus()
{
Int_t manuMask = AliMpConstants::ManuMask(AliMp::kNonBendingPlane) - 1;
for (Int_t iDDL = 0; iDDL < fgkNofDDLs; ++iDDL) {
AliDebug(3, Form("DDL # %d\n", iDDL));
AliMpDDL* ddl = GetDDL(iDDL);
for (Int_t detElemIdx = 0; detElemIdx < ddl->GetNofDEs(); ++detElemIdx) {
Int_t detElemId = ddl->GetDEId(detElemIdx);
AliMpDetElement* detElement = GetDetElement(detElemId);
AliMp::StationType stationType = AliMpDEManager::GetStationType(detElemId);
TList manuList;
for ( Int_t cath = 0; cath < 2 ; ++cath ) {
const AliMpVSegmentation* seg
= AliMpSegmentation::Instance()->GetMpSegmentation(detElemId,AliMp::GetCathodType(cath));
AliMp::PlaneType planeType = detElement->GetPlaneType(AliMp::GetCathodType(cath));
TArrayI manus;
seg->GetAllElectronicCardIDs(manus);
for ( Int_t im = 0; im < manus.GetSize(); ++im ) {
AliMpIntPair* manu = 0x0;
if( stationType == AliMp::kStation345)
manu = new AliMpIntPair((manus[im] & manuMask), planeType, kTRUE);
else
manu = new AliMpIntPair(manus[im], planeType, kTRUE);
manuList.Add(manu);
detElement->AddManu(manus[im]);
}
}
manuList.Sort();
for (Int_t iEntry = 0; iEntry < manuList.GetEntries(); ++iEntry) {
AliMpIntPair* manuPtr = (AliMpIntPair*)manuList.At(iEntry);
Int_t manuId = manuPtr->GetFirst();
Int_t pos = GetBusPatchIndex(detElemId, manuId);
if (pos > detElement->GetNofBusPatches()) {
AliError(Form("pos greater %d than size %d manuId %d detElemId %d \n",
pos, detElement->GetNofBusPatches(), manuId, detElemId));
return false;
}
Int_t busPatchId = detElement->GetBusPatchId(pos);
AliMpBusPatch* busPatch = GetBusPatch(busPatchId);
if( stationType == AliMp::kStation345) {
if (manuPtr->GetSecond())
busPatch->AddManu(manuId+manuMask+1);
else
busPatch->AddManu(manuId);
} else {
busPatch->AddManu(manuId);
}
}
manuList.Delete();
if (AliDebugLevel() == 3) {
for(Int_t pos = 0; pos < detElement->GetNofBusPatches(); ++pos) {
Int_t busPatchId = detElement->GetBusPatchId(pos);
AliMpBusPatch* busPatch = GetBusPatch(busPatchId);
printf("BusPatch: %d\n", busPatch->GetId());
for (Int_t iEntry = 0; iEntry < busPatch->GetNofManus(); ++iEntry)
printf("manu Id: %d\n", busPatch->GetManuId(iEntry));
}
}
}
}
return true;
}
Bool_t AliMpDDLStore::ReadBusPatchSpecial(const AliMpDataStreams& dataStreams)
{
istream& in
= dataStreams.
CreateDataStream(AliMpFiles::BusPatchSpecialFilePath());
char line[255];
while ( in.getline(line,255) ) {
if ( line[0] == '#' ) continue;
TString tmp(AliMpHelper::Normalize(line));
TObjArray* stringList = tmp.Tokenize(TString(" "));
TString sKey = ((TObjString*)stringList->At(0))->GetString();
TString sDDL = ((TObjString*)stringList->At(1))->GetString();
TArrayI ddlList;
AliMpHelper::DecodeName(sDDL,';',ddlList);
TString sBusPatch = ((TObjString*)stringList->At(2))->GetString();
TArrayI busPatchList;
AliMpHelper::DecodeName(sBusPatch,',',busPatchList);
for (Int_t iDDL = 0; iDDL < ddlList.GetSize(); ++iDDL ) {
for (Int_t iBusPatch = 0; iBusPatch < busPatchList.GetSize(); ++iBusPatch) {
Int_t busPatchID
= AliMpBusPatch::GetGlobalBusID(
busPatchList.At(iBusPatch), ddlList.At(iDDL));
AliMpBusPatch* busPatch = GetBusPatch(busPatchID);
if ( ! busPatch ) {
AliErrorStream() << "Bus patch " << busPatchID << " does not exist." << endl;
delete stringList;
return kFALSE;
}
if ( sKey == GetRevertKeyword() ) {
AliDebugStream(3)
<< "Reverting readout of bus patch " << busPatchID << endl;
busPatch->RevertReadout();
}
else if ( sKey == GetExplicitKeyword() ) {
busPatch->ResetReadout();
TString sManus = ((TObjString*)stringList->At(3))->GetString();
TArrayI manuList;
AliMpHelper::DecodeName(sManus,',',manuList);
AliDebugStream(3)
<< "Reseting readout of bus patch " << busPatchID
<< " manus: " << sManus.Data() << endl;
for (Int_t i = 0; i < manuList.GetSize(); i++) {
busPatch->AddManu(manuList.At(i));
}
}
else {
AliErrorStream() << "Unrecognized key." << endl;
delete stringList;
return kFALSE;
}
}
}
delete stringList;
}
delete ∈
return kTRUE;
}
Bool_t AliMpDDLStore::SetPatchModules()
{
AliMpDEIterator it;
Bool_t result = true;
for ( it.First(); !it.IsDone(); it.Next() ) {
AliMpDetElement* detElement = it.CurrentDE();
for (Int_t i = 0; i < detElement->GetNofBusPatches(); ++i) {
AliMpBusPatch* busPatch = GetBusPatch(detElement->GetBusPatchId(i));
Bool_t newResult = false;
Int_t idDE = busPatch->GetDEId();
if (AliMpDEManager::GetStation12Type(idDE) == AliMq::kStation2 )
newResult = busPatch->SetNofManusPerModule(fManuBridge2[GetManuListIndex(idDE)].At(i));
else
newResult = busPatch->SetNofManusPerModule();
result = result && newResult;
}
}
return result;
}
Bool_t AliMpDDLStore::ReadBusPatchInfo(const AliMpDataStreams& dataStreams)
{
istream& in
= dataStreams.
CreateDataStream(AliMpFiles::BusPatchInfoFilePath());
char line[255];
for (Int_t iDDL = 0; iDDL < fgkNofDDLs; ++iDDL ) {
AliMpDDL* ddl = GetDDL(iDDL);
for (Int_t iBusPatch = 0; iBusPatch < ddl->GetNofBusPatches(); ++iBusPatch) {
do {
if (!in.getline(line,255)) {
AliWarning(Form("Wrong size in bus patch length file; index %d DDL %d",
iBusPatch, iDDL));
return false;
}
} while(line[0] == '#');
TString tmp(AliMpHelper::Normalize(line));
TObjArray* stringList = tmp.Tokenize(TString(" "));
TString crLabel = ((TObjString*)stringList->At(0))->GetString();
Int_t pos = crLabel.First('-');
tmp = crLabel(pos-2, crLabel.Length()-pos+2);
TArrayI list;
AliMpHelper::DecodeName(tmp.Data(), '-', list);
Int_t localDDLId = list[0];
Int_t frtId = list[1] - 1;
Int_t localBusId = list[2];
if ( !ddl->HasFrtId(frtId) )
ddl->AddFrt(frtId);
TString label = ((TObjString*)stringList->At(1))->GetString();
TString transLabel = ((TObjString*)stringList->At(2))->GetString();
TString sLength = ((TObjString*)stringList->At(3))->GetString();
Float_t length = sLength.Atof();
delete stringList;
if (localBusId != iBusPatch + 1)
AliWarning(Form("Wrong local buspatch id %d instead of %d", iBusPatch+1, localBusId));
if(localDDLId != ddl->GetId()+1)
AliWarning(Form("Wrong local DDL id %d instead of %d", ddl->GetId()+1, localDDLId));
Int_t busPatchId = ddl->GetBusPatchId(iBusPatch);
AliMpBusPatch* busPatch = GetBusPatch(busPatchId);
busPatch->SetCableLength(length);
busPatch->SetCableLabel(label);
busPatch->SetTranslatorLabel(transLabel);
busPatch->SetFrtId(frtId);
}
}
delete ∈
return true;
}
Int_t AliMpDDLStore::GetLocalBoardId(TString name) const {
TIter next(fRegionalTrigger.CreateLocalBoardIterator());
AliMpLocalBoard* local;
while ( ( local = static_cast<AliMpLocalBoard*>(next()) ) )
{
TString tmp(&local->GetName()[4], 2);
if (name.Contains(tmp))
if (name[0] == local->GetName()[0])
return local->GetId();
}
return 0;
}
AliMpDDL* AliMpDDLStore::GetDDL(Int_t ddlId, Bool_t warn) const {
AliMpDDL* ddl
= (AliMpDDL*)fDDLs.At(ddlId);
if ( ! ddl && warn ) {
AliErrorStream()
<< "DDL with Id = " << ddlId << " not defined." << endl;
}
return ddl;
}
AliMpDetElement* AliMpDDLStore::GetDetElement(Int_t detElemId, Bool_t warn) const {
if ( ! AliMpDEStore::Instance() ) {
AliFatal("DE Store has not been loaded.");
return 0;
}
return AliMpDEStore::Instance()->GetDetElement(detElemId, warn);
}
AliMpBusPatch* AliMpDDLStore::GetBusPatch(Int_t busPatchId, Bool_t warn) const {
AliMpBusPatch* busPatch
= (AliMpBusPatch*) fBusPatches.GetValue(busPatchId);
if ( ! busPatch && warn ) {
AliErrorStream()
<< "Bus patch with Id = " << busPatchId << " not defined." << endl;
}
return busPatch;
}
AliMpLocalBoard* AliMpDDLStore::GetLocalBoard(Int_t localBoardId, Bool_t warn) const {
return fRegionalTrigger.FindLocalBoard(localBoardId, warn);
}
AliMpTriggerCrate* AliMpDDLStore::GetTriggerCrate(TString name, Bool_t warn) const {
return fRegionalTrigger.FindTriggerCrate(name, warn);
}
AliMpTriggerCrate* AliMpDDLStore::GetTriggerCrate(Int_t ddlId, Int_t index, Bool_t warn) const {
if (ddlId == 0 || ddlId == 1)
ddlId += fgkNofDDLs;
AliMpDDL* ddl = GetDDL(ddlId, warn);
if ( ! ddl )
return 0;
if ( index >= ddl->GetNofTriggerCrates() ) {
AliError(Form("crate id %d greater than array[%d]", index, ddl->GetNofTriggerCrates()));
return 0;
}
TString name = AliMpTriggerCrate::GenerateName(index, ddlId, fgkNofDDLs);
return GetTriggerCrate(name, warn);
}
Int_t AliMpDDLStore::GetDEfromBus(Int_t busPatchId) const {
AliMpBusPatch* busPatch = GetBusPatch(busPatchId);
if ( ! busPatch ) {
AliErrorStream()
<< "Bus patch with Id = " << busPatchId << " not defined." << endl;
return 0;
}
return busPatch->GetDEId();
}
Int_t AliMpDDLStore::GetDEfromLocalBoard(Int_t localBoardId, Int_t chamberId) const {
AliMpLocalBoard* localBoard = GetLocalBoard(localBoardId);
if ( ! localBoard ) {
AliErrorStream()
<< "Loacl board with Id = " << localBoardId << " not defined." << endl;
return 0;
}
return localBoard->GetDEIdByChamber(chamberId);
}
Int_t AliMpDDLStore::GetDDLfromBus(Int_t busPatchId) const {
AliMpBusPatch* busPatch = GetBusPatch(busPatchId);
if ( ! busPatch ) {
AliErrorStream()
<< "Bus patch with Id = " << busPatchId << " not defined." << endl;
return 0;
}
return busPatch->GetDdlId();
}
Int_t AliMpDDLStore::GetBusPatchId(Int_t detElemId, Int_t manuId) const {
AliMpDetElement* detElement = GetDetElement(detElemId);
Int_t pos = GetBusPatchIndex(detElemId, manuId);
if ( pos >= detElement->GetNofBusPatches() )
{
AliErrorStream()
<< "Pos = " << pos
<< " greater than the size = " << detElement->GetNofBusPatches()
<< " for detElemId = " << detElemId
<< " manuId = " << manuId << endl;
return -1;
}
return detElement->GetBusPatchId(pos);
}
Long_t AliMpDDLStore::GetLinkPortId(Int_t busPatchId) const {
AliMpBusPatch* busPatch = GetBusPatch(busPatchId);
Int_t ddlId = busPatch->GetDdlId();
Int_t localBusPatchId = AliMpBusPatch::GetLocalBusID(busPatchId, ddlId) - 1;
Int_t pos = (localBusPatchId % AliMpFrtCrocusConstants::GetNofBusPatches());
return AliMpFrtCrocusConstants::GetLinkPortId(pos);
}
void AliMpDDLStore::PrintAllManu() const {
AliMpDEIterator it;
for ( it.First(); ! it.IsDone(); it.Next() ) {
AliMpDetElement* de = it.CurrentDE();
cout << "DE: " << de->GetId() << endl;
for ( Int_t i=0; i< de->GetNofBusPatches(); ++i ) {
AliMpBusPatch* busPatch = GetBusPatch(de->GetBusPatchId(i));
cout << " busPatch: " << busPatch->GetId() << endl;
cout << " Manu : ";
for ( Int_t j=0; j<busPatch->GetNofManus(); ++j ) {
cout << std::setw(6) << busPatch->GetManuId(j) << " ";
}
cout << endl;
if ( AliMpManuStore::Instance(kFALSE) ) {
cout << " Manu serial: ";
for ( Int_t k=0; k<busPatch->GetNofManus(); ++k ) {
cout << std::setw(6)
<< AliMpManuStore::Instance()
->GetManuSerial(de->GetId(), busPatch->GetManuId(k)) << " ";
}
cout << endl;
}
}
}
}
Int_t AliMpDDLStore::GetNextDEfromLocalBoard(Int_t localBoardId, Int_t chamberId ) const {
AliMpLocalBoard* localBoard = GetLocalBoard(localBoardId);
TString name(localBoard->GetName());
Int_t line = AliMp::PairFirst(localBoard->GetPosition());
++line;
name.Replace(4,1,Form("%d", line));
Int_t nextLocalId;
if ((nextLocalId = GetLocalBoardId(name)))
return GetDEfromLocalBoard(nextLocalId, chamberId);
else
return 0;
return 0;
}
Int_t AliMpDDLStore::GetPreviousDEfromLocalBoard(Int_t localBoardId, Int_t chamberId) const {
AliMpLocalBoard* localBoard = GetLocalBoard(localBoardId);
TString name(localBoard->GetName());
Int_t line = AliMp::PairFirst(localBoard->GetPosition());
--line;
name.Replace(4,1,Form("%d", line));
Int_t prevLocalId;
if ((prevLocalId = GetLocalBoardId(name)))
return GetDEfromLocalBoard(prevLocalId, chamberId);
else
return 0;
}
void AliMpDDLStore::SetRegionalTrigger(const AliMpRegionalTrigger& regionalTrigger)
{
fRegionalTrigger = regionalTrigger;
fDDLs.RemoveAt(fgkNofDDLs+1);
fDDLs.RemoveAt(fgkNofDDLs);
SetTriggerDDLs();
}
TIterator*
AliMpDDLStore::CreateBusPatchIterator() const
{
return fBusPatches.CreateIterator();
}