enum ETRDtrackletStatus {
kOwner = BIT(14) // owner of its clusters
,kRowCross = BIT(15) // pad row cross tracklet
- ,kCalib = BIT(16) // calibrated tracklet
- ,kKink = BIT(17) // kink prolongation tracklet
- ,kStandAlone = BIT(18)
+ ,kPID = BIT(16) // PID contributor
+ ,kCalib = BIT(17) // calibrated tracklet
+ ,kKink = BIT(18) // kink prolongation tracklet
+ ,kStandAlone = BIT(19) // stand alone build tracklet
};
AliTRDseedV1(Int_t det = -1);
Bool_t IsCalibrated() const { return TestBit(kCalib);}
Bool_t IsOwner() const { return TestBit(kOwner);}
Bool_t IsKink() const { return TestBit(kKink);}
+ Bool_t HasPID() const { return TestBit(kPID);}
Bool_t IsOK() const { return GetN() > 4 && GetNUsed() < 4;}
Bool_t IsRowCross() const { return TestBit(kRowCross);}
Bool_t IsUsable(Int_t i) const { return fClusters[i] && !fClusters[i]->IsUsed();}
inline void SetCovRef(const Double_t *cov);
void SetIndexes(Int_t i, Int_t idx) { fIndexes[i] = idx; }
void SetLabels(Int_t *lbls) { memcpy(fLabels, lbls, 3*sizeof(Int_t)); }
- void SetKink(Bool_t k) { SetBit(kKink, k);}
+ void SetKink(Bool_t k = kTRUE){ SetBit(kKink, k);}
+ void SetPID(Bool_t k = kTRUE) { SetBit(kPID, k);}
void SetStandAlone(Bool_t st) { SetBit(kStandAlone, st); }
void SetPt(Double_t pt) { fPt = pt;}
void SetOwner();
{
// Retrieve number of tracklets used for PID calculation.
- UChar_t fPIDquality = 0;
+ UChar_t nPID = 0;
Float_t *prob = 0x0;
for(int ip=0; ip<kNplane; ip++){
if(fTrackletIndex[ip] == 0xffff) continue;
if(!fTracklet[ip]->IsOK()) continue;
- if(!(prob = fTracklet[ip]->GetProbability(kFALSE))) return 0;
+ if(!(prob = fTracklet[ip]->GetProbability(kFALSE))) continue;
Int_t nspec = 0; // quality check of tracklet dEdx
for(int ispec=0; ispec<AliPID::kSPECIES; ispec++){
}
if(!nspec) continue;
- fPIDquality++;
+ fTracklet[ip]->SetPID();
+ nPID++;
}
- return fPIDquality;
+ return nPID;
}
//___________________________________________________________
Double_t alpha = TMath::ATan2(xyz0[1],xyz0[0]);
Rotate(alpha,kTRUE);
GetXYZ(xyz0);
- if(GetProlongation(r,y,z)<0) return -1;
+ if(GetProlongation(x,y,z)<0) return -1;
xyz1[0] = x * TMath::Cos(alpha) + y * TMath::Sin(alpha);
xyz1[1] = x * TMath::Sin(alpha) - y * TMath::Cos(alpha);
xyz1[2] = z;
//
Int_t nslices = fReconstructor->IsEightSlices() ? (Int_t)AliTRDpidUtil::kNNslices : (Int_t)AliTRDpidUtil::kLQslices;
- track->SetNumberOfTRDslices(nslices);
-
- Int_t n = 0;
+ // number of tracklets used for PID calculation
+ UChar_t nPID = GetNumberOfTrackletsPID();
+ // number of tracklets attached to the track
+ UChar_t nTrk = GetNumberOfTracklets();
+ // pack the two numbers together and store them in the ESD
+ track->SetTRDntracklets(nPID | (nTrk<<3));
+ // allocate space to store raw PID signals dEdx & momentum
+ track->SetNumberOfTRDslices((nslices+2)*nPID);
+ // store raw signals
+ Double_t p, sp;
for (Int_t ip = 0; ip < kNplane; ip++) {
if(fTrackletIndex[ip] == 0xffff) continue;
- n++;
- if(!fTracklet[ip]->IsOK()) continue;
- fTracklet[ip]->CookdEdx(nslices);
+ if(!fTracklet[ip]->HasPID()) continue;
Float_t *dedx = fTracklet[ip]->GetdEdx();
for (Int_t js = 0; js < nslices; js++, dedx++) track->SetTRDslice(*dedx, ip, js);
+ p = fTracklet[ip]->GetMomentum(&sp);
+ track->SetTRDmomentum(p, ip, &sp);
}
-
- UChar_t nPID = GetNumberOfTrackletsPID();
- if(!nPID) track->SetTRDntracklets(n);
- else {
- track->SetTRDpid(fPID);
- nPID |= (n<<3);
- track->SetTRDntracklets(nPID);
- }
+ // store PID probabilities
+ track->SetTRDpid(fPID);
}