2 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
3 // It contain all the usefull information for the track and the method to calculate, modify or extract them
4 // The track is mainly caracterized by the state vector of elements (fX0, fX1, fX2, fX3, fX4) and the
5 // corresponding covariance matrix of elements (C00, C10, ..... C44) that is triangular
10 #include <TObjArray.h>
12 #include "AliITSRad.h"
13 #include "AliITSTrackV1.h"
14 #include "AliGenerator.h"
15 //#include "AliMagF.h"
18 ClassImp(AliITSTrackV1)
20 AliITSTrackV1::AliITSTrackV1() {
21 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
22 // default constructor
25 fC00=fC10=fC11=fC20=fC21=fC22=fC30=fC31=fC32=fC33=fC40=fC41=fC42=fC43=fC44=0.;
34 fMass=0.13956995; //a pion by default
38 AliITSTrackV1::AliITSTrackV1(const char *opt, Double_t fieldfactor) {
39 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
40 // default constructor
43 fC00=fC10=fC11=fC20=fC21=fC22=fC30=fC31=fC32=fC33=fC40=fC41=fC42=fC43=fC44=0.;
49 fErrorVertex.ResizeTo(3);
57 fMass=0.13956995; //a pion by default
59 //////////////////////////////////////// gets magnetic field factor ////////////////////////////////
61 // AliMagF * fieldPointer = gAlice->Field();
62 // fFieldFactor =(Double_t)fieldPointer-> SolenoidField()/10/.2;
63 fFieldFactor = fieldfactor;
64 //cout<< " field factor = "<<fFieldFactor<<"\n"; getchar();
66 /////////////////////////////////////////////////////////////////////////////////////////////////////////
72 AliITSTrackV1::AliITSTrackV1(const AliITSTrackV1 &cobj) {
73 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
76 fClusterInTrack = new TMatrix(6,9);
79 for(j=0; j<9; j++) (*fClusterInTrack)(i,j)=-1.;
81 flistCluster = new TObjArray;
83 fErrorVertex.ResizeTo(3);
84 fVertex = cobj.fVertex;
85 fErrorVertex = cobj.fErrorVertex;
88 fTPCtrack = cobj.fTPCtrack;
89 fNumClustInTrack = cobj.fNumClustInTrack;
91 fX0=cobj.fX0; fX1=cobj.fX1; fX2=cobj.fX2; fX3=cobj.fX3; fX4=cobj.fX4;
95 fsigmaDv=cobj.fsigmaDv;
96 fsigmaZv=cobj.fsigmaZv;
103 fnoclust=cobj.fnoclust;
105 fC00=cobj.fC00; fC10=cobj.fC10; fC11=cobj.fC11; fC20=cobj.fC20; fC21=cobj.fC21;
106 fC22=cobj.fC22; fC30=cobj.fC30; fC31=cobj.fC31; fC32=cobj.fC32; fC33=cobj.fC33;
107 fC40=cobj.fC40; fC41=cobj.fC41; fC42=cobj.fC42; fC43=cobj.fC43; fC44=cobj.fC44;
109 *fClusterInTrack = *cobj.fClusterInTrack;
111 fFieldFactor=cobj.fFieldFactor;
114 for(i=0; i<cobj.flistCluster->GetSize(); i++)
115 flistCluster->AddLast(cobj.flistCluster->At(i));
119 AliITSTrackV1::AliITSTrackV1(AliTPCtrack &obj, Double_t fieldfactor)
121 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
122 // special constructor to convert a TPC track into an ITS track
124 //////////////////////////////////////// gets magnetic field factor ////////////////////////////////
126 // AliMagF * fieldPointer = gAlice->Field();
127 // fFieldFactor =(Double_t)fieldPointer-> SolenoidField()/10/.2;
128 fFieldFactor = fieldfactor;
129 // cout<< " field factor dentro alitrack = "<<fFieldFactor<<"\n";/* getchar();*/
131 /////////////////////////////////////////////////////////////////////////////////////////////////////////
136 fErrorVertex.ResizeTo(3);
141 AliGenerator *gener = gAlice->Generator();
143 gener->GetOrigin(vxg,vyg,vzg);
146 fVertex(0)=(Double_t)vxg;
147 fVertex(1)=(Double_t)vyg;
148 fVertex(2)=(Double_t)vzg;
151 fClusterInTrack = new TMatrix(6,9);
155 for(j=0; j<9; j++) (*fClusterInTrack)(i,j)=-1.;
157 flistCluster = new TObjArray;
158 fNumClustInTrack = 0;
165 AliITSTrackV1::~AliITSTrackV1() {
166 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
170 flistCluster->Delete();
173 if(fClusterInTrack) delete fClusterInTrack;
177 void AliITSTrackV1::PutCElements(Double_t C00, Double_t C10, Double_t C11, Double_t C20, Double_t C21,
178 Double_t C22, Double_t C30, Double_t C31, Double_t C32, Double_t C33, Double_t C40,
179 Double_t C41, Double_t C42, Double_t C43, Double_t C44){
180 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
181 // puts elements of covariance matrix
183 fC00=C00; fC10=C10; fC11=C11; fC20=C20; fC21=C21; fC22=C22; fC30=C30; fC31=C31; fC32=C32; fC33=C33;
184 fC40=C40; fC41=C41; fC42=C42; fC43=C43; fC44=C44;
187 void AliITSTrackV1::GetCElements(Double_t &C00, Double_t &C10, Double_t &C11, Double_t &C20, Double_t &C21,
188 Double_t &C22, Double_t &C30, Double_t &C31, Double_t &C32, Double_t &C33, Double_t &C40,
189 Double_t &C41, Double_t &C42, Double_t &C43, Double_t &C44) const {
190 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
191 // gets elements of covariance matrix
194 C00=fC00; C10=fC10; C11=fC11; C20=fC20; C21=fC21; C22=fC22; C30=fC30; C31=fC31; C32=fC32; C33=fC33;
195 C40=fC40; C41=fC41; C42=fC42; C43=fC43; C44=fC44;
199 void AliITSTrackV1::GetXElements(Double_t &X0, Double_t &X1, Double_t &X2, Double_t &X3, Double_t &X4) const {
200 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
201 // gets the elements of the state vector
202 X0=fX0; X1=fX1; X2=fX2; X3=fX3; X4=fX4;
205 void AliITSTrackV1::PutXElements(Double_t X0, Double_t X1, Double_t X2, Double_t X3, Double_t X4){
206 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
207 // puts the elements of the state vector
208 fX0=X0; fX1=X1; fX2=X2; fX3=X3; fX4=X4;
211 void AliITSTrackV1::LmTPC() {
212 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
213 // Transform the TPC state vector from TPC-local to master and build a new state vector ITS-type
214 // The covariance matrix is also modified accordingly
217 Double_t alpha = fTPCtrack->GetAlpha();
219 //printf("LmTPC: alpha %f\n",alpha);
221 Double_t yTPC = fTPCtrack->GetY();
222 Double_t zTPC = fTPCtrack->GetZ();
223 Double_t cTPC = fTPCtrack->GetC();
224 Double_t etaTPC = fTPCtrack->GetEta();
225 Double_t tglTPC = fTPCtrack->GetTgl();
229 Double_t sina = TMath::Sin(alpha);
230 Double_t cosa = TMath::Cos(alpha);
231 Double_t xl= fTPCtrack->GetX();
232 xm = xl * cosa - yTPC*sina;
233 ym = xl * sina + yTPC*cosa;
235 //cout<<" xl e alpha = "<<xl<<" "<<alpha<<"\n"; getchar();
239 ///////////////////////////////////// determine yo //////////////////////////////////////////////////
241 Double_t vxl=fVertex(0)*cosa+fVertex(1)*sina;
242 Double_t vyl= -fVertex(0)*sina+fVertex(1)*cosa;
243 Double_t xo,yo, signy;
244 Double_t r = 1./cTPC;
246 Double_t yo1, yo2, diffsq1, diffsq2;
247 yo1 = yTPC + TMath::Sqrt(r*r - (xl-xo)*(xl-xo));
248 yo2 = yTPC - TMath::Sqrt(r*r - (xl-xo)*(xl-xo));
249 diffsq1=TMath::Abs((yo1-vyl)*(yo1-vyl)+(xo-vxl)*(xo-vxl)-r*r);
250 diffsq2=TMath::Abs((yo2-vyl)*(yo2- vyl)+(xo-vxl)*(xo-vxl)-r*r);
251 if(diffsq1<diffsq2) {yo=yo1; signy=1.;} else {yo=yo2; signy=-1.;};
253 ////////////////////////////////////////////////////////////////////////////////////////////////////
255 x0m = xo * cosa - yo * sina;
256 y0m = xo * sina + yo * cosa;
258 frtrack=TMath::Sqrt(xm*xm+ym*ym);
260 Double_t phi=TMath::ATan2(ym,xm); if(phi<0) phi=2.*TMath::Pi()+phi;
268 Double_t dd=TMath::Sqrt((x0m-fVertex(0))*(x0m-fVertex(0))+(y0m-fVertex(1))*(y0m-fVertex(1)));
270 if (r>0) signdd=1.; else signdd=-1.;
272 //cout<<" fvertex = "<<fVertex(0)<<" "<<fVertex(1)<<" "<<fVertex(2)<<"\n";
275 fTPCtrack->GetCovariance(cov);
277 Double_t dfidy, dDdy, dDdC, dDdeta;
279 dfidy=(xm*cosa+ym*sina)/(frtrack*frtrack);
280 dDdy=signdd*((y0m-fVertex(1))*cosa-(x0m-fVertex(0))*sina)/dd;
281 Double_t dyodr=signy*(r+(xl-xo)*etaTPC)/TMath::Sqrt(r*r-(xl-xo)*(xl-xo));
282 Double_t dyomdr=sina*etaTPC+cosa*dyodr;
283 Double_t dxomdr=cosa*etaTPC-sina*dyodr;
284 Double_t ddddR=((x0m-fVertex(0))*dxomdr+(y0m-fVertex(1))*dyomdr)/dd;
285 dDdC=-r*r*(signdd*ddddR-1.);
286 Double_t dyoldxol=signy*(xl-xo)/TMath::Sqrt(r*r-(xl-xo)*(xl-xo));
287 Double_t dxomdeta=r*(cosa-sina*dyoldxol);
288 Double_t dyomdeta=r*(sina+cosa*dyoldxol);
289 dDdeta=signdd*((x0m-fVertex(0))*dxomdeta+(y0m-fVertex(1))*dyomdeta)/dd;
296 Double_t t00=cov[0]*f00;
297 Double_t t02=cov[0]*f20+cov[6]*f22+cov[3]*f23;
298 Double_t t20=cov[6]*f00;
299 Double_t t22=cov[6]*f20+cov[9]*f22+cov[8]*f23;
304 fC20=f20*t00+f22*t20+f23*cov[3]*f00;
305 fC21=f20*cov[1]+f22*cov[7]+f23*cov[4];
306 fC22=f20*t02+f22*t22+f23*(cov[3]*f20+cov[8]*f22+cov[5]*f23);
309 fC32=cov[10]*f20+cov[13]*f22+cov[12]*f23;
321 AliITSTrackV1 &AliITSTrackV1::operator=(AliITSTrackV1 obj) {
322 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
323 // assignement operator
326 flistCluster->Delete();
329 delete fClusterInTrack;
330 fClusterInTrack = new TMatrix(6,9);
331 flistCluster = new TObjArray;
333 fTPCtrack = obj.fTPCtrack;
334 fNumClustInTrack = obj.fNumClustInTrack;
337 fErrorVertex=obj.fErrorVertex;
338 fX0=obj.fX0; fX1=obj.fX1; fX2=obj.fX2; fX3=obj.fX3; fX4=obj.fX4;
343 fsigmaDv=obj.fsigmaDv;
344 fsigmaZv=obj.fsigmaZv;
348 fnoclust=obj.fnoclust;
350 fC00=obj.fC00; fC10=obj.fC10; fC11=obj.fC11; fC20=obj.fC20; fC21=obj.fC21;
351 fC22=obj.fC22; fC30=obj.fC30; fC31=obj.fC31; fC32=obj.fC32; fC33=obj.fC33;
352 fC40=obj.fC40; fC41=obj.fC41; fC42=obj.fC42; fC43=obj.fC43; fC44=obj.fC44;
356 *fClusterInTrack = *obj.fClusterInTrack;
358 for(i=0; i<obj.flistCluster->GetSize(); i++) flistCluster->AddLast(obj.flistCluster->At(i));
364 void AliITSTrackV1::PutCluster(Int_t layerc, TVector vecclust) {
365 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
366 // put information for clusters
368 (*fClusterInTrack)(layerc,0) = vecclust(0);
369 (*fClusterInTrack)(layerc,1) = vecclust(1);
370 (*fClusterInTrack)(layerc,2) = vecclust(2);
371 (*fClusterInTrack)(layerc,3) = vecclust(3);
372 (*fClusterInTrack)(layerc,4) = vecclust(4);
373 (*fClusterInTrack)(layerc,5) = vecclust(5);
374 (*fClusterInTrack)(layerc,6) = vecclust(6);
375 (*fClusterInTrack)(layerc,7) = vecclust(7);
376 (*fClusterInTrack)(layerc,8) = vecclust(8);
381 void AliITSTrackV1::GetClusters() {
382 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
383 // prints the clusters belonging to the current track
385 TMatrix a(*fClusterInTrack);
389 b(i,0)=a(i,6); b(i,1)=a(i,7); b(i,2)=a(i,8);
397 TVector AliITSTrackV1::GetLabTrack(Int_t lay) {
398 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
399 // gets the label of the track
402 vecLabel(0)=( (Float_t) (*fClusterInTrack)(lay,6) );
403 vecLabel(1)=( (Float_t) (*fClusterInTrack)(lay,7) );
404 vecLabel(2)=( (Float_t) (*fClusterInTrack)(lay,8) );
408 void AliITSTrackV1::Search(TVector VecTotLabref, Long_t &labref, Int_t &freq){
409 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
415 for(i=0; i<18; i++) vecfreq[i]=0;
417 for(i=0; i<18; i++) {
418 for(j=0; j<18; j++) {
419 // if(VecTotLabref(i) == 0.) VecTotLabref(i)=-3.; //commentato il 5-3-2001
420 if( (VecTotLabref(i)>=0.) && (VecTotLabref(i)==VecTotLabref(j)) ) vecfreq[i]++;
424 Long_t labdefault= (Long_t)1000000.;
426 for(i=0; i<18; i++) {
427 if(vecfreq[i]>freq) {freq=vecfreq[i]; imax=i;}
429 if(imax<0) labref=labdefault; else labref=(Long_t) VecTotLabref(imax);
433 void AliITSTrackV1::Propagation(Double_t rk) {
434 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
435 //Propagation of track
436 Double_t duepi=2.*TMath::Pi();
437 Double_t rkm1=frtrack;
438 //cout<<" rk e rkm1 dentro Propagation "<<rk<<" "<<rkm1<<"\n";
441 Double_t aAk=ArgA(rk), aAkm1=ArgA(rkm1);
442 Double_t ak=Arga(rk), akm1=Arga(rkm1);
443 fX0+=TMath::ASin(aAk)-TMath::ASin(aAkm1);
445 if(fX0>duepi) fX0-=duepi;
446 if(fX0<0.) fX0+=duepi;
452 fX1+=tgl/cy*(TMath::ASin(ak)-TMath::ASin(akm1));
456 Double_t bk=ArgB(rk), bkm1=ArgB(rkm1);
457 Double_t ck=ArgC(rk), ckm1=ArgC(rkm1);
459 Double_t f02=ck/TMath::Sqrt(1.-aAk*aAk) - ckm1/TMath::Sqrt(1.-aAkm1*aAkm1);
460 Double_t f04=bk/TMath::Sqrt(1.-aAk*aAk) - bkm1/TMath::Sqrt(1.-aAkm1*aAkm1);
461 Double_t f12=tgl*d*(1./rk - 1./rkm1);
462 Double_t f13=rk - rkm1;
481 Double_t r10=c10+c21*f02+c41*f04;
482 Double_t r20=c20+c22*f02+c42*f04;
483 Double_t r30=c30+c32*f02+c43*f04;
484 Double_t r40=c40+c42*f02+c44*f04;
485 Double_t r21=c21+c22*f12+c32*f13;
486 Double_t r31=c31+c32*f12+c33*f13;
487 Double_t r41=c41+c42*f12+c43*f13;
489 fC00=c00+c20*f02+c40*f04+f02*r20+f04*r40;
490 fC10=r10+f12*r20+f13*r30;
491 fC11=c11+c21*f12+c31*f13+f12*r21+f13*r31;
501 void AliITSTrackV1::AddEL(AliITSRad *rl, Double_t signdE, Bool_t flagtot, Double_t mass) {
502 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
508 s(0)=0.0026+0.00283; s(1)=0.018; s(2)=0.0094; s(3)=0.0095; s(4)=0.0091; s(5)=0.0087;
509 //s(0)=0.0026+0.00283*2.; s(1)=0.018*2.; s(2)=0.0094; s(3)=0.0095; s(4)=0.0091; s(5)=0.0087;
510 //0.00277 is added in the first layer to take into account the energy loss in the beam pipe
512 //for(int k=0; k<6; k++) cout<<s(k)<<" "; cout<<"\n";
514 //for(k=0; k<6; k++) s(k)=s(k)*1.6; //forint
515 for(k=0; k<6; k++) s(k)=s(k)*1.7; //forint
519 if(phi<0.174 ) s(5)=s(5)+0.012;
520 if(phi>6.1 ) s(5)=s(5)+0.012; // to take into account rail
521 if(phi>2.96 && phi<3.31 ) s(5)=s(5)+0.012;
525 Double_t theta=((TMath::Pi())/2.)-TMath::ATan(tgl);
526 //phi*=180./TMath::Pi();
527 //theta*=180./TMath::Pi();
528 //Double_t rad90=(TMath::Pi())/2.;
529 Double_t rad40=(TMath::Pi())*40./180.;
530 Double_t rad100=(TMath::Pi())*100/180;
531 Double_t rad360=(TMath::Pi())*2.;
532 Int_t imax=rl->Getimax();
533 Int_t jmax=rl->Getjmax();
534 Int_t i=(Int_t) ( (theta-rad40)/rad100*imax);
535 Int_t j=(Int_t) ( phi/rad360*jmax );
536 //Int_t i=(Int_t)( ((theta-((TMath::Pi())/4.))/((TMath::Pi())/2.))*imax );
537 //Int_t j=(Int_t)( (phi/((TMath::Pi())*2.))*jmax );
539 if(i>=imax) i=imax-1;
541 if(j>=jmax) j=jmax-1;
543 s(0) = 0.0028/TMath::Sin(theta)+( rl->GetRadMatrix1() )(i,j); // 0.0028 takes into account the beam pipe
544 s(1) = ( rl->GetRadMatrix2() )(i,j);
545 s(2) = ( rl->GetRadMatrix3() )(i,j);
546 s(3) = ( rl->GetRadMatrix4() )(i,j);
547 s(4) = ( rl->GetRadMatrix5() )(i,j);
548 s(5) = ( rl->GetRadMatrix6() )(i,j);
553 //for(int k=0; k<6; k++) cout<<s(k)<<" "; getchar();
555 //if(phi>60) {cout<<" phi = "<<phi<<"\n"; getchar();}
556 //if(theta<45 || theta>135) {cout<<" theta = "<<theta<<"\n"; getchar();}
557 //cout<<" dentro AddEl: phi, theta = "<<phi<<" "<<theta<<"\n"; getchar();
559 Double_t cl=1.+fX3*fX3; // cl=1/(cosl)**2 = 1 + (tgl)**2
560 Double_t sqcl=TMath::Sqrt(cl);
563 Double_t p2=pt*pt*cl;
564 Double_t e=TMath::Sqrt(p2+mass*mass);
565 Double_t beta2=p2/(p2+mass*mass);
569 Double_t stot=s(0)+s(1)+s(2)+s(3)+s(4)+s(5);
570 dE=0.153/beta2*(log(5940*beta2/(1-beta2)) - beta2)*stot*21.82*sqcl;
572 dE=0.153/beta2*(log(5940*beta2/(1-beta2)) - beta2)*s(fLayer-1)*21.82*sqcl;
577 Double_t p=TMath::Sqrt(e*e-mass*mass);
579 if(fX4 < 0.) sign=-1.;
581 Double_t cc=(0.299792458*0.2*fFieldFactor)/(pt*100.);
586 void AliITSTrackV1::Correct(Double_t rk) {
587 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
588 // correct track to take into account real geometry detector
590 Double_t duepi=2.*TMath::Pi();
591 Double_t rkm1=frtrack;
592 Double_t aAk=ArgA(rk), aAkm1=ArgA(rkm1);
593 Double_t ak=Arga(rk), akm1=Arga(rkm1);
595 fX0+=TMath::ASin(aAk)-TMath::ASin(aAkm1);
596 if(fX0>duepi) fX0-=duepi;
597 if(fX0<0.) fX0+=duepi;
602 fX1+=tgl/cy*(TMath::ASin(ak)-TMath::ASin(akm1));
607 void AliITSTrackV1::AddMS(AliITSRad *rl, Double_t mass) {
608 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
609 ////////// Modification of the covariance matrix to take into account multiple scattering ///////////
615 s(0)=0.0026+0.00283; s(1)=0.018; s(2)=0.0094; s(3)=0.0095; s(4)=0.0091; s(5)=0.0087;
616 // s(0)=0.0026+0.00283*2.; s(1)=0.018*2.; s(2)=0.0094; s(3)=0.0095; s(4)=0.0091; s(5)=0.0087;
617 //0.00277 is added in the first layer to take into account the energy loss in the beam pipe
620 //for(k=0; k<6; k++) s(k)=s(k)*1.6; // forint
621 for(k=0; k<6; k++) s(k)=s(k)*1.7; // forint
624 if(phi<0.174 ) s(5)=s(5)+0.012; //aggiunta provvisoria
625 if(phi>6.1 ) s(5)=s(5)+0.012; //aggiunta provvisoria
626 if(phi>2.96 && phi< 3.31) s(5)=s(5)+0.012; //aggiunta provvisoria
631 Double_t theta=((TMath::Pi())/2.)-TMath::ATan(tgl);
632 Double_t rad40=(TMath::Pi())*40./180.; // rivedere
633 Double_t rad100=(TMath::Pi())*100/180;
634 Double_t rad360=(TMath::Pi())*2.;
635 Int_t imax=rl->Getimax();
636 Int_t jmax=rl->Getjmax();
637 Int_t i=(Int_t) ( (theta-rad40)/rad100*imax);
638 Int_t j=(Int_t) ( phi/rad360*jmax);
641 if(i>=imax) i=imax-1;
643 if(j>=jmax) j=jmax-1;
645 s(0) = 0.0028/TMath::Sin(theta)+( rl->GetRadMatrix1() )(i,j); // 0.0028 takes into account the beam pipe
646 s(1) = ( rl->GetRadMatrix2() )(i,j);
647 s(2) = ( rl->GetRadMatrix3() )(i,j);
648 s(3) = ( rl->GetRadMatrix4() )(i,j);
649 s(4) = ( rl->GetRadMatrix5() )(i,j);
650 s(5) = ( rl->GetRadMatrix6() )(i,j);
652 //Double_t mass=0.1396;
653 Int_t layer=(Int_t)GetLayer();
655 Double_t cosl=TMath::Cos(TMath::ATan(tgl));
659 Double_t q20=1./(cosl*cosl);
662 Double_t q40=cy*(frtrack*frtrack-d*d)/(1.+ 2.*cy*d);
663 Double_t dd=d+cy*d*d-cy*frtrack*frtrack;
664 Double_t dprova=frtrack*frtrack - dd*dd;
666 if(dprova>0.) q41=-1./cosl*TMath::Sqrt(dprova)/(1.+ 2.*cy*d);
668 Double_t p2=(GetPt()*GetPt())/(cosl*cosl);
669 Double_t beta2=p2/(p2+mass*mass);
670 // Double_t theta2=14.1*14.1/(beta2*p2*1.e6)*(s(layer-1)/cosl);
671 Double_t theta2=14.1*14.1/(beta2*p2*1.e6)*(s(layer-1)/TMath::Abs(cosl));
673 fC22+=theta2*(q40*q40+q41*q41);
674 fC32+=theta2*q20*q40;
675 fC33+=theta2*q20*q20;
676 fC42+=theta2*q30*q40;
677 fC43+=theta2*q30*q20;
678 fC44+=theta2*q30*q30;
681 void AliITSTrackV1::PrimaryTrack(AliITSRad *rl) {
682 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
683 // calculation of part of covariance matrix for vertex constraint
687 rlayer[0]=4.; rlayer[1]=7.; rlayer[2]=14.9; rlayer[3]=23.8;
688 rlayer[4]=39.1; rlayer[5]=43.6;
691 Double_t tgl=(fX1-fZv)*cy/TMath::ASin(cy*frtrack);
698 fC00=fC10=fC11=fC20=fC21=fC22=fC30=fC31=fC32=fC33=fC40=fC41=fC42=fC43=0.;
703 for (i=0; i<6; i++) {
704 Propagation(rlayer[i]);
715 Int_t AliITSTrackV1::DoNotCross(Double_t rk) const{
716 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
717 // determine if the track cross a layer
722 return (TMath::Abs((cy*rk+(1.+cy*d)*d/rk)/(1.+2.*cy*d))>=1.)?1:0;
726 Double_t AliITSTrackV1::ArgA(Double_t rk) const {
727 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
728 // quantity usefull in Propagation
732 Double_t arg=(cy*rk + (1 + cy*d)*d/rk)/(1.+ 2.*cy*d);
733 if (TMath::Abs(arg) < 1.) return arg;
734 //cout<<"class AliITSTrack: ArgA out of range !\n";/* getchar();*/
735 return (arg>0) ? 0.99999999999 : -0.9999999999;
738 Double_t AliITSTrackV1::Arga(Double_t rk) const {
739 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
740 // quantity usefull in Propagation
744 Double_t arg=(rk*rk - d*d)/(1.+ 2.*cy*d);
745 if (arg<0.) {/*cout<<"class AliITSTrack: Arga out of range !\n";*/ arg=0.;}
746 return cy*TMath::Sqrt(arg);
749 Double_t AliITSTrackV1::ArgB(Double_t rk) const {
750 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
751 // quantity usefull in Propagation
755 return (rk*rk - d*d)/(rk*(1.+ 2.*cy*d)*(1.+ 2.*cy*d));
758 Double_t AliITSTrackV1::ArgC(Double_t rk) const {
759 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
760 // quantity usefull in Propagation
764 return (1./rk - 2.*cy*ArgA(rk)/(1.+ 2.*cy*d));
768 Double_t AliITSTrackV1::GetPredChi2(Double_t m[2], Double_t sigma[2] ) const {
769 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
770 // This function calculates a predicted chi2 increment.
772 Double_t r00=sigma[0], r01=0., r11=sigma[1];
773 r00+=fC00; r01+=fC10; r11+=fC11;
774 Double_t det=r00*r11-r01*r01;
775 if(TMath::Abs(det) < 1.e-15) {cout<<" Problems on matrix in GetPredChi2 "<<det<<"\n";
777 Double_t tmp=r00; r00=r11; r11=tmp; r01=-r01;
778 Double_t dphi=m[0]-fX0;
779 Double_t dz=m[1]-fX1;
780 Double_t chi2 = (dphi*r00*dphi +2.*r01*dphi*dz + dz*r11*dz)/det;