- Using AliMUONStringIntMap instead of AliMUONGeometrySVMap
[u/mrichter/AliRoot.git] / MUON / AliMUONGeometry.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *      SigmaEffect_thetadegrees                                                                  *
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 purpeateose. It is      *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 // $Id$
17 //
18 // Class AliMUONGeometry
19 // ----------------------------
20 // Manager class for geometry construction via geometry builders.
21 //
22 // Author: Ivana Hrivnacova, IPN Orsay
23
24 #include "AliMUONGeometry.h"
25 #include "AliMUONGeometryTransformer.h"
26 #include "AliMUONGeometryModule.h"
27 #include "AliMUONStringIntMap.h"
28 #include "AliMUONGeometryStore.h"
29
30 #include "AliLog.h"
31
32 #include <TObjArray.h>
33 #include <Riostream.h>
34 #include <TSystem.h>
35
36 #include <iostream>
37
38 ClassImp(AliMUONGeometry)
39  
40 //______________________________________________________________________________
41 AliMUONGeometry::AliMUONGeometry(Bool_t isOwner)
42   : TObject(),
43     fModules(0),
44     fTransformer(0)
45     
46 {
47 /// Standard constructor
48
49   // Create array for geometry modules
50   fModules = new TObjArray();
51   fModules->SetOwner(isOwner);
52   
53   // Geometry parametrisation
54   fTransformer = new AliMUONGeometryTransformer(false);  
55 }
56
57 //______________________________________________________________________________
58 AliMUONGeometry::AliMUONGeometry() 
59   : TObject(),
60     fModules(0),
61     fTransformer(0)
62 {
63 /// Default constructor
64
65
66 //______________________________________________________________________________
67 AliMUONGeometry::AliMUONGeometry(const AliMUONGeometry& right) 
68   : TObject(right) 
69 {  
70 /// Copy constructor (not implemented)
71
72   AliFatal("Copy constructor not provided.");
73 }
74
75 //______________________________________________________________________________
76 AliMUONGeometry::~AliMUONGeometry()
77 {
78 /// Destructor
79
80   delete fModules;
81   delete fTransformer;
82 }
83
84 //______________________________________________________________________________
85 AliMUONGeometry& 
86 AliMUONGeometry::operator=(const AliMUONGeometry& right)
87 {
88 /// Assignement operator (not implemented)
89
90   // check assignement to self
91   if (this == &right) return *this;
92
93   AliFatal("Assignement operator not provided.");
94     
95   return *this;  
96 }    
97
98 //
99 // private methods
100 //
101
102 //______________________________________________________________________________
103 TString  AliMUONGeometry::ComposePath(const TString& volName, 
104                                        Int_t copyNo) const
105 {
106 // Compose path from given volName and copyNo
107 // ---
108
109   TString path(volName);
110   path += ".";
111   path += copyNo;
112   
113   return path;
114 }  
115
116 //______________________________________________________________________________
117 void AliMUONGeometry::FillData3(const TString& sensVolumePath, 
118                                 Int_t detElemId)
119 {
120 // Fill the mapping of the sensitive volume path to the detection element.
121 // ---
122
123   // Module Id
124   Int_t moduleId = AliMUONGeometryStore::GetModuleId(detElemId);
125     
126   // Get module
127   AliMUONGeometryModule* module 
128     = (AliMUONGeometryModule*)fModules->At(moduleId);
129     
130   if ( !module ) {
131     AliWarningStream()
132       << "Geometry module for det element " << detElemId << " not defined."
133       << endl;
134     return;
135   }    
136     
137   // Get module sensitive volumes map
138   AliMUONStringIntMap* svMap = module->GetSVMap();     
139
140   // Map the sensitive volume to detection element
141   svMap->Add(sensVolumePath, detElemId); 
142 }                  
143   
144 //______________________________________________________________________________
145 TString  AliMUONGeometry::ReadData3(ifstream& in)
146 {
147 // Reads SV maps from a file
148 // Returns true, if reading finished correctly.
149 // ---
150
151   TString key("SV");
152   while ( key == TString("SV") ) {
153
154     // Input data
155     TString   volumePath;
156     Int_t     detElemId;
157   
158     in >> volumePath;
159     in >> detElemId;
160
161     //cout << "volumePath=" << volumePath << "  "
162     //   << "detElemId=" << detElemId    
163     //     << endl;   
164
165     // Fill data
166     FillData3(volumePath, detElemId); 
167      
168     // Go to next line
169     in >> key;
170   } 
171   
172   return key;
173 }
174
175 //______________________________________________________________________________
176 void AliMUONGeometry::WriteData3(ofstream& out) const
177 {
178 // Writes association of sensitive volumes and detection elements
179 // from the sensitive volume map
180 // ---
181
182   for (Int_t i=0; i<fModules->GetEntriesFast(); i++) {
183     AliMUONGeometryModule* geometry 
184       = (AliMUONGeometryModule*)fModules->At(i);
185     AliMUONStringIntMap* svMap
186       = geometry->GetSVMap();
187
188     svMap->Print("SV", out);
189     out << endl;  
190   }    
191 }
192
193 //
194 // public functions
195 //
196
197 //_____________________________________________________________________________
198 void AliMUONGeometry::AddModule(AliMUONGeometryModule* module)
199 {
200 /// Add the geometrymodule to the array
201
202   fModules->Add(module);
203
204   if (module)
205     fTransformer->AddModuleTransformer(module->GetTransformer());
206 }
207
208 //______________________________________________________________________________
209 Bool_t  
210 AliMUONGeometry::ReadSVMap(const TString& fileName)
211 {
212 // Reads the sensitive volume maps from a file
213 // Returns true, if reading finished correctly.
214 // ---
215
216   // No reading
217   // if builder is not associated with any geometry module
218   if (fModules->GetEntriesFast() == 0) return false;
219
220   // File path
221   TString filePath = gSystem->Getenv("ALICE_ROOT");
222   filePath += "/MUON/data/";
223   filePath += fileName;
224   
225   // Open input file
226   ifstream in(filePath, ios::in);
227   if (!in) {
228     cerr << filePath << endl;   
229     AliFatal("File not found.");
230     return false;
231   }
232
233   TString key;
234   in >> key;
235   while ( !in.eof() ) {
236     if (key == TString("SV")) 
237       key = ReadData3(in);
238     else {
239       AliFatal(Form("%s key not recognized",  key.Data()));
240       return false;
241     }
242   }     
243
244   return true;
245 }
246
247 //______________________________________________________________________________
248 Bool_t  
249 AliMUONGeometry::WriteSVMap(const TString& fileName) const
250 {
251 // Writes sensitive volume map into a file
252 // Returns true, if writing finished correctly.
253 // ---
254
255   // No writing
256   // if builder is not associated with any geometry module
257   if (fModules->GetEntriesFast() == 0) return false;
258
259   // File path
260   TString filePath = gSystem->Getenv("ALICE_ROOT");
261   filePath += "/MUON/data/";
262   filePath += fileName;
263   
264   // Open input file
265   ofstream out(filePath, ios::out);
266   if (!out) {
267     cerr << filePath << endl;   
268     AliError("File not found.");
269     return false;
270   }
271 #if !defined (__DECCXX)
272   out.setf(std::ios::fixed);
273 #endif  
274   WriteData3(out);
275   
276   return true;
277 }  
278
279 //_____________________________________________________________________________
280 const AliMUONGeometryModule* 
281 AliMUONGeometry::GetModule(Int_t index, Bool_t warn) const
282 {
283 /// Return the geometry module specified by index
284
285   if (index < 0 || index >= fModules->GetEntriesFast()) {
286     if (warn) {
287       AliWarningStream() 
288         << "Index: " << index << " outside limits" << std::endl;
289     }                    
290     return 0;  
291   }  
292
293   return (const AliMUONGeometryModule*) fModules->At(index);
294 }    
295
296 //_____________________________________________________________________________
297 const AliMUONGeometryModule* 
298 AliMUONGeometry::GetModuleByDEId(Int_t detElemId, Bool_t warn) const
299 {
300 /// Return the geometry module specified by index
301
302   // Get module index
303   Int_t index = AliMUONGeometryStore::GetModuleId(detElemId);
304
305   return GetModule(index, warn);
306 }