Update of tracking code provided by Sergei
[u/mrichter/AliRoot.git] / TRD / AliTRDtrackingSector.cxx
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
16 /*
17 $Log$
18 Revision 1.8  2002/03/28 14:59:07  cblume
19 Coding conventions
20
21 Revision 1.7  2001/11/19 08:44:08  cblume
22 Fix bugs reported by Rene
23
24 Revision 1.6  2001/05/28 17:07:58  hristov
25 Last minute changes; ExB correction in AliTRDclusterizerV1; taking into account of material in G10 TEC frames and material between TEC planes (C.Blume,S.Sedykh)
26
27 Revision 1.5  2000/12/08 16:07:02  cblume
28 Update of the tracking by Sergei
29
30 Revision 1.4  2000/10/16 01:16:53  cblume
31 Changed timebin 0 to be the one closest to the readout
32
33 Revision 1.3  2000/10/15 23:40:01  cblume
34 Remove AliTRDconst
35
36 Revision 1.2  2000/10/06 16:49:46  cblume
37 Made Getters const
38
39 Revision 1.1.2.2  2000/10/04 16:34:58  cblume
40 Replace include files by forward declarations
41
42 Revision 1.1.2.1  2000/09/22 14:47:52  cblume
43 Add the tracking code
44
45 */ 
46
47 /////////////////////////////////////////////////////////////////////////
48 //                                                                     //
49 //  Tracking sector                                                    //
50 //                                                                     //
51 /////////////////////////////////////////////////////////////////////////                       
52                                 
53 #include <TObject.h>
54
55 #include "AliRun.h"
56
57 #include "AliTRD.h" 
58 #include "AliTRDgeometry.h" 
59 #include "AliTRDcluster.h" 
60 #include "AliTRDtimeBin.h" 
61 #include "AliTRDtrackingSector.h" 
62 #include "AliTRDparameter.h"
63
64 ClassImp(AliTRDtrackingSector) 
65
66 //_______________________________________________________
67 AliTRDtrackingSector::~AliTRDtrackingSector()
68 {
69   //
70   // Destructor
71   //
72
73   delete fTimeBin;
74
75 }
76
77 //_______________________________________________________
78 AliTRDtimeBin &AliTRDtrackingSector::operator[](Int_t i)
79 {
80   //
81   // Index operator 
82   //
83
84   return *(fTimeBin+i);
85
86 }
87
88 //_______________________________________________________
89 void AliTRDtrackingSector::SetUp()
90
91   //
92   // Initialization
93   //
94
95   AliTRD *trd = (AliTRD*) gAlice->GetDetector("TRD");
96   fGeom = trd->GetGeometry();
97
98   fN = AliTRDgeometry::Nplan() * (Int_t(AliTRDgeometry::DrThick()
99                                        /fTimeBinSize) + 1);
100
101   fTimeBin = new AliTRDtimeBin[fN]; 
102
103   if (!fPar) {
104     fPar = new AliTRDparameter("TRDparameter","Standard TRD parameter");
105   }
106
107   fTimeBinSize = fPar->GetTimeBinSize();
108
109 }
110
111 //______________________________________________________
112 Double_t AliTRDtrackingSector::GetX(Int_t tb) const
113 {
114   //
115   // Get global x coordinate
116   //
117
118   if( (tb<0) || (tb>fN-1)) {
119     fprintf(stderr,"AliTRDtrackingSector::GetX: TimeBin index is out of range !\n");
120     return -99999.;
121   }
122   else { 
123     
124     Int_t tbPerPlane = fN/AliTRDgeometry::Nplan();
125     Int_t localTb = tbPerPlane - tb%tbPerPlane - 1;
126
127     Int_t plane = tb/tbPerPlane;
128     Float_t t0 = fPar->GetTime0(plane);
129     Double_t x = t0 - (localTb + 0.5) * fTimeBinSize;
130
131     return x;
132
133   }
134
135 }
136
137 //______________________________________________________
138 Int_t AliTRDtrackingSector::GetTimeBinNumber(Double_t x) const
139 {
140   //
141   // Returns the time bin number
142   //
143
144   Float_t rOut = fPar->GetTime0(AliTRDgeometry::Nplan()-1); 
145   Float_t rIn  = fPar->GetTime0(0) - AliTRDgeometry::DrThick();
146
147
148   if(x >= rOut) return fN-1;
149   if(x <= rIn)  return 0;
150
151   Int_t plane;
152   for (plane = AliTRDgeometry::Nplan()-1; plane >= 0; plane--) {
153     if(x > (fPar->GetTime0(plane) - AliTRDgeometry::DrThick())) break;
154   }  
155  
156   Int_t tbPerPlane = fN/AliTRDgeometry::Nplan();
157   Int_t localTb = Int_t((fPar->GetTime0(plane)-x)/fTimeBinSize);
158
159   if((localTb < 0) || (localTb >= tbPerPlane)) {
160     printf("AliTRDtrackingSector::GetTimeBinNumber: \n");
161     printf("local time bin %d is out of bounds [0..%d]: x = %f \n",
162            localTb,tbPerPlane-1,x);
163     return -1;
164   }
165       
166   Int_t timeBin = (plane + 1) * tbPerPlane - 1 - localTb;
167
168   return timeBin;
169 }
170
171 //______________________________________________________
172 Int_t AliTRDtrackingSector::GetTimeBin(Int_t det, Int_t localTb) const 
173 {
174   //
175   // Time bin
176   //
177
178   Int_t plane = fGeom->GetPlane(det);
179
180   Int_t tbPerPlane = fN/AliTRDgeometry::Nplan();
181
182   Int_t timeBin = (plane + 1) * tbPerPlane - 1 - localTb;
183
184   return timeBin;
185
186 }
187
188
189 //______________________________________________________
190
191 Bool_t AliTRDtrackingSector::TECframe(Int_t tb, Double_t y, Double_t z) const
192 {
193   //  
194   // Returns <true> if point defined by <x(tb),y,z> is within 
195   // the TEC G10 frame, otherwise returns <false>  
196   //  
197
198   if((tb > (fN-1)) || (tb < 0)) return kFALSE; 
199
200   Int_t tbPerPlane = fN/AliTRDgeometry::Nplan();
201   Int_t plane = tb/tbPerPlane;
202   
203   Double_t x = GetX(tb);
204   y = TMath::Abs(y);
205
206   if((y > fGeom->GetChamberWidth(plane)/2.) &&
207      (y < x*TMath::Tan(0.5*AliTRDgeometry::GetAlpha()))) return kTRUE; 
208
209   Double_t zmin, zmax;
210   Float_t  fRowPadSize, fRow0;
211   Int_t    nPadRows;
212
213   for(Int_t iCha = 1; iCha < AliTRDgeometry::Ncham(); iCha++) {
214
215     fRow0 = fPar->GetRow0(plane,iCha-1,0);
216     fRowPadSize = fPar->GetRowPadSize(plane,iCha-1,0);
217     nPadRows = fPar->GetRowMax(plane,iCha-1,0);
218     zmin = fRow0 - fRowPadSize/2 + fRowPadSize * nPadRows;
219
220     fRow0 = fPar->GetRow0(plane,iCha,0);
221     fRowPadSize = fPar->GetRowPadSize(plane,iCha,0);
222     zmax = fRow0 - fRowPadSize/2;
223
224     if((z > zmin) && (z < zmax)) return kTRUE;     
225   }
226
227   return kFALSE;
228
229 }