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 **************************************************************************/
16 //-----------------------------------------------------------------
17 // Implementation of the derived class for track residuals
18 // based on linear chi2 minimization (in approximation of
19 // small alignment angles and translations)
21 //-----------------------------------------------------------------
24 #include <TGeoMatrix.h>
27 #include "AliAlignObj.h"
28 #include "AliTrackPointArray.h"
29 #include "AliTrackResidualsFast.h"
31 ClassImp(AliTrackResidualsFast)
33 //______________________________________________________________________________
34 AliTrackResidualsFast::AliTrackResidualsFast():AliTrackResiduals()
36 // Default constructor
37 for (Int_t i = 0; i < 27; i++) fSum[i] = 0;
41 //______________________________________________________________________________
42 AliTrackResidualsFast::AliTrackResidualsFast(Int_t ntracks):
43 AliTrackResiduals(ntracks)
46 for (Int_t i = 0; i < 27; i++) fSum[i] = 0;
50 //______________________________________________________________________________
51 AliTrackResidualsFast::AliTrackResidualsFast(const AliTrackResidualsFast &res):
52 AliTrackResiduals(res)
55 for (Int_t i = 0; i < 27; i++) fSum[i] = res.fSum[i];
59 //______________________________________________________________________________
60 AliTrackResidualsFast &AliTrackResidualsFast::operator= (const AliTrackResidualsFast& res)
62 // Assignment operator
63 ((AliTrackResiduals *)this)->operator=(res);
64 for (Int_t i = 0; i < 27; i++) fSum[i] = res.fSum[i];
70 //______________________________________________________________________________
71 Bool_t AliTrackResidualsFast::Minimize()
73 // Implementation of fast linear Chi2
74 // based minimization of track residuals sum
75 for (Int_t i = 0; i < 27; i++) fSum[i] = 0;
80 for (Int_t itrack = 0; itrack < fLast; itrack++) {
81 if (!fVolArray[itrack] || !fTrackArray[itrack]) continue;
82 for (Int_t ipoint = 0; ipoint < fVolArray[itrack]->GetNPoints(); ipoint++) {
83 fVolArray[itrack]->GetPoint(p1,ipoint);
84 fTrackArray[itrack]->GetPoint(p2,ipoint);
93 // for (Int_t itrack = 0; itrack < fLast; itrack++) {
94 // if (!fVolArray[itrack] || !fTrackArray[itrack]) continue;
95 // for (Int_t ipoint = 0; ipoint < fVolArray[itrack]->GetNPoints(); ipoint++) {
96 // fVolArray[itrack]->GetPoint(p1,ipoint);
97 // fAlignObj->Transform(p1);
98 // fTrackArray[itrack]->GetPoint(p2,ipoint);
99 // Float_t residual = p2.GetResidual(p1,kFALSE);
103 // printf("Final chi2 = %f\n",chi2);
106 //______________________________________________________________________________
107 void AliTrackResidualsFast::AddPoints(AliTrackPoint &p, AliTrackPoint &pprime)
109 // Update the sums used for
110 // the linear chi2 minimization
111 Float_t xyz[3],xyzp[3];
112 Float_t cov[6],covp[6];
113 p.GetXYZ(xyz,cov); pprime.GetXYZ(xyzp,covp);
115 mcov(0,0) = cov[0]; mcov(0,1) = cov[1]; mcov(0,2) = cov[2];
116 mcov(1,0) = cov[1]; mcov(1,1) = cov[3]; mcov(1,2) = cov[4];
117 mcov(2,0) = cov[2]; mcov(2,1) = cov[4]; mcov(2,2) = cov[5];
118 TMatrixDSym mcovp(3);
119 mcovp(0,0) = covp[0]; mcovp(0,1) = covp[1]; mcovp(0,2) = covp[2];
120 mcovp(1,0) = covp[1]; mcovp(1,1) = covp[3]; mcovp(1,2) = covp[4];
121 mcovp(2,0) = covp[2]; mcovp(2,1) = covp[4]; mcovp(2,2) = covp[5];
122 TMatrixDSym msum = mcov + mcovp;
124 if (!msum.IsValid()) return;
127 sums(0,0) = (xyzp[0]-xyz[0]);
128 sums(1,0) = (xyzp[1]-xyz[1]);
129 sums(2,0) = (xyzp[2]-xyz[2]);
130 TMatrixD sumst = sums.T(); sums.T();
133 mf(0,0) = 1; mf(1,0) = 0; mf(2,0) = 0;
134 mf(0,1) = 0; mf(1,1) = 1; mf(2,1) = 0;
135 mf(0,2) = 0; mf(1,2) = 0; mf(2,2) = 1;
136 mf(0,3) = 0; mf(1,3) =-xyz[2]; mf(2,3) = xyz[1];
137 mf(0,4) = xyz[2]; mf(1,4) = 0; mf(2,4) =-xyz[0];
138 mf(0,5) =-xyz[1]; mf(1,5) = xyz[0]; mf(2,5) = 0;
139 TMatrixD mft = mf.T(); mf.T();
140 TMatrixD sums2 = mft * msum * sums;
142 TMatrixD smatrix = mft * msum * mf;
144 fSum[0] += smatrix(0,0);
145 fSum[1] += smatrix(0,1);
146 fSum[2] += smatrix(0,2);
147 fSum[3] += smatrix(0,3);
148 fSum[4] += smatrix(0,4);
149 fSum[5] += smatrix(0,5);
150 fSum[6] += smatrix(1,1);
151 fSum[7] += smatrix(1,2);
152 fSum[8] += smatrix(1,3);
153 fSum[9] += smatrix(1,4);
154 fSum[10]+= smatrix(1,5);
155 fSum[11]+= smatrix(2,2);
156 fSum[12]+= smatrix(2,3);
157 fSum[13]+= smatrix(2,4);
158 fSum[14]+= smatrix(2,5);
159 fSum[15]+= smatrix(3,3);
160 fSum[16]+= smatrix(3,4);
161 fSum[17]+= smatrix(3,5);
162 fSum[18]+= smatrix(4,4);
163 fSum[19]+= smatrix(4,5);
164 fSum[20]+= smatrix(5,5);
165 fSum[21] += sums2(0,0);
166 fSum[22] += sums2(1,0);
167 fSum[23] += sums2(2,0);
168 fSum[24] += sums2(3,0);
169 fSum[25] += sums2(4,0);
170 fSum[26] += sums2(5,0);
172 TMatrixD tmp = sumst * msum * sums;
178 //______________________________________________________________________________
179 Bool_t AliTrackResidualsFast::Update()
181 // Find the alignment parameters
182 // by using the already accumulated
184 TMatrixDSym smatrix(6);
187 smatrix(0,0) = fSum[0]; smatrix(0,1) = fSum[1]; smatrix(0,2)=fSum[2];
188 smatrix(0,3) = fSum[3]; smatrix(0,4) = fSum[4]; smatrix(0,5)=fSum[5];
189 smatrix(1,1) = fSum[6]; smatrix(1,2) = fSum[7]; smatrix(1,3)=fSum[8];
190 smatrix(1,4) = fSum[9]; smatrix(1,5) = fSum[10];
191 smatrix(2,2) = fSum[11];smatrix(2,3) = fSum[12];smatrix(2,4)=fSum[13];
192 smatrix(2,5) = fSum[14];
193 smatrix(3,3) = fSum[15];smatrix(3,4) = fSum[16];smatrix(3,5)=fSum[17];
194 smatrix(4,4) = fSum[18];smatrix(4,5) = fSum[19];
195 smatrix(5,5) = fSum[20];
197 sums(0,0) = fSum[21]; sums(0,1) = fSum[22]; sums(0,2) = fSum[23];
198 sums(0,3) = fSum[24]; sums(0,4) = fSum[25]; sums(0,5) = fSum[26];
201 if (!smatrix.IsValid()) return kFALSE;
203 TMatrixD res = sums*smatrix;
204 fAlignObj->SetPars(res(0,0),res(0,1),res(0,2),
205 TMath::RadToDeg()*res(0,3),
206 TMath::RadToDeg()*res(0,4),
207 TMath::RadToDeg()*res(0,5));
208 TMatrixD tmp = res*sums.T();
209 fChi2 = fSumR - tmp(0,0);