]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/AliVertexerTracksTest.C
Bug fixed (Christian)
[u/mrichter/AliRoot.git] / STEER / AliVertexerTracksTest.C
1 //------------------------------------------------------------------------
2 // Test macro for AliVertexerTracks.
3 // Contains several functions. 
4 //
5 // A. Dainese - INFN Legnaro
6 //------------------------------------------------------------------------
7 void AliVertexerTracksTest(Double_t nSigma=3.,
8                            Bool_t useMeanVtx=kTRUE,
9                            TString outname="AliVertexerTracksTest.root") {
10 //------------------------------------------------------------------------
11 // Run vertex reconstruction and store results in histos and ntuple
12 //------------------------------------------------------------------------
13
14   if (gAlice) {
15     delete gAlice->GetRunLoader();
16     delete gAlice; 
17     gAlice=0;
18   }
19   
20   AliRunLoader *rl = AliRunLoader::Open("galice.root");
21   if (rl == 0x0) {
22     cerr<<"Can not open session"<<endl;
23     return;
24   }
25   Int_t retval = rl->LoadgAlice();
26   if (retval) {
27     cerr<<"LoadgAlice returned error"<<endl;
28     delete rl;
29     return;
30   }
31   retval = rl->LoadHeader();
32   if (retval) {
33     cerr<<"LoadHeader returned error"<<endl;
34     delete rl;
35     return;
36   }
37   gAlice=rl->GetAliRun();
38   rl->LoadKinematics();
39   // Get field from galice.root
40   AliMagF *fiel = (AliMagF*)gAlice->Field();
41   // Set the conversion constant between curvature and Pt
42   AliTracker::SetFieldMap(fiel,kTRUE);
43  
44   //**** Switch on the PID class
45   AliPID pid;
46
47   Int_t nEvents = (Int_t)rl->GetNumberOfEvents();
48
49   Double_t truevtx[3];
50   Double_t vtx[3]; 
51   Double_t errvtx[3]; 
52   Double_t diffX,diffY,diffZ;
53   Double_t diffXerr,diffYerr,diffZerr;
54   Double_t multiplicity;
55   Int_t nc;
56
57   // Histograms
58   TH1F *hdiffX = new TH1F("hdiffX","x_{found} - x_{true} [#mum]",1000,-5000,5000);
59   TH1F *hdiffY = new TH1F("hdiffY","y_{found} - y_{true} [#mum]",1000,-5000,5000);
60   TH1F *hdiffZ = new TH1F("hdiffZ","z_{found} - z_{true} [#mum]",1000,-5000,5000);
61
62   TH1F *hdiffXerr = new TH1F("hdiffXerr","#Delta x/#sigma_{x}",100,-5,5);
63   TH1F *hdiffYerr = new TH1F("hdiffYerr","#Delta y/#sigma_{y}",100,-5,5);
64   TH1F *hdiffZerr = new TH1F("hdiffZerr","#Delta z/#sigma_{z}",100,-5,5);
65
66   //TNtple
67   TNtuple *ntVtxRes = new TNtuple("ntVtxRes","Vertex Resolution's Ntupla with multiplicity","ntracks:nitstracks5or6:nitstracksFromStrange:nitstracksFromStrange5or6:diffX:diffY:diffZ:diffXerr:diffYerr:diffZerr:multiplicity:nc");
68
69
70
71   // -----------   Create vertexer --------------------------
72   AliESDVertex *initVertex = 0;
73   if(useMeanVtx) {
74     // open the mean vertex
75     TFile *invtx = new TFile("AliESDVertexMean.root");
76     initVertex = (AliESDVertex*)invtx->Get("vtxmean");
77     invtx->Close();
78     delete invtx;
79   } else {
80     Double_t pos[3]={0.5,0.5,0.}; 
81     Double_t err[3]={3.,3.,5.};
82     initVertex = new AliESDVertex(pos,err);
83   }
84   AliVertexerTracks *vertexer = new AliVertexerTracks();
85   vertexer->SetITSrefitNotRequired();
86   vertexer->SetVtxStart(initVertex);
87   vertexer->SetMinTracks(2);
88   vertexer->SetNSigmad0(nSigma);
89   //cout<<" Nsigma:  "<<vertexer->GetNSigmad0()<<endl;
90   vertexer->SetDebug(1); // set to 1 to see what it does
91   //----------------------------------------------------------
92  
93   if(gSystem->AccessPathName("AliESDs.root",kFileExists)) {
94     printf("AliESDs.root not found!\n"); 
95     return;
96   }
97   TFile *fin = TFile::Open("AliESDs.root");
98   TTree *esdTree = (TTree*)fin->Get("esdTree");
99   if(!esdTree) return;
100   AliESD *esd = 0;
101   esdTree->SetBranchAddress("ESD",&esd);
102   Int_t events = esdTree->GetEntries();
103   printf("Number of events in ESD tree: %d\n",events);
104
105   TArrayF o;
106
107   for(Int_t iev=0; iev<events; iev++) { //LOOP ON EVENTS
108     printf("-------------- EVENT   %d --------------------\n",iev);
109
110     diffX=99999;
111     diffY=99999;
112     diffZ=99999;
113     diffXerr=99999;
114     diffYerr=99999;
115     diffZerr=99999;
116     nc=0;
117
118     //=================================================
119     //         LOOK IN THE SIMULATION
120     // true vertex position
121     Int_t npart = (Int_t)gAlice->GetEvent(iev);
122     printf("particles  %d\n",npart);
123     AliHeader *header = (AliHeader*)rl->GetHeader();
124     AliGenPythiaEventHeader *pyheader = (AliGenPythiaEventHeader*)header->GenEventHeader();
125     pyheader->PrimaryVertex(o);
126     truevtx[0] = o[0];
127     truevtx[1] = o[1];
128     truevtx[2] = o[2];
129     printf("True Vertex: (%f, %f, %f)\n",o[0],o[1],o[2]);
130
131     Double_t dNchdy = 0.;
132     multiplicity=0.;
133     Int_t nitstracks = 0;
134     Int_t nitstracksFromStrange = 0;
135     Int_t nitstracksFromStrange5or6 = 0;
136     Int_t nitstracks1 = 0;
137     Int_t nitstracks2 = 0;
138     Int_t nitstracks3 = 0;
139     Int_t nitstracks4 = 0;
140     Int_t nitstracks5 = 0;
141     Int_t nitstracks6 = 0;
142     Int_t nitstracks5or6 = 0;
143   
144     // loop on particles
145     for(Int_t pa=0; pa<npart; pa++) {   
146       TParticle *part = (TParticle*)gAlice->GetMCApp()->Particle(pa); 
147       Int_t pdg = part->GetPdgCode();      
148       Int_t apdg = TMath::Abs(pdg);
149       Double_t energy  = part->Energy();
150       if(energy>6900.) continue; // reject incoming protons
151       Double_t pz = part->Pz();
152       Double_t y = 0.5*TMath::Log((energy+pz+1.e-13)/(energy-pz+1.e-13)); 
153                                                  
154       // consider charged pi,K,p,el,mu       
155       if(apdg!=11 && apdg!=13 && apdg!=211 && apdg!=321 && apdg!=2212) continue;
156       // reject secondaries
157       if(TMath::Sqrt((part->Vx()-o[0])*(part->Vx()-o[0])+(part->Vy()-o[1])*(part->Vy()-o[1]))>0.0010) continue;
158       if(TMath::Abs(y)<1.0) dNchdy += 0.5; // count 1/2 of particles in |y|<1
159     } // end loop on particles
160     multiplicity=(Double_t)dNchdy;
161
162     printf(" dNch/dy = %f\n",dNchdy);
163     //===============================================================
164
165
166     esdTree->GetEvent(iev);
167     Int_t ntracks = esd->GetNumberOfTracks();
168     printf("Number of tracks in ESD %d   :   %d\n",iev,ntracks);
169     if(ntracks==0) { 
170       ntVtxRes->Fill(ntracks,nitstracks5or6,nitstracksFromStrange,nitstracksFromStrange5or6,diffX,diffY,diffZ,diffXerr,diffYerr,diffZerr,multiplicity,nc); 
171       continue; 
172     }
173     
174     // VERTEX    
175     AliESDVertex *vertex = (AliESDVertex*)vertexer->FindPrimaryVertex(esd);
176     //AliESDVertex *vertex = (AliESDVertex*)vertexer->FindPrimaryVertexOld(esd);
177
178     nc = (Int_t)vertex->GetNContributors();
179     printf("nc = %d\n",nc);
180
181
182     // count ITS tracks
183     for(Int_t itrk=0; itrk<ntracks; itrk++) {
184       AliESDtrack *esdtrack = (AliESDtrack*)esd->GetTrack(itrk);
185       UInt_t status = esdtrack->GetStatus();
186       // only tracks found also in ITS
187       if(! (status&AliESDtrack::kITSin) ) continue;      
188       nitstracks++;
189       Int_t npts = (Int_t)esdtrack->GetNcls(0);
190       if(npts==6) {nitstracks6++;nitstracks5or6++;}
191       if(npts==5) {nitstracks5++;nitstracks5or6++;}
192       if(npts==4) nitstracks4++;
193       if(npts==3) nitstracks3++;
194       if(npts==2) nitstracks2++;
195       if(npts==1) nitstracks1++;
196       TParticle *part = (TParticle*)gAlice->GetMCApp()->Particle(TMath::Abs(esdtrack->GetLabel()));
197       if(part->GetFirstMother()>=0) {
198         Int_t mpdg = TMath::Abs(gAlice->GetMCApp()->Particle(part->GetFirstMother())->GetPdgCode());
199         //cout<<TMath::Abs(esdtrack->GetLabel())<<"   "<<mpdg<<endl;
200         if(mpdg==321||mpdg==311||mpdg==310||mpdg==3122||mpdg==3312||mpdg==3334) {
201           nitstracksFromStrange++;
202           if(npts>=5) nitstracksFromStrange5or6++;
203         }
204       }
205     }
206     printf("Number of kITSin tracks in ESD %d   :   %d\n",iev,nitstracks);
207     printf("           6 pts: %d\n",nitstracks6);
208     printf("           5 pts: %d\n",nitstracks5);
209     printf("           4 pts: %d\n",nitstracks4);
210     printf("           3 pts: %d\n",nitstracks3);
211     printf("           2 pts: %d\n",nitstracks2);
212     printf("           1 pts: %d\n",nitstracks1);
213     printf("Number of kITSin tracks from s:   %d\n",nitstracksFromStrange);
214
215
216     if(nc>=2) {
217       vertex->GetXYZ(vtx);
218       vertex->GetSigmaXYZ(errvtx); 
219       diffX = 10000.* (vtx[0] - truevtx[0]);
220       diffY = 10000.* (vtx[1] - truevtx[1]);
221       diffZ = 10000.* (vtx[2] - truevtx[2]);
222       hdiffX->Fill(diffX);
223       hdiffY->Fill(diffY);
224       hdiffZ->Fill(diffZ);
225       diffXerr = diffX/errvtx[0]/10000.;
226       diffYerr = diffY/errvtx[1]/10000.;
227       diffZerr = diffZ/errvtx[2]/10000.;
228       hdiffXerr->Fill(diffXerr);
229       hdiffYerr->Fill(diffYerr);
230       hdiffZerr->Fill(diffZerr);
231     } 
232
233     ntVtxRes->Fill(nitstracks,nitstracks5or6,nitstracksFromStrange,nitstracksFromStrange5or6,diffX,diffY,diffZ,diffXerr,diffYerr,diffZerr,multiplicity,(Float_t)nc);   
234
235   } // END LOOP ON EVENTS
236
237
238   delete esdTree;
239   delete fin;
240   delete vertexer;
241   delete initVertex;
242
243   // Output file
244   TFile *fout  = new TFile(outname.Data(),"recreate");
245   ntVtxRes->Write();
246   hdiffX->Write();
247   hdiffY->Write();
248   hdiffZ->Write();
249   hdiffXerr->Write();
250   hdiffYerr->Write();
251   hdiffZerr->Write();
252   fout->Close();
253
254   return;
255
256 //----------------------------------------------------------------------------
257 Double_t FitFunc(Double_t *x,Double_t *par) {
258   return par[0]+par[1]/TMath::Sqrt(x[0]);
259 }
260 Int_t GetBin(Float_t mult) {
261   if(mult<5.)  return 0;
262   if(mult<7.)  return 1;
263   if(mult<12.) return 2;
264   if(mult<15.) return 3;
265   if(mult<22.) return 4;
266   return 5;
267 }
268 void PlotVtxRes(const Char_t *inname="AliVertexerTracksTest.root") {
269   //---------------------------------------------------------------------
270   // Plot efficiency, resolutions, pulls 
271   // [at least 10k pp events are needed]
272   //---------------------------------------------------------------------
273
274   gStyle->SetOptStat(0);
275   gStyle->SetOptFit(10001);
276
277   Int_t   nEvVtx=0;
278   Int_t   nEvNoVtx=0;
279   Int_t   ev,nUsedTrks;
280   Float_t nTrks,nTrksFromStrange,nTrks5or6,nTrksFromStrange5or6,dNchdy;
281   Float_t diffX,diffY,diffZ,diffXerr,diffYerr,diffZerr;
282
283   //
284   // HISTOGRAMS
285   //
286   TH1F *hdx = new TH1F("hdx","",50,-600,600);
287   hdx->SetXTitle("#Delta x [#mu m]");
288   hdx->SetYTitle("events");
289   //
290   TH1F *hdy = new TH1F("hdy","",50,-600,600);
291   hdy->SetXTitle("#Delta y [#mu m]");
292   hdy->SetYTitle("events");
293   //
294   TH1F *hdz = new TH1F("hdz","",50,-600,600);
295   hdz->SetXTitle("#Delta z [#mu m]");
296   hdz->SetYTitle("events");
297   //
298   TH1F *hTracksVtx = new TH1F("hTracksVtx","events w/ vertex",51,-0.5,50.5);
299   hTracksVtx->SetXTitle("Number of reco tracks in TPC&ITS");
300   hTracksVtx->SetYTitle("events");
301   //
302   TH1F *hTracksNoVtx = new TH1F("hTracksNoVtx","events w/o vertex",51,-0.5,50.5);
303   hTracksNoVtx->SetXTitle("Number of reco tracks in TPC&ITS");
304   hTracksNoVtx->SetYTitle("events");
305   //
306   TH1F *hTracksVtx5or6 = new TH1F("hTracksVtx5or6","events w/ vertex",51,-0.5,50.5);
307   hTracksVtx5or6->SetXTitle("Number of reco tracks in TPC&ITS(pts>=5)");
308   hTracksVtx5or6->SetYTitle("events");
309   //
310   TH1F *hTracksNoVtx5or6 = new TH1F("hTracksNoVtx5or6","events w/o vertex",51,-0.5,50.5);
311   hTracksNoVtx5or6->SetXTitle("Number of reco tracks in TPC&ITS(pts>=5)");
312   hTracksNoVtx5or6->SetYTitle("events");
313   //
314   TH1F *hTracksVtx5or6nonS = new TH1F("hTracksVtx5or6nonS","events w/ vertex",51,-0.5,50.5);
315   hTracksVtx5or6nonS->SetXTitle("Number of reco tracks in TPC&ITS(pts>=5) NOT from s");
316   hTracksVtx5or6nonS->SetYTitle("events");
317   //
318   TH1F *hTracksNoVtx5or6nonS = new TH1F("hTracksNoVtx5or6nonS","events w/o vertex",51,-0.5,50.5);
319   hTracksNoVtx5or6nonS->SetXTitle("Number of reco tracks in TPC&ITS(pts>=5) NOT from s");
320   hTracksNoVtx5or6nonS->SetYTitle("events");
321   //
322   TH1F *hPullsx = new TH1F("hPullsx","",50,-7.,7.);
323   hPullsx->SetXTitle("#Delta x/#sqrt{<x,x>}");
324   hPullsx->SetYTitle("events");
325   //
326   TH1F *hPullsy = new TH1F("hPullsy","",50,-7.,7.);
327   hPullsy->SetXTitle("#Delta y/#sqrt{<y,y>}");
328   hPullsy->SetYTitle("events");
329   //
330   TH1F *hPullsz = new TH1F("hPullsz","",50,-7.,7.);
331   hPullsz->SetXTitle("#Delta z/#sqrt{<z,z>}");
332   hPullsz->SetYTitle("events");
333   //
334
335   Double_t mult[6]={0,0,0,0,0,0};
336   Double_t mult2[6]={0,0,0,0,0,0};
337   Double_t sigmamult[6]={0,0,0,0,0,0};
338   Double_t sigmamult2[6]={0,0,0,0,0,0};
339   Double_t tottracks[6]={0,0,0,0,0,0};
340   Double_t fittrks[6]={0,0,0,0,0,0};
341   Double_t tracks[6]={0,0,0,0,0,0};
342   Double_t etracks[6]={0,0,0,0,0,0};
343   Double_t xres[6]={0,0,0,0,0,0};
344   Double_t exres[6]={0,0,0,0,0,0};
345   Double_t yres[6]={0,0,0,0,0,0};
346   Double_t eyres[6]={0,0,0,0,0,0};
347   Double_t zres[6]={0,0,0,0,0,0};
348   Double_t ezres[6]={0,0,0,0,0,0};
349   Double_t xpull[6]={0,0,0,0,0,0};
350   Double_t expull[6]={0,0,0,0,0,0};
351   Double_t ypull[6]={0,0,0,0,0,0};
352   Double_t eypull[6]={0,0,0,0,0,0};
353   Double_t zpull[6]={0,0,0,0,0,0};
354   Double_t ezpull[6]={0,0,0,0,0,0};
355   Int_t    evts[6]={0,0,0,0,0,0};
356   Int_t    totevts[6]={0,0,0,0,0,0};
357   Int_t    vtx[6]={0,0,0,0,0,0};
358   Int_t    all[6]={0,0,0,0,0,0};
359   Double_t probVtx[6]={0,0,0,0,0,0};
360   Double_t eprobVtx[6]={0,0,0,0,0,0};
361   Int_t    bin;
362   //
363   // OTHER HISTOGRAMS
364   //
365   TH1F *hdx0 = new TH1F("hdx0","x resolution - bin 0",50,-500,500);
366   TH1F *hdx1 = new TH1F("hdx1","x resolution - bin 1",50,-500,500);
367   TH1F *hdx2 = new TH1F("hdx2","x resolution - bin 2",50,-500,500);
368   TH1F *hdx3 = new TH1F("hdx3","x resolution - bin 3",50,-400,400);
369   TH1F *hdx4 = new TH1F("hdx4","x resolution - bin 4",50,-300,300);
370   TH1F *hdx5 = new TH1F("hdx5","x resolution - bin 5",50,-300,300);
371   TH1F *hdy0 = new TH1F("hdy0","y resolution - bin 0",50,-500,500);
372   TH1F *hdy1 = new TH1F("hdy1","y resolution - bin 1",50,-500,500);
373   TH1F *hdy2 = new TH1F("hdy2","y resolution - bin 2",50,-500,500);
374   TH1F *hdy3 = new TH1F("hdy3","y resolution - bin 3",50,-400,400);
375   TH1F *hdy4 = new TH1F("hdy4","y resolution - bin 4",50,-300,300);
376   TH1F *hdy5 = new TH1F("hdy5","y resolution - bin 5",50,-300,300);
377   TH1F *hdz0 = new TH1F("hdz0","z resolution - bin 0",50,-1000,1000);
378   TH1F *hdz1 = new TH1F("hdz1","z resolution - bin 1",50,-800,800);
379   TH1F *hdz2 = new TH1F("hdz2","z resolution - bin 2",50,-800,800);
380   TH1F *hdz3 = new TH1F("hdz3","z resolution - bin 3",50,-600,600);
381   TH1F *hdz4 = new TH1F("hdz4","z resolution - bin 4",50,-500,500);
382   TH1F *hdz5 = new TH1F("hdz5","z resolution - bin 5",50,-500,500);
383
384   TH1F *hpx0 = new TH1F("hpx0","x pull - bin 0",50,-7,7);
385   TH1F *hpx1 = new TH1F("hpx1","x pull - bin 1",50,-7,7);
386   TH1F *hpx2 = new TH1F("hpx2","x pull - bin 2",50,-7,7);
387   TH1F *hpx3 = new TH1F("hpx3","x pull - bin 3",50,-7,7);
388   TH1F *hpx4 = new TH1F("hpx4","x pull - bin 4",50,-7,7);
389   TH1F *hpx5 = new TH1F("hpx5","x pull - bin 5",50,-7,7);
390   TH1F *hpy0 = new TH1F("hpy0","y pull - bin 0",50,-7,7);
391   TH1F *hpy1 = new TH1F("hpy1","y pull - bin 1",50,-7,7);
392   TH1F *hpy2 = new TH1F("hpy2","y pull - bin 2",50,-7,7);
393   TH1F *hpy3 = new TH1F("hpy3","y pull - bin 3",50,-7,7);
394   TH1F *hpy4 = new TH1F("hpy4","y pull - bin 4",50,-7,7);
395   TH1F *hpy5 = new TH1F("hpy5","y pull - bin 5",50,-7,7);
396   TH1F *hpz0 = new TH1F("hpz0","z pull - bin 0",50,-7,7);
397   TH1F *hpz1 = new TH1F("hpz1","z pull - bin 1",50,-7,7);
398   TH1F *hpz2 = new TH1F("hpz2","z pull - bin 2",50,-7,7);
399   TH1F *hpz3 = new TH1F("hpz3","z pull - bin 3",50,-7,7);
400   TH1F *hpz4 = new TH1F("hpz4","z pull - bin 4",50,-7,7);
401   TH1F *hpz5 = new TH1F("hpz5","z pull - bin 5",50,-7,7);
402
403
404   TH1F *hmult = new TH1F("hmult","hmult",50,-0.5,49.5);
405
406   TFile *in = new TFile(inname);
407   TNtuple *nt = (TNtuple*)in->Get("ntVtxRes");
408   nt->SetBranchAddress("ntracks",&nTrks);
409   nt->SetBranchAddress("nitstracks5or6",&nTrks5or6);
410   nt->SetBranchAddress("nitstracksFromStrange",&nTrksFromStrange);
411   nt->SetBranchAddress("nitstracksFromStrange5or6",&nTrksFromStrange5or6);
412   nt->SetBranchAddress("diffX",&diffX);
413   nt->SetBranchAddress("diffY",&diffY);
414   nt->SetBranchAddress("diffZ",&diffZ);
415   nt->SetBranchAddress("diffXerr",&diffXerr);
416   nt->SetBranchAddress("diffYerr",&diffYerr);
417   nt->SetBranchAddress("diffZerr",&diffZerr);
418   nt->SetBranchAddress("multiplicity",&dNchdy);
419   Int_t entries = (Int_t)nt->GetEntries();
420   Int_t nbytes=0;
421
422   for(Int_t i=0; i<entries; i++) {
423     nbytes += nt->GetEvent(i);
424     bin = GetBin(dNchdy);
425     mult[bin] += dNchdy;
426     hmult->Fill(dNchdy);
427     totevts[bin]++;
428     if(diffX < 90000.) { // vtx found
429       nEvVtx++;
430       mult2[bin] += dNchdy;
431       vtx[bin]++;
432       tottracks[bin] += nTrks;
433       evts[bin]++;
434       if(bin==0) hdx0->Fill(diffX);
435       if(bin==1) hdx1->Fill(diffX);
436       if(bin==2) hdx2->Fill(diffX);
437       if(bin==3) hdx3->Fill(diffX);
438       if(bin==4) hdx4->Fill(diffX);
439       if(bin==5) hdx5->Fill(diffX);
440       if(bin==0) hdy0->Fill(diffY);
441       if(bin==1) hdy1->Fill(diffY);
442       if(bin==2) hdy2->Fill(diffY);
443       if(bin==3) hdy3->Fill(diffY);
444       if(bin==4) hdy4->Fill(diffY);
445       if(bin==5) hdy5->Fill(diffY);
446       if(bin==0) hdz0->Fill(diffZ);
447       if(bin==1) hdz1->Fill(diffZ);
448       if(bin==2) hdz2->Fill(diffZ);
449       if(bin==3) hdz3->Fill(diffZ);
450       if(bin==4) hdz4->Fill(diffZ);
451       if(bin==5) hdz5->Fill(diffZ);
452       hdx->Fill(diffX);
453       hdy->Fill(diffY);
454       hdz->Fill(diffZ);
455       hTracksVtx->Fill(nTrks);
456       hTracksVtx5or6->Fill(nTrks5or6);
457       hTracksVtx5or6nonS->Fill(nTrks5or6-nTrksFromStrange5or6);
458       hPullsx->Fill(diffXerr);
459       hPullsy->Fill(diffYerr);
460       hPullsz->Fill(diffZerr);
461       if(bin==0) hpx0->Fill(diffXerr);
462       if(bin==1) hpx1->Fill(diffXerr);
463       if(bin==2) hpx2->Fill(diffXerr);
464       if(bin==3) hpx3->Fill(diffXerr);
465       if(bin==4) hpx4->Fill(diffXerr);
466       if(bin==5) hpx5->Fill(diffXerr);
467       if(bin==0) hpy0->Fill(diffYerr);
468       if(bin==1) hpy1->Fill(diffYerr);
469       if(bin==2) hpy2->Fill(diffYerr);
470       if(bin==3) hpy3->Fill(diffYerr);
471       if(bin==4) hpy4->Fill(diffYerr);
472       if(bin==5) hpy5->Fill(diffYerr);
473       if(bin==0) hpz0->Fill(diffZerr);
474       if(bin==1) hpz1->Fill(diffZerr);
475       if(bin==2) hpz2->Fill(diffZerr);
476       if(bin==3) hpz3->Fill(diffZerr);
477       if(bin==4) hpz4->Fill(diffZerr);
478       if(bin==5) hpz5->Fill(diffZerr);
479     } else {
480       nEvNoVtx++;
481       hTracksNoVtx->Fill(nTrks);
482       hTracksNoVtx5or6->Fill(nTrks5or6);
483       hTracksNoVtx5or6nonS->Fill(nTrks5or6-nTrksFromStrange5or6);
484     }
485     all[bin]++;
486   }
487
488
489   for(Int_t k=0;k<6;k++) {
490     mult2[k]      /= evts[k];
491     mult[k]      /= totevts[k];
492     tottracks[k] /= evts[k];
493     probVtx[k]    = (Double_t)vtx[k]/all[k];
494     eprobVtx[k]   = (Double_t)vtx[k]/all[k]/all[k]+(Double_t)vtx[k]*vtx[k]/all[k]/all[k]/all[k];
495     eprobVtx[k] = TMath::Sqrt(eprobVtx[k]); 
496   }
497
498   // calculate spread in multiplicity
499   for(Int_t i=0; i<entries; i++) {
500     nbytes += nt->GetEvent(i);
501     bin = GetBin(dNchdy);
502     sigmamult[bin] += (dNchdy-mult[bin])*(dNchdy-mult[bin])/totevts[bin];
503     if(diffX < 90000.) sigmamult2[bin] += (dNchdy-mult2[bin])*(dNchdy-mult2[bin])/evts[bin];
504   }
505
506   for(Int_t k=0;k<6;k++) {
507     sigmamult[k]  = TMath::Sqrt(sigmamult[k]);
508     sigmamult2[k] = TMath::Sqrt(sigmamult2[k]);
509   }
510
511   // fraction of found vertices
512   Float_t frac = (Float_t)nEvVtx/(nEvVtx+nEvNoVtx);
513   printf(" Fraction of events with vertex: %f\n",frac);
514
515
516   // FIT FUNCTIONS
517   TF1 *g = new TF1("g","gaus");
518   g->SetLineWidth(3);
519   TF1 *line = new TF1("line","pol1");
520   line->SetLineWidth(3);
521   TF1 *func = new TF1("func",FitFunc,2,35,2);
522   func->SetLineWidth(1);
523
524   Double_t x1,y1,sigmafit;
525   Char_t message[100];
526
527   //
528   //            DRAW PLOTS
529   //
530   gStyle->SetOptFit(1111);
531   
532   // Tracks in ITS for events w/ and w/o vertex
533   TCanvas *c1 = new TCanvas("c1","c1",0,0,1000,500);
534   c1->Divide(2,1);
535   c1->cd(1); 
536   hTracksVtx->Draw();
537   c1->cd(2); 
538   hTracksNoVtx->Draw();
539
540   // probability vs ntracks
541   TCanvas *c1b = new TCanvas("c1b","c1b",0,0,500,500);
542   TH1F *hTotTracks = (TH1F*)hTracksVtx->Clone("hTotTracks");
543   hTotTracks->Add(hTracksNoVtx);
544   TH1F *hProbTracks = (TH1F*)hTracksVtx->Clone("hProbTracks");
545   hProbTracks->Divide(hTotTracks);
546   hProbTracks->SetYTitle("Probability");
547   hProbTracks->SetTitle("Probability to find the vertex");
548   hProbTracks->Draw();
549
550   TCanvas *c1c = new TCanvas("c1c","c1c",0,0,500,500);
551   TH1F *hTotTracks5or6 = (TH1F*)hTracksVtx5or6->Clone("hTotTracks5or6");
552   hTotTracks5or6->Add(hTracksNoVtx5or6);
553   TH1F *hProbTracks5or6 = (TH1F*)hTracksVtx5or6->Clone("hProbTracks5or6");
554   hProbTracks5or6->Divide(hTotTracks5or6);
555   hProbTracks5or6->SetYTitle("Probability");
556   hProbTracks5or6->SetTitle("Probability to find the vertex");
557   hProbTracks5or6->Draw();
558
559   TCanvas *c1d = new TCanvas("c1d","c1d",0,0,500,500);
560   TH1F *hTotTracks5or6nonS = (TH1F*)hTracksVtx5or6nonS->Clone("hTotTracks5or6nonS");
561   hTotTracks5or6nonS->Add(hTracksNoVtx5or6nonS);
562   TH1F *hProbTracks5or6nonS = (TH1F*)hTracksVtx5or6nonS->Clone("hProbTracks5or6nonS");
563   hProbTracks5or6nonS->Divide(hTotTracks5or6nonS);
564   hProbTracks5or6nonS->SetYTitle("Probability");
565   hProbTracks5or6nonS->SetTitle("Probability to find the vertex");
566   hProbTracks5or6nonS->Draw();
567
568   // Global resolutions
569   TCanvas *c2 = new TCanvas("c2","c2",0,0,1000,400);
570   c2->Divide(3,1);
571   c2->cd(1); 
572   hdx->Draw();
573   g->SetRange(-1.*hdx->GetRMS(),+1.*hdx->GetRMS());
574   hdx->Fit("g","R");
575   c2->cd(2); 
576   hdy->Draw();
577   g->SetRange(-1.*hdy->GetRMS(),+1.*hdy->GetRMS());
578   hdy->Fit("g","R");
579   c2->cd(3); 
580   hdz->Draw();
581   g->SetRange(-1.*hdz->GetRMS(),+1.*hdz->GetRMS());
582   hdz->Fit("g","R");
583
584   // Pulls
585   TCanvas *c4 = new TCanvas("c4","c4",0,0,1000,400);
586   c4->Divide(3,1);
587   c4->cd(1); 
588   hPullsx->Draw();
589   g->SetRange(-3.*hPullsx->GetRMS(),+3.*hPullsx->GetRMS());
590   hPullsx->Fit("g","R");
591   c4->cd(2); 
592   hPullsy->Draw();
593   g->SetRange(-3.*hPullsy->GetRMS(),+3.*hPullsy->GetRMS());
594   hPullsy->Fit("g","R");
595   c4->cd(3); 
596   hPullsz->Draw();
597   g->SetRange(-3.*hPullsz->GetRMS(),+3.*hPullsz->GetRMS());
598   hPullsz->Fit("g","R");
599   
600   // probability VS multiplicity
601   TCanvas *c5 = new TCanvas("c5","c5",0,0,600,500);
602   TH2F *fr5 = new TH2F("fr5","",2,0,35,2,0,1.1); 
603   fr5->SetXTitle("dN_{ch}/dy");
604   fr5->SetYTitle("Probability");
605   fr5->Draw();
606   TGraphErrors *gr5 = new TGraphErrors(6,mult,probVtx,sigmamult,eprobVtx);
607   gr5->Draw("p");
608   gr5->SetMarkerStyle(21);
609
610   //
611   // resolutions VS multiplicity
612   //
613   // X
614   TCanvas *ax = new TCanvas("ax","ax",0,0,900,700);
615   ax->Divide(3,2);
616   ax->cd(1); 
617   hdx0->Draw(); 
618   g->SetRange(-3.*hdx0->GetRMS(),+3.*hdx0->GetRMS());
619   hdx0->Fit("g","Q"); 
620   xres[0]=g->GetParameter(2);
621   exres[0]=g->GetParError(2);
622   ax->cd(2); 
623   hdx1->Draw(); 
624   g->SetRange(-3.*hdx1->GetRMS(),+3.*hdx1->GetRMS());
625   hdx1->Fit("g","Q"); 
626   xres[1]=g->GetParameter(2);
627   exres[1]=g->GetParError(2);
628   ax->cd(3); 
629   hdx2->Draw(); 
630   g->SetRange(-3.*hdx2->GetRMS(),+3.*hdx2->GetRMS());
631   hdx2->Fit("g","Q"); 
632   xres[2]=g->GetParameter(2);
633   exres[2]=g->GetParError(2);
634   ax->cd(4); 
635   hdx3->Draw();
636   g->SetRange(-3.*hdx3->GetRMS(),+3.*hdx3->GetRMS());
637   hdx3->Fit("g","Q"); 
638   xres[3]=g->GetParameter(2);
639   exres[3]=g->GetParError(2);
640   ax->cd(5); 
641   hdx4->Draw();
642   g->SetRange(-3.*hdx4->GetRMS(),+3.*hdx4->GetRMS());
643   hdx4->Fit("g","Q");
644   xres[4]=g->GetParameter(2);
645   exres[4]=g->GetParError(2);
646   ax->cd(6); 
647   hdx5->Draw();
648   g->SetRange(-3.*hdx5->GetRMS(),+3.*hdx5->GetRMS());
649   hdx5->Fit("g","Q");
650   xres[5]=g->GetParameter(2);
651   exres[5]=g->GetParError(2);
652   // Y
653   TCanvas *ay = new TCanvas("ay","ay",0,0,900,700);
654   ay->Divide(3,2);
655   ay->cd(1); 
656   hdy0->Draw(); 
657   g->SetRange(-3.*hdy0->GetRMS(),+3.*hdy0->GetRMS());
658   hdy0->Fit("g","Q"); 
659   yres[0]=g->GetParameter(2);
660   eyres[0]=g->GetParError(2);
661   ay->cd(2); 
662   hdy1->Draw(); 
663   g->SetRange(-3.*hdy1->GetRMS(),+3.*hdy1->GetRMS());
664   hdy1->Fit("g","Q"); 
665   yres[1]=g->GetParameter(2);
666   eyres[1]=g->GetParError(2);
667   ay->cd(3); 
668   hdy2->Draw(); 
669   g->SetRange(-3.*hdy2->GetRMS(),+3.*hdy2->GetRMS());
670   hdy2->Fit("g","Q"); 
671   yres[2]=g->GetParameter(2);
672   eyres[2]=g->GetParError(2);
673   ay->cd(4); 
674   hdy3->Draw();
675   g->SetRange(-3.*hdy3->GetRMS(),+3.*hdy3->GetRMS());
676   hdy3->Fit("g","Q"); 
677   yres[3]=g->GetParameter(2);
678   eyres[3]=g->GetParError(2);
679   ay->cd(5); 
680   hdy4->Draw();
681   g->SetRange(-3.*hdy4->GetRMS(),+3.*hdy4->GetRMS());
682   hdy4->Fit("g","Q");
683   yres[4]=g->GetParameter(2);
684   eyres[4]=g->GetParError(2);
685   ay->cd(6); 
686   hdy5->Draw();
687   g->SetRange(-3.*hdy5->GetRMS(),+3.*hdy5->GetRMS());
688   hdy5->Fit("g","Q");
689   yres[5]=g->GetParameter(2);
690   eyres[5]=g->GetParError(2);
691   // Z
692   TCanvas *az = new TCanvas("az","az",0,0,900,700);
693   az->Divide(3,2);
694   az->cd(1); 
695   hdz0->Draw(); 
696   g->SetRange(-3.*hdz0->GetRMS(),+3.*hdz0->GetRMS());
697   hdz0->Fit("g","Q"); 
698   zres[0]=g->GetParameter(2);
699   ezres[0]=g->GetParError(2);
700   az->cd(2); 
701   hdz1->Draw(); 
702   g->SetRange(-3.*hdz1->GetRMS(),+3.*hdz1->GetRMS());
703   hdz1->Fit("g","Q"); 
704   zres[1]=g->GetParameter(2);
705   ezres[1]=g->GetParError(2);
706   az->cd(3); 
707   hdz2->Draw(); 
708   g->SetRange(-3.*hdz2->GetRMS(),+3.*hdz2->GetRMS());
709   hdz2->Fit("g","Q"); 
710   zres[2]=g->GetParameter(2);
711   ezres[2]=g->GetParError(2);
712   az->cd(4); 
713   hdz3->Draw();
714   g->SetRange(-3.*hdz3->GetRMS(),+3.*hdz3->GetRMS());
715   hdz3->Fit("g","Q"); 
716   zres[3]=g->GetParameter(2);
717   ezres[3]=g->GetParError(2);
718   az->cd(5); 
719   hdz4->Draw();
720   g->SetRange(-3.*hdz4->GetRMS(),+3.*hdz4->GetRMS());
721   hdz4->Fit("g","Q");
722   zres[4]=g->GetParameter(2);
723   ezres[4]=g->GetParError(2);
724   az->cd(6); 
725   hdz5->Draw();
726   g->SetRange(-3.*hdz5->GetRMS(),+3.*hdz5->GetRMS());
727   hdz5->Fit("g","Q");
728   zres[5]=g->GetParameter(2);
729   ezres[5]=g->GetParError(2);
730
731
732   //
733   // pulls VS multiplicity
734   //
735   // X
736   TCanvas *bx = new TCanvas("bx","bx",0,0,900,700);
737   bx->Divide(3,2);
738   bx->cd(1); 
739   hpx0->Draw(); 
740   g->SetRange(-3.*hpx0->GetRMS(),+3.*hpx0->GetRMS());
741   hpx0->Fit("g","Q"); 
742   xpull[0]=g->GetParameter(2);
743   expull[0]=g->GetParError(2);
744   bx->cd(2); 
745   hpx1->Draw(); 
746   g->SetRange(-3.*hpx1->GetRMS(),+3.*hpx1->GetRMS());
747   hpx1->Fit("g","Q"); 
748   xpull[1]=g->GetParameter(2);
749   expull[1]=g->GetParError(2);
750   bx->cd(3); 
751   hpx2->Draw(); 
752   g->SetRange(-3.*hpx2->GetRMS(),+3.*hpx2->GetRMS());
753   hpx2->Fit("g","Q"); 
754   xpull[2]=g->GetParameter(2);
755   expull[2]=g->GetParError(2);
756   bx->cd(4); 
757   hpx3->Draw();
758   g->SetRange(-3.*hpx3->GetRMS(),+3.*hpx3->GetRMS());
759   hpx3->Fit("g","Q"); 
760   xpull[3]=g->GetParameter(2);
761   expull[3]=g->GetParError(2);
762   bx->cd(5); 
763   hpx4->Draw();
764   g->SetRange(-3.*hpx4->GetRMS(),+3.*hpx4->GetRMS());
765   hpx4->Fit("g","Q");
766   xpull[4]=g->GetParameter(2);
767   expull[4]=g->GetParError(2);
768   bx->cd(6); 
769   hpx5->Draw();
770   g->SetRange(-3.*hpx5->GetRMS(),+3.*hpx5->GetRMS());
771   hpx5->Fit("g","Q");
772   xpull[5]=g->GetParameter(2);
773   expull[5]=g->GetParError(2);
774   // Y
775   TCanvas *by = new TCanvas("by","by",0,0,900,700);
776   by->Divide(3,2);
777   by->cd(1); 
778   hpy0->Draw(); 
779   g->SetRange(-3.*hpy0->GetRMS(),+3.*hpy0->GetRMS());
780   hpy0->Fit("g","Q"); 
781   ypull[0]=g->GetParameter(2);
782   eypull[0]=g->GetParError(2);
783   by->cd(2); 
784   hpy1->Draw(); 
785   g->SetRange(-3.*hpy1->GetRMS(),+3.*hpy1->GetRMS());
786   hpy1->Fit("g","Q"); 
787   ypull[1]=g->GetParameter(2);
788   eypull[1]=g->GetParError(2);
789   by->cd(3); 
790   hpy2->Draw(); 
791   g->SetRange(-3.*hpy2->GetRMS(),+3.*hpy2->GetRMS());
792   hpy2->Fit("g","Q"); 
793   ypull[2]=g->GetParameter(2);
794   eypull[2]=g->GetParError(2);
795   by->cd(4); 
796   hpy3->Draw();
797   g->SetRange(-3.*hpy3->GetRMS(),+3.*hpy3->GetRMS());
798   hpy3->Fit("g","Q"); 
799   ypull[3]=g->GetParameter(2);
800   eypull[3]=g->GetParError(2);
801   by->cd(5); 
802   hpy4->Draw();
803   g->SetRange(-3.*hpy4->GetRMS(),+3.*hpy4->GetRMS());
804   hpy4->Fit("g","Q");
805   ypull[4]=g->GetParameter(2);
806   eypull[4]=g->GetParError(2);
807   by->cd(6); 
808   hpy5->Draw();
809   g->SetRange(-3.*hpy5->GetRMS(),+3.*hpy5->GetRMS());
810   hpy5->Fit("g","Q");
811   ypull[5]=g->GetParameter(2);
812   eypull[5]=g->GetParError(2);
813   // Z
814   TCanvas *bz = new TCanvas("bz","bz",0,0,900,700);
815   bz->Divide(3,2);
816   bz->cd(1); 
817   hpz0->Draw(); 
818   g->SetRange(-3.*hpz0->GetRMS(),+3.*hpz0->GetRMS());
819   hpz0->Fit("g","Q"); 
820   zpull[0]=g->GetParameter(2);
821   ezpull[0]=g->GetParError(2);
822   bz->cd(2); 
823   hpz1->Draw(); 
824   g->SetRange(-3.*hpz1->GetRMS(),+3.*hpz1->GetRMS());
825   hpz1->Fit("g","Q"); 
826   zpull[1]=g->GetParameter(2);
827   ezpull[1]=g->GetParError(2);
828   bz->cd(3); 
829   hpz2->Draw(); 
830   g->SetRange(-3.*hpz2->GetRMS(),+3.*hpz2->GetRMS());
831   hpz2->Fit("g","Q"); 
832   zpull[2]=g->GetParameter(2);
833   ezpull[2]=g->GetParError(2);
834   bz->cd(4); 
835   hpz3->Draw();
836   g->SetRange(-3.*hpz3->GetRMS(),+3.*hpz3->GetRMS());
837   hpz3->Fit("g","Q"); 
838   zpull[3]=g->GetParameter(2);
839   ezpull[3]=g->GetParError(2);
840   bz->cd(5); 
841   hpz4->Draw();
842   g->SetRange(-3.*hpz4->GetRMS(),+3.*hpz4->GetRMS());
843   hpz4->Fit("g","Q");
844   zpull[4]=g->GetParameter(2);
845   ezpull[4]=g->GetParError(2);
846   bz->cd(6); 
847   hpz5->Draw();
848   g->SetRange(-3.*hpz5->GetRMS(),+3.*hpz5->GetRMS());
849   hpz5->Fit("g","Q");
850   zpull[5]=g->GetParameter(2);
851   ezpull[5]=g->GetParError(2);
852
853   gStyle->SetOptFit(0);
854
855   // res VS dNchdy
856   TCanvas *c6 = new TCanvas("c6","c6",0,0,600,500);
857   TH2F *fr6 = new TH2F("fr6","",2,0,35,2,0,200); 
858   fr6->SetXTitle("dN_{ch}/dy");
859   fr6->SetYTitle("#sigma [#mu m]");
860   fr6->Draw();
861   sigmamult2[0]=sigmamult2[1]=sigmamult2[2]=sigmamult2[3]=sigmamult2[4]=sigmamult2[5]=0.;
862   TGraphErrors *gr6x = new TGraphErrors(6,mult2,xres,sigmamult2,exres);
863   gr6x->Draw("p");
864   gr6x->SetMarkerStyle(22);
865   gr6x->Fit("func","E,R");
866   TGraphErrors *gr6z = new TGraphErrors(6,mult2,zres,sigmamult2,ezres);
867   gr6z->Draw("p");
868   gr6z->SetMarkerStyle(26);
869   gr6z->Fit("func","E,R");
870   TLegend *leg6 = new TLegend(0.6,0.75,0.9,0.9);
871   leg6->AddEntry(gr6x,"x/y coordinate","p");
872   leg6->AddEntry(gr6z,"z coordinate","p");
873   leg6->SetFillStyle(0);
874   leg6->SetBorderSize(0);
875   leg6->Draw();
876
877   // pull VS dNchdy
878   TCanvas *c8 = new TCanvas("c8","c8",0,0,600,500);
879   TH2F *fr8 = new TH2F("fr8","",2,0,35,2,0,2.); 
880   fr8->SetXTitle("dN_{ch}/dy");
881   fr8->SetYTitle("pull");
882   fr8->Draw();
883   TGraphErrors *gr8x = new TGraphErrors(6,mult2,xpull,sigmamult2,expull);
884   gr8x->Draw("p");
885   gr8x->SetMarkerStyle(22);
886   TGraphErrors *gr8z = new TGraphErrors(6,mult2,zpull,sigmamult2,ezpull);
887   gr8z->Draw("p");
888   gr8z->SetMarkerStyle(26);
889   TLegend *leg8 = new TLegend(0.6,0.75,0.9,0.9);
890   leg8->AddEntry(gr6x,"x/y coordinate","p");
891   leg8->AddEntry(gr6z,"z coordinate","p");
892   leg8->SetFillStyle(0);
893   leg8->SetBorderSize(0);
894   leg8->Draw();
895   TLine *l8 = new TLine(0,1,35,1);
896   l8->SetLineStyle(2);
897   l8->Draw();
898
899   return;
900 }
901 //----------------------------------------------------------------------------
902 void AliComputeVtxMeanFromESD(TString file="AliESDs.root",  
903                               Int_t mincontr=20) {
904   //-----------------------------------------------------------------------
905   // Compute weighted mean and cov. matrix from a set of AliESD
906   //-----------------------------------------------------------------------
907
908   gStyle->SetOptStat(0);
909   //gStyle->SetOptFit(0);
910
911
912   Double_t vtx[3],covvtx[6];
913   TTree *esdTree = 0;
914   AliESD *esd = 0;
915   AliESDVertex *vertex = 0;
916   TString vtitle;
917   Int_t nc,events,total=0;
918
919   Double_t avx=0.;
920   Double_t avy=0.;
921   Double_t avz=0.;
922   Double_t wgtavx=0.;
923   Double_t wgtavy=0.;
924   Double_t wgtavz=0.;
925   Double_t sum=0.;
926   Double_t sumwgtx=0.;
927   Double_t sumwgty=0.;
928   Double_t sumwgtz=0.;
929   Double_t rmsx=0;
930   Double_t rmsy=0;
931   Double_t rmsz=0;
932   Double_t varx=0;
933   Double_t vary=0;
934   Double_t varz=0;
935   Double_t covxy=0;
936   Double_t covxz=0;
937   Double_t covyz=0;
938   Double_t eavx,eavy,eavz,ewgtavx,ewgtavy,ewgtavz;
939
940   TH1F* hx = new TH1F("hx","",200,-1000,1000);
941   hx->SetXTitle("vertex x [#mu m]");
942   hx->SetYTitle("events");
943   TH1F* hy = new TH1F("hy","",200,-1000,1000);
944   hy->SetXTitle("vertex y [#mu m]");
945   hy->SetYTitle("events");
946   TH1F* hz = new TH1F("hz","",200,-10,10);
947   hz->SetXTitle("vertex z [cm]");
948   hz->SetYTitle("events");
949
950
951   for(Int_t i=1; i<100; i++) {
952     TString inname="event.";
953     inname+=i;
954     inname.Append("/");
955     inname.Append(file.Data());
956     if(gSystem->AccessPathName(inname.Data())) continue;
957     TFile *fin = TFile::Open(inname.Data());
958     esdTree = (TTree*)fin->Get("esdTree");
959     if(!esdTree) continue;
960     esdTree->SetBranchAddress("ESD",&esd);
961     events = esdTree->GetEntries();
962     printf("Number of events in ESD tree: %d\n",events);
963     total += events;
964
965     for(Int_t iev=0; iev<events; iev++) { //LOOP ON EVENTS
966       esdTree->GetEvent(iev);
967       vertex = (AliESDVertex*)esd->GetPrimaryVertex();
968       if(!vertex) continue;
969       nc = vertex->GetNContributors();
970       if(nc<mincontr) continue;
971       vertex->GetXYZ(vtx);
972       vertex->GetSigmaXYZ(errvtx); 
973       //printf("%f %f %f %f %f %f\n",vtx[0],vtx[1],vtx[2],errvtx[0],errvtx[1],errvtx[2]);
974
975       avx += vtx[0];
976       avy += vtx[1];
977       avz += vtx[2];
978       sum += 1.;
979       wgtavx += vtx[0]/errvtx[0]/errvtx[0];
980       wgtavy += vtx[1]/errvtx[1]/errvtx[1];
981       wgtavz += vtx[2]/errvtx[2]/errvtx[2];
982       sumwgtx += 1./errvtx[0]/errvtx[0];
983       sumwgty += 1./errvtx[1]/errvtx[1];
984       sumwgtz += 1./errvtx[2]/errvtx[2];
985      
986       hx->Fill(1e4*vtx[0]);
987       hy->Fill(1e4*vtx[1]);
988       hz->Fill(vtx[2]);
989
990       vertex = 0;
991     }
992     esdTree=0;
993     fin->Close();
994     delete fin;
995   }
996   
997   avx /= sum;
998   avy /= sum;
999   avz /= sum;
1000   wgtavx /= sumwgtx;
1001   wgtavy /= sumwgty;
1002   wgtavz /= sumwgtz;
1003   ewgtavx = 1./TMath::Sqrt(sumwgtx);
1004   ewgtavy = 1./TMath::Sqrt(sumwgty);
1005   ewgtavz = 1./TMath::Sqrt(sumwgtz);
1006   
1007   
1008   for(Int_t i=1; i<100; i++) {
1009     TString inname="event.";
1010     inname+=i;
1011     inname.Append("/");
1012     inname.Append(file.Data());
1013     if(gSystem->AccessPathName(inname.Data())) continue;
1014     TFile *fin = TFile::Open(inname.Data());
1015     esdTree = (TTree*)fin->Get("esdTree");
1016     if(!esdTree) continue;
1017     esdTree->SetBranchAddress("ESD",&esd);
1018     events = esdTree->GetEntries();
1019     for(Int_t iev=0; iev<events; iev++) { //LOOP ON EVENTS
1020       esdTree->GetEvent(iev);
1021       vertex = (AliESDVertex*)esd->GetPrimaryVertex();
1022       if(!vertex) continue;
1023       nc = vertex->GetNContributors();
1024       if(nc<mincontr) continue;
1025       vertex->GetXYZ(vtx);
1026       vertex->GetSigmaXYZ(errvtx); 
1027
1028       varx += (vtx[0]-avx)*(vtx[0]-avx);
1029       vary += (vtx[1]-avy)*(vtx[1]-avy);
1030       varz += (vtx[2]-avz)*(vtx[2]-avz);
1031       covxy += (vtx[0]-avx)*(vtx[1]-avy);
1032       covxz += (vtx[0]-avx)*(vtx[2]-avz);
1033       covyz += (vtx[1]-avy)*(vtx[2]-avz);
1034
1035       vertex = 0;
1036     }
1037   }
1038   
1039   varx /= sum;
1040   vary /= sum;
1041   varz /= sum;
1042   covxy /= sum;
1043   covxz /= sum;
1044   covyz /= sum;
1045   rmsx = TMath::Sqrt(varx);
1046   rmsy = TMath::Sqrt(vary);
1047   rmsz = TMath::Sqrt(varz);
1048   eavx = rmsx/TMath::Sqrt(sum);
1049   eavy = rmsy/TMath::Sqrt(sum);
1050   eavz = rmsz/TMath::Sqrt(sum);
1051   
1052
1053   printf("\n\nNumber of events: Total %d, Used %d\n",total,sum);
1054   printf("Average:\n x = (%f +- %f) mum\n y = (%f +- %f) mum\n z = (%f +- %f) mu\n",1e4*avx,1e4*eavx,1e4*avy,1e4*eavy,1e4*avz,1e4*eavz);
1055   printf("Weighted Average:\n x = (%f +- %f) mum\n y = (%f +- %f) mum\n z = (%f +- %f) mum\n",1e4*wgtavx,1e4*ewgtavx,1e4*wgtavy,1e4*ewgtavy,1e4*wgtavz,1e4*ewgtavz);
1056   printf("RMS:\n x = %f mum\n y = %f mum\n z = %f mum\n",1e4*rmsx,1e4*rmsy,1e4*rmsz);
1057
1058   TCanvas *c = new TCanvas("c","c",0,0,1000,500);
1059   c->Divide(3,1);
1060   c->cd(1);
1061   hx->Draw();
1062   TF1 *gx = new TF1("gx","gaus",-1000,1000);
1063   gx->SetLineColor(2);
1064   hx->Fit(gx);
1065   TF1 *gxx = (TF1*)gx->Clone("gxx");
1066   gxx->FixParameter(2,50.);
1067   gxx->SetLineStyle(2);
1068   gxx->Draw("same");
1069   c->cd(2);
1070   hy->Draw();
1071   TF1 *gy = new TF1("gy","gaus",-1000,1000);
1072   gy->SetLineColor(2);
1073   hy->Fit(gy);
1074   TF1 *gyy = (TF1*)gy->Clone("gyy");
1075   gyy->FixParameter(2,50.);
1076   gyy->SetLineStyle(2);
1077   gyy->Draw("same");
1078   c->cd(3);
1079   hz->Draw();
1080   TF1 *gz = new TF1("gz","gaus",-10,10);
1081   gz->SetLineColor(2);
1082   hz->Fit(gz);
1083   TF1 *gzz = (TF1*)gz->Clone("gzz");
1084   gzz->FixParameter(2,5.3);
1085   gzz->SetLineStyle(2);
1086   gzz->Draw("same");
1087
1088   vtx[0] = wgtavx;
1089   vtx[1] = wgtavy;
1090   vtx[2] = wgtavz;
1091   covvtx[0] = varx;
1092   covvtx[1] = covxy;
1093   covvtx[2] = vary;
1094   covvtx[3] = covxz;
1095   covvtx[4] = covyz;
1096   covvtx[5] = 5.3;
1097   AliESDVertex *vtxmean = new AliESDVertex(vtx,covvtx,0.,(Int_t)sum);
1098   vtxmean->SetTitle("Vertex from weighted average");
1099   TFile *out = new TFile("AliESDVertexMean.root","recreate");
1100   vtxmean->Write("vtxmean");
1101   out->Close();
1102
1103   return;
1104 }
1105 //----------------------------------------------------------------------------
1106 void AliComputeVtxMeanFromTree(TString file="AliESDVertices.root",  
1107                                Int_t mincontr=20) {
1108   //-----------------------------------------------------------------------
1109   // Compute weighted mean and cov. matrix from a set of AliESDVertices
1110   //-----------------------------------------------------------------------
1111   gStyle->SetOptStat(0);
1112   //gStyle->SetOptFit(0);
1113
1114
1115   Double_t vtx[3],covvtx[6];
1116   TString vtitle;
1117   Int_t nc,total=0;
1118
1119   Double_t avx=0.;
1120   Double_t avy=0.;
1121   Double_t avz=0.;
1122   Double_t wgtavx=0.;
1123   Double_t wgtavy=0.;
1124   Double_t wgtavz=0.;
1125   Double_t sum=0.;
1126   Double_t sumwgtx=0.;
1127   Double_t sumwgty=0.;
1128   Double_t sumwgtz=0.;
1129   Double_t rmsx=0;
1130   Double_t rmsy=0;
1131   Double_t rmsz=0;
1132   Double_t eavx,eavy,eavz,ewgtavx,ewgtavy,ewgtavz;
1133
1134   TH1F* hx = new TH1F("hx","",200,-1000,1000);
1135   hx->SetXTitle("vertex x [#mu m]");
1136   hx->SetYTitle("events");
1137   TH1F* hy = new TH1F("hy","",200,-1000,1000);
1138   hy->SetXTitle("vertex y [#mu m]");
1139   hy->SetYTitle("events");
1140   TH1F* hz = new TH1F("hz","",200,-10,10);
1141   hz->SetXTitle("vertex z [cm]");
1142   hz->SetYTitle("events");
1143
1144
1145   if(gSystem->AccessPathName(file.Data())) continue;
1146   TFile *fin = TFile::Open(file.Data());
1147   TTree *tree = (TTree*)fin->Get("TreeV");
1148   AliESDVertex *vertex = 0;
1149   tree->SetBranchAddress("AliESDVertex",&vertex);
1150   Int_t entries = (Int_t)tree->GetEntries();
1151
1152   for(Int_t i=0; i<entries; i++) {
1153     total += 1;
1154     tree->GetEvent(i);
1155     nc = vertex->GetNContributors();
1156     if(nc<mincontr) continue;
1157     vertex->GetXYZ(vtx);
1158     vertex->GetSigmaXYZ(errvtx); 
1159     //printf("%f %f %f %f %f %f\n",vtx[0],vtx[1],vtx[2],errvtx[0],errvtx[1],errvtx[2]);
1160
1161     avx += vtx[0];
1162     avy += vtx[1];
1163     avz += vtx[2];
1164     sum += 1.;
1165     wgtavx += vtx[0]/errvtx[0]/errvtx[0];
1166     wgtavy += vtx[1]/errvtx[1]/errvtx[1];
1167     wgtavz += vtx[2]/errvtx[2]/errvtx[2];
1168     sumwgtx += 1./errvtx[0]/errvtx[0];
1169     sumwgty += 1./errvtx[1]/errvtx[1];
1170     sumwgtz += 1./errvtx[2]/errvtx[2];
1171      
1172     hx->Fill(1e4*vtx[0]);
1173     hy->Fill(1e4*vtx[1]);
1174     hz->Fill(vtx[2]);
1175     
1176     vertex = 0;
1177   }
1178   
1179   avx /= sum;
1180   avy /= sum;
1181   avz /= sum;
1182   wgtavx /= sumwgtx;
1183   wgtavy /= sumwgty;
1184   wgtavz /= sumwgtz;
1185   ewgtavx = 1./TMath::Sqrt(sumwgtx);
1186   ewgtavy = 1./TMath::Sqrt(sumwgty);
1187   ewgtavz = 1./TMath::Sqrt(sumwgtz);
1188   
1189   
1190   for(Int_t i=0; i<entries; i++) {
1191     tree->GetEvent(i);
1192     nc = vertex->GetNContributors();
1193     if(nc<mincontr) continue;
1194     vertex->GetXYZ(vtx);
1195     vertex->GetSigmaXYZ(errvtx); 
1196
1197     varx += (vtx[0]-avx)*(vtx[0]-avx);
1198     vary += (vtx[1]-avy)*(vtx[1]-avy);
1199     varz += (vtx[2]-avz)*(vtx[2]-avz);
1200     covxy += (vtx[0]-avx)*(vtx[1]-avy);
1201     covxz += (vtx[0]-avx)*(vtx[2]-avz);
1202     covyz += (vtx[1]-avy)*(vtx[2]-avz);
1203
1204     vertex = 0;
1205   }
1206   
1207   varx /= sum;
1208   vary /= sum;
1209   varz /= sum;
1210   covxy /= sum;
1211   covxz /= sum;
1212   covyz /= sum;
1213   rmsx = TMath::Sqrt(varx);
1214   rmsy = TMath::Sqrt(vary);
1215   rmsz = TMath::Sqrt(varz);
1216   eavx = rmsx/TMath::Sqrt(sum);
1217   eavy = rmsy/TMath::Sqrt(sum);
1218   eavz = rmsz/TMath::Sqrt(sum);
1219   
1220
1221   printf("\n\nNumber of events: Total %d, Used %d\n",total,sum);
1222   printf("Average:\n x = (%f +- %f) mum\n y = (%f +- %f) mum\n z = (%f +- %f) mu\n",1e4*avx,1e4*eavx,1e4*avy,1e4*eavy,1e4*avz,1e4*eavz);
1223   printf("Weighted Average:\n x = (%f +- %f) mum\n y = (%f +- %f) mum\n z = (%f +- %f) mum\n",1e4*wgtavx,1e4*ewgtavx,1e4*wgtavy,1e4*ewgtavy,1e4*wgtavz,1e4*ewgtavz);
1224   printf("RMS:\n x = %f mum\n y = %f mum\n z = %f mum\n",1e4*rmsx,1e4*rmsy,1e4*rmsz);
1225
1226   TCanvas *c = new TCanvas("c","c",0,0,1000,500);
1227   c->Divide(3,1);
1228   c->cd(1);
1229   hx->Draw();
1230   TF1 *gx = new TF1("gx","gaus",-1000,1000);
1231   gx->SetLineColor(2);
1232   hx->Fit(gx);
1233   TF1 *gxx = (TF1*)gx->Clone("gxx");
1234   gxx->FixParameter(2,50.);
1235   gxx->SetLineStyle(2);
1236   gxx->Draw("same");
1237   c->cd(2);
1238   hy->Draw();
1239   TF1 *gy = new TF1("gy","gaus",-1000,1000);
1240   gy->SetLineColor(2);
1241   hy->Fit(gy);
1242   TF1 *gyy = (TF1*)gy->Clone("gyy");
1243   gyy->FixParameter(2,50.);
1244   gyy->SetLineStyle(2);
1245   gyy->Draw("same");
1246   c->cd(3);
1247   hz->Draw();
1248   TF1 *gz = new TF1("gz","gaus",-10,10);
1249   gz->SetLineColor(2);
1250   hz->Fit(gz);
1251   TF1 *gzz = (TF1*)gz->Clone("gzz");
1252   gzz->FixParameter(2,5.3);
1253   gzz->SetLineStyle(2);
1254   gzz->Draw("same");
1255
1256   vtx[0] = wgtavx;
1257   vtx[1] = wgtavy;
1258   vtx[2] = wgtavz;
1259   covvtx[0] = varx;
1260   covvtx[1] = covxy;
1261   covvtx[2] = vary;
1262   covvtx[3] = covxz;
1263   covvtx[4] = covyz;
1264   covvtx[5] = 5.3;
1265   AliESDVertex *vtxmean = new AliESDVertex(vtx,covvtx,0.,(Int_t)sum);
1266   vtxmean->SetTitle("Vertex from weighted average");
1267   TFile *out = new TFile("AliESDVertexMean.root","recreate");
1268   vtxmean->Write("vtxmean");
1269   out->Close();
1270
1271   return;
1272 }
1273 //---------------------------------------------------------------------------