7 #include "TClonesArray.h"
15 #include "AliITSgeom.h"
16 #include "TParticle.h"
19 // Global in this file only. Needed for Minuit
20 Int_t gstrt,gend; // starting and ending bin values
21 TH1D *gH1; // histogram to be fit.
23 void FindVertexs(Int_t evnt,Float_t frac=1.0,Float_t len=16.82){
25 // Get pointers to Alice detectors and Hits containers
26 AliDetector *ITS = gAlice->GetDetector("ITS");
27 if(!ITS) return; // error no ITS data exit
28 // TClonesArray *Particles = gAlice->Particles();
29 TClonesArray *ITShits = ITS->Hits();
30 TTree *TH = gAlice->TreeH();
31 Int_t ntracks = (Int_t)TH->GetEntries();
34 printf(" %d primary tracks in the file\n",ntracks);
35 // Array (stucture) of hits for the first and second layer
36 // this should be replaced with either clusters or digits
37 // when they are proporly defined.
38 Hit_tl *spd1 = new Hit_tl[ntracks];
39 Hit_tl *spd2 = new Hit_tl[ntracks];
40 Hit_tl **spdi = new Hit_tl*[ntracks];
41 Hit_tl **spdo = new Hit_tl*[ntracks];
42 for(Int_t i=0;i<ntracks;i++){
44 // printf("spdi[%d]=%p spd1[%d]=%p ",i,spdi[i],i,&(spd1[i]));
46 // printf("spdo[%d]=%p spd2[%d]=%p\n",i,spdo[i],i,&(spd2[i]));
51 HitsToV(spdi,i1max,spdo,i2max,ntracks,TH,ITShits,frac,len);
52 printf("back in Macro i1max=%d i2max=%d\n",i1max,i2max);
54 // Float_t r1=0.0,r2=0.0;
55 // for(i=0;i<TMath::Max(i1max,i2max);i++){
56 // if(i<i1max) r1 += spdi[i]->r;
57 // if(i<i2max) r2 += spdo[i]->r;
59 // printf("<r1>=%f i1max=%d\t<r2>=%f i2max=%d\n",
60 // r1/Float_t(i1max),i1max,r2/Float_t(i2max),i2max);
62 vz = vertexSlow(spdi,i1max,spdo,i2max);
64 printf("Slow Sorted event=%d Zvertex=%f\n",evnt,vz);
66 // vz = vertex(spdi,i1max,spdo,i2max);
68 // printf("Phi sorted event=%d Zvertex=%f\n",evnt,vz);
70 // vz = vertexEta(spdi,i1max,spdo,i2max);
72 // printf("Eta sorted event=%d Zvertex=%f\n",evnt,vz);
78 Bool_t L_SortPhi(const Hit_tl *s1,const Hit_tl *s2){
79 // Phi sorting function for qsort.
82 a = s1->phir - s2->phir;
83 if(a<0.0) return kTRUE;
84 if(a>0.0) return kFALSE;
85 a = s1->etar - s2->etar;
86 if(a<0.0) return kTRUE;
87 if(a>0.0) return kFALSE;
91 Bool_t L_SortEta(const Hit_tl *s1,const Hit_tl *s2){
92 // Eta sorting function for qsort.
95 a = s1->etar - s2->etar;
96 if(a<0.0) return kTRUE;
97 if(a>0.0) return kFALSE;
98 a = s1->phir - s2->phir;
99 if(a<0.0) return kTRUE;
100 if(a>0.0) return kFALSE;
104 void hpsortPhi(Hit_tl **ra,Int_t n){
110 l = ((n-1) >> 1) +1; // devide 2 + 1
114 rra = ra[--l]; // decrament first
118 if(--ir == 0){ // decrament first
126 if( j<ir && L_SortPhi(ra[j],ra[j+1]) ) j++;
127 if( L_SortPhi(rra,ra[j]) ){
140 void hpsortEta(Hit_tl **ra,Int_t n){
146 l = ((n-1) >> 1) +1; // devide 2 + 1
150 rra = ra[--l]; // decrament first
154 if(--ir == 0){ // decrament first
162 if( j<ir && L_SortEta(ra[j],ra[j+1]) ) j++;
163 if( L_SortEta(rra,ra[j]) ){
175 void fillStructure(Hit_tl **spd,Int_t &nspd,
176 Float_t *xv,Int_t *id,Int_t track,Int_t nhits){
177 Float_t PI2 = 2.0*TMath::Pi();
178 // Float_t PI = TMath::Pi();
180 Float_t x,y,z,zr,r,phi,eta,rphi;
181 Float_t dz = 0.0300; // 300 microns
182 Float_t drphi = 0.0050; // 50 microns
185 // if(nspd<5) printf("fill: spd=%p spd[%d]=%p i=%d spd[i]=%p id=%d %d %d\n",
186 // spd,nspd,spd[nspd],i,spd[i],id[0],id[1],id[2]);
192 if(phi<0.0) phi += PI2;
194 eta = -0.5*tan(0.5*atan2(r,z));
196 spd[i]->track = track;
207 zr = dz * Float_t(Int_t(z / dz)) + 0.5*dz;
208 rphi = drphi * Float_t(Int_t(rphi/drphi)) + 0.5*drphi;
210 spd[i]->xr = cos(phi)*rphi/r;
211 spd[i]->yr = -sin(phi)*rphi/r;
213 spd[i]->phir = rphi/r;
214 spd[i]->etar = -0.5*tan(0.5*atan2(r,zr));
220 void HitsToV(Hit_tl **spdi,Int_t &nspdi,Hit_tl **spdo,Int_t &nspdo,
221 Int_t ntracks,TTree *TH,TClonesArray *ITShits,
222 Float_t fraction=1.0,Float_t len=16.82){
223 Int_t i,t,h,n,nb,nhits,id[4],idold[4],Iseed,ieta=0,itrk=0,ieta2=0;
224 Float_t x[3],xb[3],xl[3];
226 TClonesArray *Part = gAlice->Particles();
231 idold[0] = idold[1] = idold[2] = idold[3] = 0;
232 xb[0] = xb[1] = xb[2] = 0.0;
235 printf("HitsToV: Iseed=%d fraction=%f Pixel length=%fcm\n",
237 gRandom->SetSeed(Iseed);
238 // printf("HitsToV: gRandom->Rndm(1)=%f\n",gRandom->Rndm(1));
239 for(t=0;t<ntracks;t++){
240 if(fraction<gRandom->Rndm(1)) continue; // skip some tracks
243 nb = TH->GetEvent(t);
244 nhits = ITShits->GetEntriesFast();
245 for(h=0;h<nhits;h++){
246 itsHit = (AliITShit *) ITShits->UncheckedAt(h);
247 itsHit->GetDetectorID(id[0],id[1],id[2]); id[3]=t;
248 itsHit->GetPositionG(x[0],x[1],x[2]);
249 itsHit->GetPositionL(xl[0],xl[1],xl[2]);
251 part = (TParticle *) (Part->UncheckedAt(itsHit->GetTrack()));
252 if(TMath::Abs(part->Eta())<=1.0) ieta++;
253 if(TMath::Abs(part->Eta())<=0.5) ieta2++;
255 if(TMath::Abs(x[2]/len) >= 1.0) continue;
256 if(x[0]==0.0&&x[1]==0.0){
257 printf("Hitsto: t=%d h=%d/%d id=%d,%d,%d x=%f,%f,%f\n",
258 t,h,nhits,id[0],id[1],id[2],x[0],x[1],x[2]);
260 } // end if x[0]==x[1]==0.0
261 if(!(id[0]==idold[0]&&id[1]==idold[1]&&
262 id[2]==idold[2]&&id[3]==idold[3])){
263 if(!(n<=0 || (xb[0]==0.0&&xb[1]==0.0))){
264 for(i=0;i<3;i++) xb[i] /= Float_t(n);
266 fillStructure(spdi,nspdi,xb,idold,t,n);
269 fillStructure(spdo,nspdo,xb,idold,t,n);
271 if(nspdi>ntracks || nspdo>ntracks){
272 printf("Hitsto: fill error,"
273 " nspdi=%d nspdo=%d ntracks=%d\n",
274 nspdi,nspdo,ntracks);
275 } // end if fill error
277 for(i=0;i<4;i++) idold[i] = id[i];
278 for(i=0;i<3;i++) xb[i] = 0.0;
280 } // end if id != idold
281 for(i=0;i<3;i++) xb[i] += x[i];
285 printf("exiting HitsToV: %d primary tracks in eta=+-1\n",ieta);
286 printf("exiting HitsToV: %d primary tracks #2 in eta=+-0.5\n",ieta2);
287 printf("exiting HitsToV: %d primary tracks in file used\n",itrk);
291 Float_t vertex(Hit_tl **spdi,Int_t i1max,Hit_tl **spdo,Int_t i2max){
292 Float_t r1 = 3.910078; // radius at which hit is from beam axis for spd1
293 Float_t r2 = 6.955933; // radius at which hit is from beam axis for spd2
294 Float_t DPhi = 0.005; // maximum allowed difference in phi angle
295 Float_t DZ = 12.5; // maximum allowed difference in z position
301 Float_t zv,av,su,i0,i1,i2,x0,x1,dphi,dz;
302 Float_t PI2 = 2.0*TMath::Pi();
303 Float_t PI = TMath::Pi();
305 // sort according to phi.
306 hpsortPhi(spdi,i1max);
307 hpsortPhi(spdo,i2max);
309 // find best vertex allong z.
310 TH2S *Pvzphi = new TH2S("Pvzphi","Phi: Posible Z vertecies vs. Phi",
311 nbinx,-1.0,1.0,32,0.0,PI2);
312 Pvzphi->Sumw2(); // collect good statitics
313 TH1F *Pvzfl = new TH1F("Pvzfl","Phi: Posible Z vertecies flattened",
316 TH1F *Pvztr = new TH1F("Pvztr","Phi: Z Vertex found for True Tracks",
318 Pvztr->Sumw2(); // collect good statitics
320 for(i=0;i<i1max;i++){
321 if(spdi[i]->r==0.0) {printf("spdi[%d]->r=0.0\n",i);continue;}
322 for(;spdo[start]->phir<spdi[i]->phir-1.5*DPhi;start++);
323 for(j=start;(spdo[j]->phir < spdi[i]->phir+DPhi) && (j<i2max);j++){
324 dphi = fabs(spdo[j]->phir - spdi[i]->phir); if(dphi>PI) dphi -= PI;
325 dz = fabs(spdo[j]->zr - spdi[i]->zr);
326 if(dphi>DPhi) continue;
327 if(dz>DZ) continue; // If outside dz range skip it
330 if(r2-r1!=0.0) zv = (r2*spdi[i]->zr - r1*spdo[j]->zr)/(r2-r1);
332 printf("vertex: spdi[%d]->r=%f = spdo[%d]->r=%f\n",i,r1,j,r2);
334 } // end if else r2-r1!=0.0
335 Pvzphi->Fill(zv,spdi[i]->phir);
337 if(spdi[i]->track == spdo[j]->track) Pvztr->Fill(zv);
341 TH1D *Pvzdef = Pvzphi->ProjectionX("Phi: Posible Z vertecies",1,nbinx,"E");
343 i0 = Pvzfl->GetBinContent(1);
345 i1 = Pvzfl->GetBinContent(nbinx);
347 su = x0-x1; if(su==0.0) return -200.0;
351 for(i=1;i<=nbinx;i++){
352 su = x1*Float_t(i) + x0;
353 Pvzfl->AddBinContent(i,-su);
356 printf("Phi: mean=%f RMS=%f w2=%f\n",
357 Pvzdef->GetMean(),Pvzdef->GetRMS(),Pvzdef->GetSumOfWeights());
358 printf("Phi: Flattened mean=%f RMS=%f w2=%f\n",
359 Pvzfl->GetMean(),Pvzfl->GetRMS(),Pvzfl->GetSumOfWeights());
361 av = 3.0 * Pvzfl->Integral(1,nbinx)/Float_t(nbinx);
362 printf("Phi: Flattened av=%f Pvzfl->Max=%f nbinx=%d\n",
363 av,Pvzfl->GetMaximum(),nbinx);
367 i1 = Pvzfl->GetBinContent(1);
368 i2 = Pvzfl->GetBinContent(2);
369 for(i=2;i<nbinx;i++){
370 i0 = i1; // old i-1 value
371 i1 = i2; // old i value
372 i2 = Pvzfl->GetBinContent(i+1); // new i+1 value
373 if(i1 > av && (i0 > av || i2 > av ) ){
374 if(!mod) mod = kTRUE;
375 } else if(mod) break;
376 if(mod){ // inside peak
378 avt += i1 * Pvzfl->GetXaxis()->GetBinCenter(i);
382 if(su!=0.0) zv = avt/su;
383 else zv = -100.0; // an unphysical value
385 TCanvas *c0 = new TCanvas("c0","Alice ITS vertex finder", 400,10,600,700);
387 c0->Print("vertex5_P_vz_phi.ps");
389 c0->Print("vertex5_P_vz_def.ps");
391 c0->Print("vertex5_P_vz_flat.ps");
393 c0->Print("vertex5_P_vz_true.ps");
398 void Chi2Gauss(Int_t &npar,Double_t *gin,Double_t &f,
399 Double_t *par,Int_t iflag){
401 Double_t delta,h,x,eh;
403 for(Int_t i=gstrt;i<gend;i++){
404 h = gH1->GetBinContent(i);
406 if(eh <= 0.0) eh = 1.0;
407 x = gH1->GetXaxis()->GetBinCenter(i);
408 delta = (h - par[0]*TMath::Gaus(x,par[1],par[2]) - par[3])/eh;
415 Float_t vertexSlow(Hit_tl **spdi,Int_t i1max,Hit_tl **spdo,Int_t i2max){
416 Float_t r1 = 3.910078; // radius at which hit is from beam axis for spd1
417 Float_t r2 = 6.955933; // radius at which hit is from beam axis for spd2
418 Float_t DPhi = 0.005; // maximum allowed difference in phi angle
420 Float_t DZ = 12.5; // maximum allowed difference in z position
426 Float_t zv,av,su,i0,i1,i2,x0,x1,dphi,dz;
427 Float_t PI2 = 2.0*TMath::Pi();
428 Float_t PI = TMath::Pi();
430 if(i1max<=0||i2max<=0) return -1.0E10;
432 // find best vertex allong z.
433 TH2S *Svzphi = new TH2S("Svzphi","Slow: Posible Z vertecies vs. Phi",
434 nbinx,+0.0,10.0,32,0.0,PI2);
435 Svzphi->Sumw2(); // collect good statitics
436 TH2S *Svzdphi = new TH2S("Svzdpii","Slow: Posible Z vertecies vs. DPhi",
437 200,+4.0,6.0,20,0.0,10*DPhi);
438 Svzdphi->Sumw2(); // collect good statitics
439 TH1F *Svzfl = new TH1F("Svzfl","Slow: Posible Z vertecies Flattened",
442 TH1F *Svztr = new TH1F("Svztr","Slow: Z Vertex found by True Tracks",
444 Svztr->Sumw2(); // collect good statitics
446 printf("Svertex: i1max=%d i2max=%d\n",i1max,i2max);
448 for(i=0;i<i1max;i++) for(j=0;j<i2max;j++) {
449 dphi = fabs(spdo[j]->phir - spdi[i]->phir); if(dphi>PI) dphi -= PI;
450 dz = fabs(spdo[j]->zr - spdi[i]->zr);
453 if(r2-r1!=0.0) zv = (r2*spdi[i]->zr - r1*spdo[j]->zr)/(r2-r1);
455 printf("vertex_slow: spdi[%d]->r=%f = spdo[%d]->r=%f\n",i,r1,j,r2);
457 } // end if else r1-r2!=0.0
458 // if(j<10&&i<10) printf("zv=%e dphi=%e,r1=%e,r2=%e,dz=%e\n",
459 // zv,dphi,r1,r2,dz);
460 Svzdphi->Fill(zv,dphi);
461 if(dphi>DPhi) continue; // If outside DPhi (momentum) range, skip it.
462 if(dz>DZ) continue; // If outside dz range, skip it.
463 Svzphi ->Fill(zv,spdi[i]->phir);
465 if(spdi[i]->track == spdo[j]->track) Svztr->Fill(zv);
468 TH1D *Svzdef = Svzphi->ProjectionX("Slow: Posible Z vertecies",0,nbinx,"E");
470 i0 = Svzfl->GetBinContent(1);
472 i1 = Svzfl->GetBinContent(nbinx);
474 su = x0-x1; if(su==0.0) return -200.0;
478 for(i=1;i<=nbinx;i++){
479 su = x1*Float_t(i) + x0;
480 Svzfl->AddBinContent(i,-su);
483 printf("Slow: mean=%f RMS=%f w2=%f\n",
484 Svzdef->GetMean(),Svzdef->GetRMS(),Svzdef->GetSumOfWeights());
485 printf("Slow: Flattened mean=%f RMS=%f w2=%f\n",
486 Svzfl->GetMean(),Svzfl->GetRMS(),Svzfl->GetSumOfWeights());
488 av = 3.0 * Svzfl->Integral(1,nbinx)/Float_t(nbinx);
489 printf("Slow: Flattened av=%f Tvxps->Max=%f nbinx=%d\n",
490 av,Svzfl->GetMaximum(),nbinx);
492 {// find best dPhi that masimizes the signal/noise ration.
493 Float_t sn=0.0,sig=0.0,nois=0.0,ns;
494 Int_t iend = Svzdphi->GetYaxis()->GetNbins();
495 Int_t jend = Svzdphi->GetXaxis()->GetNbins();
496 Int_t ipeak = Svzdphi->GetXaxis()->FindBin(Svzdef->GetMean());
498 for(i=0;i<=iend;i++){
499 sig += Svzdphi->GetCellContent(ipeak,i);
501 for(j=1;j<6;j++) ns += Svzdphi->GetCellContent(j,i);
502 for(j=jend-6;j<jend;j++) ns += Svzdphi->GetCellContent(j,i);
504 if(nois<=0.0) continue;
505 if((sig-nois)/nois>sn){
506 sn = (sig-nois)/nois;
509 // printf("Svertex: bin=%d signal/noise=%e\n",i,(sig-nois)/nois);
511 } // end find best dPhi
513 if(nbst<=0) nbst = 1; // must have some data.
514 BDphi = Svzdphi->GetYaxis()->GetBinUpEdge(nbst);
515 TH1D *Svzbst = Svzdphi->ProjectionX("Slow: Best, Z vertecies",0,nbst,"E");
517 { // Start Muinuit fitting
518 // initilize Minuit package
519 gH1 = Svzbst; // histogram to be fit
520 gstrt = Svzbst->GetXaxis()->FindBin(
521 Svzdef->GetMean()-2.0*(Svzdef->GetRMS()));//histogram start bin value
522 gend = Svzbst->GetXaxis()->FindBin(
523 Svzdef->GetMean()+2.0*(Svzdef->GetRMS()));//histogram end bin value
524 TMinuit *gMinuit = new TMinuit(4); // init Minuit
525 gMinuit->SetFCN(Chi2Gauss); // chi^2 function with Gaussian
526 Double_t arglist[10]; // Munuit parameter array
527 Int_t ierflg = 0; // Muniut error flag
529 //gMinuit->mnexcm("SET ERR",arglist,1,ierglg);
530 // Set starting values and step size for parameters
531 Double_t vstart[4],step[4];
534 Int_t jend = Svzbst->GetXaxis()->GetNbins();
535 for(j=1;j<6;j++) ns += Svzbst->GetBinContent(j);
536 for(j=jend-6;j<jend;j++) ns += Svzbst->GetBinContent(j);
538 } // end find backgrount
539 vstart[1] = Svzbst->GetMean();
540 vstart[2] = Svzbst->GetRMS();
541 if(vstart[2] == 0.0) vstart[2] = 0.04;
542 vstart[0] = (Svzbst->GetEntries() - (Svzbst->GetNbinsX())*vstart[3])*
543 vstart[2]/TMath::Sqrt(TMath::Pi());
544 if(vstart[0]<=0.0) vstart[0] = 1.0;
545 for(i=0;i<4;i++) step[i] = 0.05*vstart[i];
546 if(vstart[3] <= 0.0) step[3] = 0.1;
547 step[1] = 0.01; // mean expected at about zero set step my hand
548 gMinuit->mnparm(0,"Const",vstart[0],step[0],0,0,ierflg);
549 gMinuit->mnparm(1,"Mean" ,vstart[1],step[1],0,0,ierflg);
550 gMinuit->mnparm(2,"Sigma",vstart[2],step[2],0,0,ierflg);
551 gMinuit->mnparm(3,"Offst",vstart[3],step[3],0,0,ierflg);
552 // Now ready for minimization step
553 //arglist[0] = 500.; // Maximum number of calls
554 //arglist[1] = 1.; // Tolorance
555 gMinuit->mnexcm("MIGRAD",arglist,0,ierflg); // do minimization
556 gMinuit->mnexcm("MINO",arglist,0,ierflg); // find best errors
558 Double_t parmin,edm,errdef;
559 Int_t nvpar,nparx,icstat;
560 gMinuit->mnstat(parmin,edm,errdef,nvpar,nparx,icstat);
561 printf("Svertex: chi2gauss=%e edist=%e istat=%d dPhi=%e\n",
562 parmin,edm,icstat,BDphi);
563 TString chnam = TString(10);
564 Double_t par[4],epar[4],empar[4],eppar[4];
566 gMinuit->mnpout(i,chnam,par[i],epar[i],empar[i],eppar[i],ierflg);
567 gMinuit->mnerrs(i,eppar[i],empar[i],epar[i],arglist[i]);
568 printf("Svertex: %s = %e +- %e (%e,%e)\n",
569 chnam.Data(),par[i],epar[i],empar[i],eppar[i]);
571 } // End Muinuit fitting
574 i1 = Svzfl->GetBinContent(1);
575 i2 = Svzfl->GetBinContent(2);
576 for(i=2;i<nbinx;i++){
577 i0 = i1; // old i-1 value
578 i1 = i2; // old i value
579 i2 = Svzfl->GetBinContent(i+1); // new i+1 value
580 if(i1 > av && (i0 > av || i2 > av ) ){
581 if(!mod) mod = kTRUE;
582 } else if(mod) break;
583 if(mod){ // inside peak
585 avt += i1 * Svzfl->GetXaxis()->GetBinCenter(i);
589 if(su!=0.0) zv = avt/su;
590 else zv = -100.0; // an unphysical value
592 TCanvas *c1 = new TCanvas("c1","Slow Alice ITS vertex finder",
595 c1->Print("vertex5_S_vz_phi.eps");
597 c1->Print("vertex5_S_vz_dphi.eps");
599 c1->Print("vertex5_S_vz_def.eps");
601 c1->Print("vertex5_S_vz_bst.eps");
603 c1->Print("vertex5_S_vz_true.eps");
608 Float_t vertexEta(Hit_tl **spdi,Int_t i1max,Hit_tl **spdo,Int_t i2max){
609 Float_t r1 = 3.910078;// radius at which hit is from beam axis for spd1
610 Float_t r2 = 6.955933;// radius at which hit is from beam axis for spd2
611 Float_t DPhi = 0.005; // maximum allowed difference in phi angle
612 Float_t DEta = 0.100; // maximum allowed difference in eta/pseudorapidity
613 Float_t DZ = 12.5; // maximum allowed difference in z position
619 Float_t zv=0.0,av,su,i0,i1,i2,x0,x1,dphi,dz;
620 Float_t PI2 = 2.0*TMath::Pi();
621 Float_t PI = TMath::Pi();
623 // sort according to phi.
624 hpsortEta(spdi,i1max);
625 hpsortEta(spdo,i2max);
627 // find best vertex allong z.
628 TH2S *Evzphi = new TH2S("Evzphi","Eta: Posible Z vertecies vs. Phi",
629 nbinx,-5.0,5.0,32,0.0,PI2);
630 Evzphi->Sumw2(); // collect good statitics
631 TH2S *Evzdphi = new TH2S("Evzdphi","Eta: Posible Z vertecies vs. DPhi",
632 200,-1.0,1.0,20,0.0,10*DPhi);
633 Evzdphi->Sumw2(); // collect good statitics
634 TH1F *Evzfl = new TH1F("Evzfl","Eta: Posible Z vertecies Flattened",
637 TH1F *Evztr = new TH1F("Evztr","Eta: Z Vertex found by True Tracks",
639 Evztr->Sumw2(); // collect good statitics
641 for(i=0;i<i1max;i++){
642 for(;spdo[start]->etar < spdi[i]->etar-1.5*DEta;start++);
643 for(j=start;(spdo[j]->etar < spdi[i]->etar+DEta) && (j < i2max);j++){
644 dphi = fabs(spdi[i]->phir - spdo[j]->phir); if(dphi>PI) dphi -= PI;
645 dz = fabs(spdi[i]->zr - spdo[j]->zr);
648 if(r2-r1!=0.0) zv = (r2*spdi[i]->zr - r1*spdo[j]->zr)/(r2-r1);
649 else printf("vertex_Eta: spdi[%d]->r=%f = spdo[%d]->r=%f\n",
651 Evzdphi->Fill(zv,dphi);
652 if(dphi>DPhi) continue;
654 Evzphi->Fill(zv,spdi[i]->phir);
656 if(spdi[i]->track == spdo[j]->track) Evztr ->Fill(zv);
660 TH1D *Evzdef = Evzphi->ProjectionX("Eta: Z vertecies Eta",1,nbinx,"E");
662 i0 = Evzfl->GetBinContent(1);
664 i1 = Evzfl->GetBinContent(nbinx);
666 su = x0-x1; if(su==0.0) return -200.0;
670 for(i=1;i<=nbinx;i++){
671 su = x1*Float_t(i) + x0;
672 Evzfl->AddBinContent(i,-su);
675 printf("Eta: mean=%f RMS=%f w2=%f\n",
676 Evzdef->GetMean(),Evzdef->GetRMS(),Evzdef->GetSumOfWeights());
677 printf("Eta: Flattened mean=%f RMS=%f w2=%f\n",
678 Evzfl->GetMean(),Evzfl->GetRMS(),Evzfl->GetSumOfWeights());
680 av = 3.0 * Evzfl->Integral(1,nbinx)/Float_t(nbinx);
681 printf("Eta: Flattened av=%f TvxpE->Max=%f nbinx=%d\n",
682 av,Evzfl->GetMaximum(),nbinx);
686 i1 = Evzfl->GetBinContent(1);
687 i2 = Evzfl->GetBinContent(2);
688 for(i=2;i<nbinx;i++){
689 i0 = i1; // old i-1 value
690 i1 = i2; // old i value
691 i2 = Evzfl->GetBinContent(i+1); // new i+1 value
692 if(i1 > av && (i0 > av || i2 > av ) ){
693 if(!mod) mod = kTRUE;
694 } else if(mod) break;
695 if(mod){ // inside peak
697 avt += i1 * Evzfl->GetXaxis()->GetBinCenter(i);
701 if(su!=0.0) zv = avt/su;
702 else zv = -100.0; // an unphysical value
704 TCanvas *c2 = new TCanvas("c2","Alice ITS vertex finder Eta",
707 c2->Print("vertex5_E_vz_phi.ps");
709 c2->Print("vertex5_E_vz_dphi.ps");
711 c2->Print("vertex5_E_vz_def.ps");
713 c2->Print("vertex5_E_vz_flat.ps");
715 c2->Print("vertex5_E_vz_true.ps");