//____________________________________________________________________
AliTRDtrackerV1::AliTRDtrackerV1(AliTRDReconstructor *rec)
:AliTracker()
- ,fReconstructor(rec)
+ ,fReconstructor(0x0)
,fGeom(new AliTRDgeometry())
,fClusters(0x0)
,fTracklets(0x0)
for(Int_t isl =0; isl<kNSeedPlanes; isl++) fSeedTB[isl] = 0x0;
// Initialize debug stream
- if(fReconstructor){
- if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
- TDirectory *savedir = gDirectory;
- fgDebugStreamer = new TTreeSRedirector("TRD.TrackerDebug.root");
- savedir->cd();
- }
- }
+ if(rec) SetReconstructor(rec);
}
//____________________________________________________________________
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;}
+ if(fClusters) {
+ fClusters->Delete(); delete fClusters;
+ }
if(fGeom) delete fGeom;
}
//track->Print();
//Int_t lbl = seed->GetLabel();
//track.SetSeedLabel(lbl);
- seed->UpdateTrackParams(&track, AliESDtrack::kTRDbackup); // Make backup
+
+ // Make backup and mark entrance in the TRD
+ seed->UpdateTrackParams(&track, AliESDtrack::kTRDin);
+ seed->UpdateTrackParams(&track, AliESDtrack::kTRDbackup);
Float_t p4 = track.GetC();
expectedClr = FollowBackProlongation(track);
//track.CookdEdxTimBin(seed->GetID());
track.CookLabel(1. - fgkLabelFraction);
if(track.GetBackupTrack()) UseClusters(track.GetBackupTrack());
-
// Sign only gold tracks
if (track.GetChi2() / track.GetNumberOfClusters() < 4) {
- if ((seed->GetKinkIndex(0) == 0) && (track.Pt() < 1.5)) UseClusters(&track);
+ if ((seed->GetKinkIndex(0) == 0) && (track.Pt() < 1.5)){
+ //UseClusters(&track);
+ }
}
Bool_t isGold = kFALSE;
}
ULong_t status = seed->GetStatus();
+ // reject tracks which failed propagation in the TRD
if((status & AliESDtrack::kTRDout) == 0) continue;
- if((status & AliESDtrack::kTRDin) != 0) continue;
+
+ // reject tracks which are produced by the TRD stand alone track finder.
+ if((status & AliESDtrack::kTRDin) == 0) continue;
nseed++;
track.ResetCovariance(50.0);
AliTRDtrackingChamber *chamber = 0x0;
AliTRDseedV1 tracklet, *ptrTracklet = 0x0;
+ // in case of stand alone tracking we store all the pointers to the tracklets in a temporary array
+ AliTRDseedV1 *tracklets[kNPlanes];
+ memset(tracklets, 0, sizeof(AliTRDseedV1 *) * kNPlanes);
+ for(Int_t ip = 0; ip < kNPlanes; ip++){
+ tracklets[ip] = t.GetTracklet(ip);
+ t.UnsetTracklet(ip);
+ }
// 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(ilayer);
+ ptrTracklet = tracklets[ilayer];
if(!ptrTracklet){
ptrTracklet = new(&tracklet) AliTRDseedV1(ilayer);
ptrTracklet->SetReconstructor(fReconstructor);
break;
}
+ //ptrTracklet->UseClusters();
}
if(!ptrTracklet->IsOK()){
if(x < 1.) continue; //temporary
Int_t AliTRDtrackerV1::LoadClusters(TTree *cTree)
{
//
- // Fills clusters into TRD tracking_sectors
- // Note that the numbering scheme for the TRD tracking_sectors
- // differs from that of TRD sectors
+ // Fills clusters into TRD tracking sectors
//
-
- if (ReadClusters(fClusters, cTree)) {
- AliError("Problem with reading the clusters !");
+ if(!fReconstructor->IsWritingClusters()){
+ fClusters = AliTRDReconstructor::GetClusters();
+ } else {
+ if (ReadClusters(fClusters, cTree)) {
+ AliError("Problem with reading the clusters !");
+ return 1;
+ }
+ }
+ SetClustersOwner();
+
+ if(!fClusters || !fClusters->GetEntriesFast()){
+ AliInfo("No TRD clusters");
return 1;
}
- Int_t ncl = fClusters->GetEntriesFast(), nin = 0;
- if(!ncl){
- AliInfo("Clusters 0");
+
+ //Int_t nin =
+ BuildTrackingContainers();
+
+ //Int_t ncl = fClusters->GetEntriesFast();
+ //AliInfo(Form("Clusters %d [%6.2f %% in the active volume]", ncl, 100.*float(nin)/ncl));
+
+ return 0;
+}
+
+//_____________________________________________________________________________
+Int_t AliTRDtrackerV1::LoadClusters(TClonesArray *clusters)
+{
+ //
+ // Fills clusters into TRD tracking sectors
+ // Function for use in the HLT
+
+ if(!clusters || !clusters->GetEntriesFast()){
+ AliInfo("No TRD clusters");
return 1;
}
- Int_t icl = ncl;
+ fClusters = clusters;
+ SetClustersOwner();
+
+ //Int_t nin =
+ BuildTrackingContainers();
+
+ //Int_t ncl = fClusters->GetEntriesFast();
+ //AliInfo(Form("Clusters %d [%6.2f %% in the active volume]", ncl, 100.*float(nin)/ncl));
+
+ return 0;
+}
+
+
+//____________________________________________________________________
+Int_t AliTRDtrackerV1::BuildTrackingContainers()
+{
+// Building tracking containers for clusters
+
+ Int_t nin =0, icl = fClusters->GetEntriesFast();
while (icl--) {
AliTRDcluster *c = (AliTRDcluster *) fClusters->UncheckedAt(icl);
if(c->IsInChamber()) nin++;
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::kNsector; isector++){
if(!fTrSec[isector].GetNChambers()) continue;
fTrSec[isector].Init(fReconstructor);
}
-
- return 0;
+
+ return nin;
}
+
//____________________________________________________________________
void AliTRDtrackerV1::UnloadClusters()
{
if(fTracks) fTracks->Delete();
if(fTracklets) fTracklets->Delete();
- if(fClusters) fClusters->Delete();
+ if(fClusters && IsClustersOwner()) fClusters->Delete();
+ if(fClusters){
+ if(IsClustersOwner()) fClusters->Delete();
+
+ // save clusters array in the reconstructor for further use.
+ if(!fReconstructor->IsWritingClusters()){
+ AliTRDReconstructor::SetClusters(fClusters);
+ SetClustersOwner(kFALSE);
+ } else AliTRDReconstructor::SetClusters(0x0);
+ }
for (int i = 0; i < AliTRDgeometry::kNsector; i++) fTrSec[i].Clear();
// Check track candidates
candidates = 0;
for (Int_t itrack = 0; itrack < ntracks; itrack++) {
- Int_t trackIndex = sort[itrack];
- if (signedTrack[trackIndex] || fakeTrack[trackIndex]) continue;
+ Int_t trackIndex = sort[itrack];
+ if (signedTrack[trackIndex] || fakeTrack[trackIndex]) continue;
- // Calculate track parameters from tracklets seeds
- Int_t labelsall[1000];
- Int_t nlabelsall = 0;
- Int_t naccepted = 0;
- Int_t ncl = 0;
- Int_t nused = 0;
- Int_t nlayers = 0;
- Int_t findable = 0;
- for (Int_t jLayer = 0; jLayer < kNPlanes; jLayer++) {
- Int_t jseed = kNPlanes*trackIndex+jLayer;
- if(!sseed[jseed].IsOK()) continue;
- if (TMath::Abs(sseed[jseed].GetYref(0) / sseed[jseed].GetX0()) < 0.15) findable++;
-
- sseed[jseed].UpdateUsed();
- ncl += sseed[jseed].GetN2();
- nused += sseed[jseed].GetNUsed();
- nlayers++;
-
- // Cooking label
- for (Int_t itime = 0; itime < fgNTimeBins; itime++) {
- if(!sseed[jseed].IsUsable(itime)) continue;
- naccepted++;
- Int_t tindex = 0, ilab = 0;
- while(ilab<3 && (tindex = sseed[jseed].GetClusters(itime)->GetLabel(ilab)) >= 0){
- labelsall[nlabelsall++] = tindex;
- ilab++;
- }
- }
- }
+ // Calculate track parameters from tracklets seeds
+ Int_t ncl = 0;
+ Int_t nused = 0;
+ Int_t nlayers = 0;
+ Int_t findable = 0;
+ for (Int_t jLayer = 0; jLayer < kNPlanes; jLayer++) {
+ Int_t jseed = kNPlanes*trackIndex+jLayer;
+ if(!sseed[jseed].IsOK()) continue;
+ if (TMath::Abs(sseed[jseed].GetYref(0) / sseed[jseed].GetX0()) < 0.15) findable++;
+
+ sseed[jseed].UpdateUsed();
+ ncl += sseed[jseed].GetN2();
+ nused += sseed[jseed].GetNUsed();
+ nlayers++;
+ }
+
// Filter duplicated tracks
if (nused > 30){
//printf("Skip %d nused %d\n", trackIndex, nused);
}
signedTrack[trackIndex] = kTRUE;
-
- // Build track label - what happens if measured data ???
- Int_t labels[1000];
- Int_t outlab[1000];
- Int_t nlab = 0;
- for (Int_t iLayer = 0; iLayer < 6; iLayer++) {
- Int_t jseed = kNPlanes*trackIndex+iLayer;
- if(!sseed[jseed].IsOK()) continue;
- for(int ilab=0; ilab<2; ilab++){
- if(sseed[jseed].GetLabels(ilab) < 0) continue;
- labels[nlab] = sseed[jseed].GetLabels(ilab);
- nlab++;
- }
- }
- Freq(nlab,labels,outlab,kFALSE);
- Int_t label = outlab[0];
- Int_t frequency = outlab[1];
- Freq(nlabelsall,labelsall,outlab,kFALSE);
- Int_t label1 = outlab[0];
- Int_t label2 = outlab[2];
- Float_t fakeratio = (naccepted - outlab[1]) / Float_t(naccepted);
-
// Sign clusters
AliTRDcluster *cl = 0x0; Int_t clusterIndex = -1;
- for (Int_t jLayer = 0; jLayer < 6; jLayer++) {
+ for (Int_t jLayer = 0; jLayer < kNPlanes; jLayer++) {
Int_t jseed = kNPlanes*trackIndex+jLayer;
if(!sseed[jseed].IsOK()) continue;
if(TMath::Abs(sseed[jseed].GetYfit(1) - sseed[jseed].GetYfit(1)) >= .2) continue; // check this condition with Marian
idx++;
lseed++;
}*/
- Double_t cR = lseed->GetC();
Double_t x = lseed->GetX0();// - 3.5;
trackParams[0] = x; //NEW AB
trackParams[1] = lseed->GetYref(0); // lseed->GetYat(x);
trackParams[2] = lseed->GetZref(0); // lseed->GetZat(x);
trackParams[3] = TMath::Sin(TMath::ATan(lseed->GetYref(1)));
trackParams[4] = lseed->GetZref(1) / TMath::Sqrt(1. + lseed->GetYref(1) * lseed->GetYref(1));
- trackParams[5] = cR;
+ trackParams[5] = lseed->GetC();
Int_t ich = 0; while(!(chamber = stack[ich])) ich++;
trackParams[6] = fGeom->GetSector(chamber->GetDetector());/* *alpha+shift; // Supermodule*/
Int_t nclusters = 0;
AliTRDseedV1 *dseed[6];
- for(int is=0; is<6; is++){
- dseed[is] = new AliTRDseedV1(sseed[trackIndex*6+is]);
- dseed[is]->SetOwner();
- nclusters += sseed[is].GetN2();
+
+ // Build track label - what happens if measured data ???
+ Int_t labels[1000];
+ Int_t outlab[1000];
+ Int_t nlab = 0;
+
+ Int_t labelsall[1000];
+ Int_t nlabelsall = 0;
+ Int_t naccepted = 0;
+
+ for (Int_t iLayer = 0; iLayer < kNPlanes; iLayer++) {
+ Int_t jseed = kNPlanes*trackIndex+iLayer;
+ dseed[iLayer] = new AliTRDseedV1(sseed[jseed]);
+ dseed[iLayer]->SetOwner();
+ nclusters += sseed[jseed].GetN2();
+ if(!sseed[jseed].IsOK()) continue;
+ for(int ilab=0; ilab<2; ilab++){
+ if(sseed[jseed].GetLabels(ilab) < 0) continue;
+ labels[nlab] = sseed[jseed].GetLabels(ilab);
+ nlab++;
+ }
+
+ // Cooking label
+ for (Int_t itime = 0; itime < fgNTimeBins; itime++) {
+ if(!sseed[jseed].IsUsable(itime)) continue;
+ naccepted++;
+ Int_t tindex = 0, ilab = 0;
+ while(ilab<3 && (tindex = sseed[jseed].GetClusters(itime)->GetLabel(ilab)) >= 0){
+ labelsall[nlabelsall++] = tindex;
+ ilab++;
+ }
+ }
}
+ Freq(nlab,labels,outlab,kFALSE);
+ Int_t label = outlab[0];
+ Int_t frequency = outlab[1];
+ Freq(nlabelsall,labelsall,outlab,kFALSE);
+ Int_t label1 = outlab[0];
+ Int_t label2 = outlab[2];
+ Float_t fakeratio = (naccepted - outlab[1]) / Float_t(naccepted);
+
//Int_t eventNrInFile = esd->GetEventNumberInFile();
//AliInfo(Form("Number of clusters %d.", nclusters));
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
AliWarning("Fail to build a TRD Track.");
continue;
}
+
//AliInfo("End of MakeTrack()");
- AliESDtrack esdTrack;
- esdTrack.UpdateTrackParams(track, AliESDtrack::kTRDout);
- esdTrack.SetLabel(track->GetLabel());
- track->UpdateESDtrack(&esdTrack);
+ AliESDtrack *esdTrack = new ((*esdTrackList)[ntracks0++]) AliESDtrack();
+ esdTrack->UpdateTrackParams(track, AliESDtrack::kTRDout);
+ esdTrack->SetLabel(track->GetLabel());
+ track->UpdateESDtrack(esdTrack);
// write ESD-friends if neccessary
if (fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 0){
AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(*track);
calibTrack->SetOwner();
- esdTrack.AddCalibObject(calibTrack);
+ esdTrack->AddCalibObject(calibTrack);
}
- new ((*esdTrackList)[ntracks0++]) AliESDtrack(esdTrack);
ntracks1++;
AliTRDtrackerDebug::SetTrackNumber(AliTRDtrackerDebug::GetTrackNumber() + 1);
}
// increment counters
ntracks2 += ntracks1;
+
+ if(fReconstructor->IsHLT()) break;
fSieveSeeding++;
// Rebuild plane configurations and indices taking only unused clusters into account
//
AliTRDtrackingChamber *chamber = 0x0;
- AliTRDcluster *c[4] = {0x0, 0x0, 0x0, 0x0}; // initilize seeding clusters
+ AliTRDcluster *c[kNSeedPlanes] = {0x0, 0x0, 0x0, 0x0}; // initilize seeding clusters
AliTRDseedV1 *cseed = &sseed[0]; // initialize tracklets for first track
Int_t ncl, mcl; // working variable for looping over clusters
Int_t index[AliTRDchamberTimeBin::kMaxClustersLayer], jndex[AliTRDchamberTimeBin::kMaxClustersLayer];
Int_t config = ipar[0];
Int_t ntracks = ipar[1];
Int_t planes[kNSeedPlanes]; GetSeedingConfig(config, planes);
-
+ Int_t planesExt[kNPlanes-kNSeedPlanes]; GetExtrapolationConfig(config, planesExt);
+
+
// Init chambers geometry
Int_t ic = 0; while(!(chamber = stack[ic])) ic++;
Int_t istack = fGeom->GetStack(chamber->GetDetector());
// 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();
+ for (Int_t il = 0; il < kNPlanes; il++) cseed[il].Reset();
FitRieman(c, chi2);
tseed->SetReconstructor(fReconstructor);
Double_t x_anode = stack[iLayer] ? stack[iLayer]->GetX() : x_def[iLayer];
tseed->SetX0(x_anode);
- //if(stack[iLayer]) tseed->SetX0(stack[iLayer]->GetX());
tseed->Init(GetRiemanFitter());
}
<<"RiemanFitter.=" << rim
<<"\n";
}
-
if(chi2[0] > fReconstructor->GetRecoParam() ->GetChi2Z()/*7./(3. - sLayer)*//*iter*/){
- //AliInfo(Form("Failed chi2 filter on chi2Z [%f].", chi2[0]));
+// //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]));
+// //AliInfo(Form("Failed chi2 filter on chi2Y [%f].", chi2[1]));
AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
continue;
}
if(nUsedCl > 25) break;
mlayers++;
}
+
if(mlayers < kNSeedPlanes){
//AliInfo(Form("Failed updating all seeds %d [%d].", mlayers, kNSeedPlanes));
AliTRDtrackerDebug::SetCandidateNumber(AliTRDtrackerDebug::GetCandidateNumber() + 1);
continue;
}
+
+ // temporary exit door for the HLT
+ if(fReconstructor->IsHLT()){
+ // attach clusters to extrapolation chambers
+ for(int iLayer=0; iLayer<kNPlanes-kNSeedPlanes; iLayer++){
+ Int_t jLayer = planesExt[iLayer];
+ if(!(chamber = stack[jLayer])) continue;
+ cseed[jLayer].AttachClustersIter(chamber, 1000.);
+ }
+ fTrackQuality[ntracks] = 1.; // dummy value
+ ntracks++;
+ if(ntracks == kMaxTracksStack){
+ AliWarning(Form("Number of seeds reached maximum allowed (%d) in stack.", kMaxTracksStack));
+ return ntracks;
+ }
+ cseed += 6;
+ 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
+ Double_t like = CookLikelihood(&cseed[0], planes); // 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));
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];
+ for(int iLayer=0; iLayer<kNPlanes-kNSeedPlanes; iLayer++){
+ Int_t jLayer = planesExt[iLayer];
if(!(chamber = stack[jLayer])) continue;
// fit extrapolated seed
// 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())
+ if(fReconstructor->GetRecoParam()->IsVertexConstrained())
chi2Vals[1] = FitTiltedRiemanConstraint(&cseed[0], GetZ()); // Do Vertex Constrained fit if desired
else
chi2Vals[1] = 1.;
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
TLinearFitter *fitterTC = GetTiltedRiemanFitterConstraint();
TLinearFitter *fitterT = GetTiltedRiemanFitter();
+ Int_t ncls = 0;
+ for(Int_t iseed = 0; iseed < kNPlanes; iseed++){
+ ncls += cseed[iseed].IsOK() ? cseed[iseed].GetN2() : 0;
+ }
cstreamer << "MakeSeeds2"
<< "EventNumber=" << eventNumber
<< "CandidateNumber=" << candidateNumber
<< "Chi2TR=" << chi2Vals[0]
<< "Chi2TC=" << chi2Vals[1]
<< "Nlayers=" << mlayers
+ << "NClusters=" << ncls
<< "NUsedS=" << nUsedCl
<< "NUsed=" << nusedf
<< "Like=" << like
// To be discussed with Marian !!
//
- AliTRDCalibraFillHisto *calibra = AliTRDCalibraFillHisto::Instance();
- if (!calibra) AliInfo("Could not get Calibra instance\n");
Double_t alpha = AliTRDgeometry::GetAlpha();
Double_t shift = AliTRDgeometry::GetAlpha()/2.0;
AliTRDtrackV1 track(seeds, ¶ms[1], c, params[0], params[6]*alpha+shift);
track.PropagateTo(params[0]-5.0);
+ if(fReconstructor->IsHLT()){
+ AliTRDseedV1 *ptrTracklet = 0x0;
+ for(Int_t ip=0; ip<kNPlanes; ip++){
+ track.UnsetTracklet(ip);
+ ptrTracklet = SetTracklet(&seeds[ip]);
+ track.SetTracklet(ptrTracklet, fTracklets->GetEntriesFast()-1);
+ }
+ return SetTrack(&track);
+ }
+
track.ResetCovariance(1);
Int_t nc = TMath::Abs(FollowBackProlongation(track));
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 5){
+ Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
+ Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
+ Double_t p[5]; // Track Params for the Debug Stream
+ track.GetExternalParameters(params[0], p);
+ TTreeSRedirector &cs = *fgDebugStreamer;
+ cs << "MakeTrack"
+ << "EventNumber=" << eventNumber
+ << "CandidateNumber=" << candidateNumber
+ << "nc=" << nc
+ << "X=" << params[0]
+ << "Y=" << p[0]
+ << "Z=" << p[1]
+ << "snp=" << p[2]
+ << "tnd=" << p[3]
+ << "crv=" << p[4]
+ << "Yin=" << params[1]
+ << "Zin=" << params[2]
+ << "snpin=" << params[3]
+ << "tndin=" << params[4]
+ << "crvin=" << params[5]
+ << "track.=" << &track
+ << "\n";
+ }
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);
-
+ AliTRDCalibraFillHisto *calibra = AliTRDCalibraFillHisto::Instance();
+ if (!calibra){
+ AliInfo("Could not get Calibra instance\n");
+ if(calibra->GetHisto2d()) calibra->UpdateHistogramsV1(ptrTrack);
+ }
return ptrTrack;
}
}
//____________________________________________________________________
-Double_t AliTRDtrackerV1::CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4]
- , Double_t *chi2)
+Double_t AliTRDtrackerV1::CookLikelihood(AliTRDseedV1 *cseed, Int_t planes[4])
{
//
// Calculate the probability of this track candidate.
//
// ratio of the total number of clusters/track which are expected to be found by the tracker.
- Float_t fgFindable = fReconstructor->GetRecoParam() ->GetFindableClusters();
-
+ const AliTRDrecoParam *fRecoPars = fReconstructor->GetRecoParam();
+ Double_t chi2y = GetChi2Y(&cseed[0]);
+ Double_t chi2z = GetChi2Z(&cseed[0]);
+
Int_t nclusters = 0;
Double_t sumda = 0.;
for(UChar_t ilayer = 0; ilayer < 4; ilayer++){
nclusters += cseed[jlayer].GetN2();
sumda += TMath::Abs(cseed[jlayer].GetYfitR(1) - cseed[jlayer].GetYref(1));
}
- Double_t likea = TMath::Exp(-sumda*10.6);
+ Double_t likea = TMath::Exp(-sumda * fRecoPars->GetPhiCut());
Double_t likechi2y = 0.0000000001;
- if (chi2[0] < 0.5) likechi2y += TMath::Exp(-TMath::Sqrt(chi2[0]) * 7.73);
- Double_t likechi2z = TMath::Exp(-chi2[1] * 0.088) / TMath::Exp(-chi2[1] * 0.019);
- Int_t enc = Int_t(fgFindable*4.*fgNTimeBins); // Expected Number Of Clusters, normally 72
- Double_t likeN = TMath::Exp(-(enc - nclusters) * 0.19);
-
+ if (fReconstructor->IsCosmic() || chi2y < 0.5) likechi2y += TMath::Exp(-TMath::Sqrt(chi2y) * fRecoPars->GetChi2YCut());
+ Double_t likechi2z = TMath::Exp(-chi2z * fRecoPars->GetChi2ZCut());
+ Double_t likeN = TMath::Exp(-(fRecoPars->GetMeanNclusters() - nclusters) / fRecoPars->GetSigmaNclusters());
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(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) >= 2){
Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
+ Int_t nTracklets = 0; Float_t mean_ncls = 0;
+ for(Int_t iseed=0; iseed < kNPlanes; iseed++){
+ if(!cseed[iseed].IsOK()) continue;
+ nTracklets++;
+ mean_ncls += cseed[iseed].GetN2();
+ }
+ if(nTracklets) mean_ncls /= nTracklets;
// The Debug Stream contains the seed
TTreeSRedirector &cstreamer = *fgDebugStreamer;
cstreamer << "CookLikelihood"
<< "tracklet4.=" << &cseed[4]
<< "tracklet5.=" << &cseed[5]
<< "sumda=" << sumda
- << "chi0=" << chi2[0]
- << "chi1=" << chi2[1]
+ << "chi2y=" << chi2y
+ << "chi2z=" << chi2z
<< "likea=" << likea
<< "likechi2y=" << likechi2y
<< "likechi2z=" << likechi2z
<< "nclusters=" << nclusters
<< "likeN=" << likeN
<< "like=" << like
+ << "meanncls=" << mean_ncls
<< "\n";
}
}
-void AliTRDtrackerV1::SetReconstructor(const AliTRDReconstructor *rec){
- fReconstructor = rec;
- if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
- if(!fgDebugStreamer)
- fgDebugStreamer = new TTreeSRedirector("TRD.TrackerDebug.root");
- }
+
+//____________________________________________________________________
+void AliTRDtrackerV1::SetReconstructor(const AliTRDReconstructor *rec)
+{
+ fReconstructor = rec;
+ if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
+ if(!fgDebugStreamer){
+ TDirectory *savedir = gDirectory;
+ fgDebugStreamer = new TTreeSRedirector("TRD.TrackerDebug.root");
+ savedir->cd();
+ }
+ }
}
//_____________________________________________________________________________
Float_t chi2 = 0;
for(Int_t ipl = 0; ipl < kNPlanes; ipl++){
if(!tracklets[ipl].IsOK()) continue;
- Double_t distLayer = tracklets[ipl].GetYfit(0) - tracklets[ipl].GetYref(0);
+ Double_t distLayer = (tracklets[ipl].GetYfit(0) - tracklets[ipl].GetYref(0));// /tracklets[ipl].GetSigmaY();
chi2 += distLayer * distLayer;
}
return chi2;
//_____________________________________________________________________________
Float_t AliTRDtrackerV1::GetChi2Z(AliTRDseedV1 *tracklets) const
{
- // Chi2 definition on z-direction
+ // Calculates normalized chi2 in z-direction
Float_t chi2 = 0;
+ // chi2 = Sum ((z - zmu)/sigma)^2
+ // Sigma for the z direction is defined as half of the padlength
for(Int_t ipl = 0; ipl < kNPlanes; ipl++){
if(!tracklets[ipl].IsOK()) continue;
- Double_t distLayer = tracklets[ipl].GetMeanz() - tracklets[ipl].GetZref(0);
+ Double_t distLayer = (tracklets[ipl].GetMeanz() - tracklets[ipl].GetZref(0)); // /(tracklets[ipl].GetPadLength()/2);
chi2 += distLayer * distLayer;
}
return chi2;