]>
Commit | Line | Data |
---|---|---|
89cc3034 | 1 | // $Id$ |
2 | // | |
3 | // Class AliMUONGeometryTransformStore | |
4 | // ------------------------------------ | |
5 | // The class provides the array of transformations of the detection elements | |
6 | // from a defined reference frame to the detection element frame. | |
7 | // (See more in the header file.) | |
8 | // | |
9 | // Author: Ivana Hrivnacova, IPN Orsay | |
10 | ||
11 | #include <Riostream.h> | |
12 | #include <TGeoMatrix.h> | |
13 | #include <TObjString.h> | |
14 | ||
15 | #include "AliMUONGeometryTransformStore.h" | |
16 | ||
17 | ClassImp(AliMUONGeometryTransformStore) | |
18 | ||
19 | const Int_t AliMUONGeometryTransformStore::fgkHemisphere = 50; | |
20 | ||
21 | //______________________________________________________________________________ | |
22 | AliMUONGeometryTransformStore::AliMUONGeometryTransformStore( | |
23 | Int_t firstDetElemId, Int_t nofDetElems, | |
24 | AliMUONGeometrySVMap* svMap) | |
25 | : TObject(), | |
26 | fFirstDetElemId(firstDetElemId), | |
27 | fNofDetElems(nofDetElems), | |
28 | fDETransforms(100), | |
29 | fSVMap(svMap) | |
30 | { | |
31 | // Standard constructor | |
32 | ||
33 | fDETransforms.SetOwner(true); | |
34 | for (Int_t i=0; i<nofDetElems; i++) fDETransforms[i] = 0; | |
35 | } | |
36 | ||
37 | //______________________________________________________________________________ | |
38 | AliMUONGeometryTransformStore::AliMUONGeometryTransformStore() | |
39 | : TObject(), | |
40 | fFirstDetElemId(0), | |
41 | fNofDetElems(0), | |
42 | fDETransforms(), | |
43 | fSVMap(0) | |
44 | { | |
45 | // Default constructor | |
46 | } | |
47 | ||
48 | //______________________________________________________________________________ | |
49 | AliMUONGeometryTransformStore::AliMUONGeometryTransformStore( | |
50 | const AliMUONGeometryTransformStore& rhs) | |
51 | : TObject(rhs) | |
52 | { | |
53 | Fatal("Copy constructor", | |
54 | "Copy constructor is not implemented."); | |
55 | } | |
56 | ||
57 | //______________________________________________________________________________ | |
58 | AliMUONGeometryTransformStore::~AliMUONGeometryTransformStore() { | |
59 | // | |
60 | fDETransforms.Delete(); | |
61 | } | |
62 | ||
63 | //______________________________________________________________________________ | |
64 | AliMUONGeometryTransformStore& | |
65 | AliMUONGeometryTransformStore::operator = (const AliMUONGeometryTransformStore& rhs) | |
66 | { | |
67 | // check assignement to self | |
68 | if (this == &rhs) return *this; | |
69 | ||
70 | Fatal("operator=", | |
71 | "Assignment operator is not implemented."); | |
72 | ||
73 | return *this; | |
74 | } | |
75 | ||
76 | // | |
77 | // private methods | |
78 | // | |
79 | ||
80 | //______________________________________________________________________________ | |
81 | Int_t AliMUONGeometryTransformStore::GetDetElementIndex(Int_t detElemId) const | |
82 | { | |
83 | // Returns the index of detector element specified by detElemId | |
84 | // --- | |
85 | ||
86 | Int_t index = detElemId - fFirstDetElemId; | |
87 | if (index >= fgkHemisphere) | |
88 | index -= fgkHemisphere - fNofDetElems/2; | |
89 | ||
90 | return index; | |
91 | } | |
92 | ||
93 | //______________________________________________________________________________ | |
94 | Int_t AliMUONGeometryTransformStore::GetDetElementId(Int_t detElemIndex) const | |
95 | { | |
96 | // Returns the ID of detector element specified by index | |
97 | // --- | |
98 | ||
99 | Int_t detElemId = detElemIndex; | |
100 | ||
101 | if (detElemIndex >= fNofDetElems/2) | |
102 | detElemId += fgkHemisphere - fNofDetElems/2; | |
103 | ||
104 | detElemId += fFirstDetElemId; | |
105 | ||
106 | return detElemId; | |
107 | } | |
108 | ||
109 | ||
110 | // | |
111 | // public methods | |
112 | // | |
113 | ||
114 | //______________________________________________________________________________ | |
115 | void AliMUONGeometryTransformStore::Add(Int_t detElemId, | |
116 | const TString& alignedVolume, | |
117 | const TGeoCombiTrans& transform) | |
118 | { | |
119 | // Add transformation specified by alignedVolume in the array | |
120 | // if this alignedVolume is not yet present. | |
121 | // --- | |
122 | ||
123 | TGeoCombiTrans* newTransform = new TGeoCombiTrans(transform); | |
124 | newTransform->SetName(alignedVolume); | |
125 | ||
126 | //cout << ".. adding " << detElemId | |
127 | // << " index: " << GetDetElementIndex(detElemId) << endl; | |
128 | ||
129 | // Add to the map | |
130 | if ( !Get(detElemId)) { | |
131 | ||
132 | newTransform->SetUniqueID(detElemId); | |
133 | // Set detector element id as unique id | |
134 | ||
135 | fDETransforms.AddAt(newTransform, GetDetElementIndex(detElemId)); | |
136 | } | |
137 | else | |
138 | Warning("Add", "The aligned volume %s is already present", | |
139 | alignedVolume.Data()); | |
140 | } | |
141 | ||
142 | //______________________________________________________________________________ | |
143 | void AliMUONGeometryTransformStore::Print(Option_t* /*option*/) const | |
144 | { | |
145 | // Prints the detector elements transformations | |
146 | // --- | |
147 | ||
148 | for (Int_t i=0; i<fDETransforms.GetEntriesFast(); i++) { | |
149 | ||
150 | cout << "DetElemId: " << GetDetElementId(i); | |
151 | ||
152 | TGeoCombiTrans* matrix = (TGeoCombiTrans*)fDETransforms.At(i); | |
153 | cout << " name: " << matrix->GetName() << endl; | |
154 | ||
155 | const double* translation = matrix->GetTranslation(); | |
156 | cout << " translation: " | |
a6de0a61 | 157 | #if defined (__DECCXX) |
158 | << translation[0] << ", " | |
159 | << translation[1] << ", " | |
160 | << translation[2] << endl; | |
161 | #else | |
89cc3034 | 162 | << std::fixed |
163 | << std::setw(7) << std::setprecision(4) << translation[0] << ", " | |
164 | << std::setw(7) << std::setprecision(4) << translation[1] << ", " | |
165 | << std::setw(7) << std::setprecision(4) << translation[2] << endl; | |
a6de0a61 | 166 | #endif |
89cc3034 | 167 | |
168 | const double* rotation = matrix->GetRotationMatrix(); | |
169 | cout << " rotation matrix: " | |
a6de0a61 | 170 | #if defined (__DECCXX) |
171 | << rotation[0] << ", " << rotation[1] << ", " << rotation[2] << endl | |
172 | << " " | |
173 | << rotation[3] << ", " << rotation[4] << ", " << rotation[5] << endl | |
174 | << " " | |
175 | << rotation[6] << ", " << rotation[7] << ", " << rotation[8] << endl; | |
176 | #else | |
89cc3034 | 177 | << std::fixed |
178 | << std::setw(7) << std::setprecision(4) | |
179 | << rotation[0] << ", " << rotation[1] << ", " << rotation[2] << endl | |
180 | << " " | |
181 | << rotation[3] << ", " << rotation[4] << ", " << rotation[5] << endl | |
182 | << " " | |
183 | << rotation[6] << ", " << rotation[7] << ", " << rotation[8] << endl; | |
a6de0a61 | 184 | #endif |
89cc3034 | 185 | } |
186 | } | |
187 | ||
188 | //______________________________________________________________________________ | |
189 | const TGeoCombiTrans* | |
190 | AliMUONGeometryTransformStore::Get(Int_t detElemId) const | |
191 | { | |
192 | // Returns transformation for the specified detector element Id | |
193 | // --- | |
194 | ||
195 | Int_t index = GetDetElementIndex(detElemId); | |
196 | ||
197 | if ( index >= 0 && index < fNofDetElems ) | |
198 | return (const TGeoCombiTrans*)fDETransforms.At(index); | |
199 | else { | |
200 | Warning("Get","Index %d out of limits", index); | |
201 | return 0; | |
202 | } | |
203 | } | |
204 | ||
205 | //______________________________________________________________________________ | |
206 | const TGeoCombiTrans* | |
207 | AliMUONGeometryTransformStore::FindBySensitiveVolume(const TString& sensVolume) const | |
208 | { | |
209 | // Finds TGeoCombiTrans for the detector element Id specified by aligned volume | |
210 | // --- | |
211 | ||
212 | Int_t detElemId = fSVMap->GetDetElemId(sensVolume); | |
213 | ||
214 | if (!detElemId) return 0; | |
215 | // The specified sensitive volume is not in the map | |
216 | ||
217 | return Get(detElemId); | |
218 | } | |
219 |