Modyfing debug levels: level 1 only in ctors/dtors.
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpDEManager.cxx
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 // $MpId: AliMpDEManager.cxx,v 1.4 2006/05/24 13:58:34 ivana Exp $
18 // Category: management
19 //
20 // Class AliMpDEManager
21 // --------------------
22 // The manager class for definition of detection element types
23 // Authors: Ivana Hrivnacova, IPN Orsay
24 //          Laurent Aphecetche, SUBATECH Nantes
25
26 #include "AliMpDEManager.h"
27 #include "AliMpConstants.h"
28 #include "AliMpFiles.h"
29 #include "AliMpIntPair.h"
30
31 #include "AliLog.h"
32
33 #include <Riostream.h>
34 #include <TSystem.h>
35 #include <TObjString.h>
36 #include <TMap.h>
37
38 /// \cond CLASSIMP
39 ClassImp(AliMpDEManager)
40 /// \endcond
41
42 const char  AliMpDEManager::fgkNameSeparator = '_'; 
43 const char  AliMpDEManager::fgkCommentPrefix = '#'; 
44 const Int_t AliMpDEManager::fgkCoefficient = 100;
45 AliMpExMap  AliMpDEManager::fgDENamesMap(true);
46 AliMpExMap  AliMpDEManager::fgDECathBNBMap(true);
47 TArrayI     AliMpDEManager::fgNofDEPerChamber(AliMpConstants::NofChambers());
48
49 //______________________________________________________________________________
50
51 AliMpDEManager::~AliMpDEManager()
52 {
53 /// Destructor
54 }
55
56 //
57 // static private methods
58 //
59
60 //______________________________________________________________________________
61 Bool_t AliMpDEManager::IsPlaneType(const TString& planeTypeName)
62 {
63 /// Return true if the planeTypeName corresponds to a valid plane type
64
65   if ( planeTypeName == PlaneTypeName(kBendingPlane) ||
66        planeTypeName == PlaneTypeName(kNonBendingPlane) ) 
67     return true;   
68
69   return false;
70 }  
71
72 //______________________________________________________________________________
73 AliMpPlaneType AliMpDEManager::PlaneType(const TString& planeTypeName)
74 {
75 /// Return plane type for the given planeTypeName                            \n
76 /// Fatal error if planeTypeName is wrong 
77
78   if ( planeTypeName == PlaneTypeName(kBendingPlane) ) 
79     return kBendingPlane;
80
81   if ( planeTypeName == PlaneTypeName(kNonBendingPlane) ) 
82     return kNonBendingPlane;
83
84   // Should never reach this line
85   AliFatalClass(Form("No plane type defined for %s", planeTypeName.Data()));
86   return kBendingPlane;
87 }       
88
89 //______________________________________________________________________________
90 AliMpStationType AliMpDEManager::StationType(const TString& stationTypeName)
91 {
92 /// Return station type for the given stationTypeName                        \n
93 /// Fatal error if stationTypeName is wrong 
94
95   if ( stationTypeName == StationTypeName(kStation1) )
96     return kStation1;
97
98   if ( stationTypeName == StationTypeName(kStation2) )
99     return kStation2;
100
101   if ( stationTypeName == StationTypeName(kStation345) )
102     return kStation345;
103
104   if ( stationTypeName == StationTypeName(kStationTrigger) ) 
105     return kStationTrigger;
106
107   // Should never reach this line
108   AliFatalClass(Form("No station type defined for ", stationTypeName.Data()));
109   return kStation1;
110 }
111
112 //______________________________________________________________________________
113 Bool_t
114 AliMpDEManager::ReadDENames(AliMpStationType station)
115
116 /// Read det element names for cath = 0 from the file specified by name
117 /// and fill the map 
118
119   // Open file
120   TString filePath = AliMpFiles::DENamesFilePath(station);
121   std::ifstream in(filePath);
122   if (!in.good()) {
123     AliErrorClassStream() << "Cannot open file " << filePath << endl;;
124     return false;
125   }
126   
127   // Read plane types per cathods
128   //
129   char line[80];
130   TString word;
131   TString cathName1, cathName2;
132   in >> word;
133   while ( ! in.eof() && cathName1.Length() == 0 ) {
134     if ( word[0] == '#' ) 
135       in.getline(line, 80);
136     else { 
137       cathName1 = word;
138       in >> cathName2;
139     }
140     in >> word;
141   }
142   
143   Bool_t isCathNameDefined = false;
144   if ( IsPlaneType(cathName1) &&  IsPlaneType(cathName2) )
145     isCathNameDefined = true;
146     
147   // Read DE names
148   //
149   Int_t detElemId;
150   TString name1, name2;
151   AliMpPlaneType planeForCathode[2];
152   
153   while ( ! in.eof() ) 
154   {
155     if ( word[0] == '#' ) 
156     {
157       in.getline(line, 80);
158     }
159     else 
160     {  
161       detElemId = word.Atoi();
162       in >> name1;
163       // warning : important to check non bending first (=nbp),
164       // as bp is contained within nbp...
165       if ( name1.Contains(PlaneTypeName(kNonBendingPlane)) )
166       {
167         planeForCathode[0] = kNonBendingPlane;
168       }
169       else
170       {
171         planeForCathode[0] = kBendingPlane;
172       }
173       if ( !isCathNameDefined ) 
174       {       
175         in >> name2;
176         // Other cathode is other plane...
177         if ( planeForCathode[0] == kBendingPlane ) 
178         {
179           planeForCathode[1]=kNonBendingPlane;
180         }
181         else
182         {
183           planeForCathode[1]=kBendingPlane;
184         }
185       }
186       else 
187       {
188         name1 += fgkNameSeparator;
189         name2 = name1;
190         name1 += cathName1;
191         name2 += cathName2;
192         if ( name2.Contains(PlaneTypeName(kNonBendingPlane)) )
193         {
194           planeForCathode[1] = kNonBendingPlane;
195         }
196         else
197         {
198           planeForCathode[1] = kBendingPlane;
199         }        
200       }   
201
202       if ( planeForCathode[0]==planeForCathode[1] )
203       {
204         AliFatalClass(Form("Got the same cathode type for both planes"
205                       " of DetElemId %d",detElemId));
206       }
207       
208       if ( ! fgDENamesMap.GetValue(detElemId) ) 
209       {
210         AliDebugClassStream(3)  
211         << "Adding  "  << detElemId << "  " << name1 << "  " << name2 << endl;
212         fgDENamesMap.Add(detElemId, 
213                          new TPair(new TObjString(name1), new TObjString(name2)));
214         fgDECathBNBMap.Add(detElemId,
215                            new AliMpIntPair(planeForCathode[0],planeForCathode[1]));
216         fgNofDEPerChamber[GetChamberId(detElemId)]++;
217       } 
218     } 
219     in >> word;
220   }
221
222   // Close file
223   in.close();
224   
225   return true;
226 }
227
228 //______________________________________________________________________________
229 void AliMpDEManager::FillDENames()
230 {
231 /// Fill DE names from files
232   AliDebugClass(2,"");
233   Bool_t result1 = ReadDENames(kStation1);
234   Bool_t result2 = ReadDENames(kStation2);
235   Bool_t result3 = ReadDENames(kStation345);
236   Bool_t result4 = ReadDENames(kStationTrigger);
237   
238   Bool_t result = result1 && result2 && result3 && result4;
239   if ( ! result ) {
240     AliErrorClassStream() << "Error in reading DE names files" << endl;
241   }  
242 }
243
244 //
245 // static public methods
246 //
247
248 //______________________________________________________________________________
249 Bool_t AliMpDEManager::IsValidDetElemId(Int_t detElemId, Bool_t warn)
250 {
251 /// Return true if detElemId is valid
252 /// (is present in the DE names files)
253
254   if ( fgDENamesMap.GetSize() == 0 ) FillDENames();
255
256   if ( fgDENamesMap.GetValue(detElemId) ) return true;
257
258   if (warn) {
259     AliErrorClassStream() 
260         << "Detection element " << detElemId << " not defined." << endl;
261   }     
262   return false;
263 }    
264
265 //______________________________________________________________________________
266 Bool_t AliMpDEManager::IsValidCathod(Int_t cath, Bool_t warn)
267 {
268 /// Return true if cath is 0 or 1 
269 /// (Better solution would be to use systematically enum)
270
271   if (cath == 0 || cath == 1 ) return true;  
272
273   if (warn)
274     AliErrorClassStream() << "Wrong cathod number " << cath << endl;
275      
276   return false;
277 }    
278
279
280 //______________________________________________________________________________
281 Bool_t AliMpDEManager::IsValid(Int_t detElemId, Int_t cath, Bool_t warn)
282 {
283 /// Return true if both detElemId and cathod number are valid
284
285   return ( IsValidDetElemId(detElemId, warn) && IsValidCathod(cath, warn) );
286 }    
287
288 //______________________________________________________________________________
289 Bool_t AliMpDEManager::IsValidChamberId(Int_t chamberId, Bool_t warn)
290 {
291 /// Return true if chamberId is valid
292
293   if ( chamberId >= 0 && chamberId < AliMpConstants::NofChambers() ) 
294     return true;
295  
296   if (warn) 
297     AliErrorClassStream() << "Wrong chamber Id " << chamberId << endl;
298   
299   return false;
300 }    
301
302 //______________________________________________________________________________
303 Bool_t AliMpDEManager::IsValidGeomModuleId(Int_t moduleId, Bool_t warn)
304 {
305 /// Return true if moduleId is valid
306
307   if ( moduleId >= 0 && moduleId < AliMpConstants::NofGeomModules() ) 
308     return true;
309  
310   if (warn) 
311     AliErrorClassStream() << "Wrong module Id " << moduleId << endl;
312   
313   return false;
314 }    
315
316 //______________________________________________________________________________
317 Int_t 
318 AliMpDEManager::GetCathod(Int_t detElemId, AliMpPlaneType planeType)
319 {
320 /// Return cathod number for given detElemId and planeType
321
322   if ( !IsValidDetElemId(detElemId) ) return -1;
323   AliMpIntPair* pair = 
324     static_cast<AliMpIntPair*>(fgDECathBNBMap.GetValue(detElemId));
325   if ( planeType == pair->GetFirst() )
326   {
327     return 0;
328   }
329   return 1;
330 }
331
332 //______________________________________________________________________________
333 TString AliMpDEManager::GetDEName(Int_t detElemId, Int_t cath, Bool_t warn)
334 {
335 /// Return det element type name
336
337   if ( ! IsValid(detElemId, cath, warn) ) return "undefined";
338
339   TPair* namePair = (TPair*)fgDENamesMap.GetValue(detElemId);
340
341   if (cath == 0) return ((TObjString*)namePair->Key())->GetString();
342   if (cath == 1) return ((TObjString*)namePair->Value())->GetString();
343   
344   return "undefined";
345 }    
346
347 //______________________________________________________________________________
348 TString AliMpDEManager::GetDETypeName(Int_t detElemId, Int_t cath, Bool_t warn) 
349 {
350 /// Return det element type name
351
352   TString fullName = GetDEName(detElemId, cath, warn);  
353   
354   // cut plane type extension
355   Ssiz_t pos = fullName.First(fgkNameSeparator);
356   return fullName(0,pos);
357 }    
358
359 //______________________________________________________________________________
360 Int_t  AliMpDEManager::GetChamberId(Int_t detElemId, Bool_t warn)
361 {
362 /// Return chamber Id for given detElemId
363
364   if ( ! IsValidDetElemId(detElemId, warn) ) return -1;
365   
366   return detElemId/fgkCoefficient - 1;
367 }  
368
369 //______________________________________________________________________________
370 Int_t AliMpDEManager::GetGeomModuleId(Int_t detElemId, Bool_t warn)
371 {
372 /// <pre>
373 /// Get module Id from detection element Id                 
374 /// !!! moduleId != chamberId
375 /// Station 1:   Chamber:  1   Module:  0   Det elements:  100-103
376 ///              Chamber:  2   Module:  1   Det elements:  200-203
377 /// Station 2:   Chamber:  3   Module:  2   Det elements:  300-303
378 ///              Chamber:  4   Module:  3   Det elements:  400-403
379 /// Station 3:   Chamber:  5   Module:  4   Det elements:  500-504, 514-517
380 ///                            Module:  5   Det elements:  505-513,
381 ///              Chamber:  6   Module:  6   Det elements:  600-604, 614-617
382 ///                            Module:  7   Det elements:  605-613
383 /// Station 4:   Chamber:  7   Module:  8   Det elements:  700-706, 720-725
384 ///                            Module:  9   Det elements:  707-719
385 ///              Chamber:  8   Module: 10   Det elements:  800-806, 820-825
386 ///                            Module: 11   Det elements:  807-819
387 /// Station 5:   Chamber:  9   Module: 12   Det elements:  900-906, 920-925
388 ///                            Module: 13   Det elements:  907-919        
389 ///              Chamber: 10   Module: 14   Det elements: 1000-1006,1020-1025
390 ///                            Module: 15   Det elements: 1007-1019
391 /// Station 6:   Chamber: 11   Module: 16   Det elements: 1100-1117
392 ///              Chamber: 12   Module: 17   Det elements: 1200-1217
393 /// Station 7:   Chamber: 13   Module: 18   Det elements: 1300-1317
394 ///              Chamber: 14   Module: 19   Det elements: 1400-1417
395 /// </pre>
396
397   if ( ! IsValidDetElemId(detElemId, warn) ) return -1;
398   
399   return detElemId/fgkCoefficient 
400            + (detElemId >=  505 && detElemId <=  513 || detElemId >= 600 )
401            + (detElemId >=  605 && detElemId <=  613 || detElemId >= 700 )
402            + (detElemId >=  707 && detElemId <=  719 || detElemId >= 800 )
403            + (detElemId >=  807 && detElemId <=  819 || detElemId >= 900 )
404            + (detElemId >=  907 && detElemId <=  919 || detElemId >= 1000 )
405            + (detElemId >= 1007 && detElemId <= 1019 || detElemId >= 1100 ) - 1;
406 }  
407
408 //______________________________________________________________________________
409 AliMpPlaneType  AliMpDEManager::GetPlaneType(Int_t detElemId, Int_t cath)
410 {
411 /// Return plane type                                                      \n
412 /// Failure causes Fatal error - as AliMpPlaneType has no possibility
413 /// to return undefined value
414
415   if ( ! IsValid(detElemId, cath, true) ) {
416     AliFatalClass("Cannot return AliMpPlaneType value.");
417     return kBendingPlane;
418   }  
419
420   TPair* namePair = (TPair*)fgDENamesMap.GetValue(detElemId);
421
422   TString fullName;  
423   if (cath == 0) fullName = ((TObjString*)namePair->Key())->GetString();
424   if (cath == 1) fullName = ((TObjString*)namePair->Value())->GetString();
425   
426   // Get plane type name
427   Ssiz_t pos = fullName.First(fgkNameSeparator);
428   TString planeTypeName = fullName(pos+1,fullName.Length()-pos);
429   
430   return PlaneType(planeTypeName);
431 }    
432
433 //______________________________________________________________________________
434 AliMpStationType AliMpDEManager::GetStationType(Int_t detElemId)
435 {
436 /// Return station type                                                      \n
437 /// Failure causes Fatal error - as AliMpStationType has no possibility
438 /// to return undefined value
439
440   if ( ! IsValidDetElemId(detElemId, true) ) {
441     AliFatalClass("Cannot return AliMpStationType value.");
442     return kStation1;
443   }  
444   
445   Int_t chamberId = GetChamberId(detElemId, false);
446   if ( ! IsValidChamberId(chamberId, true) ) {
447     AliFatalClass("Cannot return AliMpStationType value.");
448     return kStation1;
449   }  
450   
451   if ( chamberId ==  0 || chamberId ==  1 )  return kStation1;
452   if ( chamberId ==  2 || chamberId ==  3 )  return kStation2;
453   if ( chamberId >=  4 && chamberId <=  9 )  return kStation345;
454   if ( chamberId >= 10 && chamberId <= 13 )  return kStationTrigger;
455
456   // Should never get to this line
457   AliFatalClass("Cannot return AliMpStationType value.");
458   return kStation1;
459 }
460
461 //______________________________________________________________________________
462 Int_t AliMpDEManager::GetNofDEInChamber(Int_t chamberId, Bool_t warn)
463 {
464 /// Return the number of detection elements in the chamber with the given 
465 /// chamberId
466
467   if ( fgDENamesMap.GetSize() == 0 ) FillDENames();
468   if (!IsValidChamberId(chamberId,warn) ) return 0;
469   return fgNofDEPerChamber[chamberId];
470 }
471