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 **************************************************************************/
17 // Category: management
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 //-----------------------------------------------------------------------------
27 #include "AliMpManuStore.h"
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"
36 #include "AliMpConstants.h"
37 #include "AliMpEncodePair.h"
41 #include <Riostream.h>
44 #include <TObjString.h>
45 #include <TObjArray.h>
52 ClassImp(AliMpManuStore)
55 AliMpManuStore* AliMpManuStore::fgInstance = 0;
56 Bool_t AliMpManuStore::fgWarnIfDoublon = kFALSE;
62 //______________________________________________________________________________
63 AliMpManuStore* AliMpManuStore::Instance(Bool_t warn)
65 /// Create the DDL store if it does not yet exist
66 /// and return its instance
68 if ( ! fgInstance && warn ) {
69 AliWarningClass("Manu Store has not been loaded");
75 //______________________________________________________________________________
76 AliMpManuStore* AliMpManuStore::ReadData(const AliMpDataStreams& dataStreams,
79 /// Load the DDL store from ASCII data files
80 /// and return its instance
84 AliWarningClass("Manu Store has been already loaded");
88 if ( dataStreams.GetReadFromFiles() )
89 AliInfoClass("Reading Manu Store from ASCII files.");
91 fgInstance = new AliMpManuStore(dataStreams);
100 //______________________________________________________________________________
101 AliMpManuStore::AliMpManuStore(const AliMpDataStreams& dataStreams)
103 fkDataStreams(dataStreams),
109 /// Standard constructor
113 // Check if DE store is loaded
114 if ( ! AliMpDEStore::Instance(false) ) {
116 << "Mapping segmentation has not be loaded. Cannont load Manu store"
124 //______________________________________________________________________________
125 AliMpManuStore::AliMpManuStore(TRootIOCtor* ioCtor)
127 fkDataStreams(ioCtor),
133 /// Constructor for IO
139 //______________________________________________________________________________
140 AliMpManuStore::~AliMpManuStore()
153 //______________________________________________________________________________
154 Bool_t AliMpManuStore::ReadData(const AliMpDetElement* de, Int_t& nofManus)
156 /// Read manu serial numbers for the given detection element
158 Int_t deId = de->GetId();
159 TString deName = de->GetDEName();
160 AliMp::StationType stationType
161 = AliMpDEManager::GetStationType(de->GetId());
162 AliMq::Station12Type station12Type
163 = AliMpDEManager::GetStation12Type(de->GetId());
165 // Nothing to be done for trigger
166 if ( stationType == AliMp::kStationTrigger ) {
171 static Int_t manuMask = AliMpConstants::ManuMask(AliMp::kNonBendingPlane);
176 AliMpFiles::ManuToSerialPath(deName, stationType, station12Type));
181 while ( in.getline(line,80) ) {
183 if ( line[0] == '#' ) continue;
185 TString tmp(AliMpHelper::Normalize(line));
187 TObjArray* stringList = tmp.Tokenize(TString(" "));
189 Int_t manuId = atoi( ((TObjString*)stringList->At(0))->GetName());
190 Int_t manuSerial = atoi( ((TObjString*)stringList->At(2))->GetName());
192 TString sPlane = ((TObjString*)stringList->At(1))->GetString();
194 // filling manuId <> manuSerial
195 if (!sPlane.CompareTo(PlaneTypeName(AliMp::kBendingPlane)))
196 AddManu(deId, manuId, manuSerial);
198 AddManu(deId, manuId + manuMask, manuSerial);
210 //______________________________________________________________________________
211 Bool_t AliMpManuStore::ReadManuSerial()
213 /// Read data files for all detection elements.
214 /// Return true if reading was successful.
220 for ( it.First(); ! it.IsDone(); it.Next() ) {
222 AliMpDetElement* detElement = it.CurrentDE();
225 Bool_t result = ReadData(detElement, nofManus);
226 fNofManusInDE.Add(detElement->GetId(), nofManus);
227 fNofManus += nofManus;
230 << "Adding " << nofManus << " manus for de "
231 << detElement->GetId() << endl;
233 isOk = isOk && result;
239 //______________________________________________________________________________
240 void AliMpManuStore::ReplaceManu(Int_t detElemId, Int_t manuId, Int_t serialNb)
242 /// Replace manu in the map.
243 /// As TExMap has no replcae function, we have to rebuild map once again.
244 /// Not yet in use, declared private.
246 Long_t index = AliMp::Pair(detElemId, manuId);
248 TExMap newManuToSerialNbs;
250 TExMapIter it(&fManuToSerialNbs);
252 #if ROOT_SVN_REVISION >= 29598
259 while ( ( it.Next(key, value) ) ) {
262 newManuToSerialNbs.Add(key, value);
264 newManuToSerialNbs.Add(index, Long_t(serialNb));
267 TExMap newSerialNbToManus;
269 TExMapIter it2(&fSerialNbToManus);
270 while ( ( it2.Next(key, value) ) ) {
272 if ( value != index )
273 newSerialNbToManus.Add(key, value);
275 newSerialNbToManus.Add(Long_t(serialNb), index);
278 // And now replace the maps
279 fManuToSerialNbs = newManuToSerialNbs;
280 fSerialNbToManus = newManuToSerialNbs;
284 //______________________________________________________________________________
285 Bool_t AliMpManuStore::WriteData(const TString& outDir)
287 /// Write data files for all detection elements.
288 /// Return true if reading was successful.
289 /// Not yet in use, declared private.
291 TString curDir = gSystem->pwd();
293 // Create top directory
295 if ( gSystem->OpenDirectory(outDir.Data()) ) {
297 << "Directory " << outDir.Data() << " already exists" << endl;
301 AliDebugStream(2) << "Making directory " << outDir.Data() << endl;
302 gSystem->mkdir(outDir.Data());
307 for ( it.First(); ! it.IsDone(); it.Next() ) {
309 AliMpDetElement* detElement = it.CurrentDE();
310 Int_t detElemId = detElement->GetId();
311 TString deName = detElement->GetDEName();
312 AliMp::StationType stationType
313 = AliMpDEManager::GetStationType(detElemId);
314 AliMq::Station12Type station12Type
315 = AliMpDEManager::GetStation12Type(detElemId);
317 if ( stationType == AliMp::kStationTrigger ) continue;
319 // Create directory if it does not yet exist
321 TString dirPath = outDir + AliMpFiles::StationDataDir(stationType, station12Type);
322 if ( ! gSystem->OpenDirectory(dirPath.Data()) ) {
323 AliDebugStream(2) << "Making directory " << dirPath.Data() << endl;
324 gSystem->mkdir(dirPath.Data());
327 // Compose output file path
329 string dataPath = AliMpFiles::ManuToSerialPath(deName, stationType, station12Type).Data();
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);
333 TString dataPath1 = dataPath;
334 TString filePath = outDir + "/" + dataPath1;
338 ofstream out(filePath.Data());
339 if ( ! out.good() ) {
341 << "Cannot open output file " << filePath.Data() << endl;
346 TExMapIter it2(&fManuToSerialNbs);
347 #if ROOT_SVN_REVISION >= 29598
354 while ( ( it2.Next(key, value) ) ) {
355 Int_t pairFirst = AliMp::PairFirst(key);
357 if ( pairFirst != detElemId ) continue;
359 Int_t manuId = AliMp::PairSecond(key);
362 << "Go to write " << key << " "
363 << pairFirst << " " << manuId << " " << value << endl;
365 static Int_t manuMask = AliMpConstants::ManuMask(AliMp::kNonBendingPlane);
367 TString planeName = PlaneTypeName(AliMp::kBendingPlane);
368 if ( manuId> manuMask ) {
369 planeName = PlaneTypeName(AliMp::kNonBendingPlane);
372 out << manuId << " " << planeName.Data() << " " << value << endl;
375 << manuId << " " << planeName.Data() << " " << value << endl;
388 //______________________________________________________________________________
389 Int_t AliMpManuStore::NofManus() const
391 /// Return total number of manus in the store
397 //______________________________________________________________________________
398 Int_t AliMpManuStore::NofManus(Int_t detElemId) const
400 /// Return number of manus in given detection element
402 if ( ! AliMpDEManager::IsValidDetElemId(detElemId, kTRUE) ) return 0;
404 return fNofManusInDE.GetValue(detElemId);
407 //______________________________________________________________________________
408 Bool_t AliMpManuStore::AddManu(Int_t detElemId, Int_t manuId, Int_t serialNb)
410 /// Add manu to the map
412 Long_t index = AliMp::Pair(detElemId, manuId);
415 << "Adding (" << detElemId << "," << manuId
416 << ") as index=" << index << " and serialNb=" << serialNb << endl;
418 fManuToSerialNbs.Add(index, Long_t(serialNb));
420 Long_t value = fSerialNbToManus.GetValue(Long_t(serialNb));
422 if ( fgWarnIfDoublon ) {
424 << "Serial number " << serialNb
425 << " already present for (detElemId, manuId) = " ;
426 AliMp::PairPut(AliWarningStream(), (MpPair_t) value) << endl;
431 fSerialNbToManus.Add(Long_t(serialNb), index);
437 //______________________________________________________________________________
438 Int_t AliMpManuStore::GetManuSerial(Int_t detElemId, Int_t manuId) const
440 /// Return manu serial number for given detElemId and manuId
442 Long_t index = AliMp::Pair(detElemId, manuId);
443 // cout << index << " " << fManuToSerialNbs.GetValue(index) << endl;
445 return fManuToSerialNbs.GetValue(index);
448 //______________________________________________________________________________
449 MpPair_t AliMpManuStore::GetDetElemIdManu(Int_t manuSerial) const
451 /// Return detElemId and manuId for given manu serial number
454 return fSerialNbToManus.GetValue(Long_t(manuSerial));