]> git.uio.no Git - u/mrichter/AliRoot.git/blob - TPC/AliTPCtrackerParam.cxx
\n is allowed only at the end of string, replaced (Sun, Alpha)
[u/mrichter/AliRoot.git] / TPC / AliTPCtrackerParam.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 $Log$
17 Revision 1.1  2002/02/18 09:06:54  kowal2
18 TPC parametrization by Andrea Dainese
19
20 */
21 /*************************************************************************
22  *                                                                        *
23  * This class builds AliTPCtrack objects from generated tracks to feed    *
24  * ITS tracking (V2). The AliTPCtrack is built from its first hit in      *
25  * the TPC. The track is assigned a Kalman-like covariance matrix         *
26  * depending on its pT and pseudorapidity and track parameters are        *
27  * smeared according this covariance matrix.                              *
28  * Output file contains sorted tracks, ready for matching with ITS        *
29  *                                                                        *
30  * Test macro is: AliBarrelRec_TPCparam.C                                 * 
31  *                                                                        *
32  *  Origin: Andrea Dainese, Padova - e-mail: andrea.dainese@pd.infn.it    * 
33  *                                                                        *
34  **************************************************************************/
35 #include "AliTPCtrackerParam.h"
36 #include "alles.h"
37 #include "AliMagF.h"
38 #include "AliTPCtrack.h"
39 #include "TMatrixD.h"
40 #include "AliKalmanTrack.h"
41
42 ClassImp(AliTPCtrackerParam)
43
44 //-----------------------------------------------------------------
45 AliTPCtrackerParam::AliTPCtrackerParam(const Int_t coll,const Double_t Bz) 
46 {
47   fColl = coll; // collision code (0: PbPb6000)
48   fBz = Bz;     // value of the z component of L3 field (Tesla)
49   
50 }
51 //-----------------------------------------------------------------
52 AliTPCtrackerParam::~AliTPCtrackerParam() 
53 {}
54 //-----------------------------------------------------------------
55
56 Int_t AliTPCtrackerParam::BuildTPCtracks(const TFile *inp, TFile *out, Int_t n)
57 {
58  
59   if(fColl!=0) { 
60     cerr<<"AliTPCtrackerParam::BuildTPCtracks:  Invalid collision!"<<endl<<
61                 "Available:  0   ->   PbPb6000"<<endl; return 0; 
62   }
63   if(fBz!=0.4) {
64     cerr<<"AliTPCtrackerParam::BuildTPCtracks:  Invalid field!"<<endl<<
65                 "Available:  0.4"<<endl; return 0;
66   }
67
68   TFile *infile=(TFile*)inp;
69
70   AliKalmanTrack::SetConvConst(100/0.299792458/fBz);
71
72   // Get gAlice object from file
73   if(!(gAlice=(AliRun*)infile->Get("gAlice"))) {
74     cerr<<"gAlice has not been found on galice.root !\n";
75     return 1;
76   }
77
78   // Set random number generator seed
79   TDatime t;
80   gRandom->SetSeed(t.Get());
81
82
83   // loop over first n events in file
84   for(Int_t evt=0; evt<n; evt++){
85     cerr<<"+++\n+++ Processing event "<<evt<<"\n+++\n";
86
87     AliTPCtrack *tpctrack=0;
88
89     // tree for TPC tracks
90     Char_t tname[100];
91     sprintf(tname,"TreeT_TPC_%d",evt);
92     TTree *tracktree = new TTree(tname,"Tree with TPC tracks");
93     tracktree->Branch("tracks","AliTPCtrack",&tpctrack,20000,0);
94
95     // array for TPC tracks
96     TObjArray tarray(20000);
97
98
99     Int_t nparticles=gAlice->GetEvent(evt);   
100
101     Bool_t done[500000];
102     for(Int_t l=0; l<500000; l++) { done[l]=kFALSE; }
103
104
105     // Get TPC detector 
106     AliTPC *TPC=(AliTPC*)gAlice->GetDetector("TPC");
107     Int_t ver = TPC->IsVersion(); 
108     cerr<<"+++ TPC version "<<ver<<" has been found !\n";
109     AliTPCParam *digp=(AliTPCParam*)infile->Get("75x40_100x60");
110     if(!digp) { cerr<<"TPC parameters have not been found !\n"; return 1; }
111     TPC->SetParam(digp);
112
113     // Get TreeH with hits
114     TTree *TH=gAlice->TreeH(); 
115     Int_t ntracks=(Int_t)TH->GetEntries();
116     cerr<<"+++\n+++ Number of particles in event "<<evt<<":  "<<nparticles<<"\n+++\n+++ Number of \"primary tracks\" (entries in TreeH): "<<ntracks<<"\n+++\n\n";
117
118     TParticle* Part;
119     AliTPChit* tpcHit;
120     Double_t hPx,hPy,hPz,hPt,xg,yg,zg,xl,yl,zl;
121     Double_t Alpha;
122     Float_t cosAlpha,sinAlpha;
123     Int_t label,Pdg,charge,bin;
124     Int_t tracks=0;
125     //Int_t N1=0,N2=0;
126
127     // loop over entries in TreeH
128     for(Int_t i=0; i<ntracks; i++) {
129       if(i%1000==0) cerr<<"  --- Processing primary track "<<i<<" of "<<ntracks<<" ---\r";
130       TPC->ResetHits();
131       TH->GetEvent(i);
132       // Get FirstHit
133       tpcHit=(AliTPChit*)TPC->FirstHit(-1);
134       for( ; tpcHit; tpcHit=(AliTPChit*)TPC->NextHit() ) {
135         if(tpcHit->fQ !=0.) continue;
136         // Get particle momentum at hit
137         hPx=tpcHit->X(); hPy=tpcHit->Y(); hPz=tpcHit->Z();
138         hPt=TMath::Sqrt(hPx*hPx+hPy*hPy);
139         // reject hits with Pt<mag*0.45 GeV/c
140         if(hPt<(fBz*0.45)) continue;
141
142         // Get track label
143         label=tpcHit->Track();
144         // check if this track has already been processed
145         if(done[label]) continue;
146         // electric charge
147         Part = gAlice->Particle(label);
148         Pdg = Part->GetPdgCode();
149         if(Pdg>200 || Pdg==-11 || Pdg==-13) { charge=1; }
150         else if(Pdg<-200 || Pdg==11 || Pdg==13) { charge=-1; }
151         else continue;
152
153
154         if((tpcHit=(AliTPChit*)TPC->NextHit())==0) break;
155         if(tpcHit->fQ != 0.) continue;
156         // Get global coordinates of hit
157         xg=tpcHit->X(); yg=tpcHit->Y(); zg=tpcHit->Z();
158         if(TMath::Sqrt(xg*xg+yg*yg)>90.) continue;
159
160         // Get TPC sector, Alpha angle and local coordinates
161         // printf("Sector %d\n",tpcHit->fSector);
162         digp->AdjustCosSin(tpcHit->fSector,cosAlpha,sinAlpha);
163         Alpha = TMath::ATan2(sinAlpha,cosAlpha);
164         xl = xg*cosAlpha + yg*sinAlpha;
165         yl =-xg*sinAlpha + yg*cosAlpha;
166         zl = zg;
167         //printf("Alpha %f   xl %f  yl %f  zl %f\n",Alpha,xl,yl,zl);
168
169         // reject tracks which are not in the TPC acceptance
170         if(TMath::Abs(zl+(244.-xl)*hPz/hPt)>252.) continue;
171
172         // Get bin in pT,eta
173         bin = GetBin(hPt,Part->Eta());
174
175         // Apply selection according to TPC efficiency
176         //if(abs(Pdg)==211) N1++;
177         if(!SelectedTrack(Pdg,hPt,Part->Eta())) continue; 
178         //if(abs(Pdg)==211) N2++;
179
180         // Mark track as "done"
181         done[label]=kTRUE; tracks++;
182  
183         // create AliTPCtrack object
184         tpctrack = BuildTrack(Alpha,xl,yl,zl,hPx,hPy,hPz,hPt,charge,label);
185
186         // put track in array
187         tarray.AddLast(tpctrack);
188
189       }
190  
191     } // loop over entries in TreeH
192
193     TObjArray newtarray(20000);
194
195     // assing covariance matrixes and smear track parameters
196     CookTracks(tarray,newtarray);
197
198     // sort array with TPC tracks (decreasing pT)
199     newtarray.Sort();
200
201
202     Int_t arrentr = newtarray.GetEntriesFast();
203     //printf("\n  %d  \n\n",arrentr);
204     for(Int_t l=0; l<arrentr; l++) {
205       tpctrack=(AliTPCtrack*)newtarray.UncheckedAt(l);
206       tracktree->Fill();
207     }
208
209     // write the tree with tracks in the output file
210     out->cd();
211     tracktree->Write();
212
213     delete tracktree;
214
215     printf("\n\n+++\n+++ Number of TPC tracks: %d\n+++\n",tracks);
216     //printf("Average Eff: %f\n",(Float_t)N2/N1);
217
218   } // loop on events
219
220   return 0;
221 }
222
223 //-----------------------------------------------------------------
224 AliTPCtrack* AliTPCtrackerParam::BuildTrack(Double_t alpha,Double_t x,
225                                             Double_t y,Double_t z,Double_t Px,
226                                             Double_t Py,Double_t Pz,Double_t Pt,
227                                             Int_t ch,Int_t lab) 
228 {  
229   Double_t xref = x;
230   Double_t xx[5],cc[15];
231   cc[0]=cc[2]=cc[5]=cc[9]=cc[14]=10.;
232   cc[1]=cc[3]=cc[4]=cc[6]=cc[7]=cc[8]=cc[10]=cc[11]=cc[12]=cc[13]=0.;
233   
234   // Magnetic field
235   TVector3 Bfield(0.,0.,fBz);
236   
237   
238   // radius [cm] of track projection in (x,y) 
239   Double_t rho = Pt*100/0.299792458/Bfield.Z();
240   // center of track projection in local reference frame
241   TVector3 MomH,PosH;
242
243
244   // position (local) and momentum (local) at the hit
245   // in the bending plane (z=0)
246   PosH.SetXYZ(x,y,0.);
247   MomH.SetXYZ(Px*TMath::Cos(alpha)+Py*TMath::Sin(alpha),-Px*TMath::Sin(alpha)+Py*TMath::Cos(alpha),0.);
248   TVector3 Vrho = MomH.Cross(Bfield);
249   Vrho *= ch;
250   Vrho.SetMag(rho);
251
252   TVector3 Vcenter = PosH+Vrho;
253
254   Double_t x0 = Vcenter.X();
255
256   // fX     = xref         X-coordinate of this track (reference plane)
257   // fAlpha = Alpha        Rotation angle the local (TPC sector) 
258   // fP0    = YL           Y-coordinate of a track
259   // fP1    = ZG           Z-coordinate of a track
260   // fP2    = C*x0         x0 is center x in rotated frame
261   // fP3    = Tgl          tangent of the track momentum dip angle
262   // fP4    = C            track curvature
263   xx[0] = y;
264   xx[1] = z;
265   xx[3] = Pz/Pt;
266   xx[4] = -ch/rho;
267   xx[2] = xx[4]*x0;
268
269   // create the object AliTPCtrack    
270   AliTPCtrack* track = new AliTPCtrack(0,xx,cc,xref,alpha);
271   // set the label
272   track->SetLabel(lab);
273
274   return track;
275 }
276
277 //-----------------------------------------------------------------
278 Bool_t AliTPCtrackerParam::SelectedTrack(Int_t pdg,Double_t pt,Double_t eta) 
279 {
280   Double_t eff=0.;
281   
282   //eff computed with | zl+(244-xl)*pz/pt | < 252
283   Double_t effPi[27] = {0.724587,0.743389,0.619273,0.798477,0.812036,0.823195,0.771437,0.775826,0.784136,0.809071,0.762001,0.774576,0.848834,0.787201,0.792548,0.942089,0.951631,0.951085,0.960885,0.971451,0.969103,0.983245,0.978939,0.988706,0.990852,0.985679,0.993606};
284   Double_t effK[18]  = {0.377934,0.363962,0.321721,0.518784,0.547459,0.517878,0.612704,0.619101,0.620894,0.733411,0.732128,0.750373,0.790630,0.806565,0.791353,0.967486,0.970483,0.974527};
285   Double_t effP[15]  = {0.131173,0.165114,0.229658,0.365357,0.412989,0.483297,0.454614,0.505173,0.658615,0.694753,0.730661,0.815680,0.873461,0.887227,0.899324};
286   Double_t effEl[15] = {0.835549,0.853746,0.718207,0.835230,0.831489,0.862222,0.757783,0.747301,0.824096,0.867949,0.871891,0.808480,0.890625,0.911765,0.973684};
287   Double_t effMu[15] = {0.553486,0.641392,0.609932,0.591126,0.706729,0.750755,0.747952,0.729051,0.760849,0.898810,0.737500,0.830357,0.735294,0.800000,0.882353};
288  
289
290   if(TMath::Abs(pdg)==211)  eff = LinearInterpolation(9,effPi,pt,eta);
291   if(TMath::Abs(pdg)==321)  eff = LinearInterpolation(6,effK,pt,eta);
292   if(TMath::Abs(pdg)==2212) eff = LinearInterpolation(5,effP,pt,eta);
293   if(TMath::Abs(pdg)==11)   eff = LinearInterpolation(5,effEl,pt,eta);
294   if(TMath::Abs(pdg)==13)   eff = LinearInterpolation(5,effMu,pt,eta);
295
296   if(gRandom->Rndm() < eff) return kTRUE;
297
298   return kFALSE;
299 }
300
301 //-----------------------------------------------------------------
302 Double_t AliTPCtrackerParam::LinearInterpolation(Int_t ptBins,Double_t *value,
303                                                  Double_t pt,Double_t eta) 
304 {
305   Double_t kValue=0,kValue1=0,kValue2=0;
306   Int_t kEtaSide = (TMath::Abs(eta)<.45 ? 0 : 1);
307   Double_t kEta[3]={0.15,0.45,0.75};
308   Double_t kPt[9]={0.244,0.390,0.676,1.190,2.36,4.,6.,10.,20.};
309   if(ptBins==6) kPt[5]=10.;
310
311   for(Int_t i=0; i<ptBins; i++) {
312     if(pt<kPt[i]) {
313       if(i==0) i=1;
314       kValue1 = value[3*i-3+kEtaSide]+(value[3*i-3+kEtaSide]-value[3*i+kEtaSide])/(kPt[i-1]-kPt[i])*(pt-kPt[i-1]);
315       kValue2 = value[3*i-3+kEtaSide+1]+(value[3*i-3+kEtaSide+1]-value[3*i+kEtaSide+1])/(kPt[i-1]-kPt[i])*(pt-kPt[i-1]);
316
317       kValue = kValue1+(kValue1-kValue2)/(kEta[kEtaSide]-kEta[kEtaSide+1])*(eta-kEta[kEtaSide]);
318       break;
319     }
320     if(i==ptBins-1) { 
321       i=ptBins-2;
322       kValue1 = value[3*i-3+kEtaSide]+(value[3*i-3+kEtaSide]-value[3*i+kEtaSide])/(kPt[i-1]-kPt[i])*(pt-kPt[i-1]);
323       kValue2 = value[3*i-3+kEtaSide+1]+(value[3*i-3+kEtaSide+1]-value[3*i+kEtaSide+1])/(kPt[i-1]-kPt[i])*(pt-kPt[i-1]);
324
325       kValue = kValue1+(kValue1-kValue2)/(kEta[kEtaSide]-kEta[kEtaSide+1])*(eta-kEta[kEtaSide]);
326       break;
327     }
328   }
329
330   return kValue;
331 }
332
333 //-----------------------------------------------------------------
334 Int_t AliTPCtrackerParam::GetBin(Double_t pt,Double_t eta) {
335
336   if(TMath::Abs(eta)<0.3) {
337     if(pt<0.3)            return 0;
338     if(pt>=0.3 && pt<0.5) return 3;
339     if(pt>=0.5 && pt<1.)  return 6;
340     if(pt>=1. && pt<1.5)  return 9;
341     if(pt>=1.5 && pt<3.)  return 12;
342     if(pt>=3. && pt<5.)   return 15;
343     if(pt>=5. && pt<7.)   return 18;
344     if(pt>=7. && pt<15.)  return 21;
345     if(pt>=15.)           return 24;
346   }
347   if(TMath::Abs(eta)>=0.3 && TMath::Abs(eta)<0.6) {
348     if(pt<0.3)            return 1;
349     if(pt>=0.3 && pt<0.5) return 4;
350     if(pt>=0.5 && pt<1.)  return 7;
351     if(pt>=1. && pt<1.5)  return 10;
352     if(pt>=1.5 && pt<3.)  return 13;
353     if(pt>=3. && pt<5.)   return 16;
354     if(pt>=5. && pt<7.)   return 19;
355     if(pt>=7. && pt<15.)  return 22;
356     if(pt>=15.)           return 25;
357   }
358   if(TMath::Abs(eta)>=0.6) {
359     if(pt<0.3)            return 2;
360     if(pt>=0.3 && pt<0.5) return 5;
361     if(pt>=0.5 && pt<1.)  return 8;
362     if(pt>=1. && pt<1.5)  return 11;
363     if(pt>=1.5 && pt<3.)  return 14;
364     if(pt>=3. && pt<5.)   return 17;
365     if(pt>=5. && pt<7.)   return 20;
366     if(pt>=7. && pt<15.)  return 23;
367     if(pt>=15.)           return 26;
368   }
369
370   return -1;
371
372 }
373
374 //-----------------------------------------------------------------
375
376 TMatrixD AliTPCtrackerParam::GetSmearingMatrix(Double_t* cc,Double_t pt,Double_t eta) 
377 {
378   TMatrixD CovMat(5,5);
379
380   CovMat(0,0)=cc[0];
381   CovMat(1,0)=cc[1];  CovMat(0,1)=CovMat(1,0);
382   CovMat(1,1)=cc[2];
383   CovMat(2,0)=cc[3];  CovMat(0,2)=CovMat(2,0);
384   CovMat(2,1)=cc[4];  CovMat(1,2)=CovMat(2,1);
385   CovMat(2,2)=cc[5];
386   CovMat(3,0)=cc[6];  CovMat(0,3)=CovMat(3,0);
387   CovMat(3,1)=cc[7];  CovMat(1,3)=CovMat(3,1);
388   CovMat(3,2)=cc[8];  CovMat(2,3)=CovMat(3,2);
389   CovMat(3,3)=cc[9];
390   CovMat(4,0)=cc[10]; CovMat(0,4)=CovMat(4,0);
391   CovMat(4,1)=cc[11]; CovMat(1,4)=CovMat(4,1);
392   CovMat(4,2)=cc[12]; CovMat(2,4)=CovMat(4,2);
393   CovMat(4,3)=cc[13]; CovMat(3,4)=CovMat(4,3);
394   CovMat(4,4)=cc[14];
395
396   TMatrixD ScaleMat(5,5);
397   for(Int_t k=0;k<5;k++) {
398     for(Int_t l=0;l<5;l++) {
399       ScaleMat(k,l)=0.;
400     }
401   }
402
403   
404   Double_t s00[27]={1.3553,1.2973,1.2446,1.3428,1.3031,1.2345,1.3244,1.2681,1.2046,1.3046,1.2430,1.1606,1.2462,1.2104,1.1082,1.2207,1.1189,1.0789,1.2079,1.1300,1.0426,1.1502,1.1122,1.0559,1.1419,1.1072,1.0208};
405   Double_t s11[27]={1.0890,1.1463,1.2313,1.1149,1.1597,1.2280,1.1225,1.1584,1.2329,1.1149,1.1550,1.2369,1.1095,1.1353,1.2050,1.0649,1.0858,1.1546,1.0663,1.0672,1.1340,1.0416,1.0738,1.0945,1.0663,1.0654,1.0909};
406   Double_t s22[27]={1.1709,1.1367,1.0932,1.2247,1.1832,1.1247,1.2470,1.2017,1.1441,1.2202,1.1653,1.1050,1.1819,1.1269,1.0583,1.1546,1.0621,0.9928,1.1305,1.0512,0.9576,1.0995,1.0445,0.9884,1.0968,1.0368,0.9574};
407   Double_t s33[27]={0.9720,0.9869,1.0271,1.0030,1.0223,1.0479,1.0164,1.0305,1.0559,1.0339,1.0450,1.0686,1.0450,1.0507,1.0784,1.0334,1.0208,1.0863,1.0252,1.0114,1.0835,0.9854,1.0144,1.0507,1.0124,1.0159,1.0464};
408   Double_t s44[27]={1.1104,1.0789,1.0479,1.1597,1.1234,1.0728,1.2087,1.1602,1.1041,1.1942,1.1428,1.0831,1.1572,1.1036,1.0431,1.1296,1.0498,0.9844,1.1145,1.0266,0.9489,1.0959,1.0450,0.9875,1.0775,1.0266,0.9406};
409
410
411   ScaleMat(0,0) = LinearInterpolation(9,s00,pt,eta); 
412   ScaleMat(1,1) = LinearInterpolation(9,s11,pt,eta); 
413   ScaleMat(2,2) = LinearInterpolation(9,s22,pt,eta); 
414   ScaleMat(3,3) = LinearInterpolation(9,s33,pt,eta); 
415   ScaleMat(4,4) = LinearInterpolation(9,s44,pt,eta); 
416
417   TMatrixD Mat(ScaleMat,TMatrixD::kMult,CovMat);
418   TMatrixD CovMatSmear(Mat,TMatrixD::kMult,ScaleMat);
419
420
421   return CovMatSmear;
422 }
423
424 //-----------------------------------------------------------------
425 void AliTPCtrackerParam::SmearTrack(Double_t* xx,Double_t* xxsm,TMatrixD cov) {
426
427   // build triangular matrix Bmat
428   TMatrixD* Bmat = new TMatrixD(5,5);
429
430   for(Int_t j=0;j<5;j++){
431     Double_t accum = 0;
432     for(Int_t k=0;k<j;k++){
433       accum += (*Bmat)(j,k)* (*Bmat)(j,k);
434     }
435     (*Bmat)(j,j)=TMath::Sqrt(TMath::Abs(cov(j,j)-accum));
436     for(Int_t i=j+1;i<5;i++){
437       accum = 0;
438       for(Int_t k=0;k<j;k++){
439         accum+=(*Bmat)(i,k)* (*Bmat)(j,k);
440       }
441       (*Bmat)(i,j) = (cov(i,j)-accum) / (*Bmat)(j,j);
442     }
443   }
444
445   // get array of numbers with normal distribution
446   TArrayD norm;
447   norm.Set(5);
448   for(Int_t l=0;l<5;l++) {
449     norm[l]=gRandom->Gaus();
450   }
451
452   // use Bmat matrix to generate correlated numbers
453   TArrayD corr;
454   corr.Set(5);
455   for(Int_t i=0;i<5;i++){
456     corr[i]=0;
457     for(Int_t j=0;j<=i;j++) corr[i] += (*Bmat)(i,j)*norm[j];
458   }
459
460   delete Bmat;
461
462   for(Int_t l=0;l<5;l++) {
463     xxsm[l] = xx[l]+corr[l];
464   }
465
466   return;
467 }
468
469 //-----------------------------------------------------------------
470 void AliTPCtrackerParam::CookTracks(TObjArray& tarray,TObjArray& newtarray) 
471 {
472   TString* s = new TString("$ALICE_ROOT/TPC/CovMatrixDB_");
473   if(fColl==0) s->Append("PbPb6000");
474   if(fBz==0.4) s->Append("_B0.4T.root");  
475   // open file with matrixes DB
476   TFile* DBfile = new TFile(s->Data());  
477
478   AliTPCtrack* track=new AliTPCtrack;
479   Int_t entr = (Int_t)tarray.GetEntriesFast();
480
481   for(Int_t k=0; k<entr; k++) {
482     track=(AliTPCtrack*)tarray.UncheckedAt(k);  
483
484     Double_t pt = 1/TMath::Abs(track->Get1Pt());
485     Double_t eta = -TMath::Log(TMath::Tan(0.25*TMath::Pi()-0.5*TMath::ATan(track->GetTgl())));
486
487     Int_t bin = GetBin(pt,eta);
488
489     // string with tree name
490     TString str("Tree_bin");
491     str+=bin;
492  
493     // get the right tree
494     TTree* CovTree = (TTree*)DBfile->Get(str.Data());
495     TArrayF* matrix = new TArrayF; 
496     CovTree->SetBranchAddress("matrixes",&matrix);
497
498     // get random entry from the tree
499     Int_t Entries = (Int_t)CovTree->GetEntries();
500     CovTree->GetEvent(gRandom->Integer(Entries));
501
502     Double_t xref,alpha,xx[5],xxsm[5],cc[15];
503     Int_t lab;
504     // get P and Cosl from track
505     Double_t Cosl = TMath::Cos(TMath::ATan(track->GetTgl()));
506     Double_t P = 1/TMath::Abs(track->Get1Pt())/Cosl;
507     
508     // get covariance matrix from regularized matrix
509     cc[0]=matrix->At(0)*(1.588e-3+1.911e-4/TMath::Power(P,1.5));
510     cc[1]=matrix->At(1);
511     cc[2]=matrix->At(2)*(1.195e-3+0.8102e-3/P);
512     cc[3]=matrix->At(3)*(7.275e-5+1.181e-5/TMath::Power(P,1.5));
513     cc[4]=matrix->At(4);
514     cc[5]=matrix->At(5)*(5.163e-6+1.138e-6/TMath::Power(P,2.)/Cosl);
515     cc[6]=matrix->At(6);
516     cc[7]=matrix->At(7)*(1.176e-5+1.175e-5/TMath::Power(P,1.5)/Cosl/Cosl/Cosl);
517     cc[8]=matrix->At(8);
518     cc[9]=matrix->At(9)*(1.289e-7+4.636e-7/TMath::Power(P,1.7)/Cosl/Cosl/Cosl/Cosl);
519     cc[10]=matrix->At(10)*(4.056e-7+4.379e-8/TMath::Power(P,1.5));
520     cc[11]=matrix->At(11);
521     cc[12]=matrix->At(12)*(3.049e-8+8.244e-9/TMath::Power(P,2.)/Cosl);
522     cc[13]=matrix->At(13);
523     cc[14]=matrix->At(14)*(1.847e-10+5.822e-11/TMath::Power(P,2.)/Cosl/Cosl/Cosl);
524   
525     TMatrixD CovMatSmear(5,5);
526     
527     CovMatSmear = GetSmearingMatrix(cc,pt,eta);
528
529     // get track original parameters
530     xref=track->GetX();
531     alpha=track->GetAlpha();
532     xx[0]=track->GetY();
533     xx[1]=track->GetZ();
534     xx[2]=track->GetX()*track->GetC()-track->GetSnp();
535     xx[3]=track->GetTgl();
536     xx[4]=track->GetC();
537     lab=track->GetLabel();
538
539     // use smearing matrix to smear the original parameters
540     SmearTrack(xx,xxsm,CovMatSmear);
541
542     AliTPCtrack* tpctrack = new AliTPCtrack(0,xxsm,cc,xref,alpha);
543     tpctrack->SetLabel(lab);
544
545     // fill the array
546     newtarray.AddLast(tpctrack);
547   
548   }
549
550   DBfile->Close();
551
552   return; 
553 }
554 //-----------------------------------------------------------------
555
556
557
558
559
560
561
562
563
564
565
566