1 // Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
2 //*-- Copyright © ASV
8 #include "AliL3Histogram.h"
9 #include "AliL3TrackArray.h"
10 #include "AliL3HoughTrack.h"
11 #include "AliL3HoughMaxFinder.h"
13 //_____________________________________________________________
14 // AliL3HoughMaxFinder
18 ClassImp(AliL3HoughMaxFinder)
21 AliL3HoughMaxFinder::AliL3HoughMaxFinder()
30 AliL3HoughMaxFinder::AliL3HoughMaxFinder(Char_t *histotype,AliL3Histogram *hist)
34 //fTracks = new AliL3TrackArray("AliL3HoughTrack");
35 if(strcmp(histotype,"KappaPhi")==0) fHistoType='c';
36 if(strcmp(histotype,"DPsi")==0) fHistoType='l';
43 AliL3HoughMaxFinder::~AliL3HoughMaxFinder()
49 void AliL3HoughMaxFinder::FindAbsMaxima(Int_t &max_xbin,Int_t &max_ybin)
53 printf("AliL3HoughMaxFinder::FindAbsMaxima : No histogram!\n");
56 AliL3Histogram *hist = fCurrentHisto;
58 Int_t xmin = hist->GetFirstXbin();
59 Int_t xmax = hist->GetLastXbin();
60 Int_t ymin = hist->GetFirstYbin();
61 Int_t ymax = hist->GetLastYbin();
63 Double_t value,max_value=0;
65 for(Int_t xbin=xmin; xbin<=xmax; xbin++)
67 for(Int_t ybin=ymin; ybin<=ymax; ybin++)
69 bin = hist->GetBin(xbin,ybin);
70 value = hist->GetBinContent(bin);
82 AliL3TrackArray *AliL3HoughMaxFinder::FindBigMaxima(AliL3Histogram *hist)
85 Int_t xmin = hist->GetFirstXbin();
86 Int_t xmax = hist->GetLastXbin();
87 Int_t ymin = hist->GetFirstYbin();
88 Int_t ymax = hist->GetLastYbin();
89 Int_t bin[25],bin_index;
92 AliL3TrackArray *tracks = new AliL3TrackArray("AliL3HoughTrack");
93 AliL3HoughTrack *track;
95 for(Int_t xbin=xmin+2; xbin<xmax-3; xbin++)
97 for(Int_t ybin=ymin+2; ybin<ymax-3; ybin++)
100 for(Int_t xb=xbin-2; xb<=xbin+2; xb++)
102 for(Int_t yb=ybin-2; yb<=ybin+2; yb++)
104 bin[bin_index]=hist->GetBin(xb,yb);
105 value[bin_index]=hist->GetBinContent(bin[bin_index]);
110 if(value[12]==0) continue;
114 if(value[b] > value[12] || b==bin_index) break;
121 Double_t max_x = hist->GetBinCenterX(xbin);
122 Double_t max_y = hist->GetBinCenterY(ybin);
123 track = (AliL3HoughTrack*)tracks->NextTrack();
124 track->SetTrackParameters(max_x,max_y,(Int_t)value[12]);
134 AliL3TrackArray *AliL3HoughMaxFinder::FindMaxima(AliL3Histogram *hist,Int_t *rowrange,Int_t ref_row)
136 //Locate all the maxima in input histogram.
137 //Maxima is defined as bins with more entries than the
138 //immediately neighbouring bins.
140 Int_t xmin = hist->GetFirstXbin();
141 Int_t xmax = hist->GetLastXbin();
142 Int_t ymin = hist->GetFirstYbin();
143 Int_t ymax = hist->GetLastYbin();
144 Int_t bin[9],track_counter=0;
147 AliL3TrackArray *tracks = new AliL3TrackArray("AliL3HoughTrack");
148 AliL3HoughTrack *track;
150 for(Int_t xbin=xmin+1; xbin<xmax-1; xbin++)
152 for(Int_t ybin=ymin+1; ybin<ymax-1; ybin++)
154 bin[0] = hist->GetBin(xbin-1,ybin-1);
155 bin[1] = hist->GetBin(xbin,ybin-1);
156 bin[2] = hist->GetBin(xbin+1,ybin-1);
157 bin[3] = hist->GetBin(xbin-1,ybin);
158 bin[4] = hist->GetBin(xbin,ybin);
159 bin[5] = hist->GetBin(xbin+1,ybin);
160 bin[6] = hist->GetBin(xbin-1,ybin+1);
161 bin[7] = hist->GetBin(xbin,ybin+1);
162 bin[8] = hist->GetBin(xbin+1,ybin+1);
163 value[0] = hist->GetBinContent(bin[0]);
164 value[1] = hist->GetBinContent(bin[1]);
165 value[2] = hist->GetBinContent(bin[2]);
166 value[3] = hist->GetBinContent(bin[3]);
167 value[4] = hist->GetBinContent(bin[4]);
168 value[5] = hist->GetBinContent(bin[5]);
169 value[6] = hist->GetBinContent(bin[6]);
170 value[7] = hist->GetBinContent(bin[7]);
171 value[8] = hist->GetBinContent(bin[8]);
173 if(value[4] <= fThreshold) continue;//central bin below threshold
175 if(value[4]>value[0] && value[4]>value[1] && value[4]>value[2]
176 && value[4]>value[3] && value[4]>value[5] && value[4]>value[6]
177 && value[4]>value[7] && value[4]>value[8])
179 //Found a local maxima
180 Float_t max_x = hist->GetBinCenterX(xbin);
181 Float_t max_y = hist->GetBinCenterY(ybin);
183 track = (AliL3HoughTrack*)tracks->NextTrack();
189 track->SetTrackParameters(max_x,max_y,(Int_t)value[4]);
192 track->SetLineParameters(max_x,max_y,(Int_t)value[4],rowrange,ref_row);
195 printf("AliL3HoughMaxFinder: Error in tracktype\n");
203 continue; //not a maxima
211 AliL3TrackArray *AliL3HoughMaxFinder::LookForPeaks(AliL3Histogram *hist,Int_t nbins)
214 AliL3TrackArray *tracks = new AliL3TrackArray("AliL3HoughTrack");
215 AliL3HoughTrack *track;
216 Int_t xmin = hist->GetFirstXbin();
217 Int_t xmax = hist->GetLastXbin();
218 Int_t ymin = hist->GetFirstYbin();
219 Int_t ymax = hist->GetLastYbin();
222 for(Int_t xbin=xmin+nbins; xbin <= xmax - nbins; xbin++)
224 for(Int_t ybin=ymin+nbins; ybin <= ymax - nbins; ybin++)
227 for(Int_t xbin_loc = xbin-nbins; xbin_loc <= xbin+nbins; xbin_loc++)
229 for(Int_t ybin_loc = ybin-nbins; ybin_loc <= ybin+nbins; ybin_loc++)
231 Int_t bin_loc = hist->GetBin(xbin_loc,ybin_loc);
232 weight_loc += (Int_t)hist->GetBinContent(bin_loc);
238 track = (AliL3HoughTrack*)tracks->NextTrack();
239 track->SetTrackParameters(hist->GetBinCenterX(xbin),hist->GetBinCenterY(ybin),weight_loc);
246 AliL3HoughTrack *track1,*track2;
248 for(Int_t i=1; i<tracks->GetNTracks(); i++)
250 track1 = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
251 if(!track1) continue;
252 Int_t xbin1 = hist->FindXbin(track1->GetKappa());
253 Int_t ybin1 = hist->FindXbin(track1->GetPhi0());
254 for(Int_t j=0; j < i; j++)
256 track2 = (AliL3HoughTrack*)tracks->GetCheckedTrack(j);
257 if(!track2) continue;
258 Int_t xbin2 = hist->FindXbin(track2->GetKappa());
259 Int_t ybin2 = hist->FindYbin(track2->GetPhi0());
260 if(abs(xbin1-xbin2) < 10 && abs(ybin1-ybin2) < 10)
272 AliL3HoughTrack *AliL3HoughMaxFinder::CalculatePeakInWindow(Int_t *maxbin,Int_t t0,Int_t t1,Double_t t2,Int_t t3)
274 //Try to expand the area around the maxbin +- t0
278 printf("AliL3HoughMaxFinder::LocatePeak : No histogram\n");
281 AliL3Histogram *hist = fCurrentHisto;
282 Int_t xmin = hist->GetFirstXbin();
283 Int_t xmax = hist->GetLastXbin();
284 Int_t ymin = hist->GetFirstYbin();
285 Int_t ymax = hist->GetLastYbin();
287 Int_t xlow = maxbin[0]-t0;
290 Int_t xup = maxbin[0]+t0;
293 Int_t ylow = maxbin[1]-t0;
296 Int_t yup = maxbin[1]+t0;
300 Int_t nbinsx = hist->GetNbinsX()+1;
302 Int_t *m = new Int_t[nbinsx];
303 Int_t *m_low = new Int_t[nbinsx];
304 Int_t *m_up = new Int_t[nbinsx];
308 Int_t max_x=0,sum=0,max_xbin=0,bin;
310 for(Int_t xbin=xlow; xbin<=xup; xbin++)
312 for(Int_t ybin=ylow; ybin <= yup; ybin++)
315 for(Int_t y=ybin; y <= ybin+t1; y++)
317 if(y>yup) break; //reached the upper limit in y.
319 bin = hist->GetBin(xbin,y);
320 sum += (Int_t)hist->GetBinContent(bin);
323 if(sum > m[xbin]) //Max value locally in this xbin
327 m_up[xbin]=ybin + t1;
332 if(m[xbin] > max_x) //Max value globally in x-direction
335 max_x = m[xbin];//sum;
338 //printf("max_xbin %d max_x %d m_low %d m_up %d\n",max_xbin,max_x,m_low[max_xbin],m_up[max_xbin]);
339 //printf("ylow %f yup %f\n",hist->GetBinCenterY(m_low[max_xbin]),hist->GetBinCenterY(m_up[max_xbin]));
341 //Determine a width in the x-direction
342 Int_t x_low=0,x_up=0;
343 for(Int_t xbin=max_xbin-1; xbin >= xmin; xbin--)
345 if(m[xbin] < max_x*t2)
351 for(Int_t xbin = max_xbin+1; xbin <=xmax; xbin++)
353 if(m[xbin] < max_x*t2)
359 printf("x_low %d x_up %d\n",x_low,x_up);
361 Double_t top=0,butt=0,value,x_peak;
362 if(x_up - x_low + 1 > t3)
365 printf("\nxrange out if limit x_up %d x_low %d\n\n",x_low,x_up);
370 x_peak = hist->GetBinCenterX(max_xbin);
375 //printf("xlow %f xup %f\n",hist->GetBinCenterX(x_low),hist->GetBinCenterX(x_up));
376 //printf("Spread in x %d\n",x_up-x_low +1);
378 //Now, calculate the center of mass in x-direction
379 for(Int_t xbin=x_low; xbin <= x_up; xbin++)
381 value = hist->GetBinCenterX(xbin);
382 top += value*m[xbin];
389 //Find the peak in y direction:
390 Int_t x_l = hist->FindXbin(x_peak);
391 if(hist->GetBinCenterX(x_l) > x_peak)
396 if(hist->GetBinCenterX(x_l) > x_peak || hist->GetBinCenterX(x_u) <= x_peak)
397 printf("\nAliL3HoughMaxFinder::FindPeak : Wrong xrange %f %f %f\n\n",hist->GetBinCenterX(x_l),x_peak,hist->GetBinCenterX(x_u));
399 //printf("\nxlow %f xup %f\n",hist->GetBinCenterX(x_l),hist->GetBinCenterX(x_u));
403 //printf("ylow %f yup %f\n",hist->GetBinCenterY(m_low[x_l]),hist->GetBinCenterY(m_up[x_l]));
404 //printf("ylow %f yup %f\n",hist->GetBinCenterY(m_low[x_u]),hist->GetBinCenterY(m_up[x_u]));
406 for(Int_t ybin=m_low[x_l]; ybin <= m_up[x_l]; ybin++)
408 value = hist->GetBinCenterY(ybin);
409 bin = hist->GetBin(x_l,ybin);
410 top += value*hist->GetBinContent(bin);
411 butt += hist->GetBinContent(bin);
413 Double_t y_peak_low = top/butt;
415 //printf("y_peak_low %f\n",y_peak_low);
418 for(Int_t ybin=m_low[x_u]; ybin <= m_up[x_u]; ybin++)
420 value = hist->GetBinCenterY(ybin);
421 bin = hist->GetBin(x_u,ybin);
422 top += value*hist->GetBinContent(bin);
423 butt += hist->GetBinContent(bin);
425 Double_t y_peak_up = top/butt;
427 //printf("y_peak_up %f\n",y_peak_up);
429 Double_t x_value_up = hist->GetBinCenterX(x_u);
430 Double_t x_value_low = hist->GetBinCenterX(x_l);
432 Double_t y_peak = (y_peak_low*(x_value_up - x_peak) + y_peak_up*(x_peak - x_value_low))/(x_value_up - x_value_low);
436 bin = hist->FindBin(x_peak,y_peak);
437 Int_t weight = (Int_t)hist->GetBinContent(bin);
439 AliL3HoughTrack *track = new AliL3HoughTrack();
440 track->SetTrackParameters(x_peak,y_peak,weight);
442 //Reset area around peak
443 for(Int_t xbin=x_low; xbin<=x_up; xbin++)
445 for(Int_t ybin=m_low[xbin]; ybin<=m_up[xbin]; ybin++)
447 bin = hist->GetBin(xbin,ybin);
448 hist->SetBinContent(bin,0);
461 AliL3HoughTrack *AliL3HoughMaxFinder::FindPeakLine(Double_t rho,Double_t theta)
463 //Peak finder based on a second line transformation on kappa-phi space,
464 //to use as a baseline.
468 printf("AliL3HoughTransformer::FindPeakLine : No input histogram\n");
472 //get the line parameters:
473 Double_t a = -1./tan(theta);
474 Double_t b = rho/sin(theta);
476 printf("rho %f theta %f\n",rho,theta);
477 //now, start looking along the line.
478 Int_t xmin = fCurrentHisto->GetFirstXbin();
479 Int_t xmax = fCurrentHisto->GetLastXbin();
483 for(Int_t xbin=xmin; xbin<=xmax; xbin++)
485 Double_t x = fCurrentHisto->GetBinCenterX(xbin);
486 Double_t y = a*x + b;
487 Int_t bin = fCurrentHisto->FindBin(x,y);
488 //printf("x %f y %f weight %d\n",x,y,fCurrentHisto->GetBinContent(bin));
489 if(fCurrentHisto->GetBinContent(bin) > max_weight)
491 max_weight = (Int_t)fCurrentHisto->GetBinContent(bin);
497 AliL3HoughTrack *track = new AliL3HoughTrack();
498 track->SetTrackParameters(max_bin[0],max_bin[1],max_weight);
504 void AliL3HoughMaxFinder::FindPeak1(Float_t *xpeaks,Float_t *ypeaks,Int_t *weight,Int_t &n,
505 Int_t y_window,Int_t x_bin_sides)
507 //Testing mutliple peakfinding.
508 //The algorithm searches the histogram for prepreaks by looking in windows
509 //for each bin on the xaxis. The size of these windows is controlled by y_window.
510 //Then the prepreaks are sorted according to their weight (sum inside window),
511 //and the peak positions are calculated by taking the weighted mean in both
512 //x and y direction. The size of the peak in x-direction is controlled by x_bin_sides.
514 Int_t max_entries = n;
518 printf("AliL3HoughMaxFinder::FindPeak1 : No input histogram\n");
522 //Int_t x_bin_sides=1;
524 Float_t max_kappa = 0.001;
525 Float_t max_phi0 = 0.05;
529 Int_t xmin = fCurrentHisto->GetFirstXbin();
530 Int_t xmax = fCurrentHisto->GetLastXbin();
531 Int_t ymin = fCurrentHisto->GetFirstYbin();
532 Int_t ymax = fCurrentHisto->GetLastYbin();
533 Int_t nbinsx = fCurrentHisto->GetNbinsX()+1;
535 AxisWindow **windowPt = new AxisWindow*[nbinsx];
536 AxisWindow **anotherPt = new AxisWindow*[nbinsx];
538 for(Int_t i=0; i<nbinsx; i++)
540 windowPt[i] = new AxisWindow;
541 bzero((void*)windowPt[i],sizeof(AxisWindow));
542 anotherPt[i] = windowPt[i];
545 for(Int_t xbin=xmin; xbin<=xmax; xbin++)
548 for(Int_t ybin=ymin; ybin<=ymax-y_window; ybin++)
550 Int_t sum_in_window=0;
551 for(Int_t b=ybin; b<ybin+y_window; b++)
554 Int_t bin = fCurrentHisto->GetBin(xbin,b);
555 sum_in_window += (Int_t)fCurrentHisto->GetBinContent(bin);
558 if(sum_in_window > max_sum)
560 max_sum = sum_in_window;
561 windowPt[xbin]->ymin = ybin;
562 windowPt[xbin]->ymax = ybin + y_window;
563 windowPt[xbin]->weight = sum_in_window;
564 windowPt[xbin]->xbin = xbin;
569 //Sort the windows according to the weight
570 SortPeaks(windowPt,0,nbinsx);
572 //for(Int_t i=0; i<nbinsx; i++)
573 //printf("xbin %f weight %d\n",fCurrentHisto->GetBinCenterX(windowPt[i]->xbin),windowPt[i]->weight);
576 for(Int_t i=0; i<nbinsx; i++)
579 Int_t xbin = windowPt[i]->xbin;
581 if(xbin<xmin || xbin > xmax-1) continue;
583 //Check if this is really a local maxima
584 if(anotherPt[xbin-1]->weight > anotherPt[xbin]->weight ||
585 anotherPt[xbin+1]->weight > anotherPt[xbin]->weight)
588 for(Int_t j=windowPt[i]->ymin; j<windowPt[i]->ymax; j++)
590 //Calculate the mean in y direction:
591 Int_t bin = fCurrentHisto->GetBin(windowPt[i]->xbin,j);
592 top += (fCurrentHisto->GetBinCenterY(j))*(fCurrentHisto->GetBinContent(bin));
593 butt += fCurrentHisto->GetBinContent(bin);
595 xpeaks[n] = fCurrentHisto->GetBinCenterX(windowPt[i]->xbin);
596 ypeaks[n] = top/butt;
598 if(n==max_entries) break;
602 //Improve the peaks by including the region around in x.
606 for(Int_t i=0; i<n; i++)
608 Int_t xbin = fCurrentHisto->FindXbin(xpeaks[i]);
609 if(xbin - x_bin_sides < xmin || xbin + x_bin_sides > xmax) continue;
613 prev = xbin - x_bin_sides+1;
614 for(Int_t j=xbin-x_bin_sides; j<=xbin+x_bin_sides; j++)
616 //Check if the windows are overlapping:
617 if(anotherPt[j]->ymin > anotherPt[prev]->ymax) {prev=j; continue;}
618 if(anotherPt[j]->ymax < anotherPt[prev]->ymin) {prev=j; continue;}
621 top += fCurrentHisto->GetBinCenterX(j)*anotherPt[j]->weight;
622 butt += anotherPt[j]->weight;
624 for(Int_t k=anotherPt[j]->ymin; k<anotherPt[j]->ymax; k++)
626 Int_t bin = fCurrentHisto->GetBin(j,k);
627 ytop += (fCurrentHisto->GetBinCenterY(k))*(fCurrentHisto->GetBinContent(bin));
628 ybutt += fCurrentHisto->GetBinContent(bin);
629 w+=(Int_t)fCurrentHisto->GetBinContent(bin);
633 xpeaks[i] = top/butt;
634 ypeaks[i] = ytop/ybutt;
637 //Check if this peak is overlapping with a previous:
638 for(Int_t p=0; p<i-1; p++)
640 if(fabs(xpeaks[p] - xpeaks[i]) < max_kappa ||
641 fabs(ypeaks[p] - ypeaks[i]) < max_phi0)
650 for(Int_t i=0; i<nbinsx; i++)
657 void AliL3HoughMaxFinder::SortPeaks(struct AxisWindow **a,Int_t first,Int_t last)
659 //General sorting routine
660 //Sort according to PeakCompare()
662 static struct AxisWindow *tmp;
663 static int i; // "static" to save stack space
666 while (last - first > 1) {
670 while (++i < last && PeakCompare(a[i], a[first]) < 0)
672 while (--j > first && PeakCompare(a[j], a[first]) > 0)
688 if (j - first < last - (j + 1)) {
689 SortPeaks(a, first, j);
690 first = j + 1; // QSort(j + 1, last);
692 SortPeaks(a, j + 1, last);
693 last = j; // QSort(first, j);
699 Int_t AliL3HoughMaxFinder::PeakCompare(struct AxisWindow *a,struct AxisWindow *b)
701 if(a->weight < b->weight) return 1;
702 if(a->weight > b->weight) return -1;
707 void AliL3HoughMaxFinder::FindPeak(Int_t t1,Double_t t2,Int_t t3,Float_t &kappa,Float_t &phi0)
709 //Attempt of a more sophisticated peak finder.
710 //Finds the best peak in the histogram, and returns the corresponding
715 printf("AliL3HoughMaxFinder::FindPeak : No histogram!!\n");
718 AliL3Histogram *hist = fCurrentHisto;
720 Int_t xmin = hist->GetFirstXbin();
721 Int_t xmax = hist->GetLastXbin();
722 Int_t ymin = hist->GetFirstYbin();
723 Int_t ymax = hist->GetLastYbin();
724 Int_t nbinsx = hist->GetNbinsX()+1;
726 Int_t *m = new Int_t[nbinsx];
727 Int_t *m_low = new Int_t[nbinsx];
728 Int_t *m_up = new Int_t[nbinsx];
731 recompute: //this is a goto.
733 for(Int_t i=0; i<nbinsx; i++)
740 Int_t max_x=0,sum=0,max_xbin=0,bin;
742 for(Int_t xbin=xmin; xbin<=xmax; xbin++)
744 for(Int_t ybin=ymin; ybin <= ymax - t1; ybin++)
747 for(Int_t y=ybin; y <= ybin+t1; y++)
751 bin = hist->GetBin(xbin,y);
752 sum += (Int_t)hist->GetBinContent(bin);
755 if(sum > m[xbin]) //Max value locally in this xbin
759 m_up[xbin]=ybin + t1;
764 if(m[xbin] > max_x) //Max value globally in x-direction
767 max_x = m[xbin];//sum;
770 //printf("max_xbin %d max_x %d m_low %d m_up %d\n",max_xbin,max_x,m_low[max_xbin],m_up[max_xbin]);
771 //printf("ylow %f yup %f\n",hist->GetBinCenterY(m_low[max_xbin]),hist->GetBinCenterY(m_up[max_xbin]));
773 //Determine a width in the x-direction
774 Int_t x_low=0,x_up=0;
776 for(Int_t xbin=max_xbin-1; xbin >= xmin; xbin--)
778 if(m[xbin] < max_x*t2)
784 for(Int_t xbin = max_xbin+1; xbin <=xmax; xbin++)
786 if(m[xbin] < max_x*t2)
793 Double_t top=0,butt=0,value,x_peak;
794 if(x_up - x_low + 1 > t3)
797 printf("\nxrange out if limit x_up %d x_low %d t1 %d\n\n",x_low,x_up,t1);
802 x_peak = hist->GetBinCenterX(max_xbin);
807 //printf("xlow %f xup %f\n",hist->GetBinCenterX(x_low),hist->GetBinCenterX(x_up));
808 //printf("Spread in x %d\n",x_up-x_low +1);
810 //Now, calculate the center of mass in x-direction
811 for(Int_t xbin=x_low; xbin <= x_up; xbin++)
813 value = hist->GetBinCenterX(xbin);
814 top += value*m[xbin];
821 //Find the peak in y direction:
822 Int_t x_l = hist->FindXbin(x_peak);
823 if(hist->GetBinCenterX(x_l) > x_peak)
828 if(hist->GetBinCenterX(x_l) > x_peak || hist->GetBinCenterX(x_u) <= x_peak)
829 printf("\nAliL3HoughMaxFinder::FindPeak : Wrong xrange %f %f %f\n\n",hist->GetBinCenterX(x_l),x_peak,hist->GetBinCenterX(x_u));
831 //printf("\nxlow %f xup %f\n",hist->GetBinCenterX(x_l),hist->GetBinCenterX(x_u));
835 //printf("ylow %f yup %f\n",hist->GetBinCenterY(m_low[x_l]),hist->GetBinCenterY(m_up[x_l]));
836 //printf("ylow %f yup %f\n",hist->GetBinCenterY(m_low[x_u]),hist->GetBinCenterY(m_up[x_u]));
838 for(Int_t ybin=m_low[x_l]; ybin <= m_up[x_l]; ybin++)
840 value = hist->GetBinCenterY(ybin);
841 bin = hist->GetBin(x_l,ybin);
842 top += value*hist->GetBinContent(bin);
843 butt += hist->GetBinContent(bin);
845 Double_t y_peak_low = top/butt;
847 //printf("y_peak_low %f\n",y_peak_low);
850 for(Int_t ybin=m_low[x_u]; ybin <= m_up[x_u]; ybin++)
852 value = hist->GetBinCenterY(ybin);
853 bin = hist->GetBin(x_u,ybin);
854 top += value*hist->GetBinContent(bin);
855 butt += hist->GetBinContent(bin);
857 Double_t y_peak_up = top/butt;
859 //printf("y_peak_up %f\n",y_peak_up);
861 Double_t x_value_up = hist->GetBinCenterX(x_u);
862 Double_t x_value_low = hist->GetBinCenterX(x_l);
864 Double_t y_peak = (y_peak_low*(x_value_up - x_peak) + y_peak_up*(x_peak - x_value_low))/(x_value_up - x_value_low);
868 //bin = hist->FindBin(x_peak,y_peak);
869 //Int_t weight = (Int_t)hist->GetBinContent(bin);
871 //AliL3HoughTrack *track = new AliL3HoughTrack();
872 //track->SetTrackParameters(x_peak,y_peak,weight);