]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/MUONmapping/AliMpManuStore.cxx
Simplifications following change of library loading and $ALICE_ROOT
[u/mrichter/AliRoot.git] / MUON / MUONmapping / AliMpManuStore.cxx
CommitLineData
ab167304 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// Category: management
18
19//-----------------------------------------------------------------------------
20// Class AliMpManuStore
21// --------------------
22// The container class for manu serial numbersd
23// Authors: Ivana Hrivnacova, IPN Orsay
24// Christian Finck, SUBATECH Nantes
25//-----------------------------------------------------------------------------
26
27#include "AliMpManuStore.h"
28
29#include "AliMpDEStore.h"
30#include "AliMpDEManager.h"
31#include "AliMpDetElement.h"
32#include "AliMpConstants.h"
33#include "AliMpDataStreams.h"
34#include "AliMpFiles.h"
35#include "AliMpHelper.h"
ab167304 36#include "AliMpConstants.h"
168e9c4d 37#include "AliMpEncodePair.h"
ab167304 38
39#include "AliLog.h"
40
41#include <Riostream.h>
42#include <TClass.h>
43#include <TSystem.h>
44#include <TObjString.h>
45#include <TObjArray.h>
46#include <TMap.h>
47
48#include <fstream>
6332274b 49#include <cstdlib>
ab167304 50
51/// \cond CLASSIMP
52ClassImp(AliMpManuStore)
53/// \endcond
54
55AliMpManuStore* AliMpManuStore::fgInstance = 0;
56Bool_t AliMpManuStore::fgWarnIfDoublon = kFALSE;
57
58//
59// static methods
60//
61
62//______________________________________________________________________________
63AliMpManuStore* AliMpManuStore::Instance(Bool_t warn)
64{
65 /// Create the DDL store if it does not yet exist
66 /// and return its instance
67
68 if ( ! fgInstance && warn ) {
69 AliWarningClass("Manu Store has not been loaded");
70 }
71
72 return fgInstance;
73}
74
75//______________________________________________________________________________
76AliMpManuStore* AliMpManuStore::ReadData(const AliMpDataStreams& dataStreams,
d2d10ee1 77 Bool_t warn)
ab167304 78{
79 /// Load the DDL store from ASCII data files
80 /// and return its instance
81
82 if ( fgInstance ) {
83 if ( warn )
f05cce50 84 AliWarningClass("Manu Store has been already loaded");
ab167304 85 return fgInstance;
86 }
87
d2d10ee1 88 if ( dataStreams.GetReadFromFiles() )
89 AliInfoClass("Reading Manu Store from ASCII files.");
ab167304 90
d2d10ee1 91 fgInstance = new AliMpManuStore(dataStreams);
ab167304 92 return fgInstance;
93}
94
95//
96// ctors, dtor
97//
98
99
100//______________________________________________________________________________
101AliMpManuStore::AliMpManuStore(const AliMpDataStreams& dataStreams)
102: TObject(),
ab167304 103 fManuToSerialNbs(),
104 fSerialNbToManus(),
105 fNofManusInDE(),
106 fNofManus(0)
107{
108/// Standard constructor
109
110 AliDebug(1,"");
111
112 // Check if DE store is loaded
113 if ( ! AliMpDEStore::Instance(false) ) {
114 AliErrorStream()
115 << "Mapping segmentation has not be loaded. Cannont load Manu store"
116 << endl;
117 return;
118 }
ab167304 119
21027e5a 120 ReadManuSerial(dataStreams);
877f7c6e 121}
122
ab167304 123//______________________________________________________________________________
21027e5a 124AliMpManuStore::AliMpManuStore(TRootIOCtor* /*ioCtor*/)
ab167304 125: TObject(),
ab167304 126 fManuToSerialNbs(),
127 fSerialNbToManus(),
128 fNofManusInDE(),
129 fNofManus(0)
130{
131/// Constructor for IO
132
133 AliDebug(1,"");
134}
135
136
137//______________________________________________________________________________
138AliMpManuStore::~AliMpManuStore()
139{
140/// Destructor
141
142 AliDebug(1,"");
f05cce50 143
144 fgInstance = 0;
ab167304 145}
146
147//
148// private methods
149//
150
151//______________________________________________________________________________
21027e5a 152Bool_t AliMpManuStore::ReadData(const AliMpDataStreams& dataStreams,
153 const AliMpDetElement* de, Int_t& nofManus)
ab167304 154{
155/// Read manu serial numbers for the given detection element
156
157 Int_t deId = de->GetId();
158 TString deName = de->GetDEName();
159 AliMp::StationType stationType
160 = AliMpDEManager::GetStationType(de->GetId());
4e51cfd2 161 AliMq::Station12Type station12Type
162 = AliMpDEManager::GetStation12Type(de->GetId());
ab167304 163
164 // Nothing to be done for trigger
165 if ( stationType == AliMp::kStationTrigger ) {
166 nofManus = 0;
167 return kTRUE;
168 }
169
170 static Int_t manuMask = AliMpConstants::ManuMask(AliMp::kNonBendingPlane);
171
172 istream& in
21027e5a 173 = dataStreams.
4e51cfd2 174 CreateDataStream(
175 AliMpFiles::ManuToSerialPath(deName, stationType, station12Type));
ab167304 176
177 char line[80];
178
179 nofManus = 0;
180 while ( in.getline(line,80) ) {
181
182 if ( line[0] == '#' ) continue;
183
184 TString tmp(AliMpHelper::Normalize(line));
185
186 TObjArray* stringList = tmp.Tokenize(TString(" "));
187
188 Int_t manuId = atoi( ((TObjString*)stringList->At(0))->GetName());
189 Int_t manuSerial = atoi( ((TObjString*)stringList->At(2))->GetName());
190
191 TString sPlane = ((TObjString*)stringList->At(1))->GetString();
192
193 // filling manuId <> manuSerial
194 if (!sPlane.CompareTo(PlaneTypeName(AliMp::kBendingPlane)))
195 AddManu(deId, manuId, manuSerial);
196 else
197 AddManu(deId, manuId + manuMask, manuSerial);
198
199 ++nofManus;
200
201 delete stringList;
202 }
b0cb5ffd 203
204 delete &in;
ab167304 205
206 return kTRUE;
207}
208
209//______________________________________________________________________________
21027e5a 210Bool_t AliMpManuStore::ReadManuSerial(const AliMpDataStreams& dataStreams)
ab167304 211{
212/// Read data files for all detection elements.
213/// Return true if reading was successful.
214
215 Bool_t isOk = kTRUE;
216
217 // Loop over DE
218 AliMpDEIterator it;
219 for ( it.First(); ! it.IsDone(); it.Next() ) {
220
221 AliMpDetElement* detElement = it.CurrentDE();
222
223 Int_t nofManus;
21027e5a 224 Bool_t result = ReadData(dataStreams, detElement, nofManus);
ab167304 225 fNofManusInDE.Add(detElement->GetId(), nofManus);
226 fNofManus += nofManus;
227
228 AliDebugStream(2)
229 << "Adding " << nofManus << " manus for de "
230 << detElement->GetId() << endl;
231
232 isOk = isOk && result;
233 }
234
235 return isOk;
236}
237
238//______________________________________________________________________________
239void AliMpManuStore::ReplaceManu(Int_t detElemId, Int_t manuId, Int_t serialNb)
240{
241/// Replace manu in the map.
242/// As TExMap has no replcae function, we have to rebuild map once again.
243/// Not yet in use, declared private.
244
168e9c4d 245 Long_t index = AliMp::Pair(detElemId, manuId);
ab167304 246
247 TExMap newManuToSerialNbs;
248 // Loop over map
249 TExMapIter it(&fManuToSerialNbs);
82280315 250
8b8f8fd4 251#if (defined(ROOT_VERSION_CODE) && ROOT_VERSION_CODE >= 334082) || \
252 (defined(ROOT_SVN_REVISION) && ROOT_SVN_REVISION >= 29598)
82280315 253 Long64_t key;
254 Long64_t value;
255#else
ab167304 256 Long_t key;
257 Long_t value;
82280315 258#endif
ab167304 259 while ( ( it.Next(key, value) ) ) {
260
261 if ( key != index )
262 newManuToSerialNbs.Add(key, value);
263 else
264 newManuToSerialNbs.Add(index, Long_t(serialNb));
265 }
266
267 TExMap newSerialNbToManus;
268 // Loop over map
269 TExMapIter it2(&fSerialNbToManus);
270 while ( ( it2.Next(key, value) ) ) {
271
272 if ( value != index )
273 newSerialNbToManus.Add(key, value);
274 else
275 newSerialNbToManus.Add(Long_t(serialNb), index);
276 }
277
278 // And now replace the maps
279 fManuToSerialNbs = newManuToSerialNbs;
280 fSerialNbToManus = newManuToSerialNbs;
281}
282
283
284//______________________________________________________________________________
285Bool_t AliMpManuStore::WriteData(const TString& outDir)
286{
287/// Write data files for all detection elements.
288/// Return true if reading was successful.
289/// Not yet in use, declared private.
290
291 TString curDir = gSystem->pwd();
292
293 // Create top directory
294 //
295 if ( gSystem->OpenDirectory(outDir.Data()) ) {
296 AliErrorStream()
297 << "Directory " << outDir.Data() << " already exists" << endl;
298 return kFALSE;
299 }
300 else {
301 AliDebugStream(2) << "Making directory " << outDir.Data() << endl;
302 gSystem->mkdir(outDir.Data());
303 }
304
305 // Loop over DE
306 AliMpDEIterator it;
307 for ( it.First(); ! it.IsDone(); it.Next() ) {
308
309 AliMpDetElement* detElement = it.CurrentDE();
310 Int_t detElemId = detElement->GetId();
311 TString deName = detElement->GetDEName();
312 AliMp::StationType stationType
313 = AliMpDEManager::GetStationType(detElemId);
4e51cfd2 314 AliMq::Station12Type station12Type
315 = AliMpDEManager::GetStation12Type(detElemId);
ab167304 316
317 if ( stationType == AliMp::kStationTrigger ) continue;
318
319 // Create directory if it does not yet exist
320 //
4e51cfd2 321 TString dirPath = outDir + AliMpFiles::StationDataDir(stationType, station12Type);
ab167304 322 if ( ! gSystem->OpenDirectory(dirPath.Data()) ) {
323 AliDebugStream(2) << "Making directory " << dirPath.Data() << endl;
324 gSystem->mkdir(dirPath.Data());
325 }
326
327 // Compose output file path
328 //
4e51cfd2 329 string dataPath = AliMpFiles::ManuToSerialPath(deName, stationType, station12Type).Data();
ab167304 330 string top = AliMpFiles::GetTop().Data();
331 if ( dataPath.find(top) != string::npos ) dataPath.erase(0, top.size()+1);
332 dataPath.erase(0,dataPath.find('/')+1);
06d8fc51 333 TString dataPath1 = dataPath;
334 TString filePath = outDir + "/" + dataPath1;
ab167304 335
336 // Open file
337 //
338 ofstream out(filePath.Data());
339 if ( ! out.good() ) {
340 AliErrorStream()
341 << "Cannot open output file " << filePath.Data() << endl;
342 return kFALSE;
343 }
344
345 // Loop over map
53bf67e2 346 TExMapIter it2(&fManuToSerialNbs);
8b8f8fd4 347#if (defined(ROOT_SVN_REVISION) && ROOT_SVN_REVISION >= 29598) || \
348 (defined(ROOT_VERSION_CODE) && ROOT_VERSION_CODE >= ROOT_VERSION(5,25,02))
82280315 349 Long64_t key;
350 Long64_t value;
351#else
ab167304 352 Long_t key;
353 Long_t value;
82280315 354#endif
53bf67e2 355 while ( ( it2.Next(key, value) ) ) {
168e9c4d 356 Int_t pairFirst = AliMp::PairFirst(key);
ab167304 357
168e9c4d 358 if ( pairFirst != detElemId ) continue;
ab167304 359
168e9c4d 360 Int_t manuId = AliMp::PairSecond(key);
361
ab167304 362 AliDebugStream(3)
168e9c4d 363 << "Go to write " << key << " "
364 << pairFirst << " " << manuId << " " << value << endl;
ab167304 365
ab167304 366 static Int_t manuMask = AliMpConstants::ManuMask(AliMp::kNonBendingPlane);
367
368 TString planeName = PlaneTypeName(AliMp::kBendingPlane);
168e9c4d 369 if ( manuId> manuMask ) {
ab167304 370 planeName = PlaneTypeName(AliMp::kNonBendingPlane);
371 manuId -= manuMask;
372 }
373 out << manuId << " " << planeName.Data() << " " << value << endl;
374
375 AliDebugStream(3)
376 << manuId << " " << planeName.Data() << " " << value << endl;
377 }
378 out.close();
379 }
380 gSystem->cd(curDir);
381 return kTRUE;
382}
383
384//
385// public methods
386//
387
388
389//______________________________________________________________________________
390Int_t AliMpManuStore::NofManus() const
391{
392/// Return total number of manus in the store
393
394 return fNofManus;
395}
396
397
398//______________________________________________________________________________
399Int_t AliMpManuStore::NofManus(Int_t detElemId) const
400{
401/// Return number of manus in given detection element
402
403 if ( ! AliMpDEManager::IsValidDetElemId(detElemId, kTRUE) ) return 0;
404
405 return fNofManusInDE.GetValue(detElemId);
406}
407
408//______________________________________________________________________________
409Bool_t AliMpManuStore::AddManu(Int_t detElemId, Int_t manuId, Int_t serialNb)
410{
411/// Add manu to the map
412
168e9c4d 413 Long_t index = AliMp::Pair(detElemId, manuId);
ab167304 414
415 AliDebugStream(2)
416 << "Adding (" << detElemId << "," << manuId
417 << ") as index=" << index << " and serialNb=" << serialNb << endl;
418
419 fManuToSerialNbs.Add(index, Long_t(serialNb));
420
421 Long_t value = fSerialNbToManus.GetValue(Long_t(serialNb));
422 if ( value ) {
423 if ( fgWarnIfDoublon ) {
424 AliWarningStream()
425 << "Serial number " << serialNb
168e9c4d 426 << " already present for (detElemId, manuId) = " ;
427 AliMp::PairPut(AliWarningStream(), (MpPair_t) value) << endl;
ab167304 428 }
429 return kFALSE;
430 }
431 else {
432 fSerialNbToManus.Add(Long_t(serialNb), index);
433 return kTRUE;
434 }
435}
436
437
438//______________________________________________________________________________
439Int_t AliMpManuStore::GetManuSerial(Int_t detElemId, Int_t manuId) const
440{
441/// Return manu serial number for given detElemId and manuId
442
168e9c4d 443 Long_t index = AliMp::Pair(detElemId, manuId);
ab167304 444 // cout << index << " " << fManuToSerialNbs.GetValue(index) << endl;
445
446 return fManuToSerialNbs.GetValue(index);
447}
448
449//______________________________________________________________________________
168e9c4d 450MpPair_t AliMpManuStore::GetDetElemIdManu(Int_t manuSerial) const
ab167304 451{
452/// Return detElemId and manuId for given manu serial number
168e9c4d 453/// as encoded pair
ab167304 454
168e9c4d 455 return fSerialNbToManus.GetValue(Long_t(manuSerial));
ab167304 456}
457