Line data Source code
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 : //-----------------------------------------------------------------------------
17 : /// \class AliMUONSurveyUtil
18 : /// Singleton utility class for the survey processing of the ALICE DiMuon spectrometer
19 : ///
20 : /// This class contains various functions to calculate misalignement parameters
21 : /// from survey data and designed positions of survey targets.
22 : /// Macro also includes a method to get the new AliMUONGeometryTranformer.
23 : ///
24 : /// \author Javier Castillo
25 : //-----------------------------------------------------------------------------
26 :
27 : #include <TClonesArray.h>
28 : #include <TMath.h>
29 : #include <TMatrixDSym.h>
30 : #include <TString.h>
31 :
32 : #include "AliAlignObjMatrix.h"
33 :
34 : #include "AliMUONSurveyUtil.h"
35 : #include "AliMUONGeometryTransformer.h"
36 : #include "AliMUONGeometryModuleTransformer.h"
37 : #include "AliMUONGeometryDetElement.h"
38 : #include "AliMUONGeometryBuilder.h"
39 : #include "AliMpExMap.h"
40 : #include "AliMpExMapIterator.h"
41 :
42 : /// \cond CLASSIMP
43 18 : ClassImp(AliMUONSurveyUtil)
44 : /// \endcond
45 :
46 : int AliMUONSurveyUtil::fgNDetElemCh[10] = {4,4,4,4,18,18,26,26,26,26};
47 : AliMUONSurveyUtil* AliMUONSurveyUtil::fgInstance(0x0);
48 :
49 0 : AliMUONSurveyUtil::~AliMUONSurveyUtil(){
50 0 : printf("WHAT AM I DOING HERE????????????????\n");
51 0 : fgInstance = 0x0;
52 0 : }
53 :
54 : AliMUONSurveyUtil* AliMUONSurveyUtil::Instance() {
55 : /// Return its instance
56 0 : if (!fgInstance)
57 0 : fgInstance = new AliMUONSurveyUtil();
58 :
59 0 : return fgInstance;
60 0 : }
61 :
62 : Bool_t AliMUONSurveyUtil::MatrixToAngles(const Double_t *rot, Double_t *angles)
63 : {
64 : /// Calculates the Euler angles in "x y z" notation
65 : /// using the rotation matrix
66 : /// Returns false in case the rotation angles can not be
67 :
68 : // extracted from the matrix
69 : //
70 0 : if(TMath::Abs(rot[0])<1e-7 || TMath::Abs(rot[8])<1e-7) {
71 0 : printf("Failed to extract roll-pitch-yall angles!");
72 0 : return kFALSE;
73 : }
74 : // Double_t raddeg = TMath::RadToDeg();
75 0 : angles[0]=TMath::ATan2(-rot[5],rot[8]);
76 0 : angles[1]=TMath::ASin(rot[2]);
77 0 : angles[2]=TMath::ATan2(-rot[1],rot[0]);
78 0 : return kTRUE;
79 0 : }
80 :
81 : void AliMUONSurveyUtil::AnglesToMatrix(const Double_t *angles, Double_t *rot)
82 : {
83 : /// Calculates the rotation matrix using the
84 : /// Euler angles in "x y z" notation
85 : ///
86 : // Double_t degrad = TMath::DegToRad();
87 : Double_t degrad = 1.;
88 0 : Double_t sinpsi = TMath::Sin(degrad*angles[0]);
89 0 : Double_t cospsi = TMath::Cos(degrad*angles[0]);
90 0 : Double_t sinthe = TMath::Sin(degrad*angles[1]);
91 0 : Double_t costhe = TMath::Cos(degrad*angles[1]);
92 0 : Double_t sinphi = TMath::Sin(degrad*angles[2]);
93 0 : Double_t cosphi = TMath::Cos(degrad*angles[2]);
94 :
95 0 : rot[0] = costhe*cosphi;
96 0 : rot[1] = -costhe*sinphi;
97 0 : rot[2] = sinthe;
98 0 : rot[3] = sinpsi*sinthe*cosphi + cospsi*sinphi;
99 0 : rot[4] = -sinpsi*sinthe*sinphi + cospsi*cosphi;
100 0 : rot[5] = -costhe*sinpsi;
101 0 : rot[6] = -cospsi*sinthe*cosphi + sinpsi*sinphi;
102 0 : rot[7] = cospsi*sinthe*sinphi + sinpsi*cosphi;
103 0 : rot[8] = costhe*cospsi;
104 0 : }
105 :
106 : Double_t AliMUONSurveyUtil::XpCenter(const Double_t *x, const Double_t *par) const{
107 : /// Returns center x position using x coord. of 2 button targets. + solution.
108 0 : Double_t lCos2Tht = TMath::Cos(2*par[6]);
109 0 : Double_t lSinTht = TMath::Sin(par[6]);
110 :
111 0 : Double_t inSqrt = TMath::Abs((par[0] - par[3])*(par[0] - par[3])
112 0 : -2*(x[0] -x[1])*(x[0] -x[1])
113 0 : +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5])
114 0 : +((par[0] - par[3])*(par[0] - par[3])
115 0 : +(par[1] - par[4])*(par[1] - par[4])
116 0 : +(par[2] - par[5])*(par[2] - par[5]))*lCos2Tht
117 0 : +4*(x[0] - x[1])*(par[2] - par[5])*lSinTht);
118 :
119 0 : if (inSqrt<0) return inSqrt*1e10;
120 :
121 0 : Double_t xD = ((2*(par[0]*par[0]*x[1]
122 0 : -par[0]*par[3]*(x[0] + x[1])
123 0 : +x[1]*par[1]*(par[1] - par[4])
124 0 : +x[0]*(par[3]*par[3] - par[1]*par[4] + par[4]*par[4]))
125 0 : -2*(par[3]*par[3]*par[2]
126 0 : +par[0]*par[0]*par[5]
127 0 : -par[0]*par[3]*(par[2] + par[5])
128 0 : +(par[1] - par[4])*(-par[4]*par[2] +par[1]*par[5]))*lSinTht
129 0 : +TMath::Sqrt(2)*(-par[3]*par[1] + par[0]*par[4])
130 0 : *TMath::Sqrt(inSqrt))
131 0 : /(2*((par[0] - par[3])*(par[0] - par[3]) + (par[1] - par[4])*(par[1] - par[4]))));
132 :
133 : return xD;
134 0 : }
135 :
136 : Double_t AliMUONSurveyUtil::XnCenter(const Double_t *x, const Double_t *par) const{
137 : /// Returns center x position using x coord. of 2 button targets. - solution.
138 0 : Double_t lCos2Tht = TMath::Cos(2*par[6]);
139 0 : Double_t lSinTht = TMath::Sin(par[6]);
140 :
141 0 : Double_t inSqrt = TMath::Abs((par[0] - par[3])*(par[0] - par[3])
142 0 : -2*(x[0] - x[1])*(x[0] - x[1])
143 0 : +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5])
144 0 : +((par[0] - par[3])*(par[0] - par[3])
145 0 : +(par[1] - par[4])*(par[1] - par[4])
146 0 : +(par[2] - par[5])*(par[2] - par[5]))*lCos2Tht
147 0 : +4*(x[0] - x[1])*(par[2] - par[5])*lSinTht);
148 :
149 0 : if (inSqrt<0) return inSqrt*1e10;
150 :
151 0 : Double_t xD = ((2*(par[0]*par[0]*x[1]
152 0 : -par[0]*par[3]*(x[0] + x[1])
153 0 : +x[1]*par[1]*(par[1] - par[4])
154 0 : +x[0]*(par[3]*par[3] - par[1]*par[4] + par[4]*par[4]))
155 0 : -2*(par[3]*par[3]*par[2] + par[0]*par[0]*par[5]
156 0 : -par[0]*par[3]*(par[2] + par[5])
157 0 : +(par[1] - par[4])*(-par[4]*par[2] + par[1]*par[5]))*lSinTht
158 0 : +TMath::Sqrt(2)*(par[3]*par[1] - par[0]*par[4])
159 0 : *TMath::Sqrt(inSqrt))
160 0 : /(2*((par[0] - par[3])*(par[0] - par[3]) + (par[1] - par[4])*(par[1] - par[4]))));
161 :
162 : return xD;
163 0 : }
164 :
165 : Double_t AliMUONSurveyUtil::PhiXpn(const Double_t *x, const Double_t *par) const{
166 : /// Returns phi rot. using x coord. of 2 button targets. +- solution.
167 0 : Double_t inSqrt = TMath::Abs(((par[0] - par[3])*(par[0] - par[3])
168 0 : -2*(x[0] - x[1])*(x[0] - x[1])
169 0 : +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5])
170 0 : +(+(par[0] - par[3])*(par[0] - par[3])
171 0 : +(par[1] - par[4])*(par[1] - par[4])
172 0 : +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6])
173 0 : +4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6])));
174 :
175 0 : if (inSqrt<0) return inSqrt*1e10;
176 :
177 0 : Double_t phix = ((+2*(par[0] - par[3])*(x[0] - x[1])
178 0 : -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6])
179 0 : +TMath::Sqrt(2)*(par[1] - par[4])
180 0 : *TMath::Sqrt(inSqrt))
181 0 : /(2*(+(par[0] - par[3])*(par[0] - par[3])
182 0 : +(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));
183 :
184 0 : phix = -TMath::ACos(phix);
185 :
186 : return phix;
187 0 : }
188 :
189 : Double_t AliMUONSurveyUtil::PhiXpp(const Double_t *x, const Double_t *par) const{
190 : /// Returns phi rot. using x coord. of 2 button targets. ++ solution.
191 0 : Double_t inSqrt = TMath::Abs(+(par[0] - par[3])*(par[0] - par[3])
192 0 : -2*(x[0] - x[1])*(x[0] - x[1])
193 0 : +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5])
194 0 : +(+(par[0] - par[3])*(par[0] - par[3])
195 0 : +(par[1] - par[4])*(par[1] - par[4])
196 0 : +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6])
197 0 : +4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6]));
198 :
199 0 : if (inSqrt<0) return inSqrt*1e10;
200 :
201 0 : Double_t phix = ((+2*(par[0] - par[3])*(x[0] - x[1])
202 0 : -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6])
203 0 : +TMath::Sqrt(2)*(par[1] - par[4])
204 0 : *TMath::Sqrt(inSqrt))
205 0 : /(2*(+(par[0] - par[3])*(par[0] - par[3])
206 0 : +(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));
207 :
208 0 : phix = TMath::ACos(phix);
209 :
210 : return phix;
211 0 : }
212 :
213 : Double_t AliMUONSurveyUtil::PhiXnn(const Double_t *x, const Double_t *par) const{
214 : /// Returns phi rot. using x coord. of 2 button targets. -- solution.
215 0 : Double_t inSqrt = TMath::Abs(+(par[0] - par[3])*(par[0] - par[3])
216 0 : -2*(x[0] - x[1])*(x[0] - x[1])
217 0 : +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5])
218 0 : +(+(par[0] - par[3])*(par[0] - par[3])
219 0 : +(par[1] - par[4])*(par[1] - par[4])
220 0 : +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6])
221 0 : + 4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6]));
222 :
223 0 : if (inSqrt<0) return inSqrt*1e10;
224 :
225 0 : Double_t phix = (+(+2*(par[0] - par[3])*(x[0] - x[1])
226 0 : -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6])
227 0 : +TMath::Sqrt(2)*(-par[1] + par[4])
228 0 : *TMath::Sqrt(inSqrt))
229 0 : /(2*(+(par[0] - par[3])*(par[0] - par[3])
230 0 : +(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));
231 :
232 0 : phix = -TMath::ACos(phix);
233 :
234 : return phix;
235 0 : }
236 :
237 : Double_t AliMUONSurveyUtil::PhiXnp(const Double_t *x, const Double_t *par) const{
238 : /// Returns phi rot. using x coord. of 2 button targets. +- solution.
239 0 : Double_t inSqrt = TMath::Abs(+(par[0] - par[3])*(par[0] - par[3])
240 0 : -2*(x[0] - x[1])*(x[0] - x[1])
241 0 : +(par[1] - par[4] + par[2] - par[5])*(par[1] - par[4] - par[2] + par[5])
242 0 : +(+(par[0] - par[3])*(par[0] - par[3])
243 0 : +(par[1] - par[4])*(par[1] - par[4])
244 0 : +(par[2] - par[5])*(par[2] - par[5]))*TMath::Cos(2*par[6])
245 0 : +4*(x[0] - x[1])*(par[2] - par[5])*TMath::Sin(par[6]));
246 :
247 0 : if (inSqrt<0) return inSqrt*1e10;
248 :
249 0 : Double_t phix = (+(+2*(par[0] - par[3])*(x[0] - x[1])
250 0 : -2*(par[0] - par[3])*(par[2] - par[5])*TMath::Sin(par[6])
251 0 : +TMath::Sqrt(2)*(-par[1] + par[4])
252 0 : *TMath::Sqrt(inSqrt))
253 0 : /(2*(+(par[0] - par[3])*(par[0] - par[3])
254 0 : +(par[1] - par[4])*(par[1] - par[4]))*TMath::Cos(par[6])));
255 :
256 0 : phix = TMath::ACos(phix);
257 :
258 : return phix;
259 0 : }
260 :
261 : Double_t AliMUONSurveyUtil::YpCenter(const Double_t *x, const Double_t *par) const{
262 : /// Returns center y position using y coord. of 2 button targets. + solution.
263 :
264 : // par : x1l, y1l, z1l, x2l, y2l, z2, lpsi, tht,
265 0 : Double_t lCosPsi = TMath::Cos(par[6]);
266 0 : Double_t lSinPsi = TMath::Sin(par[6]);
267 0 : Double_t lCosTht = TMath::Cos(par[7]);
268 0 : Double_t lSinTht = TMath::Sin(par[7]);
269 :
270 0 : Double_t yD = ((1./((par[0] - par[3])*(par[0] - par[3]) + (par[1] - par[4])*(par[1] - par[4])))
271 0 : *(+par[3]*par[3]*x[0]
272 0 : +par[0]*par[0]*x[1]
273 0 : -par[0]*par[3]*(x[0] + x[1])
274 0 : +(par[1] - par[4])*(-x[0]*par[4] + par[1]*x[1])
275 0 : +(par[3]*par[3]*par[2]
276 0 : +par[0]*par[0]*par[5]
277 0 : -par[0]*par[3]*(par[2] + par[5])
278 0 : +(par[1] - par[4])*(-par[4]*par[2] + par[1]*par[5]))*lCosTht*lSinPsi
279 0 : +(-par[3]*par[1] + par[0]*par[4])
280 0 : *TMath::Sqrt(-(x[0] - x[1]
281 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
282 0 : *(x[0] - x[1]
283 : +(par[2] - par[5])*lCosTht*lSinPsi)
284 0 : + ((par[0] - par[3])*(par[0] - par[3])
285 0 : +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi
286 0 : +lSinPsi*lSinPsi*lSinTht*lSinTht))));
287 :
288 0 : return yD;
289 : }
290 :
291 : Double_t AliMUONSurveyUtil::PhiYpn(const Double_t *x, const Double_t *par) const{
292 : /// Returns phi rot. using y coord. of 2 button targets. +- solution.
293 :
294 0 : Double_t lCosPsi = TMath::Cos(par[6]);
295 0 : Double_t lSinPsi = TMath::Sin(par[6]);
296 0 : Double_t lCosTht = TMath::Cos(par[7]);
297 0 : Double_t lSinTht = TMath::Sin(par[7]);
298 :
299 0 : Double_t phiy = ((lCosPsi*((par[1] - par[4])*(x[0] - x[1])
300 0 : +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi
301 0 : +(-par[0] + par[3])
302 0 : *TMath::Sqrt(-(x[0] - x[1]
303 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
304 0 : *(x[0] - x[1]
305 : +(par[2] - par[5])*lCosTht*lSinPsi)
306 0 : +(+(par[0] - par[3])*(par[0] - par[3])
307 0 : +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi
308 0 : +lSinPsi*lSinPsi*lSinTht*lSinTht)))
309 0 : +lSinPsi*lSinTht*((par[0] - par[3])*(x[0] - x[1])
310 0 : +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi
311 0 : +(par[1] - par[4])
312 0 : *TMath::Sqrt(-(x[0] - x[1]
313 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
314 0 : *(x[0] - x[1]
315 : +(par[2] - par[5])*lCosTht*lSinPsi)
316 0 : + ((par[0] - par[3])*(par[0] - par[3])
317 0 : +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi
318 : +lSinPsi*lSinPsi*lSinTht*lSinTht))))
319 0 : /((+(par[0] - par[3])*(par[0] - par[3])
320 0 : +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi
321 : +lSinPsi*lSinPsi*lSinTht*lSinTht)));
322 :
323 0 : phiy = -TMath::ACos(phiy);
324 :
325 :
326 0 : return phiy;
327 : }
328 :
329 : Double_t AliMUONSurveyUtil::PhiYpp(const Double_t *x, const Double_t *par) const{
330 : /// Returns phi rot. using y coord. of 2 button targets. ++ solution.
331 :
332 0 : Double_t lCosPsi = TMath::Cos(par[6]);
333 0 : Double_t lSinPsi = TMath::Sin(par[6]);
334 0 : Double_t lCosTht = TMath::Cos(par[7]);
335 0 : Double_t lSinTht = TMath::Sin(par[7]);
336 :
337 0 : Double_t phiy = ((lCosPsi*((par[1] - par[4])*(x[0] - x[1])
338 0 : +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi
339 0 : +(-par[0] + par[3])
340 0 : *TMath::Sqrt(-(x[0] - x[1]
341 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
342 0 : *(x[0] - x[1]
343 : +(par[2] - par[5])*lCosTht*lSinPsi)
344 0 : +((par[0] - par[3])*(par[0] - par[3])
345 0 : +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi
346 0 : +lSinPsi*lSinPsi*lSinTht*lSinTht)))
347 0 : +lSinPsi*lSinTht*((par[0] - par[3])*(x[0] - x[1])
348 0 : +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi
349 0 : +(par[1] - par[4])*TMath::Sqrt(-(x[0] - x[1]
350 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
351 0 : *(x[0] - x[1]
352 : +(par[2] - par[5])*lCosTht*lSinPsi)
353 0 : +((par[0] - par[3])*(par[0] - par[3])
354 0 : +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi
355 : +lSinPsi*lSinPsi*lSinTht*lSinTht))))
356 0 : /(((par[0] - par[3])*(par[0] - par[3])
357 0 : +(par[1] - par[4])*(par[1] - par[4]))*(lCosPsi*lCosPsi
358 : +lSinPsi*lSinPsi*lSinTht*lSinTht)));
359 :
360 0 : phiy = TMath::ACos(phiy);
361 :
362 0 : return phiy;
363 : }
364 :
365 : Double_t AliMUONSurveyUtil::YnCenter(const Double_t *x, const Double_t *par) const{
366 : /// Returns center y position using y coord. of 2 button targets. - solution.
367 0 : Double_t lCosPsi = TMath::Cos(par[6]);
368 0 : Double_t lSinPsi = TMath::Sin(par[6]);
369 0 : Double_t lCosTht = TMath::Cos(par[7]);
370 0 : Double_t lSinTht = TMath::Sin(par[7]);
371 :
372 0 : Double_t yD = ((1./(+(par[0] - par[3])*(par[0] - par[3])
373 0 : +(par[1] - par[4])*(par[1] - par[4])))
374 0 : *(+par[3]*par[3]*x[0]
375 0 : +par[0]*par[0]*x[1]
376 0 : -par[0]*par[3]*(x[0] + x[1])
377 0 : +(par[1] - par[4])*(-x[0]*par[4] + par[1]*x[1])
378 0 : +(+par[3]*par[3]*par[2]
379 0 : +par[0]*par[0]*par[5]
380 0 : -par[0]*par[3]*(par[2] + par[5])
381 0 : +(par[1] - par[4])*(-par[4]*par[2] + par[1]*par[5]))*lCosTht*lSinPsi
382 0 : +(par[3]*par[1] - par[0]*par[4])
383 0 : *TMath::Sqrt(-(+x[0] - x[1]
384 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
385 0 : *(x[0] - x[1]
386 : +(par[2] - par[5])*lCosTht*lSinPsi)
387 0 : +((par[0] - par[3])*(par[0] - par[3])
388 0 : +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi
389 0 : +lSinPsi*lSinPsi*lSinTht*lSinTht))));
390 :
391 0 : return yD;
392 : }
393 :
394 :
395 : Double_t AliMUONSurveyUtil::PhiYnn(const Double_t *x, const Double_t *par) const{
396 : /// Returns phi rot. using y coord. of 2 button targets. -- solution.
397 :
398 0 : Double_t lCosPsi = TMath::Cos(par[6]);
399 0 : Double_t lSinPsi = TMath::Sin(par[6]);
400 0 : Double_t lCosTht = TMath::Cos(par[7]);
401 0 : Double_t lSinTht = TMath::Sin(par[7]);
402 :
403 0 : Double_t phiy = ((lCosPsi*(+(par[1] - par[4])*(x[0] - x[1])
404 0 : +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi
405 0 : +(par[0] - par[3])
406 0 : *TMath::Sqrt(-(x[0] - x[1]
407 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
408 0 : *(x[0] - x[1]
409 : +(par[2] - par[5])*lCosTht*lSinPsi)
410 0 : +(+(par[0] - par[3])*(par[0] - par[3])
411 0 : +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi
412 0 : +lSinPsi*lSinPsi*lSinTht*lSinTht)))
413 0 : +lSinPsi*lSinTht*(+(par[0] - par[3])*(x[0] - x[1])
414 0 : +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi
415 0 : +(-par[1] + par[4])
416 0 : *TMath::Sqrt(-(x[0] - x[1]
417 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
418 0 : *(x[0] - x[1]
419 : +(par[2] - par[5])*lCosTht*lSinPsi)
420 0 : +(+(par[0] - par[3])*(par[0] - par[3])
421 0 : +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi
422 : +lSinPsi*lSinPsi*lSinTht*lSinTht))))
423 0 : /((+(par[0] - par[3])*(par[0] - par[3])
424 0 : +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi
425 : +lSinPsi*lSinPsi*lSinTht*lSinTht)));
426 :
427 0 : phiy = -TMath::ACos(phiy);
428 :
429 0 : return phiy;
430 : }
431 :
432 :
433 : Double_t AliMUONSurveyUtil::PhiYnp(const Double_t *x, const Double_t *par) const{
434 : /// Returns phi rot. using y coord. of 2 button targets. -+ solution.
435 :
436 0 : Double_t lCosPsi = TMath::Cos(par[6]);
437 0 : Double_t lSinPsi = TMath::Sin(par[6]);
438 0 : Double_t lCosTht = TMath::Cos(par[7]);
439 0 : Double_t lSinTht = TMath::Sin(par[7]);
440 :
441 0 : Double_t phiy = ((lCosPsi*(+(par[1] - par[4])*(x[0] - x[1])
442 0 : +(par[1] - par[4])*(par[2] - par[5])*lCosTht*lSinPsi
443 0 : +(par[0] - par[3])
444 0 : *TMath::Sqrt(-(x[0] - x[1]
445 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
446 0 : *(x[0] - x[1]
447 : +(par[2] - par[5])*lCosTht*lSinPsi)
448 0 : +((par[0] - par[3])*(par[0] - par[3])
449 0 : +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi
450 0 : +lSinPsi*lSinPsi*lSinTht*lSinTht)))
451 0 : +lSinPsi*lSinTht*(+(par[0] - par[3])*(x[0] - x[1])
452 0 : +(par[0] - par[3])*(par[2] - par[5])*lCosTht*lSinPsi
453 0 : +(-par[1] + par[4])
454 0 : *TMath::Sqrt(-(x[0] - x[1]
455 0 : +(par[2] - par[5])*lCosTht*lSinPsi)
456 0 : *(x[0] - x[1]
457 : +(par[2] - par[5])*lCosTht*lSinPsi)
458 0 : +((par[0] - par[3])*(par[0] - par[3])
459 0 : +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi
460 : +lSinPsi*lSinPsi*lSinTht*lSinTht))))
461 0 : /((+(par[0] - par[3])*(par[0] - par[3])
462 0 : +(par[1] - par[4])*(par[1] - par[4]))*(+lCosPsi*lCosPsi
463 : +lSinPsi*lSinPsi*lSinTht*lSinTht)));
464 :
465 0 : phiy = TMath::ACos(phiy);
466 :
467 0 : return phiy;
468 : }
469 :
470 : Double_t AliMUONSurveyUtil::ZnCenter(const Double_t *x, const Double_t *par) const{
471 : /// Returns center z position using z coord. of 2 button targets. - solution.
472 :
473 : // par : x1l, y1l, z1l, x2l, y2l, z2l, psi, tht
474 0 : Double_t lCosPsi = TMath::Cos(par[6]);
475 0 : Double_t lSinPsi = TMath::Sin(par[6]);
476 0 : Double_t lCosTht = TMath::Cos(par[7]);
477 0 : Double_t lSinTht = TMath::Sin(par[7]);
478 :
479 0 : Double_t inSqrt = ((par[3]*par[1] - par[0]*par[4])*(par[3]*par[1] - par[0]*par[4])
480 0 : *((-(x[0] - x[1])*(x[0] - x[1]))
481 0 : +(((par[0] - par[3])*(par[0] - par[3])
482 0 : +(par[1] - par[4])*(par[1] - par[4])))*lSinPsi*lSinPsi
483 0 : +lCosPsi*((-(par[2] - par[5]))
484 0 : *lCosTht*(-2*x[0]+2*x[1]
485 0 : +(par[2] - par[5])*lCosPsi*lCosTht)
486 0 : +((par[0] - par[3])*(par[0] - par[3])
487 0 : +(par[1] - par[4])*(par[1] - par[4]))*lCosPsi*lSinTht*lSinTht)));
488 :
489 0 : if (inSqrt<0) return inSqrt*1e10;
490 :
491 0 : Double_t zD = ((1./((par[0] - par[3])*(par[0] - par[3])
492 : +(par[1] - par[4])*(par[1] - par[4])))
493 0 : *(-par[1]*par[4]*x[0]
494 0 : +par[4]*par[4]*x[0]
495 0 : +par[0]*par[0]*x[1]
496 0 : +par[1]*par[1]*x[1]
497 0 : -par[1]*par[4]*x[1]
498 0 : -par[0]*par[3]*(x[0] + x[1])
499 0 : +par[3]*par[3]*x[0]
500 0 : +(+par[1]*par[4]*par[2]
501 0 : -par[4]*par[4]*par[2]
502 0 : -par[0]*par[0]*par[5]
503 0 : -par[1]*par[1]*par[5]
504 0 : +par[1]*par[4]*par[5]
505 0 : +par[0]*par[3]*(par[2] + par[5])
506 0 : -par[3]*par[3]*par[2])*lCosPsi*lCosTht
507 0 : -TMath::Sqrt(inSqrt)));
508 :
509 : return zD;
510 0 : }
511 :
512 : Double_t AliMUONSurveyUtil::ZpCenter(const Double_t *x, const Double_t *par) const{
513 : /// Returns center z position using z coord. of 2 button targets. + solution.
514 :
515 : // par : x1l, y1l, z1l, x2l, y2l, z2l, psi, tht
516 0 : Double_t lCosPsi = TMath::Cos(par[6]);
517 0 : Double_t lSinPsi = TMath::Sin(par[6]);
518 0 : Double_t lCosTht = TMath::Cos(par[7]);
519 0 : Double_t lSinTht = TMath::Sin(par[7]);
520 :
521 0 : Double_t inSqrt = ((par[3]*par[1] - par[0]*par[4])*(par[3]*par[1] - par[0]*par[4])
522 0 : *((-(x[0] - x[1])*(x[0] - x[1]))
523 0 : +(((par[0] - par[3])*(par[0] - par[3])
524 0 : +(par[1] - par[4])*(par[1] - par[4])))*lSinPsi*lSinPsi
525 0 : +lCosPsi*((-(par[2] - par[5]))
526 0 : *lCosTht*(-2*x[0]+2*x[1]
527 0 : +(par[2] - par[5])*lCosPsi*lCosTht)
528 0 : +((par[0] - par[3])*(par[0] - par[3])
529 0 : +(par[1] - par[4])*(par[1] - par[4]))*lCosPsi*lSinTht*lSinTht)));
530 :
531 0 : if (inSqrt<0) return inSqrt*1e10;
532 :
533 0 : Double_t zD = ((1./((par[0] - par[3])*(par[0] - par[3])
534 : +(par[1] - par[4])*(par[1] - par[4])))
535 0 : *(-par[1]*par[4]*x[0]
536 0 : +par[4]*par[4]*x[0]
537 0 : +par[0]*par[0]*x[1]
538 0 : +par[1]*par[1]*x[1]
539 0 : -par[1]*par[4]*x[1]
540 0 : -par[0]*par[3]*(x[0] + x[1])
541 0 : +par[3]*par[3]*x[0]
542 0 : +(+par[1]*par[4]*par[2]
543 0 : -par[4]*par[4]*par[2]
544 0 : -par[0]*par[0]*par[5]
545 0 : -par[1]*par[1]*par[5]
546 0 : +par[1]*par[4]*par[5]
547 0 : +par[0]*par[3]*(par[2] + par[5])
548 0 : -par[3]*par[3]*par[2])*lCosPsi*lCosTht
549 0 : +TMath::Sqrt(inSqrt)));
550 :
551 : return zD;
552 0 : }
553 :
554 : //______________________________________________________________________
555 : AliMUONGeometryTransformer* AliMUONSurveyUtil::ReAlign(const AliMUONGeometryTransformer * transformer,
556 : int rMod, int rNDetElems, int rDetElemPseudoIdToDetElem[], TGeoCombiTrans deltaDetElemTransf[], Bool_t verbose)
557 : {
558 : /////////////////////////////////////////////////////////////////////
559 : /// Takes the internal geometry module transformers, copies them
560 : /// and gets the Detection Elements from them.
561 : /// Takes misalignment parameters and applies these
562 : /// to the local transform of the Detection Element
563 : /// Obtains the global transform by multiplying the module transformer
564 : /// transformation with the local transformation
565 : /// Applies the global transform to a new detection element
566 : /// Adds the new detection element to a new module transformer
567 : /// Adds the new module transformer to a new geometry transformer
568 : /// Returns the new geometry transformer
569 :
570 : Int_t iDetElemId = 0;
571 : Int_t iDetElemPseudoId = 0;
572 :
573 : AliMUONGeometryTransformer *newGeometryTransformer =
574 0 : new AliMUONGeometryTransformer();
575 0 : for (Int_t iMt = 0; iMt < transformer->GetNofModuleTransformers(); iMt++) {
576 : // module transformers
577 : const AliMUONGeometryModuleTransformer *kModuleTransformer =
578 0 : transformer->GetModuleTransformer(iMt, true);
579 :
580 : AliMUONGeometryModuleTransformer *newModuleTransformer =
581 0 : new AliMUONGeometryModuleTransformer(iMt);
582 0 : newGeometryTransformer->AddModuleTransformer(newModuleTransformer);
583 :
584 0 : TGeoCombiTrans moduleTransform =
585 0 : TGeoCombiTrans(*kModuleTransformer->GetTransformation());
586 : // New module transformation
587 : TGeoCombiTrans *newModuleTransform;
588 0 : if ((rMod<4 && iMt==rMod) || (rMod>=4 && (iMt==4+(rMod-4)*2||iMt==4+(rMod-4)*2+1))) {
589 0 : newModuleTransform = new TGeoCombiTrans(moduleTransform*deltaDetElemTransf[rNDetElems]);
590 0 : } else {
591 0 : newModuleTransform = new TGeoCombiTrans(moduleTransform);
592 : }
593 0 : newModuleTransformer->SetTransformation(*newModuleTransform);
594 :
595 : // For the selected chamber add misalign module
596 0 : if ((rMod<4 && iMt==rMod) || (rMod>=4 && (iMt==4+(rMod-4)*2||iMt==4+(rMod-4)*2+1))) {
597 : // Get delta transformation:
598 : // Tdelta = Tnew * Told.inverse
599 0 : TGeoHMatrix deltaModuleTransform =
600 0 : AliMUONGeometryBuilder::Multiply(*newModuleTransform,
601 0 : kModuleTransformer->GetTransformation()->Inverse());
602 : // Create module mis alignment matrix
603 0 : newGeometryTransformer
604 0 : ->AddMisAlignModule(kModuleTransformer->GetModuleId(), deltaModuleTransform);
605 0 : }
606 :
607 0 : AliMpExMap *detElements = kModuleTransformer->GetDetElementStore();
608 :
609 0 : if (verbose)
610 0 : printf("%i DEs in old GeometryStore %i\n",detElements->GetSize(), iMt);
611 : TGeoCombiTrans *deltaLocalTransform;
612 0 : TIter next(detElements->CreateIterator());
613 : AliMUONGeometryDetElement *detElement;
614 0 : while ((detElement = static_cast<AliMUONGeometryDetElement*>(next()))){
615 : /// make a new detection element
616 : AliMUONGeometryDetElement *newDetElement =
617 0 : new AliMUONGeometryDetElement(detElement->GetId(),
618 0 : detElement->GetVolumePath());
619 0 : TString lDetElemName(detElement->GetDEName());
620 0 : lDetElemName.ReplaceAll("DE","");
621 0 : iDetElemId = lDetElemName.Atoi();
622 0 : iDetElemPseudoId = iDetElemId%100;
623 0 : if ((rMod<4 && iMt==rMod) || (rMod>=4 && (iMt==4+(rMod-4)*2||iMt==4+(rMod-4)*2+1))) {
624 0 : deltaLocalTransform = new TGeoCombiTrans(deltaDetElemTransf[rDetElemPseudoIdToDetElem[iDetElemPseudoId]]);
625 0 : } else {
626 0 : deltaLocalTransform = new TGeoCombiTrans(*gGeoIdentity);
627 : }
628 :
629 : // local transformation of this detection element.
630 0 : TGeoCombiTrans localTransform
631 0 : = TGeoCombiTrans(*detElement->GetLocalTransformation());
632 : // TGeoHMatrix newLocalMatrix = localTransform * (*deltaLocalTransform);
633 0 : TGeoCombiTrans newLocalTransform
634 0 : = TGeoCombiTrans(localTransform * (*deltaLocalTransform));
635 0 : newDetElement->SetLocalTransformation(newLocalTransform);
636 : // global transformation
637 0 : TGeoHMatrix newGlobalTransform =
638 0 : AliMUONGeometryBuilder::Multiply(*newModuleTransform,
639 : newLocalTransform);
640 0 : newDetElement->SetGlobalTransformation(newGlobalTransform);
641 :
642 : // add this det element to module
643 0 : newModuleTransformer->GetDetElementStore()->Add(newDetElement->GetId(),
644 0 : newDetElement);
645 :
646 : // In the Alice Alignment Framework misalignment objects store
647 : // global delta transformation
648 : // Get detection "intermediate" global transformation
649 0 : TGeoHMatrix newOldGlobalTransform = (*newModuleTransform) * localTransform;
650 : // Get detection element global delta transformation:
651 : // Tdelta = Tnew * Told.inverse
652 0 : TGeoHMatrix deltaGlobalTransform
653 0 : = AliMUONGeometryBuilder::Multiply(newGlobalTransform,
654 0 : newOldGlobalTransform.Inverse());
655 :
656 : // Create mis alignment matrix
657 0 : newGeometryTransformer
658 0 : ->AddMisAlignDetElement(detElement->GetId(), deltaGlobalTransform);
659 0 : }
660 :
661 0 : if (verbose)
662 0 : printf("Added module transformer %i to the transformer\n", iMt);
663 0 : newGeometryTransformer->AddModuleTransformer(newModuleTransformer);
664 0 : }
665 0 : return newGeometryTransformer;
666 0 : }
667 :
668 : void AliMUONSurveyUtil::SetAlignmentResolution(const TClonesArray* misAlignArray, Int_t chId, Double_t chResX, Double_t chResY, Double_t deResX, Double_t deResY){
669 : /// Sets the alignment resolution to the AliAlignObjMatrix correlation matrix
670 :
671 0 : TMatrixDSym mChCorrMatrix(6);
672 0 : mChCorrMatrix[0][0]=chResX*chResX;
673 0 : mChCorrMatrix[1][1]=chResY*chResY;
674 : // mChCorrMatrix.Print();
675 :
676 0 : TMatrixDSym mDECorrMatrix(6);
677 0 : mDECorrMatrix[0][0]=deResX*deResX;
678 0 : mDECorrMatrix[1][1]=deResY*deResY;
679 : // mDECorrMatrix.Print();
680 :
681 : AliAlignObjMatrix *alignMat = 0x0;
682 :
683 : // Int_t modId = (chId<4)? chId : 4+(chId-4)*2;
684 0 : TString chName1;
685 0 : TString chName2;
686 0 : if (chId<4){
687 0 : chName1 = Form("GM%d",chId);
688 0 : chName2 = Form("GM%d",chId);
689 : } else {
690 0 : chName1 = Form("GM%d",4+(chId-4)*2);
691 0 : chName2 = Form("GM%d",4+(chId-4)*2+1);
692 : }
693 :
694 0 : for (int i=0; i<misAlignArray->GetEntries(); i++) {
695 0 : alignMat = (AliAlignObjMatrix*)misAlignArray->At(i);
696 0 : TString volName(alignMat->GetSymName());
697 0 : if((volName.Contains(chName1)&&
698 0 : volName.Last('/')<=volName.Index(chName1)+chName1.Length())||
699 0 : (volName.Contains(chName2)&&
700 0 : volName.Last('/')<=volName.Index(chName2)+chName2.Length())) {
701 0 : volName.Remove(0,volName.Last('/')+1);
702 0 : if (volName.Contains("GM")) {
703 : // alignMat->Print("NULL");
704 0 : alignMat->SetCorrMatrix(mChCorrMatrix);
705 0 : } else if (volName.Contains("DE")) {
706 : // alignMat->Print("NULL");
707 0 : alignMat->SetCorrMatrix(mDECorrMatrix);
708 : }
709 : }
710 0 : }
711 0 : }
|