// $Id$
#include "AliMUONTriggerCrateStore.h"
-
+#include "AliMpExMapIterator.h"
#include "AliMUONTriggerCrate.h"
#include "AliMUONLocalTriggerBoard.h"
#include "AliMUONRegionalTriggerBoard.h"
+#include "AliMUONRegionalTriggerConfig.h"
+#include "AliMUONGlobalCrateConfig.h"
+#include "AliMUONTriggerCrateConfig.h"
+#include "AliMUONCalibrationData.h"
+#include "AliMUONTriggerLut.h"
+
+#include "AliMpTriggerCrate.h"
+#include "AliMpLocalBoard.h"
+#include "AliMpDDLStore.h"
#include "AliMpExMap.h"
-#include "TString.h"
-#include "TSystem.h"
#include "AliLog.h"
-#include "Riostream.h"
-///
+#include <TString.h>
+#include <TSystem.h>
+#include <Riostream.h>
+
+#include <cstdio>
+
+//-----------------------------------------------------------------------------
/// \class AliMUONTriggerCrateStore
///
/// A container of trigger crate objects that offers iteration
/// over both the crates themselves and the local boards they contain
///
/// \author Laurent Aphecetche
+//-----------------------------------------------------------------------------
/// \cond CLASSIMP
ClassImp(AliMUONTriggerCrateStore)
AliMUONTriggerCrateStore::AliMUONTriggerCrateStore()
: TObject(),
fCrates(0x0),
-fLocalBoards(0x0),
-fCrateIterator(0x0),
-fLBIterator(0x0),
-fCurrentCrate(0x0),
-fCurrentLocalBoard(-1)
+fLocalBoards(0x0)
{
/// Default constructor
}
AliMUONTriggerCrateStore::~AliMUONTriggerCrateStore()
{
/// Destructor
- delete fCrateIterator;
- delete fLBIterator;
delete fCrates;
delete fLocalBoards;
}
return static_cast<AliMUONLocalTriggerBoard*>(fLocalBoards->GetValue(boardNumber));
}
+//_____________________________________________________________________________
+TIterator*
+AliMUONTriggerCrateStore::CreateCrateIterator() const
+{
+ /// Create iterator over crates
+
+ return fCrates ? fCrates->CreateIterator() : 0x0;
+}
+
+//_____________________________________________________________________________
+TIterator*
+AliMUONTriggerCrateStore::CreateLocalBoardIterator() const
+{
+ /// Create iterator over local boards
+
+ return fLocalBoards ? fLocalBoards->CreateIterator() : 0x0;
+}
+
//_____________________________________________________________________________
AliMUONTriggerCrate*
AliMUONTriggerCrateStore::Crate(const char *name) const
return static_cast<AliMUONTriggerCrate*>(fCrates->GetValue(name));
}
+// to be removed once AliMUONDigitMaker is linked with new mapping
//_____________________________________________________________________________
AliMUONTriggerCrate*
AliMUONTriggerCrateStore::Crate(Int_t ddl, Int_t reg) const
TString name = GetCrateName(ddl, reg);
return static_cast<AliMUONTriggerCrate*>(fCrates->GetValue(name.Data()));
}
-// //____________________________________________________________________
+//____________________________________________________________________
TString AliMUONTriggerCrateStore::GetCrateName(Int_t ddl, Int_t reg) const
{
- // set crate name from DDL & reg number
+ /// set crate name from DDL & reg number
Char_t name[10];
switch(reg) {
case 0:
case 1:
- sprintf(name,"%d", reg+1);
+ snprintf(name,10,"%d", reg+1);
break;
case 2:
strcpy(name, "2-3");
case 5:
case 6:
case 7:
- sprintf(name,"%d", reg);
+ snprintf(name,10,"%d", reg);
break;
}
// crate Right for first DDL
if (ddl == 0)
- strcat(name, "R");
+ strncat(name, "R", 1);
else
- strcat(name, "L");
+ strncat(name, "L", 1);
return TString(name);
}
-//_____________________________________________________________________________
-void
-AliMUONTriggerCrateStore::FirstCrate()
-{
- /// initialize iteration
- if ( !fCrates )
- {
- AliError("Object not properly initialized");
- return;
- }
- if (!fCrateIterator)
- {
- fCrateIterator = new TExMapIter(fCrates->GetIterator());
- }
- fCrateIterator->Reset();
-}
-
-//_____________________________________________________________________________
-void
-AliMUONTriggerCrateStore::FirstLocalBoard()
-{
- /// Initialize iterator on local boards.
- /// Please note that we're not using directly the FirstCrate() and
- /// NextCrate() methods here to avoid mix and match between crate iterator
- /// and local board iterator
- fCurrentCrate = 0x0;
- fCurrentLocalBoard = 0;
-
- if ( !fLBIterator )
- {
- fLBIterator = new TExMapIter(fCrates->GetIterator());
- }
- fLBIterator->Reset();
- Long_t key, value;
- Bool_t ok = fLBIterator->Next(key,value);
- if ( ok )
- {
- fCurrentCrate = reinterpret_cast<AliMUONTriggerCrate*>(value);
- fCurrentLocalBoard = 1;
- }
-}
-
-//_____________________________________________________________________________
-AliMUONTriggerCrate*
-AliMUONTriggerCrateStore::NextCrate()
-{
- /// Return the next crate in iteration, or 0 if iteration is ended.
- if (!fCrateIterator) return 0x0;
-
- Long_t key, value;
- Bool_t ok = fCrateIterator->Next(key,value);
- if (ok)
- {
- return reinterpret_cast<AliMUONTriggerCrate*>(value);
- }
- else
- {
- return 0x0;
- }
-}
-
-//_____________________________________________________________________________
-AliMUONLocalTriggerBoard*
-AliMUONTriggerCrateStore::NextLocalBoard()
-{
- /// Return the next local board in iteration, or 0 if iteration is ended.
- if ( !fLBIterator ) return 0x0;
-
- if ( fCurrentLocalBoard >= fCurrentCrate->Boards()->GetLast() +1)
-// if ( fCurrentLocalBoard >= fCurrentCrate->Boards()->GetLast() )
- {
- // try to go to next crate, if some are left
- Long_t key, value;
- Bool_t ok = fLBIterator->Next(key,value);
- if ( ok )
- {
- fCurrentCrate = reinterpret_cast<AliMUONTriggerCrate*>(value);
- fCurrentLocalBoard = 1;
- }
- else
- {
- fCurrentLocalBoard = 0;
- return 0x0;
- }
- }
-
- AliMUONLocalTriggerBoard* lb = static_cast<AliMUONLocalTriggerBoard*>
- (fCurrentCrate->Boards()->At(fCurrentLocalBoard));
-
- ++fCurrentLocalBoard;
-
- return lb;
-}
-
//_____________________________________________________________________________
Int_t
AliMUONTriggerCrateStore::NumberOfCrates() const
//_____________________________________________________________________________
void
-AliMUONTriggerCrateStore::ReadFromFile(const char* file)
+AliMUONTriggerCrateStore::ReadFromFile(AliMUONCalibrationData* calibData)
{
- /// Read crate and local board information from file.
- fCrates = new AliMpExMap(kTRUE);
- fLocalBoards = new AliMpExMap(kFALSE);
+ /// create crate and local board objects from mapping & calib (Ch.F)
+ fCrates = new AliMpExMap;
+ fCrates->SetOwner(kTRUE);
+ fLocalBoards = new AliMpExMap;
+ fLocalBoards->SetOwner(kFALSE);
- ifstream myInputFile(gSystem->ExpandPathName(file), ios::in);
- string sLine, sValue;
+ AliMUONTriggerLut* lut = calibData->TriggerLut();
+
+ if (!lut)
+ AliWarning("No valid trigger LUT in CDB");
- if ( !myInputFile )
- {
- AliError("TRIGGER ELECTRONICS CONFIGURATION FILE COULD NOT BE OPENED");
- }
- else
+ AliMUONRegionalTriggerConfig* regionalConfig = calibData->RegionalTriggerConfig();
+ if (!regionalConfig) {
+ AliError("No valid regional trigger configuration in CDB");
+ return;
+ }
+
+ TIter next(AliMpDDLStore::Instance()->GetRegionalTrigger()->CreateCrateIterator());
+ AliMpTriggerCrate* crateMapping;
+
+ while ( ( crateMapping = static_cast<AliMpTriggerCrate*>(next()) ) )
{
- while (getline(myInputFile,sLine))
+
+ TString crateName = crateMapping->GetName();
+ AliMUONTriggerCrate *crate = Crate(crateName.Data());
+
+ AliMUONTriggerCrateConfig* crateConfig = regionalConfig->FindTriggerCrate(crateName);
+
+ if (!crate)
{
- if (sLine.empty()) continue; // Ignore empty lines
- else
- {
- const Int_t kMaxfields = 15; char **fields = new char*[kMaxfields];
-
- char s[100];
-
- if (sLine.find("Board",0) != string::npos)
- {
- strcpy(s,sLine.c_str());
-
- Int_t numlines = 0;
-
- for (char *token = strtok(s, " ");
- token != NULL;
- token = strtok(NULL, " "))
- {
- fields[numlines] = new char[strlen(token)+1];
- strcpy(fields[numlines++],token);
- }
-
- char str[10]; strcpy(str, fields[6]); strcat(str, fields[7]);
-
- AliMUONTriggerCrate *crate = Crate(str);
-
- if (!crate)
- {
- AddCrate(str); crate = Crate(str);
-
- AliMUONRegionalTriggerBoard *rboard = new AliMUONRegionalTriggerBoard();
- crate->AddBoard(rboard, 0);
- }
-
- // CONVENTION: SLOT 0 HOLDS THE REGIONAL BOARD
- Int_t sl = atoi(fields[10]);
-
-// AliMUONTriggerLut* lut = calibData->TriggerLut();
-
- AliMUONLocalTriggerBoard *board =
- new AliMUONLocalTriggerBoard(fields[4], sl, 0x0);
-
- if (strcmp(fields[1],"nn"))
- {
- Int_t sboard = atoi(fields[1]);
-
- board->SetNumber(sboard);
- fLocalBoards->Add(sboard,board);
-
-// fCrateMap[sboard-1] = new char[strlen(str)+1]; strcpy(fCrateMap[sboard-1], str);
-// fBoardMap[sboard-1] = sl;
- }
-
- board->SetCrate(str);
-
- crate->AddBoard(board, sl);
-
- while (getline(myInputFile,sLine)) if (sLine.find("transv",0) != string::npos) break;
-
- strcpy(s,sLine.c_str());
-
- for (char *token = strtok(s, " ");
- token != NULL;
- token = strtok(NULL, " ")) if (!strcmp(token,"NONE")) board->SetTC(kFALSE);
-
- while (getline(myInputFile,sLine)) if (sLine.find("Switch",0) != string::npos) break;
-
- while (getline(myInputFile,sLine)) if (!sLine.empty()) break;
-
- strcpy(s,sLine.c_str());
-
- Int_t lines = 0;
-
- for (char *token = strtok(s, " ");
- token != NULL;
- token = strtok(NULL, " ")) board->SetSwitch(lines++, atoi(token));
-
- for (Int_t i = 0; i<numlines; i++)
- if (fields[i]) {delete [] fields[i]; fields[i] = 0;}
-
- delete [] fields; fields = 0;
- }
+ AddCrate(crateName.Data());
+ crate = Crate(crateName.Data());
+ AliDebug(3, Form("crate name %s\n", crateName.Data()));
+ AliMUONRegionalTriggerBoard *rboard = new AliMUONRegionalTriggerBoard();
+ crate->AddBoard(rboard, 0);
+ }
+
+ for(Int_t iLocal = 0; iLocal < crateMapping->GetNofLocalBoards(); ++iLocal) {
+
+ Int_t localBoardId = crateMapping->GetLocalBoardId(iLocal);
+ if (!localBoardId) continue; //empty slot, should not happen
+
+ AliMpLocalBoard* localBoardMapping = AliMpDDLStore::Instance()->GetLocalBoard(localBoardId);
+ AliDebug(3, Form("local name %s id %d\n", localBoardMapping->GetName(), localBoardId));
+
+ Int_t slot = localBoardMapping->GetSlot();
+ AliMUONLocalTriggerBoard *board = new AliMUONLocalTriggerBoard(localBoardMapping);
+ board->SetCoinc44(crateConfig->GetCoinc());
+ board->SetLUT(lut);
+
+
+ if (localBoardMapping->IsNotified()) {
+ fLocalBoards->Add(localBoardId, board);
}
- }
- }
+
+ crate->AddBoard(board, slot);
+
+ } // iLocal
+ } // while
}
+