]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliTrackResidualsFast.cxx
Possibility to convolute the original cov.matrix of the point with the matrix coming...
[u/mrichter/AliRoot.git] / STEER / AliTrackResidualsFast.cxx
CommitLineData
46ae650f 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
3010c308 16/* $Id$ */
17
46ae650f 18//-----------------------------------------------------------------
19// Implementation of the derived class for track residuals
20// based on linear chi2 minimization (in approximation of
21// small alignment angles and translations)
22//
23//-----------------------------------------------------------------
24
3010c308 25#include <TMath.h>
46ae650f 26#include <TGeoMatrix.h>
27
cc345ce3 28#include "AliLog.h"
46ae650f 29#include "AliAlignObj.h"
30#include "AliTrackPointArray.h"
31#include "AliTrackResidualsFast.h"
32
33ClassImp(AliTrackResidualsFast)
34
35//______________________________________________________________________________
75e3794b 36AliTrackResidualsFast::AliTrackResidualsFast():
37 AliTrackResiduals(),
38 fSumR(0)
46ae650f 39{
40 // Default constructor
cc345ce3 41 for (Int_t i = 0; i < 27; i++) fSum[i] = 0;
46ae650f 42}
43
44//______________________________________________________________________________
45AliTrackResidualsFast::AliTrackResidualsFast(Int_t ntracks):
75e3794b 46 AliTrackResiduals(ntracks),
47 fSumR(0)
46ae650f 48{
49 // Constructor
cc345ce3 50 for (Int_t i = 0; i < 27; i++) fSum[i] = 0;
46ae650f 51}
52
53//______________________________________________________________________________
54AliTrackResidualsFast::AliTrackResidualsFast(const AliTrackResidualsFast &res):
75e3794b 55 AliTrackResiduals(res),
56 fSumR(res.fSumR)
46ae650f 57{
58 // Copy constructor
cc345ce3 59 for (Int_t i = 0; i < 27; i++) fSum[i] = res.fSum[i];
46ae650f 60}
61
62//______________________________________________________________________________
63AliTrackResidualsFast &AliTrackResidualsFast::operator= (const AliTrackResidualsFast& res)
64{
65 // Assignment operator
66 ((AliTrackResiduals *)this)->operator=(res);
cc345ce3 67 for (Int_t i = 0; i < 27; i++) fSum[i] = res.fSum[i];
46ae650f 68 fSumR = res.fSumR;
69
70 return *this;
71}
72
73//______________________________________________________________________________
74Bool_t AliTrackResidualsFast::Minimize()
75{
76 // Implementation of fast linear Chi2
77 // based minimization of track residuals sum
29317b68 78 if(fBFixed[0]||fBFixed[1]||fBFixed[2]||fBFixed[3]||fBFixed[4]||fBFixed[5])
79 AliError("Cannot yet fix parameters in this minimizer");
80
81
cc345ce3 82 for (Int_t i = 0; i < 27; i++) fSum[i] = 0;
46ae650f 83 fSumR = 0;
84
85 AliTrackPoint p1,p2;
86
87 for (Int_t itrack = 0; itrack < fLast; itrack++) {
88 if (!fVolArray[itrack] || !fTrackArray[itrack]) continue;
89 for (Int_t ipoint = 0; ipoint < fVolArray[itrack]->GetNPoints(); ipoint++) {
90 fVolArray[itrack]->GetPoint(p1,ipoint);
91 fTrackArray[itrack]->GetPoint(p2,ipoint);
92 AddPoints(p1,p2);
93 }
94 }
95
96 return Update();
97
98 // debug info
99// Float_t chi2 = 0;
100// for (Int_t itrack = 0; itrack < fLast; itrack++) {
101// if (!fVolArray[itrack] || !fTrackArray[itrack]) continue;
102// for (Int_t ipoint = 0; ipoint < fVolArray[itrack]->GetNPoints(); ipoint++) {
103// fVolArray[itrack]->GetPoint(p1,ipoint);
104// fAlignObj->Transform(p1);
105// fTrackArray[itrack]->GetPoint(p2,ipoint);
106// Float_t residual = p2.GetResidual(p1,kFALSE);
107// chi2 += residual;
108// }
109// }
110// printf("Final chi2 = %f\n",chi2);
111}
112
113//______________________________________________________________________________
114void AliTrackResidualsFast::AddPoints(AliTrackPoint &p, AliTrackPoint &pprime)
115{
116 // Update the sums used for
117 // the linear chi2 minimization
118 Float_t xyz[3],xyzp[3];
cc345ce3 119 Float_t cov[6],covp[6];
120 p.GetXYZ(xyz,cov); pprime.GetXYZ(xyzp,covp);
121 TMatrixDSym mcov(3);
122 mcov(0,0) = cov[0]; mcov(0,1) = cov[1]; mcov(0,2) = cov[2];
123 mcov(1,0) = cov[1]; mcov(1,1) = cov[3]; mcov(1,2) = cov[4];
124 mcov(2,0) = cov[2]; mcov(2,1) = cov[4]; mcov(2,2) = cov[5];
125 TMatrixDSym mcovp(3);
126 mcovp(0,0) = covp[0]; mcovp(0,1) = covp[1]; mcovp(0,2) = covp[2];
127 mcovp(1,0) = covp[1]; mcovp(1,1) = covp[3]; mcovp(1,2) = covp[4];
128 mcovp(2,0) = covp[2]; mcovp(2,1) = covp[4]; mcovp(2,2) = covp[5];
129 TMatrixDSym msum = mcov + mcovp;
130 msum.Invert();
131 if (!msum.IsValid()) return;
132
133 TMatrixD sums(3,1);
134 sums(0,0) = (xyzp[0]-xyz[0]);
135 sums(1,0) = (xyzp[1]-xyz[1]);
136 sums(2,0) = (xyzp[2]-xyz[2]);
137 TMatrixD sumst = sums.T(); sums.T();
138
139 TMatrixD mf(3,6);
140 mf(0,0) = 1; mf(1,0) = 0; mf(2,0) = 0;
141 mf(0,1) = 0; mf(1,1) = 1; mf(2,1) = 0;
142 mf(0,2) = 0; mf(1,2) = 0; mf(2,2) = 1;
143 mf(0,3) = 0; mf(1,3) =-xyz[2]; mf(2,3) = xyz[1];
144 mf(0,4) = xyz[2]; mf(1,4) = 0; mf(2,4) =-xyz[0];
145 mf(0,5) =-xyz[1]; mf(1,5) = xyz[0]; mf(2,5) = 0;
146 TMatrixD mft = mf.T(); mf.T();
147 TMatrixD sums2 = mft * msum * sums;
148
149 TMatrixD smatrix = mft * msum * mf;
150
151 fSum[0] += smatrix(0,0);
152 fSum[1] += smatrix(0,1);
153 fSum[2] += smatrix(0,2);
154 fSum[3] += smatrix(0,3);
155 fSum[4] += smatrix(0,4);
156 fSum[5] += smatrix(0,5);
157 fSum[6] += smatrix(1,1);
158 fSum[7] += smatrix(1,2);
159 fSum[8] += smatrix(1,3);
160 fSum[9] += smatrix(1,4);
161 fSum[10]+= smatrix(1,5);
162 fSum[11]+= smatrix(2,2);
163 fSum[12]+= smatrix(2,3);
164 fSum[13]+= smatrix(2,4);
165 fSum[14]+= smatrix(2,5);
166 fSum[15]+= smatrix(3,3);
167 fSum[16]+= smatrix(3,4);
168 fSum[17]+= smatrix(3,5);
169 fSum[18]+= smatrix(4,4);
170 fSum[19]+= smatrix(4,5);
171 fSum[20]+= smatrix(5,5);
172 fSum[21] += sums2(0,0);
173 fSum[22] += sums2(1,0);
174 fSum[23] += sums2(2,0);
175 fSum[24] += sums2(3,0);
176 fSum[25] += sums2(4,0);
177 fSum[26] += sums2(5,0);
178
179 TMatrixD tmp = sumst * msum * sums;
180 fSumR += tmp(0,0);
46ae650f 181
182 fNdf += 3;
183}
184
185//______________________________________________________________________________
186Bool_t AliTrackResidualsFast::Update()
187{
188 // Find the alignment parameters
189 // by using the already accumulated
190 // sums
191 TMatrixDSym smatrix(6);
192 TMatrixD sums(1,6);
193
3bbfb291 194 smatrix(0,0) = fSum[0];
195 smatrix(0,1) = smatrix(1,0) = fSum[1];
196 smatrix(0,2) = smatrix(2,0) = fSum[2];
197 smatrix(0,3) = smatrix(3,0) = fSum[3];
198 smatrix(0,4) = smatrix(4,0) = fSum[4];
199 smatrix(0,5) = smatrix(5,0) = fSum[5];
200 smatrix(1,1) = fSum[6];
201 smatrix(1,2) = smatrix(2,1) = fSum[7];
202 smatrix(1,3) = smatrix(3,1) = fSum[8];
203 smatrix(1,4) = smatrix(4,1) = fSum[9];
204 smatrix(1,5) = smatrix(5,1) = fSum[10];
205 smatrix(2,2) = fSum[11];
206 smatrix(2,3) = smatrix(3,2) = fSum[12];
207 smatrix(2,4) = smatrix(4,2) = fSum[13];
208 smatrix(2,5) = smatrix(5,2) = fSum[14];
209 smatrix(3,3) = fSum[15];
210 smatrix(3,4) = smatrix(4,3) = fSum[16];
211 smatrix(3,5) = smatrix(5,3) = fSum[17];
212 smatrix(4,4) = fSum[18];
213 smatrix(4,5) = smatrix(5,4) = fSum[19];
cc345ce3 214 smatrix(5,5) = fSum[20];
215
216 sums(0,0) = fSum[21]; sums(0,1) = fSum[22]; sums(0,2) = fSum[23];
217 sums(0,3) = fSum[24]; sums(0,4) = fSum[25]; sums(0,5) = fSum[26];
46ae650f 218
219 smatrix.Invert();
220 if (!smatrix.IsValid()) return kFALSE;
221
222 TMatrixD res = sums*smatrix;
223 fAlignObj->SetPars(res(0,0),res(0,1),res(0,2),
224 TMath::RadToDeg()*res(0,3),
225 TMath::RadToDeg()*res(0,4),
226 TMath::RadToDeg()*res(0,5));
227 TMatrixD tmp = res*sums.T();
228 fChi2 = fSumR - tmp(0,0);
229 fNdf -= 6;
230
231 return kTRUE;
232}