- Top->cd();
- Node = new TNode(name,title,name,0,0,0,"");
- Node->SetLineColor(kColorTPC);
- fNodes->Add(Node);
- }
-}
-
-
-
-//_____________________________________________________________________________
-Int_t AliTPC::DistancetoPrimitive(Int_t , Int_t )
-{
- //
- // Calculate distance from TPC to mouse on the display
- // Dummy procedure
- //
- return 9999;
-}
-
-//_____________________________________________________________________________
-//const int MAX_CLUSTER=nrow_low+nrow_up;
-const int MAX_CLUSTER=200;
-const int S_MAXSEC=24;
-const int L_MAXSEC=48;
-const int ROWS_TO_SKIP=21;
-const Float_t MAX_CHI2=12.;
-
-
-//_____________________________________________________________________________
-static Double_t SigmaY2(Double_t r, Double_t tgl, Double_t pt)
-{
- //
- // Calculate spread in Y
- //
- pt=TMath::Abs(pt)*1000.;
- Double_t x=r/pt;
- tgl=TMath::Abs(tgl);
- Double_t s=a_rphi - b_rphi*r*tgl + c_rphi*x*x + d_rphi*x;
- if (s<0.4e-3) s=0.4e-3;
- return s;
-}
-
-//_____________________________________________________________________________
-static Double_t SigmaZ2(Double_t r, Double_t tgl)
-{
- //
- // Calculate spread in Z
- //
- tgl=TMath::Abs(tgl);
- Double_t s=a_z - b_z*r*tgl + c_z*tgl*tgl;
- if (s<0.4e-3) s=0.4e-3;
- return s;
-}
-
-//_____________________________________________________________________________
-inline Double_t f1(Double_t x1,Double_t y1, //C
- Double_t x2,Double_t y2,
- Double_t x3,Double_t y3)
-{
- //
- // Function f1
- //
- Double_t d=(x2-x1)*(y3-y2)-(x3-x2)*(y2-y1);
- Double_t a=0.5*((y3-y2)*(y2*y2-y1*y1+x2*x2-x1*x1)-
- (y2-y1)*(y3*y3-y2*y2+x3*x3-x2*x2));
- Double_t b=0.5*((x2-x1)*(y3*y3-y2*y2+x3*x3-x2*x2)-
- (x3-x2)*(y2*y2-y1*y1+x2*x2-x1*x1));
-
- Double_t xr=TMath::Abs(d/(d*x1-a)), yr=d/(d*y1-b);
-
- return -xr*yr/sqrt(xr*xr+yr*yr);
-}
-
-
-//_____________________________________________________________________________
-inline Double_t f2(Double_t x1,Double_t y1, //eta=C*x0
- Double_t x2,Double_t y2,
- Double_t x3,Double_t y3)
-{
- //
- // Function f2
- //
- Double_t d=(x2-x1)*(y3-y2)-(x3-x2)*(y2-y1);
- Double_t a=0.5*((y3-y2)*(y2*y2-y1*y1+x2*x2-x1*x1)-
- (y2-y1)*(y3*y3-y2*y2+x3*x3-x2*x2));
- Double_t b=0.5*((x2-x1)*(y3*y3-y2*y2+x3*x3-x2*x2)-
- (x3-x2)*(y2*y2-y1*y1+x2*x2-x1*x1));
-
- Double_t xr=TMath::Abs(d/(d*x1-a)), yr=d/(d*y1-b);
-
- return -a/(d*y1-b)*xr/sqrt(xr*xr+yr*yr);
-}
-
-//_____________________________________________________________________________
-inline Double_t f3(Double_t x1,Double_t y1, //tgl
- Double_t x2,Double_t y2,
- Double_t z1,Double_t z2)
-{
- //
- // Function f3
- //
- return (z1 - z2)/sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
-}
-
-//_____________________________________________________________________________
-static int FindProlongation(AliTPCtrack& t, const AliTPCSector *sec,
- int s, int ri, int rf=0)
-{
- //
- // Propagate track
- //
- int try_again=ROWS_TO_SKIP;
- Double_t alpha=sec->GetAlpha();
- int ns=int(2*TMath::Pi()/alpha)+1;
-
- for (int nr=ri; nr>=rf; nr--) {
- Double_t x=sec[s].GetX(nr), ymax=sec[s].GetMaxY(nr);
- if (!t.PropagateTo(x)) return -1;
-
- const AliTPCcluster *cl=0;
- Double_t max_chi2=MAX_CHI2;
- const AliTPCRow& row=sec[s][nr];
- Double_t sy2=SigmaY2(t.GetX(),t.GetTgl(),t.GetPt());
- Double_t sz2=SigmaZ2(t.GetX(),t.GetTgl());
- Double_t road=3.*sqrt(t.GetSigmaY2() + 4*sy2), y=t.GetY(), z=t.GetZ();
-
- if (road>30) {
- if (t>3) cerr<<t<<" AliTPCtrack warning: Too broad road !\n";
- return -1;
- }
-
- if (row) {
- for (int i=row.Find(y-road); i<row; i++) {
- AliTPCcluster* c=(AliTPCcluster*)(row[i]);
- if (c->fY > y+road) break;
- if (c->IsUsed()) continue;
- if ((c->fZ - z)*(c->fZ - z) > 9.*(t.GetSigmaZ2() + 4*sz2)) continue;
- Double_t chi2=t.GetPredictedChi2(c);
- if (chi2 > max_chi2) continue;
- max_chi2=chi2;
- cl=c;
- }
- }
- if (cl) {
- t.Update(cl,max_chi2);
- try_again=ROWS_TO_SKIP;
- } else {
- if (try_again==0) break;
- if (y > ymax) {
- s = (s+1) % ns;
- if (!t.Rotate(alpha)) return -1;
- } else if (y <-ymax) {
- s = (s-1+ns) % ns;
- if (!t.Rotate(-alpha)) return -1;
- }
- try_again--;
- }
- }
-
- return s;
-}
-
-
-//_____________________________________________________________________________
-static void MakeSeeds(TObjArray& seeds,const AliTPCSector* sec,int i1,int i2,
-const AliTPCParam *p)
-{
- //
- // Find seed for tracking
- //
- TMatrix C(5,5); TVector x(5);
- int max_sec=L_MAXSEC/2;
- for (int ns=0; ns<max_sec; ns++) {
- int nl=sec[(ns-1+max_sec)%max_sec][i2];
- int nm=sec[ns][i2];
- int nu=sec[(ns+1)%max_sec][i2];
- Double_t alpha=sec[ns].GetAlpha();
- const AliTPCRow& r1=sec[ns][i1];
- for (int is=0; is < r1; is++) {
- Double_t x1=sec[ns].GetX(i1), y1=r1[is]->fY, z1=r1[is]->fZ;
- for (int js=0; js < nl+nm+nu; js++) {
- const AliTPCcluster *cl;
- Double_t cs,sn;
- int ks;
-
- if (js<nl) {
- ks=(ns-1+max_sec)%max_sec;
- const AliTPCRow& r2=sec[(ns-1+max_sec)%max_sec][i2];
- cl=r2[js];
- cs=cos(alpha); sn=sin(alpha);
- } else
- if (js<nl+nm) {
- ks=ns;
- const AliTPCRow& r2=sec[ns][i2];
- cl=r2[js-nl];
- cs=1; sn=0.;
- } else {
- ks=(ns+1)%max_sec;
- const AliTPCRow& r2=sec[(ns+1)%max_sec][i2];
- cl=r2[js-nl-nm];
- cs=cos(alpha); sn=-sin(alpha);
- }
- Double_t x2=sec[ns].GetX(i2), y2=cl->fY, z2=cl->fZ;
- //if (z1*z2 < 0) continue;
- //if (TMath::Abs(z1) < TMath::Abs(z2)) continue;
-
- Double_t tmp= x2*cs+y2*sn;
- y2 =-x2*sn+y2*cs;
- x2=tmp;
-
- x(0)=y1;
- x(1)=z1;
- x(2)=f1(x1,y1,x2,y2,0.,0.);
- x(3)=f2(x1,y1,x2,y2,0.,0.);
- x(4)=f3(x1,y1,x2,y2,z1,z2);
-
- if (TMath::Abs(x(2)*x1-x(3)) >= 0.999) continue;
-
- if (TMath::Abs(x(4)) > 1.2) continue;
-
- Double_t a=asin(x(3));
- Double_t zv=z1 - x(4)/x(2)*(a+asin(x(2)*x1-x(3)));
- if (TMath::Abs(zv)>33.) continue;
-
- TMatrix X(6,6); X=0.;
- X(0,0)=r1[is]->fSigmaY2; X(1,1)=r1[is]->fSigmaZ2;
- X(2,2)=cl->fSigmaY2; X(3,3)=cl->fSigmaZ2;
- X(4,4)=3./12.; X(5,5)=3./12.;
- TMatrix F(5,6); F.UnitMatrix();
- Double_t sy=sqrt(X(0,0)), sz=sqrt(X(1,1));
- F(2,0)=(f1(x1,y1+sy,x2,y2,0.,0.)-x(2))/sy;
- F(2,2)=(f1(x1,y1,x2,y2+sy,0.,0.)-x(2))/sy;
- F(2,4)=(f1(x1,y1,x2,y2,0.,0.+sy)-x(2))/sy;
- F(3,0)=(f2(x1,y1+sy,x2,y2,0.,0.)-x(3))/sy;
- F(3,2)=(f2(x1,y1,x2,y2+sy,0.,0.)-x(3))/sy;
- F(3,4)=(f2(x1,y1,x2,y2,0.,0.+sy)-x(3))/sy;
- F(4,0)=(f3(x1,y1+sy,x2,y2,z1,z2)-x(4))/sy;
- F(4,1)=(f3(x1,y1,x2,y2,z1+sz,z2)-x(4))/sz;
- F(4,2)=(f3(x1,y1,x2,y2+sy,z1,z2)-x(4))/sy;
- F(4,3)=(f3(x1,y1,x2,y2,z1,z2+sz)-x(4))/sz;
- F(4,4)=0;
- F(3,3)=0;
-
- TMatrix t(F,TMatrix::kMult,X);
- C.Mult(t,TMatrix(TMatrix::kTransposed,F));
-
- TrackSeed *track=new TrackSeed(*(r1[is]),x,C,p);
- int rc=FindProlongation(*track,sec,ns,i1-1,i2);
- if (rc<0 || *track<(i1-i2)/2) delete track;
- else seeds.AddLast(track);
- }
- }