#include <limits>
#include "TObject.h"
#include "TList.h"
#include "TMath.h"
#include "Math/Minimizer.h"
#include "AliLog.h"
#include "AliVTrdTracklet.h"
#include "AliTRDgeometry.h"
#include "AliTRDpadPlane.h"
#include "AliTRDtrackOnline.h"
AliTRDgeometry *AliTRDtrackOnline::fgGeometry = new AliTRDgeometry();
AliTRDtrackOnline::AliTRDtrackOnline() :
TObject(),
fNTracklets(0),
fTracklets(),
fTrackParametrizations(),
fErrorY(0.05)
{
}
AliTRDtrackOnline::~AliTRDtrackOnline()
{
}
void AliTRDtrackOnline::AddTracklet(AliVTrdTracklet *trkl)
{
if (fNTracklets == fgkMaxTracklets)
return;
else
fTracklets[fNTracklets++] = trkl;
}
Bool_t AliTRDtrackOnline::Fit(ROOT::Math::Minimizer *minim)
{
Bool_t minSuccess = kFALSE;
if (minim) {
minSuccess = kTRUE;
TIter param(&fTrackParametrizations);
while (AliTRDtrackParametrization *par = (AliTRDtrackParametrization*) param()) {
AliTRDtrackResiduals res(this, par);
minim->Clear();
minim->SetFunction(res);
par->SetParams(minim);
minSuccess &= minim->Minimize();
par->GetParams(minim);
}
}
return minSuccess;
}
AliTRDtrackPosition AliTRDtrackOnline::ExtrapolateToLayer(Int_t )
{
Int_t maxLayer = -1;
AliVTrdTracklet *trklBest = 0x0;
for (Int_t iTracklet = fNTracklets-1; iTracklet > -1; iTracklet--) {
AliVTrdTracklet *trkl = (AliVTrdTracklet*) fTracklets[iTracklet];
if (trkl->GetDetector() % 6 >= maxLayer) {
maxLayer = trkl->GetDetector() % 6;
trklBest = trkl;
}
}
if (trklBest)
return AliTRDtrackPosition(trklBest->GetLocalY(), GetZ(trklBest));
else {
AliFatal("No tracklet in this track");
return AliTRDtrackPosition(std::numeric_limits<float>::quiet_NaN(), std::numeric_limits<float>::quiet_NaN());
}
}
void AliTRDtrackOnline::Print(Option_t* ) const
{
printf("track with %i tracklets:\n", GetNTracklets());
for (Int_t iTracklet = 0; iTracklet < fNTracklets; iTracklet++) {
printf(" 0x%08x %i %4.1f %4.1f\n",
((AliVTrdTracklet*) fTracklets[iTracklet])->GetTrackletWord(),
((AliVTrdTracklet*) fTracklets[iTracklet])->GetDetector() % 6,
((AliVTrdTracklet*) fTracklets[iTracklet])->GetLocalY(),
GetZ((AliVTrdTracklet*) fTracklets[iTracklet]));
}
TIter next(&fTrackParametrizations);
while (AliTRDtrackParametrization *param = (AliTRDtrackParametrization*) next()) {
param->Print();
}
}
AliTRDtrackPosition::AliTRDtrackPosition(Float_t y, Float_t z, Float_t dy) :
TObject(),
fY(y),
fZ(z),
fDy(dy)
{
}
AliTRDtrackPosition::~AliTRDtrackPosition()
{
}
Float_t AliTRDtrackPosition::Distance(AliVTrdTracklet *trkl) const
{
return TMath::Hypot(trkl->GetLocalY() - fY, AliTRDtrackOnline::GetZ(trkl) - fZ);
}
AliTRDtrackParametrization::AliTRDtrackParametrization(const char* name, const char* title) :
TNamed(name, title),
fFitGood(kFALSE)
{
}
AliTRDtrackParametrizationStraightLine::AliTRDtrackParametrizationStraightLine() :
AliTRDtrackParametrization("straight line", "straight line"),
fOffsetY(0),
fSlopeY(0),
fOffsetZ(0),
fSlopeZ(0)
{
}
AliTRDtrackParametrizationStraightLine::AliTRDtrackParametrizationStraightLine(Double_t offsetY, Double_t slopeY,
Double_t offsetZ, Double_t slopeZ) :
AliTRDtrackParametrization("straight line", Form("straight line: y = %4.2f + %4.2f * x, z = %4.2f + %4.2f *x",
offsetY, slopeY, offsetZ, slopeZ)),
fOffsetY(offsetY),
fSlopeY(slopeY),
fOffsetZ(offsetZ),
fSlopeZ(slopeZ)
{
}
void AliTRDtrackParametrizationStraightLine::SetParams(ROOT::Math::Minimizer * minim)
{
minim->SetVariable(0, "offsety", 0., 0.1);
minim->SetVariable(1, "slopey", 0., 0.1);
minim->SetFixedVariable(2, "offsetz", 0.);
minim->SetVariable(3, "slopez", 0., 0.1);
}
void AliTRDtrackParametrizationStraightLine::GetParams(ROOT::Math::Minimizer * minim)
{
fOffsetY = minim->X()[0];
fSlopeY = minim->X()[1];
fOffsetZ = minim->X()[2];
fSlopeZ = minim->X()[3];
}
void AliTRDtrackParametrizationStraightLine::SetValues(const Double_t *par)
{
fOffsetY = par[0];
fSlopeY = par[1];
fOffsetZ = par[2];
fSlopeZ = par[3];
}
AliTRDtrackPosition AliTRDtrackParametrizationStraightLine::ExtrapolateToLayer(Int_t layer)
{
Float_t y = fOffsetY + fSlopeY * AliTRDtrackOnline::fgGeometry->GetTime0(layer);
Float_t z = fOffsetZ + fSlopeZ * AliTRDtrackOnline::fgGeometry->GetTime0(layer);
return AliTRDtrackPosition(y, z, fSlopeY*3.);
}
AliTRDtrackPosition AliTRDtrackParametrizationStraightLine::ExtrapolateToX(Float_t x)
{
Float_t y = fOffsetY + fSlopeY * x;
Float_t z = fOffsetZ + fSlopeZ * x;
return AliTRDtrackPosition(y, z, fSlopeY*3.);
}
void AliTRDtrackParametrizationStraightLine::Print(Option_t * ) const
{
printf("straight line: offsetY = %4.1f, slopeY = %4.1f; offsetZ = %4.1f, slopeZ = %4.1f\n",
fOffsetY, fSlopeY, fOffsetZ, fSlopeZ);
}
AliTRDtrackParametrizationCurved::AliTRDtrackParametrizationCurved() :
AliTRDtrackParametrization("helix", "helix"),
fRadiusInv(0.),
fOffsetY(0.),
fOffsetZ(0.),
fSlopeZ(0.),
fOffsetX(300.)
{
}
void AliTRDtrackParametrizationCurved::SetParams(ROOT::Math::Minimizer * minim)
{
minim->SetVariable(0, "offsety", 0., 0.1);
minim->SetVariable(1, "invradius", 0., 0.1);
minim->SetFixedVariable(2, "offsetz", 0.);
minim->SetVariable(3, "slopez", 0., 0.1);
}
void AliTRDtrackParametrizationCurved::GetParams(ROOT::Math::Minimizer * minim)
{
this->SetValues(minim->X());
}
void AliTRDtrackParametrizationCurved::SetValues(const Double_t *par)
{
fOffsetY = par[0];
fRadiusInv = par[1];
fOffsetZ = par[2];
fSlopeZ = par[3];
}
AliTRDtrackPosition AliTRDtrackParametrizationCurved::ExtrapolateToLayer(Int_t layer)
{
return ExtrapolateToX(AliTRDtrackOnline::fgGeometry->GetTime0(layer));
}
AliTRDtrackPosition AliTRDtrackParametrizationCurved::ExtrapolateToX(Float_t x)
{
Double_t yext1 = GetY(x);
Double_t yext2 = GetY(x + 3.);
Double_t zext = fOffsetZ + fSlopeZ * x;
return AliTRDtrackPosition(yext1, zext, yext2-yext1);
}
Float_t AliTRDtrackParametrizationCurved::GetY(Float_t x)
{
Double_t yext = 0.;
if (TMath::Abs(fRadiusInv) < 1.) {
yext = fOffsetY * x/fOffsetX;
yext += - (fOffsetX - x) * x * fRadiusInv /
(2 * (fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)) *
(fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)) *
(fOffsetX*1./TMath::Sqrt(fOffsetX*fOffsetX + fOffsetY*fOffsetY)));
}
else {
Double_t disc = 1./(fOffsetX*fOffsetX + fOffsetY*fOffsetY) - fRadiusInv*fRadiusInv/4.;
if (disc < 0) {
AliError("Discriminant < 0");
return 1000.;
}
yext = TMath::Sqrt(disc) -
TMath::Sqrt((fRadiusInv*fOffsetY/2. + fOffsetX * TMath::Sqrt(disc)) *
(fRadiusInv*fOffsetY/2. + fOffsetX * TMath::Sqrt(disc)) /
(fOffsetX*fOffsetX) -
fRadiusInv*fRadiusInv/(fOffsetX*fOffsetX)* x*x +
fRadiusInv*fRadiusInv/fOffsetX * x +
2 * fRadiusInv * fOffsetY * (x - fOffsetX)/(fOffsetX*fOffsetX) * TMath::Sqrt(disc));
yext = fOffsetY/2. - fOffsetX * yext / fRadiusInv;
}
return yext;
}
void AliTRDtrackParametrizationCurved::Print(Option_t * ) const
{
printf("helix curve: 1/R = %f, y = %4.1f\n", fRadiusInv, fOffsetY);
}
AliTRDtrackResiduals::AliTRDtrackResiduals(const AliTRDtrackOnline *track, AliTRDtrackParametrization *param) :
ROOT::Math::IBaseFunctionMultiDim(),
fTrack(track),
fParam(param)
{
}
AliTRDtrackResiduals::AliTRDtrackResiduals(const AliTRDtrackResiduals &rhs) :
ROOT::Math::IBaseFunctionMultiDim(rhs),
fTrack(rhs.fTrack),
fParam(rhs.fParam)
{
}
AliTRDtrackResiduals& AliTRDtrackResiduals::operator=(const AliTRDtrackResiduals &rhs)
{
if (&rhs != this) {
ROOT::Math::IBaseFunctionMultiDim::operator=(rhs);
fTrack = rhs.fTrack;
fParam = rhs.fParam;
}
return *this;
}
AliTRDtrackResiduals* AliTRDtrackResiduals::Clone() const
{
return new AliTRDtrackResiduals(*this);
}
Double_t AliTRDtrackResiduals::DoEval(const Double_t *par) const
{
Float_t deltaY = 0.;
Float_t deltaZ = 0.;
Float_t chi2 = 0.;
fParam->SetValues(par);
for (Int_t iTracklet = 0; iTracklet < fTrack->GetNTracklets(); iTracklet++) {
AliVTrdTracklet *trkl = fTrack->GetTracklet(iTracklet);
AliTRDtrackPosition pos = fParam->ExtrapolateToX(AliTRDtrackOnline::GetX(trkl));
Float_t yext = pos.GetY();
Float_t zext = pos.GetZ();
AliTRDpadPlane *pp = fgGeometry->GetPadPlane(trkl->GetDetector());
Float_t zlen = 0.5 * pp->GetRowSize(trkl->GetBinZ());
Float_t zpad = AliTRDtrackOnline::GetZ(trkl);
Float_t zrel = zext - zpad;
if (zrel > zlen)
zrel = zlen;
else if (zrel < -zlen)
zrel = -zlen;
Float_t ycorr = trkl->GetLocalY() + TMath::Tan(TMath::Pi()/180.*pp->GetTiltingAngle()) * zrel;
deltaY = ycorr - yext;
deltaZ = zpad - zext;
deltaY /= fTrack->GetErrorY();
deltaZ /= pp->GetRowSize(trkl->GetBinZ()) / TMath::Sqrt(12.);
chi2 += deltaY*deltaY + deltaZ*deltaZ;
}
return chi2;
}
AliTRDtrackOnline.cxx:100 AliTRDtrackOnline.cxx:101 AliTRDtrackOnline.cxx:102 AliTRDtrackOnline.cxx:103 AliTRDtrackOnline.cxx:104 AliTRDtrackOnline.cxx:105 AliTRDtrackOnline.cxx:106 AliTRDtrackOnline.cxx:107 AliTRDtrackOnline.cxx:108 AliTRDtrackOnline.cxx:109 AliTRDtrackOnline.cxx:110 AliTRDtrackOnline.cxx:111 AliTRDtrackOnline.cxx:112 AliTRDtrackOnline.cxx:113 AliTRDtrackOnline.cxx:114 AliTRDtrackOnline.cxx:115 AliTRDtrackOnline.cxx:116 AliTRDtrackOnline.cxx:117 AliTRDtrackOnline.cxx:118 AliTRDtrackOnline.cxx:119 AliTRDtrackOnline.cxx:120 AliTRDtrackOnline.cxx:121 AliTRDtrackOnline.cxx:122 AliTRDtrackOnline.cxx:123 AliTRDtrackOnline.cxx:124 AliTRDtrackOnline.cxx:125 AliTRDtrackOnline.cxx:126 AliTRDtrackOnline.cxx:127 AliTRDtrackOnline.cxx:128 AliTRDtrackOnline.cxx:129 AliTRDtrackOnline.cxx:130 AliTRDtrackOnline.cxx:131 AliTRDtrackOnline.cxx:132 AliTRDtrackOnline.cxx:133 AliTRDtrackOnline.cxx:134 AliTRDtrackOnline.cxx:135 AliTRDtrackOnline.cxx:136 AliTRDtrackOnline.cxx:137 AliTRDtrackOnline.cxx:138 AliTRDtrackOnline.cxx:139 AliTRDtrackOnline.cxx:140 AliTRDtrackOnline.cxx:141 AliTRDtrackOnline.cxx:142 AliTRDtrackOnline.cxx:143 AliTRDtrackOnline.cxx:144 AliTRDtrackOnline.cxx:145 AliTRDtrackOnline.cxx:146 AliTRDtrackOnline.cxx:147 AliTRDtrackOnline.cxx:148 AliTRDtrackOnline.cxx:149 AliTRDtrackOnline.cxx:150 AliTRDtrackOnline.cxx:151 AliTRDtrackOnline.cxx:152 AliTRDtrackOnline.cxx:153 AliTRDtrackOnline.cxx:154 AliTRDtrackOnline.cxx:155 AliTRDtrackOnline.cxx:156 AliTRDtrackOnline.cxx:157 AliTRDtrackOnline.cxx:158 AliTRDtrackOnline.cxx:159 AliTRDtrackOnline.cxx:160 AliTRDtrackOnline.cxx:161 AliTRDtrackOnline.cxx:162 AliTRDtrackOnline.cxx:163 AliTRDtrackOnline.cxx:164 AliTRDtrackOnline.cxx:165 AliTRDtrackOnline.cxx:166 AliTRDtrackOnline.cxx:167 AliTRDtrackOnline.cxx:168 AliTRDtrackOnline.cxx:169 AliTRDtrackOnline.cxx:170 AliTRDtrackOnline.cxx:171 AliTRDtrackOnline.cxx:172 AliTRDtrackOnline.cxx:173 AliTRDtrackOnline.cxx:174 AliTRDtrackOnline.cxx:175 AliTRDtrackOnline.cxx:176 AliTRDtrackOnline.cxx:177 AliTRDtrackOnline.cxx:178 AliTRDtrackOnline.cxx:179 AliTRDtrackOnline.cxx:180 AliTRDtrackOnline.cxx:181 AliTRDtrackOnline.cxx:182 AliTRDtrackOnline.cxx:183 AliTRDtrackOnline.cxx:184 AliTRDtrackOnline.cxx:185 AliTRDtrackOnline.cxx:186 AliTRDtrackOnline.cxx:187 AliTRDtrackOnline.cxx:188 AliTRDtrackOnline.cxx:189 AliTRDtrackOnline.cxx:190 AliTRDtrackOnline.cxx:191 AliTRDtrackOnline.cxx:192 AliTRDtrackOnline.cxx:193 AliTRDtrackOnline.cxx:194 AliTRDtrackOnline.cxx:195 AliTRDtrackOnline.cxx:196 AliTRDtrackOnline.cxx:197 AliTRDtrackOnline.cxx:198 AliTRDtrackOnline.cxx:199 AliTRDtrackOnline.cxx:200 AliTRDtrackOnline.cxx:201 AliTRDtrackOnline.cxx:202 AliTRDtrackOnline.cxx:203 AliTRDtrackOnline.cxx:204 AliTRDtrackOnline.cxx:205 AliTRDtrackOnline.cxx:206 AliTRDtrackOnline.cxx:207 AliTRDtrackOnline.cxx:208 AliTRDtrackOnline.cxx:209 AliTRDtrackOnline.cxx:210 AliTRDtrackOnline.cxx:211 AliTRDtrackOnline.cxx:212 AliTRDtrackOnline.cxx:213 AliTRDtrackOnline.cxx:214 AliTRDtrackOnline.cxx:215 AliTRDtrackOnline.cxx:216 AliTRDtrackOnline.cxx:217 AliTRDtrackOnline.cxx:218 AliTRDtrackOnline.cxx:219 AliTRDtrackOnline.cxx:220 AliTRDtrackOnline.cxx:221 AliTRDtrackOnline.cxx:222 AliTRDtrackOnline.cxx:223 AliTRDtrackOnline.cxx:224 AliTRDtrackOnline.cxx:225 AliTRDtrackOnline.cxx:226 AliTRDtrackOnline.cxx:227 AliTRDtrackOnline.cxx:228 AliTRDtrackOnline.cxx:229 AliTRDtrackOnline.cxx:230 AliTRDtrackOnline.cxx:231 AliTRDtrackOnline.cxx:232 AliTRDtrackOnline.cxx:233 AliTRDtrackOnline.cxx:234 AliTRDtrackOnline.cxx:235 AliTRDtrackOnline.cxx:236 AliTRDtrackOnline.cxx:237 AliTRDtrackOnline.cxx:238 AliTRDtrackOnline.cxx:239 AliTRDtrackOnline.cxx:240 AliTRDtrackOnline.cxx:241 AliTRDtrackOnline.cxx:242 AliTRDtrackOnline.cxx:243 AliTRDtrackOnline.cxx:244 AliTRDtrackOnline.cxx:245 AliTRDtrackOnline.cxx:246 AliTRDtrackOnline.cxx:247 AliTRDtrackOnline.cxx:248 AliTRDtrackOnline.cxx:249 AliTRDtrackOnline.cxx:250 AliTRDtrackOnline.cxx:251 AliTRDtrackOnline.cxx:252 AliTRDtrackOnline.cxx:253 AliTRDtrackOnline.cxx:254 AliTRDtrackOnline.cxx:255 AliTRDtrackOnline.cxx:256 AliTRDtrackOnline.cxx:257 AliTRDtrackOnline.cxx:258 AliTRDtrackOnline.cxx:259 AliTRDtrackOnline.cxx:260 AliTRDtrackOnline.cxx:261 AliTRDtrackOnline.cxx:262 AliTRDtrackOnline.cxx:263 AliTRDtrackOnline.cxx:264 AliTRDtrackOnline.cxx:265 AliTRDtrackOnline.cxx:266 AliTRDtrackOnline.cxx:267 AliTRDtrackOnline.cxx:268 AliTRDtrackOnline.cxx:269 AliTRDtrackOnline.cxx:270 AliTRDtrackOnline.cxx:271 AliTRDtrackOnline.cxx:272 AliTRDtrackOnline.cxx:273 AliTRDtrackOnline.cxx:274 AliTRDtrackOnline.cxx:275 AliTRDtrackOnline.cxx:276 AliTRDtrackOnline.cxx:277 AliTRDtrackOnline.cxx:278 AliTRDtrackOnline.cxx:279 AliTRDtrackOnline.cxx:280 AliTRDtrackOnline.cxx:281 AliTRDtrackOnline.cxx:282 AliTRDtrackOnline.cxx:283 AliTRDtrackOnline.cxx:284 AliTRDtrackOnline.cxx:285 AliTRDtrackOnline.cxx:286 AliTRDtrackOnline.cxx:287 AliTRDtrackOnline.cxx:288 AliTRDtrackOnline.cxx:289 AliTRDtrackOnline.cxx:290 AliTRDtrackOnline.cxx:291 AliTRDtrackOnline.cxx:292 AliTRDtrackOnline.cxx:293 AliTRDtrackOnline.cxx:294 AliTRDtrackOnline.cxx:295 AliTRDtrackOnline.cxx:296 AliTRDtrackOnline.cxx:297 AliTRDtrackOnline.cxx:298 AliTRDtrackOnline.cxx:299 AliTRDtrackOnline.cxx:300 AliTRDtrackOnline.cxx:301 AliTRDtrackOnline.cxx:302 AliTRDtrackOnline.cxx:303 AliTRDtrackOnline.cxx:304 AliTRDtrackOnline.cxx:305 AliTRDtrackOnline.cxx:306 AliTRDtrackOnline.cxx:307 AliTRDtrackOnline.cxx:308 AliTRDtrackOnline.cxx:309 AliTRDtrackOnline.cxx:310 AliTRDtrackOnline.cxx:311 AliTRDtrackOnline.cxx:312 AliTRDtrackOnline.cxx:313 AliTRDtrackOnline.cxx:314 AliTRDtrackOnline.cxx:315 AliTRDtrackOnline.cxx:316 AliTRDtrackOnline.cxx:317 AliTRDtrackOnline.cxx:318 AliTRDtrackOnline.cxx:319 AliTRDtrackOnline.cxx:320 AliTRDtrackOnline.cxx:321 AliTRDtrackOnline.cxx:322 AliTRDtrackOnline.cxx:323 AliTRDtrackOnline.cxx:324 AliTRDtrackOnline.cxx:325 AliTRDtrackOnline.cxx:326 AliTRDtrackOnline.cxx:327 AliTRDtrackOnline.cxx:328 AliTRDtrackOnline.cxx:329 AliTRDtrackOnline.cxx:330 AliTRDtrackOnline.cxx:331 AliTRDtrackOnline.cxx:332 AliTRDtrackOnline.cxx:333 AliTRDtrackOnline.cxx:334 AliTRDtrackOnline.cxx:335 AliTRDtrackOnline.cxx:336 AliTRDtrackOnline.cxx:337 AliTRDtrackOnline.cxx:338 AliTRDtrackOnline.cxx:339 AliTRDtrackOnline.cxx:340 AliTRDtrackOnline.cxx:341 AliTRDtrackOnline.cxx:342 AliTRDtrackOnline.cxx:343 AliTRDtrackOnline.cxx:344 AliTRDtrackOnline.cxx:345 AliTRDtrackOnline.cxx:346 AliTRDtrackOnline.cxx:347 AliTRDtrackOnline.cxx:348 AliTRDtrackOnline.cxx:349 AliTRDtrackOnline.cxx:350 AliTRDtrackOnline.cxx:351 AliTRDtrackOnline.cxx:352 AliTRDtrackOnline.cxx:353 AliTRDtrackOnline.cxx:354 AliTRDtrackOnline.cxx:355 AliTRDtrackOnline.cxx:356 AliTRDtrackOnline.cxx:357 AliTRDtrackOnline.cxx:358 AliTRDtrackOnline.cxx:359 AliTRDtrackOnline.cxx:360 AliTRDtrackOnline.cxx:361 AliTRDtrackOnline.cxx:362 AliTRDtrackOnline.cxx:363 AliTRDtrackOnline.cxx:364