6 #include "Math/Minimizer.h"
9 #include "AliVTrdTracklet.h"
10 #include "AliTRDgeometry.h"
11 #include "AliTRDpadPlane.h"
13 #include "AliTRDtrackOnline.h"
15 AliTRDgeometry *AliTRDtrackOnline::fgGeometry = new AliTRDgeometry();
17 AliTRDtrackOnline::AliTRDtrackOnline() :
21 fTrackParametrizations(),
28 AliTRDtrackOnline::~AliTRDtrackOnline()
34 void AliTRDtrackOnline::AddTracklet(AliVTrdTracklet *trkl)
36 if (fNTracklets == fgkMaxTracklets)
39 fTracklets[fNTracklets++] = trkl;
43 Bool_t AliTRDtrackOnline::Fit(ROOT::Math::Minimizer *minim)
45 // fit all attached parametrizations
47 Bool_t minSuccess = kFALSE;
52 TIter param(&fTrackParametrizations);
54 while (AliTRDtrackParametrization *par = (AliTRDtrackParametrization*) param()) {
56 AliTRDtrackResiduals res(this, par);
58 minim->SetFunction(res);
59 par->SetParams(minim);
60 minSuccess &= minim->Minimize();
61 par->GetParams(minim);
69 AliTRDtrackPosition AliTRDtrackOnline::ExtrapolateToLayer(Int_t /* layer */)
72 AliVTrdTracklet *trklBest = 0x0;
73 for (Int_t iTracklet = fNTracklets-1; iTracklet > -1; iTracklet--) {
74 AliVTrdTracklet *trkl = (AliVTrdTracklet*) fTracklets[iTracklet];
75 if (trkl->GetDetector() % 6 >= maxLayer) {
76 maxLayer = trkl->GetDetector() % 6;
81 return AliTRDtrackPosition(trklBest->GetLocalY(), GetZ(trklBest));
83 AliFatal("No tracklet in this track");
84 return AliTRDtrackPosition(std::numeric_limits<float>::quiet_NaN(), std::numeric_limits<float>::quiet_NaN());
89 void AliTRDtrackOnline::Print(Option_t* /* option */) const
91 printf("track with %i tracklets:\n", GetNTracklets());
92 for (Int_t iTracklet = 0; iTracklet < fNTracklets; iTracklet++) {
93 printf(" 0x%08x %i %4.1f %4.1f\n",
94 ((AliVTrdTracklet*) fTracklets[iTracklet])->GetTrackletWord(),
95 ((AliVTrdTracklet*) fTracklets[iTracklet])->GetDetector() % 6,
96 ((AliVTrdTracklet*) fTracklets[iTracklet])->GetLocalY(),
97 GetZ((AliVTrdTracklet*) fTracklets[iTracklet]));
99 TIter next(&fTrackParametrizations);
100 while (AliTRDtrackParametrization *param = (AliTRDtrackParametrization*) next()) {
105 AliTRDtrackPosition::AliTRDtrackPosition(Float_t y, Float_t z, Float_t dy) :
114 AliTRDtrackPosition::~AliTRDtrackPosition()
119 Float_t AliTRDtrackPosition::Distance(AliVTrdTracklet *trkl) const
121 return TMath::Hypot(trkl->GetLocalY() - fY, AliTRDtrackOnline::GetZ(trkl) - fZ);
125 AliTRDtrackParametrization::AliTRDtrackParametrization(const char* name, const char* title) :
132 AliTRDtrackParametrizationStraightLine::AliTRDtrackParametrizationStraightLine() :
133 AliTRDtrackParametrization("straight line", "straight line"),
142 AliTRDtrackParametrizationStraightLine::AliTRDtrackParametrizationStraightLine(Double_t offsetY, Double_t slopeY,
143 Double_t offsetZ, Double_t slopeZ) :
144 AliTRDtrackParametrization("straight line", Form("straight line: y = %4.2f + %4.2f * x, z = %4.2f + %4.2f *x",
145 offsetY, slopeY, offsetZ, slopeZ)),
154 void AliTRDtrackParametrizationStraightLine::SetParams(ROOT::Math::Minimizer * minim)
156 minim->SetVariable(0, "offsety", 0., 0.1);
157 minim->SetVariable(1, "slopey", 0., 0.1);
158 // minim->SetVariable(2, "offsetz", 0., 0.1);
159 minim->SetFixedVariable(2, "offsetz", 0.);
160 minim->SetVariable(3, "slopez", 0., 0.1);
163 void AliTRDtrackParametrizationStraightLine::GetParams(ROOT::Math::Minimizer * minim)
165 fOffsetY = minim->X()[0];
166 fSlopeY = minim->X()[1];
167 fOffsetZ = minim->X()[2];
168 fSlopeZ = minim->X()[3];
171 void AliTRDtrackParametrizationStraightLine::SetValues(const Double_t *par)
179 AliTRDtrackPosition AliTRDtrackParametrizationStraightLine::ExtrapolateToLayer(Int_t layer)
181 Float_t y = fOffsetY + fSlopeY * AliTRDtrackOnline::fgGeometry->GetTime0(layer);
182 Float_t z = fOffsetZ + fSlopeZ * AliTRDtrackOnline::fgGeometry->GetTime0(layer);
183 return AliTRDtrackPosition(y, z, fSlopeY*3.);
186 AliTRDtrackPosition AliTRDtrackParametrizationStraightLine::ExtrapolateToX(Float_t x)
188 Float_t y = fOffsetY + fSlopeY * x;
189 Float_t z = fOffsetZ + fSlopeZ * x;
190 return AliTRDtrackPosition(y, z, fSlopeY*3.);
193 void AliTRDtrackParametrizationStraightLine::Print(Option_t * /* option */) const
195 printf("straight line: offsetY = %4.1f, slopeY = %4.1f; offsetZ = %4.1f, slopeZ = %4.1f\n",
196 fOffsetY, fSlopeY, fOffsetZ, fSlopeZ);
199 AliTRDtrackParametrizationCurved::AliTRDtrackParametrizationCurved() :
200 AliTRDtrackParametrization("helix", "helix"),
211 void AliTRDtrackParametrizationCurved::SetParams(ROOT::Math::Minimizer * minim)
213 minim->SetVariable(0, "offsety", 0., 0.1);
214 minim->SetVariable(1, "invradius", 0., 0.1);
215 // minim->SetVariable(2, "offsetz", 1., 0.1);
216 minim->SetFixedVariable(2, "offsetz", 0.);
217 minim->SetVariable(3, "slopez", 0., 0.1);
221 void AliTRDtrackParametrizationCurved::GetParams(ROOT::Math::Minimizer * minim)
223 this->SetValues(minim->X());
227 void AliTRDtrackParametrizationCurved::SetValues(const Double_t *par)
235 AliTRDtrackPosition AliTRDtrackParametrizationCurved::ExtrapolateToLayer(Int_t layer)
237 return ExtrapolateToX(AliTRDtrackOnline::fgGeometry->GetTime0(layer));
240 AliTRDtrackPosition AliTRDtrackParametrizationCurved::ExtrapolateToX(Float_t x)
242 Double_t yext1 = GetY(x);
243 Double_t yext2 = GetY(x + 3.);
245 Double_t zext = fOffsetZ + fSlopeZ * x;
247 return AliTRDtrackPosition(yext1, zext, yext2-yext1);
250 Float_t AliTRDtrackParametrizationCurved::GetY(Float_t x)
253 // use Taylor expansion for small 1/R
254 if (TMath::Abs(fRadiusInv) < 1.) {
256 yext = fOffsetY * x/fOffsetX;
258 yext += - (fOffsetX - x) * x * fRadiusInv /
259 (2 * (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)) *
260 (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)) *
261 (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)));
264 Double_t disc = 1./(fOffsetX*fOffsetX + fOffsetY*fOffsetY) - fRadiusInv*fRadiusInv/4.;
266 AliError("Discriminant < 0");
269 yext = TMath::Sqrt(disc) -
270 TMath::Sqrt((fRadiusInv*fOffsetY/2. + fOffsetX * TMath::Sqrt(disc)) *
271 (fRadiusInv*fOffsetY/2. + fOffsetX * TMath::Sqrt(disc)) /
272 (fOffsetX*fOffsetX) -
273 fRadiusInv*fRadiusInv/(fOffsetX*fOffsetX)* x*x +
274 fRadiusInv*fRadiusInv/fOffsetX * x +
275 2 * fRadiusInv * fOffsetY * (x - fOffsetX)/(fOffsetX*fOffsetX) * TMath::Sqrt(disc));
276 yext = fOffsetY/2. - fOffsetX * yext / fRadiusInv;
282 void AliTRDtrackParametrizationCurved::Print(Option_t * /* option */) const
284 printf("helix curve: 1/R = %f, y = %4.1f\n", fRadiusInv, fOffsetY);
288 AliTRDtrackResiduals::AliTRDtrackResiduals(const AliTRDtrackOnline *track, AliTRDtrackParametrization *param) :
289 ROOT::Math::IBaseFunctionMultiDim(),
296 AliTRDtrackResiduals::AliTRDtrackResiduals(const AliTRDtrackResiduals &rhs) :
297 ROOT::Math::IBaseFunctionMultiDim(rhs),
304 AliTRDtrackResiduals& AliTRDtrackResiduals::operator=(const AliTRDtrackResiduals &rhs)
307 ROOT::Math::IBaseFunctionMultiDim::operator=(rhs);
315 AliTRDtrackResiduals* AliTRDtrackResiduals::Clone() const
317 return new AliTRDtrackResiduals(*this);
320 Double_t AliTRDtrackResiduals::DoEval(const Double_t *par) const
322 // calculate chi2 for the given values for the parametrization
329 // actually set the values for the parametrization
330 fParam->SetValues(par);
332 // loop over all contributing tracklets
333 for (Int_t iTracklet = 0; iTracklet < fTrack->GetNTracklets(); iTracklet++) {
334 AliVTrdTracklet *trkl = fTrack->GetTracklet(iTracklet);
336 // Int_t layer = trkl->GetDetector() % 6;
338 AliTRDtrackPosition pos = fParam->ExtrapolateToX(AliTRDtrackOnline::GetX(trkl));
339 Float_t yext = pos.GetY();
340 Float_t zext = pos.GetZ();
342 AliTRDpadPlane *pp = fgGeometry->GetPadPlane(trkl->GetDetector());
343 Float_t zlen = 0.5 * pp->GetRowSize(trkl->GetBinZ());
344 Float_t zpad = AliTRDtrackOnline::GetZ(trkl);
345 Float_t zrel = zext - zpad;
348 else if (zrel < -zlen)
351 Float_t ycorr = trkl->GetLocalY() + TMath::Tan(TMath::Pi()/180.*pp->GetTiltingAngle()) * zrel;
353 deltaY = ycorr - yext;
354 deltaZ = zpad - zext;
355 deltaY /= fTrack->GetErrorY();
356 deltaZ /= pp->GetRowSize(trkl->GetBinZ()) / TMath::Sqrt(12.);
357 // printf("for tracklet %i: deltaY = %f, deltaZ = %f\n", iTracklet, deltaY, deltaZ);
359 chi2 += deltaY*deltaY + deltaZ*deltaZ;
362 // printf("chi2 = %f\n", chi2);