cd9ee7152b8cda674b3bf3eecac1e9feb577c5c7
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITStrackU.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2003, 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 ////////////////////////////////////////////////////////
18 //  Stand alone track class UPGRADE                   //
19 //  Authors: A.Mastroserio                            //
20 //           C.Terrevoli                              //
21 //           annalisa.mastroserio@cern.ch             //      
22 //           cristina.terrevoli@ba.infn.it            //                                                    
23 ////////////////////////////////////////////////////////
24
25 #include "AliESDtrack.h"
26 #include "AliITStrackU.h"
27 #include "AliITSsegmentationUpgrade.cxx"
28
29 ClassImp(AliITStrackU)
30
31 //_____________________________________
32   AliITStrackU:: AliITStrackU() : 
33     AliITStrackV2(),
34     fNLayers(0),
35     fNU(0),
36     fExpQ(40)
37 {
38   // Default constructor  fgMaxNLayer
39   SetNumberOfClusters(0);
40   SetNumberOfClustersU(0);
41   ResetIndexU();
42   for(Int_t nlay=0;nlay<fgMaxNLayer;nlay++){ 
43     fNM[nlay]=0;
44     fDy[nlay]=0; fDz[nlay]=0; fSigmaY[nlay]=0; fSigmaZ[nlay]=0; fSigmaYZ[nlay]=0;
45     fClIndex[nlay]=-1; 
46     fNy[nlay]=0; fNz[nlay]=0; fNormQ[nlay]=0; fNormChi2[nlay]=1000;
47     SetNumberOfMarked(nlay,0);
48   }
49   ResetMarked();
50 }
51 //_____________________________________
52 AliITStrackU:: AliITStrackU(Int_t nlay) : 
53   AliITStrackV2(),
54   fNLayers(nlay),
55   fNU(0),
56   fExpQ(40)
57 {
58   // Constructor
59   SetNumberOfClusters(0);
60   SetNumberOfClustersU(0);
61   ResetIndexU();
62   for(Int_t nl=0;nl<fgMaxNLayer;nl++){
63     fNM[nlay]=0;
64     fDy[nl]=0; fDz[nl]=0; fSigmaY[nl]=0; fSigmaZ[nl]=0; fSigmaYZ[nl]=0;
65     fClIndex[nl]=-1;
66     fNy[nl]=0; fNz[nl]=0; fNormQ[nl]=0; fNormChi2[nl]=1000;
67     SetNumberOfMarked(nl,0);
68   }
69   ResetMarked();
70 }
71
72 //_____________________________________________________
73 AliITStrackU::AliITStrackU(AliESDtrack& t,Bool_t c):
74   AliITStrackV2(t,c),
75   fNLayers(0),
76   fNU(0),
77   fExpQ(40)
78 {
79   //------------------------------------------------------------------
80   // Copy a V2 track into a U track
81   // -> to be checked
82   //------------------------------------------------------------------
83  ResetIndexU();
84  ResetMarked();
85   for(Int_t nlay=0;nlay<fgMaxNLayer;nlay++){
86     fNM[nlay]=0;
87     fDy[nlay]=0; fDz[nlay]=0; fSigmaY[nlay]=0; fSigmaZ[nlay]=0; fSigmaYZ[nlay]=0;
88     fClIndex[nlay]=-1; fNy[nlay]=0; fNz[nlay]=0; fNormQ[nlay]=0; fNormChi2[nlay]=1000;  
89   }
90 }
91 //___________________________________________________
92
93 AliITStrackU::AliITStrackU(const AliITStrackU& t, Bool_t trackMI) : 
94   AliITStrackV2(t),
95   fNLayers(t.fNLayers),
96   fNU(t.fNU),
97   fExpQ(t.fExpQ)
98 {
99   // Copy constructor
100
101   ResetIndexU();
102   ResetMarked();
103   Int_t number = t.GetNumberOfClustersU();
104   SetNumberOfClustersU(number);
105   for(Int_t lay=0;lay<fgMaxNLayer;lay++){
106     SetNumberOfMarked(lay,t.GetNumberOfMarked(lay));
107   }
108   for(Int_t i=0;i<number;i++){
109     fSain[i]=t.fSain[i];
110   }
111   for(Int_t nlay=0;nlay<fNLayers;nlay++){
112     for(Int_t i=0;i<t.GetNumberOfMarked(nlay);i++){
113       fCluMark[nlay][i]=t.fCluMark[nlay][i];
114     }
115   }
116   for(Int_t nlay=0;nlay<fgMaxNLayer;nlay++){
117     fNM[nlay]=t.fNM[nlay];
118     fDy[nlay]=t.fDy[nlay]; fDz[nlay]=t.fDz[nlay];
119      fSigmaY[nlay]=t.fSigmaY[nlay]; fSigmaZ[nlay]=t.fSigmaZ[nlay]; fSigmaYZ[nlay]=t.fSigmaYZ[nlay];
120     fClIndex[nlay]= t.fClIndex[nlay]; fNy[nlay]=t.fNy[nlay]; fNz[nlay]=t.fNz[nlay]; fNormQ[nlay]=t.fNormQ[nlay]; fNormChi2[nlay] = t.fNormChi2[nlay];
121   } 
122   
123   if(trackMI){
124     fLab = t.fLab;
125     fFakeRatio = t.fFakeRatio;
126   }
127 //  for(Int_t i=0; i<fgMaxNLayer; i++) {fDy[i]=t.fDy[i]; fDz[i]=t.fDz[i];
128 //    fSigmaY[i]=t.fSigmaY[i]; fSigmaZ[i]=t.fSigmaZ[i]; fSigmaYZ[i]=t.fSigmaYZ[i]; 
129 //  }
130 }
131 //____________________________________________________
132 AliITStrackU::AliITStrackU(Double_t alpha, Double_t radius, Double_t Ycoor, Double_t Zcoor, Double_t phi, Double_t tanlambda, Double_t curv, Int_t lab, Int_t nlay ):
133   fNLayers(nlay),
134   fNU(0), 
135   fExpQ(40)
136 {
137   
138   for(Int_t i=0; i<fgMaxNLayer; i++) { fClIndex[i]=-1; fNy[i]=0; fNz[i]=0; fNormQ[i]=0; fNormChi2[i]=1000; }
139   // standard constructor. Used for ITSUpgrade standalone tracking
140
141   // get the azimuthal angle of the detector containing the innermost
142   // cluster of this track (data member fAlpha)
143   for(Int_t i=0; i<fgMaxNLayer; i++) {fNM[i]=0;fDy[i]=0; fDz[i]=0; fSigmaY[i]=0; fSigmaZ[i]=0; fSigmaYZ[i]=0;}
144
145   if (alpha<0) alpha+=TMath::TwoPi();
146   else if (alpha>=TMath::TwoPi()) alpha-=TMath::TwoPi();
147   Init(alpha,radius,Ycoor,Zcoor,phi,tanlambda,curv,lab/*,nlay*/);
148 }
149 //____________________________________________________
150 void AliITStrackU::Init(Double_t alpha, Double_t radius, Double_t Ycoor, Double_t Zcoor, Double_t phi, Double_t tanlambda, Double_t curv, Int_t lab/*, Int_t nlay*/){
151   // initialize parameters
152   fdEdx = 0;
153   Double_t conv=GetBz()*kB2C;
154   Double_t sC[] = {0.000009, // 0.000009
155                    0.,
156                    0.000003, //0.000030
157                    0.,
158                    0.,
159                    0.000001, //0.000001
160                    0.,
161                    0.,
162                    0.,
163                    0.000002, //0.000002
164                    0.,
165                    0.,
166                    0.,
167                    0.,
168                    0.000001/(conv*conv)}; //0.0000001
169
170   Double_t sP[] = {Ycoor,
171                    Zcoor,
172                    TMath::Sin(phi-alpha),
173                    tanlambda,
174                    curv/conv};
175
176
177   // dealing with the case B=0 (taken from AliTPCtrack.cxx)
178   Double_t mostProbablePt=AliExternalTrackParam::GetMostProbablePt();
179   Double_t p0=TMath::Sign(1/mostProbablePt,sP[4]);
180   Double_t w0=sC[14]/(sC[14] + p0*p0), w1=p0*p0/(sC[14] + p0*p0);
181   sP[4] = w0*p0 + w1*sP[4];
182   sC[14]*=w1;
183                                                                               
184   Set(radius,alpha,sP,sC);
185
186   for(Int_t i=0; i<fNLayers; i++) fIndex[i] = 0;  // to be set explicitely
187
188   for(Int_t i=0; i<4; i++) fdEdxSample[i] = 0; 
189
190   SetNumberOfClusters(0);
191   SetNumberOfClustersU(0);
192   for(Int_t nl=0;nl<fNLayers;nl++) SetNumberOfMarked(nl,0);
193   ResetIndexU();
194   ResetMarked();
195   SetChi2(0);
196   SetMass(0.139);    // pion mass
197   SetLabel(lab); 
198   
199 }
200
201 //____________________________________________________________
202 void AliITStrackU::AddClusterU(Int_t layer, Int_t clnumb) {
203   // add one clusters to the list (maximum number=kMaxNumberOfClusters)
204   Int_t presnum = GetNumberOfClustersU();
205   if(presnum>=kMaxNumberOfClusters){
206     Warning("AddClusterU","Maximum number of clusters already reached. Nothing is done\n");
207     return;
208   }
209
210   fSain[presnum] = (layer<<28)+clnumb;  
211   presnum++;
212   SetNumberOfClustersU(presnum);
213 }
214
215 //____________________________________________________________
216 void AliITStrackU::AddClusterMark(Int_t layer, Int_t clnumb) {
217   // add one clusters to the list (maximum number=kMaxNumberOfClusters)
218   Int_t presnum = GetNumberOfMarked(layer);
219   //printf("presnum=%d\n",presnum);
220   if(presnum>=kMaxNumberOfClustersL){
221     Warning("AddClusterMark","Maximum number of clusters already reached. Nothing is done\n");
222     return;
223   }
224
225   fCluMark[layer][presnum] = clnumb;  
226   presnum++;
227   SetNumberOfMarked(layer,presnum);
228 }
229
230 //____________________________________________________________
231 void AliITStrackU::AddClusterV2(Int_t layer,Int_t clnumb) {
232   // add one clusters to the list (maximum number=6)
233   Int_t presnum = GetNumberOfClusters();
234   if(presnum>=fNLayers){
235     Warning("AddClusterV2","Maximum number of clusters already reached. Nothing is done\n");
236     return;
237   }    
238
239   fIndex[presnum] = (layer<<28)+clnumb;  
240   presnum++;
241   SetNumberOfClusters(presnum);
242 }
243
244 //_____________________________________________________________
245 void AliITStrackU::ResetMarked(){
246
247   //Reset array of marked clusters
248   for(Int_t nlay=0;nlay<fNLayers;nlay++){
249     for(Int_t k=0; k<kMaxNumberOfClustersL; k++) fCluMark[nlay][k]=0;
250   }
251 }
252 //_____________________________________________________________
253 Double_t AliITStrackU::GetPredictedChi2MI(Double_t cy, Double_t cz, Double_t cerry, Double_t cerrz, Double_t covyz) const
254 {
255   //-----------------------------------------------------------------
256   // This function calculates a predicted chi2 increment.
257   //-----------------------------------------------------------------
258   Double_t p[2]={cy, cz};
259   Double_t cov[3]={cerry*cerry, covyz, cerrz*cerrz};
260   return AliExternalTrackParam::GetPredictedChi2(p,cov);
261 }
262
263 //____________________________________________________________________________
264 Bool_t AliITStrackU::UpdateMI(const AliCluster *c, Double_t chi2, Int_t index) {
265   //------------------------------------------------------------------
266   //This function updates track parameters
267   //------------------------------------------------------------------
268   Double_t dy=c->GetY() - GetY(), dz=c->GetZ() - GetZ();
269   Int_t layer = (index & 0xf0000000) >> 28;
270   fDy[layer] = dy;
271   fDz[layer] = dz;
272   fSigmaY[layer] = TMath::Sqrt(c->GetSigmaY2()+GetSigmaY2());
273   fSigmaZ[layer] = TMath::Sqrt(c->GetSigmaZ2()+GetSigmaZ2());
274   fSigmaYZ[layer] = c->GetSigmaYZ()+GetSigmaZY();
275
276
277   return Update(c,chi2,index);
278 }
279