]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDseedV1.cxx
added slewing correction by data
[u/mrichter/AliRoot.git] / TRD / AliTRDseedV1.cxx
index 3f1f7f84db439a56bc4c0e9dd3e7e5aa3cea84cc..e06f1c2cf610d0cbb733cda16df8ecc4d2b92b1a 100644 (file)
@@ -102,7 +102,7 @@ AliTRDseedV1::AliTRDseedV1(Int_t det)
   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
@@ -224,7 +224,7 @@ void AliTRDseedV1::Copy(TObject &ref) const
   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)); 
@@ -258,7 +258,7 @@ void AliTRDseedV1::Init(const AliRieman *rieman)
 
 
 //____________________________________________________________
-Bool_t AliTRDseedV1::Init(AliTRDtrackV1 *track)
+Bool_t AliTRDseedV1::Init(const AliTRDtrackV1 *track)
 {
 // Initialize this tracklet using the track information
 //
@@ -308,7 +308,7 @@ void AliTRDseedV1::Reset(Option_t *opt)
   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
@@ -417,7 +417,7 @@ void AliTRDseedV1::CookdEdx(Int_t nslices)
 // 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);
@@ -495,12 +495,48 @@ Float_t AliTRDseedV1::GetCharge(Bool_t useOutliers) const
   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
 {
@@ -542,6 +578,20 @@ 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
 {
@@ -629,11 +679,11 @@ Float_t AliTRDseedV1::GetMomentum(Float_t *err) 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];
@@ -644,18 +694,29 @@ Float_t AliTRDseedV1::GetMomentum(Float_t *err) const
 
 
 //____________________________________________________________________
-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;
 }
 
 //____________________________________________________________________
@@ -685,6 +746,8 @@ Bool_t AliTRDseedV1::CookPID()
 // - 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");
@@ -993,6 +1056,8 @@ Bool_t  AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_
 // 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:
 //      -
@@ -1050,13 +1115,13 @@ Bool_t  AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_
   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]));
 
@@ -1080,7 +1145,7 @@ Bool_t  AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_
   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);
@@ -1153,7 +1218,7 @@ Bool_t  AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_
     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
@@ -1234,7 +1299,7 @@ Bool_t  AliTRDseedV1::AttachClusters(AliTRDtrackingChamber *const chamber, Bool_
   }
   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);
@@ -1876,9 +1941,10 @@ Bool_t AliTRDseedV1::Fit(UChar_t opt)
       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());
@@ -2008,6 +2074,9 @@ Bool_t AliTRDseedV1::FitRobust(Bool_t chg)
     } 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 
@@ -2132,7 +2201,7 @@ void AliTRDseedV1::Print(Option_t *o) const
   GetCovAt(x, cov);
   AliInfo("    |  x[cm]  |      y[cm]       |      z[cm]      |  dydx |  dzdx |");
   AliInfo(Form("Fit | %7.2f | %7.2f+-%7.2f | %7.2f+-%7.2f| %5.2f | ----- |", x, GetY(), TMath::Sqrt(cov[0]), GetZ(), TMath::Sqrt(cov[2]), fYfit[1]));
-  AliInfo(Form("Ref | %7.2f | %7.2f+-%7.2f | %7.2f+-%7.2f| %5.2f | %5.2f |", x, fYref[0]-fX*fYref[1], TMath::Sqrt(fRefCov[0]), fZref[0]-fX*fYref[1], TMath::Sqrt(fRefCov[2]), fYref[1], fZref[1]))
+  AliInfo(Form("Ref | %7.2f | %7.2f+-%7.2f | %7.2f+-%7.2f| %5.2f | %5.2f |", x, fYref[0]-fX*fYref[1], TMath::Sqrt(fRefCov[0]), fZref[0]-fX*fYref[1], TMath::Sqrt(fRefCov[2]), fYref[1], fZref[1]));
   AliInfo(Form("P / Pt [GeV/c] = %f / %f", GetMomentum(), fPt));
   if(IsStandAlone()) AliInfo(Form("C Rieman / Vertex [1/cm] = %f / %f", fC[0], fC[1]));
   AliInfo(Form("dEdx [a.u.]    = %f / %f / %f / %f / %f/ %f / %f / %f", fdEdx[0], fdEdx[1], fdEdx[2], fdEdx[3], fdEdx[4], fdEdx[5], fdEdx[6], fdEdx[7]));