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 **************************************************************************/
18 // Class AliMUONVGeometryBuilder
19 // -----------------------------
20 // Abstract base class for geometry construction per geometry module(s).
21 // Author: Ivana Hrivnacova, IPN Orsay
24 #include <Riostream.h>
25 #include <TObjArray.h>
27 #include <TGeoMatrix.h>
28 #include <TVirtualMC.h>
30 #include "AliMUONVGeometryBuilder.h"
31 #include "AliMUONGeometryModule.h"
32 #include "AliMUONGeometryDetElement.h"
33 #include "AliMUONGeometryStore.h"
34 #include "AliMUONGeometrySVMap.h"
35 #include "AliMUONGeometryEnvelopeStore.h"
36 #include "AliMUONGeometryEnvelope.h"
37 #include "AliMUONGeometryConstituent.h"
38 #include "AliMUONGeometryDEIndexing.h"
39 #include "AliMUONGeometryBuilder.h"
42 ClassImp(AliMUONVGeometryBuilder)
44 //______________________________________________________________________________
45 AliMUONVGeometryBuilder::AliMUONVGeometryBuilder(
46 Int_t moduleId1, Int_t moduleId2,
47 Int_t moduleId3, Int_t moduleId4,
48 Int_t moduleId5, Int_t moduleId6)
53 // Standard constructor
55 // Create the module geometries array
56 fGeometryModules = new TObjArray();
59 fGeometryModules->Add(new AliMUONGeometryModule(moduleId1));
62 fGeometryModules->Add(new AliMUONGeometryModule(moduleId2));
65 fGeometryModules->Add(new AliMUONGeometryModule(moduleId3));
68 fGeometryModules->Add(new AliMUONGeometryModule(moduleId4));
71 fGeometryModules->Add(new AliMUONGeometryModule(moduleId5));
74 fGeometryModules->Add(new AliMUONGeometryModule(moduleId6));
77 //______________________________________________________________________________
78 AliMUONVGeometryBuilder::AliMUONVGeometryBuilder()
83 // Default constructor
87 //______________________________________________________________________________
88 AliMUONVGeometryBuilder::AliMUONVGeometryBuilder(const AliMUONVGeometryBuilder& rhs)
91 // Protected copy constructor
93 AliFatal("Copy constructor is not implemented.");
96 //______________________________________________________________________________
97 AliMUONVGeometryBuilder::~AliMUONVGeometryBuilder() {
99 if (fGeometryModules) {
100 fGeometryModules->Clear(); // Sets pointers to 0 since it is not the owner
101 delete fGeometryModules;
105 //______________________________________________________________________________
106 AliMUONVGeometryBuilder&
107 AliMUONVGeometryBuilder::operator = (const AliMUONVGeometryBuilder& rhs)
109 // Protected assignement operator
111 // check assignement to self
112 if (this == &rhs) return *this;
114 AliFatal("Assignment operator is not implemented.");
123 //______________________________________________________________________________
125 AliMUONVGeometryBuilder::ConvertTransform(const TGeoHMatrix& transform) const
127 // Convert transformation into the reference frame
129 if ( fReferenceFrame.IsIdentity() )
132 return AliMUONGeometryBuilder::Multiply( fReferenceFrame,
134 fReferenceFrame.Inverse() );
138 //______________________________________________________________________________
140 AliMUONVGeometryBuilder::ConvertDETransform(const TGeoHMatrix& transform) const
142 // Convert transformation into the reference frame
144 if ( fReferenceFrame.IsIdentity() )
147 return AliMUONGeometryBuilder::Multiply( fReferenceFrame,
152 //______________________________________________________________________________
153 TString AliMUONVGeometryBuilder::ComposePath(const TString& volName,
156 // Compose path from given volName and copyNo
159 TString path(volName);
166 //______________________________________________________________________________
167 void AliMUONVGeometryBuilder::MapSV(const TString& path0,
168 const TString& volName, Int_t detElemId) const
170 // Update the path with all daughters volumes recursively
171 // and map it to the detection element Id if it is a sensitive volume
174 // Get module sensitive volumes map
175 Int_t moduleId = AliMUONGeometryDEIndexing::GetModuleId(detElemId);
176 AliMUONGeometrySVMap* svMap = GetSVMap(moduleId);
178 Int_t nofDaughters = gMC->NofVolDaughters(volName);
179 if (nofDaughters == 0) {
181 // Get the name of the last volume in the path
182 Ssiz_t npos1 = path0.Last('/')+1;
183 Ssiz_t npos2 = path0.Last('.');
184 TString volName(path0(npos1, npos2-npos1));
186 // Check if it is sensitive volume
187 Int_t moduleId = AliMUONGeometryDEIndexing::GetModuleId(detElemId);
188 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
189 if (geometry->IsSensitiveVolume(volName)) {
190 //cout << ".. adding to the map "
191 // << path0 << " " << detElemId << endl;
193 // Map the sensitive volume to detection element
194 svMap->Add(path0, detElemId);
199 for (Int_t i=0; i<nofDaughters; i++) {
200 Int_t copyNo = gMC->VolDaughterCopyNo(volName, i);
201 TString newName = gMC->VolDaughterName(volName, i);
203 TString path = path0;
205 path += ComposePath(newName, copyNo);
207 MapSV(path, newName, detElemId);
215 //______________________________________________________________________________
216 AliMUONGeometryModule*
217 AliMUONVGeometryBuilder::GetGeometry(Int_t moduleId) const
219 // Returns the module geometry specified by moduleId
222 for (Int_t i=0; i<fGeometryModules->GetEntriesFast(); i++) {
224 AliMUONGeometryModule* geometry
225 = (AliMUONGeometryModule*)fGeometryModules->At(i);
227 if ( geometry->GetModuleId() == moduleId) return geometry;
233 //______________________________________________________________________________
234 AliMUONGeometryEnvelopeStore*
235 AliMUONVGeometryBuilder::GetEnvelopes(Int_t moduleId) const
237 // Returns the envelope store of the module geometry specified by moduleId
240 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
243 AliFatal(Form("Module geometry %d is not defined", moduleId));
247 return geometry->GetEnvelopeStore();
250 //______________________________________________________________________________
251 AliMUONGeometrySVMap*
252 AliMUONVGeometryBuilder::GetSVMap(Int_t moduleId) const
254 // Returns the transformation store of the module geometry specified by moduleId
257 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
260 AliFatal(Form("Geometry %d is not defined", moduleId));
264 return geometry->GetSVMap();
267 //______________________________________________________________________________
268 void AliMUONVGeometryBuilder::SetTranslation(Int_t moduleId,
269 const TGeoTranslation& translation)
271 // Sets the translation to the geometry module given by moduleId,
272 // applies reference frame transformation
275 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
278 AliFatal(Form("Geometry %d is not defined", moduleId));
282 // Apply frame transform
283 TGeoHMatrix newTransform = ConvertTransform(translation);
285 // Set new transformation
286 geometry->SetTransformation(newTransform);
290 //______________________________________________________________________________
291 void AliMUONVGeometryBuilder::SetTransformation(Int_t moduleId,
292 const TGeoTranslation& translation,
293 const TGeoRotation& rotation)
295 // Sets the translation to the geometry module given by moduleId,
296 // applies reference frame transformation
299 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
302 AliFatal(Form("Geometry %d is not defined", moduleId));
306 TGeoCombiTrans transformation
307 = TGeoCombiTrans(translation, rotation);
309 // Apply frame transform
310 TGeoHMatrix newTransform = ConvertTransform(translation);
312 // Set new transformation
313 geometry->SetTransformation(newTransform);
320 //______________________________________________________________________________
321 void AliMUONVGeometryBuilder::SetReferenceFrame(
322 const TGeoCombiTrans& referenceFrame)
324 fReferenceFrame = referenceFrame;
326 for (Int_t i=0; i<fGeometryModules->GetEntriesFast(); i++) {
327 AliMUONGeometryModule* geometry
328 = (AliMUONGeometryModule*)fGeometryModules->At(i);
329 AliMUONGeometryEnvelopeStore* envelopeStore
330 = geometry->GetEnvelopeStore();
332 envelopeStore->SetReferenceFrame(referenceFrame);
337 //______________________________________________________________________________
338 void AliMUONVGeometryBuilder::FillTransformations() const
340 // Fills transformations store from defined geometry.
343 for (Int_t i=0; i<fGeometryModules->GetEntriesFast(); i++) {
344 AliMUONGeometryModule* geometry
345 = (AliMUONGeometryModule*)fGeometryModules->At(i);
346 const TObjArray* envelopes
347 = geometry->GetEnvelopeStore()->GetEnvelopes();
349 AliMUONGeometryStore* detElements
350 = geometry->GetTransformer()->GetDetElementStore();
352 for (Int_t j=0; j<envelopes->GetEntriesFast(); j++) {
353 AliMUONGeometryEnvelope* envelope
354 = (AliMUONGeometryEnvelope*)envelopes->At(j);
356 // skip envelope not corresponding to detection element
357 if ( envelope->GetUniqueID() == 0) continue;
360 Int_t detElemId = envelope->GetUniqueID();
361 TString path = ComposePath(envelope->GetName(),
362 envelope->GetCopyNo());
363 const TGeoCombiTrans* transform = envelope->GetTransformation();
365 // Apply frame transform
366 TGeoHMatrix localTransform = ConvertDETransform(*transform);
368 // Add detection element transformation
369 AliMUONGeometryDetElement* detElement
370 = new AliMUONGeometryDetElement(detElemId, path, localTransform);
371 detElements->Add(detElemId, detElement);
373 // Compose global transformation
374 TGeoHMatrix globalTransform
375 = AliMUONGeometryBuilder::Multiply(
376 (*geometry->GetTransformer()->GetTransformation()),
379 // Set the global transformation to detection element
380 detElement->SetGlobalTransformation(globalTransform);
385 //_____ _________________________________________________________________________
386 void AliMUONVGeometryBuilder::RebuildSVMaps() const
388 // Clear the SV maps in memory and fill them from defined geometry.
391 for (Int_t i=0; i<fGeometryModules->GetEntriesFast(); i++) {
392 AliMUONGeometryModule* geometry
393 = (AliMUONGeometryModule*)fGeometryModules->At(i);
396 geometry->GetSVMap()->Clear();
398 // Fill the map from geometry
399 const TObjArray* envelopes
400 = geometry->GetEnvelopeStore()->GetEnvelopes();
402 for (Int_t j=0; j<envelopes->GetEntriesFast(); j++) {
403 AliMUONGeometryEnvelope* envelope
404 = (AliMUONGeometryEnvelope*)envelopes->At(j);
406 // skip envelope not corresponding to detection element
407 if(envelope->GetUniqueID() == 0) continue;
409 TString path0("/ALIC.1");
410 if (geometry->GetMotherVolume() != "ALIC") {
412 path0 += ComposePath(geometry->GetMotherVolume(), 1);
414 if (! geometry->IsVirtual() ) {
416 path0 += ComposePath(geometry->GetVolume(), 1);
419 if (!envelope->IsVirtual()) {
420 TString path = path0;
422 path += ComposePath(envelope->GetName(), envelope->GetCopyNo());
423 MapSV(path, envelope->GetName(), envelope->GetUniqueID());
426 for (Int_t k=0; k<envelope->GetConstituents()->GetEntriesFast(); k++) {
427 AliMUONGeometryConstituent* constituent
428 = (AliMUONGeometryConstituent*)envelope->GetConstituents()->At(k);
429 TString path = path0;
431 path += ComposePath(constituent->GetName(), constituent->GetCopyNo());
432 MapSV(path, constituent->GetName(), envelope->GetUniqueID());