X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDtrackerV1.cxx;h=c0203971f51c132cfcd4bac1779e19a276d96af5;hb=d5d8dd9a7a53e9345c6e556091451516a62c35c9;hp=1ffc2f83793498b71f1759915a6b003a7ba1bcfc;hpb=2d73d21c3ec00583a5e675d1eb29753bafa4f983;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDtrackerV1.cxx b/TRD/AliTRDtrackerV1.cxx index 1ffc2f83793..c0203971f51 100644 --- a/TRD/AliTRDtrackerV1.cxx +++ b/TRD/AliTRDtrackerV1.cxx @@ -61,11 +61,6 @@ ClassImp(AliTRDtrackerV1) ClassImp(AliTRDtrackerV1::AliTRDLeastSquare) ClassImp(AliTRDtrackerV1::AliTRDtrackFitterRieman) -const Float_t AliTRDtrackerV1::fgkMinClustersInTrack = 0.5; // -const Float_t AliTRDtrackerV1::fgkLabelFraction = 0.8; // -const Double_t AliTRDtrackerV1::fgkMaxChi2 = 12.0; // -const Double_t AliTRDtrackerV1::fgkMaxSnp = 0.95; // Maximum local sine of the azimuthal angle -const Double_t AliTRDtrackerV1::fgkMaxStep = 2.0; // Maximal step size in propagation Double_t AliTRDtrackerV1::fgTopologicQA[kNConfigs] = { 0.5112, 0.5112, 0.5112, 0.0786, 0.0786, 0.0786, 0.0786, 0.0579, 0.0579, 0.0474, @@ -73,6 +68,8 @@ Double_t AliTRDtrackerV1::fgTopologicQA[kNConfigs] = { }; const Double_t AliTRDtrackerV1::fgkX0[kNPlanes] = { 300.2, 312.8, 325.4, 338.0, 350.6, 363.2}; +// Number of Time Bins/chamber should be also stored independently by the traker +// (also in AliTRDReconstructor) in oder to be able to run HLT. Fix TODO Int_t AliTRDtrackerV1::fgNTimeBins = 0; AliRieman* AliTRDtrackerV1::fgRieman = NULL; TLinearFitter* AliTRDtrackerV1::fgTiltedRieman = NULL; @@ -293,7 +290,7 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event) // (covariance in the yz plane) if(nSeeds){ quality = new Float_t[nSeeds]; - index = new Int_t[nSeeds]; + index = new Int_t[4*nSeeds]; for (Int_t iSeed = nSeeds; iSeed--;) { AliESDtrack *seed = event->GetTrack(iSeed); Double_t covariance[15]; @@ -318,8 +315,9 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event) if ((status & AliESDtrack::kTRDout) != 0) continue; // Propagate to the entrance in the TRD mother volume + track.~AliTRDtrackV1(); new(&track) AliTRDtrackV1(*seed); - if(AliTRDgeometry::GetXtrdBeg() > (fgkMaxStep + track.GetX()) && !PropagateToX(track, AliTRDgeometry::GetXtrdBeg(), fgkMaxStep)){ + if(AliTRDgeometry::GetXtrdBeg() > (AliTRDReconstructor::GetMaxStep() + track.GetX()) && !PropagateToX(track, AliTRDgeometry::GetXtrdBeg(), AliTRDReconstructor::GetMaxStep())){ seed->UpdateTrackParams(&track, AliESDtrack::kTRDStop); continue; } @@ -327,19 +325,19 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event) seed->UpdateTrackParams(&track, AliESDtrack::kTRDStop); continue; } - if(TMath::Abs(track.GetSnp()) > fgkMaxSnp) { + if(TMath::Abs(track.GetSnp()) > AliTRDReconstructor::GetMaxSnp()) { seed->UpdateTrackParams(&track, AliESDtrack::kTRDStop); continue; } - nTPCseeds++; - + AliDebug(2, Form("TRD propagate TPC seed[%d] = %d.", iSeed, index[iSeed])); // store track status at TRD entrance seed->UpdateTrackParams(&track, AliESDtrack::kTRDbackup); // prepare track and do propagation in the TRD track.SetReconstructor(fkReconstructor); track.SetKink(Bool_t(seed->GetKinkIndex(0))); + track.SetPrimary(status & AliESDtrack::kTPCin); expectedClr = FollowBackProlongation(track); // check if track entered the TRD fiducial volume if(track.GetTrackIn()){ @@ -374,7 +372,7 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event) // Make backup for back propagation Int_t foundClr = track.GetNumberOfClusters(); if (foundClr >= foundMin) { - track.CookLabel(1. - fgkLabelFraction); + track.CookLabel(1. - AliTRDReconstructor::GetLabelFraction()); //if(track.GetBackupTrack()) UseClusters(track.GetBackupTrack()); // Sign only gold tracks @@ -429,7 +427,7 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event) xtof = TMath::Sqrt(glob[0]*glob[0]+glob[1]*glob[1]); } } - if(xtof > (fgkMaxStep + track.GetX()) && !PropagateToX(track, xtof, fgkMaxStep)){ + if(xtof > (AliTRDReconstructor::GetMaxStep() + track.GetX()) && !PropagateToX(track, xtof, AliTRDReconstructor::GetMaxStep())){ seed->UpdateTrackParams(&track, AliESDtrack::kTRDStop); continue; } @@ -437,7 +435,7 @@ Int_t AliTRDtrackerV1::PropagateBack(AliESDEvent *event) seed->UpdateTrackParams(&track, AliESDtrack::kTRDStop); continue; } - if(TMath::Abs(track.GetSnp()) > fgkMaxSnp){ + if(TMath::Abs(track.GetSnp()) > AliTRDReconstructor::GetMaxSnp()){ seed->UpdateTrackParams(&track, AliESDtrack::kTRDStop); continue; } @@ -513,7 +511,7 @@ Int_t AliTRDtrackerV1::RefitInward(AliESDEvent *event) } // Prolongate to TPC - if (PropagateToX(track, xTPC, fgkMaxStep)) { // -with update + if (PropagateToX(track, xTPC, AliTRDReconstructor::GetMaxStep())) { // -with update seed->UpdateTrackParams(&track, AliESDtrack::kTRDrefit); found++; kUPDATE = kTRUE; @@ -523,7 +521,7 @@ Int_t AliTRDtrackerV1::RefitInward(AliESDEvent *event) // Prolongate to TPC without update if(!kUPDATE) { AliTRDtrackV1 tt(*seed); - if (PropagateToX(tt, xTPC, fgkMaxStep)) seed->UpdateTrackParams(&tt, AliESDtrack::kTRDbackup); + if (PropagateToX(tt, xTPC, AliTRDReconstructor::GetMaxStep())) seed->UpdateTrackParams(&tt, AliESDtrack::kTRDbackup); } } AliInfo(Form("Number of seeds: TRDout[%d]", nseed)); @@ -571,12 +569,12 @@ Int_t AliTRDtrackerV1::FollowProlongation(AliTRDtrackV1 &t) } Double_t x = tracklet->GetX();//GetX0(); // reject tracklets which are not considered for inward refit - if(x > t.GetX()+fgkMaxStep) continue; + if(x > t.GetX()+AliTRDReconstructor::GetMaxStep()) continue; // append tracklet to track t.SetTracklet(tracklet, index); - if (x < (t.GetX()-fgkMaxStep) && !PropagateToX(t, x+fgkMaxStep, fgkMaxStep)) break; + if (x < (t.GetX()-AliTRDReconstructor::GetMaxStep()) && !PropagateToX(t, x+AliTRDReconstructor::GetMaxStep(), AliTRDReconstructor::GetMaxStep())) break; if (!AdjustSector(&t)) break; // Start global position @@ -611,7 +609,10 @@ Int_t AliTRDtrackerV1::FollowProlongation(AliTRDtrackV1 &t) Double_t cov[3]; tracklet->GetCovAt(x, cov); Double_t p[2] = { tracklet->GetY(), tracklet->GetZ()}; Double_t chi2 = ((AliExternalTrackParam)t).GetPredictedChi2(p, cov); - if (chi2 < 1e+10 && t.Update(p, cov, chi2)){ + if (chi2 < 1e+10 && ((AliExternalTrackParam&)t).Update(p, cov)){ + // Register info to track + t.SetNumberOfClusters(); + t.UpdateChi2(chi2); nClustersExpected += tracklet->GetN(); } } @@ -689,8 +690,7 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) Int_t debugLevel = fkReconstructor->IsDebugStreaming() ? fkRecoParam->GetStreamLevel(AliTRDrecoParam::kTracker) : 0; TTreeSRedirector *cstreamer = fkReconstructor->IsDebugStreaming() ? fkReconstructor->GetDebugStream(AliTRDrecoParam::kTracker) : 0x0; - Bool_t kStoreIn(kTRUE), // - kPropagateIn(kTRUE), // + Bool_t kStoreIn(kTRUE), // toggel store track params. at TRD entry kStandAlone(kFALSE), // toggle tracker awarness of stand alone seeding kUseTRD(fkRecoParam->IsOverPtThreshold(t.Pt()));// use TRD measurment to update Kalman @@ -706,6 +706,7 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) t.UnsetTracklet(ip); if(tracklets[ip]->IsOK()) startLayer=ip; kStandAlone = kTRUE; + kUseTRD = kTRUE; } AliDebug(4, Form("SA[%c] Start[%d]\n" " [0]idx[%d] traklet[%p]\n" @@ -751,7 +752,7 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) !matrix ){ AliDebug(4, Form("Missing Geometry ly[%d]. Guess radial position", ily)); // propagate to the default radial position - if(fR[ily] > (fgkMaxStep + t.GetX()) && !PropagateToX(t, fR[ily], fgkMaxStep)){ + if(fR[ily] > (AliTRDReconstructor::GetMaxStep() + t.GetX()) && !PropagateToX(t, fR[ily], AliTRDReconstructor::GetMaxStep())){ n=-1; t.SetStatus(AliTRDtrackV1::kPropagation); AliDebug(4, "Failed Propagation [Missing Geometry]"); @@ -763,7 +764,7 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) AliDebug(4, "Failed Adjust Sector [Missing Geometry]"); break; } - if(TMath::Abs(t.GetSnp()) > fgkMaxSnp){ + if(TMath::Abs(t.GetSnp()) > AliTRDReconstructor::GetMaxSnp()){ n=-1; t.SetStatus(AliTRDtrackV1::kSnp); AliDebug(4, "Failed Max Snp [Missing Geometry]"); @@ -779,8 +780,8 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) matrix->LocalToMaster(loc, glb); // Propagate to the radial distance of the current layer - x = glb[0] - fgkMaxStep; - if(x > (fgkMaxStep + t.GetX()) && !PropagateToX(t, x, fgkMaxStep)){ + x = glb[0] - AliTRDReconstructor::GetMaxStep(); + if(x > (AliTRDReconstructor::GetMaxStep() + t.GetX()) && !PropagateToX(t, x, AliTRDReconstructor::GetMaxStep())){ n=-1; t.SetStatus(AliTRDtrackV1::kPropagation); AliDebug(4, Form("Failed Initial Propagation to x[%7.2f]", x)); @@ -792,10 +793,10 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) AliDebug(4, "Failed Adjust Sector Start"); break; } - if(TMath::Abs(t.GetSnp()) > fgkMaxSnp) { + if(TMath::Abs(t.GetSnp()) > AliTRDReconstructor::GetMaxSnp()) { n=-1; t.SetStatus(AliTRDtrackV1::kSnp); - AliDebug(4, Form("Failed Max Snp[%f] MaxSnp[%f]", t.GetSnp(), fgkMaxSnp)); + AliDebug(4, Form("Failed Max Snp[%f] MaxSnp[%f]", t.GetSnp(), AliTRDReconstructor::GetMaxSnp())); break; } Bool_t doRecalculate = kFALSE; @@ -815,14 +816,14 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) continue; } matrix->LocalToMaster(loc, glb); - x = glb[0] - fgkMaxStep; + x = glb[0] - AliTRDReconstructor::GetMaxStep(); } // check if track is well inside fiducial volume - if (!t.GetProlongation(x+fgkMaxStep, y, z)) { + if (!t.GetProlongation(x+AliTRDReconstructor::GetMaxStep(), y, z)) { n=-1; t.SetStatus(AliTRDtrackV1::kProlongation); - AliDebug(4, Form("Failed Prolongation to x[%7.2f] y[%7.2f] z[%7.2f]", x+fgkMaxStep, y, z)); + AliDebug(4, Form("Failed Prolongation to x[%7.2f] y[%7.2f] z[%7.2f]", x+AliTRDReconstructor::GetMaxStep(), y, z)); break; } if(fGeom->IsOnBoundary(det, y, z, .5)){ @@ -863,18 +864,20 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) continue; } // build tracklet + tracklet.~AliTRDseedV1(); ptrTracklet = new(&tracklet) AliTRDseedV1(det); ptrTracklet->SetReconstructor(fkReconstructor); ptrTracklet->SetKink(t.IsKink()); + ptrTracklet->SetPrimary(t.IsPrimary()); ptrTracklet->SetPadPlane(fGeom->GetPadPlane(ily, stk)); ptrTracklet->SetX0(glb[0]+driftLength); - if(!tracklet.Init(&t)){ + if(!ptrTracklet->Init(&t)){ n=-1; t.SetStatus(AliTRDtrackV1::kTrackletInit); AliDebug(4, "Failed Tracklet Init"); break; } - if(!tracklet.AttachClusters(chamber, kTRUE)){ + if(!ptrTracklet->AttachClusters(chamber, kTRUE)){ t.SetStatus(AliTRDtrackV1::kNoAttach, ily); if(debugLevel>3){ AliTRDseedV1 trackletCp(*ptrTracklet); @@ -887,8 +890,8 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) AliDebug(4, "Failed Attach Clusters"); continue; } - AliDebug(3, Form("Number of Clusters in Tracklet: %d", tracklet.GetN())); - if(tracklet.GetN() < fgNTimeBins*fkRecoParam ->GetFindableClusters()){ + AliDebug(3, Form("Number of Clusters in Tracklet: %d", ptrTracklet->GetN())); + if(ptrTracklet->GetN() < fgNTimeBins*fkRecoParam->GetFindableClusters()){ t.SetStatus(AliTRDtrackV1::kNoClustersTracklet, ily); if(debugLevel>3){ AliTRDseedV1 trackletCp(*ptrTracklet); @@ -905,14 +908,17 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) } else AliDebug(2, Form("Use external tracklet ly[%d]", ily)); // propagate track to the radial position of the tracklet - // fit tracklet no tilt correction - if(!ptrTracklet->Fit(kFALSE)){ + // fit tracklet + // tilt correction options + // 0 : no correction + // 2 : pseudo tilt correction + if(!ptrTracklet->Fit(2)){ t.SetStatus(AliTRDtrackV1::kNoFit, ily); AliDebug(4, "Failed Tracklet Fit"); continue; } x = ptrTracklet->GetX(); //GetX0(); - if(x > (fgkMaxStep + t.GetX()) && !PropagateToX(t, x, fgkMaxStep)) { + if(x > (AliTRDReconstructor::GetMaxStep() + t.GetX()) && !PropagateToX(t, x, AliTRDReconstructor::GetMaxStep())) { n=-1; t.SetStatus(AliTRDtrackV1::kPropagation); AliDebug(4, Form("Failed Propagation to Tracklet x[%7.2f]", x)); @@ -924,16 +930,12 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) AliDebug(4, "Failed Adjust Sector"); break; } - if(TMath::Abs(t.GetSnp()) > fgkMaxSnp) { + if(TMath::Abs(t.GetSnp()) > AliTRDReconstructor::GetMaxSnp()) { n=-1; t.SetStatus(AliTRDtrackV1::kSnp); - AliDebug(4, Form("Failed Max Snp[%f] MaxSnp[%f]", t.GetSnp(), fgkMaxSnp)); + AliDebug(4, Form("Failed Max Snp[%f] MaxSnp[%f]", t.GetSnp(), AliTRDReconstructor::GetMaxSnp())); break; } - if(kPropagateIn){ - t.SetTrackIn(); - kPropagateIn = kFALSE; - } Double_t cov[3]; ptrTracklet->GetCovAt(x, cov); Double_t p[2] = { ptrTracklet->GetY(), ptrTracklet->GetZ()}; Double_t chi2 = ((AliExternalTrackParam)t).GetPredictedChi2(p, cov); @@ -954,33 +956,39 @@ Int_t AliTRDtrackerV1::FollowBackProlongation(AliTRDtrackV1 &t) AliDebug(4, Form("Failed Chi2[%f]", chi2)); continue; } - if(!t.Update(p, cov, chi2, kUseTRD)) { - n=-1; - t.SetStatus(AliTRDtrackV1::kUpdate); - if(debugLevel > 2){ - UChar_t status(t.GetStatusTRD()); - AliTRDseedV1 trackletCp(*ptrTracklet); - AliTRDtrackV1 trackCp(t); - trackCp.SetOwner(); - (*cstreamer) << "FollowBackProlongation1" - << "status=" << status - << "tracklet.=" << &trackletCp - << "track.=" << &trackCp - << "\n"; + if(kUseTRD){ + if(!((AliExternalTrackParam&)t).Update(p, cov)) { + n=-1; + t.SetStatus(AliTRDtrackV1::kUpdate); + if(debugLevel > 2){ + UChar_t status(t.GetStatusTRD()); + AliTRDseedV1 trackletCp(*ptrTracklet); + AliTRDtrackV1 trackCp(t); + trackCp.SetOwner(); + (*cstreamer) << "FollowBackProlongation1" + << "status=" << status + << "tracklet.=" << &trackletCp + << "track.=" << &trackCp + << "\n"; + } + AliDebug(4, Form("Failed Track Update @ y[%7.2f] z[%7.2f] s2y[%f] s2z[%f] covyz[%f]", p[0], p[1], cov[0], cov[2], cov[1])); + break; } - AliDebug(4, Form("Failed Track Update @ y[%7.2f] z[%7.2f] s2y[%f] s2z[%f] covyz[%f]", p[0], p[1], cov[0], cov[2], cov[1])); - break; } if(!kStandAlone) ptrTracklet->UseClusters(); // fill residuals ?! AliTracker::FillResiduals(&t, p, cov, ptrTracklet->GetVolumeId()); - // load tracklet to the tracker + // register tracklet with the tracker and track ptrTracklet->Update(&t); ptrTracklet = SetTracklet(ptrTracklet); Int_t index(fTracklets->GetEntriesFast()-1); t.SetTracklet(ptrTracklet, index); + // Register info to track + t.SetNumberOfClusters(); + t.UpdateChi2(chi2); + n += ptrTracklet->GetN(); AliDebug(2, Form("Setting Tracklet[%d] @ Idx[%d]", ily, index)); @@ -1123,12 +1131,8 @@ Float_t AliTRDtrackerV1::FitTiltedRiemanConstraint(AliTRDseedV1 *tracklets, Doub if(!tracklets[ilr].IsOK()) continue; for(Int_t itb = 0; itb < AliTRDseedV1::kNclusters; itb++){ if(!tracklets[ilr].IsUsable(itb)) continue; - cl = tracklets[ilr].GetClusters(itb); + if(!(cl = tracklets[ilr].GetClusters(itb))) continue; if(!cl->IsInChamber()) continue; - if(cl->GetSigmaY2()<1.e-6 || cl->GetSigmaZ2()<1.e-6){ - if(AliLog::GetDebugLevel("TRD", "AliTRDtrackerV1")>1) printf("D-AliTRDtrackerV1::FitTiltedRiemanConstraint: Cluster error parameterization missing. This should appear only in HLT tests."); - continue; - } x = cl->GetX(); y = cl->GetY(); z = cl->GetZ(); @@ -1232,11 +1236,6 @@ Float_t AliTRDtrackerV1::FitTiltedRieman(AliTRDseedV1 *tracklets, Bool_t sigErro x = cl->GetX(); y = cl->GetY(); z = cl->GetZ(); - if(cl->GetSigmaY2()<1.e-6 || cl->GetSigmaZ2()<1.e-6){ - if(AliLog::GetDebugLevel("TRD", "AliTRDtrackerV1")>1) printf("D-AliTRDtrackerV1::FitTiltedRieman: Cluster error parameterization missing. This should appear only in HLT tests."); - tracklets[ipl].Print("a"); - continue; - } dx = x - xref; // Transformation t = 1./(x*x + y*y); @@ -1265,7 +1264,7 @@ Float_t AliTRDtrackerV1::FitTiltedRieman(AliTRDseedV1 *tracklets, Bool_t sigErro nPoints++; } } - fitter->Eval(); + if (fitter->Eval()) return 1.e10; zfitter.Eval(); Double_t offset = fitter->GetParameter(3); @@ -1669,7 +1668,8 @@ Double_t AliTRDtrackerV1::FitKalman(AliTRDtrackV1 *track, AliTRDseedV1 * const t //if(points) printf("First marker point @ x[%d] = %f\n", ip, points[ip].GetX()); - AliTRDseedV1 tracklet, *ptrTracklet = NULL; + AliTRDseedV1 tracklet; + AliTRDseedV1 *ptrTracklet = NULL; //Loop through the TRD planes for (Int_t jplane = 0; jplane < kNPlanes; jplane++) { @@ -1692,8 +1692,8 @@ Double_t AliTRDtrackerV1::FitKalman(AliTRDtrackV1 *track, AliTRDseedV1 * const t while(ip < np){ //don't do anything if next marker is after next update point. - if((up?-1:1) * (points[ip].GetX() - x) - fgkMaxStep < 0) break; - if(((up?-1:1) * (points[ip].GetX() - track->GetX()) < 0) && !PropagateToX(*track, points[ip].GetX(), fgkMaxStep)) return -1.; + if((up?-1:1) * (points[ip].GetX() - x) - AliTRDReconstructor::GetMaxStep() < 0) break; + if(((up?-1:1) * (points[ip].GetX() - track->GetX()) < 0) && !PropagateToX(*track, points[ip].GetX(), AliTRDReconstructor::GetMaxStep())) return -1.; Double_t xyz[3]; // should also get the covariance track->GetXYZ(xyz); @@ -1704,10 +1704,10 @@ Double_t AliTRDtrackerV1::FitKalman(AliTRDtrackV1 *track, AliTRDseedV1 * const t // printf("plane[%d] tracklet[%p] x[%f]\n", iplane, ptrTracklet, x); // Propagate closer to the next update point - if(((up?-1:1) * (x - track->GetX()) + fgkMaxStep < 0) && !PropagateToX(*track, x + (up?-1:1)*fgkMaxStep, fgkMaxStep)) return -1.; + if(((up?-1:1) * (x - track->GetX()) + AliTRDReconstructor::GetMaxStep() < 0) && !PropagateToX(*track, x + (up?-1:1)*AliTRDReconstructor::GetMaxStep(), AliTRDReconstructor::GetMaxStep())) return -1.; if(!AdjustSector(track)) return -1; - if(TMath::Abs(track->GetSnp()) > fgkMaxSnp) return -1; + if(TMath::Abs(track->GetSnp()) > AliTRDReconstructor::GetMaxSnp()) return -1; //load tracklet to the tracker and the track /* Int_t index; @@ -1747,7 +1747,7 @@ Double_t AliTRDtrackerV1::FitKalman(AliTRDtrackV1 *track, AliTRDseedV1 * const t Double_t cov[3]; ptrTracklet->GetCovAt(x, cov); Double_t p[2] = { ptrTracklet->GetY(), ptrTracklet->GetZ()}; Double_t chi2 = ((AliExternalTrackParam*)track)->GetPredictedChi2(p, cov); - if(chi2<1e+10) track->Update(p, cov, chi2); + if(chi2<1e+10) ((AliExternalTrackParam*)track)->Update(p, cov); if(!up) continue; //Reset material budget if 2 consecutive gold @@ -1756,7 +1756,7 @@ Double_t AliTRDtrackerV1::FitKalman(AliTRDtrackV1 *track, AliTRDseedV1 * const t // extrapolation while(ip < np){ - if(((up?-1:1) * (points[ip].GetX() - track->GetX()) < 0) && !PropagateToX(*track, points[ip].GetX(), fgkMaxStep)) return -1.; + if(((up?-1:1) * (points[ip].GetX() - track->GetX()) < 0) && !PropagateToX(*track, points[ip].GetX(), AliTRDReconstructor::GetMaxStep())) return -1.; Double_t xyz[3]; // should also get the covariance track->GetXYZ(xyz); @@ -1769,7 +1769,7 @@ Double_t AliTRDtrackerV1::FitKalman(AliTRDtrackV1 *track, AliTRDseedV1 * const t } //_________________________________________________________________________ -Float_t AliTRDtrackerV1::CalculateChi2Z(AliTRDseedV1 *tracklets, Double_t offset, Double_t slope, Double_t xref) +Float_t AliTRDtrackerV1::CalculateChi2Z(const AliTRDseedV1 *tracklets, Double_t offset, Double_t slope, Double_t xref) { // // Calculates the chi2-value of the track in z-Direction including tilting pad correction. @@ -1801,15 +1801,13 @@ Int_t AliTRDtrackerV1::PropagateToX(AliTRDtrackV1 &t, Double_t xToGo, Double_t m // Returns 1 if track reaches the plane, and 0 otherwise // - const Double_t kEpsilon = 0.00001; - // Current track X-position Double_t xpos = t.GetX(); // Direction: inward or outward Double_t dir = (xpos < xToGo) ? 1.0 : -1.0; - while (((xToGo - xpos) * dir) > kEpsilon) { + while (((xToGo - xpos) * dir) > AliTRDReconstructor::GetEpsilon()) { Double_t xyz0[3]; Double_t xyz1[3]; @@ -1843,7 +1841,7 @@ Int_t AliTRDtrackerV1::PropagateToX(AliTRDtrackV1 &t, Double_t xToGo, Double_t m if (!t.PropagateTo(x, param[1], param[0]*param[4])) return 0; // Rotate the track if necessary - AdjustSector(&t); + if(!AdjustSector(&t)) return 0; // New track X-position xpos = t.GetX(); @@ -1856,7 +1854,7 @@ Int_t AliTRDtrackerV1::PropagateToX(AliTRDtrackV1 &t, Double_t xToGo, Double_t m //_____________________________________________________________________________ -Int_t AliTRDtrackerV1::ReadClusters(TClonesArray* &array, TTree *clusterTree) const +Bool_t AliTRDtrackerV1::ReadClusters(TTree *clusterTree) { // // Reads AliTRDclusters from the file. @@ -1870,15 +1868,15 @@ Int_t AliTRDtrackerV1::ReadClusters(TClonesArray* &array, TTree *clusterTree) co TBranch *branch = clusterTree->GetBranch("TRDcluster"); if (!branch) { AliError("Can't get the branch !"); - return 1; + return kFALSE; } branch->SetAddress(&clusterArray); if(!fClusters){ Float_t nclusters = fkRecoParam->GetNClusters(); if(fkReconstructor->IsHLT()) nclusters /= AliTRDgeometry::kNsector; - array = new TClonesArray("AliTRDcluster", Int_t(nclusters)); - array->SetOwner(kTRUE); + fClusters = new TClonesArray("AliTRDcluster", Int_t(nclusters)); + fClusters->SetOwner(kTRUE); } // Loop through all entries in the tree @@ -1897,11 +1895,10 @@ Int_t AliTRDtrackerV1::ReadClusters(TClonesArray* &array, TTree *clusterTree) co new((*fClusters)[ncl++]) AliTRDcluster(*c); delete (clusterArray->RemoveAt(iCluster)); } - } delete clusterArray; - return 0; + return kTRUE; } //_____________________________________________________________________________ @@ -1916,7 +1913,7 @@ Int_t AliTRDtrackerV1::LoadClusters(TTree *cTree) if(!fkReconstructor->IsWritingClusters()){ fClusters = AliTRDReconstructor::GetClusters(); } else { - if (ReadClusters(fClusters, cTree)) { + if(!ReadClusters(cTree)) { AliError("Problem with reading the clusters !"); return 1; } @@ -1977,7 +1974,7 @@ Int_t AliTRDtrackerV1::BuildTrackingContainers() Int_t stack = fGeom->GetStack(detector); Int_t layer = fGeom->GetLayer(detector); - fTrSec[sector].GetChamber(stack, layer, kTRUE)->InsertCluster(c, ncl, fkReconstructor->IsHLT()); + fTrSec[sector].GetChamber(stack, layer, kTRUE)->InsertCluster(c, ncl); } for(int isector =0; isectorGetNumberOfSeedConfigs(); iconf++) { pars[0] = configs[iconf]; pars[1] = ntracks; pars[2] = istack; @@ -2281,7 +2278,7 @@ Int_t AliTRDtrackerV1::Clusters2TracksStack(AliTRDtrackingChamber **stack, TClon if(!ntracks) break; // Sort the seeds according to their quality - Int_t sort[kMaxTracksStack]; + Int_t sort[kMaxTracksStack+1]; TMath::Sort(ntracks, fTrackQuality, sort, kTRUE); if(AliLog::GetDebugLevel("TRD", "AliTRDtrackerV1") > 2){ AliDebug(3, "Track candidates classification:"); @@ -2349,7 +2346,7 @@ Int_t AliTRDtrackerV1::Clusters2TracksStack(AliTRDtrackingChamber **stack, TClon break; case 1: // select shorter primary tracks, good quality - if(findable<4){skip = kTRUE; break;} + //if(findable<4){skip = kTRUE; break;} if(nlayers < findable){skip = kTRUE; break;} if(TMath::Log(1.E-9+fTrackQuality[trackIndex]) < -4.){skip = kTRUE; break;} break; @@ -2508,7 +2505,7 @@ Double_t AliTRDtrackerV1::BuildSeedingConfigs(AliTRDtrackingChamber **stack, Int } TMath::Sort((Int_t)kNConfigs, tconfig, configs, kTRUE); - // AliInfo(Form("q[%d] = %f", configs[0], tconfig[configs[0]])); + // AliInfo(Form("q[%d] = %f", configs[0], tconfig[configs[0]])); // AliInfo(Form("q[%d] = %f", configs[1], tconfig[configs[1]])); // AliInfo(Form("q[%d] = %f", configs[2], tconfig[configs[2]])); @@ -2621,8 +2618,8 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 * c for(int iLayer=0; iLayerGetClusterMatrix((*cIter)->GetDetector()))){ - continue; x0[iLayer] = fgkX0[iLayer]; + continue; } matrix->LocalToMaster(loc, glb); x0[iLayer] = glb[0]; @@ -2787,7 +2784,7 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 * c if(!cseed[jLayer].AttachClusters(chamber, kTRUE)) continue; cseed[jLayer].Fit(); } - FitTiltedRiemanConstraint(&cseed[0], GetZ()); + //FitTiltedRiemanConstraint(&cseed[0], GetZ()); fTrackQuality[ntracks] = 1.; // dummy value ntracks++; if(ntracks == kMaxTracksStack) return ntracks; @@ -2802,7 +2799,7 @@ Int_t AliTRDtrackerV1::MakeSeeds(AliTRDtrackingChamber **stack, AliTRDseedV1 * c chi2Vals[0] = FitTiltedRieman(&cseed[0], kTRUE); for(int iLayer=0; iLayerIsHLT()) FitTiltedRiemanConstraint(tracklet, 0); Double_t alpha = AliTRDgeometry::GetAlpha(); Double_t shift = AliTRDgeometry::GetAlpha()/2.0; @@ -3072,9 +3069,10 @@ AliTRDtrackV1* AliTRDtrackerV1::MakeTrack(AliTRDseedV1 * const tracklet) ptrTrack->CookPID(); // update calibration references using this track AliTRDCalibraFillHisto *calibra = AliTRDCalibraFillHisto::Instance(); - if (!calibra){ - AliInfo("Could not get Calibra instance\n"); - if(calibra->GetHisto2d()) calibra->UpdateHistogramsV1(ptrTrack); + if(!calibra){ + AliInfo("Could not get Calibra instance."); + } else if(calibra->GetHisto2d()){ + calibra->UpdateHistogramsV1(ptrTrack); } return ptrTrack; } @@ -3107,7 +3105,7 @@ Bool_t AliTRDtrackerV1::ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRD AliTRDseedV1 bseed[AliTRDgeometry::kNlayer]; Float_t quality(1.e3), - lQuality[] = {1.e3, 1.e3, 1.e3, 1.e3, 1.e3, 1.e3}; + lQuality[AliTRDgeometry::kNlayer] = {1.e3, 1.e3, 1.e3, 1.e3, 1.e3, 1.e3}; Int_t rLayers(0); for(Int_t jLayer=AliTRDgeometry::kNlayer; jLayer--;){ bseed[jLayer] = cseed[jLayer]; @@ -3122,14 +3120,14 @@ Bool_t AliTRDtrackerV1::ImproveSeedQuality(AliTRDtrackingChamber **stack, AliTRD for (Int_t iter = 0; iter < 4; iter++) { // Try better cluster set Int_t nLayers(0); Float_t qualitynew(0.); - Int_t indexes[6]; + Int_t indexes[4*AliTRDgeometry::kNlayer]; TMath::Sort(Int_t(AliTRDgeometry::kNlayer), lQuality, indexes, kFALSE); for(Int_t jLayer=AliTRDgeometry::kNlayer; jLayer--;) { Int_t bLayer = indexes[jLayer]; bseed[bLayer].Reset("c"); if(!(chamber = stack[bLayer])) continue; if(!bseed[bLayer].AttachClusters(chamber, kTRUE)) continue; - bseed[bLayer].Fit(kTRUE); + bseed[bLayer].Fit(1); if(!bseed[bLayer].IsOK()) continue; nLayers++; lQuality[jLayer] = bseed[jLayer].GetQuality(kTRUE); @@ -3785,6 +3783,7 @@ Double_t AliTRDtrackerV1::FitTiltedRiemanV1(AliTRDseedV1 *const tracklets){ //____________________________________________________________________ void AliTRDtrackerV1::UnsetTrackletsTrack(const AliTRDtrackV1 * const track) { +// Remove tracklets from tracker list attached to "track" Int_t idx(-1); for(Int_t il(0); ilGetTrackletIndex(il)) < 0) continue; @@ -3871,7 +3870,7 @@ Bool_t AliTRDtrackerV1::AliTRDLeastSquare::Eval(){ // Double_t det = fSums[0] * fSums[4] - fSums[1] *fSums[1]; - if(det==0) return kFALSE; + if(TMath::Abs(det)<1.e-30) return kFALSE; // for(Int_t isum = 0; isum < 5; isum++) // printf("fSums[%d] = %f\n", isum, fSums[isum]);