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;
51 TIter param(&fTrackParametrizations);
53 while (AliTRDtrackParametrization *par = (AliTRDtrackParametrization*) param()) {
55 AliTRDtrackResiduals res(this, par);
57 minim->SetFunction(res);
58 par->SetParams(minim);
59 minSuccess &= minim->Minimize();
60 par->GetParams(minim);
68 AliTRDtrackPosition AliTRDtrackOnline::ExtrapolateToLayer(Int_t /* layer */)
71 AliVTrdTracklet *trklBest = 0x0;
72 for (Int_t iTracklet = fNTracklets-1; iTracklet > -1; iTracklet--) {
73 AliVTrdTracklet *trkl = (AliVTrdTracklet*) fTracklets[iTracklet];
74 if (trkl->GetDetector() % 6 >= maxLayer) {
75 maxLayer = trkl->GetDetector() % 6;
80 return AliTRDtrackPosition(trklBest->GetLocalY(), GetZ(trklBest));
82 AliFatal("No tracklet in this track");
83 return AliTRDtrackPosition(std::numeric_limits<float>::quiet_NaN(), std::numeric_limits<float>::quiet_NaN());
88 void AliTRDtrackOnline::Print(Option_t* /* option */) const
90 printf("track with %i tracklets:\n", GetNTracklets());
91 for (Int_t iTracklet = 0; iTracklet < fNTracklets; iTracklet++) {
92 printf(" 0x%08x %i %4.1f %4.1f\n",
93 ((AliVTrdTracklet*) fTracklets[iTracklet])->GetTrackletWord(),
94 ((AliVTrdTracklet*) fTracklets[iTracklet])->GetDetector() % 6,
95 ((AliVTrdTracklet*) fTracklets[iTracklet])->GetLocalY(),
96 GetZ((AliVTrdTracklet*) fTracklets[iTracklet]));
98 TIter next(&fTrackParametrizations);
99 while (AliTRDtrackParametrization *param = (AliTRDtrackParametrization*) next()) {
104 AliTRDtrackPosition::AliTRDtrackPosition(Float_t y, Float_t z, Float_t dy) :
113 AliTRDtrackPosition::~AliTRDtrackPosition()
118 Float_t AliTRDtrackPosition::Distance(AliVTrdTracklet *trkl) const
120 return TMath::Hypot(trkl->GetLocalY() - fY, AliTRDtrackOnline::GetZ(trkl) - fZ);
124 AliTRDtrackParametrization::AliTRDtrackParametrization(const char* name, const char* title) :
131 AliTRDtrackParametrizationStraightLine::AliTRDtrackParametrizationStraightLine() :
132 AliTRDtrackParametrization("straight line", "straight line"),
141 AliTRDtrackParametrizationStraightLine::AliTRDtrackParametrizationStraightLine(Double_t offsetY, Double_t slopeY,
142 Double_t offsetZ, Double_t slopeZ) :
143 AliTRDtrackParametrization("straight line", Form("straight line: y = %4.2f + %4.2f * x, z = %4.2f + %4.2f *x",
144 offsetY, slopeY, offsetZ, slopeZ)),
153 void AliTRDtrackParametrizationStraightLine::SetParams(ROOT::Math::Minimizer * minim)
155 minim->SetVariable(0, "offsety", 0., 0.1);
156 minim->SetVariable(1, "slopey", 0., 0.1);
157 // minim->SetVariable(2, "offsetz", 0., 0.1);
158 minim->SetFixedVariable(2, "offsetz", 0.);
159 minim->SetVariable(3, "slopez", 0., 0.1);
162 void AliTRDtrackParametrizationStraightLine::GetParams(ROOT::Math::Minimizer * minim)
164 fOffsetY = minim->X()[0];
165 fSlopeY = minim->X()[1];
166 fOffsetZ = minim->X()[2];
167 fSlopeZ = minim->X()[3];
170 void AliTRDtrackParametrizationStraightLine::SetValues(const Double_t *par)
178 AliTRDtrackPosition AliTRDtrackParametrizationStraightLine::ExtrapolateToLayer(Int_t layer)
180 Float_t y = fOffsetY + fSlopeY * AliTRDtrackOnline::fgGeometry->GetTime0(layer);
181 Float_t z = fOffsetZ + fSlopeZ * AliTRDtrackOnline::fgGeometry->GetTime0(layer);
182 return AliTRDtrackPosition(y, z, fSlopeY*3.);
185 AliTRDtrackPosition AliTRDtrackParametrizationStraightLine::ExtrapolateToX(Float_t x)
187 Float_t y = fOffsetY + fSlopeY * x;
188 Float_t z = fOffsetZ + fSlopeZ * x;
189 return AliTRDtrackPosition(y, z, fSlopeY*3.);
192 void AliTRDtrackParametrizationStraightLine::Print(Option_t * /* option */) const
194 printf("straight line: offsetY = %4.1f, slopeY = %4.1f; offsetZ = %4.1f, slopeZ = %4.1f\n",
195 fOffsetY, fSlopeY, fOffsetZ, fSlopeZ);
198 AliTRDtrackParametrizationCurved::AliTRDtrackParametrizationCurved() :
199 AliTRDtrackParametrization("helix", "helix"),
210 void AliTRDtrackParametrizationCurved::SetParams(ROOT::Math::Minimizer * minim)
212 minim->SetVariable(0, "offsety", 0., 0.1);
213 minim->SetVariable(1, "invradius", 0., 0.1);
214 // minim->SetVariable(2, "offsetz", 1., 0.1);
215 minim->SetFixedVariable(2, "offsetz", 0.);
216 minim->SetVariable(3, "slopez", 0., 0.1);
220 void AliTRDtrackParametrizationCurved::GetParams(ROOT::Math::Minimizer * minim)
222 this->SetValues(minim->X());
226 void AliTRDtrackParametrizationCurved::SetValues(const Double_t *par)
234 AliTRDtrackPosition AliTRDtrackParametrizationCurved::ExtrapolateToLayer(Int_t layer)
236 return ExtrapolateToX(AliTRDtrackOnline::fgGeometry->GetTime0(layer));
239 AliTRDtrackPosition AliTRDtrackParametrizationCurved::ExtrapolateToX(Float_t x)
241 Double_t yext1 = GetY(x);
242 Double_t yext2 = GetY(x + 3.);
244 Double_t zext = fOffsetZ + fSlopeZ * x;
246 return AliTRDtrackPosition(yext1, zext, yext2-yext1);
249 Float_t AliTRDtrackParametrizationCurved::GetY(Float_t x)
252 // use Taylor expansion for small 1/R
253 if (TMath::Abs(fRadiusInv) < 1.) {
255 yext = fOffsetY * x/fOffsetX;
257 yext += - (fOffsetX - x) * x * fRadiusInv /
258 (2 * (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)) *
259 (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)) *
260 (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)));
263 Double_t disc = 1./(fOffsetX*fOffsetX + fOffsetY*fOffsetY) - fRadiusInv*fRadiusInv/4.;
265 AliError("Discriminant < 0");
268 yext = TMath::Sqrt(disc) -
269 TMath::Sqrt((fRadiusInv*fOffsetY/2. + fOffsetX * TMath::Sqrt(disc)) *
270 (fRadiusInv*fOffsetY/2. + fOffsetX * TMath::Sqrt(disc)) /
271 (fOffsetX*fOffsetX) -
272 fRadiusInv*fRadiusInv/(fOffsetX*fOffsetX)* x*x +
273 fRadiusInv*fRadiusInv/fOffsetX * x +
274 2 * fRadiusInv * fOffsetY * (x - fOffsetX)/(fOffsetX*fOffsetX) * TMath::Sqrt(disc));
275 yext = fOffsetY/2. - fOffsetX * yext / fRadiusInv;
281 void AliTRDtrackParametrizationCurved::Print(Option_t * /* option */) const
283 printf("helix curve: 1/R = %f, y = %4.1f\n", fRadiusInv, fOffsetY);
287 AliTRDtrackResiduals::AliTRDtrackResiduals(const AliTRDtrackOnline *track, AliTRDtrackParametrization *param) :
288 ROOT::Math::IBaseFunctionMultiDim(),
295 AliTRDtrackResiduals::AliTRDtrackResiduals(const AliTRDtrackResiduals &rhs) :
296 ROOT::Math::IBaseFunctionMultiDim(rhs),
303 AliTRDtrackResiduals& AliTRDtrackResiduals::operator=(const AliTRDtrackResiduals &rhs)
306 ROOT::Math::IBaseFunctionMultiDim::operator=(rhs);
314 AliTRDtrackResiduals* AliTRDtrackResiduals::Clone() const
316 return new AliTRDtrackResiduals(*this);
319 Double_t AliTRDtrackResiduals::DoEval(const Double_t *par) const
321 // calculate chi2 for the given values for the parametrization
328 // actually set the values for the parametrization
329 fParam->SetValues(par);
331 // loop over all contributing tracklets
332 for (Int_t iTracklet = 0; iTracklet < fTrack->GetNTracklets(); iTracklet++) {
333 AliVTrdTracklet *trkl = fTrack->GetTracklet(iTracklet);
335 // Int_t layer = trkl->GetDetector() % 6;
337 AliTRDtrackPosition pos = fParam->ExtrapolateToX(AliTRDtrackOnline::GetX(trkl));
338 Float_t yext = pos.GetY();
339 Float_t zext = pos.GetZ();
341 AliTRDpadPlane *pp = fgGeometry->GetPadPlane(trkl->GetDetector());
342 Float_t zlen = 0.5 * pp->GetRowSize(trkl->GetBinZ());
343 Float_t zpad = AliTRDtrackOnline::GetZ(trkl);
344 Float_t zrel = zext - zpad;
347 else if (zrel < -zlen)
350 Float_t ycorr = trkl->GetLocalY() + TMath::Tan(TMath::Pi()/180.*pp->GetTiltingAngle()) * zrel;
352 deltaY = ycorr - yext;
353 deltaZ = zpad - zext;
355 deltaZ /= pp->GetRowSize(trkl->GetBinZ()) / TMath::Sqrt(12.);
356 // printf("for tracklet %i: deltaY = %f, deltaZ = %f\n", iTracklet, deltaY, deltaZ);
358 chi2 += deltaY*deltaY + deltaZ*deltaZ;
361 // printf("chi2 = %f\n", chi2);