TLinearFitter* AliTRDtrackerV1::fgTiltedRiemanConstrained = 0x0;
//____________________________________________________________________
-AliTRDtrackerV1::AliTRDtrackerV1()
+AliTRDtrackerV1::AliTRDtrackerV1(AliTRDReconstructor *rec)
:AliTracker()
+ ,fReconstructor(rec)
,fGeom(new AliTRDgeometry())
,fClusters(0x0)
,fTracklets(0x0)
//
// Default constructor.
//
- if (!AliTRDcalibDB::Instance()) {
+ AliTRDcalibDB *trd = 0x0;
+ if (!(trd = AliTRDcalibDB::Instance())) {
AliFatal("Could not get calibration object");
}
- if(!fgNTimeBins) fgNTimeBins = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
- for (Int_t isector = 0; isector < AliTRDgeometry::kNsect; isector++) new(&fTrSec[isector]) AliTRDtrackingSector(fGeom, isector);
+ if(!fgNTimeBins) fgNTimeBins = trd->GetNumberOfTimeBins();
- if (!AliTRDReconstructor::RecoParam()){
- AliWarning("RecoParams not set in AliTRDReconstructor. Setting to default LowFluxParam.");
- AliTRDReconstructor::SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
- }
+ for (Int_t isector = 0; isector < AliTRDgeometry::kNsector; isector++) new(&fTrSec[isector]) AliTRDtrackingSector(fGeom, isector);
+ for(Int_t isl =0; isl<kNSeedPlanes; isl++) fSeedTB[isl] = 0x0;
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
- TDirectory *savedir = gDirectory;
- fgDebugStreamer = new TTreeSRedirector("TRD.TrackerDebug.root");
- savedir->cd();
+ // Initialize debug stream
+ if(fReconstructor){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
+ TDirectory *savedir = gDirectory;
+ fgDebugStreamer = new TTreeSRedirector("TRD.TrackerDebug.root");
+ savedir->cd();
+ }
}
}
if(fgRieman) delete fgRieman;
if(fgTiltedRieman) delete fgTiltedRieman;
if(fgTiltedRiemanConstrained) delete fgTiltedRiemanConstrained;
+ for(Int_t isl =0; isl<kNSeedPlanes; isl++) if(fSeedTB[isl]) delete fSeedTB[isl];
if(fTracks) {fTracks->Delete(); delete fTracks;}
if(fTracklets) {fTracklets->Delete(); delete fTracklets;}
if(fClusters) {fClusters->Delete(); delete fClusters;}
// See AliTRDtrackerV1::Clusters2TracksSM() for details.
//
- if(!AliTRDReconstructor::RecoParam()){
+ if(!fReconstructor->GetRecoParam() ){
AliError("Reconstruction configuration not initialized. Call first AliTRDReconstructor::SetRecoParam().");
return 0;
}
//AliInfo("Start Track Finder ...");
Int_t ntracks = 0;
- for(int ism=0; ism<AliTRDgeometry::kNsect; ism++){
+ for(int ism=0; ism<AliTRDgeometry::kNsector; ism++){
// for(int ism=1; ism<2; ism++){
//AliInfo(Form("Processing supermodule %i ...", ism));
ntracks += Clusters2TracksSM(ism, esd);
{
//AliInfo(Form("Asking for tracklet %d", index));
- if(index<0 || index == 0xffff) return kFALSE;
- AliTRDseedV1 *tracklet = 0x0;
- if(!(tracklet = (AliTRDseedV1*)fTracklets->UncheckedAt(index))) return kFALSE;
+ AliTRDseedV1 *tracklet = GetTracklet(index);
+ if (!tracklet) return kFALSE;
// get detector for this tracklet
AliTRDcluster *cl = 0x0;
// setting volume id
AliGeomManager::ELayerID iLayer = AliGeomManager::kTRD1;
- switch (fGeom->GetPlane(idet)) {
+ switch (fGeom->GetLayer(idet)) {
case 0:
iLayer = AliGeomManager::kTRD1;
break;
iLayer = AliGeomManager::kTRD6;
break;
};
- Int_t modId = fGeom->GetSector(idet) * fGeom->Ncham() + fGeom->GetChamber(idet);
+ Int_t modId = fGeom->GetSector(idet) * fGeom->Nstack() + fGeom->GetStack(idet);
UShort_t volid = AliGeomManager::LayerToVolUID(iLayer, modId);
p.SetVolumeID(volid);
//____________________________________________________________________
AliRieman* AliTRDtrackerV1::GetRiemanFitter()
{
- if(!fgRieman) fgRieman = new AliRieman(AliTRDtrackingChamber::kNTimeBins * AliTRDgeometry::kNplan);
+ if(!fgRieman) fgRieman = new AliRieman(AliTRDtrackingChamber::kNTimeBins * AliTRDgeometry::kNlayer);
return fgRieman;
}
Int_t found = 0; // number of tracks found
Float_t foundMin = 20.0;
+ Float_t *quality = 0x0;
+ Int_t *index = 0x0;
Int_t nSeed = event->GetNumberOfTracks();
- if(!nSeed){
- // run stand alone tracking
- if (AliTRDReconstructor::RecoParam()->SeedingOn()) Clusters2Tracks(event);
- return 0;
- }
-
- Float_t *quality = new Float_t[nSeed];
- Int_t *index = new Int_t[nSeed];
- for (Int_t iSeed = 0; iSeed < nSeed; iSeed++) {
- AliESDtrack *seed = event->GetTrack(iSeed);
- Double_t covariance[15];
- seed->GetExternalCovariance(covariance);
- quality[iSeed] = covariance[0] + covariance[2];
+ if(nSeed){
+ quality = new Float_t[nSeed];
+ index = new Int_t[nSeed];
+ for (Int_t iSeed = 0; iSeed < nSeed; iSeed++) {
+ AliESDtrack *seed = event->GetTrack(iSeed);
+ Double_t covariance[15];
+ seed->GetExternalCovariance(covariance);
+ quality[iSeed] = covariance[0] + covariance[2];
+ }
+ // Sort tracks according to covariance of local Y and Z
+ TMath::Sort(nSeed,quality,index,kFALSE);
}
- // Sort tracks according to covariance of local Y and Z
- TMath::Sort(nSeed,quality,index,kFALSE);
// Backpropagate all seeds
Int_t expectedClr;
//track.SetSeedLabel(lbl);
seed->UpdateTrackParams(&track, AliESDtrack::kTRDbackup); // Make backup
Float_t p4 = track.GetC();
- if((expectedClr = FollowBackProlongation(track))){
+ expectedClr = FollowBackProlongation(track);
+
+ if (expectedClr<0) continue; // Back prolongation failed
+
+ if(expectedClr){
+ found++;
// computes PID for track
track.CookPID();
// update calibration references using this track
track.UpdateESDtrack(seed);
// Add TRD track to ESDfriendTrack
- if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0 /*&& quality TODO*/){
+ if (fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 0 /*&& quality TODO*/){
AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
calibTrack->SetOwner();
seed->AddCalibObject(calibTrack);
Double_t c2 = track.GetSnp() + track.GetC() * (xtof - track.GetX());
if (TMath::Abs(c2) >= 0.99) continue;
- PropagateToX(track, xTOF0, fgkMaxStep);
+ if (!PropagateToX(track, xTOF0, fgkMaxStep)) continue;
// Energy losses taken to the account - check one more time
c2 = track.GetSnp() + track.GetC() * (xtof - track.GetX());
if (track.PropagateTo(xtof)) {
seed->UpdateTrackParams(&track, AliESDtrack::kTRDout);
track.UpdateESDtrack(seed);
-
- // Add TRD track to ESDfriendTrack
-// if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0 /*&& quality TODO*/){
-// AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
-// calibTrack->SetOwner();
-// seed->AddCalibObject(calibTrack);
-// }
- found++;
}
} else {
if ((track.GetNumberOfClusters() > 15) && (track.GetNumberOfClusters() > 0.5*expectedClr)) {
seed->UpdateTrackParams(&track, AliESDtrack::kTRDout);
track.UpdateESDtrack(seed);
-
- // Add TRD track to ESDfriendTrack
-// if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0 /*&& quality TODO*/){
-// AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
-// calibTrack->SetOwner();
-// seed->AddCalibObject(calibTrack);
-// }
- found++;
}
}
seed->SetTRDQuality(track.StatusForTOF());
seed->SetTRDBudget(track.GetBudget(0));
}
+ if(index) delete [] index;
+ if(quality) delete [] quality;
AliInfo(Form("Number of seeds: %d", nSeed));
AliInfo(Form("Number of back propagated TRD tracks: %d", found));
- delete [] index;
- delete [] quality;
+ // run stand alone tracking
+ if (fReconstructor->IsSeeding()) Clusters2Tracks(event);
return 0;
}
return 0;
}
-
//____________________________________________________________________
Int_t AliTRDtrackerV1::FollowProlongation(AliTRDtrackV1 &t)
{
}
}
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
Int_t index;
for(int iplane=0; iplane<6; iplane++){
AliTRDseedV1 *tracklet = GetTracklet(&t, iplane, index);
AliTRDseedV1 tracklet, *ptrTracklet = 0x0;
- // Loop through the TRD planes
- for (Int_t iplane = 0; iplane < AliTRDgeometry::Nplan(); iplane++) {
+ // Loop through the TRD layers
+ for (Int_t ilayer = 0; ilayer < AliTRDgeometry::Nlayer(); ilayer++) {
// BUILD TRACKLET IF NOT ALREADY BUILT
Double_t x = 0., y, z, alpha;
- ptrTracklet = t.GetTracklet(iplane);
+ ptrTracklet = t.GetTracklet(ilayer);
if(!ptrTracklet){
- ptrTracklet = new(&tracklet) AliTRDseedV1(iplane);
+ ptrTracklet = new(&tracklet) AliTRDseedV1(ilayer);
+ ptrTracklet->SetReconstructor(fReconstructor);
alpha = t.GetAlpha();
- Int_t sector = Int_t(alpha/AliTRDgeometry::GetAlpha() + (alpha>0. ? 0 : AliTRDgeometry::kNsect));
+ Int_t sector = Int_t(alpha/AliTRDgeometry::GetAlpha() + (alpha>0. ? 0 : AliTRDgeometry::kNsector));
if(!fTrSec[sector].GetNChambers()) continue;
- if((x = fTrSec[sector].GetX(iplane)) < 1.) continue;
+ if((x = fTrSec[sector].GetX(ilayer)) < 1.) continue;
- if (!t.GetProlongation(x, y, z)) break;
- Int_t stack = fGeom->GetChamber(z, iplane);
+ if (!t.GetProlongation(x, y, z)) return -nClustersExpected;
+ Int_t stack = fGeom->GetStack(z, ilayer);
Int_t nCandidates = stack >= 0 ? 1 : 2;
z -= stack >= 0 ? 0. : 4.;
for(int icham=0; icham<nCandidates; icham++, z+=8){
- if((stack = fGeom->GetChamber(z, iplane)) < 0) continue;
+ if((stack = fGeom->GetStack(z, ilayer)) < 0) continue;
- if(!(chamber = fTrSec[sector].GetChamber(stack, iplane))) continue;
+ if(!(chamber = fTrSec[sector].GetChamber(stack, ilayer))) continue;
- if(chamber->GetNClusters() < fgNTimeBins*AliTRDReconstructor::RecoParam()->GetFindableClusters()) continue;
+ if(chamber->GetNClusters() < fgNTimeBins*fReconstructor->GetRecoParam() ->GetFindableClusters()) continue;
x = chamber->GetX();
- AliTRDpadPlane *pp = fGeom->GetPadPlane(iplane, stack);
+ AliTRDpadPlane *pp = fGeom->GetPadPlane(ilayer, stack);
tracklet.SetTilt(TMath::Tan(-TMath::DegToRad()*pp->GetTiltingAngle()));
tracklet.SetPadLength(pp->GetLengthIPad());
- tracklet.SetPlane(iplane);
+ tracklet.SetPlane(ilayer);
tracklet.SetX0(x);
if(!tracklet.Init(&t)){
t.SetStopped(kTRUE);
if(!tracklet.AttachClustersIter(chamber, 1000.)) continue;
tracklet.Init(&t);
- if(tracklet.GetN() < fgNTimeBins * AliTRDReconstructor::RecoParam()->GetFindableClusters()) continue;
+ if(tracklet.GetN() < fgNTimeBins*fReconstructor->GetRecoParam() ->GetFindableClusters()) continue;
break;
}
}
if(!ptrTracklet->IsOK()){
if(x < 1.) continue; //temporary
- if(!PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) break;
- if(!AdjustSector(&t)) break;
- if(TMath::Abs(t.GetSnp()) > fgkMaxSnp) break;
+ if(!PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) return -nClustersExpected;
+ if(!AdjustSector(&t)) return -nClustersExpected;
+ if(TMath::Abs(t.GetSnp()) > fgkMaxSnp) return -nClustersExpected;
continue;
}
// Propagate closer to the current chamber if neccessary
x -= clength;
- if (x > (fgkMaxStep + t.GetX()) && !PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) break;
- if (!AdjustSector(&t)) break;
- if (TMath::Abs(t.GetSnp()) > fgkMaxSnp) break;
+ if (x > (fgkMaxStep + t.GetX()) && !PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) return -nClustersExpected;
+ if (!AdjustSector(&t)) return -nClustersExpected;
+ if (TMath::Abs(t.GetSnp()) > fgkMaxSnp) return -nClustersExpected;
// load tracklet to the tracker and the track
ptrTracklet = SetTracklet(ptrTracklet);
t.GetXYZ(xyz0);
alpha = t.GetAlpha();
x = ptrTracklet->GetX0();
- if (!t.GetProlongation(x, y, z)) break;
+ if (!t.GetProlongation(x, y, z)) return -nClustersExpected;
Double_t xyz1[3]; // exit point
xyz1[0] = x * TMath::Cos(alpha) - y * TMath::Sin(alpha);
xyz1[1] = +x * TMath::Sin(alpha) + y * TMath::Cos(alpha);
Double_t xx0 = param[1]; // radiation length
// Propagate and update track
- t.PropagateTo(x, xx0, xrho);
- if (!AdjustSector(&t)) break;
+ if (!t.PropagateTo(x, xx0, xrho)) return -nClustersExpected;
+ if (!AdjustSector(&t)) return -nClustersExpected;
Double_t maxChi2 = t.GetPredictedChi2(ptrTracklet);
- if (maxChi2<1e+10 && t.Update(ptrTracklet, maxChi2)){
+ if (!t.Update(ptrTracklet, maxChi2)) return -nClustersExpected;
+ if (maxChi2<1e+10) {
nClustersExpected += ptrTracklet->GetN();
//t.SetTracklet(&tracklet, index);
}
// Reset material budget if 2 consecutive gold
- if(iplane>0 && t.GetTracklet(iplane-1) && ptrTracklet->GetN() + t.GetTracklet(iplane-1)->GetN() > 20) t.SetBudget(2, 0.);
+ if(ilayer>0 && t.GetTracklet(ilayer-1) && ptrTracklet->GetN() + t.GetTracklet(ilayer-1)->GetN() > 20) t.SetBudget(2, 0.);
// Make backup of the track until is gold
// TO DO update quality check of the track.
(TMath::Abs(t.GetSnp()) < 0.85) &&
(t.GetNumberOfClusters() > 20)) t.MakeBackupTrack();
- } // end planes loop
+ } // end layers loop
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
TTreeSRedirector &cstreamer = *fgDebugStreamer;
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
//AliTRDtrackV1 *debugTrack = new AliTRDtrackV1(t);
Float_t x, y, z, w, t, error, tilt;
Double_t uvt[2];
Int_t nPoints = 0;
- for(Int_t ipl = 0; ipl < AliTRDgeometry::kNplan; ipl++){
- if(!tracklets[ipl].IsOK()) continue;
+ for(Int_t ilr = 0; ilr < AliTRDgeometry::kNlayer; ilr++){
+ if(!tracklets[ilr].IsOK()) continue;
for(Int_t itb = 0; itb < fgNTimeBins; itb++){
- if(!tracklets[ipl].IsUsable(itb)) continue;
- cl = tracklets[ipl].GetClusters(itb);
+ if(!tracklets[ilr].IsUsable(itb)) continue;
+ cl = tracklets[ilr].GetClusters(itb);
x = cl->GetX();
y = cl->GetY();
z = cl->GetZ();
- tilt = tracklets[ipl].GetTilt();
+ tilt = tracklets[ilr].GetTilt();
// Transformation
t = 1./(x * x + y * y);
uvt[0] = 2. * x * t;
for(Int_t ip = 0; ip < AliTRDtrackerV1::kNPlanes; ip++)
tracklets[ip].SetCC(curvature);
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 5){
+/* if(fReconstructor->GetStreamLevel() >= 5){
//Linear Model on z-direction
Double_t xref = CalculateReferenceX(tracklets); // Relative to the middle of the stack
Double_t slope = fitter->GetParameter(2);
<< "Chi2Z=" << chi2Z
<< "zref=" << zref
<< "\n";
- }
+ }*/
return chi2track;
}
tracklets[iLayer].SetChi2(chi2track);
}
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >=5){
+/* if(fReconstructor->GetStreamLevel() >=5){
TTreeSRedirector &cstreamer = *fgDebugStreamer;
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
<< "xref=" << xref
<< "Chi2Z=" << chi2z
<< "\n";
- }
+ }*/
return chi2track;
}
}
}
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >=5){
+/* if(fReconstructor->GetStreamLevel() >=5){
TTreeSRedirector &cstreamer = *fgDebugStreamer;
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
<< "xref=" << xref
<< "Chi2Z=" << chi2z
<< "\n";
- }
+ }*/
return chi2;
}
// Output: - The Chi2 value of the track in z-Direction
//
Float_t chi2Z = 0, nLayers = 0;
- for (Int_t iLayer = 0; iLayer < AliTRDgeometry::kNplan; iLayer++) {
+ for (Int_t iLayer = 0; iLayer < AliTRDgeometry::kNlayer; iLayer++) {
if(!tracklets[iLayer].IsOK()) continue;
Double_t z = offset + slope * (tracklets[iLayer].GetX0() - xref);
chi2Z += TMath::Abs(tracklets[iLayer].GetMeanz() - z);
if(c->IsInChamber()) nin++;
Int_t detector = c->GetDetector();
Int_t sector = fGeom->GetSector(detector);
- Int_t stack = fGeom->GetChamber(detector);
- Int_t plane = fGeom->GetPlane(detector);
+ Int_t stack = fGeom->GetStack(detector);
+ Int_t layer = fGeom->GetLayer(detector);
- fTrSec[sector].GetChamber(stack, plane, kTRUE)->InsertCluster(c, icl);
+ fTrSec[sector].GetChamber(stack, layer, kTRUE)->InsertCluster(c, icl);
}
AliInfo(Form("Clusters %d in %6.2f %%", ncl, 100.*float(nin)/ncl));
- for(int isector =0; isector<AliTRDgeometry::kNsect; isector++){
+ for(int isector =0; isector<AliTRDgeometry::kNsector; isector++){
if(!fTrSec[isector].GetNChambers()) continue;
- fTrSec[isector].Init();
+ fTrSec[isector].Init(fReconstructor);
}
return 0;
if(fTracklets) fTracklets->Delete();
if(fClusters) fClusters->Delete();
- for (int i = 0; i < AliTRDgeometry::kNsect; i++) fTrSec[i].Clear();
+ for (int i = 0; i < AliTRDgeometry::kNsector; i++) fTrSec[i].Clear();
// Increment the Event Number
AliTRDtrackerDebug::SetEventNumber(AliTRDtrackerDebug::GetEventNumber() + 1);
// and adds the new tracklet to the list.
//
if(!fTracklets){
- fTracklets = new TClonesArray("AliTRDseedV1", AliTRDgeometry::Nsect()*kMaxTracksStack);
+ fTracklets = new TClonesArray("AliTRDseedV1", AliTRDgeometry::Nsector()*kMaxTracksStack);
fTracklets->SetOwner(kTRUE);
}
Int_t nentries = fTracklets->GetEntriesFast();
// and adds the new track to the list.
//
if(!fTracks){
- fTracks = new TClonesArray("AliTRDtrackV1", AliTRDgeometry::Nsect()*kMaxTracksStack);
+ fTracks = new TClonesArray("AliTRDtrackV1", AliTRDgeometry::Nsector()*kMaxTracksStack);
fTracks->SetOwner(kTRUE);
}
Int_t nentries = fTracks->GetEntriesFast();
Int_t nTracks = 0;
Int_t nChambers = 0;
AliTRDtrackingChamber **stack = 0x0, *chamber = 0x0;
- for(int istack = 0; istack<AliTRDgeometry::kNcham; istack++){
+ for(int istack = 0; istack<AliTRDgeometry::kNstack; istack++){
if(!(stack = fTrSec[sector].GetStack(istack))) continue;
nChambers = 0;
- for(int iplane=0; iplane<AliTRDgeometry::kNplan; iplane++){
- if(!(chamber = stack[iplane])) continue;
- if(chamber->GetNClusters() < fgNTimeBins * AliTRDReconstructor::RecoParam()->GetFindableClusters()) continue;
+ for(int ilayer=0; ilayer<AliTRDgeometry::kNlayer; ilayer++){
+ if(!(chamber = stack[ilayer])) continue;
+ if(chamber->GetNClusters() < fgNTimeBins * fReconstructor->GetRecoParam() ->GetFindableClusters()) continue;
nChambers++;
- //AliInfo(Form("sector %d stack %d plane %d clusters %d", sector, istack, iplane, chamber->GetNClusters()));
+ //AliInfo(Form("sector %d stack %d layer %d clusters %d", sector, istack, ilayer, chamber->GetNClusters()));
}
if(nChambers < 4) continue;
//AliInfo(Form("Doing stack %d", istack));
// Build initial seeding configurations
Double_t quality = BuildSeedingConfigs(stack, configs);
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
AliInfo(Form("Plane config %d %d %d Quality %f"
, configs[0], configs[1], configs[2], quality));
}
ntracks = MakeSeeds(stack, &sseed[6*ntracks], pars);
if(ntracks == kMaxTracksStack) break;
}
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1) AliInfo(Form("Candidate TRD tracks %d in iteration %d.", ntracks, fSieveSeeding));
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1) AliInfo(Form("Candidate TRD tracks %d in iteration %d.", ntracks, fSieveSeeding));
if(!ntracks) break;
Int_t ich = 0; while(!(chamber = stack[ich])) ich++;
trackParams[6] = fGeom->GetSector(chamber->GetDetector());/* *alpha+shift; // Supermodule*/
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
AliInfo(Form("Track %d [%d] nlayers %d trackQuality = %e nused %d, yref = %3.3f", itrack, trackIndex, nlayers, fTrackQuality[trackIndex], nused, trackParams[1]));
Int_t nclusters = 0;
esdTrack.SetLabel(track->GetLabel());
track->UpdateESDtrack(&esdTrack);
// write ESD-friends if neccessary
- if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0){
- //printf("Creating Calibrations Object\n");
+ if (fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 0){
AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(*track);
calibTrack->SetOwner();
esdTrack.AddCalibObject(calibTrack);
// Rebuild plane configurations and indices taking only unused clusters into account
quality = BuildSeedingConfigs(stack, configs);
- if(quality < 1.E-7) break; //AliTRDReconstructor::RecoParam()->GetPlaneQualityThreshold()) break;
+ if(quality < 1.E-7) break; //fReconstructor->GetRecoParam() ->GetPlaneQualityThreshold()) break;
for(Int_t ip = 0; ip < kNPlanes; ip++){
if(!(chamber = stack[ip])) continue;
chamber->Build(fGeom);//Indices(fSieveSeeding);
}
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
AliInfo(Form("Sieve level %d Plane config %d %d %d Quality %f", fSieveSeeding, configs[0], configs[1], configs[2], quality));
}
} while(fSieveSeeding<10); // end stack clusters sieve
// Init chambers geometry
Int_t ic = 0; while(!(chamber = stack[ic])) ic++;
- Int_t istack = fGeom->GetChamber(chamber->GetDetector());
+ Int_t istack = fGeom->GetStack(chamber->GetDetector());
Double_t hL[kNPlanes]; // Tilting angle
Float_t padlength[kNPlanes]; // pad lenghts
AliTRDpadPlane *pp = 0x0;
padlength[iplane] = pp->GetLengthIPad();
}
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
AliInfo(Form("Making seeds Stack[%d] Config[%d] Tracks[%d]...", istack, config, ntracks));
}
+ ResetSeedTB();
Int_t nlayers = 0;
- AliTRDchamberTimeBin *layer[] = {0x0, 0x0, 0x0, 0x0};
for(int isl=0; isl<kNSeedPlanes; isl++){
if(!(chamber = stack[planes[isl]])) continue;
- if(!(layer[isl] = chamber->GetSeedingLayer(fGeom))) continue;
+ if(!chamber->GetSeedingLayer(fSeedTB[isl], fGeom, fReconstructor)) continue;
nlayers++;
- //AliInfo(Form("seeding plane %d clusters %d", planes[isl], Int_t(*layer[isl])));
}
if(nlayers < 4) return 0;
// Start finding seeds
Double_t cond0[4], cond1[4], cond2[4];
Int_t icl = 0;
- while((c[3] = (*layer[3])[icl++])){
+ while((c[3] = (*fSeedTB[3])[icl++])){
if(!c[3]) continue;
- layer[0]->BuildCond(c[3], cond0, 0);
- layer[0]->GetClusters(cond0, index, ncl);
+ fSeedTB[0]->BuildCond(c[3], cond0, 0);
+ fSeedTB[0]->GetClusters(cond0, index, ncl);
//printf("Found c[3] candidates 0 %d\n", ncl);
Int_t jcl = 0;
while(jcl<ncl) {
- c[0] = (*layer[0])[index[jcl++]];
+ c[0] = (*fSeedTB[0])[index[jcl++]];
if(!c[0]) continue;
Double_t dx = c[3]->GetX() - c[0]->GetX();
Double_t theta = (c[3]->GetZ() - c[0]->GetZ())/dx;
Double_t phi = (c[3]->GetY() - c[0]->GetY())/dx;
- layer[1]->BuildCond(c[0], cond1, 1, theta, phi);
- layer[1]->GetClusters(cond1, jndex, mcl);
+ fSeedTB[1]->BuildCond(c[0], cond1, 1, theta, phi);
+ fSeedTB[1]->GetClusters(cond1, jndex, mcl);
//printf("Found c[0] candidates 1 %d\n", mcl);
Int_t kcl = 0;
while(kcl<mcl) {
- c[1] = (*layer[1])[jndex[kcl++]];
- if(!c[1]) continue;
- layer[2]->BuildCond(c[1], cond2, 2, theta, phi);
- c[2] = layer[2]->GetNearestCluster(cond2);
- //printf("Found c[1] candidate 2 %p\n", c[2]);
- if(!c[2]) continue;
-
- // AliInfo("Seeding clusters found. Building seeds ...");
- // for(Int_t i = 0; i < kNSeedPlanes; i++) printf("%i. coordinates: x = %6.3f, y = %6.3f, z = %6.3f\n", i, c[i]->GetX(), c[i]->GetY(), c[i]->GetZ());
-
- for (Int_t il = 0; il < 6; il++) cseed[il].Reset();
-
- FitRieman(c, chi2);
-
- AliTRDseedV1 *tseed = 0x0;
- for(int iLayer=0; iLayer<kNSeedPlanes; iLayer++){
- Int_t jLayer = planes[iLayer];
- tseed = &cseed[jLayer];
- tseed->SetPlane(jLayer);
- tseed->SetTilt(hL[jLayer]);
- tseed->SetPadLength(padlength[jLayer]);
- tseed->SetX0(stack[jLayer]->GetX());
- tseed->Init(GetRiemanFitter());
- }
-
- Bool_t isFake = kFALSE;
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
- if (c[0]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
- if (c[1]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
- if (c[2]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
-
- Double_t xpos[4];
- for(Int_t l = 0; l < kNSeedPlanes; l++) xpos[l] = layer[l]->GetX();
- Float_t yref[4];
- for(int il=0; il<4; il++) yref[il] = cseed[planes[il]].GetYref(0);
- Int_t ll = c[3]->GetLabel(0);
- Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
- Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
- AliRieman *rim = GetRiemanFitter();
- TTreeSRedirector &cs0 = *fgDebugStreamer;
- cs0 << "MakeSeeds0"
- <<"EventNumber=" << eventNumber
- <<"CandidateNumber=" << candidateNumber
- <<"isFake=" << isFake
- <<"config=" << config
- <<"label=" << ll
- <<"chi2z=" << chi2[0]
- <<"chi2y=" << chi2[1]
- <<"Y2exp=" << cond2[0]
- <<"Z2exp=" << cond2[1]
- <<"X0=" << xpos[0] //layer[sLayer]->GetX()
- <<"X1=" << xpos[1] //layer[sLayer + 1]->GetX()
- <<"X2=" << xpos[2] //layer[sLayer + 2]->GetX()
- <<"X3=" << xpos[3] //layer[sLayer + 3]->GetX()
- <<"yref0=" << yref[0]
- <<"yref1=" << yref[1]
- <<"yref2=" << yref[2]
- <<"yref3=" << yref[3]
- <<"c0.=" << c[0]
- <<"c1.=" << c[1]
- <<"c2.=" << c[2]
- <<"c3.=" << c[3]
- <<"Seed0.=" << &cseed[planes[0]]
- <<"Seed1.=" << &cseed[planes[1]]
- <<"Seed2.=" << &cseed[planes[2]]
- <<"Seed3.=" << &cseed[planes[3]]
- <<"RiemanFitter.=" << rim
- <<"\n";
- }
-
- if(chi2[0] > AliTRDReconstructor::RecoParam()->GetChi2Z()/*7./(3. - sLayer)*//*iter*/){
- //AliInfo(Form("Failed chi2 filter on chi2Z [%f].", chi2[0]));
- AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
- continue;
- }
- if(chi2[1] > AliTRDReconstructor::RecoParam()->GetChi2Y()/*1./(3. - sLayer)*//*iter*/){
- //AliInfo(Form("Failed chi2 filter on chi2Y [%f].", chi2[1]));
- AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
- continue;
- }
- //AliInfo("Passed chi2 filter.");
-
- // try attaching clusters to tracklets
- Int_t nUsedCl = 0;
- Int_t mlayers = 0;
- for(int iLayer=0; iLayer<kNSeedPlanes; iLayer++){
- Int_t jLayer = planes[iLayer];
- if(!cseed[jLayer].AttachClustersIter(stack[jLayer], 5., kFALSE, c[iLayer])) continue;
- nUsedCl += cseed[jLayer].GetNUsed();
- if(nUsedCl > 25) break;
- mlayers++;
- }
- if(mlayers < kNSeedPlanes){
- //AliInfo(Form("Failed updating all seeds %d [%d].", mlayers, kNSeedPlanes));
- AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
- continue;
- }
- // fit tracklets and cook likelihood
- FitTiltedRieman(&cseed[0], kTRUE);// Update Seeds and calculate Likelihood
- chi2[0] = GetChi2Y(&cseed[0]);
- chi2[1] = GetChi2Z(&cseed[0]);
- //Chi2 definitions in testing stage
- //chi2[0] = GetChi2YTest(&cseed[0]);
- //chi2[1] = GetChi2ZTest(&cseed[0]);
- Double_t like = CookLikelihood(&cseed[0], planes, chi2); // to be checked
-
- if (TMath::Log(1.E-9 + like) < AliTRDReconstructor::RecoParam()->GetTrackLikelihood()){
- //AliInfo(Form("Failed likelihood %f[%e].", TMath::Log(1.E-9 + like), like));
- AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
- continue;
- }
- //AliInfo(Form("Passed likelihood %f[%e].", TMath::Log(1.E-9 + like), like));
-
- // book preliminary results
- seedQuality[ntracks] = like;
- fSeedLayer[ntracks] = config;/*sLayer;*/
-
- // attach clusters to the extrapolation seeds
- Int_t lextrap[2];
- GetExtrapolationConfig(config, lextrap);
- Int_t nusedf = 0; // debug value
- for(int iLayer=0; iLayer<2; iLayer++){
- Int_t jLayer = lextrap[iLayer];
- if(!(chamber = stack[jLayer])) continue;
-
- // prepare extrapolated seed
- cseed[jLayer].Reset();
- cseed[jLayer].SetPlane(jLayer);
- cseed[jLayer].SetTilt(hL[jLayer]);
- cseed[jLayer].SetX0(chamber->GetX());
- cseed[jLayer].SetPadLength(padlength[jLayer]);
-
- // fit extrapolated seed
- if ((jLayer == 0) && !(cseed[1].IsOK())) continue;
- if ((jLayer == 5) && !(cseed[4].IsOK())) continue;
- AliTRDseedV1 pseed = cseed[jLayer];
- if(!pseed.AttachClustersIter(chamber, 1000.)) continue;
- cseed[jLayer] = pseed;
- nusedf += cseed[jLayer].GetNUsed(); // debug value
- FitTiltedRieman(cseed, kTRUE);
- }
-
- // AliInfo("Extrapolation done.");
- // Debug Stream containing all the 6 tracklets
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
- TTreeSRedirector &cstreamer = *fgDebugStreamer;
- TLinearFitter *tiltedRieman = GetTiltedRiemanFitter();
- Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
- Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
- cstreamer << "MakeSeeds1"
- << "EventNumber=" << eventNumber
- << "CandidateNumber=" << candidateNumber
- << "S0.=" << &cseed[0]
- << "S1.=" << &cseed[1]
- << "S2.=" << &cseed[2]
- << "S3.=" << &cseed[3]
- << "S4.=" << &cseed[4]
- << "S5.=" << &cseed[5]
- << "FitterT.=" << tiltedRieman
- << "\n";
- }
-
- if(ImproveSeedQuality(stack, cseed) < 4){
- AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
- continue;
- }
- //AliInfo("Improve seed quality done.");
-
- // fit full track and cook likelihoods
- // Double_t curv = FitRieman(&cseed[0], chi2);
- // Double_t chi2ZF = chi2[0] / TMath::Max((mlayers - 3.), 1.);
- // Double_t chi2RF = chi2[1] / TMath::Max((mlayers - 3.), 1.);
-
- // do the final track fitting (Once with vertex constraint and once without vertex constraint)
- Double_t chi2Vals[3];
- chi2Vals[0] = FitTiltedRieman(&cseed[0], kFALSE);
- if(AliTRDReconstructor::RecoParam()->IsVertexConstrained())
- chi2Vals[1] = FitTiltedRiemanConstraint(&cseed[0], GetZ()); // Do Vertex Constrained fit if desired
- else
- chi2Vals[1] = 1.;
- chi2Vals[2] = GetChi2Z(&cseed[0]) / TMath::Max((mlayers - 3.), 1.);
- // Chi2 definitions in testing stage
- //chi2Vals[2] = GetChi2ZTest(&cseed[0]);
- fTrackQuality[ntracks] = CalculateTrackLikelihood(&cseed[0], &chi2Vals[0]);
- //AliInfo("Hyperplane fit done\n");
-
- // finalize tracklets
- Int_t labels[12];
- Int_t outlab[24];
- Int_t nlab = 0;
- for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
- if (!cseed[iLayer].IsOK()) continue;
-
- if (cseed[iLayer].GetLabels(0) >= 0) {
- labels[nlab] = cseed[iLayer].GetLabels(0);
- nlab++;
- }
-
- if (cseed[iLayer].GetLabels(1) >= 0) {
- labels[nlab] = cseed[iLayer].GetLabels(1);
- nlab++;
- }
- }
- Freq(nlab,labels,outlab,kFALSE);
- Int_t label = outlab[0];
- Int_t frequency = outlab[1];
- for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
- cseed[iLayer].SetFreq(frequency);
- cseed[iLayer].SetChi2Z(chi2[1]);
- }
+ c[1] = (*fSeedTB[1])[jndex[kcl++]];
+ if(!c[1]) continue;
+ fSeedTB[2]->BuildCond(c[1], cond2, 2, theta, phi);
+ c[2] = fSeedTB[2]->GetNearestCluster(cond2);
+ //printf("Found c[1] candidate 2 %p\n", c[2]);
+ if(!c[2]) continue;
+
+ // AliInfo("Seeding clusters found. Building seeds ...");
+ // for(Int_t i = 0; i < kNSeedPlanes; i++) printf("%i. coordinates: x = %6.3f, y = %6.3f, z = %6.3f\n", i, c[i]->GetX(), c[i]->GetY(), c[i]->GetZ());
+
+ for (Int_t il = 0; il < 6; il++) cseed[il].Reset();
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
- TTreeSRedirector &cstreamer = *fgDebugStreamer;
- Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
- Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
- TLinearFitter *fitterTC = GetTiltedRiemanFitterConstraint();
- TLinearFitter *fitterT = GetTiltedRiemanFitter();
- cstreamer << "MakeSeeds2"
- << "EventNumber=" << eventNumber
- << "CandidateNumber=" << candidateNumber
- << "Chi2TR=" << chi2Vals[0]
- << "Chi2TC=" << chi2Vals[1]
- << "Nlayers=" << mlayers
- << "NUsedS=" << nUsedCl
- << "NUsed=" << nusedf
- << "Like=" << like
- << "S0.=" << &cseed[0]
- << "S1.=" << &cseed[1]
- << "S2.=" << &cseed[2]
- << "S3.=" << &cseed[3]
- << "S4.=" << &cseed[4]
- << "S5.=" << &cseed[5]
- << "Label=" << label
- << "Freq=" << frequency
- << "FitterT.=" << fitterT
- << "FitterTC.=" << fitterTC
- << "\n";
- }
-
- ntracks++;
- AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
- if(ntracks == kMaxTracksStack){
- AliWarning(Form("Number of seeds reached maximum allowed (%d) in stack.", kMaxTracksStack));
- for(int isl=0; isl<4; isl++) delete layer[isl];
- return ntracks;
- }
- cseed += 6;
+ FitRieman(c, chi2);
+
+ AliTRDseedV1 *tseed = 0x0;
+ for(int iLayer=0; iLayer<kNPlanes; iLayer++){
+ tseed = &cseed[iLayer];
+ tseed->SetPlane(iLayer);
+ tseed->SetTilt(hL[iLayer]);
+ tseed->SetPadLength(padlength[iLayer]);
+ tseed->SetReconstructor(fReconstructor);
+ if(stack[iLayer])tseed->SetX0(stack[iLayer]->GetX());
+ tseed->Init(GetRiemanFitter());
+ }
+
+ Bool_t isFake = kFALSE;
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
+ if (c[0]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
+ if (c[1]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
+ if (c[2]->GetLabel(0) != c[3]->GetLabel(0)) isFake = kTRUE;
+
+ Double_t xpos[4];
+ for(Int_t l = 0; l < kNSeedPlanes; l++) xpos[l] = fSeedTB[l]->GetX();
+ Float_t yref[4];
+ for(int il=0; il<4; il++) yref[il] = cseed[planes[il]].GetYref(0);
+ Int_t ll = c[3]->GetLabel(0);
+ Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
+ Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
+ AliRieman *rim = GetRiemanFitter();
+ TTreeSRedirector &cs0 = *fgDebugStreamer;
+ cs0 << "MakeSeeds0"
+ <<"EventNumber=" << eventNumber
+ <<"CandidateNumber=" << candidateNumber
+ <<"isFake=" << isFake
+ <<"config=" << config
+ <<"label=" << ll
+ <<"chi2z=" << chi2[0]
+ <<"chi2y=" << chi2[1]
+ <<"Y2exp=" << cond2[0]
+ <<"Z2exp=" << cond2[1]
+ <<"X0=" << xpos[0] //layer[sLayer]->GetX()
+ <<"X1=" << xpos[1] //layer[sLayer + 1]->GetX()
+ <<"X2=" << xpos[2] //layer[sLayer + 2]->GetX()
+ <<"X3=" << xpos[3] //layer[sLayer + 3]->GetX()
+ <<"yref0=" << yref[0]
+ <<"yref1=" << yref[1]
+ <<"yref2=" << yref[2]
+ <<"yref3=" << yref[3]
+ <<"c0.=" << c[0]
+ <<"c1.=" << c[1]
+ <<"c2.=" << c[2]
+ <<"c3.=" << c[3]
+ <<"Seed0.=" << &cseed[planes[0]]
+ <<"Seed1.=" << &cseed[planes[1]]
+ <<"Seed2.=" << &cseed[planes[2]]
+ <<"Seed3.=" << &cseed[planes[3]]
+ <<"RiemanFitter.=" << rim
+ <<"\n";
+ }
+
+ if(chi2[0] > fReconstructor->GetRecoParam() ->GetChi2Z()/*7./(3. - sLayer)*//*iter*/){
+ //AliInfo(Form("Failed chi2 filter on chi2Z [%f].", chi2[0]));
+ AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+ continue;
+ }
+ if(chi2[1] > fReconstructor->GetRecoParam() ->GetChi2Y()/*1./(3. - sLayer)*//*iter*/){
+ //AliInfo(Form("Failed chi2 filter on chi2Y [%f].", chi2[1]));
+ AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+ continue;
+ }
+ //AliInfo("Passed chi2 filter.");
+
+ // try attaching clusters to tracklets
+ Int_t nUsedCl = 0;
+ Int_t mlayers = 0;
+ for(int iLayer=0; iLayer<kNSeedPlanes; iLayer++){
+ Int_t jLayer = planes[iLayer];
+ if(!cseed[jLayer].AttachClustersIter(stack[jLayer], 5., kFALSE, c[iLayer])) continue;
+ nUsedCl += cseed[jLayer].GetNUsed();
+ if(nUsedCl > 25) break;
+ mlayers++;
+ }
+ if(mlayers < kNSeedPlanes){
+ //AliInfo(Form("Failed updating all seeds %d [%d].", mlayers, kNSeedPlanes));
+ AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+ continue;
+ }
+ // fit tracklets and cook likelihood
+ FitTiltedRieman(&cseed[0], kTRUE);// Update Seeds and calculate Likelihood
+ chi2[0] = GetChi2Y(&cseed[0]);
+ chi2[1] = GetChi2Z(&cseed[0]);
+ //Chi2 definitions in testing stage
+ //chi2[0] = GetChi2YTest(&cseed[0]);
+ //chi2[1] = GetChi2ZTest(&cseed[0]);
+ Double_t like = CookLikelihood(&cseed[0], planes, chi2); // to be checked
+
+ if (TMath::Log(1.E-9 + like) < fReconstructor->GetRecoParam() ->GetTrackLikelihood()){
+ //AliInfo(Form("Failed likelihood %f[%e].", TMath::Log(1.E-9 + like), like));
+ AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+ continue;
+ }
+ //AliInfo(Form("Passed likelihood %f[%e].", TMath::Log(1.E-9 + like), like));
+
+ // book preliminary results
+ seedQuality[ntracks] = like;
+ fSeedLayer[ntracks] = config;/*sLayer;*/
+
+ // attach clusters to the extrapolation seeds
+ Int_t lextrap[2];
+ GetExtrapolationConfig(config, lextrap);
+ Int_t nusedf = 0; // debug value
+ for(int iLayer=0; iLayer<2; iLayer++){
+ Int_t jLayer = lextrap[iLayer];
+ if(!(chamber = stack[jLayer])) continue;
+
+ // fit extrapolated seed
+ if ((jLayer == 0) && !(cseed[1].IsOK())) continue;
+ if ((jLayer == 5) && !(cseed[4].IsOK())) continue;
+ AliTRDseedV1 pseed = cseed[jLayer];
+ if(!pseed.AttachClustersIter(chamber, 1000.)) continue;
+ cseed[jLayer] = pseed;
+ nusedf += cseed[jLayer].GetNUsed(); // debug value
+ FitTiltedRieman(cseed, kTRUE);
+ }
+
+ // AliInfo("Extrapolation done.");
+ // Debug Stream containing all the 6 tracklets
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
+ TTreeSRedirector &cstreamer = *fgDebugStreamer;
+ TLinearFitter *tiltedRieman = GetTiltedRiemanFitter();
+ Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
+ Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
+ cstreamer << "MakeSeeds1"
+ << "EventNumber=" << eventNumber
+ << "CandidateNumber=" << candidateNumber
+ << "S0.=" << &cseed[0]
+ << "S1.=" << &cseed[1]
+ << "S2.=" << &cseed[2]
+ << "S3.=" << &cseed[3]
+ << "S4.=" << &cseed[4]
+ << "S5.=" << &cseed[5]
+ << "FitterT.=" << tiltedRieman
+ << "\n";
+ }
+
+ if(ImproveSeedQuality(stack, cseed) < 4){
+ AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+ continue;
+ }
+ //AliInfo("Improve seed quality done.");
+
+ // fit full track and cook likelihoods
+ // Double_t curv = FitRieman(&cseed[0], chi2);
+ // Double_t chi2ZF = chi2[0] / TMath::Max((mlayers - 3.), 1.);
+ // Double_t chi2RF = chi2[1] / TMath::Max((mlayers - 3.), 1.);
+
+ // do the final track fitting (Once with vertex constraint and once without vertex constraint)
+ Double_t chi2Vals[3];
+ chi2Vals[0] = FitTiltedRieman(&cseed[0], kFALSE);
+ if(fReconstructor->GetRecoParam() ->IsVertexConstrained())
+ chi2Vals[1] = FitTiltedRiemanConstraint(&cseed[0], GetZ()); // Do Vertex Constrained fit if desired
+ else
+ chi2Vals[1] = 1.;
+ chi2Vals[2] = GetChi2Z(&cseed[0]) / TMath::Max((mlayers - 3.), 1.);
+ // Chi2 definitions in testing stage
+ //chi2Vals[2] = GetChi2ZTest(&cseed[0]);
+ fTrackQuality[ntracks] = CalculateTrackLikelihood(&cseed[0], &chi2Vals[0]);
+ //AliInfo("Hyperplane fit done\n");
+
+ // finalize tracklets
+ Int_t labels[12];
+ Int_t outlab[24];
+ Int_t nlab = 0;
+ for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
+ if (!cseed[iLayer].IsOK()) continue;
+
+ if (cseed[iLayer].GetLabels(0) >= 0) {
+ labels[nlab] = cseed[iLayer].GetLabels(0);
+ nlab++;
+ }
+
+ if (cseed[iLayer].GetLabels(1) >= 0) {
+ labels[nlab] = cseed[iLayer].GetLabels(1);
+ nlab++;
+ }
+ }
+ Freq(nlab,labels,outlab,kFALSE);
+ Int_t label = outlab[0];
+ Int_t frequency = outlab[1];
+ for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
+ cseed[iLayer].SetFreq(frequency);
+ cseed[iLayer].SetChi2Z(chi2[1]);
+ }
+
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
+ TTreeSRedirector &cstreamer = *fgDebugStreamer;
+ Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
+ Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
+ TLinearFitter *fitterTC = GetTiltedRiemanFitterConstraint();
+ TLinearFitter *fitterT = GetTiltedRiemanFitter();
+ cstreamer << "MakeSeeds2"
+ << "EventNumber=" << eventNumber
+ << "CandidateNumber=" << candidateNumber
+ << "Chi2TR=" << chi2Vals[0]
+ << "Chi2TC=" << chi2Vals[1]
+ << "Nlayers=" << mlayers
+ << "NUsedS=" << nUsedCl
+ << "NUsed=" << nusedf
+ << "Like=" << like
+ << "S0.=" << &cseed[0]
+ << "S1.=" << &cseed[1]
+ << "S2.=" << &cseed[2]
+ << "S3.=" << &cseed[3]
+ << "S4.=" << &cseed[4]
+ << "S5.=" << &cseed[5]
+ << "Label=" << label
+ << "Freq=" << frequency
+ << "FitterT.=" << fitterT
+ << "FitterTC.=" << fitterTC
+ << "\n";
+ }
+
+ ntracks++;
+ AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
+ if(ntracks == kMaxTracksStack){
+ AliWarning(Form("Number of seeds reached maximum allowed (%d) in stack.", kMaxTracksStack));
+ return ntracks;
+ }
+ cseed += 6;
}
}
}
- for(int isl=0; isl<4; isl++) delete layer[isl];
return ntracks;
}
Int_t sortindexes[6];
for (Int_t jLayer = 0; jLayer < 6; jLayer++) {
- squality[jLayer] = bseed[jLayer].IsOK() ? bseed[jLayer].GetQuality(kTRUE) : -1.;
+ squality[jLayer] = bseed[jLayer].IsOK() ? bseed[jLayer].GetQuality(kTRUE) : 1000.;
sumquality += squality[jLayer];
}
if ((sumquality >= lastquality) || (chi2 > lastchi2)) break;
}
chi2 = FitTiltedRieman(bseed, kTRUE);
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 7){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 7){
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
TLinearFitter *tiltedRieman = GetTiltedRiemanFitter();
sumdaf /= Float_t (nLayers - 2.0);
Double_t likeChi2Z = TMath::Exp(-chi2[2] * 0.14); // Chi2Z
- Double_t likeChi2TC = (AliTRDReconstructor::RecoParam()->IsVertexConstrained()) ?
+ Double_t likeChi2TC = (fReconstructor->GetRecoParam() ->IsVertexConstrained()) ?
TMath::Exp(-chi2[1] * 0.677) : 1; // Constrained Tilted Riemann
Double_t likeChi2TR = TMath::Exp(-chi2[0] * 0.78); // Non-constrained Tilted Riemann
Double_t likeAF = TMath::Exp(-sumdaf * 3.23);
Double_t trackLikelihood = likeChi2Z * likeChi2TR * likeAF;
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
TTreeSRedirector &cstreamer = *fgDebugStreamer;
//
// ratio of the total number of clusters/track which are expected to be found by the tracker.
- Float_t fgFindable = AliTRDReconstructor::RecoParam()->GetFindableClusters();
+ Float_t fgFindable = fReconstructor->GetRecoParam() ->GetFindableClusters();
Int_t nclusters = 0;
Double_t like = likea * likechi2y * likechi2z * likeN;
// AliInfo(Form("sumda(%f) chi2[0](%f) chi2[1](%f) likea(%f) likechi2y(%f) likechi2z(%f) nclusters(%d) likeN(%f)", sumda, chi2[0], chi2[1], likea, likechi2y, likechi2z, nclusters, likeN));
- if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
// The Debug Stream contains the seed
AliCluster* AliTRDtrackerV1::GetCluster(Int_t idx) const
{
Int_t ncls = fClusters->GetEntriesFast();
- return idx >= 0 || idx < ncls ? (AliCluster*)fClusters->UncheckedAt(idx) : 0x0;
+ return idx >= 0 && idx < ncls ? (AliCluster*)fClusters->UncheckedAt(idx) : 0x0;
}
//____________________________________________________________________
AliTRDseedV1* AliTRDtrackerV1::GetTracklet(Int_t idx) const
{
Int_t ntrklt = fTracklets->GetEntriesFast();
- return idx >= 0 || idx < ntrklt ? (AliTRDseedV1*)fTracklets->UncheckedAt(idx) : 0x0;
+ return idx >= 0 && idx < ntrklt ? (AliTRDseedV1*)fTracklets->UncheckedAt(idx) : 0x0;
}
//____________________________________________________________________
AliKalmanTrack* AliTRDtrackerV1::GetTrack(Int_t idx) const
{
Int_t ntrk = fTracks->GetEntriesFast();
- return idx >= 0 || idx < ntrk ? (AliKalmanTrack*)fTracks->UncheckedAt(idx) : 0x0;
+ return idx >= 0 && idx < ntrk ? (AliKalmanTrack*)fTracks->UncheckedAt(idx) : 0x0;
}
//____________________________________________________________________
}
+void AliTRDtrackerV1::SetReconstructor(const AliTRDReconstructor *rec){
+ fReconstructor = rec;
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
+ if(!fgDebugStreamer)
+ fgDebugStreamer = new TTreeSRedirector("TRD.TrackerDebug.root");
+ }
+}
+
//_____________________________________________________________________________
Float_t AliTRDtrackerV1::GetChi2Y(AliTRDseedV1 *tracklets) const
{
return chi2;
}
+//____________________________________________________________________
+void AliTRDtrackerV1::ResetSeedTB()
+{
+// reset buffer for seeding time bin layers. If the time bin
+// layers are not allocated this function allocates them
+
+ for(Int_t isl=0; isl<kNSeedPlanes; isl++){
+ if(!fSeedTB[isl]) fSeedTB[isl] = new AliTRDchamberTimeBin();
+ else fSeedTB[isl]->Clear();
+ }
+}
+
//_____________________________________________________________________________
Float_t AliTRDtrackerV1::GetChi2Z(AliTRDseedV1 *tracklets) const
{