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()
27 AliTRDtrackOnline::~AliTRDtrackOnline()
33 void AliTRDtrackOnline::AddTracklet(AliVTrdTracklet *trkl)
35 if (fNTracklets == fgkMaxTracklets)
38 fTracklets[fNTracklets++] = trkl;
42 Bool_t AliTRDtrackOnline::Fit(ROOT::Math::Minimizer *minim)
44 // fit all attached parametrizations
46 Bool_t minSuccess = kFALSE;
49 TIter param(&fTrackParametrizations);
51 while (AliTRDtrackParametrization *par = (AliTRDtrackParametrization*) param()) {
53 AliTRDtrackResiduals res(this, par);
55 minim->SetFunction(res);
56 par->SetParams(minim);
57 minSuccess = minim->Minimize();
58 par->GetParams(minim);
66 AliTRDtrackPosition AliTRDtrackOnline::ExtrapolateToLayer(Int_t /* layer */)
69 AliVTrdTracklet *trklBest = 0x0;
70 for (Int_t iTracklet = fNTracklets-1; iTracklet > -1; iTracklet--) {
71 AliVTrdTracklet *trkl = (AliVTrdTracklet*) fTracklets[iTracklet];
72 if (trkl->GetDetector() % 6 >= maxLayer) {
73 maxLayer = trkl->GetDetector() % 6;
78 return AliTRDtrackPosition(trklBest->GetLocalY(), GetZ(trklBest));
80 AliFatal("No tracklet in this track");
81 return AliTRDtrackPosition(std::numeric_limits<float>::quiet_NaN(), std::numeric_limits<float>::quiet_NaN());
86 void AliTRDtrackOnline::Print(Option_t* /* option */) const
88 printf("track with %i tracklets:\n", GetNTracklets());
89 for (Int_t iTracklet = 0; iTracklet < fNTracklets; iTracklet++) {
90 printf(" 0x%08x %i %4.1f %4.1f\n",
91 ((AliVTrdTracklet*) fTracklets[iTracklet])->GetTrackletWord(),
92 ((AliVTrdTracklet*) fTracklets[iTracklet])->GetDetector() % 6,
93 ((AliVTrdTracklet*) fTracklets[iTracklet])->GetLocalY(),
94 GetZ((AliVTrdTracklet*) fTracklets[iTracklet]));
96 TIter next(&fTrackParametrizations);
97 while (AliTRDtrackParametrization *param = (AliTRDtrackParametrization*) next()) {
102 AliTRDtrackPosition::AliTRDtrackPosition(Float_t y, Float_t z, Float_t dy) :
111 AliTRDtrackPosition::~AliTRDtrackPosition()
116 Float_t AliTRDtrackPosition::Distance(AliVTrdTracklet *trkl) const
118 return TMath::Hypot(trkl->GetLocalY() - fY, AliTRDtrackOnline::GetZ(trkl) - fZ);
122 AliTRDtrackParametrization::AliTRDtrackParametrization(const char* name, const char* title) :
129 AliTRDtrackParametrizationStraightLine::AliTRDtrackParametrizationStraightLine() :
130 AliTRDtrackParametrization("straight line", "straight line"),
139 AliTRDtrackParametrizationStraightLine::AliTRDtrackParametrizationStraightLine(Double_t offsetY, Double_t slopeY,
140 Double_t offsetZ, Double_t slopeZ) :
141 AliTRDtrackParametrization("straight line", Form("straight line: y = %4.2f + %4.2f * x, z = %4.2f + %4.2f *x",
142 offsetY, slopeY, offsetZ, slopeZ)),
151 void AliTRDtrackParametrizationStraightLine::SetParams(ROOT::Math::Minimizer * minim)
153 minim->SetVariable(0, "offsety", 0., 0.1);
154 minim->SetVariable(1, "slopey", 0., 0.1);
155 // minim->SetVariable(2, "offsetz", 0., 0.1);
156 minim->SetFixedVariable(2, "offsetz", 0.);
157 minim->SetVariable(3, "slopez", 0., 0.1);
160 void AliTRDtrackParametrizationStraightLine::GetParams(ROOT::Math::Minimizer * minim)
162 fOffsetY = minim->X()[0];
163 fSlopeY = minim->X()[1];
164 fOffsetZ = minim->X()[2];
165 fSlopeZ = minim->X()[3];
168 void AliTRDtrackParametrizationStraightLine::SetValues(const Double_t *par)
176 AliTRDtrackPosition AliTRDtrackParametrizationStraightLine::ExtrapolateToLayer(Int_t layer)
178 Float_t y = fOffsetY + fSlopeY * AliTRDtrackOnline::fgGeometry->GetTime0(layer);
179 Float_t z = fOffsetZ + fSlopeZ * AliTRDtrackOnline::fgGeometry->GetTime0(layer);
180 return AliTRDtrackPosition(y, z, fSlopeY*3.);
183 AliTRDtrackPosition AliTRDtrackParametrizationStraightLine::ExtrapolateToX(Float_t x)
185 Float_t y = fOffsetY + fSlopeY * x;
186 Float_t z = fOffsetZ + fSlopeZ * x;
187 return AliTRDtrackPosition(y, z, fSlopeY*3.);
190 void AliTRDtrackParametrizationStraightLine::Print(Option_t * /* option */) const
192 printf("straight line: offsetY = %4.1f, slopeY = %4.1f; offsetZ = %4.1f, slopeZ = %4.1f\n",
193 fOffsetY, fSlopeY, fOffsetZ, fSlopeZ);
196 AliTRDtrackParametrizationCurved::AliTRDtrackParametrizationCurved() :
197 AliTRDtrackParametrization("helix", "helix"),
208 void AliTRDtrackParametrizationCurved::SetParams(ROOT::Math::Minimizer * minim)
210 minim->SetVariable(0, "offsety", 0., 0.1);
211 minim->SetVariable(1, "invradius", 0., 0.1);
212 // minim->SetVariable(2, "offsetz", 1., 0.1);
213 minim->SetFixedVariable(2, "offsetz", 0.);
214 minim->SetVariable(3, "slopez", 0., 0.1);
218 void AliTRDtrackParametrizationCurved::GetParams(ROOT::Math::Minimizer * minim)
220 this->SetValues(minim->X());
224 void AliTRDtrackParametrizationCurved::SetValues(const Double_t *par)
232 AliTRDtrackPosition AliTRDtrackParametrizationCurved::ExtrapolateToLayer(Int_t layer)
234 return ExtrapolateToX(AliTRDtrackOnline::fgGeometry->GetTime0(layer));
237 AliTRDtrackPosition AliTRDtrackParametrizationCurved::ExtrapolateToX(Float_t x)
239 Double_t yext1 = GetY(x);
240 Double_t yext2 = GetY(x + 3.);
242 Double_t zext = fOffsetZ + fSlopeZ * x;
244 return AliTRDtrackPosition(yext1, zext, yext2-yext1);
247 Float_t AliTRDtrackParametrizationCurved::GetY(Float_t x)
250 // use Taylor expansion for small 1/R
251 if (TMath::Abs(fRadiusInv) < 1.) {
253 yext = fOffsetY * x/fOffsetX;
255 yext += - (fOffsetX - x) * x * fRadiusInv /
256 (2 * (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)) *
257 (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)) *
258 (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)));
261 Double_t disc = 1./(fOffsetX*fOffsetX + fOffsetY*fOffsetY) - fRadiusInv*fRadiusInv/4.;
263 AliError("Discriminant < 0");
266 yext = TMath::Sqrt(disc) -
267 TMath::Sqrt((fRadiusInv*fOffsetY/2. + fOffsetX * TMath::Sqrt(disc)) *
268 (fRadiusInv*fOffsetY/2. + fOffsetX * TMath::Sqrt(disc)) /
269 (fOffsetX*fOffsetX) -
270 fRadiusInv*fRadiusInv/(fOffsetX*fOffsetX)* x*x +
271 fRadiusInv*fRadiusInv/fOffsetX * x +
272 2 * fRadiusInv * fOffsetY * (x - fOffsetX)/(fOffsetX*fOffsetX) * TMath::Sqrt(disc));
273 yext = fOffsetY/2. - fOffsetX * yext / fRadiusInv;
279 void AliTRDtrackParametrizationCurved::Print(Option_t * /* option */) const
281 printf("helix curve: 1/R = %f, y = %4.1f\n", fRadiusInv, fOffsetY);
285 AliTRDtrackResiduals::AliTRDtrackResiduals(const AliTRDtrackOnline *track, AliTRDtrackParametrization *param) :
286 ROOT::Math::IBaseFunctionMultiDim(),
293 AliTRDtrackResiduals::AliTRDtrackResiduals(const AliTRDtrackResiduals &rhs) :
294 ROOT::Math::IBaseFunctionMultiDim(rhs),
301 AliTRDtrackResiduals& AliTRDtrackResiduals::operator=(const AliTRDtrackResiduals &rhs)
304 ROOT::Math::IBaseFunctionMultiDim::operator=(rhs);
312 AliTRDtrackResiduals* AliTRDtrackResiduals::Clone() const
314 return new AliTRDtrackResiduals(*this);
317 Double_t AliTRDtrackResiduals::DoEval(const Double_t *par) const
319 // calculate chi2 for the given values for the parametrization
326 // actually set the values for the parametrization
327 fParam->SetValues(par);
329 // loop over all contributing tracklets
330 for (Int_t iTracklet = 0; iTracklet < fTrack->GetNTracklets(); iTracklet++) {
331 AliVTrdTracklet *trkl = fTrack->GetTracklet(iTracklet);
333 // Int_t layer = trkl->GetDetector() % 6;
335 AliTRDtrackPosition pos = fParam->ExtrapolateToX(AliTRDtrackOnline::GetX(trkl));
336 Float_t yext = pos.GetY();
337 Float_t zext = pos.GetZ();
339 AliTRDpadPlane *pp = fgGeometry->GetPadPlane(trkl->GetDetector());
340 Float_t zlen = 0.5 * pp->GetRowSize(trkl->GetBinZ());
341 Float_t zpad = pp->GetRowPos(trkl->GetBinZ()) - zlen;
342 zpad = AliTRDtrackOnline::GetZ(trkl);
343 Float_t zrel = zext - zpad;
346 else if (zrel < -zlen)
349 Float_t ycorr = trkl->GetLocalY() + TMath::Tan(TMath::Pi()/180.*pp->GetTiltingAngle()) * zrel;
351 deltaY = ycorr - yext;
352 deltaZ = AliTRDtrackOnline::GetZ(trkl) - zext;
355 // printf("in layer %i: deltaY = %f, deltaZ = %f\n", layer, deltaY, deltaZ);
357 chi2 += deltaY*deltaY + deltaZ*deltaZ;
360 // printf("chi2 = %f\n", chi2);