X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITStrackerV2.cxx;h=d80e89f8f05dcfcdc408f0a37557d7918f230812;hb=f5e33cc07e8750f569fba3903ce6f387d30d46bf;hp=7bb30ec9369cc82c9d0f6f815327eb40cef8d387;hpb=83d735005d2c279d149e176175f85aed209c9af9;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITStrackerV2.cxx b/ITS/AliITStrackerV2.cxx index 7bb30ec9369..d80e89f8f05 100644 --- a/ITS/AliITStrackerV2.cxx +++ b/ITS/AliITStrackerV2.cxx @@ -12,82 +12,161 @@ * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ - +/* $Id$ */ //------------------------------------------------------------------------- // Implementation of the ITS tracker class -// +// It reads AliITSRecPoint clusters and creates AliITStrackV2 tracks +// and fills with them the ESD // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch // dEdx analysis by: Boris Batyunya, JINR, Boris.Batiounia@cern.ch //------------------------------------------------------------------------- +#include + +#include #include #include #include +#include -#include "AliITSgeom.h" +#include "AliITSgeomTGeo.h" +#include "AliAlignObj.h" #include "AliITSRecPoint.h" -#include "AliTPCtrack.h" -#include "AliESD.h" -#include "AliITSclusterV2.h" +#include "AliESDEvent.h" +#include "AliESDtrack.h" +#include "AliITSRecPoint.h" +#include "AliITSReconstructor.h" #include "AliITStrackerV2.h" ClassImp(AliITStrackerV2) -AliITStrackerV2::AliITSlayer AliITStrackerV2::fLayers[kMaxLayer]; // ITS layers +AliITStrackerV2::AliITSlayer AliITStrackerV2::fgLayers[AliITSgeomTGeo::kNLayers]; //ITS layers + +AliITStrackerV2::AliITStrackerV2(): + AliTracker(), + fI(AliITSgeomTGeo::GetNLayers()), + fBestTrack(), + fTrackToFollow(), + fPass(0), + fLastLayerToTrackTo(AliITSRecoParam::GetLastLayerToTrackTo()) +{ + //-------------------------------------------------------------------- + //This is the AliITStrackerV2 default constructor + //-------------------------------------------------------------------- + + for (Int_t i=1; iGetXVdef(), + AliITSReconstructor::GetRecoParam()->GetYVdef(), + AliITSReconstructor::GetRecoParam()->GetZVdef()}; + Double_t ers[]={AliITSReconstructor::GetRecoParam()->GetSigmaXVdef(), + AliITSReconstructor::GetRecoParam()->GetSigmaYVdef(), + AliITSReconstructor::GetRecoParam()->GetSigmaZVdef()}; + SetVertex(xyz,ers); + + for (Int_t i=0; iGetXVdef(), + AliITSReconstructor::GetRecoParam()->GetYVdef(), + AliITSReconstructor::GetRecoParam()->GetZVdef()}; + Double_t ers[]={AliITSReconstructor::GetRecoParam()->GetSigmaXVdef(), + AliITSReconstructor::GetRecoParam()->GetSigmaYVdef(), + AliITSReconstructor::GetRecoParam()->GetSigmaZVdef()}; + xyz[0]=t.GetX(); xyz[1]=t.GetY(); xyz[2]=t.GetZ(); + ers[0]=t.GetSigmaX(); ers[1]=t.GetSigmaY(); ers[2]=t.GetSigmaZ(); + SetVertex(xyz,ers); + + for (Int_t i=0; iGetNladders(i); - Int_t ndet=g->GetNdetectors(i); + for (Int_t i=1; iGetTrans(i,1,1,x,y,z); - Double_t r=TMath::Sqrt(x*x + y*y); + Double_t xyz[3], &x=xyz[0], &y=xyz[1], &z=xyz[2]; + AliITSgeomTGeo::GetOrigTranslation(i,1,1,xyz); Double_t poff=TMath::ATan2(y,x); Double_t zoff=z; + Double_t r=TMath::Sqrt(x*x + y*y); - g->GetTrans(i,1,2,x,y,z); + AliITSgeomTGeo::GetOrigTranslation(i,1,2,xyz); r += TMath::Sqrt(x*x + y*y); - g->GetTrans(i,2,1,x,y,z); + AliITSgeomTGeo::GetOrigTranslation(i,2,1,xyz); r += TMath::Sqrt(x*x + y*y); - g->GetTrans(i,2,2,x,y,z); + AliITSgeomTGeo::GetOrigTranslation(i,2,2,xyz); r += TMath::Sqrt(x*x + y*y); r*=0.25; - new (fLayers+i-1) AliITSlayer(r,poff,zoff,nlad,ndet); + new (fgLayers+i-1) AliITSlayer(r,poff,zoff,nlad,ndet); for (Int_t j=1; jGetTrans(i,j,k,x,y,zshift); - Double_t rot[9]; g->GetRotMatrix(i,j,k,rot); - - Double_t r =-x*rot[1] + y*rot[0]; if (i==1) r=-r; - Double_t phi=TMath::ATan2(rot[1],rot[0]); if (i==1) phi-=3.1415927; - phi+=0.5*TMath::Pi(); if (phi<0) phi += 2*TMath::Pi(); - AliITSdetector &det=fLayers[i-1].GetDetector((j-1)*ndet + k-1); - + TGeoHMatrix m; AliITSgeomTGeo::GetOrigMatrix(i,j,k,m); + const TGeoHMatrix *tm=AliITSgeomTGeo::GetTracking2LocalMatrix(i,j,k); + m.Multiply(tm); + Double_t txyz[3]={0.}; + xyz[0]=0.; xyz[1]=0.; xyz[2]=0.; + m.LocalToMaster(txyz,xyz); + r=TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]); + Double_t phi=TMath::ATan2(xyz[1],xyz[0]); + + if (phi<0) phi+=TMath::TwoPi(); + else if (phi>=TMath::TwoPi()) phi-=TMath::TwoPi(); + + AliITSdetector &det=fgLayers[i-1].GetDetector((j-1)*ndet + k-1); new(&det) AliITSdetector(r,phi); } } } - fI=kMaxLayer; - - fPass=0; fConstraint[0]=1; fConstraint[1]=0; - Double_t xyz[]={kXV,kYV,kZV}, ers[]={kSigmaXV,kSigmaYV,kSigmaZV}; + Double_t xyz[]={AliITSReconstructor::GetRecoParam()->GetXVdef(), + AliITSReconstructor::GetRecoParam()->GetYVdef(), + AliITSReconstructor::GetRecoParam()->GetZVdef()}; + Double_t ers[]={AliITSReconstructor::GetRecoParam()->GetSigmaXVdef(), + AliITSReconstructor::GetRecoParam()->GetSigmaYVdef(), + AliITSReconstructor::GetRecoParam()->GetSigmaZVdef()}; SetVertex(xyz,ers); - for (Int_t i=0; iIsOpen()) { - Error("LoadClusters","file with ITS clusters has not been open !\n"); - return 1; - } - - char cname[100]; - sprintf(cname,"TreeC_ITS_%d",GetEventNumber()); - TTree *cTree=(TTree*)((TFile *)cf)->Get(cname); - if (!cTree) { - Error("LoadClusters"," can't get cTree !\n"); - return 1; - } - TBranch *branch=cTree->GetBranch("Clusters"); + TBranch *branch=cTree->GetBranch("ITSRecPoints"); if (!branch) { - Error("LoadClusters"," can't get Clusters branch !\n"); + Error("LoadClusters"," can't get the branch !\n"); return 1; } - TClonesArray dummy("AliITSclusterV2",10000), *clusters=&dummy; + TClonesArray dummy("AliITSRecPoint",10000), *clusters=&dummy; branch->SetAddress(&clusters); Int_t j=0; - for (Int_t i=0; iGetEvent(j)) continue; Int_t ncl=clusters->GetEntriesFast(); + while (ncl--) { - AliITSclusterV2 *c=(AliITSclusterV2*)clusters->UncheckedAt(ncl); - fLayers[i].InsertCluster(new AliITSclusterV2(*c)); + AliITSRecPoint *c=(AliITSRecPoint*)clusters->UncheckedAt(ncl); + + if (!c->Misalign()) AliWarning("Can't misalign this cluster !"); + + Int_t idx=c->GetDetectorIndex(); + AliITSdetector &det=fgLayers[i].GetDetector(idx); + + Double_t y=r*det.GetPhi()+c->GetY(); + if (y>circ) y-=circ; else if (y<0) y+=circ; + c->SetPhiR(y); + + fgLayers[i].InsertCluster(new AliITSRecPoint(*c)); } clusters->Delete(); } - fLayers[i].ResetRoad(); //road defined by the cluster density + fgLayers[i].ResetRoad(); //road defined by the cluster density } - delete cTree; //Thanks to Mariana Bondila return 0; } @@ -151,7 +228,7 @@ void AliITStrackerV2::UnloadClusters() { //-------------------------------------------------------------------- //This function unloads ITS clusters //-------------------------------------------------------------------- - for (Int_t i=0; iGetGlobalXYZat(rr,x,y,z); //if (TMath::Abs(y)PropagateTo(rr,-dr,x0r); if (!t->PropagateTo(rcd,-dcd,x0cd)) return 1; - if (!t->PropagateTo(riw,-diw,x0iw)) return 1; + if (!t->PropagateTo(riw+0.001,-diw,x0iw)) return 1; } else { ::Error("CorrectForDeadZoneMaterial","track is already in the dead zone !"); return 1; @@ -188,7 +265,7 @@ static Int_t CorrectForDeadZoneMaterial(AliITStrackV2 *t) { return 0; } -Int_t AliITStrackerV2::Clusters2Tracks(AliESD *event) { +Int_t AliITStrackerV2::Clusters2Tracks(AliESDEvent *event) { //-------------------------------------------------------------------- // This functions reconstructs ITS tracks // The clusters must be already loaded ! @@ -201,17 +278,16 @@ Int_t AliITStrackerV2::Clusters2Tracks(AliESD *event) { while (nentr--) { AliESDtrack *esd=event->GetTrack(nentr); - if (esd->GetStatus() != AliESDtrack::kTPCin) continue; + if ((esd->GetStatus()&AliESDtrack::kTPCin)==0) continue; + if (esd->GetStatus()&AliESDtrack::kTPCout) continue; + if (esd->GetStatus()&AliESDtrack::kITSin) continue; + + AliITStrackV2 *t = new AliITStrackV2(*esd); - AliITStrackV2 *t=0; - try { - t=new AliITStrackV2(*esd); - } catch (const Char_t *msg) { - Warning("Clusters2Tracks",msg); - delete t; - continue; + if (TMath::Abs(t->GetD(GetX(),GetY()))>4) { + delete t; + continue; } - if (TMath::Abs(t->GetD())>4) continue; if (CorrectForDeadZoneMaterial(t)!=0) { Warning("Clusters2Tracks", @@ -237,7 +313,7 @@ Int_t AliITStrackerV2::Clusters2Tracks(AliESD *event) { ResetTrackToFollow(*t); ResetBestTrack(); - for (FollowProlongation(); fIIsOpen()) { - Error("Clusters2Tracks","file with TPC tracks is not open !\n"); - return 1; - } - - if (!out->IsOpen()) { - Error("Clusters2Tracks","file for ITS tracks is not open !\n"); - return 2; - } - - in->cd(); - - Char_t tname[100]; - 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; - tpcTree->SetBranchAddress("tracks",&itrack); - nentr=(Int_t)tpcTree->GetEntries(); - - Info("Clusters2Tracks","Number of TPC tracks: %d\n",nentr); - - for (Int_t i=0; iGetEvent(i); - AliITStrackV2 *t=0; - try { - t=new AliITStrackV2(*itrack); - } catch (const Char_t *msg) { - Warning("Clusters2Tracks",msg); - delete t; - continue; - } - if (TMath::Abs(t->GetD())>4) continue; - - if (CorrectForDeadZoneMaterial(t)!=0) { - Warning("Clusters2Tracks", - "failed to correct for the material in the dead zone !\n"); - continue; - } - - 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); - - for (fPass=0; fPass<2; fPass++) { - Int_t &constraint=fConstraint[fPass]; if (constraint<0) continue; - for (Int_t i=0; iGetLabel(); //save the TPC track label - - ResetTrackToFollow(*t); - ResetBestTrack(); - - for (FollowProlongation(); fIcd(); - return 0; -} - -Int_t AliITStrackerV2::PropagateBack(AliESD *event) { +Int_t AliITStrackerV2::PropagateBack(AliESDEvent *event) { //-------------------------------------------------------------------- // This functions propagates reconstructed ITS tracks back // The clusters must be loaded ! @@ -392,28 +354,26 @@ Int_t AliITStrackerV2::PropagateBack(AliESD *event) { for (Int_t i=0; iGetTrack(i); - if (esd->GetStatus()!=(AliESDtrack::kTPCin|AliESDtrack::kITSin)) continue; + if ((esd->GetStatus()&AliESDtrack::kITSin)==0) continue; + if (esd->GetStatus()&AliESDtrack::kITSout) continue; - AliITStrackV2 *t=0; - try { - t=new AliITStrackV2(*esd); - } catch (const Char_t *msg) { - Warning("PropagateBack",msg); - delete t; - continue; - } + AliITStrackV2 *t = new AliITStrackV2(*esd); 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); + // Start Time measurement [SR, GSI 17.02.2003], corrected by I.Belikov + if (fTrackToFollow.PropagateTo(3.,0.0028,65.19)) { + if (fTrackToFollow.PropagateToVertex(event->GetVertex())) { + fTrackToFollow.StartTimeIntegral(); + } + Bool_t okProp=fTrackToFollow.PropagateTo(3.,-0.0028,65.19); + if(!okProp){ + AliWarning("Propagation to beam pipe radius failed"); + } + } - fTrackToFollow.ResetCovariance(); fTrackToFollow.ResetClusters(); + fTrackToFollow.ResetCovariance(10.); fTrackToFollow.ResetClusters(); if (RefitAt(49.,&fTrackToFollow,t)) { if (CorrectForDeadZoneMaterial(&fTrackToFollow)!=0) { Warning("PropagateBack", @@ -422,7 +382,7 @@ Int_t AliITStrackerV2::PropagateBack(AliESD *event) { continue; } fTrackToFollow.SetLabel(t->GetLabel()); - fTrackToFollow.CookdEdx(); + //fTrackToFollow.CookdEdx(); CookLabel(&fTrackToFollow,0.); //For comparison only fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSout); UseClusters(&fTrackToFollow); @@ -436,91 +396,7 @@ Int_t AliITStrackerV2::PropagateBack(AliESD *event) { return 0; } -Int_t AliITStrackerV2::PropagateBack(const TFile *inp, TFile *out) { - //-------------------------------------------------------------------- - //This functions propagates reconstructed ITS tracks back - //-------------------------------------------------------------------- - TFile *in=(TFile*)inp; - TDirectory *savedir=gDirectory; - - if (LoadClusters()!=0) return 1; - - if (!in->IsOpen()) { - Error("PropagateBack","file with ITS tracks is not open !\n"); - return 1; - } - - if (!out->IsOpen()) { - Error("PropagateBack","file for back propagated ITS tracks is not open !\n"); - return 2; - } - - in->cd(); - - Char_t tname[100]; - sprintf(tname,"TreeT_ITS_%d",GetEventNumber()); - TTree *itsTree=(TTree*)in->Get(tname); - if (!itsTree) { - Error("PropagateBack","can't get a tree with ITS tracks !\n"); - return 3; - } - AliITStrackV2 *itrack=new AliITStrackV2; - itsTree->SetBranchAddress("tracks",&itrack); - - out->cd(); - - sprintf(tname,"TreeT_ITSb_%d",GetEventNumber()); - TTree backTree(tname,"Tree with back propagated ITS tracks"); - AliTPCtrack *otrack=0; - backTree.Branch("tracks","AliTPCtrack",&otrack,32000,2); - - Int_t nentr=(Int_t)itsTree->GetEntries(); - Int_t i; - for (i=0; iGetEvent(i); - Int_t itsLabel=itrack->GetLabel(); //save the ITS track label - ResetTrackToFollow(*itrack); - - // 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,itrack)) continue; - - if (CorrectForDeadZoneMaterial(&fTrackToFollow)!=0) { - Warning("PropagateBack", - "failed to correct for the material in the dead zone !\n"); - continue; - } - - fTrackToFollow.SetLabel(itsLabel); - otrack=new AliTPCtrack(fTrackToFollow,fTrackToFollow.GetAlpha()); - backTree.Fill(); delete otrack; - UseClusters(&fTrackToFollow); - } - i=(Int_t)backTree.GetEntries(); - backTree.Write(); - - Info("PropagateBack","Number of ITS tracks: %d\n",nentr); - Info("PropagateBack","Number of back propagated ITS tracks: %d\n",i); - - delete itrack; - delete itsTree; //Thanks to Mariana Bondila - - UnloadClusters(); - - savedir->cd(); - - return 0; -} - -Int_t AliITStrackerV2::RefitInward(AliESD *event) { +Int_t AliITStrackerV2::RefitInward(AliESDEvent *event) { //-------------------------------------------------------------------- // This functions refits ITS tracks using the // "inward propagated" TPC tracks @@ -533,19 +409,12 @@ Int_t AliITStrackerV2::RefitInward(AliESD *event) { for (Int_t i=0; iGetTrack(i); - ULong_t flags = AliESDtrack::kITSin | AliESDtrack::kTPCrefit; + if ((esd->GetStatus()&AliESDtrack::kITSout) == 0) continue; + if (esd->GetStatus()&AliESDtrack::kITSrefit) continue; + if (esd->GetStatus()&AliESDtrack::kTPCout) + if ((esd->GetStatus()&AliESDtrack::kTPCrefit)==0) continue; - 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; - } + AliITStrackV2 *t = new AliITStrackV2(*esd); if (CorrectForDeadZoneMaterial(t)!=0) { Warning("RefitInward", @@ -555,15 +424,22 @@ Int_t AliITStrackerV2::RefitInward(AliESD *event) { } ResetTrackToFollow(*t); + fTrackToFollow.ResetClusters(); //Refitting... - if (RefitAt(3.7, &fTrackToFollow, t)) { + if (RefitAt(3.7, &fTrackToFollow, t, kTRUE)) { fTrackToFollow.SetLabel(t->GetLabel()); fTrackToFollow.CookdEdx(); CookLabel(&fTrackToFollow,0.); //For comparison only - fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSrefit); - UseClusters(&fTrackToFollow); - ntrk++; + + if (fTrackToFollow.PropagateTo(3.,0.0028,65.19)) {//The beam pipe + fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSrefit); + AliESDtrack *esdTrack =fTrackToFollow.GetESDtrack(); + Double_t r[3]={0.,0.,0.}; + Double_t maxD=3.; + esdTrack->RelateToVertex(event->GetVertex(),GetBz(r),maxD); + ntrk++; + } } delete t; } @@ -573,142 +449,13 @@ Int_t AliITStrackerV2::RefitInward(AliESD *event) { return 0; } -Int_t AliITStrackerV2::RefitInward(const TFile *inp, TFile *out) { - //-------------------------------------------------------------------- - // This functions refits ITS tracks using the - // "inward propagated" TPC tracks - //-------------------------------------------------------------------- - TFile *in=(TFile*)inp; - TDirectory *savedir=gDirectory; - - if (LoadClusters()!=0) return 1; - - if (!in->IsOpen()) { - Error("RefitInward","file with inward TPC tracks is not open !\n"); - return 2; - } - - if (!out->IsOpen()) { - Error("RefitInward","file for inward ITS tracks is not open !\n"); - return 3; - } - - Int_t i; - - //LUT used for the track matching (S.Radomski's idea) - const Int_t nLab = 400000; // limit on the number of track labels - Int_t lut[nLab]; - for(i=0; iGet(tname); - if (!itsTree) { - Error("RefitInward","can't get a tree with ITS tracks !\n"); - return 3; - } - AliITStrackV2 *itrack=new AliITStrackV2; - itsTree->SetBranchAddress("tracks",&itrack); - Int_t nits=(Int_t)itsTree->GetEntries(); - - Info("RefitInward","Number of ITS tracks: %d\n",nits); - - for (Int_t i=0; iGetEvent(i); - Int_t lab=TMath::Abs(itrack->GetLabel()); - if (lab < nLab) { - if (lut[lab]>=0) Warning("RefitInward","double track %d\n",lab); - lut[lab]=i; - } else { - Warning("RefitInward","Too big ITS track label: %d\n!",lab); - continue; - } - itsTracks.AddLast(new AliITStrackV2(*itrack)); - } - delete itsTree; - 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 - sprintf(tname,"tracksTPC_%d",GetEventNumber()); - TTree *tpcTree=(TTree*)in->Get(tname); - if (!tpcTree) { - Error("RefitInward","can't get a tree with TPC tracks !\n"); - return 3; - } - AliTPCtrack *itrack=new AliTPCtrack; - tpcTree->SetBranchAddress("tracks",&itrack); - Int_t ntpc=(Int_t)tpcTree->GetEntries(); - - Info("RefitInward","Number of TPC tracks: %d\n",ntpc); - - for (i=0; iGetEvent(i); - try { - otrack=new AliITStrackV2(*itrack); - } catch (const Char_t *msg) { - Warning("RefitInward",msg); - delete otrack; - continue; - } - //check if this track was reconstructed in the ITS - Int_t lab=TMath::Abs(otrack->GetLabel()); - if (lab >= nLab) { - Warning("RefitInward","Too big TPC track label: %d\n!",lab); - continue; - } - Int_t idx=lut[lab]; - if (idx<0) continue; //no prolongation in the ITS for this track - - if (CorrectForDeadZoneMaterial(otrack)!=0) { - Warning("RefitInward", - "failed to correct for the material in the dead zone !\n"); - continue; - } - - //Refitting... - { - AliITStrackV2 *ctrack=(AliITStrackV2*)itsTracks.UncheckedAt(idx); - if (!RefitAt(3.7, otrack, ctrack)) continue; - } - otrack->SetLabel(itrack->GetLabel()); //For comparison only - otrack->CookdEdx(); - CookLabel(otrack,0.); //For comparison only - outTree.Fill(); - delete otrack; - } - i=(Int_t)outTree.GetEntries(); - Info("RefitInward","Number of inward refitted ITS tracks: %d\n",i); - outTree.Write(); - - delete tpcTree; - delete itrack; - UnloadClusters(); - itsTracks.Delete(); - - savedir->cd(); - - return 0; -} - AliCluster *AliITStrackerV2::GetCluster(Int_t index) const { //-------------------------------------------------------------------- // Return pointer to a given cluster //-------------------------------------------------------------------- Int_t l=(index & 0xf0000000) >> 28; Int_t c=(index & 0x0fffffff) >> 00; - return fLayers[l].GetCluster(c); + return fgLayers[l].GetCluster(c); } @@ -719,13 +466,13 @@ void AliITStrackerV2::FollowProlongation() { while (fI>fLastLayerToTrackTo) { Int_t i=fI-1; - AliITSlayer &layer=fLayers[i]; + AliITSlayer &layer=fgLayers[i]; AliITStrackV2 &track=fTracks[i]; Double_t r=layer.GetR(); if (i==3 || i==1) { - Double_t rs=0.5*(fLayers[i+1].GetR() + r); + Double_t rs=0.5*(fgLayers[i+1].GetR() + r); Double_t d=0.0034, x0=38.6; if (i==1) {rs=9.; d=0.0097; x0=42;} if (!fTrackToFollow.PropagateTo(rs,d,x0)) { @@ -735,12 +482,12 @@ void AliITStrackerV2::FollowProlongation() { } //find intersection - Double_t x,y,z; - if (!fTrackToFollow.GetGlobalXYZat(r,x,y,z)) { + Double_t phi,z; + if (!fTrackToFollow.GetPhiZat(r,phi,z)) { //Warning("FollowProlongation","failed to estimate track !\n"); return; } - Double_t phi=TMath::ATan2(y,x); + Int_t idet=layer.FindDetectorIndex(phi,z); if (idet<0) { //Warning("FollowProlongation","failed to find a detector !\n"); @@ -758,38 +505,39 @@ void AliITStrackerV2::FollowProlongation() { //Select possible prolongations and store the current track estimation track.~AliITStrackV2(); new(&track) AliITStrackV2(fTrackToFollow); - Double_t dz=7*TMath::Sqrt(track.GetSigmaZ2() + kSigmaZ2[i]); - Double_t dy=7*TMath::Sqrt(track.GetSigmaY2() + kSigmaY2[i]); + Double_t dz=7*TMath::Sqrt(track.GetSigmaZ2() + AliITSReconstructor::GetRecoParam()->GetSigmaZ2(i)); + Double_t dy=7*TMath::Sqrt(track.GetSigmaY2() + AliITSReconstructor::GetRecoParam()->GetSigmaY2(i)); Double_t road=layer.GetRoad(); if (dz*dy>road*road) { Double_t dd=TMath::Sqrt(dz*dy), scz=dz/dd, scy=dy/dd; dz=road*scz; dy=road*scy; } - //Double_t dz=4*TMath::Sqrt(track.GetSigmaZ2() + kSigmaZ2[i]); + //Double_t dz=4*TMath::Sqrt(track.GetSigmaZ2() + AliITSReconstructor::GetRecoParam()->GetSigmaZ2(i)); if (dz < 0.5*TMath::Abs(track.GetTgl())) dz=0.5*TMath::Abs(track.GetTgl()); - if (dz > kMaxRoad) { + if (dz > AliITSReconstructor::GetRecoParam()->GetMaxRoad()) { //Warning("FollowProlongation","too broad road in Z !\n"); return; } if (TMath::Abs(fTrackToFollow.GetZ()-GetZ()) > r+dz) return; - //Double_t dy=4*TMath::Sqrt(track.GetSigmaY2() + kSigmaY2[i]); + //Double_t dy=4*TMath::Sqrt(track.GetSigmaY2() + AliITSReconstructor::GetRecoParam()->GetSigmaY2(i)); if (dy < 0.5*TMath::Abs(track.GetSnp())) dy=0.5*TMath::Abs(track.GetSnp()); - if (dy > kMaxRoad) { + if (dy > AliITSReconstructor::GetRecoParam()->GetMaxRoad()) { //Warning("FollowProlongation","too broad road in Y !\n"); return; } + fI--; + Double_t zmin=track.GetZ() - dz; Double_t zmax=track.GetZ() + dz; Double_t ymin=track.GetY() + r*phi - dy; Double_t ymax=track.GetY() + r*phi + dy; - layer.SelectClusters(zmin,zmax,ymin,ymax); - fI--; + if (layer.SelectClusters(zmin,zmax,ymin,ymax)==0) + if (fLayersNotToSkip[fI]) return; - //take another prolongation if (!TakeNextProlongation()) if (fLayersNotToSkip[fI]) return; @@ -801,7 +549,7 @@ void AliITStrackerV2::FollowProlongation() { if (ncl) if (ncl >= nclb) { Double_t chi2=fTrackToFollow.GetChi2(); - if (chi2/ncl < kChi2PerCluster) { + if (chi2/ncl < AliITSReconstructor::GetRecoParam()->GetChi2PerCluster()) { if (ncl > nclb || chi2 < fBestTrack.GetChi2()) { ResetBestTrack(); } @@ -816,19 +564,20 @@ Int_t AliITStrackerV2::TakeNextProlongation() { // // dEdx analysis by: Boris Batyunya, JINR, Boris.Batiounia@cern.ch //-------------------------------------------------------------------- - AliITSlayer &layer=fLayers[fI]; + AliITSlayer &layer=fgLayers[fI]; ResetTrackToFollow(fTracks[fI]); - Double_t dz=7*TMath::Sqrt(fTrackToFollow.GetSigmaZ2() + kSigmaZ2[fI]); - Double_t dy=7*TMath::Sqrt(fTrackToFollow.GetSigmaY2() + kSigmaY2[fI]); + Double_t dz=7*TMath::Sqrt(fTrackToFollow.GetSigmaZ2() + AliITSReconstructor::GetRecoParam()->GetSigmaZ2(fI)); + Double_t dy=7*TMath::Sqrt(fTrackToFollow.GetSigmaY2() + AliITSReconstructor::GetRecoParam()->GetSigmaY2(fI)); Double_t road=layer.GetRoad(); if (dz*dy>road*road) { Double_t dd=TMath::Sqrt(dz*dy), scz=dz/dd, scy=dy/dd; dz=road*scz; dy=road*scy; } - const AliITSclusterV2 *c=0; Int_t ci=-1; - Double_t chi2=12345.; + const AliITSRecPoint *c=0; Int_t ci=-1; + const AliITSRecPoint *cc=0; Int_t cci=-1; + Double_t chi2=AliITSReconstructor::GetRecoParam()->GetMaxChi2(); while ((c=layer.GetNextCluster(ci))!=0) { Int_t idet=c->GetDetectorIndex(); @@ -846,22 +595,29 @@ Int_t AliITStrackerV2::TakeNextProlongation() { if (TMath::Abs(fTrackToFollow.GetZ() - c->GetZ()) > dz) continue; if (TMath::Abs(fTrackToFollow.GetY() - c->GetY()) > dy) continue; - chi2=fTrackToFollow.GetPredictedChi2(c); if (chi2 chi2) continue; + chi2=ch2; + cc=c; cci=ci; + break; } - if (chi2>=kMaxChi2) return 0; - if (!c) return 0; + if (!cc) return 0; - if (!fTrackToFollow.Update(c,chi2,(fI<<28)+ci)) { + {// Take into account the mis-alignment + Double_t x = fTrackToFollow.GetX() + cc->GetX(); + if (!fTrackToFollow.PropagateTo(x,0.,0.)) return 0; + } + if (!fTrackToFollow.Update(cc,chi2,(fI<<28)+cci)) { //Warning("TakeNextProlongation","filtering failed !\n"); return 0; } if (fTrackToFollow.GetNumberOfClusters()>1) - if (TMath::Abs(fTrackToFollow.GetD())>4) return 0; + if (TMath::Abs(fTrackToFollow.GetD(GetX(),GetY()))>4) return 0; fTrackToFollow. - SetSampledEdx(c->GetQ(),fTrackToFollow.GetNumberOfClusters()-1); //b.b. + SetSampledEdx(cc->GetQ(),fI-2); //b.b. { Double_t x0; @@ -880,27 +636,48 @@ Int_t AliITStrackerV2::TakeNextProlongation() { } -AliITStrackerV2::AliITSlayer::AliITSlayer() { +AliITStrackerV2::AliITSlayer::AliITSlayer(): + fR(0.), + fPhiOffset(0.), + fNladders(0), + fZOffset(0.), + fNdetectors(0), + fDetectors(0), + fNsel(0), + fRoad(2*fR*TMath::Sqrt(3.14/1.)) //assuming that there's only one cluster +{ //-------------------------------------------------------------------- //default AliITSlayer constructor //-------------------------------------------------------------------- - fN=0; - fDetectors=0; + + for (Int_t i=0; iGetZ())GetZ())1) fRoad=2*fR*TMath::Sqrt(3.14/n); } -Int_t AliITStrackerV2::AliITSlayer::InsertCluster(AliITSclusterV2 *c) { +Int_t AliITStrackerV2::AliITSlayer::InsertCluster(AliITSRecPoint *c) { //-------------------------------------------------------------------- - //This function adds a cluster to this layer + // This function inserts a cluster to this layer in increasing + // order of the cluster's fZ //-------------------------------------------------------------------- - if (fN==kMaxClusterPerLayer) { - ::Error("InsertCluster","Too many clusters !\n"); - return 1; + Float_t circ=TMath::TwoPi()*fR; + Int_t sec=Int_t(kNsector*c->GetPhiR()/circ); + if (sec>=kNsector) { + ::Error("InsertCluster","Wrong sector !\n"); + return 1; } - - if (fN==0) {fClusters[fN++]=c; return 0;} - Int_t i=FindClusterIndex(c->GetZ()); - memmove(fClusters+i+1 ,fClusters+i,(fN-i)*sizeof(AliITSclusterV2*)); - fClusters[i]=c; fN++; - + Int_t &n=fN[sec]; + if (n>=kMaxClusterPerSector) { + ::Error("InsertCluster","Too many clusters !\n"); + return 1; + } + if (n==0) fClusters[sec*kMaxClusterPerSector]=c; + else { + Int_t i=FindClusterIndex(c->GetZ(),sec); + Int_t k=n-i+sec*kMaxClusterPerSector; + memmove(fClusters+i+1 ,fClusters+i,k*sizeof(AliITSRecPoint*)); + fClusters[i]=c; + } + n++; return 0; } -Int_t AliITStrackerV2::AliITSlayer::FindClusterIndex(Double_t z) const { +Int_t +AliITStrackerV2::AliITSlayer::FindClusterIndex(Float_t z,Int_t s) const { //-------------------------------------------------------------------- - // This function returns the index of the nearest cluster + // For the sector "s", this function returns the index of the first + // with its fZ >= "z". //-------------------------------------------------------------------- - if (fN==0) return 0; - if (z <= fClusters[0]->GetZ()) return 0; - if (z > fClusters[fN-1]->GetZ()) return fN; - Int_t b=0, e=fN-1, m=(b+e)/2; + Int_t nc=fN[s]; + if (nc==0) return kMaxClusterPerSector*s; + + Int_t b=kMaxClusterPerSector*s; + if (z <= fClusters[b]->GetZ()) return b; + + Int_t e=b+nc-1; + if (z > fClusters[e]->GetZ()) return e+1; + + Int_t m=(b+e)/2; for (; b fClusters[m]->GetZ()) b=m+1; else e=m; @@ -963,48 +764,80 @@ Int_t AliITStrackerV2::AliITSlayer::FindClusterIndex(Double_t z) const { return m; } -void AliITStrackerV2::AliITSlayer:: -SelectClusters(Double_t zmin,Double_t zmax,Double_t ymin, Double_t ymax) { +Int_t AliITStrackerV2::AliITSlayer:: +SelectClusters(Float_t zmin,Float_t zmax,Float_t ymin, Float_t ymax) { //-------------------------------------------------------------------- - // This function sets the "window" + // This function selects clusters within the "window" //-------------------------------------------------------------------- - fI=FindClusterIndex(zmin); fZmax=zmax; - Double_t circle=2*TMath::Pi()*fR; - if (ymax>circle) { ymax-=circle; ymin-=circle; } - fYmin=ymin; fYmax=ymax; + Float_t circ=fR*TMath::TwoPi(); + + if (ymin>circ) ymin-=circ; else if (ymin<0) ymin+=circ; + if (ymax>circ) ymax-=circ; else if (ymax<0) ymax+=circ; + + Int_t i1=Int_t(kNsector*ymin/circ); if (i1==kNsector) i1--; + if (fN[i1]!=0) { + Float_t ym = (ymaxIsUsed()) continue; + if (c->GetZ()>zmax) break; + if (c->GetPhiR()<=ymin) continue; + if (c->GetPhiR()>ym) continue; + fIndex[fNsel++]=i; + } + } + + Int_t i2=Int_t(kNsector*ymax/circ); if (i2==kNsector) i2--; + if (i2==i1) return fNsel; + + if (fN[i2]!=0) { + Float_t ym = (ymin>ymax) ? ymin-circ : ymin; + Int_t i=FindClusterIndex(zmin,i2), imax=i2*kMaxClusterPerSector+fN[i2]; + for (; iIsUsed()) continue; + if (c->GetZ()>zmax) break; + if (c->GetPhiR()<=ym) continue; + if (c->GetPhiR()>ymax) continue; + fIndex[fNsel++]=i; + } + } + + return fNsel; } -const AliITSclusterV2 *AliITStrackerV2::AliITSlayer::GetNextCluster(Int_t &ci){ +const AliITSRecPoint *AliITStrackerV2::AliITSlayer::GetNextCluster(Int_t &ci){ //-------------------------------------------------------------------- // This function returns clusters within the "window" //-------------------------------------------------------------------- - const AliITSclusterV2 *cluster=0; - for (Int_t i=fI; iGetZ() > fZmax) break; - if (c->IsUsed()) continue; - const AliITSdetector &det=GetDetector(c->GetDetectorIndex()); - Double_t y=fR*det.GetPhi() + c->GetY(); - - if (y>2.*fR*TMath::Pi()) y -= 2*fR*TMath::Pi(); - if (y>1.*fR*TMath::Pi() && fYmaxfYmax) continue; - cluster=c; ci=i; - fI=i+1; - break; + AliITSRecPoint *c=0; + ci=-1; + if (fNsel) { + fNsel--; + ci=fIndex[fNsel]; + c=fClusters[ci]; } + return c; +} - return cluster; +Int_t AliITStrackerV2::AliITSlayer::GetNumberOfClusters() const { + Int_t n=0; + for (Int_t s=0; s= 2*TMath::Pi()) dphi -= 2*TMath::Pi(); Int_t np=Int_t(dphi*fNladders*0.5/TMath::Pi()+0.5); @@ -1129,10 +962,10 @@ Double_t AliITStrackerV2::GetEffectiveThickness(Double_t y,Double_t z) const Double_t d=0.0028*3*3; //beam pipe Double_t x0=0; - Double_t xn=fLayers[fI].GetR(); + Double_t xn=fgLayers[fI].GetR(); for (Int_t i=0; i1) { @@ -1141,44 +974,24 @@ Double_t AliITStrackerV2::GetEffectiveThickness(Double_t y,Double_t z) const } if (fI>3) { - Double_t xi=0.5*(fLayers[3].GetR()+fLayers[4].GetR()); + Double_t xi=0.5*(fgLayers[3].GetR()+fgLayers[4].GetR()); d+=0.0034*xi*xi; } return d/(xn*xn); } -Int_t AliITStrackerV2::AliITSlayer::InRoad() const { - //-------------------------------------------------------------------- - // This function returns number of clusters within the "window" - //-------------------------------------------------------------------- - Int_t ncl=0; - for (Int_t i=fI; iGetZ() > fZmax) break; - if (c->IsUsed()) continue; - const AliITSdetector &det=GetDetector(c->GetDetectorIndex()); - Double_t y=fR*det.GetPhi() + c->GetY(); - - if (y>2.*fR*TMath::Pi()) y -= 2*fR*TMath::Pi(); - if (y>1.*fR*TMath::Pi() && fYmaxfYmax) continue; - ncl++; - } - return ncl; -} - -Bool_t -AliITStrackerV2::RefitAt(Double_t x,AliITStrackV2 *t,const AliITStrackV2 *c) { +Bool_t AliITStrackerV2::RefitAt(Double_t xx,AliITStrackV2 *t, + const AliITStrackV2 *c, Bool_t extra) { //-------------------------------------------------------------------- // This function refits the track "t" at the position "x" using // the clusters from "c" + // If "extra"==kTRUE, + // the clusters from overlapped modules get attached to "t" //-------------------------------------------------------------------- - Int_t index[kMaxLayer]; + Int_t index[AliITSgeomTGeo::kNLayers]; Int_t k; - for (k=0; kGetNumberOfClusters(); for (k=0; kGetClusterIndex(k),nl=(idx&0xf0000000)>>28; @@ -1186,27 +999,35 @@ AliITStrackerV2::RefitAt(Double_t x,AliITStrackV2 *t,const AliITStrackV2 *c) { } Int_t from, to, step; - if (x > t->GetX()) { - from=0; to=kMaxLayer; + if (xx > t->GetX()) { + from=0; to=AliITSgeomTGeo::GetNLayers(); step=+1; } else { - from=kMaxLayer-1; to=-1; + from=AliITSgeomTGeo::GetNLayers()-1; to=-1; step=-1; } for (Int_t i=from; i != to; i += step) { - AliITSlayer &layer=fLayers[i]; + AliITSlayer &layer=fgLayers[i]; Double_t r=layer.GetR(); { Double_t hI=i-0.5*step; - if (TMath::Abs(hI-1.5)<0.01 || TMath::Abs(hI-3.5)<0.01) { - Double_t rs=0.5*(fLayers[i-step].GetR() + r); - Double_t d=0.0034, x0=38.6; - if (TMath::Abs(hI-1.5)<0.01) {rs=9.; d=0.0097; x0=42;} - if (!t->PropagateTo(rs,-step*d,x0)) { - return kFALSE; - } + if (TMath::Abs(hI-1.5)<0.01 || TMath::Abs(hI-3.5)<0.01) { + Int_t iLay = i-step; + Double_t rs = 0.; + if(iLay<0 || iLay>= AliITSgeomTGeo::kNLayers){ + AliError(Form("Invalid layer %d ",iLay)); + return kFALSE; + } + else{ + rs=0.5*(fgLayers[i-step].GetR() + r); + } + Double_t d=0.0034, x0=38.6; + if (TMath::Abs(hI-1.5)<0.01) {rs=9.; d=0.0097; x0=42;} + if (!t->PropagateTo(rs,-step*d,x0)) { + return kFALSE; + } } } @@ -1217,11 +1038,11 @@ AliITStrackerV2::RefitAt(Double_t x,AliITStrackV2 *t,const AliITStrackV2 *c) { } // - Double_t x,y,z; - if (!t->GetGlobalXYZat(r,x,y,z)) { + Double_t phi,z; + if (!t->GetPhiZat(r,phi,z)) { return kFALSE; } - Double_t phi=TMath::ATan2(y,x); + Int_t idet=layer.FindDetectorIndex(phi,z); if (idet<0) { return kFALSE; @@ -1233,48 +1054,37 @@ AliITStrackerV2::RefitAt(Double_t x,AliITStrackV2 *t,const AliITStrackV2 *c) { } t->SetDetectorIndex(idet); - const AliITSclusterV2 *cl=0; - Double_t maxchi2=kMaxChi2; + const AliITSRecPoint *cl=0; + Double_t maxchi2=AliITSReconstructor::GetRecoParam()->GetMaxChi2(); Int_t idx=index[i]; - if (idx>0) { - const AliITSclusterV2 *c=(AliITSclusterV2 *)GetCluster(idx); - if (idet != c->GetDetectorIndex()) { - idet=c->GetDetectorIndex(); - const AliITSdetector &det=layer.GetDetector(idet); - if (!t->Propagate(det.GetPhi(),det.GetR())) { + if (idx>=0) { + const AliITSRecPoint *ccc=(AliITSRecPoint *)GetCluster(idx); + if (idet != ccc->GetDetectorIndex()) { + idet=ccc->GetDetectorIndex(); + const AliITSdetector &det2=layer.GetDetector(idet); + if (!t->Propagate(det2.GetPhi(),det2.GetR())) { return kFALSE; } t->SetDetectorIndex(idet); } - Double_t chi2=t->GetPredictedChi2(c); - if (chi2GetNumberOfClusters()>2) { - Double_t dz=4*TMath::Sqrt(t->GetSigmaZ2()+kSigmaZ2[i]); - Double_t dy=4*TMath::Sqrt(t->GetSigmaY2()+kSigmaY2[i]); - Double_t zmin=t->GetZ() - dz; - Double_t zmax=t->GetZ() + dz; - Double_t ymin=t->GetY() + phi*r - dy; - Double_t ymax=t->GetY() + phi*r + dy; - layer.SelectClusters(zmin,zmax,ymin,ymax); - - const AliITSclusterV2 *c=0; Int_t ci=-1; - while ((c=layer.GetNextCluster(ci))!=0) { - if (idet != c->GetDetectorIndex()) continue; - Double_t chi2=t->GetPredictedChi2(c); - if (chi2GetPredictedChi2(ccc); + if (chi2GetX()+cl->GetX(); + if (!t->PropagateTo(x,0.,0.)) return kFALSE; if (!t->Update(cl,maxchi2,idx)) { return kFALSE; } - t->SetSampledEdx(cl->GetQ(),t->GetNumberOfClusters()-1); + t->SetSampledEdx(cl->GetQ(),i-2); } { @@ -1283,6 +1093,37 @@ AliITStrackerV2::RefitAt(Double_t x,AliITStrackV2 *t,const AliITStrackV2 *c) { t->CorrectForMaterial(-step*d,x0); } + if (extra) { //search for extra clusters + AliITStrackV2 tmp(*t); + Double_t dz=4*TMath::Sqrt(tmp.GetSigmaZ2()+AliITSReconstructor::GetRecoParam()->GetSigmaZ2(i)); + if (dz < 0.5*TMath::Abs(tmp.GetTgl())) dz=0.5*TMath::Abs(tmp.GetTgl()); + Double_t dy=4*TMath::Sqrt(t->GetSigmaY2()+AliITSReconstructor::GetRecoParam()->GetSigmaY2(i)); + if (dy < 0.5*TMath::Abs(tmp.GetSnp())) dy=0.5*TMath::Abs(tmp.GetSnp()); + Double_t zmin=t->GetZ() - dz; + Double_t zmax=t->GetZ() + dz; + Double_t ymin=t->GetY() + phi*r - dy; + Double_t ymax=t->GetY() + phi*r + dy; + layer.SelectClusters(zmin,zmax,ymin,ymax); + + const AliITSRecPoint *cx=0; Int_t ci=-1,cci=-1; + maxchi2=1000.*AliITSReconstructor::GetRecoParam()->GetMaxChi2(); + Double_t tolerance=0.1; + while ((cx=layer.GetNextCluster(ci))!=0) { + if (idet == cx->GetDetectorIndex()) continue; + + const AliITSdetector &detx=layer.GetDetector(cx->GetDetectorIndex()); + + if (!tmp.Propagate(detx.GetPhi(),detx.GetR())) continue; + + if (TMath::Abs(tmp.GetZ() - cx->GetZ()) > tolerance) continue; + if (TMath::Abs(tmp.GetY() - cx->GetY()) > tolerance) continue; + + Double_t chi2=tmp.GetPredictedChi2(cx); + if (chi2=0) t->SetExtraCluster(i,(i<<28)+cci); + } + // track time update [SR, GSI 17.02.2003] if (t->IsStartedTimeIntegral() && step==1) { Double_t newX, newY, newZ; @@ -1295,7 +1136,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; } @@ -1305,11 +1146,17 @@ void AliITStrackerV2::UseClusters(const AliKalmanTrack *t, Int_t from) const { //-------------------------------------------------------------------- AliTracker::UseClusters(t,from); - AliITSclusterV2 *c=(AliITSclusterV2 *)GetCluster(t->GetClusterIndex(0)); - //if (c->GetQ()>2) c->Use(); - if (c->GetSigmaZ2()>0.1) c->Use(); - c=(AliITSclusterV2 *)GetCluster(t->GetClusterIndex(1)); - //if (c->GetQ()>2) c->Use(); - if (c->GetSigmaZ2()>0.1) c->Use(); + Int_t clusterIndex = t->GetClusterIndex(0); + AliITSRecPoint *c= 0x0; + + if (clusterIndex>-1) + c = (AliITSRecPoint *)GetCluster(clusterIndex); + if (c && c->GetSigmaZ2()>0.1) c->UnUse(); + + c = 0x0; + clusterIndex = t->GetClusterIndex(1); + if (clusterIndex>-1) + c=(AliITSRecPoint *)GetCluster(clusterIndex); + if (c && c->GetSigmaZ2()>0.1) c->UnUse(); }