//____________________________________________________________________
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;
}
// get detector for this tracklet
AliTRDcluster *cl = 0x0;
- Int_t ic = 0; do; while(!(cl = tracklet->GetClusters(ic++)));
+ Int_t ic = 0; do {} while(!(cl = tracklet->GetClusters(ic++)));
Int_t idet = cl->GetDetector();
Double_t local[3];
// Do the back prolongation
new(&track) AliTRDtrackV1(*seed);
- //track->Print();
+ track.SetReconstructor(fReconstructor);
+
//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);
// update calibration references using this track
if(calibra->GetHisto2d()) calibra->UpdateHistogramsV1(&track);
// save calibration object
+ if (fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 0 /*&& quality TODO*/){
+ AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
+ calibTrack->SetOwner();
+ seed->AddCalibObject(calibTrack);
+ }
+ //update ESD track
if ((track.GetNumberOfClusters() > 15) && (track.GetNumberOfClusters() > 0.5*expectedClr)) {
seed->UpdateTrackParams(&track, AliESDtrack::kTRDout);
-
track.UpdateESDtrack(seed);
-
- // Add TRD track to ESDfriendTrack
- if (fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 0 /*&& quality TODO*/){
- AliTRDtrackV1 *calibTrack = new AliTRDtrackV1(track);
- calibTrack->SetOwner();
- seed->AddCalibObject(calibTrack);
- }
}
}
//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);
xyz1[1] = x * TMath::Sin(alpha) + y * TMath::Cos(alpha);
xyz1[2] = z;
- // Get material budget
- Double_t param[7];
- AliTracker::MeanMaterialBudget(xyz0, xyz1, param);
- Double_t xrho= param[0]*param[4];
- Double_t xx0 = param[1]; // Get mean propagation parameters
-
- // Propagate and update
- t.PropagateTo(x, xx0, xrho);
- if (!AdjustSector(&t)) break;
+ Double_t length = TMath::Sqrt(
+ (xyz0[0]-xyz1[0])*(xyz0[0]-xyz1[0]) +
+ (xyz0[1]-xyz1[1])*(xyz0[1]-xyz1[1]) +
+ (xyz0[2]-xyz1[2])*(xyz0[2]-xyz1[2])
+ );
+ if(length>0.){
+ // Get material budget
+ Double_t param[7];
+ if(AliTracker::MeanMaterialBudget(xyz0, xyz1, param)<=0.) break;
+ Double_t xrho= param[0]*param[4];
+ Double_t xx0 = param[1]; // Get mean propagation parameters
+
+ // Propagate and update
+ t.PropagateTo(x, xx0, xrho);
+ if (!AdjustSector(&t)) break;
+ }
Double_t maxChi2 = t.GetPredictedChi2(tracklet);
if (maxChi2 < 1e+10 && t.Update(tracklet, maxChi2)){
if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
Int_t index;
- for(int iplane=0; iplane<6; iplane++){
+ for(int iplane=0; iplane<AliTRDgeometry::kNlayer; iplane++){
AliTRDseedV1 *tracklet = GetTracklet(&t, iplane, index);
if(!tracklet) continue;
t.SetTracklet(tracklet, index);
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);
if((x = fTrSec[sector].GetX(ilayer)) < 1.) continue;
- if (!t.GetProlongation(x, y, z)) return -nClustersExpected;
+ if (!t.GetProlongation(x, y, z)) return -1/*nClustersExpected*/;
Int_t stack = fGeom->GetStack(z, ilayer);
Int_t nCandidates = stack >= 0 ? 1 : 2;
z -= stack >= 0 ? 0. : 4.;
AliTRDpadPlane *pp = fGeom->GetPadPlane(ilayer, stack);
tracklet.SetTilt(TMath::Tan(TMath::DegToRad()*pp->GetTiltingAngle()));
tracklet.SetPadLength(pp->GetLengthIPad());
- tracklet.SetPlane(ilayer);
+ tracklet.SetDetector(chamber->GetDetector());
tracklet.SetX0(x);
if(!tracklet.Init(&t)){
t.SetStopped(kTRUE);
return nClustersExpected;
}
- if(!tracklet.AttachClustersIter(chamber, 1000.)) continue;
+ if(!tracklet.AttachClustersIter(chamber, 1000./*, kTRUE*/)) continue;
tracklet.Init(&t);
if(tracklet.GetN() < fgNTimeBins*fReconstructor->GetRecoParam() ->GetFindableClusters()) continue;
break;
}
+ //ptrTracklet->UseClusters();
}
if(!ptrTracklet->IsOK()){
if(x < 1.) continue; //temporary
- if(!PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) return -nClustersExpected;
- if(!AdjustSector(&t)) return -nClustersExpected;
- if(TMath::Abs(t.GetSnp()) > fgkMaxSnp) return -nClustersExpected;
+ if(!PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) return -1/*nClustersExpected*/;
+ if(!AdjustSector(&t)) return -1/*nClustersExpected*/;
+ if(TMath::Abs(t.GetSnp()) > fgkMaxSnp) return -1/*nClustersExpected*/;
continue;
}
// Propagate closer to the current chamber if neccessary
x -= clength;
- 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;
+ if (x > (fgkMaxStep + t.GetX()) && !PropagateToX(t, x-fgkMaxStep, fgkMaxStep)) return -1/*nClustersExpected*/;
+ if (!AdjustSector(&t)) return -1/*nClustersExpected*/;
+ if (TMath::Abs(t.GetSnp()) > fgkMaxSnp) return -1/*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)) return -nClustersExpected;
+ if (!t.GetProlongation(x, y, z)) return -1/*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);
xyz1[2] = z;
Double_t param[7];
- AliTracker::MeanMaterialBudget(xyz0, xyz1, param);
+ if(AliTracker::MeanMaterialBudget(xyz0, xyz1, param)<=0.) return -1;
// The mean propagation parameters
Double_t xrho = param[0]*param[4]; // density*length
Double_t xx0 = param[1]; // radiation length
// Propagate and update track
- if (!t.PropagateTo(x, xx0, xrho)) return -nClustersExpected;
- if (!AdjustSector(&t)) return -nClustersExpected;
+ if (!t.PropagateTo(x, xx0, xrho)) return -1/*nClustersExpected*/;
+ if (!AdjustSector(&t)) return -1/*nClustersExpected*/;
Double_t maxChi2 = t.GetPredictedChi2(ptrTracklet);
- if (!t.Update(ptrTracklet, maxChi2)) return -nClustersExpected;
+ if (!t.Update(ptrTracklet, maxChi2)) return -1/*nClustersExpected*/;
if (maxChi2<1e+10) {
nClustersExpected += ptrTracklet->GetN();
//t.SetTracklet(&tracklet, index);
Double_t c = fitter->GetParameter(2);
Double_t y0 = 1. / a;
Double_t x0 = -b * y0;
- Double_t R = TMath::Sqrt(y0*y0 + x0*x0 - c*y0);
+ Double_t tmp = y0*y0 + x0*x0 - c*y0;
+ if(tmp<=0.) return 1.E10;
+ Double_t R = TMath::Sqrt(tmp);
Double_t C = 1.0 + b*b - c*a;
if (C > 0.0) C = a / TMath::Sqrt(C);
if(!track){
for(Int_t ip = 0; ip < kNPlanes; ip++) {
x = tracklets[ip].GetX0();
- Double_t tmp = TMath::Sqrt(R*R-(x-x0)*(x-x0));
+ tmp = R*R-(x-x0)*(x-x0);
+ if(tmp <= 0.) continue;
+ tmp = TMath::Sqrt(tmp);
// y: R^2 = (x - x0)^2 + (y - y0)^2
// => y = y0 +/- Sqrt(R^2 - (x - x0)^2)
Float_t xyz[3];
for(int ip=0; ip<np; ip++){
points[ip].GetXYZ(xyz);
- xyz[1] = y0 - (y0>0.?1.:-1)*TMath::Sqrt(R*R-(xyz[0]-x0)*(xyz[0]-x0));
+ xyz[1] = y0 - (y0>0.?1.:-1.)*TMath::Sqrt(R*R-(xyz[0]-x0)*(xyz[0]-x0));
xyz[2] = z0 + dzdx * (xyz[0] - xref);
points[ip].SetXYZ(xyz);
}
}
-/* if(fReconstructor->GetStreamLevel() >=5){
- TTreeSRedirector &cstreamer = *fgDebugStreamer;
- Int_t eventNumber = AliTRDtrackerDebug::GetEventNumber();
- Int_t candidateNumber = AliTRDtrackerDebug::GetCandidateNumber();
- Double_t chi2z = CalculateChi2Z(tracklets, z0, dzdx, xref);
- cstreamer << "FitRiemanTilt"
- << "EventNumber=" << eventNumber
- << "CandidateNumber=" << candidateNumber
- << "xref=" << xref
- << "Chi2Z=" << chi2z
- << "\n";
- }*/
return chi2;
}
xyz1[1] = +x * TMath::Sin(alpha) + y * TMath::Cos(alpha);
xyz1[2] = z;
Double_t param[7];
- AliTracker::MeanMaterialBudget(xyz0, xyz1, param);
+ if(AliTracker::MeanMaterialBudget(xyz0, xyz1, param)<=0.) break;
Double_t xrho = param[0]*param[4]; // density*length
Double_t xx0 = param[1]; // radiation length
// Calculate the mean material budget between start and
// end point of this prolongation step
- AliTracker::MeanMaterialBudget(xyz0, xyz1, param);
+ if(AliTracker::MeanMaterialBudget(xyz0, xyz1, param)<=0.) return 0;
// Propagate the track to the X-position after the next step
if (!t.PropagateTo(x,param[1],param[0]*param[4])) {
branch->SetAddress(&clusterArray);
if(!fClusters){
- array = new TClonesArray("AliTRDcluster", nsize);
+ Float_t nclusters = fReconstructor->GetRecoParam()->GetNClusters();
+ if(fReconstructor->IsHLT()) nclusters /= AliTRDgeometry::kNsector;
+ array = new TClonesArray("AliTRDcluster", Int_t(nclusters));
array->SetOwner(kTRUE);
}
// Fills clusters into TRD tracking sectors
//
- if(!(fClusters = AliTRDReconstructor::GetClusters())){
+ if(!fReconstructor->IsWritingClusters()){
+ fClusters = AliTRDReconstructor::GetClusters();
+ } else {
if (ReadClusters(fClusters, cTree)) {
AliError("Problem with reading the clusters !");
return 1;
}
SetClustersOwner();
- if(!fClusters->GetEntriesFast()){
+ if(!fClusters || !fClusters->GetEntriesFast()){
AliInfo("No TRD clusters");
return 1;
}
fTrSec[sector].GetChamber(stack, layer, kTRUE)->InsertCluster(c, icl);
}
-
+
+ const AliTRDCalDet *cal = AliTRDcalibDB::Instance()->GetT0Det();
for(int isector =0; isector<AliTRDgeometry::kNsector; isector++){
if(!fTrSec[isector].GetNChambers()) continue;
- fTrSec[isector].Init(fReconstructor);
+ fTrSec[isector].Init(fReconstructor, cal);
}
return nin;
if(fTracks) fTracks->Delete();
if(fTracklets) fTracklets->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();
// 8. Build ESD track and register it to the output list
//
+ const AliTRDCalDet *cal = AliTRDcalibDB::Instance()->GetT0Det();
AliTRDtrackingChamber *chamber = 0x0;
AliTRDseedV1 sseed[kMaxTracksStack*6]; // to be initialized
Int_t pars[4]; // MakeSeeds parameters
AliInfo(Form("Plane config %d %d %d Quality %f"
, configs[0], configs[1], configs[2], quality));
}
+
// Initialize contors
Int_t ntracks, // number of TRD track candidates
ntracks1, // number of registered TRD tracks/iter
ntracks2 = 0; // number of all registered TRD tracks in stack
fSieveSeeding = 0;
+
+ // Get stack index
+ Int_t ic = 0; AliTRDtrackingChamber **cIter = &stack[0];
+ while(ic<kNPlanes && !(*cIter)){ic++; cIter++;}
+ if(!(*cIter)) return ntracks2;
+ Int_t istack = fGeom->GetStack((*cIter)->GetDetector());
+
do{
// Loop over seeding configurations
ntracks = 0; ntracks1 = 0;
for (Int_t iconf = 0; iconf<3; iconf++) {
pars[0] = configs[iconf];
pars[1] = ntracks;
+ pars[2] = istack;
ntracks = MakeSeeds(stack, &sseed[6*ntracks], pars);
if(ntracks == kMaxTracksStack) break;
}
// 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;
if(TMath::Abs(sseed[jseed].GetYfit(1) - sseed[jseed].GetYfit(1)) >= .2) continue; // check this condition with Marian
sseed[jseed].UseClusters();
if(!cl){
- Int_t ic = 0;
+ ic = 0;
while(!(cl = sseed[jseed].GetClusters(ic))) ic++;
clusterIndex = sseed[jseed].GetIndexes(ic);
}
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 = new ((*esdTrackList)[ntracks0++]) AliESDtrack();
esdTrack->UpdateTrackParams(track, AliESDtrack::kTRDout);
for(Int_t ip = 0; ip < kNPlanes; ip++){
if(!(chamber = stack[ip])) continue;
- chamber->Build(fGeom);//Indices(fSieveSeeding);
+ chamber->Build(fGeom, cal);//Indices(fSieveSeeding);
}
if(fReconstructor->GetStreamLevel(AliTRDReconstructor::kTracker) > 1){
// Default positions for the anode wire in all 6 Layers in case of a stack with missing clusters
// Positions taken using cosmic data taken with SM3 after rebuild
- Double_t x_def[kNPlanes] = {300.2, 312.8, 325.4, 338, 350.6, 363.2};
+ Double_t x_def[kNPlanes] = {300.2, 312.8, 325.4, 338.0, 350.6, 363.2};
// this should be data member of AliTRDtrack
Double_t seedQuality[kMaxTracksStack];
// unpack control parameters
Int_t config = ipar[0];
Int_t ntracks = ipar[1];
+ Int_t istack = ipar[2];
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());
Double_t hL[kNPlanes]; // Tilting angle
Float_t padlength[kNPlanes]; // pad lenghts
AliTRDpadPlane *pp = 0x0;
AliInfo(Form("Making seeds Stack[%d] Config[%d] Tracks[%d]...", istack, config, ntracks));
}
+ // Build seeding layers
ResetSeedTB();
Int_t nlayers = 0;
for(int isl=0; isl<kNSeedPlanes; isl++){
if(!chamber->GetSeedingLayer(fSeedTB[isl], fGeom, fReconstructor)) continue;
nlayers++;
}
- if(nlayers < 4) return 0;
+ if(nlayers < 4) return ntracks;
// Start finding seeds
// 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);
- AliTRDseedV1 *tseed = 0x0;
- for(int iLayer=0; iLayer<kNPlanes; iLayer++){
- tseed = &cseed[iLayer];
- tseed->SetPlane(iLayer);
+ AliTRDseedV1 *tseed = &cseed[0];
+ AliTRDtrackingChamber **cIter = &stack[0];
+ for(int iLayer=0; iLayer<kNPlanes; iLayer++, tseed++, cIter++){
+ tseed->SetDetector((*cIter) ? (*cIter)->GetDetector() : -1);
tseed->SetTilt(hL[iLayer]);
tseed->SetPadLength(padlength[iLayer]);
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->SetX0((*cIter) ? (*cIter)->GetX() : x_def[iLayer]);
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;
}
}
fTrackQuality[ntracks] = 1.; // dummy value
ntracks++;
- if(ntracks == kMaxTracksStack){
- AliWarning(Form("Number of seeds reached maximum allowed (%d) in stack.", kMaxTracksStack));
- return ntracks;
- }
+ if(ntracks == 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));
// 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->SetReconstructor(fReconstructor);
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();
- Int_t nclusters = 0;
+ Double_t chi2y = GetChi2Y(&cseed[0]);
+ Double_t chi2z = GetChi2Z(&cseed[0]);
+
+ Float_t nclusters = 0.;
Double_t sumda = 0.;
for(UChar_t ilayer = 0; ilayer < 4; ilayer++){
Int_t jlayer = planes[ilayer];
nclusters += cseed[jlayer].GetN2();
sumda += TMath::Abs(cseed[jlayer].GetYfitR(1) - cseed[jlayer].GetYref(1));
}
- Double_t likea = TMath::Exp(-sumda*10.6);
+ nclusters *= .25;
+
+ Double_t likea = TMath::Exp(-sumda * fRecoPars->GetPhiSlope());
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 < fRecoPars->GetChi2YCut()) likechi2y += TMath::Exp(-TMath::Sqrt(chi2y) * fRecoPars->GetChi2YSlope());
+ Double_t likechi2z = TMath::Exp(-chi2z * fRecoPars->GetChi2ZSlope());
+ Double_t likeN = TMath::Exp(-(fRecoPars->GetNMeanClusters() - nclusters) / fRecoPars->GetNSigmaClusters());
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";
}
return like;
}
-
-
//____________________________________________________________________
void AliTRDtrackerV1::GetSeedingConfig(Int_t iconfig, Int_t planes[4])
{
}
-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;