]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITStrackerV2.cxx
Implementing ESD functionality in the NewIO (Yu.Belikov)
[u/mrichter/AliRoot.git] / ITS / AliITStrackerV2.cxx
index b20e726525bfa9896bf159cfa4af0ffcd4c81cbc..2e5bb19b9e4795bf8e87bd080540b2dbc82e8be3 100644 (file)
@@ -27,6 +27,7 @@
 #include "AliITSgeom.h"
 #include "AliITSRecPoint.h"
 #include "AliTPCtrack.h"
+#include "AliESD.h"
 #include "AliITSclusterV2.h"
 #include "AliITStrackerV2.h"
 
@@ -97,20 +98,13 @@ void AliITStrackerV2::SetLayersNotToSkip(Int_t *l) {
   for (Int_t i=0; i<kMaxLayer; i++) fLayersNotToSkip[i]=l[i];
 }
 
-Int_t AliITStrackerV2::LoadClusters() {
+Int_t AliITStrackerV2::LoadClusters(TTree *cTree) {
   //--------------------------------------------------------------------
   //This function loads ITS clusters
   //--------------------------------------------------------------------
-  char   cname[100]; 
-  sprintf(cname,"TreeC_ITS_%d",GetEventNumber());
-  TTree *cTree=(TTree*)gDirectory->Get(cname);
-  if (!cTree) { 
-    Error("LoadClusters"," can't get cTree !\n");
-    return 1;
-  }
   TBranch *branch=cTree->GetBranch("Clusters");
   if (!branch) { 
-    Error("LoadClusters"," can't get Clusters branch !\n");
+    Error("LoadClusters"," can't get the branch !\n");
     return 1;
   }
 
@@ -132,7 +126,6 @@ Int_t AliITStrackerV2::LoadClusters() {
     }
     fLayers[i].ResetRoad(); //road defined by the cluster density
   }
-  delete cTree; //Thanks to Mariana Bondila
 
   return 0;
 }
@@ -178,38 +171,98 @@ static Int_t CorrectForDeadZoneMaterial(AliITStrackV2 *t) {
   return 0;
 }
 
-Int_t AliITStrackerV2::Clusters2Tracks(const TFile *inp, TFile *out) {
+Int_t AliITStrackerV2::Clusters2Tracks(AliESD *event) {
   //--------------------------------------------------------------------
-  //This functions reconstructs ITS tracks
+  // This functions reconstructs ITS tracks
+  // The clusters must be already loaded !
   //--------------------------------------------------------------------
-  TFile *in=(TFile*)inp;
-  TDirectory *savedir=gDirectory; 
+  TObjArray itsTracks(15000);
 
-  if (LoadClusters()!=0) return 1;
+  {/* Read ESD tracks */
+    Int_t nentr=event->GetNumberOfTracks();
+    Info("Clusters2Tracks", "Number of ESD tracks: %d\n", nentr);
+    while (nentr--) {
+      AliESDtrack *esd=event->GetTrack(nentr);
+
+      if (esd->GetStatus() != AliESDtrack::kTPCin) continue;
+
+      AliITStrackV2 *t=0;
+      try {
+        t=new AliITStrackV2(*esd);
+      } catch (const Char_t *msg) {
+        Warning("Clusters2Tracks",msg);
+        delete t;
+        continue;
+      }
+      if (TMath::Abs(t->GetD())>4) continue;
 
-  if (!in->IsOpen()) {
-    Error("Clusters2Tracks","file with TPC tracks is not open !\n");
-    return 1;
-  }
+      if (CorrectForDeadZoneMaterial(t)!=0) {
+         Warning("Clusters2Tracks",
+                 "failed to correct for the material in the dead zone !\n");
+         delete t;
+         continue;
+      }
+      itsTracks.AddLast(t);
+    }
+  } /* End Read ESD tracks */
 
-  if (!out->IsOpen()) {
-    Error("Clusters2Tracks","file for ITS tracks is not open !\n");
-    return 2;
+  itsTracks.Sort();
+  Int_t nentr=itsTracks.GetEntriesFast();
+
+  Int_t ntrk=0;
+  for (fPass=0; fPass<2; fPass++) {
+     Int_t &constraint=fConstraint[fPass]; if (constraint<0) continue;
+     for (Int_t i=0; i<nentr; i++) {
+       AliITStrackV2 *t=(AliITStrackV2*)itsTracks.UncheckedAt(i);
+       if (t==0) continue;           //this track has been already tracked
+       Int_t tpcLabel=t->GetLabel(); //save the TPC track label
+
+       ResetTrackToFollow(*t);
+       ResetBestTrack();
+
+       for (FollowProlongation(); fI<kMaxLayer; fI++) {
+          while (TakeNextProlongation()) FollowProlongation();
+       }
+
+       if (fBestTrack.GetNumberOfClusters() == 0) continue;
+
+       if (fConstraint[fPass]) {
+          ResetTrackToFollow(*t);
+          if (!RefitAt(3.7, &fTrackToFollow, &fBestTrack)) continue;
+          ResetBestTrack();
+       }
+
+       fBestTrack.SetLabel(tpcLabel);
+       fBestTrack.CookdEdx();
+       CookLabel(&fBestTrack,0.); //For comparison only
+       fBestTrack.UpdateESDtrack(AliESDtrack::kITSin);
+       UseClusters(&fBestTrack);
+       delete itsTracks.RemoveAt(i);
+       ntrk++;
+     }
   }
 
-  in->cd();
-  Char_t tname[100];
+  itsTracks.Delete();
+
+  Info("Clusters2Tracks","Number of prolonged tracks: %d\n",ntrk);
+
+  return 0;
+}
+
+Int_t AliITStrackerV2::Clusters2Tracks(TTree *tpcTree, TTree *itsTree) {
+  //--------------------------------------------------------------------
+  // This functions reconstructs ITS tracks
+  // The clusters must be already loaded !
+  //--------------------------------------------------------------------
   Int_t nentr=0; TObjArray itsTracks(15000);
 
   {/* Read TPC tracks */ 
-    sprintf(tname,"TreeT_TPC_%d",GetEventNumber());
-    TTree *tpcTree=(TTree*)in->Get(tname);
-    if (!tpcTree) {
-      Error("Clusters2Tracks","can't get a tree with TPC tracks !\n");
-      return 3;
-    }
     AliTPCtrack *itrack=new AliTPCtrack; 
+    TBranch *branch=tpcTree->GetBranch("tracks");
+    if (!branch) {
+       Error("Clusters2Tracks","Can't get the branch !");
+       return 1;
+    }
     tpcTree->SetBranchAddress("tracks",&itrack);
     nentr=(Int_t)tpcTree->GetEntries();
 
@@ -235,18 +288,16 @@ Int_t AliITStrackerV2::Clusters2Tracks(const TFile *inp, TFile *out) {
 
        itsTracks.AddLast(t);
     }
-    delete tpcTree; //Thanks to Mariana Bondila
     delete itrack;
   }
   itsTracks.Sort();
   nentr=itsTracks.GetEntriesFast();
 
-  out->cd();
 
-  sprintf(tname,"TreeT_ITS_%d",GetEventNumber());
-  TTree itsTree(tname,"Tree with ITS tracks");
   AliITStrackV2 *otrack=&fBestTrack;
-  itsTree.Branch("tracks","AliITStrackV2",&otrack,32000,0);
+  TBranch *branch=itsTree->GetBranch("tracks");
+  if (!branch) itsTree->Branch("tracks","AliITStrackV2",&otrack,32000,3);
+  else branch->SetAddress(&otrack);
 
   for (fPass=0; fPass<2; fPass++) {
      Int_t &constraint=fConstraint[fPass]; if (constraint<0) continue;
@@ -273,29 +324,83 @@ Int_t AliITStrackerV2::Clusters2Tracks(const TFile *inp, TFile *out) {
        fBestTrack.SetLabel(tpcLabel);
        fBestTrack.CookdEdx();
        CookLabel(&fBestTrack,0.); //For comparison only
-       itsTree.Fill();
+       itsTree->Fill();
        UseClusters(&fBestTrack);
        delete itsTracks.RemoveAt(i);
      }
   }
 
-  nentr=(Int_t)itsTree.GetEntries();
+  nentr=(Int_t)itsTree->GetEntries();
   Info("Clusters2Tracks","Number of prolonged tracks: %d\n",nentr);
 
-  itsTree.Write();
-
   itsTracks.Delete();
 
-  UnloadClusters();
+  return 0;
+}
+
+Int_t AliITStrackerV2::PropagateBack(AliESD *event) {
+  //--------------------------------------------------------------------
+  // This functions propagates reconstructed ITS tracks back
+  // The clusters must be loaded !
+  //--------------------------------------------------------------------
+  Int_t nentr=event->GetNumberOfTracks();
+  Info("PropagateBack", "Number of ESD tracks: %d\n", nentr);
+
+  Int_t ntrk=0;
+  for (Int_t i=0; i<nentr; i++) {
+     AliESDtrack *esd=event->GetTrack(i);
+
+     if (esd->GetStatus()!=(AliESDtrack::kTPCin|AliESDtrack::kITSin)) continue;
+
+     AliITStrackV2 *t=0;
+     try {
+        t=new AliITStrackV2(*esd);
+     } catch (const Char_t *msg) {
+        Warning("PropagateBack",msg);
+        delete t;
+        continue;
+     }
+
+     ResetTrackToFollow(*t);
+
+     // propagete to vertex [SR, GSI 17.02.2003]
+     fTrackToFollow.PropagateTo(3.,0.0028,65.19);
+     fTrackToFollow.PropagateToVertex();
+
+     // Start Time measurement [SR, GSI 17.02.2003]
+     fTrackToFollow.StartTimeIntegral();
+     fTrackToFollow.PropagateTo(3.,-0.0028,65.19);
+
+     fTrackToFollow.ResetCovariance(); fTrackToFollow.ResetClusters();
+     if (RefitAt(49.,&fTrackToFollow,t)) {
+        if (CorrectForDeadZoneMaterial(&fTrackToFollow)!=0) {
+          Warning("PropagateBack",
+                  "failed to correct for the material in the dead zone !\n");
+          delete t;
+          continue;
+        }
+        fTrackToFollow.SetLabel(t->GetLabel());
+        fTrackToFollow.CookdEdx();
+        CookLabel(&fTrackToFollow,0.); //For comparison only
+        fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSout);
+        UseClusters(&fTrackToFollow);
+        ntrk++;
+     }
+     delete t;
+  }
+
+  Info("PropagateBack","Number of back propagated ITS tracks: %d\n",ntrk);
 
-  savedir->cd();
   return 0;
 }
 
-Int_t AliITStrackerV2::PropagateBack(const TFile *inp, TFile *out) {
+Int_t AliITStrackerV2::PropagateBack(TTree *inp, TTree *out) {
   //--------------------------------------------------------------------
   //This functions propagates reconstructed ITS tracks back
   //--------------------------------------------------------------------
+  Error("PropagateBack","This method is not converted to NewIO yet\n");
+  return 1;
+  /*
   TFile *in=(TFile*)inp;
   TDirectory *savedir=gDirectory; 
 
@@ -374,23 +479,86 @@ Int_t AliITStrackerV2::PropagateBack(const TFile *inp, TFile *out) {
   savedir->cd();
 
   return 0;
+  */
 }
 
-Int_t AliITStrackerV2::RefitInward(const TFile *inp, TFile *out) {
+Int_t AliITStrackerV2::RefitInward(AliESD *event) {
   //--------------------------------------------------------------------
   // This functions refits ITS tracks using the 
   // "inward propagated" TPC tracks
+  // The clusters must be loaded !
   //--------------------------------------------------------------------
+  Int_t nentr=event->GetNumberOfTracks();
+  Info("RefitInward", "Number of ESD tracks: %d\n", nentr);
+
+  Int_t ntrk=0;
+  for (Int_t i=0; i<nentr; i++) {
+    AliESDtrack *esd=event->GetTrack(i);
+
+    ULong_t flags = AliESDtrack::kITSin | AliESDtrack::kTPCrefit;
+
+    if ( (esd->GetStatus() & flags) != flags ) continue;
+    if ( esd->GetStatus() & AliESDtrack::kITSrefit) continue;
+
+    AliITStrackV2 *t=0;
+    try {
+        t=new AliITStrackV2(*esd);
+    } catch (const Char_t *msg) {
+        Warning("RefitInward",msg);
+        delete t;
+        continue;
+    }
+
+    if (CorrectForDeadZoneMaterial(t)!=0) {
+       Warning("RefitInward",
+               "failed to correct for the material in the dead zone !\n");
+       delete t;
+       continue;
+    }
+
+    ResetTrackToFollow(*t);
+    fTrackToFollow.ResetClusters();
+
+    //Refitting...
+    if (RefitAt(3.7, &fTrackToFollow, t)) {
+       fTrackToFollow.SetLabel(t->GetLabel());
+       fTrackToFollow.CookdEdx();
+       CookLabel(&fTrackToFollow,0.); //For comparison only
+       fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSrefit);
+       UseClusters(&fTrackToFollow);
+       ntrk++;
+    }
+    delete t;
+  }
+
+  Info("RefitInward","Number of refitted tracks: %d\n",ntrk);
+
+  return 0;
+}
+
+Int_t AliITStrackerV2::RefitInward(TTree *in, TTree *out) {
+  //--------------------------------------------------------------------
+  // This functions refits ITS tracks using the 
+  // "inward propagated" TPC tracks
+  //--------------------------------------------------------------------
+  Error("RefitInward","This method is not converted to NewIO yet\n");
+  return 1;
+  /*
   TFile *in=(TFile*)inp;
   TDirectory *savedir=gDirectory; 
 
   if (LoadClusters()!=0) return 1;
 
-  if (!in->IsOpen()) {
+  if (!inSeeds->IsOpen()) {
     Error("RefitInward","file with inward TPC tracks is not open !\n");
     return 2;
   }
 
+  if (!in->IsOpen()) {
+    Error("RefitInward","file with ITS tracks is not open !\n");
+    return 2;
+  }
+
   if (!out->IsOpen()) {
     Error("RefitInward","file for inward ITS tracks is not open !\n");
     return 3;
@@ -406,9 +574,9 @@ Int_t AliITStrackerV2::RefitInward(const TFile *inp, TFile *out) {
   Char_t tname[100];
 
   TObjArray itsTracks(15000);
-  {/* Read the ITS tracks */ 
+  {// Read the ITS tracks  
     sprintf(tname,"TreeT_ITS_%d",GetEventNumber());
-    TTree *itsTree=(TTree*)out->Get(tname);
+    TTree *itsTree=(TTree*)in->Get(tname);
     if (!itsTree) {
       Error("RefitInward","can't get a tree with ITS tracks !\n");
       return 3;
@@ -435,17 +603,10 @@ Int_t AliITStrackerV2::RefitInward(const TFile *inp, TFile *out) {
     delete itrack;
   }
 
-  out->cd();
-  
-  //Create the output tree
-  sprintf(tname,"TreeT_ITSinward_%d",GetEventNumber());
-  TTree outTree(tname,"Tree with inward refitted ITS tracks");
-  AliITStrackV2 *otrack=0;
-  outTree.Branch("tracks","AliITStrackV2",&otrack,32000,0);
-
-  //Get the input tree
+  //Get the input seeds tree
+  inSeeds->cd();
   sprintf(tname,"tracksTPC_%d",GetEventNumber());
-  TTree *tpcTree=(TTree*)in->Get(tname);
+  TTree *tpcTree=(TTree*)inSeeds->Get(tname);
   if (!tpcTree) {
      Error("RefitInward","can't get a tree with TPC tracks !\n");
      return 3;
@@ -456,6 +617,13 @@ Int_t AliITStrackerV2::RefitInward(const TFile *inp, TFile *out) {
 
   Info("RefitInward","Number of TPC tracks: %d\n",ntpc);
 
+  //Create the output tree
+  out->cd();
+  sprintf(tname,"TreeT_ITSinward_%d",GetEventNumber());
+  TTree outTree(tname,"Tree with inward refitted ITS tracks");
+  AliITStrackV2 *otrack=0;
+  outTree.Branch("tracks","AliITStrackV2",&otrack,32000,0);
+
   for (i=0; i<ntpc; i++) {
     tpcTree->GetEvent(i);
     try {
@@ -497,11 +665,13 @@ Int_t AliITStrackerV2::RefitInward(const TFile *inp, TFile *out) {
 
   delete tpcTree;
   delete itrack;
+  UnloadClusters();
   itsTracks.Delete();
 
   savedir->cd();
 
   return 0;
+  */
 }
 
 AliCluster *AliITStrackerV2::GetCluster(Int_t index) const {
@@ -973,7 +1143,7 @@ Int_t AliITStrackerV2::AliITSlayer::InRoad() const {
 }
 
 Bool_t 
-AliITStrackerV2::RefitAt(Double_t x,AliITStrackV2 *t,const AliITStrackV2 *c) {
+AliITStrackerV2::RefitAt(Double_t xx,AliITStrackV2 *t,const AliITStrackV2 *c) {
   //--------------------------------------------------------------------
   // This function refits the track "t" at the position "x" using
   // the clusters from "c"
@@ -988,7 +1158,7 @@ AliITStrackerV2::RefitAt(Double_t x,AliITStrackV2 *t,const AliITStrackV2 *c) {
   }
 
   Int_t from, to, step;
-  if (x > t->GetX()) {
+  if (xx > t->GetX()) {
       from=0; to=kMaxLayer;
       step=+1;
   } else {
@@ -1050,8 +1220,12 @@ AliITStrackerV2::RefitAt(Double_t x,AliITStrackV2 *t,const AliITStrackV2 *c) {
            t->SetDetectorIndex(idet);
         }
         Double_t chi2=t->GetPredictedChi2(c);
-        if (chi2<maxchi2) { cl=c; maxchi2=chi2; }
-        else return kFALSE;
+        if (chi2<maxchi2) { 
+         cl=c; 
+         maxchi2=chi2; 
+       } else {
+         return kFALSE;
+       }
      }
      /*
      if (cl==0)
@@ -1097,7 +1271,7 @@ AliITStrackerV2::RefitAt(Double_t x,AliITStrackV2 *t,const AliITStrackV2 *c) {
 
   }
 
-  if (!t->PropagateTo(x,0.,0.)) return kFALSE;
+  if (!t->PropagateTo(xx,0.,0.)) return kFALSE;
   return kTRUE;
 }