Geometry builder classes moved from base to sim.
[u/mrichter/AliRoot.git] / MUON / AliMUONTriggerCrateStore.cxx
CommitLineData
30dd09e2 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
15
16// $Id$
17
18#include "AliMUONTriggerCrateStore.h"
19
20#include "AliMUONTriggerCrate.h"
21#include "AliMUONLocalTriggerBoard.h"
22#include "AliMUONRegionalTriggerBoard.h"
23#include "AliMpExMap.h"
24#include "TString.h"
25#include "TSystem.h"
26#include "AliLog.h"
27#include "Riostream.h"
28
29///
30/// \class AliMUONTriggerCrateStore
31///
32/// A container of trigger crate objects that offers iteration
33/// over both the crates themselves and the local boards they contain
34///
35/// \author Laurent Aphecetche
36
37ClassImp(AliMUONTriggerCrateStore)
38
39//_____________________________________________________________________________
40AliMUONTriggerCrateStore::AliMUONTriggerCrateStore()
41: TObject(),
42fCrates(0x0),
43fLocalBoards(0x0),
44fCrateIterator(0x0),
45fLBIterator(0x0),
46fCurrentCrate(0x0),
47fCurrentLocalBoard(-1)
48{
49 // ctor
50}
51
52//_____________________________________________________________________________
53AliMUONTriggerCrateStore::~AliMUONTriggerCrateStore()
54{
55 // dtor
56 delete fCrateIterator;
57 delete fLBIterator;
58 delete fCrates;
59 delete fLocalBoards;
60}
61
62//_____________________________________________________________________________
63void
64AliMUONTriggerCrateStore::AddCrate(const char *name)
65{
66 /// create and add a crate to our map
67 if (!fCrates)
68 {
69 AliError("Object not properly initialized");
70 return;
71 }
72
73 AliDebug(1,Form("Adding crate %s",name));
74 TObject* there = fCrates->GetValue(name);
75 if (there)
76 {
77 AliError(Form("Cannot add crate %s because it's already there !",name));
78 }
79 else
80 {
81 fCrates->Add(name,new AliMUONTriggerCrate(name,17));
82 }
83}
84
85//_____________________________________________________________________________
86AliMUONLocalTriggerBoard*
87AliMUONTriggerCrateStore::LocalBoard(Int_t boardNumber) const
88{
89 /// return a board by number
90
91 if ( !fLocalBoards )
92 {
93 AliError("Object not properly initialized");
94 return 0x0;
95 }
96
97 return static_cast<AliMUONLocalTriggerBoard*>(fLocalBoards->GetValue(boardNumber));
98}
99
100//_____________________________________________________________________________
101AliMUONTriggerCrate*
102AliMUONTriggerCrateStore::Crate(const char *name) const
103{
104 /// return a crate by name
105 if ( !fCrates )
106 {
107 AliError("Object not properly initialized");
108 return 0x0;
109 }
110 return static_cast<AliMUONTriggerCrate*>(fCrates->GetValue(name));
111}
112
113//_____________________________________________________________________________
114void
115AliMUONTriggerCrateStore::FirstCrate()
116{
117 /// initialize iteration
118 if ( !fCrates )
119 {
120 AliError("Object not properly initialized");
121 return;
122 }
123 if (!fCrateIterator)
124 {
125 fCrateIterator = new TExMapIter(fCrates->GetIterator());
126 }
127 fCrateIterator->Reset();
128}
129
130//_____________________________________________________________________________
131void
132AliMUONTriggerCrateStore::FirstLocalBoard()
133{
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
138 fCurrentCrate = 0x0;
139 fCurrentLocalBoard = 0;
140
141 if ( !fLBIterator )
142 {
143 fLBIterator = new TExMapIter(fCrates->GetIterator());
144 }
145 fLBIterator->Reset();
146 Long_t key, value;
147 Bool_t ok = fLBIterator->Next(key,value);
148 if ( ok )
149 {
150 fCurrentCrate = reinterpret_cast<AliMUONTriggerCrate*>(value);
151 fCurrentLocalBoard = 1;
152 }
153}
154
155//_____________________________________________________________________________
156AliMUONTriggerCrate*
157AliMUONTriggerCrateStore::NextCrate()
158{
159 /// Return the next crate in iteration, or 0 if iteration is ended.
160 if (!fCrateIterator) return 0x0;
161
162 Long_t key, value;
163 Bool_t ok = fCrateIterator->Next(key,value);
164 if (ok)
165 {
166 return reinterpret_cast<AliMUONTriggerCrate*>(value);
167 }
168 else
169 {
170 return 0x0;
171 }
172}
173
174//_____________________________________________________________________________
175AliMUONLocalTriggerBoard*
176AliMUONTriggerCrateStore::NextLocalBoard()
177{
178 /// Return the next local board in iteration, or 0 if iteration is ended.
179 if ( !fLBIterator ) return 0x0;
180
181 if ( fCurrentLocalBoard >= fCurrentCrate->Boards()->GetLast() +1)
182// if ( fCurrentLocalBoard >= fCurrentCrate->Boards()->GetLast() )
183 {
184 // try to go to next crate, if some are left
185 Long_t key, value;
186 Bool_t ok = fLBIterator->Next(key,value);
187 if ( ok )
188 {
189 fCurrentCrate = reinterpret_cast<AliMUONTriggerCrate*>(value);
190 fCurrentLocalBoard = 1;
191 }
192 else
193 {
194 fCurrentLocalBoard = 0;
195 return 0x0;
196 }
197 }
198
199 AliMUONLocalTriggerBoard* lb = static_cast<AliMUONLocalTriggerBoard*>
200 (fCurrentCrate->Boards()->At(fCurrentLocalBoard));
201
202 ++fCurrentLocalBoard;
203
204 return lb;
205}
206
207//_____________________________________________________________________________
208Int_t
209AliMUONTriggerCrateStore::NumberOfCrates() const
210{
211 /// Number of crates we're holding
212 if ( fCrates ) return fCrates->GetSize();
213 return 0;
214}
215
216//_____________________________________________________________________________
217Int_t
218AliMUONTriggerCrateStore::NumberOfLocalBoards() const
219{
220 /// Number of local boards we're holding
221 if ( fLocalBoards ) return fLocalBoards->GetSize();
222 return 0;
223}
224
225//_____________________________________________________________________________
226void
227AliMUONTriggerCrateStore::ReadFromFile(const char* file)
228{
229 /// Read crate and local board information from file.
230 fCrates = new AliMpExMap(kTRUE);
231 fLocalBoards = new AliMpExMap(kFALSE);
232
233 ifstream myInputFile(gSystem->ExpandPathName(file), ios::in);
234
235 string sLine, sValue;
236
237 if ( !myInputFile )
238 {
239 AliError("TRIGGER ELECTRONICS CONFIGURATION FILE COULD NOT BE OPENED");
240 }
241 else
242 {
243 while (getline(myInputFile,sLine))
244 {
245 if (sLine.empty()) continue; // Ignore empty lines
246 else
247 {
248 const Int_t kMaxfields = 15; char **fields = new char*[kMaxfields];
249
250 char s[100];
251
252 if (sLine.find("Board",0) != string::npos)
253 {
254 strcpy(s,sLine.c_str());
255
256 Int_t numlines = 0;
257
258 for (char *token = strtok(s, " ");
259 token != NULL;
260 token = strtok(NULL, " "))
261 {
262 fields[numlines] = new char[strlen(token)+1];
263 strcpy(fields[numlines++],token);
264 }
265
266 char str[10]; strcpy(str, fields[6]); strcat(str, fields[7]);
267
268 AliMUONTriggerCrate *crate = Crate(str);
269
270 if (!crate)
271 {
272 AddCrate(str); crate = Crate(str);
273
274 AliMUONRegionalTriggerBoard *rboard = new AliMUONRegionalTriggerBoard();
275 crate->AddBoard(rboard, 0);
276 }
277
278 // CONVENTION: SLOT 0 HOLDS THE REGIONAL BOARD
279 Int_t sl = atoi(fields[10]);
280
281// AliMUONTriggerLut* lut = calibData->TriggerLut();
282
283 AliMUONLocalTriggerBoard *board =
284 new AliMUONLocalTriggerBoard(fields[4], sl, 0x0);
285
286 if (strcmp(fields[1],"nn"))
287 {
288 Int_t sboard = atoi(fields[1]);
289
290 board->SetNumber(sboard);
291 fLocalBoards->Add(sboard,board);
292
293// fCrateMap[sboard-1] = new char[strlen(str)+1]; strcpy(fCrateMap[sboard-1], str);
294// fBoardMap[sboard-1] = sl;
295 }
296
297 board->SetCrate(str);
298
299 crate->AddBoard(board, sl);
300
301 while (getline(myInputFile,sLine)) if (sLine.find("transv",0) != string::npos) break;
302
303 strcpy(s,sLine.c_str());
304
305 for (char *token = strtok(s, " ");
306 token != NULL;
307 token = strtok(NULL, " ")) if (!strcmp(token,"NONE")) board->SetTC(kFALSE);
308
309 while (getline(myInputFile,sLine)) if (sLine.find("Switch",0) != string::npos) break;
310
311 while (getline(myInputFile,sLine)) if (!sLine.empty()) break;
312
313 strcpy(s,sLine.c_str());
314
315 Int_t lines = 0;
316
317 for (char *token = strtok(s, " ");
318 token != NULL;
319 token = strtok(NULL, " ")) board->SetSwitch(lines++, atoi(token));
320
321 for (Int_t i = 0; i<numlines; i++)
322 if (fields[i]) {delete [] fields[i]; fields[i] = 0;}
323
324 delete [] fields; fields = 0;
325 }
326 }
327 }
328 }
329}