if (!AliTRDcalibDB::Instance()) {
AliFatal("Could not get calibration object");
}
- fgNTimeBins = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
+ if(!fgNTimeBins) fgNTimeBins = AliTRDcalibDB::Instance()->GetNumberOfTimeBins();
- for (Int_t isector = 0; isector < AliTRDgeometry::kNsect; isector++) new(&fTrSec[isector]) AliTRDtrackingSector(fGeom, isector);
+ for (Int_t isector = 0; isector < AliTRDgeometry::kNsector; isector++) new(&fTrSec[isector]) AliTRDtrackingSector(fGeom, isector);
+
+ if (!AliTRDReconstructor::RecoParam()){
+ AliWarning("RecoParams not set in AliTRDReconstructor. Setting to default LowFluxParam.");
+ AliTRDReconstructor::SetRecoParam(AliTRDrecoParam::GetLowFluxParam());
+ }
- if(AliTRDReconstructor::StreamLevel() > 1){
+
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
TDirectory *savedir = gDirectory;
fgDebugStreamer = new TTreeSRedirector("TRD.TrackerDebug.root");
savedir->cd();
//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);
// 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 nSeed = event->GetNumberOfTracks();
if(!nSeed){
// run stand alone tracking
- if (AliTRDReconstructor::SeedingOn()) Clusters2Tracks(event);
+ if (AliTRDReconstructor::RecoParam()->SeedingOn()) Clusters2Tracks(event);
return 0;
}
track.UpdateESDtrack(seed);
// Add TRD track to ESDfriendTrack
- if (AliTRDReconstructor::StreamLevel() > 0 /*&& quality TODO*/){
+ if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0 /*&& quality TODO*/){
AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
calibTrack->SetOwner();
seed->AddCalibObject(calibTrack);
track.UpdateESDtrack(seed);
// Add TRD track to ESDfriendTrack
-// if (AliTRDReconstructor::StreamLevel() > 0 /*&& quality TODO*/){
+// if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0 /*&& quality TODO*/){
// AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
// calibTrack->SetOwner();
// seed->AddCalibObject(calibTrack);
track.UpdateESDtrack(seed);
// Add TRD track to ESDfriendTrack
-// if (AliTRDReconstructor::StreamLevel() > 0 /*&& quality TODO*/){
+// if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0 /*&& quality TODO*/){
// AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
// calibTrack->SetOwner();
// seed->AddCalibObject(calibTrack);
}
}
- if(AliTRDReconstructor::StreamLevel() > 1){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 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);
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);
+ 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;
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);
//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::StreamLevel() > 1){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 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::StreamLevel() >= 5){
+ if(AliTRDReconstructor::RecoParam()->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);
tracklets[iLayer].SetChi2(chi2track);
}
- if(AliTRDReconstructor::StreamLevel() >=5){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >=5){
TTreeSRedirector &cstreamer = *fgDebugStreamer;
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
}
}
- if(AliTRDReconstructor::StreamLevel() >=5){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >=5){
TTreeSRedirector &cstreamer = *fgDebugStreamer;
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
// 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();
}
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();
return new ((*fTracklets)[nentries]) AliTRDseedV1(*tracklet);
}
+//____________________________________________________________________
+AliTRDtrackV1* AliTRDtrackerV1::SetTrack(AliTRDtrackV1 *track)
+{
+ // Add this track to the list of tracks stored in the tracker
+ //
+ // Parameters
+ // - track : pointer to the track to be added to the list
+ //
+ // Output
+ // - the pointer added
+ //
+ // Detailed description
+ // Build the tracks list if it is not yet created (late initialization)
+ // and adds the new track to the list.
+ //
+ if(!fTracks){
+ fTracks = new TClonesArray("AliTRDtrackV1", AliTRDgeometry::Nsector()*kMaxTracksStack);
+ fTracks->SetOwner(kTRUE);
+ }
+ Int_t nentries = fTracks->GetEntriesFast();
+ return new ((*fTracks)[nentries]) AliTRDtrackV1(*track);
+}
+
+
//____________________________________________________________________
Int_t AliTRDtrackerV1::Clusters2TracksSM(Int_t sector, AliESDEvent *esd)
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;
+ for(int ilayer=0; ilayer<AliTRDgeometry::kNlayer; ilayer++){
+ if(!(chamber = stack[ilayer])) continue;
if(chamber->GetNClusters() < fgNTimeBins * AliTRDReconstructor::RecoParam()->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::StreamLevel() > 1){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 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::StreamLevel() > 1) AliInfo(Form("Candidate TRD tracks %d in iteration %d.", ntracks, fSieveSeeding));
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 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::StreamLevel() > 1){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 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::StreamLevel() > 0){
+ if (AliTRDReconstructor::RecoParam()->GetStreamLevel() > 0){
//printf("Creating Calibrations Object\n");
AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(*track);
calibTrack->SetOwner();
chamber->Build(fGeom);//Indices(fSieveSeeding);
}
- if(AliTRDReconstructor::StreamLevel() > 1){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 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::StreamLevel() > 1){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() > 1){
AliInfo(Form("Making seeds Stack[%d] Config[%d] Tracks[%d]...", istack, config, ntracks));
}
}
Bool_t isFake = kFALSE;
- if(AliTRDReconstructor::StreamLevel() >= 2){
+ 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;
// AliInfo("Extrapolation done.");
// Debug Stream containing all the 6 tracklets
- if(AliTRDReconstructor::StreamLevel() >= 2){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
TTreeSRedirector &cstreamer = *fgDebugStreamer;
TLinearFitter *tiltedRieman = GetTiltedRiemanFitter();
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
// do the final track fitting (Once with vertex constraint and once without vertex constraint)
Double_t chi2Vals[3];
chi2Vals[0] = FitTiltedRieman(&cseed[0], kFALSE);
- chi2Vals[1] = FitTiltedRiemanConstraint(&cseed[0], GetZ());
+ 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]);
cseed[iLayer].SetChi2Z(chi2[1]);
}
- if(AliTRDReconstructor::StreamLevel() >= 2){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
TTreeSRedirector &cstreamer = *fgDebugStreamer;
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
c[ 6] = 0.0; c[ 7] = 0.0; c[ 8] = 0.0; c[ 9] = 0.1;
c[10] = 0.0; c[11] = 0.0; c[12] = 0.0; c[13] = 0.0; c[14] = params[5]*params[5]*0.01;
- AliTRDtrackV1 *track = new AliTRDtrackV1(seeds, ¶ms[1], c, params[0], params[6]*alpha+shift);
- track->PropagateTo(params[0]-5.0);
- track->ResetCovariance(1);
- Int_t nc = FollowBackProlongation(*track);
- if (nc < 30) {
- delete track;
- track = 0x0;
- } else {
- //track->CookdEdx();
- //track->CookdEdxTimBin(-1);
- track->CookLabel(.9);
- // computes PID for track
- track->CookPID();
- // update calibration references using this track
- if(calibra->GetHisto2d()) calibra->UpdateHistogramsV1(track);
- }
-
- return track;
+ AliTRDtrackV1 track(seeds, ¶ms[1], c, params[0], params[6]*alpha+shift);
+ track.PropagateTo(params[0]-5.0);
+ track.ResetCovariance(1);
+ Int_t nc = FollowBackProlongation(track);
+ if (nc < 30) return 0x0;
+
+ AliTRDtrackV1 *ptrTrack = SetTrack(&track);
+ ptrTrack->CookLabel(.9);
+ // computes PID for track
+ ptrTrack->CookPID();
+ // update calibration references using this track
+ if(calibra->GetHisto2d()) calibra->UpdateHistogramsV1(ptrTrack);
+
+ return ptrTrack;
}
}
chi2 = FitTiltedRieman(bseed, kTRUE);
- if(AliTRDReconstructor::StreamLevel() >= 7){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 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 = TMath::Exp(-chi2[1] * 0.677); // Constrained Tilted Riemann
+ Double_t likeChi2TC = (AliTRDReconstructor::RecoParam()->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::StreamLevel() >= 2){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
TTreeSRedirector &cstreamer = *fgDebugStreamer;
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::StreamLevel() >= 2){
+ if(AliTRDReconstructor::RecoParam()->GetStreamLevel() >= 2){
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
// The Debug Stream contains the seed