fZref[0] = 0.; fZref[1] = 0.;
fYfit[0] = 0.; fYfit[1] = 0.;
fZfit[0] = 0.; fZfit[1] = 0.;
- memset(fdEdx, 0, kNslices*sizeof(Float_t));
+ memset(fdEdx, 0, kNdEdxSlices*sizeof(Float_t));
for(int ispec=0; ispec<AliPID::kSPECIES; ispec++) fProb[ispec] = -1.;
fLabels[0]=-1; fLabels[1]=-1; // most freq MC labels
fLabels[2]=0; // number of different labels for tracklet
target.fZref[0] = fZref[0]; target.fZref[1] = fZref[1];
target.fYfit[0] = fYfit[0]; target.fYfit[1] = fYfit[1];
target.fZfit[0] = fZfit[0]; target.fZfit[1] = fZfit[1];
- memcpy(target.fdEdx, fdEdx, kNslices*sizeof(Float_t));
+ memcpy(target.fdEdx, fdEdx, kNdEdxSlices*sizeof(Float_t));
memcpy(target.fProb, fProb, AliPID::kSPECIES*sizeof(Float_t));
memcpy(target.fLabels, fLabels, 3*sizeof(Int_t));
memcpy(target.fRefCov, fRefCov, 7*sizeof(Double_t));
//____________________________________________________________
-Bool_t AliTRDseedV1::Init(AliTRDtrackV1 *track)
+Bool_t AliTRDseedV1::Init(const AliTRDtrackV1 *track)
{
// Initialize this tracklet using the track information
//
fZref[0] = 0.; fZref[1] = 0.;
fYfit[0] = 0.; fYfit[1] = 0.;
fZfit[0] = 0.; fZfit[1] = 0.;
- memset(fdEdx, 0, kNslices*sizeof(Float_t));
+ memset(fdEdx, 0, kNdEdxSlices*sizeof(Float_t));
for(int ispec=0; ispec<AliPID::kSPECIES; ispec++) fProb[ispec] = -1.;
fLabels[0]=-1; fLabels[1]=-1; // most freq MC labels
fLabels[2]=0; // number of different labels for tracklet
// 3. cluster size
//
- memset(fdEdx, 0, kNslices*sizeof(Float_t));
+ memset(fdEdx, 0, kNdEdxSlices*sizeof(Float_t));
const Double_t kDriftLength = (.5 * AliTRDgeometry::AmThick() + AliTRDgeometry::DrThick());
AliTRDcluster *c(NULL);
AliTRDcluster *c(NULL); Float_t qt(0.);
for(int ic=0; ic<kNclusters; ic++){
if(!(c=fClusters[ic])) continue;
- if(c->IsInChamber() && !useOutliers) continue;
+ if(!c->IsInChamber() && !useOutliers) continue;
qt += TMath::Abs(c->GetQ());
}
return qt;
}
+//____________________________________________________________________
+Int_t AliTRDseedV1::GetChargeGaps(Float_t sz[kNtb], Float_t pos[kNtb], Int_t isz[kNtb]) const
+{
+// Find number, size and position of charge gaps (consecutive missing time bins).
+// Returns the number of gaps and fills their size in input array "sz" and position in array "pos"
+
+ Bool_t gap(kFALSE);
+ Int_t n(0);
+ Int_t ipos[kNtb]; memset(isz, 0, kNtb*sizeof(Int_t));memset(ipos, 0, kNtb*sizeof(Int_t));
+ for(int ic(0); ic<kNtb; ic++){
+ if(fClusters[ic] || fClusters[ic+kNtb]){
+ if(gap) n++;
+ continue;
+ }
+ gap = kTRUE;
+ isz[n]++;
+ ipos[n] = ic;
+ }
+ if(!n) return 0;
+
+ // write calibrated values
+ AliTRDcluster fake;
+ for(Int_t igap(0); igap<n; igap++){
+ sz[igap] = isz[igap]*fVD/AliTRDCommonParam::Instance()->GetSamplingFrequency();
+ fake.SetPadTime(ipos[igap]);
+ pos[igap] = fake.GetXloc(fT0, fVD);
+ if(isz[igap]>1){
+ fake.SetPadTime(ipos[igap]-isz[igap]+1);
+ pos[igap] += fake.GetXloc(fT0, fVD);
+ pos[igap] /= 2.;
+ }
+ }
+ return n;
+}
+
+
//____________________________________________________________________
Bool_t AliTRDseedV1::GetEstimatedCrossPoint(Float_t &x, Float_t &z) const
{
return kTRUE;
}
+//____________________________________________________________________
+Float_t AliTRDseedV1::GetQperTB(Int_t tb) const
+{
+ //
+ // Charge of the clusters at timebin
+ //
+ Float_t q = 0;
+ if(fClusters[tb] /*&& fClusters[tb]->IsInChamber()*/)
+ q += TMath::Abs(fClusters[tb]->GetQ());
+ if(fClusters[tb+kNtb] /*&& fClusters[tb+kNtb]->IsInChamber()*/)
+ q += TMath::Abs(fClusters[tb+kNtb]->GetQ());
+ return q/TMath::Sqrt(1. + fYref[1]*fYref[1] + fZref[1]*fZref[1]);
+}
+
//____________________________________________________________________
Float_t AliTRDseedV1::GetdQdl() const
{
//
Double_t p = fPt*TMath::Sqrt(1.+fZref[1]*fZref[1]);
- Double_t p2 = p*p;
- Double_t tgl2 = fZref[1]*fZref[1];
- Double_t pt2 = fPt*fPt;
if(err){
- Double_t s2 =
+ Double_t p2 = p*p;
+ Double_t tgl2 = fZref[1]*fZref[1];
+ Double_t pt2 = fPt*fPt;
+ Double_t s2 =
p2*tgl2*pt2*pt2*fRefCov[4]
-2.*p2*fZref[1]*fPt*pt2*fRefCov[5]
+p2*pt2*fRefCov[6];
//____________________________________________________________________
-Float_t AliTRDseedV1::GetOccupancyTB() const
+Int_t AliTRDseedV1::GetTBoccupancy() const
{
-// Returns procentage of TB occupied by clusters
+// Returns no. of TB occupied by clusters
Int_t n(0);
- AliTRDcluster *c(NULL);
- for(int ic=0; ic<AliTRDtrackerV1::GetNTimeBins(); ic++){
- if(!(c = fClusters[ic]) && !(c = fClusters[ic+kNtb])) continue;
+ for(int ic(0); ic<kNtb; ic++){
+ if(!fClusters[ic] && !fClusters[ic+kNtb]) continue;
n++;
}
+ return n;
+}
- return Float_t(n)/AliTRDtrackerV1::GetNTimeBins();
+//____________________________________________________________________
+Int_t AliTRDseedV1::GetTBcross() const
+{
+// Returns no. of TB occupied by 2 clusters for pad row cross tracklets
+
+ if(!IsRowCross()) return 0;
+ Int_t n(0);
+ for(int ic(0); ic<kNtb; ic++){
+ if(fClusters[ic] && fClusters[ic+kNtb]) n++;
+ }
+ return n;
}
//____________________________________________________________________
// - Neural Network [default] - option "nn"
// - 2D Likelihood - option "!nn"
+ AliWarning(Form("Obsolete function. Use AliTRDPIDResponse::GetResponse() instead."));
+
AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
if (!calibration) {
AliError("No access to calibration data");
// Parameters
// - chamber : pointer to tracking chamber container used to search the tracklet
// - tilt : switch for tilt correction during road building [default true]
+// - chgPos : mark same[kFALSE] and opposite[kTRUE] sign tracks with respect to Bz field sign [default true]
+// - ev : event number for debug purposes [default = -1]
// Output
// - true : if tracklet found successfully. Failure can happend because of the following:
// -
if(fkReconstructor->IsHLT()) cp.SetRPhiMethod(AliTRDcluster::kCOG);
if(!IsCalibrated()) Calibrate();
- Int_t kroadyShift(0);
+/* Int_t kroadyShift(0);
Float_t bz(AliTrackerBase::GetBz());
if(TMath::Abs(bz)>2.){
if(bz<0.) kroadyShift = chgPos ? +1 : -1;
else kroadyShift = chgPos ? -1 : +1;
- }
- AliDebug(4, Form("\n syTrk[cm]=%4.2f dydxTrk[deg]=%+6.2f rs[%d] Chg[%c] rY[cm]=%4.2f rZ[cm]=%5.2f TC[%c]", syRef, TMath::ATan(fYref[1])*TMath::RadToDeg(), kroadyShift, chgPos?'+':'-', kroady, kroadz, tilt?'y':'n'));
+ }*/
+ AliDebug(4, Form("\n syTrk[cm]=%4.2f dydxTrk[deg]=%+6.2f Chg[%c] rY[cm]=%4.2f rZ[cm]=%5.2f TC[%c]", syRef, TMath::ATan(fYref[1])*TMath::RadToDeg(), chgPos?'+':'-', kroady, kroadz, tilt?'y':'n'));
Double_t phiTrk(TMath::ATan(fYref[1])),
thtTrk(TMath::ATan(fZref[1]));
memset(s2y, 0, kNrows*kNcls*sizeof(Double_t));
memset(blst, 0, kNrows*kNcls*sizeof(Bool_t)); //this is 8 times faster to memset than "memset(clst, 0, kNrows*kNcls*sizeof(AliTRDcluster*))"
- Double_t roady(0.), s2Mean(0.), sMean(0.); Int_t ns2Mean(0);
+ Double_t roady(0.), s2Mean(0.); Int_t ns2Mean(0);
// Do cluster projection and pick up cluster candidates
AliTRDcluster *c(NULL);
for(Int_t ir(kNrows);ir--;) clst[ir].Clear();
return kFALSE;
}
- s2Mean /= ns2Mean; sMean = TMath::Sqrt(s2Mean);
+ s2Mean /= ns2Mean; //sMean = TMath::Sqrt(s2Mean);
//Double_t sRef(TMath::Sqrt(s2Mean+s2yTrk)); // reference error parameterization
// organize row candidates
}
AliDebug(4, Form("Sorted row candidates:\n"
" row[%2d] Ncl[%2d] <dz>[cm]=%+8.2f row[%2d] Ncl[%2d] <dz>[cm]=%+8.2f"
- , idxRow[0], ncl[idxRow[0]], zresRow[0], idxRow[1], ncl[idxRow[1]], zresRow[1]));
+ , idxRow[0], ncl[idxRow[0]], zresRow[0], idxRow[1], idxRow[1]<0?0:ncl[idxRow[1]], zresRow[1]));
// initialize debug streamer
TTreeSRedirector *pstreamer(NULL);
kDZDX=kFALSE;
}
- Float_t w = 1.;
- if(c->GetNPads()>4) w = .5;
- if(c->GetNPads()>5) w = .2;
+// TODO use this information to adjust cluster error parameterization
+// Float_t w = 1.;
+// if(c->GetNPads()>4) w = .5;
+// if(c->GetNPads()>5) w = .2;
// cluster charge
qc[n] = TMath::Abs(c->GetQ());
} else {
kScalePulls = attach->GetScaleCov();//*lyScaler;
}
+ // Retrieve chamber status
+ SetChmbGood(calibration->IsChamberGood(fDet));
+ if(!IsChmbGood()) kScalePulls*=10.;
}
Double_t xc[kNclusters], yc[kNclusters], sy[kNclusters];
Int_t n(0), // clusters used in fit