//-------------------------------------------------------------------------
// Implementation of the ITS tracker class
-// It reads AliITSclusterV2 clusters and creates AliITStrackV2 tracks
+// 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 <new>
+#include <TError.h>
#include <TFile.h>
#include <TTree.h>
#include <TRandom.h>
+#include <TGeoMatrix.h>
-#include "AliITSgeom.h"
+#include "AliITSgeomTGeo.h"
+#include "AliAlignObj.h"
#include "AliITSRecPoint.h"
#include "AliESD.h"
-#include "AliITSclusterV2.h"
+#include "AliITSRecPoint.h"
#include "AliITStrackerV2.h"
ClassImp(AliITStrackerV2)
-AliITStrackerV2::AliITSlayer AliITStrackerV2::fgLayers[kMaxLayer]; // ITS layers
+AliITStrackerV2::AliITSlayer AliITStrackerV2::fgLayers[kMaxLayer]; //ITS layers
+
+AliITStrackerV2::AliITStrackerV2():
+ AliTracker(),
+ fI(kMaxLayer),
+ fBestTrack(),
+ fTrackToFollow(),
+ fPass(0),
+ fLastLayerToTrackTo(kLastLayerToTrackTo)
+{
+ //--------------------------------------------------------------------
+ //This is the AliITStrackerV2 default constructor
+ //--------------------------------------------------------------------
-AliITStrackerV2::AliITStrackerV2(const AliITSgeom *geom) : AliTracker() {
+ for (Int_t i=1; i<kMaxLayer+1; i++) new(fgLayers+i-1) AliITSlayer();
+
+ fConstraint[0]=1; fConstraint[1]=0;
+
+ Double_t xyz[]={kXV,kYV,kZV}, ers[]={kSigmaXV,kSigmaYV,kSigmaZV};
+ SetVertex(xyz,ers);
+
+ for (Int_t i=0; i<kMaxLayer; i++) fLayersNotToSkip[i]=kLayersNotToSkip[i];
+
+}
+
+AliITStrackerV2::AliITStrackerV2(const AliITStrackerV2 &t):
+ AliTracker(t),
+ fI(t.fI),
+ fBestTrack(t.fBestTrack),
+ fTrackToFollow(t.fTrackToFollow),
+ fPass(t.fPass),
+ fLastLayerToTrackTo(t.fLastLayerToTrackTo)
+{
+ //--------------------------------------------------------------------
+ //This is the AliITStrackerV2 copy constructor
+ //--------------------------------------------------------------------
+
+ //for (Int_t i=1; i<kMaxLayer+1; i++) new(fgLayers+i-1) AliITSlayer();
+
+ fConstraint[0]=t.fConstraint[0]; fConstraint[1]=t.fConstraint[1];
+
+ Double_t xyz[]={kXV,kYV,kZV}, ers[]={kSigmaXV,kSigmaYV,kSigmaZV};
+ 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; i<kMaxLayer; i++) fLayersNotToSkip[i]=t.fLayersNotToSkip[i];
+
+}
+
+AliITStrackerV2::AliITStrackerV2(const Char_t *geom) :
+ AliTracker(),
+ fI(kMaxLayer),
+ fBestTrack(),
+ fTrackToFollow(),
+ fPass(0),
+ fLastLayerToTrackTo(kLastLayerToTrackTo)
+{
//--------------------------------------------------------------------
//This is the AliITStrackerV2 constructor
//--------------------------------------------------------------------
- AliITSgeom *g=(AliITSgeom*)geom;
+ if (geom) {
+ AliWarning("\"geom\" is actually a dummy argument !");
+ }
- Float_t x,y,z; Int_t i;
- for (i=1; i<kMaxLayer+1; i++) {
- Int_t nlad=g->GetNladders(i);
- Int_t ndet=g->GetNdetectors(i);
+ for (Int_t i=1; i<kMaxLayer+1; i++) {
+ Int_t nlad=AliITSgeomTGeo::GetNLadders(i);
+ Int_t ndet=AliITSgeomTGeo::GetNDetectors(i);
- g->GetTrans(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;
for (Int_t j=1; j<nlad+1; j++) {
for (Int_t k=1; k<ndet+1; k++) { //Fill this layer with detectors
- Float_t x,y,zshift; g->GetTrans(i,j,k,x,y,zshift);
- Double_t rot[9]; g->GetRotMatrix(i,j,k,rot);
-
- Double_t phi=TMath::ATan2(rot[1],rot[0])+TMath::Pi();
- phi+=TMath::Pi()/2;
- if (i==1) phi+=TMath::Pi();
+ 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[3]={0.};
+ m.LocalToMaster(txyz,xyz);
+ Double_t 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();
- 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);
}
}
- fI=kMaxLayer;
-
- 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; i<kMaxLayer; i++) fLayersNotToSkip[i]=kLayersNotToSkip[i];
- fLastLayerToTrackTo=kLastLayerToTrackTo;
}
//--------------------------------------------------------------------
//This function loads ITS clusters
//--------------------------------------------------------------------
- TBranch *branch=cTree->GetBranch("Clusters");
+ TBranch *branch=cTree->GetBranch("ITSRecPoints");
if (!branch) {
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 (; j<jmax; j++) {
if (!cTree->GetEvent(j)) continue;
Int_t ncl=clusters->GetEntriesFast();
+
while (ncl--) {
- AliITSclusterV2 *c=(AliITSclusterV2*)clusters->UncheckedAt(ncl);
+ AliITSRecPoint *c=(AliITSRecPoint*)clusters->UncheckedAt(ncl);
+
+ if (!c->Misalign()) AliWarning("Can't misalign this cluster !");
Int_t idx=c->GetDetectorIndex();
- Double_t y=r*fgLayers[i].GetDetector(idx).GetPhi()+c->GetY();
+ 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 AliITSclusterV2(*c));
+ fgLayers[i].InsertCluster(new AliITSRecPoint(*c));
}
clusters->Delete();
}
delete t;
continue;
}
- if (TMath::Abs(t->GetD())>4) {
+ if (TMath::Abs(t->GetD(GetX(),GetY()))>4) {
delete t;
continue;
}
// 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()) {
+ if (fTrackToFollow.PropagateToVertex(event->GetVertex())) {
fTrackToFollow.StartTimeIntegral();
}
fTrackToFollow.PropagateTo(3.,-0.0028,65.19);
}
- fTrackToFollow.ResetCovariance(); fTrackToFollow.ResetClusters();
+ fTrackToFollow.ResetCovariance(10.); fTrackToFollow.ResetClusters();
if (RefitAt(49.,&fTrackToFollow,t)) {
if (CorrectForDeadZoneMaterial(&fTrackToFollow)!=0) {
Warning("PropagateBack",
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
dz=road*scz; dy=road*scy;
}
- const AliITSclusterV2 *c=0; Int_t ci=-1;
- const AliITSclusterV2 *cc=0; Int_t cci=-1;
+ const AliITSRecPoint *c=0; Int_t ci=-1;
+ const AliITSRecPoint *cc=0; Int_t cci=-1;
Double_t chi2=kMaxChi2;
while ((c=layer.GetNextCluster(ci))!=0) {
Int_t idet=c->GetDetectorIndex();
if (!cc) return 0;
+ {// 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(cc->GetQ(),fTrackToFollow.GetNumberOfClusters()-1); //b.b.
}
-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
//--------------------------------------------------------------------
- fR=0.; fPhiOffset=0.; fZOffset=0.;
- fNladders=0; fNdetectors=0;
- fDetectors=0;
for (Int_t i=0; i<kNsector; i++) fN[i]=0;
- fNsel=0;
- fRoad=2*fR*TMath::Sqrt(3.14/1.);//assuming that there's only one cluster
}
AliITStrackerV2::AliITSlayer::
-AliITSlayer(Double_t r,Double_t p,Double_t z,Int_t nl,Int_t nd) {
+AliITSlayer(Double_t r,Double_t p,Double_t z,Int_t nl,Int_t nd):
+ fR(r),
+ fPhiOffset(p),
+ fNladders(nl),
+ fZOffset(z),
+ fNdetectors(nd),
+ fDetectors(new AliITSdetector[nl*nd]),
+ fNsel(0),
+ fRoad(2*r*TMath::Sqrt(3.14/1.)) //assuming that there's only one cluster
+{
//--------------------------------------------------------------------
//main AliITSlayer constructor
//--------------------------------------------------------------------
- fR=r; fPhiOffset=p; fZOffset=z;
- fNladders=nl; fNdetectors=nd;
- fDetectors=new AliITSdetector[fNladders*fNdetectors];
for (Int_t i=0; i<kNsector; i++) fN[i]=0;
- fNsel=0;
for (Int_t i=0; i<kMaxClusterPerLayer; i++) fClusters[i]=0;
- fRoad=2*fR*TMath::Sqrt(3.14/1.);//assuming that there's only one cluster
}
AliITStrackerV2::AliITSlayer::~AliITSlayer() {
if (n>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 inserts a cluster to this layer in increasing
// order of the cluster's fZ
else {
Int_t i=FindClusterIndex(c->GetZ(),sec);
Int_t k=n-i+sec*kMaxClusterPerSector;
- memmove(fClusters+i+1 ,fClusters+i,k*sizeof(AliITSclusterV2*));
+ memmove(fClusters+i+1 ,fClusters+i,k*sizeof(AliITSRecPoint*));
fClusters[i]=c;
}
n++;
Float_t ym = (ymax<ymin) ? ymax+circ : ymax;
Int_t i=FindClusterIndex(zmin,i1), imax=i1*kMaxClusterPerSector+fN[i1];
for (; i<imax; i++) {
- AliITSclusterV2 *c=fClusters[i];
+ AliITSRecPoint *c=fClusters[i];
if (c->IsUsed()) continue;
if (c->GetZ()>zmax) break;
if (c->GetPhiR()<=ymin) continue;
Float_t ym = (ymin>ymax) ? ymin-circ : ymin;
Int_t i=FindClusterIndex(zmin,i2), imax=i2*kMaxClusterPerSector+fN[i2];
for (; i<imax; i++) {
- AliITSclusterV2 *c=fClusters[i];
+ AliITSRecPoint *c=fClusters[i];
if (c->IsUsed()) continue;
if (c->GetZ()>zmax) break;
if (c->GetPhiR()<=ym) continue;
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"
//--------------------------------------------------------------------
- AliITSclusterV2 *c=0;
+ AliITSRecPoint *c=0;
ci=-1;
if (fNsel) {
fNsel--;
//--------------------------------------------------------------------
//This function finds the detector crossed by the track
//--------------------------------------------------------------------
- Double_t dphi=-(phi-fPhiOffset);
+ Double_t dphi;
+ if (fZOffset<0) // old geometry
+ dphi = -(phi-fPhiOffset);
+ else // new geometry
+ 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);
return d/(xn*xn);
}
-Bool_t
-AliITStrackerV2::RefitAt(Double_t xx,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 k;
}
t->SetDetectorIndex(idet);
- const AliITSclusterV2 *cl=0;
+ const AliITSRecPoint *cl=0;
Double_t maxchi2=kMaxChi2;
Int_t idx=index[i];
if (idx>0) {
- const AliITSclusterV2 *c=(AliITSclusterV2 *)GetCluster(idx);
+ const AliITSRecPoint *c=(AliITSRecPoint *)GetCluster(idx);
if (idet != c->GetDetectorIndex()) {
idet=c->GetDetectorIndex();
const AliITSdetector &det=layer.GetDetector(idet);
return kFALSE;
}
}
- /*
- if (cl==0)
- if (t->GetNumberOfClusters()>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 (chi2<maxchi2) { cl=c; maxchi2=chi2; idx=ci; }
- }
- }
- */
+
if (cl) {
+ // Take into account the mis-alignment
+ Double_t x=t->GetX()+cl->GetX();
+ if (!t->PropagateTo(x,0.,0.)) return kFALSE;
if (!t->Update(cl,maxchi2,idx)) {
return kFALSE;
}
t->CorrectForMaterial(-step*d,x0);
}
+ if (extra) { //search for extra clusters
+ AliITStrackV2 tmp(*t);
+ Double_t dz=4*TMath::Sqrt(tmp.GetSigmaZ2()+kSigmaZ2[i]);
+ if (dz < 0.5*TMath::Abs(tmp.GetTgl())) dz=0.5*TMath::Abs(tmp.GetTgl());
+ Double_t dy=4*TMath::Sqrt(t->GetSigmaY2()+kSigmaY2[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 *c=0; Int_t ci=-1,cci=-1;
+ Double_t maxchi2=1000.*kMaxChi2, tolerance=0.1;
+ while ((c=layer.GetNextCluster(ci))!=0) {
+ if (idet == c->GetDetectorIndex()) continue;
+
+ const AliITSdetector &det=layer.GetDetector(c->GetDetectorIndex());
+
+ if (!tmp.Propagate(det.GetPhi(),det.GetR())) continue;
+
+ if (TMath::Abs(tmp.GetZ() - c->GetZ()) > tolerance) continue;
+ if (TMath::Abs(tmp.GetY() - c->GetY()) > tolerance) continue;
+
+ Double_t chi2=tmp.GetPredictedChi2(c);
+ if (chi2<maxchi2) { maxchi2=chi2; cci=ci; }
+ }
+ if (cci>=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;
//--------------------------------------------------------------------
AliTracker::UseClusters(t,from);
- AliITSclusterV2 *c=(AliITSclusterV2 *)GetCluster(t->GetClusterIndex(0));
+ 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=(AliITSclusterV2 *)GetCluster(t->GetClusterIndex(1));
+
+ c = 0x0;
+ clusterIndex = t->GetClusterIndex(1);
+ if (clusterIndex>-1)
+ c=(AliITSRecPoint *)GetCluster(clusterIndex);
if (c && c->GetSigmaZ2()>0.1) c->UnUse();
}