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 "AliMUONGeometryBuilder.h"
41 ClassImp(AliMUONVGeometryBuilder)
43 //______________________________________________________________________________
44 AliMUONVGeometryBuilder::AliMUONVGeometryBuilder(
45 Int_t moduleId1, Int_t moduleId2,
46 Int_t moduleId3, Int_t moduleId4,
47 Int_t moduleId5, Int_t moduleId6)
52 // Standard constructor
54 // Create the module geometries array
55 fGeometryModules = new TObjArray();
58 fGeometryModules->Add(new AliMUONGeometryModule(moduleId1));
61 fGeometryModules->Add(new AliMUONGeometryModule(moduleId2));
64 fGeometryModules->Add(new AliMUONGeometryModule(moduleId3));
67 fGeometryModules->Add(new AliMUONGeometryModule(moduleId4));
70 fGeometryModules->Add(new AliMUONGeometryModule(moduleId5));
73 fGeometryModules->Add(new AliMUONGeometryModule(moduleId6));
76 //______________________________________________________________________________
77 AliMUONVGeometryBuilder::AliMUONVGeometryBuilder()
82 // Default constructor
86 //______________________________________________________________________________
87 AliMUONVGeometryBuilder::AliMUONVGeometryBuilder(const AliMUONVGeometryBuilder& rhs)
90 // Protected copy constructor
92 AliFatal("Copy constructor is not implemented.");
95 //______________________________________________________________________________
96 AliMUONVGeometryBuilder::~AliMUONVGeometryBuilder() {
98 if (fGeometryModules) {
99 fGeometryModules->Clear(); // Sets pointers to 0 since it is not the owner
100 delete fGeometryModules;
104 //______________________________________________________________________________
105 AliMUONVGeometryBuilder&
106 AliMUONVGeometryBuilder::operator = (const AliMUONVGeometryBuilder& rhs)
108 // Protected assignement operator
110 // check assignement to self
111 if (this == &rhs) return *this;
113 AliFatal("Assignment operator is not implemented.");
122 //______________________________________________________________________________
124 AliMUONVGeometryBuilder::ConvertTransform(const TGeoHMatrix& transform) const
126 // Convert transformation into the reference frame
128 if ( fReferenceFrame.IsIdentity() )
131 return AliMUONGeometryBuilder::Multiply( fReferenceFrame,
133 fReferenceFrame.Inverse() );
137 //______________________________________________________________________________
139 AliMUONVGeometryBuilder::ConvertDETransform(const TGeoHMatrix& transform) const
141 // Convert transformation into the reference frame
143 if ( fReferenceFrame.IsIdentity() )
146 return AliMUONGeometryBuilder::Multiply( fReferenceFrame,
151 //______________________________________________________________________________
152 TString AliMUONVGeometryBuilder::ComposePath(const TString& volName,
155 // Compose path from given volName and copyNo
158 TString path(volName);
165 //______________________________________________________________________________
166 void AliMUONVGeometryBuilder::MapSV(const TString& path0,
167 const TString& volName, Int_t detElemId) const
169 // Update the path with all daughters volumes recursively
170 // and map it to the detection element Id if it is a sensitive volume
173 // Get module sensitive volumes map
174 Int_t moduleId = AliMUONGeometryStore::GetModuleId(detElemId);
175 AliMUONGeometrySVMap* svMap = GetSVMap(moduleId);
177 Int_t nofDaughters = gMC->NofVolDaughters(volName);
178 if (nofDaughters == 0) {
180 // Get the name of the last volume in the path
181 Ssiz_t npos1 = path0.Last('/')+1;
182 Ssiz_t npos2 = path0.Last('.');
183 TString volName(path0(npos1, npos2-npos1));
185 // Check if it is sensitive volume
186 Int_t moduleId = AliMUONGeometryStore::GetModuleId(detElemId);
187 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
188 if (geometry->IsSensitiveVolume(volName)) {
189 //cout << ".. adding to the map "
190 // << path0 << " " << detElemId << endl;
192 // Map the sensitive volume to detection element
193 svMap->Add(path0, detElemId);
198 for (Int_t i=0; i<nofDaughters; i++) {
199 Int_t copyNo = gMC->VolDaughterCopyNo(volName, i);
200 TString newName = gMC->VolDaughterName(volName, i);
202 TString path = path0;
204 path += ComposePath(newName, copyNo);
206 MapSV(path, newName, detElemId);
214 //______________________________________________________________________________
215 AliMUONGeometryModule*
216 AliMUONVGeometryBuilder::GetGeometry(Int_t moduleId) const
218 // Returns the module geometry specified by moduleId
221 for (Int_t i=0; i<fGeometryModules->GetEntriesFast(); i++) {
223 AliMUONGeometryModule* geometry
224 = (AliMUONGeometryModule*)fGeometryModules->At(i);
226 if ( geometry->GetModuleId() == moduleId) return geometry;
232 //______________________________________________________________________________
233 AliMUONGeometryEnvelopeStore*
234 AliMUONVGeometryBuilder::GetEnvelopes(Int_t moduleId) const
236 // Returns the envelope store of the module geometry specified by moduleId
239 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
242 AliFatal(Form("Module geometry %d is not defined", moduleId));
246 return geometry->GetEnvelopeStore();
249 //______________________________________________________________________________
250 AliMUONGeometrySVMap*
251 AliMUONVGeometryBuilder::GetSVMap(Int_t moduleId) const
253 // Returns the transformation store of the module geometry specified by moduleId
256 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
259 AliFatal(Form("Geometry %d is not defined", moduleId));
263 return geometry->GetSVMap();
266 //______________________________________________________________________________
267 void AliMUONVGeometryBuilder::SetTranslation(Int_t moduleId,
268 const TGeoTranslation& translation)
270 // Sets the translation to the geometry module given by moduleId,
271 // applies reference frame transformation
274 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
277 AliFatal(Form("Geometry %d is not defined", moduleId));
281 // Apply frame transform
282 TGeoHMatrix newTransform = ConvertTransform(translation);
284 // Set new transformation
285 geometry->SetTransformation(newTransform);
289 //______________________________________________________________________________
290 void AliMUONVGeometryBuilder::SetTransformation(Int_t moduleId,
291 const TGeoTranslation& translation,
292 const TGeoRotation& rotation)
294 // Sets the translation to the geometry module given by moduleId,
295 // applies reference frame transformation
298 AliMUONGeometryModule* geometry = GetGeometry(moduleId);
301 AliFatal(Form("Geometry %d is not defined", moduleId));
305 TGeoCombiTrans transformation
306 = TGeoCombiTrans(translation, rotation);
308 // Apply frame transform
309 TGeoHMatrix newTransform = ConvertTransform(transformation);
311 // Set new transformation
312 geometry->SetTransformation(newTransform);
319 //______________________________________________________________________________
320 void AliMUONVGeometryBuilder::SetReferenceFrame(
321 const TGeoCombiTrans& referenceFrame)
323 fReferenceFrame = referenceFrame;
325 for (Int_t i=0; i<fGeometryModules->GetEntriesFast(); i++) {
326 AliMUONGeometryModule* geometry
327 = (AliMUONGeometryModule*)fGeometryModules->At(i);
328 AliMUONGeometryEnvelopeStore* envelopeStore
329 = geometry->GetEnvelopeStore();
331 envelopeStore->SetReferenceFrame(referenceFrame);
336 //______________________________________________________________________________
337 void AliMUONVGeometryBuilder::FillTransformations() const
339 // Fills transformations store from defined geometry.
342 for (Int_t i=0; i<fGeometryModules->GetEntriesFast(); i++) {
343 AliMUONGeometryModule* geometry
344 = (AliMUONGeometryModule*)fGeometryModules->At(i);
345 const TObjArray* envelopes
346 = geometry->GetEnvelopeStore()->GetEnvelopes();
348 AliMUONGeometryStore* detElements
349 = geometry->GetTransformer()->GetDetElementStore();
351 for (Int_t j=0; j<envelopes->GetEntriesFast(); j++) {
352 AliMUONGeometryEnvelope* envelope
353 = (AliMUONGeometryEnvelope*)envelopes->At(j);
355 // skip envelope not corresponding to detection element
356 if ( envelope->GetUniqueID() == 0) continue;
359 Int_t detElemId = envelope->GetUniqueID();
360 TString path = ComposePath(envelope->GetName(),
361 envelope->GetCopyNo());
362 const TGeoCombiTrans* transform = envelope->GetTransformation();
364 // Apply frame transform
365 TGeoHMatrix localTransform = ConvertDETransform(*transform);
367 // Add detection element transformation
368 AliMUONGeometryDetElement* detElement
369 = new AliMUONGeometryDetElement(detElemId, path, localTransform);
370 detElements->Add(detElemId, detElement);
372 // Compose global transformation
373 TGeoHMatrix globalTransform
374 = AliMUONGeometryBuilder::Multiply(
375 (*geometry->GetTransformer()->GetTransformation()),
378 // Set the global transformation to detection element
379 detElement->SetGlobalTransformation(globalTransform);
384 //_____ _________________________________________________________________________
385 void AliMUONVGeometryBuilder::RebuildSVMaps() const
387 // Clear the SV maps in memory and fill them from defined geometry.
390 for (Int_t i=0; i<fGeometryModules->GetEntriesFast(); i++) {
391 AliMUONGeometryModule* geometry
392 = (AliMUONGeometryModule*)fGeometryModules->At(i);
395 geometry->GetSVMap()->Clear();
397 // Fill the map from geometry
398 const TObjArray* envelopes
399 = geometry->GetEnvelopeStore()->GetEnvelopes();
401 for (Int_t j=0; j<envelopes->GetEntriesFast(); j++) {
402 AliMUONGeometryEnvelope* envelope
403 = (AliMUONGeometryEnvelope*)envelopes->At(j);
405 // skip envelope not corresponding to detection element
406 if(envelope->GetUniqueID() == 0) continue;
408 TString path0("/ALIC.1");
409 if (geometry->GetMotherVolume() != "ALIC") {
411 path0 += ComposePath(geometry->GetMotherVolume(), 1);
413 if (! geometry->IsVirtual() ) {
415 path0 += ComposePath(geometry->GetVolume(), 1);
418 if (!envelope->IsVirtual()) {
419 TString path = path0;
421 path += ComposePath(envelope->GetName(), envelope->GetCopyNo());
422 MapSV(path, envelope->GetName(), envelope->GetUniqueID());
425 for (Int_t k=0; k<envelope->GetConstituents()->GetEntriesFast(); k++) {
426 AliMUONGeometryConstituent* constituent
427 = (AliMUONGeometryConstituent*)envelope->GetConstituents()->At(k);
428 TString path = path0;
430 path += ComposePath(constituent->GetName(), constituent->GetCopyNo());
431 MapSV(path, constituent->GetName(), envelope->GetUniqueID());