TPC/fastSimul/AliTPCclusterFast.cxx - iplement dEdx above threshold - several reco...
[u/mrichter/AliRoot.git] / TPC / template.cxx
CommitLineData
cc80f89e 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3 * *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15
88cb7938 16/* $Id$ */
cc80f89e 17
18static int PropagateTo(TVector &x, Double_t fX, Double_t xk) {
19 if (TMath::Abs(x(2)*xk - x(3)) >= 0.999) {
20 cerr<<"Propagation failed !\n";
21 return 0;
22 }
23
24 Double_t x1=fX, x2=x1+(xk-x1), dx=x2-x1;//, y1=x(0), z1=x(1);
60e55aee 25 Double_t c1=x(2)*x1 - x(3), r1=sqrt((1.-c1)*(1.+c1));
26 Double_t c2=x(2)*x2 - x(3), r2=sqrt((1.-c2)*(1.+c2));
cc80f89e 27
28 x(0) += dx*(c1+c2)/(r1+r2);
29 x(1) += dx*(c1+c2)/(c1*r2 + c2*r1)*x(4);
30
31 return 1;
32}
33
34static int Rotate(TVector &x, Double_t fX, Double_t alpha) {
35 Double_t x1=fX, y1=x(0);
36 Double_t ca=cos(alpha), sa=sin(alpha);
37 Double_t r1=x(2)*fX - x(3);
38
39 fX = x1*ca + y1*sa;
40 x(0)=-x1*sa + y1*ca;
60e55aee 41 x(3)=x(3)*ca + (x(2)*y1 + sqrt((1.-r1)*(1.+r1)))*sa;
cc80f89e 42
43 Double_t r2=x(2)*fX - x(3);
44 if (TMath::Abs(r2) >= 0.999) {
45 //cerr<<"Rotation failed !\n";
46 return 0;
47 }
48
60e55aee 49 Double_t y0=x(0) + sqrt((1.-r2)*(1.+r2))/x(2);
cc80f89e 50 if ((x(0)-y0)*x(2) >= 0.) {
51 //cerr<<"Rotation failed !!!\n";
52 return 0;
53 }
54
55 return 1;
56}
57
58//_____________________________________________________________________________
59static int templ(TVector par, Double_t x, Double_t dy, Double_t dz,
60 const AliTPCSector *sec, int s, int rf=0)
61{
62 //-----------------------------------------------------------------
63 // This function tries to find a track prolongation.
64 //
65 // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
66 //-----------------------------------------------------------------
67 int accepted=0;
68 const int ROWS_TO_SKIP=100;
69 int try_again=ROWS_TO_SKIP;
70 Double_t alpha=sec->GetAlpha();
71 int ns=int(2*TMath::Pi()/alpha+0.5);
72
73 Double_t xold=x;
74 for (int nr=sec->GetRowNumber(x)-1; nr>=rf; nr--,xold=x) {
75 //cerr<<nr<<endl;
76 Double_t x=sec->GetX(nr), ymax=sec->GetMaxY(nr);
77 if (!PropagateTo(par,xold,x)) return 0;
78
79 AliTPCcluster *cl=0;
80 const AliTPCRow& row=sec[s][nr];
81 Double_t road=dy, y=par(0), z=par(1);
82
83 if (road>30) {
84 return 0;
85 }
86
87 if (row) {
88 for (int i=row.Find(y-road); i<row; i++) {
89 AliTPCcluster* c=(AliTPCcluster*)(row[i]);
90 if (c->fY > y+road) break;
91 if (TMath::Abs(c->fZ - z) > dz) continue;
92 cl=c;
93 }
94 }
95 if (cl) {
96 par(0)=cl->fY; par(1)=cl->fZ;
97 //dy=TMath::Sqrt(cl->fSigmaY2); dz=TMath::Sqrt(cl->fSigmaZ2);
98 //cerr<<nr<<' '<<cl->fTracks[0]<<' '<<cl->fTracks[1]<<' '<<cl->fTracks[2]<<endl;
99 accepted++;
100 try_again=ROWS_TO_SKIP;
101 } else {
102 if (try_again==0) break;
103 if (y > ymax) {
104 s = (s+1) % ns;
105 if (!Rotate(par,x,alpha)) return 0;
106 dy*=2;
107 } else if (y <-ymax) {
108 s = (s-1+ns) % ns;
109 if (!Rotate(par,x,-alpha)) return 0;
110 dy*=2;
111 }
112 try_again--;
113 }
114 }
115
116 //cerr<<endl;
117 return accepted;
118}
119
120