#include "AliITSgeom.h"
#include "AliITSRecPoint.h"
#include "AliTPCtrack.h"
+#include "AliESD.h"
#include "AliITSclusterV2.h"
#include "AliITStrackerV2.h"
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;
}
}
fLayers[i].ResetRoad(); //road defined by the cluster density
}
- delete cTree; //Thanks to Mariana Bondila
return 0;
}
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();
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;
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;
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;
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;
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;
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 {
delete tpcTree;
delete itrack;
+ UnloadClusters();
itsTracks.Delete();
savedir->cd();
return 0;
+ */
}
AliCluster *AliITStrackerV2::GetCluster(Int_t index) 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"
}
Int_t from, to, step;
- if (x > t->GetX()) {
+ if (xx > t->GetX()) {
from=0; to=kMaxLayer;
step=+1;
} else {
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)
}
- if (!t->PropagateTo(x,0.,0.)) return kFALSE;
+ if (!t->PropagateTo(xx,0.,0.)) return kFALSE;
return kTRUE;
}