7 #include <TClonesArray.h>
12 #include "TParticle.h"
15 #include "AliITSgeomSPD.h"
16 #include "AliITSgeomSDD.h"
17 #include "AliITSgeomSSD.h"
18 #include "AliITSgeom.h"
19 #include "AliITSmodule.h"
20 #include "AliITSRecPoint.h"
22 #include "AliKalmanTrack.h"
26 #include "AliITSRad.h"
27 #include "AliITStrack.h"
28 #include "AliITSiotrack.h"
29 #include "AliITStracking.h"
30 #include "../TPC/AliTPC.h"
31 #include "../TPC/AliTPCParam.h"
32 #include "../TPC/AliTPCtracker.h"
34 #include "AliITSgeoinfo.h"
35 #include "AliITSTrackerV1.h"
39 ClassImp(AliITSTrackerV1)
42 //________________________________________________________________
44 AliITSTrackerV1::AliITSTrackerV1(AliITS* IITTSS) {
45 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
46 // default constructor
51 //________________________________________________________________
53 AliITStrack AliITSTrackerV1::Tracking(AliITStrack &track, AliITStrack *reference,TObjArray *fastpoints,
54 Int_t **vettid, Bool_t flagvert, AliITSRad *rl, AliITSgeoinfo *geoinfo) {
56 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
58 TList *list= new TList();
60 AliITStrack tr(track);
64 Double_t Pt=(tr).GetPt();
65 //cout << "\n Pt = " << Pt <<"\n"; //stampa
67 AliITStracking obj(list, reference, ITS, fastpoints,TMath::Abs(Pt),vettid, flagvert, rl, geoinfo); // nuova ITS
72 TVector VecTotLabref(18);
74 for(lay=5; lay>=0; lay--) {
76 VecLabref=(*reference).GetLabTrack(lay);
77 Float_t ClustZ=(*reference).GetZclusterTrack( lay);
79 Int_t lpp=(Int_t)VecLabref(k);
81 TParticle *p=(TParticle*) gAlice->Particle(lpp);
82 Int_t pcode=p->GetPdgCode();
83 if(pcode==11) VecLabref(k)=p->GetFirstMother();
85 itot++; VecTotLabref(itot)=VecLabref(k);
86 if(VecLabref(k)==0. && ClustZ == 0.) VecTotLabref(itot) =-3.; }
90 (*reference).Search(VecTotLabref, labref, freq);
92 //if(freq < 6) labref=-labref; // cinque - sei
93 if(freq < 5) labref=-labref; // cinque - sei
94 (*reference).SetLabel(labref);
102 //________________________________________________________________
106 void AliITSTrackerV1::DoTracking(Int_t evNumber, Int_t min_t, Int_t max_t, TFile *file, Bool_t flagvert) {
107 //Origin A. Badala' and G.S. Pappalardo: e-mail Angela.Badala@ct.infn.it, Giuseppe.S.Pappalardo@ct.infn.it
108 // ex macro for tracking ITS
114 printf("begin DoTracking - file %p\n",file);
116 /////////////////////////////////////// gets information on geometry ///////////////////////////////////
117 AliITSgeoinfo *geoinfo = new AliITSgeoinfo;
119 AliITSgeom *g1 = ((AliITS*)gAlice->GetDetector("ITS"))->GetITSgeom();
124 //cout<<" nlad ed ndet \n";
126 geoinfo->Nlad[i]=g1->GetNladders(i+1);
127 geoinfo->Ndet[i]=g1->GetNdetectors(i+1);
128 //cout<<geoinfo->Nlad[i]<<" "<<geoinfo->Ndet[i]<<"\n";
132 //cout<<" raggio medio = ";
134 g1->GetCenterThetaPhi(i+1,ll,dd,det);
135 geoinfo->Avrad[i]=TMath::Sqrt(det(0)*det(0)+det(1)*det(1));
136 //cout<<geoinfo->Avrad[i]<<" ";
138 //cout<<"\n"; getchar();
140 geoinfo->Detx[0] = ((AliITSgeomSPD*)(g1->GetShape(1, ll, dd)))->GetDx();
141 geoinfo->Detz[0] = ((AliITSgeomSPD*)(g1->GetShape(1, ll, dd)))->GetDz();
143 geoinfo->Detx[1] = ((AliITSgeomSPD*)(g1->GetShape(2, ll, dd)))->GetDx();
144 geoinfo->Detz[1] = ((AliITSgeomSPD*)(g1->GetShape(2, ll, dd)))->GetDz();
146 geoinfo->Detx[2] = ((AliITSgeomSDD*)(g1->GetShape(3, ll, dd)))->GetDx();
147 geoinfo->Detz[2] = ((AliITSgeomSDD*)(g1->GetShape(3, ll, dd)))->GetDz();
149 geoinfo->Detx[3] = ((AliITSgeomSDD*)(g1->GetShape(4, ll, dd)))->GetDx();
150 geoinfo->Detz[3] = ((AliITSgeomSDD*)(g1->GetShape(4, ll, dd)))->GetDz();
152 geoinfo->Detx[4] = ((AliITSgeomSSD*)(g1->GetShape(5, ll, dd)))->GetDx();
153 geoinfo->Detz[4] = ((AliITSgeomSSD*)(g1->GetShape(5, ll, dd)))->GetDz();
155 geoinfo->Detx[5] = ((AliITSgeomSSD*)(g1->GetShape(6, ll, dd)))->GetDx();
156 geoinfo->Detz[5] = ((AliITSgeomSSD*)(g1->GetShape(6, ll, dd)))->GetDz();
158 //cout<<" Detx Detz\n";
159 //for(Int_t la=0; la<6; la++) cout<<" "<<geoinfo->Detx[la]<<" "<<geoinfo->Detz[la]<<"\n";
161 //////////////////////////////////////////////////////////////////////////////////////////////////////////
163 //const char *pname="75x40_100x60";
165 Int_t imax=200,jmax=450;
166 AliITSRad *rl = new AliITSRad(imax,jmax);
167 //cout<<" dopo costruttore AliITSRad\n"; getchar();
171 Float_t px,py,pz,x,y,z,pxg,pyg,pzg,ptg;
178 AliKalmanTrack *kkprov;
179 kkprov->SetConvConst(100/0.299792458/0.2/gAlice->Field()->Factor());
181 TFile *cf=TFile::Open("AliTPCclusters.root");
182 AliTPCParam *digp= (AliTPCParam*)cf->Get("75x40_100x60");
183 if (!digp) { cerr<<"TPC parameters have not been found !\n"; getchar();}
185 AliTPCtracker *tracker = new AliTPCtracker(digp);
188 tracker->LoadInnerSectors();
189 tracker->LoadOuterSectors();
194 ifstream in("itsgood_tracks");
196 cerr<<"Reading itsgood tracks...\n";
197 while (in>>gt[ngood].lab>>gt[ngood].code
198 >>gt[ngood].px >>gt[ngood].py>>gt[ngood].pz
199 >>gt[ngood].x >>gt[ngood].y >>gt[ngood].z
200 >>gt[ngood].pxg >>gt[ngood].pyg >>gt[ngood].pzg
201 >>gt[ngood].ptg >>gt[ngood].flag) {
205 cerr<<"Too many good tracks !\n";
209 if (!in.eof()) cerr<<"Read error (itsgood_tracks) !\n";
213 TFile *tf=TFile::Open("AliTPCtracks.root");
214 if (!tf->IsOpen()) {cerr<<"Can't open AliTPCtracks.root !\n"; return ;}
215 TObjArray tracks(200000);
216 TTree *tracktree=(TTree*)tf->Get("TPCf");
217 if (!tracktree) {cerr<<"Can't get a tree with TPC tracks !\n";}
218 TBranch *tbranch=tracktree->GetBranch("tracks");
219 Int_t nentr=(Int_t)tracktree->GetEntries();
221 AliTPCtrack *iotracktpc=0;
222 for (kk=0; kk<nentr; kk++) {
223 iotracktpc=new AliTPCtrack;
224 tbranch->SetAddress(&iotracktpc);
225 tracktree->GetEvent(kk);
226 tracker->CookLabel(iotracktpc,0.1);
227 tracks.AddLast(iotracktpc);
233 Int_t nt = tracks.GetEntriesFast();
234 cerr<<"Number of found tracks "<<nt<<endl;
239 Double_t ptg=0.,pxg=0.,pyg=0.,pzg=0.;
241 ////////////////////////////// good tracks definition in TPC ////////////////////////////////
243 ofstream out1 ("AliITSTrag.out");
244 for (i=0; i<ngood; i++) out1 << gt[i].ptg << "\n";
249 TTree *TR=gAlice->TreeR();
250 Int_t nent=(Int_t)TR->GetEntries();
251 TClonesArray *recPoints = ITS->RecPoints();
255 Int_t *np = new Int_t[nent];
256 Int_t **vettid = new Int_t* [nent];
259 for (mod=0; mod<nent; mod++) {
261 ITS->ResetRecPoints();
262 //gAlice->TreeR()->GetEvent(mod+1); //first entry in TreeR is empty
263 gAlice->TreeR()->GetEvent(mod); //first entry in TreeR is empty
264 numbpoints = recPoints->GetEntries();
265 totalpoints+=numbpoints;
266 np[mod] = numbpoints;
267 //cout<<" mod = "<<mod<<" numbpoints = "<<numbpoints<<"\n"; getchar();
268 vettid[mod] = new Int_t[numbpoints];
270 for (ii=0;ii<numbpoints; ii++) *(vettid[mod]+ii)=0;
273 AliTPCtrack *track=0;
276 if(min_t < 0) {min_t = 0; max_t = nt-1;}
279 ///////////////////////////////// Definition of vertex end its error ////////////////////////////
280 ////////////////////////// In the future it will be given by a method ///////////////////////////
285 Float_t sigmavx=0.0050; // 50 microns
286 Float_t sigmavy=0.0050; // 50 microns
287 Float_t sigmavz=0.010; // 100 microns
289 //Vx+=gRandom->Gaus(0,sigmavx); Vy+=gRandom->Gaus(0,sigmavy); Vz+=gRandom->Gaus(0,sigmavz);
290 TVector vertex(3), ervertex(3)
291 vertex(0)=Vx; vertex(1)=Vy; vertex(2)=Vz;
292 ervertex(0)=sigmavx; ervertex(1)=sigmavy; ervertex(2)=sigmavz;
293 /////////////////////////////////////////////////////////////////////////////////////////////////
297 TTree tracktree1("TreeT","Tree with ITS tracks");
298 AliITSiotrack *iotrack=0;
299 tracktree1.Branch("ITStracks","AliITSiotrack",&iotrack,32000,0);
301 ofstream out ("AliITSTra.out");
304 for (j=min_t; j<=max_t; j++) {
305 track=(AliTPCtrack*)tracks.UncheckedAt(j);
307 if (!track) continue;
308 ////// elimination of not good tracks ////////////
309 Int_t ilab=TMath::Abs(track->GetLabel());
311 for (iii=0;iii<ngood;iii++) {
312 //cout<<" ilab, gt[iii].lab = "<<ilab<<" "<<gt[iii].lab<<"\n"; getchar();
313 if (ilab==gt[iii].lab) {
322 //cout<<" j flaglab = " <<j<<" "<<flaglab<<"\n"; getchar();
323 if (!flaglab) continue;
324 //cout<<" j = " <<j<<"\n"; getchar();
327 ////// new propagation to the end of TPC //////////////
329 track->PropagateTo(xk, 28.94, 1.204e-3); //Ne
331 track->PropagateTo(xk, 44.77, 1.71); //Tedlar
333 track->PropagateTo(xk, 44.86, 1.45); //Kevlar
335 track->PropagateTo(xk, 41.28, 0.029); //Nomex
337 track->PropagateTo(xk,36.2,1.98e-3); //C02
339 track->PropagateTo(xk, 24.01, 2.7); //Al
341 track->PropagateTo(xk, 44.77, 1.71); //Tedlar
343 track->PropagateTo(xk, 44.86, 1.45); //Kevlar
345 track->PropagateTo(xk, 41.28, 0.029); //Nomex
347 ///////////////////////////////////////////////////////////////
349 ///////////////////////////////////////////////////////////////
350 AliITStrack trackITS(*track);
351 AliITStrack result(*track);
352 AliITStrack primarytrack(*track);
354 ///////////////////////////////////////////////////////////////////////////////////////////////
356 Vgeant=result.GetVertex();
358 // Definition of Dv and Zv for vertex constraint
359 Double_t sigmaDv=0.0050; Double_t sigmaZv=0.010;
360 //Double_t sigmaDv=0.0015; Double_t sigmaZv=0.0015;
361 Double_t uniform= gRandom->Uniform();
363 if(uniform<=0.5) signdv=-1.;
367 Double_t Vr=TMath::Sqrt(Vgeant(0)*Vgeant(0)+ Vgeant(1)*Vgeant(1));
368 Double_t Dv=gRandom->Gaus(signdv*Vr,(Float_t)sigmaDv);
369 Double_t Zv=gRandom->Gaus(Vgeant(2),(Float_t)sigmaZv);
371 //cout<<" Dv e Zv = "<<Dv<<" "<<Zv<<"\n";
372 trackITS.SetDv(Dv); trackITS.SetZv(Zv);
373 trackITS.SetsigmaDv(sigmaDv); trackITS.SetsigmaZv(sigmaZv);
374 result.SetDv(Dv); result.SetZv(Zv);
375 result.SetsigmaDv(sigmaDv); result.SetsigmaZv(sigmaZv);
376 primarytrack.SetDv(Dv); primarytrack.SetZv(Zv);
377 primarytrack.SetsigmaDv(sigmaDv); primarytrack.SetsigmaZv(sigmaZv);
379 /////////////////////////////////////////////////////////////////////////////////////////////////
381 primarytrack.PrimaryTrack(rl);
382 TVector d2=primarytrack.Getd2();
383 TVector tgl2=primarytrack.Gettgl2();
384 TVector dtgl=primarytrack.Getdtgl();
385 trackITS.Setd2(d2); trackITS.Settgl2(tgl2); trackITS.Setdtgl(dtgl);
386 result.Setd2(d2); result.Settgl2(tgl2); result.Setdtgl(dtgl);
388 trackITS.SetVertex(vertex); trackITS.SetErrorVertex(ervertex);
389 result.SetVertex(vertex); result.SetErrorVertex(ervertex);
392 Tracking(trackITS,&result,recPoints,vettid, flagvert,rl,geoinfo);
394 // cout<<" progressive track number = "<<j<<"\r";
396 Int_t NumofCluster=result.GetNumClust();
397 // cout<<" progressive track number = "<<j<<"\n"; // stampa
398 Long_t labITS=result.GetLabel();
399 // cout << " ITS track label = " << labITS << "\n"; // stampa
400 int lab=track->GetLabel();
401 //cout << " TPC track label = " << lab <<"\n"; // stampa
404 //propagation to vertex
408 result.Propagation(rbeam);
410 Double_t C00,C10,C11,C20,C21,C22,C30,C31,C32,C33,C40,C41,C42,C43,C44;
411 result.GetCElements(C00,C10,C11,C20,C21,C22,C30,C31,C32,C33,C40,C41,C42,C43,C44);
413 Double_t pt=TMath::Abs(result.GetPt());
414 Double_t Dr=result.GetD();
415 Double_t Z=result.GetZ();
416 Double_t tgl=result.GetTgl();
417 Double_t C=result.GetC();
419 Double_t Dz=Z-(tgl/Cy)*TMath::ASin(result.arga(rbeam));
422 // cout<<" Dr e dz alla fine = "<<Dr<<" "<<Dz<<"\n"; getchar();
423 Double_t phi=result.Getphi();
424 Double_t phivertex = phi - TMath::ASin(result.argA(rbeam));
425 Double_t duepi=2.*TMath::Pi();
426 if(phivertex>duepi) phivertex-=duepi;
427 if(phivertex<0.) phivertex+=duepi;
428 Double_t Dtot=TMath::Sqrt(Dr*Dr+Dz*Dz);
430 //////////////////////////////////////////////////////////////////////////////////////////
432 Int_t idmodule,idpoint;
433 if(NumofCluster >=5) { // cinque - sei
434 //if(NumofCluster ==6) { // cinque - sei
437 AliITSiotrack outtrack;
441 iotrack->SetStatePhi(phi);
442 iotrack->SetStateZ(Z);
443 iotrack->SetStateD(Dr);
444 iotrack->SetStateTgl(tgl);
445 iotrack->SetStateC(C);
446 Double_t radius=result.Getrtrack();
447 iotrack->SetRadius(radius);
449 if(C>0.) charge=-1; else charge=1;
450 iotrack->SetCharge(charge);
454 iotrack->SetCovMatrix(C00,C10,C11,C20,C21,C22,C30,C31,C32,C33,C40,C41,C42,C43,C44);
456 Double_t px=pt*TMath::Cos(phivertex);
457 Double_t py=pt*TMath::Sin(phivertex);
460 Double_t xtrack=Dr*TMath::Sin(phivertex);
461 Double_t ytrack=Dr*TMath::Cos(phivertex);
462 Double_t ztrack=Dz+Vgeant(2);
468 iotrack->SetX(xtrack);
469 iotrack->SetY(ytrack);
470 iotrack->SetZ(ztrack);
471 iotrack->SetLabel(labITS);
474 for(il=0;il<6; il++){
475 iotrack->SetIdPoint(il,result.GetIdPoint(il));
476 iotrack->SetIdModule(il,result.GetIdModule(il));
480 //cout<<" labITS = "<<labITS<<"\n";
481 //cout<<" phi z Dr tgl C = "<<phi<<" "<<Z<<" "<<Dr<<" "<<tgl<<" "<<C<<"\n"; getchar();
483 DataOut(kkk) = ptg; kkk++; DataOut(kkk)=labITS; kkk++; DataOut(kkk)=lab; kkk++;
485 for (il=0;il<6;il++) {
486 idpoint=result.GetIdPoint(il);
487 idmodule=result.GetIdModule(il);
488 *(vettid[idmodule]+idpoint)=1;
489 iotrack->SetIdPoint(il,idpoint);
490 iotrack->SetIdModule(il,idmodule);
493 Double_t difpt= (pt-ptg)/ptg*100.;
494 DataOut(kkk)=difpt; kkk++;
495 Double_t lambdag=TMath::ATan(pzg/ptg);
496 Double_t lam=TMath::ATan(tgl);
497 Double_t diflam = (lam - lambdag)*1000.;
498 DataOut(kkk) = diflam; kkk++;
499 Double_t phig=TMath::ATan2(pyg,pxg); if(phig<0) phig=2.*TMath::Pi()+phig;
500 Double_t phi=phivertex;
502 Double_t difphi = (phi - phig)*1000.;
503 DataOut(kkk)=difphi; kkk++;
504 DataOut(kkk)=Dtot*1.e4; kkk++;
505 DataOut(kkk)=Dr*1.e4; kkk++;
506 DataOut(kkk)=Dz*1.e4; kkk++;
508 for (r=0; r<9; r++) { out<<DataOut(r)<<" ";}
513 } // end if on NumofCluster
514 //gObjectTable->Print(); // stampa memoria
515 } // end for (int j=min_t; j<=max_t; j++)
520 static Bool_t first=kTRUE;
524 tfile=new TFile("itstracks.root","RECREATE");
525 //cout<<"I have opened itstracks.root file "<<endl;
532 sprintf(hname,"TreeT%d",evNumber);
534 tracktree1.Write(hname);
538 TTree *fAli=gAlice->TreeK();
541 if (fAli) fileAli =fAli->GetCurrentFile();
544 ////////////////////////////////////////////////////////////////////////////////////////////////
546 printf("delete vectors\n");
548 if(vettid) delete [] vettid;
550 if(geoinfo) delete geoinfo;