X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITStrackerV2.cxx;h=7f30f46fd0bd6923325811d5e573a4bf3d4bfa9a;hb=f2649dd2a600ac50f4a40d9042b71d7194353e97;hp=75a7168de127dc6cb465047aa0a8f47bfdd3c6e9;hpb=f29dbb4b46823753f7dddb03041c7466814ebba4;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITStrackerV2.cxx b/ITS/AliITStrackerV2.cxx index 75a7168de12..7f30f46fd0b 100644 --- a/ITS/AliITStrackerV2.cxx +++ b/ITS/AliITStrackerV2.cxx @@ -15,30 +15,26 @@ //------------------------------------------------------------------------- // Implementation of the ITS tracker class -// +// It reads AliITSclusterV2 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 "AliITSgeom.h" #include "AliITSRecPoint.h" #include "AliTPCtrack.h" +#include "AliESD.h" #include "AliITSclusterV2.h" #include "AliITStrackerV2.h" -//#define DEBUG +ClassImp(AliITStrackerV2) -#ifdef DEBUG -Int_t LAB=113; -#endif - -AliITStrackerV2::AliITSlayer AliITStrackerV2::fLayers[kMaxLayer]; // ITS layers +AliITStrackerV2::AliITSlayer AliITStrackerV2::fgLayers[kMaxLayer]; // ITS layers AliITStrackerV2::AliITStrackerV2(const AliITSgeom *geom) : AliTracker() { //-------------------------------------------------------------------- @@ -65,18 +61,20 @@ AliITStrackerV2::AliITStrackerV2(const AliITSgeom *geom) : AliTracker() { 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); + Double_t phi=TMath::ATan2(rot[1],rot[0])+TMath::Pi(); + phi+=TMath::Pi()/2; + if (i==1) phi+=TMath::Pi(); + Double_t cp=TMath::Cos(phi), sp=TMath::Sin(phi); + Double_t r=x*cp+y*sp; + AliITSdetector &det=fgLayers[i-1].GetDetector((j-1)*ndet + k-1); new(&det) AliITSdetector(r,phi); } } @@ -87,23 +85,30 @@ AliITStrackerV2::AliITStrackerV2(const AliITSgeom *geom) : AliTracker() { fPass=0; fConstraint[0]=1; fConstraint[1]=0; + + Double_t xyz[]={kXV,kYV,kZV}, ers[]={kSigmaXV,kSigmaYV,kSigmaZV}; + SetVertex(xyz,ers); + + for (Int_t i=0; iGet(cname); - if (!cTree) { - cerr<<"AliITStrackerV2::LoadClusters can't get cTree !\n"; - exit(1); - } TBranch *branch=cTree->GetBranch("Clusters"); if (!branch) { - cerr<<"AliITStrackerV2::LoadClusters can't get Clusters branch !\n"; - exit(1); + Error("LoadClusters"," can't get the branch !\n"); + return 1; } TClonesArray dummy("AliITSclusterV2",10000), *clusters=&dummy; @@ -111,125 +116,211 @@ void AliITStrackerV2::LoadClusters() { 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); - -#ifdef DEBUG -if (c->GetLabel(2)!=LAB) -if (c->GetLabel(1)!=LAB) -if (c->GetLabel(0)!=LAB) continue; -cout<GetY()<<' '<GetZ()<Delete(); } + fgLayers[i].ResetRoad(); //road defined by the cluster density } - delete cTree; //Thanks to Mariana Bondila + + return 0; } void AliITStrackerV2::UnloadClusters() { //-------------------------------------------------------------------- //This function unloads ITS clusters //-------------------------------------------------------------------- - for (Int_t i=0; iGetX() > riw) { + if (!t->PropagateTo(riw,diw,x0iw)) return 1; + if (TMath::Abs(t->GetY())>yr) t->CorrectForMaterial(dr); + if (TMath::Abs(t->GetZ())CorrectForMaterial(dm); + if (!t->PropagateTo(rcd,dcd,x0cd)) return 1; + //Double_t x,y,z; t->GetGlobalXYZat(rr,x,y,z); + //if (TMath::Abs(y)PropagateTo(rr,dr,x0r); + if (!t->PropagateTo(rs,ds)) return 1; + } else if (t->GetX() < rs) { + if (!t->PropagateTo(rs,-ds)) return 1; + //Double_t x,y,z; t->GetGlobalXYZat(rr,x,y,z); + //if (TMath::Abs(y)PropagateTo(rr,-dr,x0r); + if (!t->PropagateTo(rcd,-dcd,x0cd)) return 1; + if (!t->PropagateTo(riw+0.001,-diw,x0iw)) return 1; + } else { + ::Error("CorrectForDeadZoneMaterial","track is already in the dead zone !"); + return 1; + } + + 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); + + {/* 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)==0) continue; + if (esd->GetStatus()&AliESDtrack::kTPCout) continue; + if (esd->GetStatus()&AliESDtrack::kITSin) 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) { + delete t; + continue; + } - LoadClusters(); + 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 (!in->IsOpen()) { - cerr<<"AliITStrackerV2::Clusters2Tracks(): "; - cerr<<"file with TPC tracks is not open !\n"; - return 1; - } + 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; iGetLabel(); //save the TPC track label - if (!out->IsOpen()) { - cerr<<"AliITStrackerV2::Clusters2Tracks(): "; - cerr<<"file for ITS tracks is not open !\n"; - return 2; + ResetTrackToFollow(*t); + ResetBestTrack(); + + for (FollowProlongation(); fIcd(); - - 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); + Warning("Clusters2Tracks(TTree *, TTree *)", + "Will be removed soon ! Use Clusters2Tracks(AliESD *) instead."); + {/* Read TPC tracks */ - sprintf(tname,"TreeT_TPC_%d",GetEventNumber()); - TTree *tpcTree=(TTree*)in->Get(tname); - if (!tpcTree) { - cerr<<"AliITStrackerV2::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(); + + 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) { - cerr<GetD())>4) continue; + if (TMath::Abs(t->GetD())>4) { + delete t; + continue; + } - t->PropagateTo(80.,0.0053,30); - if (TMath::Abs(t->GetY())>12.8) t->CorrectForMaterial(0.03); - if (TMath::Abs(t->GetZ())<0.2) t->CorrectForMaterial(0.40); - t->PropagateTo(61.,0.0053,30); - //Double_t xk=52.,x,y,z; t->GetGlobalXYZat(xk,x,y,z); - //if (TMath::Abs(y)<7.77) t->PropagateTo(xk,0.19,24.); - t->PropagateTo(50.,0.001); + if (CorrectForDeadZoneMaterial(t)!=0) { + Warning("Clusters2Tracks", + "failed to correct for the material in the dead zone !\n"); + delete t; + 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); + 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; for (Int_t i=0; iGetLabel(); //save the TPC track label -lbl=tpcLabel; -#ifdef DEBUG -lbl=tpcLabel; -if (TMath::Abs(tpcLabel)!=LAB) continue; -cout<>28; - index[nl]=idx; - } - fBestTrack.~AliITStrackV2(); new(&fBestTrack) AliITStrackV2(*t); - if (!RefitAt(3.7, &fBestTrack, index)) continue; - } - - fBestTrack.SetLabel(tpcLabel); - fBestTrack.CookdEdx(); - CookLabel(&fBestTrack,0.); //For comparison only - - fBestTrack.PropagateTo(3.,0.0028,65.19); - fBestTrack.PropagateToVertex(); - - itsTree.Fill(); - UseClusters(&fBestTrack); - delete itsTracks.RemoveAt(i); + if (fConstraint[fPass]) { + ResetTrackToFollow(*t); + if (!RefitAt(3.7, &fTrackToFollow, &fBestTrack)) continue; + ResetBestTrack(); + } + fBestTrack.SetLabel(tpcLabel); + fBestTrack.CookdEdx(); + CookLabel(&fBestTrack,0.); //For comparison only + itsTree->Fill(); + UseClusters(&fBestTrack); + delete itsTracks.RemoveAt(i); } } - itsTree.Write(); + nentr=(Int_t)itsTree->GetEntries(); + Info("Clusters2Tracks","Number of prolonged tracks: %d\n",nentr); itsTracks.Delete(); - UnloadClusters(); - - savedir->cd(); - cerr<<"Number of TPC tracks: "<GetNumberOfTracks(); + Info("PropagateBack", "Number of ESD tracks: %d\n", nentr); - if (!in->IsOpen()) { - cerr<<"AliITStrackerV2::PropagateBack(): "; - cerr<<"file with ITS tracks is not open !\n"; - return 1; - } + Int_t ntrk=0; + for (Int_t i=0; iGetTrack(i); + + 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; + } - if (!out->IsOpen()) { - cerr<<"AliITStrackerV2::PropagateBack(): "; - cerr<<"file for back propagated ITS tracks is not open !\n"; - return 2; - } + ResetTrackToFollow(*t); - in->cd(); + // propagete to vertex [SR, GSI 17.02.2003] + // Start Time measurement [SR, GSI 17.02.2003], corrected by I.Belikov + if (fTrackToFollow.PropagateTo(3.,0.0028,65.19)) { + if (fTrackToFollow.PropagateToVertex()) { + fTrackToFollow.StartTimeIntegral(); + } + fTrackToFollow.PropagateTo(3.,-0.0028,65.19); + } - Char_t tname[100]; - sprintf(tname,"TreeT_ITS_%d",GetEventNumber()); - TTree *itsTree=(TTree*)in->Get(tname); - if (!itsTree) { - cerr<<"AliITStrackerV2::PropagateBack() "; - cerr<<"can't get a tree with ITS tracks !\n"; - return 3; + 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; } - AliITStrackV2 *itrack=new AliITStrackV2; - itsTree->SetBranchAddress("tracks",&itrack); - out->cd(); + Info("PropagateBack","Number of back propagated ITS tracks: %d\n",ntrk); - 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); + return 0; +} - Int_t ntrk=0; +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 nentr=(Int_t)itsTree->GetEntries(); + Int_t ntrk=0; for (Int_t i=0; iGetTrack(i); - itsTree->GetEvent(i); - 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(); - - Int_t itsLabel=fTrackToFollow.GetLabel(); //save the ITS track label - -#ifdef DEBUG -if (TMath::Abs(itsLabel)!=LAB) continue; -cout<GetStatus()&AliESDtrack::kITSout) == 0) continue; + if (esd->GetStatus()&AliESDtrack::kITSrefit) continue; + if (esd->GetStatus()&AliESDtrack::kTPCout) + if ((esd->GetStatus()&AliESDtrack::kTPCrefit)==0) continue; + AliITStrackV2 *t=0; try { - Int_t nc=itrack->GetNumberOfClusters(); -#ifdef DEBUG -for (Int_t k=0; kGetClusterIndex(k); - AliITSclusterV2 *c=(AliITSclusterV2*)GetCluster(index); - cout<GetLabel(0)<<' '<GetLabel(1)<<' '<GetLabel(2)<GetClusterIndex(nc); l=(idx&0xf0000000)>>28; - c=(AliITSclusterV2*)GetCluster(idx); - } - for (fI=0; fIGetDetectorIndex(); - if (idet != fTrackToFollow.GetDetectorIndex()) { - const AliITSdetector &det=layer.GetDetector(idet); - r=det.GetR(); phi=det.GetPhi(); - if (!fTrackToFollow.Propagate(phi,r)) throw ""; - fTrackToFollow.SetDetectorIndex(idet); - } - Double_t chi2=fTrackToFollow.GetPredictedChi2(c); - if (chi2GetClusterIndex(nc); l=(idx&0xf0000000)>>28; - c=(AliITSclusterV2*)GetCluster(idx); - } - } + if (CorrectForDeadZoneMaterial(t)!=0) { + Warning("RefitInward", + "failed to correct for the material in the dead zone !\n"); + delete t; + continue; + } - if (fTrackToFollow.GetNumberOfClusters()>2) { - Double_t dz=3*TMath::Sqrt(fTrackToFollow.GetSigmaZ2()+kSigmaZ2[fI]); - Double_t dy=3*TMath::Sqrt(fTrackToFollow.GetSigmaY2()+kSigmaY2[fI]); - Double_t zmin=fTrackToFollow.GetZ() - dz; - Double_t zmax=fTrackToFollow.GetZ() + dz; - Double_t ymin=fTrackToFollow.GetY() + phi*r - dy; - Double_t ymax=fTrackToFollow.GetY() + phi*r + dy; - layer.SelectClusters(zmin,zmax,ymin,ymax); - - const AliITSclusterV2 *cc=0; Int_t ci; - while ((cc=layer.GetNextCluster(ci))!=0) { - idet=cc->GetDetectorIndex(); - if (idet != fTrackToFollow.GetDetectorIndex()) continue; - Double_t chi2=fTrackToFollow.GetPredictedChi2(cc); - if (chi2GetLabel()); + fTrackToFollow.CookdEdx(); + CookLabel(&fTrackToFollow,0.); //For comparison only + + if (fTrackToFollow.PropagateTo(3.,0.0028,65.19)) {//The beam pipe + Double_t a=fTrackToFollow.GetAlpha(); + Double_t cs=TMath::Cos(a),sn=TMath::Sin(a); + Double_t xv= GetX()*cs + GetY()*sn; + Double_t yv=-GetX()*sn + GetY()*cs; + + Double_t c=fTrackToFollow.GetC(), snp=fTrackToFollow.GetSnp(); + Double_t x=fTrackToFollow.GetX(), y=fTrackToFollow.GetY(); + Double_t tgfv=-(c*(x-xv)-snp)/(c*(y-yv) + TMath::Sqrt(1.-snp*snp)); + Double_t fv=TMath::ATan(tgfv); + + cs=TMath::Cos(fv); sn=TMath::Sin(fv); + x = xv*cs + yv*sn; + yv=-xv*sn + yv*cs; xv=x; + + if (fTrackToFollow.Propagate(fv+a,xv)) { + fTrackToFollow.UpdateESDtrack(AliESDtrack::kITSrefit); + UseClusters(&fTrackToFollow); + { + AliITSclusterV2 c; c.SetY(yv); c.SetZ(GetZ()); + c.SetSigmaY2(GetSigmaY()*GetSigmaY()); + c.SetSigmaZ2(GetSigmaZ()*GetSigmaZ()); + Double_t chi2=fTrackToFollow.GetPredictedChi2(&c); + if (chi2cd(); + Info("RefitInward","Number of refitted tracks: %d\n",ntrk); return 0; } @@ -493,7 +499,7 @@ AliCluster *AliITStrackerV2::GetCluster(Int_t index) const { //-------------------------------------------------------------------- Int_t l=(index & 0xf0000000) >> 28; Int_t c=(index & 0x0fffffff) >> 00; - return fLayers[l].GetCluster(c); + return fgLayers[l].GetCluster(c); } @@ -501,69 +507,71 @@ void AliITStrackerV2::FollowProlongation() { //-------------------------------------------------------------------- //This function finds a track prolongation //-------------------------------------------------------------------- - Int_t tryAgain=kLayersToSkip; - - while (fI) { + while (fI>fLastLayerToTrackTo) { Int_t i=fI-1; -#ifdef DEBUG -cout<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]); if (dz < 0.5*TMath::Abs(track.GetTgl())) dz=0.5*TMath::Abs(track.GetTgl()); if (dz > kMaxRoad) { - //cerr<<"AliITStrackerV2::FollowProlongation: too broad road in Z !\n"; - break; + //Warning("FollowProlongation","too broad road in Z !\n"); + return; } - if (TMath::Abs(fTrackToFollow.GetZ()-GetZ()) > r+dz) break; + 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() + kSigmaY2[i]); if (dy < 0.5*TMath::Abs(track.GetSnp())) dy=0.5*TMath::Abs(track.GetSnp()); if (dy > kMaxRoad) { - //cerr<<"AliITStrackerV2::FollowProlongation: too broad road in Y !\n"; - break; + //Warning("FollowProlongation","too broad road in Y !\n"); + return; } Double_t zmin=track.GetZ() - dz; @@ -574,8 +582,8 @@ cout<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.; while ((c=layer.GetNextCluster(ci))!=0) { - //if (c->GetLabel(0)!=TMath::Abs(lbl)) continue; Int_t idet=c->GetDetectorIndex(); if (fTrackToFollow.GetDetectorIndex()!=idet) { const AliITSdetector &det=layer.GetDetector(idet); ResetTrackToFollow(fTracks[fI]); if (!fTrackToFollow.Propagate(det.GetPhi(),det.GetR())) { - //cerr<<"AliITStrackerV2::TakeNextProlongation: " - //"propagation failed !\n"; + //Warning("TakeNextProlongation","propagation failed !\n"); continue; } fTrackToFollow.SetDetectorIndex(idet); if (TMath::Abs(fTrackToFollow.GetZ()-GetZ())>layer.GetR()+dz) continue; - -#ifdef DEBUG -cout<GetZ()) > dz) continue; @@ -635,22 +641,11 @@ cout<GetQ(),fTrackToFollow.GetNumberOfClusters()-1); //b.b. { - Double_t x0; + Double_t x0; Double_t d=layer.GetThickness(fTrackToFollow.GetY(),fTrackToFollow.GetZ(),x0); - fTrackToFollow.CorrectForMaterial(d,x0); + fTrackToFollow.CorrectForMaterial(d,x0); } if (fConstraint[fPass]) { Double_t d=GetEffectiveThickness(0,0); //Think of this !!!! - fTrackToFollow.Improve(d,GetY(),GetZ()); + Double_t xyz[]={GetX(),GetY(),GetZ()}; + Double_t ers[]={GetSigmaX(),GetSigmaY(),GetSigmaZ()}; + fTrackToFollow.Improve(d,xyz,ers); } -#ifdef DEBUG -cout<<"accepted lab="<GetLabel(0)<<' ' - <GetZ())1) fRoad=2*fR*TMath::Sqrt(3.14/n); +} + Int_t AliITStrackerV2::AliITSlayer::InsertCluster(AliITSclusterV2 *c) { //-------------------------------------------------------------------- //This function adds a cluster to this layer //-------------------------------------------------------------------- if (fN==kMaxClusterPerLayer) { - cerr<<"AliITStrackerV2::AliITSlayer::InsertCluster(): " - "Too many clusters !\n"; - return 1; + ::Error("InsertCluster","Too many clusters !\n"); + return 1; } if (fN==0) {fClusters[fN++]=c; return 0;} @@ -794,7 +796,7 @@ FindDetectorIndex(Double_t phi, Double_t z) const { //-------------------------------------------------------------------- //This function finds the detector crossed by the track //-------------------------------------------------------------------- - Double_t dphi=phi-fPhiOffset; + Double_t dphi=-(phi-fPhiOffset); if (dphi < 0) dphi += 2*TMath::Pi(); else if (dphi >= 2*TMath::Pi()) dphi -= 2*TMath::Pi(); Int_t np=Int_t(dphi*fNladders*0.5/TMath::Pi()+0.5); @@ -806,10 +808,6 @@ FindDetectorIndex(Double_t phi, Double_t z) const { if (nz>=fNdetectors) return -1; if (nz<0) return -1; -#ifdef DEBUG -cout<GetNumberOfClusters(); + for (k=0; kGetClusterIndex(k),nl=(idx&0xf0000000)>>28; + index[nl]=idx; + } + Int_t from, to, step; - if (x > t->GetX()) { + if (xx > t->GetX()) { from=0; to=kMaxLayer; step=+1; } else { @@ -982,21 +987,28 @@ Bool_t AliITStrackerV2::RefitAt(Double_t x, AliITStrackV2 *t, Int_t *index) { } 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 (hI==1.5 || hI==3.5) { - Double_t rs=0.5*(fLayers[i-step].GetR() + r); + if (TMath::Abs(hI-1.5)<0.01 || TMath::Abs(hI-3.5)<0.01) { + Double_t rs=0.5*(fgLayers[i-step].GetR() + r); Double_t d=0.0034, x0=38.6; - if (hI==1.5) {rs=9.; d=0.0097; x0=42;} - if (!t->PropagateTo(rs,d,x0)) { + if (TMath::Abs(hI-1.5)<0.01) {rs=9.; d=0.0097; x0=42;} + if (!t->PropagateTo(rs,-step*d,x0)) { return kFALSE; } } } + // remember old position [SR, GSI 18.02.2003] + Double_t oldX=0., oldY=0., oldZ=0.; + if (t->IsStartedTimeIntegral() && step==1) { + t->GetGlobalXYZat(t->GetX(),oldX,oldY,oldZ); + } + // + Double_t x,y,z; if (!t->GetGlobalXYZat(r,x,y,z)) { return kFALSE; @@ -1028,10 +1040,13 @@ Bool_t AliITStrackerV2::RefitAt(Double_t x, AliITStrackV2 *t, Int_t *index) { t->SetDetectorIndex(idet); } Double_t chi2=t->GetPredictedChi2(c); - if (chi2GetNumberOfClusters()>2) { @@ -1051,11 +1066,11 @@ Bool_t AliITStrackerV2::RefitAt(Double_t x, AliITStrackV2 *t, Int_t *index) { } } */ - if (cl) { if (!t->Update(cl,maxchi2,idx)) { return kFALSE; } + t->SetSampledEdx(cl->GetQ(),t->GetNumberOfClusters()-1); } { @@ -1063,12 +1078,34 @@ Bool_t AliITStrackerV2::RefitAt(Double_t x, AliITStrackV2 *t, Int_t *index) { Double_t d=layer.GetThickness(t->GetY(),t->GetZ(),x0); t->CorrectForMaterial(-step*d,x0); } + + // track time update [SR, GSI 17.02.2003] + if (t->IsStartedTimeIntegral() && step==1) { + Double_t newX, newY, newZ; + t->GetGlobalXYZat(t->GetX(),newX,newY,newZ); + Double_t dL2 = (oldX-newX)*(oldX-newX) + (oldY-newY)*(oldY-newY) + + (oldZ-newZ)*(oldZ-newZ); + t->AddTimeStep(TMath::Sqrt(dL2)); + } + // } - if (!t->PropagateTo(x,0.,0.)) return kFALSE; + if (!t->PropagateTo(xx,0.,0.)) return kFALSE; return kTRUE; } +void AliITStrackerV2::UseClusters(const AliKalmanTrack *t, Int_t from) const { + //-------------------------------------------------------------------- + // This function marks clusters assigned to the track + //-------------------------------------------------------------------- + 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(); +}