1 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
2 * See cxx source for full Copyright notice */
10 Revision 1.1.2.3 2000/06/04 16:35:09 nilsen
11 One more try to fix log comments.
13 Revision 1.1.2.2 2000/03/04 23:39:36 nilsen
16 /* Revision 1.1.2.1 2000/03/02 20:12:23 nilsen */
17 /* A new class usefull for ITS detector Alignment Studdies */
21 // Standard C & C++ libraries
24 // Standard Root Libraries
25 #include <TParticle.h>
28 #include "AliITSgeom.h"
29 #include "AliITSAlignmentTrack.h"
30 #include "AliITSAlignmentModule.h"
32 ClassImp(AliITSAlignmentModule)
34 //______________________________________________________________________
35 AliITSAlignmentModule::AliITSAlignmentModule(){
59 //______________________________________________________________________
60 AliITSAlignmentModule::AliITSAlignmentModule(Int_t index,AliITSgeom *gm,
61 Int_t ntrk,AliITSAlignmentTrack *trk){
66 gm->GetModuleId(index,flay,flad,fdet);
67 gm->GetRotMatrix(index,(Double_t *) &(fM[0][0]));
68 gm->GetTrans(flay,flad,fdet,x,y,z);
69 fx0[0] = (Double_t )x;
70 fx0[1] = (Double_t )y;
71 fx0[2] = (Double_t )z;
72 gm->GetAngles(flay,flad,fdet,x,y,z);
73 fangles[0] = (Double_t )x;
74 fangles[1] = (Double_t )y;
75 fangles[2] = (Double_t )z;
76 ftrksM = new TObjArray();
81 for(j=0;j<trk[i].GetNumberOfClustersSl();j++){
82 if(trk[i].GetIndex(j,index)==findex){
83 ftrksM->AddAtFree((TObject *) &trk[i]);
84 break; // break out of the j loop
89 //______________________________________________________________________
90 Double_t AliITSAlignmentModule::ComputeChi2(){
94 ntrk = ftrksM->GetEntriesFast();
98 ntr =((AliITSAlignmentTrack *)(ftrksM->At(i)))->GetNumberOfClustersSl();
100 fChi2 += (Double_t) ((AliITSAlignmentTrack *)(ftrksM->At(i)))->
107 fChi2 /= (Double_t) n;
112 //______________________________________________________________________
113 void AliITSAlignmentModule::lnsrch(Int_t npar,Double_t *xold,Double_t fold,
114 Double_t *g,Double_t *p,Double_t *x,
115 Double_t &f, Double_t stpmax,Int_t &check){
116 Double_t ALF = 1.0e-4, TOLX = 1.0E-7;
119 Double_t a,alam,alam2=0.0,alamin,b,disc,f2=0.0,rhs1,rhs2,slope,sum,temp,
123 for(sum=0.0,i=0;i<npar;i++) sum += p[i]*p[i];
124 sum = TMath::Sqrt(sum);
125 if(sum>stpmax) for(i=0;i<npar;i++) p[i] *= stpmax/sum;
126 for(slope=0.0,i=0;i<npar;i++) slope += g[i]*p[i];
127 if(slope >=0.0) printf("Error: round off problem in lnsrch.\n");
130 temp = TMath::Abs(p[i])/TMath::Max(TMath::Abs(xold[i]),1.0);
131 if(temp > test) test = temp;
136 for(i=0;i<npar;i++) x[i] = xold[i] + alam*p[i];
139 for(i=0;i<npar;i++) x[i] = xold[i];
142 }else if(f <= fold+ALF*alam*slope) return;
144 if(alam == 1.0) tmplam = -slope/(2.0*(f-fold-slope));
146 rhs1 = f-fold-alam*slope;
147 rhs2 = f2-fold-alam2*slope;
148 a = (rhs1/(alam*alam)-rhs2/(alam2*alam2))/(alam-alam2);
149 b = (-alam2*rhs1/(alam*alam)+alam*rhs2/(alam2*alam2))/(alam*alam);
150 if(a==0.0) tmplam = -slope/(2.0*b);
152 disc = b*b - 3.0*a*slope;
153 if(disc<0.0) tmplam = 0.5*alam;
154 else if(b<=0.0) tmplam = (-b+TMath::Sqrt(disc))/(3.0*a);
155 else tmplam = -slope/(b+TMath::Sqrt(disc));
157 if(tmplam > 0.5*alam) tmplam = 0.5*alam;
158 } // end if alam == 1.0
159 } // end if alam < alamin
162 alam = TMath::Max(tmplam,0.1*alam);
163 } // end for ever loop
166 //______________________________________________________________________
167 void AliITSAlignmentModule::MRVMminimization(Int_t npar,Double_t *p,
168 Double_t &fret,Double_t gtol,
171 Double_t EPS = 3.0e-8, TOLX = 4.0*EPS, STPMX = 100.0;
174 Double_t den,fac,fad,fae,fp,stpmax,sum=0.0,sumdg,sumxi,temp,test;
175 Double_t *dg,*g,*hdg,**hessin,*pnew,*xi;
178 dg = new Double_t[npar];
179 g = new Double_t[npar];
180 hdg = new Double_t[npar];
181 hessin = new Double_t * [npar];
182 for(i=0;i<npar;i++) hessin[i] = new Double_t[npar];
183 pnew = new Double_t[npar];
184 xi = new Double_t[npar];
186 // init function values
191 for(j=0;j<npar;j++) hessin[i][j] = 0.0;
196 stpmax = STPMX*TMath::Max(TMath::Sqrt(sum),(Double_t)(npar+1));
198 for(its=0;its<ITMAX;its++){
200 lnsrch(npar,p,fp,g,xi,pnew,fret,stpmax,check);
203 xi[i] = pnew[i] - p[i];
208 temp = TMath::Abs(xi[i])/TMath::Max(TMath::Abs(p[i]),1.0);
209 if(temp > test) test = temp;
212 for(i=0;i<npar;i++) dg[i] = g[i];
215 den = TMath::Max(fret,1.0);
217 temp = TMath::Abs(g[i])*TMath::Max(TMath::Abs(p[i]),1.0)/den;
218 if(temp>test) test=temp;
221 for(i=0;i<npar;i++) dg[i] = g[i] - dg[i];
224 for(j=0;j<npar;j++) hdg[i] += hessin[i][j]*dg[j];
226 fac = fae = sumdg = sumxi = 0.0;
230 sumdg += TMath::Sqrt(dg[i]);
231 sumxi += TMath::Sqrt(xi[i]);
233 if(fac>TMath::Sqrt(EPS*sumdg*sumxi)){
236 for(i=0;i<npar;i++) dg[i] = fac*xi[i]-fad*hdg[i];
237 for(i=0;i<npar;i++) for(j=i;j<npar;j++){
238 hessin[i][j] += fac*xi[i]*xi[j] - fad*hdg[i]*hdg[j] +
240 hessin[j][i] = hessin[i][j];
245 for(j=0;j<npar;j++) xi[i] -= hessin[i][j]*g[j];
248 if(its==ITMAX) printf("Error: too many iterations\n");
254 for(i=0;i<npar;i++) delete[] hessin[i];
257 //______________________________________________________________________
258 void AliITSAlignmentModule::SetByAngles(Double_t *th){
259 Double_t sx,cx,sy,cy,sz,cz;
261 sx = TMath::Sin(th[0]); cx = TMath::Cos(th[0]);
262 sy = TMath::Sin(th[1]); cy = TMath::Cos(th[1]);
263 sz = TMath::Sin(th[2]); cz = TMath::Cos(th[2]);
264 for(Int_t i=0;i<3;i++) fangles[i] = th[i];
266 fM[0][1] = -cz*sy*sx - sz*cx;
267 fM[0][2] = -cz*sy*cx + sz*sx;
269 fM[1][1] = -sz*sy*sx + cz*cx;
270 fM[1][2] = -sz*sy*cx - cz*sx;
275 //______________________________________________________________________
276 void AliITSAlignmentModule::dfMdthx(Double_t dfMx[3][3]){
277 Double_t sx,cx,sy,cy,sz,cz;
279 sx = TMath::Sin(fangles[0]); cx = TMath::Cos(fangles[0]);
280 sy = TMath::Sin(fangles[1]); cy = TMath::Cos(fangles[1]);
281 sz = TMath::Sin(fangles[2]); cz = TMath::Cos(fangles[2]);
283 dfMx[0][1] = -cz*sy*cx + sz*sx;
284 dfMx[0][2] = cz*sy*sx + sz*cx;
286 dfMx[1][1] = -sz*sy*cx - cz*sx;
287 dfMx[1][2] = sz*sy*sx - cz*cx;
292 //______________________________________________________________________
293 void AliITSAlignmentModule::dfMdthy(Double_t dfMx[3][3]){
294 Double_t sx,cx,sy,cy,sz,cz;
296 sx = TMath::Sin(fangles[0]); cx = TMath::Cos(fangles[0]);
297 sy = TMath::Sin(fangles[1]); cy = TMath::Cos(fangles[1]);
298 sz = TMath::Sin(fangles[2]); cz = TMath::Cos(fangles[2]);
300 dfMx[0][1] = -cz*cy*sx;
301 dfMx[0][2] = -cz*cy*cx;
303 dfMx[1][1] = -sz*cy*sx;
304 dfMx[1][2] = -sz*cy*cx;
309 //______________________________________________________________________
310 void AliITSAlignmentModule::dfMdthz(Double_t dfMx[3][3]){
311 Double_t sx,cx,sy,cy,sz,cz;
313 sx = TMath::Sin(fangles[0]); cx = TMath::Cos(fangles[0]);
314 sy = TMath::Sin(fangles[1]); cy = TMath::Cos(fangles[1]);
315 sz = TMath::Sin(fangles[2]); cz = TMath::Cos(fangles[2]);
317 dfMx[0][1] = sz*sy*sx - cz*cx;
318 dfMx[0][2] = sz*sy*cx + cz*sx;
320 dfMx[1][1] = -cz*sy*sx - sz*cx;
321 dfMx[1][2] = -cz*sy*cx + sz*sx;
326 //______________________________________________________________________
327 void AliITSAlignmentModule::LtoG(Double_t xl[],Double_t xg[]){
330 for(i=0;i<3;i++) xg[i] = fx0[i];
331 for(i=0;i<3;i++)for(Int_t j=0;j<3;j++) xg[i] += fM[j][i]*xl[j];
333 //______________________________________________________________________
334 void AliITSAlignmentModule::GtoL(Double_t xg[],Double_t xl[]){
336 for(i=0;i<3;i++) xl[i] = 0.0;
337 for(i=0;i<3;i++)for(Int_t j=0;j<3;j++)xl[i]+=fM[i][j]*(xg[j]-fx0[j]);
339 //______________________________________________________________________
340 Double_t AliITSAlignmentModule::Chi2(Double_t p[]){
341 Int_t i,j,k,l,n=0,indx;
342 Double_t chi=0.0,xo[3],xi[3],xg[3],Ex[3][3];
343 AliITSAlignmentTrack *tr;
345 for(i=0;i<3;i++) fx0[i] = p[i];
346 SetByAngles(&(p[3]));
348 for(i=0;i<ftrksM->GetEntriesFast();i++) {
349 tr = (AliITSAlignmentTrack *)(ftrksM->At(i));
350 for(j=0;j<tr->GetNumberOfClustersSl();j++){
351 tr->GetIndex(j,indx);
354 tr->GetPointG(j,(Double_t *)xi);
356 tr->GetPointL(j,(Double_t *)xi);
357 tr->GetErrorG(j,(Double_t **)Ex);
359 for(k=0;k<3;k++)for(l=0;l<3;l++)
360 chi += (xg[k] - xo[k])*Ex[k][l]*(xg[l]-xo[l]);
361 } // end if indx==findex
365 return chi/(Double_t)(n-6);
367 //______________________________________________________________________
368 void AliITSAlignmentModule::dChi2(Double_t p[],Double_t dChi2[]){
369 Int_t i,j,k,l,m,n=0,indx;
370 Double_t chi[6]={0.0,0.0,0.0,0.0,0.0,0.0},xo[3],xi[3],xg[3],Ex[3][3];
371 Double_t dxdp[3][6],fMx[3][3],fMy[3][3],fMz[3][3];
372 AliITSAlignmentTrack *tr;
374 for(i=0;i<3;i++) fx0[i] = p[i];
375 SetByAngles(&(p[3]));
379 for(i=0;i<3;i++)for(j=0;j<6;j++) dxdp[i][j] = 0.0;
380 dxdp[0][0] = 1.0; // dx/dx
381 dxdp[1][1] = 1.0; // dy/dy
382 dxdp[2][2] = 1.0; // dz/dz
384 for(i=0;i<ftrksM->GetEntriesFast();i++) {
385 tr = (AliITSAlignmentTrack *)(ftrksM->At(i));
386 for(j=0;j<tr->GetNumberOfClustersSl();j++){
387 tr->GetIndex(j,indx);
390 tr->GetPointG(j,(Double_t *)xi);
392 tr->GetPointL(j,(Double_t *)xi);
393 tr->GetErrorG(j,(Double_t **)Ex);
395 for(m=0;m<3;m++) for(k=0;k<3;k++){
396 dxdp[m][3] += fMx[m][k]*xi[k];
397 dxdp[m][4] += fMy[m][k]*xi[k];
398 dxdp[m][5] += fMz[m][k]*xi[k];
401 for(k=0;k<3;k++)for(l=0;l<3;l++)
402 chi[m] += (xg[k] - xo[k])*Ex[k][l]*dxdp[l][m];
404 } // end if indx==findex
408 for(m=0;m<6;m++) chi[m] /= (Double_t)(n-6);
411 //______________________________________________________________________
412 void AliITSAlignmentModule::AlignModule(){
415 //Double_t p[npar],fret,gtol=1.0E-5;
416 Double_t p[6],fret,gtol=1.0E-5;
418 for(i=0;i<3;i++) {p[i] = fx0[i]; p[i+3] = fangles[i];}
419 MRVMminimization(npar,(Double_t *)p,fret,gtol,iter);
420 for(i=0;i<3;i++) {fx0[i] = p[i]; fangles[i] = p[i+3];}
421 printf("AlignModule #%d:Xt=(%e,%e,%e) cm angles=(%e,%e,%e)rad,"
422 " Chi2=%e loops=%d\n",findex,
423 fx0[0],fx0[1],fx0[2],fangles[0],fangles[1],fangles[2],fret,iter);
425 //______________________________________________________________________
426 void AliITSAlignmentModule::Streamer(TBuffer &R__b){
427 // Stream an object of class AliITSAlignmentModule.
429 if (R__b.IsReading()) {
430 Version_t R__v = R__b.ReadVersion(); if (R__v) { }
431 TObject::Streamer(R__b);
438 // R__b.ReadStaticArray(fx0);
439 // R__b.ReadStaticArray((double*)fM);
440 // R__b.ReadStaticArray(fangles);
442 R__b.WriteVersion(AliITSAlignmentModule::IsA());
443 TObject::Streamer(R__b);
450 // R__b.WriteArray(fx0, 3);
451 // R__b.WriteArray((double*)fM, 9);
452 // R__b.WriteArray(fangles, 3);