1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 #include "AliMUONTriggerCrateStore.h"
20 #include "AliMUONTriggerCrate.h"
21 #include "AliMUONLocalTriggerBoard.h"
22 #include "AliMUONRegionalTriggerBoard.h"
23 #include "AliMpExMap.h"
27 #include "Riostream.h"
30 /// \class AliMUONTriggerCrateStore
32 /// A container of trigger crate objects that offers iteration
33 /// over both the crates themselves and the local boards they contain
35 /// \author Laurent Aphecetche
37 ClassImp(AliMUONTriggerCrateStore)
39 //_____________________________________________________________________________
40 AliMUONTriggerCrateStore::AliMUONTriggerCrateStore()
47 fCurrentLocalBoard(-1)
52 //_____________________________________________________________________________
53 AliMUONTriggerCrateStore::~AliMUONTriggerCrateStore()
56 delete fCrateIterator;
62 //_____________________________________________________________________________
64 AliMUONTriggerCrateStore::AddCrate(const char *name)
66 /// create and add a crate to our map
69 AliError("Object not properly initialized");
73 AliDebug(1,Form("Adding crate %s",name));
74 TObject* there = fCrates->GetValue(name);
77 AliError(Form("Cannot add crate %s because it's already there !",name));
81 fCrates->Add(name,new AliMUONTriggerCrate(name,17));
85 //_____________________________________________________________________________
86 AliMUONLocalTriggerBoard*
87 AliMUONTriggerCrateStore::LocalBoard(Int_t boardNumber) const
89 /// return a board by number
93 AliError("Object not properly initialized");
97 return static_cast<AliMUONLocalTriggerBoard*>(fLocalBoards->GetValue(boardNumber));
100 //_____________________________________________________________________________
102 AliMUONTriggerCrateStore::Crate(const char *name) const
104 /// return a crate by name
107 AliError("Object not properly initialized");
110 return static_cast<AliMUONTriggerCrate*>(fCrates->GetValue(name));
113 //_____________________________________________________________________________
115 AliMUONTriggerCrateStore::FirstCrate()
117 /// initialize iteration
120 AliError("Object not properly initialized");
125 fCrateIterator = new TExMapIter(fCrates->GetIterator());
127 fCrateIterator->Reset();
130 //_____________________________________________________________________________
132 AliMUONTriggerCrateStore::FirstLocalBoard()
134 /// Initialize iterator on local boards.
135 /// Please note that we're not using directly the FirstCrate() and
136 /// NextCrate() methods here to avoid mix and match between crate iterator
137 /// and local board iterator
139 fCurrentLocalBoard = 0;
143 fLBIterator = new TExMapIter(fCrates->GetIterator());
145 fLBIterator->Reset();
147 Bool_t ok = fLBIterator->Next(key,value);
150 fCurrentCrate = reinterpret_cast<AliMUONTriggerCrate*>(value);
151 fCurrentLocalBoard = 1;
155 //_____________________________________________________________________________
157 AliMUONTriggerCrateStore::NextCrate()
159 /// Return the next crate in iteration, or 0 if iteration is ended.
160 if (!fCrateIterator) return 0x0;
163 Bool_t ok = fCrateIterator->Next(key,value);
166 return reinterpret_cast<AliMUONTriggerCrate*>(value);
174 //_____________________________________________________________________________
175 AliMUONLocalTriggerBoard*
176 AliMUONTriggerCrateStore::NextLocalBoard()
178 /// Return the next local board in iteration, or 0 if iteration is ended.
179 if ( !fLBIterator ) return 0x0;
181 if ( fCurrentLocalBoard >= fCurrentCrate->Boards()->GetLast() +1)
182 // if ( fCurrentLocalBoard >= fCurrentCrate->Boards()->GetLast() )
184 // try to go to next crate, if some are left
186 Bool_t ok = fLBIterator->Next(key,value);
189 fCurrentCrate = reinterpret_cast<AliMUONTriggerCrate*>(value);
190 fCurrentLocalBoard = 1;
194 fCurrentLocalBoard = 0;
199 AliMUONLocalTriggerBoard* lb = static_cast<AliMUONLocalTriggerBoard*>
200 (fCurrentCrate->Boards()->At(fCurrentLocalBoard));
202 ++fCurrentLocalBoard;
207 //_____________________________________________________________________________
209 AliMUONTriggerCrateStore::NumberOfCrates() const
211 /// Number of crates we're holding
212 if ( fCrates ) return fCrates->GetSize();
216 //_____________________________________________________________________________
218 AliMUONTriggerCrateStore::NumberOfLocalBoards() const
220 /// Number of local boards we're holding
221 if ( fLocalBoards ) return fLocalBoards->GetSize();
225 //_____________________________________________________________________________
227 AliMUONTriggerCrateStore::ReadFromFile(const char* file)
229 /// Read crate and local board information from file.
230 fCrates = new AliMpExMap(kTRUE);
231 fLocalBoards = new AliMpExMap(kFALSE);
233 ifstream myInputFile(gSystem->ExpandPathName(file), ios::in);
235 string sLine, sValue;
239 AliError("TRIGGER ELECTRONICS CONFIGURATION FILE COULD NOT BE OPENED");
243 while (getline(myInputFile,sLine))
245 if (sLine.empty()) continue; // Ignore empty lines
248 const Int_t kMaxfields = 15; char **fields = new char*[kMaxfields];
252 if (sLine.find("Board",0) != string::npos)
254 strcpy(s,sLine.c_str());
258 for (char *token = strtok(s, " ");
260 token = strtok(NULL, " "))
262 fields[numlines] = new char[strlen(token)+1];
263 strcpy(fields[numlines++],token);
266 char str[10]; strcpy(str, fields[6]); strcat(str, fields[7]);
268 AliMUONTriggerCrate *crate = Crate(str);
272 AddCrate(str); crate = Crate(str);
274 AliMUONRegionalTriggerBoard *rboard = new AliMUONRegionalTriggerBoard();
275 crate->AddBoard(rboard, 0);
278 // CONVENTION: SLOT 0 HOLDS THE REGIONAL BOARD
279 Int_t sl = atoi(fields[10]);
281 // AliMUONTriggerLut* lut = calibData->TriggerLut();
283 AliMUONLocalTriggerBoard *board =
284 new AliMUONLocalTriggerBoard(fields[4], sl, 0x0);
286 if (strcmp(fields[1],"nn"))
288 Int_t sboard = atoi(fields[1]);
290 board->SetNumber(sboard);
291 fLocalBoards->Add(sboard,board);
293 // fCrateMap[sboard-1] = new char[strlen(str)+1]; strcpy(fCrateMap[sboard-1], str);
294 // fBoardMap[sboard-1] = sl;
297 board->SetCrate(str);
299 crate->AddBoard(board, sl);
301 while (getline(myInputFile,sLine)) if (sLine.find("transv",0) != string::npos) break;
303 strcpy(s,sLine.c_str());
305 for (char *token = strtok(s, " ");
307 token = strtok(NULL, " ")) if (!strcmp(token,"NONE")) board->SetTC(kFALSE);
309 while (getline(myInputFile,sLine)) if (sLine.find("Switch",0) != string::npos) break;
311 while (getline(myInputFile,sLine)) if (!sLine.empty()) break;
313 strcpy(s,sLine.c_str());
317 for (char *token = strtok(s, " ");
319 token = strtok(NULL, " ")) board->SetSwitch(lines++, atoi(token));
321 for (Int_t i = 0; i<numlines; i++)
322 if (fields[i]) {delete [] fields[i]; fields[i] = 0;}
324 delete [] fields; fields = 0;