]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrackV1.cxx
define monitoring External Track Param for TRD track as follows
[u/mrichter/AliRoot.git] / TRD / AliTRDtrackV1.cxx
index 214e75cd296856cca3da42371482725be5701c75..b8aadaa197d3932eaf8ad105c3effe926ad17d54 100644 (file)
@@ -41,6 +41,7 @@ ClassImp(AliTRDtrackV1)
 //_______________________________________________________________
 AliTRDtrackV1::AliTRDtrackV1() : AliKalmanTrack()
   ,fStatus(0)
+  ,fESDid(0)
   ,fDE(0.)
   ,fkReconstructor(NULL)
   ,fBackupTrack(NULL)
@@ -58,7 +59,7 @@ AliTRDtrackV1::AliTRDtrackV1() : AliKalmanTrack()
   for(int is =0; is<AliPID::kSPECIES; is++) fPID[is] = pid;
 
   for(int ip=0; ip<kNplane; ip++){
-    fTrackletIndex[ip] = 0xffff;
+    fTrackletIndex[ip] = -1;
     fTracklet[ip]      = NULL;
   }
 }
@@ -66,6 +67,7 @@ AliTRDtrackV1::AliTRDtrackV1() : AliKalmanTrack()
 //_______________________________________________________________
 AliTRDtrackV1::AliTRDtrackV1(const AliTRDtrackV1 &ref) : AliKalmanTrack(ref)
   ,fStatus(ref.fStatus)
+  ,fESDid(ref.fESDid)
   ,fDE(ref.fDE)
   ,fkReconstructor(ref.fkReconstructor)
   ,fBackupTrack(NULL)
@@ -95,6 +97,7 @@ AliTRDtrackV1::AliTRDtrackV1(const AliTRDtrackV1 &ref) : AliKalmanTrack(ref)
 //_______________________________________________________________
 AliTRDtrackV1::AliTRDtrackV1(const AliESDtrack &t) : AliKalmanTrack()
   ,fStatus(0)
+  ,fESDid(0)
   ,fDE(0.)
   ,fkReconstructor(NULL)
   ,fBackupTrack(NULL)
@@ -105,14 +108,15 @@ AliTRDtrackV1::AliTRDtrackV1(const AliESDtrack &t) : AliKalmanTrack()
   // Constructor from AliESDtrack
   //
 
+  SetESDid(t.GetID());
   SetLabel(t.GetLabel());
   SetChi2(0.0);
 
   SetMass(t.GetMass()/*0.000510*/);
   AliKalmanTrack::SetNumberOfClusters(t.GetTRDncls()); 
-  Int_t ti[kNplane]; t.GetTRDtracklets(&ti[0]);
+  Int_t ti[]={-1, -1, -1, -1, -1, -1}; t.GetTRDtracklets(&ti[0]);
   for(int ip=0; ip<kNplane; ip++){ 
-    fTrackletIndex[ip] = ti[ip] < 0 ? 0xffff : ti[ip];
+    fTrackletIndex[ip] = ti[ip];
     fTracklet[ip]      = NULL;
   }
   for(int i =0; i<3; i++) fBudget[i] = 0.;
@@ -146,6 +150,7 @@ AliTRDtrackV1::AliTRDtrackV1(const AliESDtrack &t) : AliKalmanTrack()
 AliTRDtrackV1::AliTRDtrackV1(AliTRDseedV1 * const trklts, const Double_t p[5], const Double_t cov[15]
              , Double_t x, Double_t alpha) : AliKalmanTrack()
   ,fStatus(0)
+  ,fESDid(0)
   ,fDE(0.)
   ,fkReconstructor(NULL)
   ,fBackupTrack(NULL)
@@ -160,53 +165,50 @@ AliTRDtrackV1::AliTRDtrackV1(AliTRDseedV1 * const trklts, const Double_t p[5], c
   // 2. dQdl calculation
   //
 
-  Double_t cnv = GetBz() < 1.e-5 ? 1.e5 : 1.0 / (GetBz() * kB2C);
-  //  Double_t cnv   = 1.0 / (GetBz() * kB2C);
-
+  Double_t b(GetBz());
+  Double_t cnv = (TMath::Abs(b) < 1.e-5) ? 1.e5 : 1./GetBz()/kB2C;
+  
   Double_t pp[5] = { p[0]    
-                   , p[1]
-                   , p[2]
-                   , p[3]
-                   , p[4]*cnv      };
-
+                    , p[1]
+                    , p[2]
+                    , p[3]
+                    , p[4]*cnv      };
+  
   Double_t c22 = x*x*cov[14] - 2*x*cov[12] + cov[ 5];
   Double_t c32 =   x*cov[13] -     cov[ 8];
   Double_t c20 =   x*cov[10] -     cov[ 3];
   Double_t c21 =   x*cov[11] -     cov[ 4];
   Double_t c42 =   x*cov[14] -     cov[12];
-
+  
   Double_t cc[15] = { cov[ 0]
                     , cov[ 1],     cov[ 2]
                     , c20,         c21,         c22
                     , cov[ 6],     cov[ 7],     c32,     cov[ 9]
                     , cov[10]*cnv, cov[11]*cnv, c42*cnv, cov[13]*cnv, cov[14]*cnv*cnv };
-
+  
   Double_t mostProbablePt=AliExternalTrackParam::GetMostProbablePt();
   Double_t p0=TMath::Sign(1/mostProbablePt,pp[4]);
   Double_t w0=cc[14]/(cc[14] + p0*p0), w1=p0*p0/(cc[14] + p0*p0);
-  AliDebug(4, Form("Pt mixing : w0[%4.2f] 1/pt0[%5.3f] w1[%4.2f] 1/pt[%5.3f]", w0, 1./p0, w1, 1./pp[4]));
+  AliDebug(3, Form("Pt mixing : w0[%4.2f] pt0[%5.3f] w1[%4.2f] pt[%5.3f]", w0, 1./p0, w1, 1./pp[4]));
+  
   pp[4] = w0*p0 + w1*pp[4];
-
-
   cc[10]*=w1; cc[11]*=w1; cc[12]*=w1; cc[13]*=w1; cc[14]*=w1;
-
-       Set(x,alpha,pp,cc);
+  Set(x,alpha,pp,cc);
   AliDebug(2, Form("Init @ x[%6.2f] pt[%5.3f]", x, 1./pp[4]));
   Int_t ncls = 0;
-       for(int iplane=0; iplane<kNplane; iplane++){
-    fTrackletIndex[iplane] = 0xffff;
-               if(!trklts[iplane].IsOK()) fTracklet[iplane] = NULL;
+  for(int iplane=0; iplane<kNplane; iplane++){
+    fTrackletIndex[iplane] = -1;
+         if(!trklts[iplane].IsOK()) fTracklet[iplane] = NULL;
     else{ 
       fTracklet[iplane] = &trklts[iplane];
       ncls += fTracklet[iplane]->GetN();
     }
-       }
+  }
   AliKalmanTrack::SetNumberOfClusters(ncls);           
   for(int i =0; i<3; i++) fBudget[i] = 0.;
   
   Float_t pid = 1./AliPID::kSPECIES;
   for(int is =0; is<AliPID::kSPECIES; is++) fPID[is] = pid;
-
 }
 
 //_______________________________________________________________
@@ -223,7 +225,7 @@ AliTRDtrackV1::~AliTRDtrackV1()
   for(Int_t ip=0; ip<kNplane; ip++){
     if(TestBit(kOwner) && fTracklet[ip]) delete fTracklet[ip];
     fTracklet[ip] = NULL;
-    fTrackletIndex[ip] = 0xffff;
+    fTrackletIndex[ip] = -1;
   }
 }
        
@@ -243,7 +245,7 @@ Bool_t AliTRDtrackV1::CookLabel(Float_t wrong)
   Int_t label;
   AliTRDcluster *c    = NULL;
   for (Int_t ip = 0; ip < kNplane; ip++) {
-    if(fTrackletIndex[ip] == 0xffff) continue;
+    if(fTrackletIndex[ip]<0 || !fTracklet[ip]) continue;
     for (Int_t ic = 0; ic < AliTRDseedV1::kNclusters; ic++) {
       if(!(c = fTracklet[ip]->GetClusters(ic))) continue;
       for (Int_t k = 0; k < 3; k++) { 
@@ -328,10 +330,10 @@ UChar_t AliTRDtrackV1::GetNumberOfTrackletsPID() const
   UChar_t nPID = 0;
   Float_t *prob = NULL;
   for(int ip=0; ip<kNplane; ip++){
-    if(fTrackletIndex[ip] == 0xffff) continue;
+    if(fTrackletIndex[ip]<0 || !fTracklet[ip]) continue;
     if(!fTracklet[ip]->IsOK()) continue;
     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(prob[ispec] < 0.) continue;
@@ -350,15 +352,15 @@ UChar_t AliTRDtrackV1::SetNumberOfTrackletsPID(Bool_t recalc)
 {
 // Retrieve number of tracklets used for PID calculation. // Recalculated PID at tracklet level by quering the PID DB.
 
-  UChar_t fPIDquality = 0;
+  UChar_t fPIDquality(0);
   
   // steer PID calculation @ tracklet level
-  Float_t *prob = NULL;
+  Float_t *prob(NULL);
   for(int ip=0; ip<kNplane; ip++){
-    if(fTrackletIndex[ip] == 0xffff) continue;
+    if(fTrackletIndex[ip]<0 || !fTracklet[ip]) continue;
     if(!fTracklet[ip]->IsOK()) continue;
     if(!(prob = fTracklet[ip]->GetProbability(recalc))) return 0;
-    
+
     Int_t nspec = 0; // quality check of tracklet dEdx
     for(int ispec=0; ispec<AliPID::kSPECIES; ispec++){
       if(prob[ispec] < 0.) continue;
@@ -506,18 +508,57 @@ Bool_t AliTRDtrackV1::IsElectron() const
 
        
 //_____________________________________________________________________________
-void AliTRDtrackV1::MakeBackupTrack()
+Int_t AliTRDtrackV1::MakeBackupTrack()
 {
-  //
-  // Creates a backup track
-  //
+//
+// Creates a backup track
+// TO DO update quality check of the track.
+//
+
+  Float_t occupancy(0.); Int_t n(0), ncls(0);
+  for(Int_t il(AliTRDgeometry::kNlayer); il--;){ 
+    if(!fTracklet[il]) continue;
+    n++; 
+    occupancy+=fTracklet[il]->GetOccupancyTB();
+    ncls += fTracklet[il]->GetN();
+  }
+  if(!n) return -1;
+  occupancy/=n;
+
+  //Float_t ratio1 = Float_t(t.GetNumberOfClusters()+1) / Float_t(t.GetNExpected()+1);  
+  
+  Int_t failedCutId(0);
+  if(GetChi2()/n > 5.0) failedCutId=1; 
+  if(occupancy < 0.7) failedCutId=2;
+  //if(ratio1 >   0.6) && 
+  //if(ratio0+ratio1  >   1.5) && 
+  if(GetNCross() != 0)  failedCutId=3;
+  if(TMath::Abs(GetSnp()) > 0.85) failedCutId=4;
+  if(ncls < 20) failedCutId=5;
+
+  if(failedCutId){ 
+    AliDebug(2, Form("\n"
+      "chi2/tracklet < 5.0   [%c] %5.2f\n"
+      "occupancy > 0.7       [%c] %4.2f\n"
+      "NCross == 0           [%c] %d\n"
+      "Abs(snp) < 0.85       [%c] %4.2f\n"
+      "NClusters > 20        [%c] %d"
+      ,(GetChi2()/n<5.0)?'y':'n', GetChi2()/n
+      ,(occupancy>0.7)?'y':'n', occupancy
+      ,(GetNCross()==0)?'y':'n', GetNCross()
+      ,(TMath::Abs(GetSnp())<0.85)?'y':'n', TMath::Abs(GetSnp())
+      ,(ncls>20)?'y':'n', ncls
+    ));
+    return failedCutId;
+  }
 
   if(fBackupTrack) {
     fBackupTrack->~AliTRDtrackV1();
     new(fBackupTrack) AliTRDtrackV1((AliTRDtrackV1&)(*this));
-    return;
+    return 0;
   }
   fBackupTrack = new AliTRDtrackV1((AliTRDtrackV1&)(*this));
+  return 0;
 }
 
 //_____________________________________________________________________________
@@ -725,7 +766,7 @@ void AliTRDtrackV1::SetNumberOfClusters()
        
   Int_t ncls = 0;
   for(int ip=0; ip<kNplane; ip++){
-    if(fTracklet[ip] && fTrackletIndex[ip] != 0xffff) ncls += fTracklet[ip]->GetN();
+    if(fTracklet[ip] && fTrackletIndex[ip] >= 0) ncls += fTracklet[ip]->GetN();
   }
   AliKalmanTrack::SetNumberOfClusters(ncls);   
 }
@@ -740,7 +781,7 @@ void AliTRDtrackV1::SetOwner()
 
   if(TestBit(kOwner)) return;
   for (Int_t ip = 0; ip < kNplane; ip++) {
-    if(fTrackletIndex[ip] == 0xffff) continue;
+    if(fTrackletIndex[ip]<0 || !fTracklet[ip]) continue;
     fTracklet[ip] = new AliTRDseedV1(*fTracklet[ip]);
     fTracklet[ip]->SetOwner();
   }
@@ -760,14 +801,14 @@ void AliTRDtrackV1::SetTracklet(AliTRDseedV1 *const trklt, Int_t index)
 }
 
 //_______________________________________________________________
-void AliTRDtrackV1::SetTrackLow()
+void AliTRDtrackV1::SetTrackIn()
 {
   const AliExternalTrackParam *op = dynamic_cast<const AliExternalTrackParam*>(this);
   fTrackLow = fTrackLow ? new(fTrackLow) AliExternalTrackParam(*op) : new AliExternalTrackParam(*op);
 }
 
 //_______________________________________________________________
-void AliTRDtrackV1::SetTrackHigh(const AliExternalTrackParam *op)
+void AliTRDtrackV1::SetTrackOut(const AliExternalTrackParam *op)
 {
   if(!op) op = dynamic_cast<const AliExternalTrackParam*>(this);
   fTrackHigh = fTrackHigh ? new(fTrackHigh) AliExternalTrackParam(*op) : new AliExternalTrackParam(*op);
@@ -777,19 +818,19 @@ void AliTRDtrackV1::SetTrackHigh(const AliExternalTrackParam *op)
 void AliTRDtrackV1::UnsetTracklet(Int_t plane)
 {
   if(plane<0 && plane >= kNplane) return;
-  fTrackletIndex[plane] = 0xffff;
+  fTrackletIndex[plane] = -1;
   fTracklet[plane] = NULL;
 }
 
 
 //_______________________________________________________________
-Bool_t  AliTRDtrackV1::Update(Double_t *p, Double_t *cov, Double_t chi2)
+Bool_t  AliTRDtrackV1::Update(Double_t *p, Double_t *cov, Double_t chi2, Bool_t use)
 {
   //
   // Update track 
   //
   AliDebug(2, Form("Point:\n  p=[%6.2f %6.2f]\n  V=[%6.2f %6.2f]\n    [%6.2f %6.2f]", p[0], p[1], cov[0], cov[1], cov[1], cov[2]));
-  if(!AliExternalTrackParam::Update(p, cov)) return kFALSE;
+  if(use && !AliExternalTrackParam::Update(p, cov)) return kFALSE;
 
   // Register info to track
   SetNumberOfClusters();
@@ -816,7 +857,7 @@ void AliTRDtrackV1::UpdateESDtrack(AliESDtrack *track)
   // store raw signals
   Float_t p, sp; Double_t spd;
   for (Int_t ip = 0; ip < kNplane; ip++) {
-    if(fTrackletIndex[ip] == 0xffff) continue;
+    if(fTrackletIndex[ip]<0 || !fTracklet[ip]) continue;
     if(!fTracklet[ip]->HasPID()) continue;
     const Float_t *dedx = fTracklet[ip]->GetdEdx();
     for (Int_t js = 0; js < nslices; js++, dedx++) track->SetTRDslice(*dedx, ip, js);