]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/AliMUONGeometryModule.cxx
disable global transformation for trigger & transform.dat files in new ALICE coordina...
[u/mrichter/AliRoot.git] / MUON / AliMUONGeometryModule.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 //
18 // Class AliMUONGeometryModule
19 // -----------------------------
20 // Class for definition of the detector module parameters
21 // (the transformations of detection elements, mapping between
22 //  sensitive volumes and detection elements).
23 //
24 // Author: Ivana Hrivnacova, IPN Orsay
25
26 #include <TVirtualMC.h>
27 #include <TGeoMatrix.h>
28 #include <TObjArray.h>
29 #include <TArrayI.h>
30 #include <Riostream.h>
31
32 #include "AliLog.h"     
33
34 #include "AliMUONGeometryModule.h"
35 #include "AliMUONGeometryEnvelope.h"
36 #include "AliMUONGeometryEnvelopeStore.h"
37 #include "AliMUONGeometryDetElement.h"  
38 #include "AliMUONGeometryStore.h"       
39 #include "AliMUONGeometrySVMap.h"       
40 #include "AliMUONGeometryDEIndexing.h"
41
42 ClassImp(AliMUONGeometryModule)
43
44 //______________________________________________________________________________
45 AliMUONGeometryModule::AliMUONGeometryModule(Int_t moduleId)
46  : TObject(),
47    fIsVirtual(true),
48    fModuleId(moduleId),
49    fMotherVolume("ALIC"),
50    fVolume("NONE"),
51    fNofSVs(0),
52    fSVVolumeIds(0),
53    fTransformation(0),
54    fEnvelopes(0),
55    fDEIndexing(0),
56    fDetElements(0),
57    fSVMap(0)
58 {
59 /// Standard constructor
60
61   // Chamber transformation
62   fTransformation = new TGeoCombiTrans("");
63
64   // Arrays of volumes Ids
65   fSVVolumeIds = new TArrayI(20);
66
67   // Sensitive volumes map
68   fSVMap = new AliMUONGeometrySVMap(100);
69
70   // Get indexing
71   fDEIndexing = new AliMUONGeometryDEIndexing(fModuleId, 0);
72
73   // Det elements transformation stores
74   fDetElements = new AliMUONGeometryStore(fDEIndexing);
75     
76   // Envelope store
77   fEnvelopes = new AliMUONGeometryEnvelopeStore(fDetElements);  
78 }
79
80
81 //______________________________________________________________________________
82 AliMUONGeometryModule::AliMUONGeometryModule()
83  : TObject(),
84    fIsVirtual(true),
85    fModuleId(0),
86    fMotherVolume(),
87    fVolume(),
88    fNofSVs(0),
89    fSVVolumeIds(0),
90    fTransformation(0),
91    fEnvelopes(0),
92    fDEIndexing(0),
93    fDetElements(0),
94    fSVMap(0)
95 {
96 /// Default constructor
97 }
98
99
100 //______________________________________________________________________________
101 AliMUONGeometryModule::AliMUONGeometryModule(const AliMUONGeometryModule& rhs)
102   : TObject(rhs)
103 {
104 /// Protected copy constructor
105
106   AliFatal("Copy constructor is not implemented.");
107 }
108
109 //______________________________________________________________________________
110 AliMUONGeometryModule::~AliMUONGeometryModule() 
111 {
112 /// Destructor
113
114   delete fTransformation;
115   delete fSVVolumeIds;
116   delete fEnvelopes;
117   delete fDEIndexing;
118   delete fDetElements;
119   delete fSVMap;
120 }
121
122 //______________________________________________________________________________
123 AliMUONGeometryModule& 
124 AliMUONGeometryModule::operator = (const AliMUONGeometryModule& rhs) 
125 {
126 /// Protected assignement operator
127
128   // check assignement to self
129   if (this == &rhs) return *this;
130
131   AliFatal("Assignment operator is not implemented.");
132     
133   return *this;  
134 }
135
136 //
137 // private methods
138 //
139
140 //______________________________________________________________________________
141 Int_t AliMUONGeometryModule::GetSVIndex(Int_t svVolId) const
142 {
143 /// Return the index of the volume specified by volId
144 /// if it is present in the list of sensitive volumes 
145 /// (or -1 if not present).
146  
147   for (Int_t i=0; i<fNofSVs; i++) {
148       if (fSVVolumeIds->At(i) == svVolId) return i;
149   }
150   return -1;
151 }
152
153 //
154 // public methods
155 //
156
157 //______________________________________________________________________________
158 void  AliMUONGeometryModule::Global2Local(Int_t detElemId,
159                                   Float_t xg, Float_t yg, Float_t zg, 
160                                   Float_t& xl, Float_t& yl, Float_t& zl) const
161 {
162 /// Transform point from the global reference frame (ALIC)
163 /// to the local reference frame of the detection element specified
164 /// by detElemId.
165
166   // Get detection element
167   AliMUONGeometryDetElement* detElement = GetDetElement(detElemId);
168   if (!detElement) return;
169    
170   // Transform point
171   detElement->Global2Local(xg, yg, zg, xl, yl, zl);
172 }
173                                   
174 //______________________________________________________________________________
175 void  AliMUONGeometryModule::Global2Local(Int_t detElemId,
176                                   Double_t xg, Double_t yg, Double_t zg, 
177                                   Double_t& xl, Double_t& yl, Double_t& zl) const
178 {
179 /// Transform point from the global reference frame (ALIC)
180 /// to the local reference frame of the detection element specified
181 /// by detElemId.
182
183    // Get detection element
184    AliMUONGeometryDetElement* detElement = GetDetElement(detElemId);
185    if (!detElement) return;
186    
187    // Transform point
188    detElement->Global2Local(xg, yg, zg, xl, yl, zl);
189 }
190                                   
191 //______________________________________________________________________________
192 void  AliMUONGeometryModule::Local2Global(Int_t detElemId,
193                  Float_t xl, Float_t yl, Float_t zl, 
194                  Float_t& xg, Float_t& yg, Float_t& zg) const
195 {
196 /// Transform point from the local reference frame of the detection element 
197 /// specified by detElemId to the global reference frame (ALIC).
198
199   // Get detection element
200   AliMUONGeometryDetElement* detElement = GetDetElement(detElemId);
201   if (!detElement) return;
202    
203    // Transform point
204   detElement->Local2Global(xl, yl, zl, xg, yg, zg);  
205 }
206
207 //______________________________________________________________________________
208 void  AliMUONGeometryModule::Local2Global(Int_t detElemId,
209                  Double_t xl, Double_t yl, Double_t zl, 
210                  Double_t& xg, Double_t& yg, Double_t& zg) const
211 {
212 /// Transform point from the local reference frame of the detection element 
213 /// specified by detElemId to the global reference frame (ALIC).
214
215    // Get detection element
216    AliMUONGeometryDetElement* detElement = GetDetElement(detElemId);
217    if (!detElement) return;
218    
219    // Transform point
220    detElement->Local2Global(xl, yl, zl, xg, yg, zg); 
221 }
222
223 //______________________________________________________________________________
224 void AliMUONGeometryModule::SetVolume(const TString& volumeName)
225
226 /// Set the concrete volume associated with this module.
227 /// The module in not virtual in this case
228
229   fVolume = volumeName;
230   fIsVirtual = false;
231 }
232
233 //______________________________________________________________________________
234 void  AliMUONGeometryModule::SetTranslation(const TGeoTranslation& translation)
235 {
236 /// Set the module position wrt world.
237
238   fTransformation
239     ->SetTranslation(const_cast<Double_t*>(translation.GetTranslation()));
240 }  
241
242 //______________________________________________________________________________
243 void  AliMUONGeometryModule::SetRotation(const TGeoRotation& rotation)
244 {
245 /// Set the module rotation wrt ALIC.
246
247   TGeoRotation* rot = new TGeoRotation();
248   rot->SetMatrix(const_cast<Double_t*>(rotation.GetRotationMatrix()));
249
250   fTransformation->SetRotation(rot);
251 }  
252
253 //______________________________________________________________________________
254 void  AliMUONGeometryModule::SetSensitiveVolume(Int_t svVolId)
255 {
256 /// Add the volume specified by volId to the list of sensitive
257 /// volumes
258   
259   // Resize TArrayI if needed
260   if (fSVVolumeIds->GetSize() == fNofSVs) fSVVolumeIds->Set(2*fNofSVs);
261
262   fSVVolumeIds->AddAt(svVolId, fNofSVs++);
263 }      
264
265 //______________________________________________________________________________
266 void  AliMUONGeometryModule::SetSensitiveVolume(const TString& volName)
267 {
268 /// Add the volume specified by volName to the list of sensitive
269 /// volumes
270
271   SetSensitiveVolume(gMC->VolId(volName));
272 }      
273
274 //______________________________________________________________________________
275 void  AliMUONGeometryModule::SetAlign(Bool_t align)
276 {
277 /// Set alignement option to enevelope store.
278   
279   fEnvelopes->SetAlign(align);
280 }  
281
282 //______________________________________________________________________________
283 AliMUONGeometryDetElement* 
284 AliMUONGeometryModule::FindBySensitiveVolume(const TString& sensVolume) const
285 {
286 /// Find TGeoCombiTrans for the detector element Id specified by aligned volume 
287
288   Int_t detElemId = fSVMap->GetDetElemId(sensVolume);
289
290   if (!detElemId) return 0; 
291         // The specified sensitive volume is not in the map   
292   
293   return (AliMUONGeometryDetElement*)fDetElements->Get(detElemId);
294 }  
295
296 //______________________________________________________________________________
297 Bool_t AliMUONGeometryModule::IsSensitiveVolume(Int_t volId) const
298 {
299 /// Check if the volume specified by volId is present in the list
300 /// of sensitive volumes.
301
302   for (Int_t i=0; i<fNofSVs; i++) {
303       if (fSVVolumeIds->At(i) == volId) return kTRUE;
304   }
305   return kFALSE;
306 }
307
308 //______________________________________________________________________________
309 Bool_t AliMUONGeometryModule::IsSensitiveVolume(const TString& volName) const
310 {
311 /// Check if the volume specified by volName  is present in the list
312 /// of sensitive volumes.
313
314   return IsSensitiveVolume(gMC->VolId(volName));
315 }
316
317 //______________________________________________________________________________
318 AliMUONGeometryDetElement*
319 AliMUONGeometryModule::GetDetElement(Int_t detElemId) const
320 {
321 /// Return the detection element specified by detElemId.
322 /// Give error if detection element is not defined.
323
324    // Get detection element
325    AliMUONGeometryDetElement* detElement
326      = (AliMUONGeometryDetElement*) fDetElements->Get(detElemId);
327
328    if (!detElement) {
329      AliErrorStream() 
330        << "Detection element " << detElemId
331        << " not found in module " << fModuleId << endl;
332      return 0;
333    }  
334
335    return detElement;
336 }