1 /****************************************************************************
2 * This macro is supposed to do reconstruction in the ITS via Kalman *
3 * tracker V2. The ITStracker is feeded with parametrized TPC tracks *
5 * It does the following steps: *
6 * 1) TPC tracking parameterization *
7 * 2) Fast points in ITS *
8 * 3) ITS cluster finding V2 *
9 * 4) Determine z position of primary vertex *
10 * - read from event header in PbPb events *
11 * - determined using points on SPD in pp events (M.Masera) *
12 * 5) ITS track finding V2 *
13 * * in pp, redetermine the z position of the primary vertex *
14 * using the reconstructed tracks
15 * 6) Create a reference file with simulation info (p,PDG...) *
17 * (Origin: A.Dainese, Padova, andrea.dainese@pd.infn.it *
18 * from AliTPCtest.C & AliITStestV2.C by I.Belikov *
19 ****************************************************************************/
21 #if !defined(__CINT__) || defined(__MAKECINT__)
22 //-- --- standard headers-------------
23 #include "Riostream.h"
24 //--------Root headers ---------------
26 #include <TStopwatch.h>
34 #include <TParticle.h>
36 //----- AliRoot headers ---------------
39 #include "AliHeader.h"
40 #include "AliGenEventHeader.h"
42 #include "AliModule.h"
43 #include "AliArrayI.h"
44 #include "AliDigits.h"
47 #include "AliITSgeom.h"
48 #include "AliITSRecPoint.h"
49 #include "AliITSclusterV2.h"
50 #include "AliITSsimulationFastPoints.h"
51 #include "AliITStrackerV2.h"
52 #include "AliKalmanTrack.h"
53 #include "AliTPCtrackerParam.h"
54 //-------------------------------------
57 // structure for track references
67 //===== Functions definition =================================================
69 Int_t MarkEvtsToSkip(const Char_t *evtsName,
72 Int_t TPCParamTracks(const Char_t *galiceName,
73 const Char_t *outName,
75 const Double_t Bfield,
78 Int_t ITSHits2FastRecPoints(const Char_t *galiceName,
82 Int_t ITSFindClustersV2(const Char_t *galiceName,
83 const Char_t *outName,
87 Int_t ZvtxFromHeader(const Char_t *galiceName,
91 Int_t ZvtxFromSPD(const Char_t *galiceName,
95 Int_t ZvtxFromTracks(const Char_t *trkame,
99 Int_t ZvtxFastpp(const Char_t *galiceName,
103 void EvalZ(TH1F *hist,
111 Bool_t VtxTrack(Double_t pt,
114 Double_t d0zRes(Double_t pt);
116 Int_t ITSFindTracksV2(const Char_t *galiceName,
117 const Char_t *inName,
118 const Char_t *inName2,
119 const Char_t *outName,
124 Int_t ITSMakeRefFile(const Char_t *galiceName,
125 const Char_t *inName,
126 const Char_t *outName,
130 void WriteZvtx(const Char_t *name,
134 void ReadZvtx(const Char_t *name,
138 //=============================================================================
140 Int_t AliBarrelRec_TPCparam(Int_t n=1) {
142 const Char_t *name=" AliBarrelRec_TPCparam";
143 cerr<<'\n'<<name<<"...\n";
144 gBenchmark->Start(name);
146 const Char_t *evtsName = "EvtsToSkip.dat";
147 const Char_t *TPCtrkNameS = "AliTPCtracksParam.root";
148 const Char_t *galiceName = "galice.root";
149 const Char_t *ITSclsName = "AliITSclustersV2.root";
150 const Char_t *ITStrkName = "AliITStracksV2.root";
151 const Char_t *ITStrkName2 = "AliITStracksV2_2.root";
152 const Char_t *ITSrefName = "ITStracksRefFile.root";
154 // set here the code for the type of collision (needed for TPC tracking
155 // parameterization). available collisions:
157 // coll = 0 -> PbPb6000 (HIJING with b<2fm)
159 const Int_t collcode = 1;
160 const Bool_t slowVtx = kFALSE;
161 const Bool_t retrack = kFALSE;
162 // set here the value of the magnetic field
163 const Double_t BfieldValue = 0.4;
165 AliKalmanTrack::SetConvConst(100/0.299792458/BfieldValue);
167 Bool_t *skipEvt = new Bool_t[n];
169 // Mark events that have to be skipped (read from file ascii evtsName)
170 for(Int_t i=0;i<n;i++) skipEvt[i] = kFALSE;
171 if(!gSystem->AccessPathName(evtsName,kFileExists)) {
172 MarkEvtsToSkip(evtsName,skipEvt);
175 // ********** Build TPC tracks with parameterization *********** //
176 TPCParamTracks(galiceName,TPCtrkNameS,collcode,BfieldValue,n);
179 // ********** ITS RecPoints ************************************ //
180 ITSHits2FastRecPoints(galiceName,skipEvt,n);
183 // ********** Find ITS clusters ******************************** //
184 ITSFindClustersV2(galiceName,ITSclsName,skipEvt,n);
187 // ********** Tracking in ITS ********************************** //
191 ZvtxFromHeader(galiceName,skipEvt,n);
193 ITSFindTracksV2(galiceName,TPCtrkNameS,ITSclsName,ITStrkName,skipEvt,vtxMode,n);
196 if(collcode==1 && slowVtx) {
197 ZvtxFromSPD(galiceName,skipEvt,n);
199 ITSFindTracksV2(galiceName,TPCtrkNameS,ITSclsName,ITStrkName,skipEvt,vtxMode,n);
200 ZvtxFromTracks(ITStrkName,skipEvt,n);
203 ITSFindTracksV2(galiceName,TPCtrkNameS,ITSclsName,ITStrkName2,skipEvt,vtxMode,n);
206 if(collcode==1 && !slowVtx) {
207 ZvtxFastpp(galiceName,skipEvt,n);
209 ITSFindTracksV2(galiceName,TPCtrkNameS,ITSclsName,ITStrkName,skipEvt,vtxMode,n);
212 // ********** Make ITS tracks reference file ******************* //
213 ITSMakeRefFile(galiceName,ITStrkName,ITSrefName,skipEvt,n);
219 gBenchmark->Stop(name);
220 gBenchmark->Show(name);
224 //-----------------------------------------------------------------------------
225 Int_t MarkEvtsToSkip(const Char_t *evtsName,Bool_t *skipEvt) {
227 cerr<<"\n*******************************************************************\n";
228 cerr<<"\nChecking for events to skip...\n";
232 FILE *f = fopen(evtsName,"r");
234 ncol = fscanf(f,"%d",&evt);
236 skipEvt[evt] = kTRUE;
237 cerr<<" ev. "<<evt<<" will be skipped\n";
243 //-----------------------------------------------------------------------------
244 Int_t TPCParamTracks(const Char_t *galiceName,const Char_t *outName,
245 const Int_t coll,const Double_t Bfield,Int_t n) {
247 cerr<<"\n*******************************************************************\n";
249 const Char_t *name="TPCParamTracks";
250 cerr<<'\n'<<name<<"...\n";
251 gBenchmark->Start(name);
253 TFile *outFile=TFile::Open(outName,"recreate");
254 TFile *inFile =TFile::Open(galiceName);
256 AliTPCtrackerParam tracker(coll,Bfield,n);
257 tracker.BuildTPCtracks(inFile,outFile);
259 delete gAlice; gAlice=0;
264 gBenchmark->Stop(name);
265 gBenchmark->Show(name);
269 //-----------------------------------------------------------------------------
270 Int_t ITSHits2FastRecPoints(const Char_t *galiceName,Bool_t *skipEvt,Int_t n) {
272 cerr<<"\n*******************************************************************\n";
274 const Char_t *name="ITSHits2FastRecPoints";
275 cerr<<'\n'<<name<<"...\n";
276 gBenchmark->Start(name);
281 // Connect the Root Galice file containing Geometry, Kine and Hits
282 TFile *file = TFile::Open(galiceName,"UPDATE");
284 gAlice = (AliRun*)file->Get("gAlice");
287 AliITS *ITS = (AliITS*)gAlice->GetModule("ITS");
290 // Set the simulation model
291 for(Int_t i=0;i<3;i++) {
292 ITS->SetSimulationModel(i,new AliITSsimulationFastPoints());
299 for(Int_t ev=0; ev<n; ev++) {
300 if(skipEvt[ev]) continue;
301 cerr<<" --- Processing event "<<ev<<" ---"<<endl;
302 Int_t nparticles = gAlice->GetEvent(ev);
303 cerr<<"Number of particles: "<<nparticles<<endl;
304 gAlice->SetEvent(ev);
305 if(!gAlice->TreeR()) gAlice->MakeTree("R");
306 if(!gAlice->TreeR()->GetBranch("ITSRecPointsF")) {
307 ITS->MakeBranch("RF");
308 if(nparticles <= 0) return 1;
310 Int_t bgr_ev=Int_t(ev/nsignal);
311 //printf("bgr_ev %d\n",bgr_ev);
312 ITS->HitsToFastRecPoints(ev,bgr_ev,size," ","All"," ");
316 delete gAlice; gAlice=0;
319 gBenchmark->Stop(name);
320 gBenchmark->Show(name);
324 //-----------------------------------------------------------------------------
325 Int_t ITSFindClustersV2(const Char_t *galiceName,const Char_t *outName,
326 Bool_t *skipEvt,Int_t n) {
328 // This function converts AliITSRecPoint(s) to AliITSclusterV2
330 cerr<<"\n*******************************************************************\n";
332 const Char_t *name="ITSFindClustersV2";
333 cerr<<'\n'<<name<<"...\n";
334 gBenchmark->Start(name);
337 TFile *inFile=TFile::Open(galiceName);
338 if(!inFile->IsOpen()) { cerr<<"Can't open galice.root !\n"; return 1; }
340 if(!(gAlice=(AliRun*)inFile->Get("gAlice"))) {
341 cerr<<"Can't find gAlice !\n";
344 AliITS *ITS = (AliITS*)gAlice->GetModule("ITS");
345 if(!ITS) { cerr<<"Can't find the ITS !\n"; return 1; }
346 AliITSgeom *geom=ITS->GetITSgeom();
348 TFile *outFile = TFile::Open(outName,"recreate");
352 for(Int_t ev=0; ev<n; ev++) {
353 if(skipEvt[ev]) continue;
354 cerr<<"--- Processing event "<<ev<<" ---"<<endl;
356 gAlice->GetEvent(ev);
358 TClonesArray *clusters = new TClonesArray("AliITSclusterV2",10000);
360 sprintf(cname,"TreeC_ITS_%d",ev);
361 TTree *cTree = new TTree(cname,"ITS clusters");
362 cTree->Branch("Clusters",&clusters);
364 TTree *pTree=gAlice->TreeR();
365 if(!pTree) { cerr<<"Can't get TreeR !\n"; return 1; }
366 TBranch *branch = pTree->GetBranch("ITSRecPointsF");
367 if(!branch) { cerr<<"Can't get ITSRecPoints branch !\n"; return 1; }
368 TClonesArray *points = new TClonesArray("AliITSRecPoint",10000);
369 branch->SetAddress(&points);
371 TClonesArray &cl=*clusters;
373 Int_t nentr=(Int_t)branch->GetEntries();
375 cerr<<"Number of entries in TreeR_RF: "<<nentr<<endl;
377 Float_t *lp = new Float_t[5];
378 Int_t *lab = new Int_t[6];
380 for(Int_t i=0; i<nentr; i++) {
383 Int_t ncl=points->GetEntriesFast(); if(ncl==0){cTree->Fill();continue;}
384 Int_t lay,lad,det; geom->GetModuleId(i,lay,lad,det);
385 Float_t x,y,zshift; geom->GetTrans(lay,lad,det,x,y,zshift);
386 Double_t rot[9]; geom->GetRotMatrix(lay,lad,det,rot);
387 Double_t yshift = x*rot[0] + y*rot[1];
388 Int_t ndet=(lad-1)*geom->GetNdetectors(lay) + (det-1);
391 Float_t kmip=1; // ADC->mip normalization factor for the SDD and SSD
392 if(lay==4 || lay==3){kmip=280.;};
393 if(lay==6 || lay==5){kmip=38.;};
395 for(Int_t j=0; j<ncl; j++) {
396 AliITSRecPoint *p=(AliITSRecPoint*)points->UncheckedAt(j);
397 lp[0]=-p->GetX()-yshift; if(lay==1) lp[0]=-lp[0];
398 lp[1]=p->GetZ()+zshift;
399 lp[2]=p->GetSigmaX2();
400 lp[3]=p->GetSigmaZ2();
401 lp[4]=p->GetQ(); lp[4]/=kmip;
402 lab[0]=p->GetLabel(0);lab[1]=p->GetLabel(1);lab[2]=p->GetLabel(2);
407 TParticle *part=(TParticle*)gAlice->Particle(label);
409 while (part->P() < 0.005) {
410 Int_t m=part->GetFirstMother();
411 if(m<0) {cerr<<"Primary momentum: "<<part->P()<<endl; break;}
413 part=(TParticle*)gAlice->Particle(label);
415 if (lab[1]<0) lab[1]=label;
416 else if(lab[2]<0) lab[2]=label;
417 else cerr<<"No empty labels !\n";
420 new(cl[j]) AliITSclusterV2(lab,lp);
422 cTree->Fill(); clusters->Delete();
429 cerr<<"Number of clusters: "<<nclusters<<endl;
432 delete cTree; delete clusters; delete points;
434 } // end loop on events
437 delete gAlice; gAlice=0;
442 gBenchmark->Stop(name);
443 gBenchmark->Show(name);
447 //-----------------------------------------------------------------------------
448 Int_t ZvtxFromHeader(const Char_t *galiceName,
449 Bool_t *skipEvt,Int_t n) {
451 cerr<<"\n*******************************************************************\n";
453 const Char_t *name="ZvtxFromHeader";
454 cerr<<'\n'<<name<<"...\n";
455 gBenchmark->Start(name);
457 TFile *galice = TFile::Open(galiceName);
459 Double_t *zvtx = new Double_t[n];
461 for(Int_t ev=0; ev<n; ev++){
462 if(skipEvt[ev]) continue;
463 cerr<<" --- Processing event "<<ev<<" ---"<<endl;
467 AliHeader* header = 0;
468 TTree* treeE = (TTree*)gDirectory->Get("TE");
469 treeE->SetBranchAddress("Header",&header);
471 AliGenEventHeader* genHeader = header->GenEventHeader();
473 // get primary vertex position
474 genHeader->PrimaryVertex(o);
475 // set position of primary vertex
476 zvtx[ev] = (Double_t)o[2];
478 cerr<<" ! event header not found : setting z vertex to 0 !"<<endl;
486 // Write vertices to file
487 WriteZvtx("zvtxHeader.dat",zvtx,n);
491 gBenchmark->Stop(name);
492 gBenchmark->Show(name);
496 //-----------------------------------------------------------------------------
497 Int_t ZvtxFastpp(const Char_t *galiceName,
498 Bool_t *skipEvt,Int_t n) {
500 cerr<<"\n*******************************************************************\n";
502 const Char_t *name="ZvtxFastpp";
503 cerr<<'\n'<<name<<"...\n";
504 gBenchmark->Start(name);
506 TFile *galice = TFile::Open(galiceName);
507 AliRun *gAlice = (AliRun*)galice->Get("gAlice");
509 Double_t *zvtx = new Double_t[n];
513 Double_t dNchdy,E,theta,eta,zvtxTrue,sigmaz,probVtx;
515 for(Int_t ev=0; ev<n; ev++) {
516 if(skipEvt[ev]) continue;
517 cerr<<" --- Processing event "<<ev<<" ---"<<endl;
521 AliHeader* header = 0;
522 TTree* treeE = (TTree*)galice->Get("TE");
523 treeE->SetBranchAddress("Header",&header);
525 AliGenEventHeader* genHeader = header->GenEventHeader();
527 // get primary vertex position
528 genHeader->PrimaryVertex(o);
529 // set position of primary vertex
530 zvtxTrue = (Double_t)o[2];
532 cerr<<" ! event header not found : setting z vertex to 0 !"<<endl;
538 // calculate dNch/dy pf the event (charged primaries in |eta|<0.5)
539 nPart = (Int_t)gAlice->GetEvent(ev);
541 for(b=0; b<nPart; b++) {
542 part = (TParticle*)gAlice->Particle(b);
543 if(TMath::Abs(part->GetPdgCode())<10) continue; // reject partons
544 if(TMath::Abs(part->Vx()*part->Vx()+part->Vy()*part->Vy())>0.01) continue; // reject secondaries
546 if(E>6900.) continue; // reject incoming protons
547 theta = part->Theta();
548 if(theta<.1 || theta>3.) continue;
549 eta = -TMath::Log(TMath::Tan(theta/2.));
550 if(TMath::Abs(eta)>0.5) continue; // count particles in |eta|<0.5
554 // get sigma(z) corresponding to the mult of this event
556 sigmaz = 0.0417/TMath::Sqrt(dNchdy);
560 // smear the original position of the primary vertex
561 zvtx[ev] = gRandom->Gaus(zvtxTrue,sigmaz);
563 // compute the probability that the vertex is found
565 if(dNchdy<24.) probVtx = 0.85+0.00673*dNchdy;
566 if(dNchdy<14.) probVtx = 0.85;
568 if(gRandom->Rndm()>probVtx) zvtx[ev] = -1000.;// no zvtx for this event
573 // Write vertices to file
574 WriteZvtx("zvtxFastpp.dat",zvtx,n);
577 //delete gAlice; gAlice=0;
580 gBenchmark->Stop(name);
581 gBenchmark->Show(name);
585 //-----------------------------------------------------------------------------
586 Int_t ZvtxFromSPD(const Char_t *galiceName,Bool_t *skipEvt,Int_t n) {
589 Double_t *zvtx = new Double_t[n];
591 Bool_t debug = kFALSE;
593 if(debug)fildeb.open("FindZV.out");
595 //filou.open("zcoor.dat");
596 const Float_t kPi=TMath::Pi();
597 const Int_t kFirstL1=0;
598 const Int_t kLastL1=79;
599 const Int_t kFirstL2=80;
600 const Int_t kLastL2=239;
601 // const Float_t kDiffPhiMax=0.0005;
602 const Float_t kDiffPhiMax=0.01;
603 const Float_t kphl=0.;
604 const Float_t kphh=kPi/18.;
605 TDirectory *currdir = gDirectory;
609 TProfile *scoc = new TProfile("scoc","Zgen - Zmeas vs occ lay 1",5,10.,60.);
610 TProfile *prof = new TProfile("prof","z2 vs z1",50,-15.,15.);
611 TH1F *phdiff = new TH1F("phdiff","#Delta #phi",100,kphl,kphh);
612 TH1F *phdifsame = new TH1F("phdifsame","#Delta #phi same track",100,kphl,kphh);
613 if(gAlice){delete gAlice; gAlice = 0;}
614 TFile *file = TFile::Open(galiceName);
615 gAlice = (AliRun*)file->Get("gAlice");
617 AliITS *ITS = (AliITS*)gAlice->GetModule("ITS");
618 AliITSgeom *geom = ITS->GetITSgeom();
620 Float_t lc[3]; for(Int_t ii=0; ii<3; ii++) lc[ii]=0.;
621 Float_t gc[3]; for(Int_t ii=0; ii<3; ii++) gc[ii]=0.;
622 Float_t lc2[3]; for(Int_t ii=0; ii<3; ii++) lc2[ii]=0.;
623 Float_t gc2[3]; for(Int_t ii=0; ii<3; ii++) gc2[ii]=0.;
628 for(Int_t event=0; event<n; event++){
629 if(skipEvt[event]) continue;
630 sprintf(name,"event_%d",event);
631 hz2z1=new TH2F(name,"z2 vs z1",50,-15.,15.,50,-15.,15.);
632 hz2z1->SetDirectory(currdir);
633 gAlice->GetEvent(event);
634 TParticle * part = gAlice->Particle(0);
635 Float_t oriz=part->Vz();
636 cout<<"\n ==============================================================\n";
637 cout<<" Processing event "<<event<<" "<<oriz<<endl;
638 cout<<" ==============================================================\n";
640 fildeb<<"\n ==============================================================\n";
641 fildeb<<" Processing event "<<event<<" "<<oriz<<endl;
642 fildeb<<" ==============================================================\n";
645 TR = gAlice->TreeR();
646 if(!TR) cerr<<"TreeR not found\n";
647 TBranch *branch=TR->GetBranch("ITSRecPointsF");
648 if(!branch) cerr<<"Branch ITSRecPointsF not found\n";
649 TClonesArray *points = new TClonesArray("AliITSRecPoint",10000);
650 branch->SetAddress(&points);
651 Int_t nentr=(Int_t)branch->GetEntries();
657 for(Int_t module= kFirstL1; module<=kLastL1;module++){
659 branch->GetEvent(module);
660 Int_t nrecp1 = points->GetEntriesFast();
661 //cerr<<nrecp1<<endl;
662 for(Int_t i=0; i<nrecp1;i++){
663 AliITSRecPoint *current = (AliITSRecPoint*)points->UncheckedAt(i);
664 lc[0]=current->GetX();
665 lc[2]=current->GetZ();
666 geom->LtoG(module,lc,gc);
674 rmszav=TMath::Sqrt(zave2/(firipixe-1)-zave*zave/firipixe/(firipixe-1));
676 cout<<"Z aver first layer = "<<zave<<" RMS= "<<rmszav<<" pixels = "<<firipixe<<endl;
677 if(debug)fildeb<<"Z aver first layer = "<<zave<<" RMS= "<<rmszav<<" pixels = "<<firipixe<<endl;
680 cout<<"No rec points on first layer for this event\n";
681 if(debug)fildeb<<"No rec points on first layer for this event\n";
683 Float_t zlim1=zave-rmszav;
684 Float_t zlim2=zave+rmszav;
685 Int_t sepa=(Int_t)((zlim2-zlim1)*10.+1.);
686 zlim2=zlim1 + sepa/10.;
687 sprintf(name,"pz_ev_%d",event);
688 dpvsz=new TH2F(name,"#Delta #phi vs Z",sepa,zlim1,zlim2,100,0.,0.03);
689 dpvsz->SetDirectory(currdir);
690 sprintf(name,"z_ev_%d",event);
691 zvdis=new TH1F(name,"zv distr",sepa,zlim1,zlim2);
692 zvdis->SetDirectory(currdir);
693 cout<<"Z limits: "<<zlim1<<" "<<zlim2<<endl;
694 if(debug)fildeb<<"Z limits: "<<zlim1<<" "<<zlim2<<endl;
696 TArrayF *zval = new TArrayF(sizarr);
698 for(Int_t module= kFirstL1; module<=kLastL1;module++){
699 //cout<<"processing module "<<module<<" \r";
700 branch->GetEvent(module);
701 Int_t nrecp1 = points->GetEntriesFast();
702 TObjArray *poiL1 = new TObjArray(nrecp1);
703 for(Int_t i=0; i<nrecp1;i++)poiL1->AddAt(points->UncheckedAt(i),i);
704 //ITS->ResetRecPoints();
706 for(Int_t i=0; i<nrecp1;i++){
707 AliITSRecPoint *current = (AliITSRecPoint*)poiL1->UncheckedAt(i);
708 lc[0]=current->GetX();
709 lc[2]=current->GetZ();
710 geom->LtoG(module,lc,gc);
711 Float_t r1=TMath::Sqrt(gc[0]*gc[0]+gc[1]*gc[1]);
712 Float_t phi1 = TMath::ATan2(gc[1],gc[0]);
713 if(phi1<0)phi1=2*kPi+phi1;
714 Int_t lab1 = current->GetLabel(0);
715 Float_t phi1d=phi1*180./kPi;
716 //cerr<<"module "<<module<<" "<<gc[0]<<" "<<gc[1]<<" "<<gc[2]<<" "<<phi1d<<" "<<lab1<<" \n";
717 for(Int_t modul2=kFirstL2; modul2<=kLastL2; modul2++){
718 branch->GetEvent(modul2);
719 Int_t nrecp2 = points->GetEntriesFast();
720 for(Int_t j=0; j<nrecp2;j++){
721 AliITSRecPoint *recp = (AliITSRecPoint*)points->UncheckedAt(j);
724 geom->LtoG(modul2,lc2,gc2);
725 Float_t r2=TMath::Sqrt(gc2[0]*gc2[0]+gc2[1]*gc2[1]);
726 Float_t zr0=(r2*gc[2]-r1*gc2[2])/(r2-r1);
727 Int_t lab2 = recp->GetLabel(0);
728 Float_t phi2 = TMath::ATan2(gc2[1],gc2[0]);
729 if(phi2<0)phi2=2.*kPi+phi2;
730 Float_t diff = TMath::Abs(phi2-phi1);
731 if(diff>kPi)diff=2.*kPi-diff;
732 if(lab1==lab2)phdifsame->Fill(diff);
733 if(zr0>zlim1 && zr0<zlim2){
735 dpvsz->Fill(zr0,diff);
736 if(diff<kDiffPhiMax ){
738 zval->AddAt(zr0,ncoinc);
740 if(ncoinc==(sizarr-1)){
744 Float_t phi2d=phi2*180./kPi;
745 Float_t diffd=diff*180./kPi;
746 //cerr<<"module2 "<<modul2<<" "<<gc2[0]<<" "<<gc2[1]<<" "<<gc2[2]<<" "<<phi2d<<" "<<diffd<<" "<<lab2<<" \n";
747 // cout<<"zr0= "<<zr0<<endl;
748 hz2z1->Fill(gc[2],gc2[2]);
749 prof->Fill(gc[2]-oriz,gc2[2]-oriz);
761 EvalZ(zvdis,sepa,zcmp,zsig,ncoinc,zval,&fildeb);
762 if(zcmp!=-100 && zsig!=-100){
764 Float_t scarto = (oriz-zcmp)*10000.;
765 Float_t ascarto=TMath::Abs(scarto);
766 scoc->Fill(firipixe,ascarto);
768 avesca2+=scarto*scarto;
769 if(debug)fildeb<<"Mean value: "<<zcmp<<" +/-"<<zsig<<" Zgen- Zmeas (micron)= "<<scarto<<endl;
770 cout<<"Mean value: "<<zcmp<<" RMS: "<<zsig<<" Zgen- Zmeas (micron)= "<<scarto<<endl;
771 //filou<<event<<" "<<zcmp<<" "<<zsig<<" "<<oriz<<" "<<scarto<<endl;
772 zvtx[event] = (Double_t)zcmp;
775 cout<<"Not enough points in event "<<event<<endl;
776 if(debug)fildeb<<"Not enough points\n";
777 //filou<<event<<" "<<-1000.<<" "<<0.<<" "<<oriz<<" "<<0.<<endl;
778 zvtx[event] = -1000.;
783 //hz2z1->Draw("box");
785 // Write vertices to file
786 WriteZvtx("zvtxSPD.dat",zvtx,n);
790 avesca2=TMath::Sqrt((avesca2/(N-1)-avesca*avesca/N/(N-1))/N);
795 cout<<"\n \n ==========================================================\n";
796 cout<<"Number of events with vertex estimate "<<N<<endl;
797 cout<<"Average of the (abs) Zgen-Zmeas : "<<avesca;
798 cout<<" +/- "<<avesca2<<" micron"<<endl;
800 fildeb<<"\n \n ==========================================================\n";
801 fildeb<<"Number of events with vertex estimate "<<N<<endl;
802 fildeb<<"Average of the (abs) Zgen-Zmeas : "<<avesca;
803 fildeb<<" +/- "<<avesca2<<endl;
809 //-----------------------------------------------------------------------------
810 void EvalZ(TH1F *hist,Int_t sepa,Float_t &av, Float_t &sig,Int_t ncoinc,
811 TArrayF *zval,ofstream *deb) {
817 for(Int_t i=1;i<=sepa;i++){
818 Float_t cont=hist->GetBinContent(i);
822 if(cont!=0)NbinNotZero++;
824 if(NbinNotZero==0){av=-100; sig=-100; return;}
825 if(NbinNotZero==1){sig=-100; return;}
826 sig=TMath::Sqrt(sig/(N-1)-av*av/N/(N-1));
828 Float_t val1=hist->GetBinLowEdge(sepa);
829 Float_t val2=hist->GetBinLowEdge(1);
830 for(Int_t i=1;i<=sepa;i++){
831 Float_t cont=hist->GetBinContent(i);
832 if(cont>(av+sig*2.)){
833 Float_t curz=hist->GetBinLowEdge(i);
834 if(curz<val1)val1=curz;
835 if(curz>val2)val2=curz;
838 val2+=hist->GetBinWidth(1);
839 cout<<"Values for Z finding: "<<val1<<" "<<val2<<endl;
840 if(deb)(*deb)<<"Values for Z finding: "<<val1<<" "<<val2<<endl;
844 for(Int_t i=0; i<ncoinc; i++){
845 Float_t z=zval->At(i);
852 if(N<=1){av=-100; sig=-100; return;}
853 sig=TMath::Sqrt((sig/(N-1)-av*av/N/(N-1))/N);
857 //-----------------------------------------------------------------------------
858 Int_t ZvtxFromTracks(const Char_t *trkName,Bool_t *skipEvt,Int_t n) {
860 cerr<<"\n*******************************************************************\n";
862 const Char_t *name="ZvtxFromTracks";
863 cerr<<'\n'<<name<<"...\n";
864 gBenchmark->Start(name);
866 Double_t *zvtx = new Double_t[n];
867 Double_t *zvtxSPD = new Double_t[n];
868 ReadZvtx("zvtxSPD.dat",zvtxSPD,n);
870 TFile *itstrk = TFile::Open(trkName);
873 Int_t nTrks,i,nUsedTrks;
874 Double_t pt,d0rphi,d0z;
875 Double_t zvtxTrks,ezvtxTrks,sumWeights;
877 for(Int_t ev=0; ev<n; ev++){
878 cerr<<" --- Processing event "<<ev<<" ---"<<endl;
880 // Tree with ITS tracks
882 sprintf(tname,"TreeT_ITS_%d",ev);
884 TTree *tracktree=(TTree*)itstrk->Get(tname);
885 if(!tracktree) continue;
886 AliITStrackV2 *itstrack=new AliITStrackV2;
887 tracktree->SetBranchAddress("tracks",&itstrack);
888 nTrks = (Int_t)tracktree->GetEntries();
894 //cerr<<" ITS tracks: "<<nTrks<<endl;
896 for(i=0; i<nTrks; i++) {
897 tracktree->GetEvent(i);
898 // get pt and impact parameters
899 pt = 1./TMath::Abs(itstrack->Get1Pt());
900 d0rphi = TMath::Abs(itstrack->GetD());
901 itstrack->PropagateToVertex();
902 d0z = itstrack->GetZ();
903 // check if the track is from (0,0) in (x,y)
904 if(!VtxTrack(pt,d0rphi)) continue;
906 zvtxTrks += d0z/d0zRes(pt)/d0zRes(pt);
907 sumWeights += 1./d0zRes(pt)/d0zRes(pt);
912 // estimated position in z of vertex
913 zvtxTrks /= sumWeights;
915 ezvtxTrks = TMath::Sqrt(1./sumWeights);
917 zvtxTrks = zvtxSPD[ev];
925 // Write vertices to file
926 WriteZvtx("zvtxTracks.dat",zvtx,n);
930 gBenchmark->Stop(name);
931 gBenchmark->Show(name);
935 //----------------------------------------------------------------------------
936 Bool_t VtxTrack(Double_t pt,Double_t d0rphi) {
938 Double_t d0rphiRes = TMath::Sqrt(11.59*11.59+65.76*65.76/TMath::Power(pt,1.878))/10000.;
939 Double_t nSigma = 3.;
940 if(d0rphi<nSigma*d0rphiRes) { return kTRUE; } else { return kFALSE; }
942 //----------------------------------------------------------------------------
943 Double_t d0zRes(Double_t pt) {
944 Double_t res = TMath::Sqrt(34.05*34.05+170.1*170.1/TMath::Power(pt,1.226));
947 //-----------------------------------------------------------------------------
948 Int_t ITSFindTracksV2(const Char_t *galiceName,const Char_t *inName,
949 const Char_t *inName2,const Char_t *outName,
950 Bool_t *skipEvt,Option_t *vtxMode,Int_t n) {
953 cerr<<"\n*******************************************************************\n";
955 const Char_t *name="ITSFindTracksV2";
956 cerr<<'\n'<<name<<"...\n";
957 gBenchmark->Start(name);
959 // Read vertices from file
960 Double_t *zvtx = new Double_t[n];
961 Char_t *vtxfile="zvtxHeader.dat";
963 const Char_t *header = strstr(vtxMode,"Header");
964 const Char_t *fastpp = strstr(vtxMode,"Fast");
965 const Char_t *spd = strstr(vtxMode,"SPD");
966 const Char_t *tracks = strstr(vtxMode,"Tracks");
968 if(header) vtxfile = "zvtxHeader.dat";
969 if(fastpp) vtxfile = "zvtxFastpp.dat";
970 if(spd) vtxfile = "zvtxSPD.dat";
971 if(tracks) vtxfile = "zvtxTracks.dat";
973 ReadZvtx(vtxfile,zvtx,n);
976 TFile *outFile = TFile::Open(outName,"recreate");
977 TFile *inFile = TFile::Open(inName);
978 TFile *inFile2 = TFile::Open(inName2);
980 AliITSgeom *geom=(AliITSgeom*)gFile->Get("AliITSgeom");
981 if(!geom) { cerr<<"can't get ITS geometry !\n"; return 1;}
983 Int_t flag1stPass,flag2ndPass;
985 for(Int_t ev=0; ev<n; ev++){
986 if(skipEvt[ev]) continue;
987 cerr<<" --- Processing event "<<ev<<" ---"<<endl;
988 AliITStrackerV2 tracker(geom,ev);
990 // set position of primary vertex
992 vtx[0]=0.; vtx[1]=0.; vtx[2]=zvtx[ev];
994 flag1stPass=1; // vtx constraint
995 flag2ndPass=0; // no vtx constraint
997 // no vtx constraint if vertex not found
1003 cerr<<"+++\n+++ Setting primary vertex z = "<<vtx[2]<<
1004 " cm for ITS tracking\n+++\n";
1005 tracker.SetVertex(vtx);
1007 // setup vertex constraint in the two tracking passes
1009 flags[0]=flag1stPass;
1010 tracker.SetupFirstPass(flags);
1011 flags[0]=flag2ndPass;
1012 tracker.SetupSecondPass(flags);
1014 tracker.Clusters2Tracks(inFile,outFile);
1023 gBenchmark->Stop(name);
1024 gBenchmark->Show(name);
1028 //-----------------------------------------------------------------------------
1029 Int_t ITSMakeRefFile(const Char_t *galice,const Char_t *inname,
1030 const Char_t *outname,Bool_t *skipEvt,Int_t n) {
1033 cerr<<"\n*******************************************************************\n";
1036 const Char_t *name="ITSMakeRefFile";
1037 cerr<<'\n'<<name<<"...\n";
1038 gBenchmark->Start(name);
1041 TFile *out = TFile::Open(outname,"recreate");
1042 TFile *trk = TFile::Open(inname);
1043 TFile *kin = TFile::Open(galice);
1046 // Get gAlice object from file
1047 if(!(gAlice=(AliRun*)kin->Get("gAlice"))) {
1048 cerr<<"gAlice has not been found on galice.root !\n";
1055 static RECTRACK rectrk;
1058 for(Int_t ev=0; ev<n; ev++){
1059 if(skipEvt[ev]) continue;
1060 cerr<<" --- Processing event "<<ev<<" ---"<<endl;
1062 gAlice->GetEvent(ev);
1066 // Tree with ITS tracks
1068 sprintf(tname,"TreeT_ITS_%d",ev);
1070 TTree *tracktree=(TTree*)trk->Get(tname);
1071 if(!tracktree) continue;
1072 AliITStrackV2 *itstrack=new AliITStrackV2;
1073 tracktree->SetBranchAddress("tracks",&itstrack);
1074 Int_t nentr=(Int_t)tracktree->GetEntries();
1076 // Tree for true track parameters
1078 sprintf(ttname,"Tree_Ref_%d",ev);
1079 TTree *reftree = new TTree(ttname,"Tree with true track params");
1080 reftree->Branch("rectracks",&rectrk,"lab/I:pdg:mumlab:mumpdg:Vx/F:Vy:Vz:Px:Py:Pz");
1082 for(Int_t i=0; i<nentr; i++) {
1083 tracktree->GetEvent(i);
1084 label = TMath::Abs(itstrack->GetLabel());
1086 Part = (TParticle*)gAlice->Particle(label);
1088 rectrk.pdg=Part->GetPdgCode();
1089 rectrk.mumlab = Part->GetFirstMother();
1090 if(Part->GetFirstMother()>=0) {
1091 Mum = (TParticle*)gAlice->Particle(Part->GetFirstMother());
1092 rectrk.mumpdg=Mum->GetPdgCode();
1096 rectrk.Vx=Part->Vx();
1097 rectrk.Vy=Part->Vy();
1098 rectrk.Vz=Part->Vz();
1099 rectrk.Px=Part->Px();
1100 rectrk.Py=Part->Py();
1101 rectrk.Pz=Part->Pz();
1117 gBenchmark->Stop(name);
1118 gBenchmark->Show(name);
1123 //-----------------------------------------------------------------------------
1124 void WriteZvtx(const Char_t *name,Double_t *zvtx,Int_t n) {
1126 FILE *f = fopen(name,"w");
1127 for(Int_t i=0;i<n;i++) {
1128 fprintf(f,"%f\n",zvtx[i]);
1134 //-----------------------------------------------------------------------------
1135 void ReadZvtx(const Char_t *name,Double_t *zvtx,Int_t n) {
1137 FILE *f = fopen(name,"r");
1138 for(Int_t i=0;i<n;i++) {
1139 fscanf(f,"%lf",&zvtx[i]);