537 class DifferentDimension:
public std::exception {};
538 class DifferentNumberOfBins:
public std::exception {};
539 class DifferentAxisLimits:
public std::exception {};
540 class DifferentBinLimits:
public std::exception {};
541 class DifferentLabels:
public std::exception {};
551 fFunctions =
new TList;
557 fTsumw = fTsumw2=fTsumwx=fTsumwx2=0;
562 fBinStatErrOpt = kNormal;
564 fYaxis.SetName(
"yaxis");
565 fZaxis.SetName(
"zaxis");
566 fXaxis.SetParent(
this);
567 fYaxis.SetParent(
this);
568 fZaxis.SetParent(
this);
577 if (!TestBit(kNotDeleted)) {
594 while ((obj = fFunctions->First())) {
595 while(fFunctions->Remove(obj)) { }
596 if (!obj->
TestBit(kNotDeleted)) {
606 fDirectory->Remove(
this);
638 if (nbins <= 0) {
Warning(
"TH1",
"nbins is <=0 - set to nbins = 1"); nbins = 1; }
660 if (nbins <= 0) {
Warning(
"TH1",
"nbins is <=0 - set to nbins = 1"); nbins = 1; }
682 if (nbins <= 0) {
Warning(
"TH1",
"nbins is <=0 - set to nbins = 1"); nbins = 1; }
773 Error(
"Add",
"Attempt to add a non-existing function");
793 for (
Int_t i = 0; i < 10; ++i) s1[i] = 0;
799 Int_t bin, binx, biny, binz;
804 for (binz = 0; binz < ncellsz; ++binz) {
806 for (biny = 0; biny < ncellsy; ++biny) {
808 for (binx = 0; binx < ncellsx; ++binx) {
812 bin = binx + ncellsx * (biny + ncellsy * binz);
858 Error(
"Add",
"Attempt to add a non-existing histogram");
869 }
catch(DifferentNumberOfBins&) {
871 Info(
"Add",
"Attempt to add histograms with different number of bins - trying to use TH1::Merge");
873 Error(
"Add",
"Attempt to add histograms with different number of bins : nbins h1 = %d , nbins h2 = %d",
GetNbinsX(), h1->
GetNbinsX());
876 }
catch(DifferentAxisLimits&) {
878 Info(
"Add",
"Attempt to add histograms with different axis limits - trying to use TH1::Merge");
880 Warning(
"Add",
"Attempt to add histograms with different axis limits");
881 }
catch(DifferentBinLimits&) {
883 Info(
"Add",
"Attempt to add histograms with different bin limits - trying to use TH1::Merge");
885 Warning(
"Add",
"Attempt to add histograms with different bin limits");
886 }
catch(DifferentLabels&) {
889 Info(
"Add",
"Attempt to add histograms with different labels - trying to use TH1::Merge");
891 Info(
"Warning",
"Attempt to add histograms with different labels");
896 l.
Add(const_cast<TH1*>(h1));
897 auto iret =
Merge(&l);
909 Bool_t resetStats = (c1 < 0);
939 if (e1sq) w1 = 1. / e1sq;
944 double sf = (s2[0] != 0) ? s2[1]/s2[0] : 1;
948 if (e2sq) w2 = 1. / e2sq;
953 double sf = (s1[0] != 0) ? s1[1]/s1[0] : 1;
958 double y = (w1*y1 + w2*y2)/(w1 + w2);
961 double err2 = 1./(w1 + w2);
962 if (err2 < 1.
E-200) err2 = 0;
978 if (i == 1) s1[i] += c1*c1*s2[i];
979 else s1[i] += c1*s2[i];
1020 Error(
"Add",
"Attempt to add a non-existing histogram");
1028 if (h1 == h2 && c2 < 0) {c2 = 0; normWidth =
kTRUE;}
1037 }
catch(DifferentNumberOfBins&) {
1039 Info(
"Add",
"Attempt to add histograms with different number of bins - trying to use TH1::Merge");
1041 Error(
"Add",
"Attempt to add histograms with different number of bins : nbins h1 = %d , nbins h2 = %d",
GetNbinsX(), h1->
GetNbinsX());
1044 }
catch(DifferentAxisLimits&) {
1046 Info(
"Add",
"Attempt to add histograms with different axis limits - trying to use TH1::Merge");
1048 Warning(
"Add",
"Attempt to add histograms with different axis limits");
1049 }
catch(DifferentBinLimits&) {
1051 Info(
"Add",
"Attempt to add histograms with different bin limits - trying to use TH1::Merge");
1053 Warning(
"Add",
"Attempt to add histograms with different bin limits");
1054 }
catch(DifferentLabels&) {
1057 Info(
"Add",
"Attempt to add histograms with different labels - trying to use TH1::Merge");
1059 Info(
"Warning",
"Attempt to add histograms with different labels");
1065 l.
Add(const_cast<TH1*>(h1));
1066 l.
Add(const_cast<TH1*>(h2));
1068 auto iret =
Merge(&l);
1088 Bool_t resetStats = (c1*c2 < 0) || normWidth;
1095 if (i == 1) s3[i] = c1*c1*s1[i] + c2*c2*s2[i];
1097 else s3[i] = c1*s1[i] + c2*s2[i];
1113 Int_t bin, binx, biny, binz;
1114 for (binz = 0; binz < nbinsz; ++binz) {
1116 for (biny = 0; biny < nbinsy; ++biny) {
1118 for (binx = 0; binx < nbinsx; ++binx) {
1120 bin =
GetBin(binx, biny, binz);
1141 if (e1sq) w1 = 1./ e1sq;
1145 double sf = (s1[0] != 0) ? s1[1]/s1[0] : 1;
1149 if (e2sq) w2 = 1./ e2sq;
1153 double sf = (s2[0] != 0) ? s2[1]/s2[0] : 1;
1158 double y = (w1*y1 + w2*y2)/(w1 + w2);
1161 double err2 = 1./(w1 + w2);
1162 if (err2 < 1.
E-200) err2 = 0;
1244 if (nbentries == 0) {
1254 if (nbentries < 0 && action == 0)
return 0;
1257 if (nbentries < 0) {
1258 nbentries = -nbentries;
1270 for (
Int_t i=1;i<nbentries;i++) {
1272 if (x < xmin) xmin =
x;
1273 if (x > xmax) xmax =
x;
1291 DoFillN(nbentries,&buffer[2],&buffer[1],2);
1325 if (nbentries < 0) {
1328 nbentries = -nbentries;
1360 if ( h2Array->
fN != fN ) {
1361 throw DifferentBinLimits();
1365 for (
int i = 0; i < fN; ++i ) {
1367 throw DifferentBinLimits();
1388 throw DifferentLabels();
1393 throw DifferentLabels();
1396 for (
int i = 1; i <= a1->
GetNbins(); ++i) {
1399 if (label1 != label2) {
1400 throw DifferentLabels();
1416 throw DifferentAxisLimits();
1429 ::Info(
"CheckEqualAxes",
"Axes have different number of bins : nbin1 = %d nbin2 = %d",a1->
GetNbins(),a2->
GetNbins() );
1434 }
catch (DifferentAxisLimits&) {
1435 ::Info(
"CheckEqualAxes",
"Axes have different limits");
1440 }
catch (DifferentBinLimits&) {
1441 ::Info(
"CheckEqualAxes",
"Axes have different bin limits");
1448 }
catch (DifferentLabels&) {
1449 ::Info(
"CheckEqualAxes",
"Axes have different labels");
1464 Int_t nbins1 = lastBin1-firstBin1 + 1;
1472 if (firstBin2 < lastBin2) {
1474 nbins2 = lastBin1-firstBin1 + 1;
1479 if (nbins1 != nbins2 ) {
1480 ::Info(
"CheckConsistentSubAxes",
"Axes have different number of bins");
1486 ::Info(
"CheckConsistentSubAxes",
"Axes have different limits");
1498 if (h1 == h2)
return true;
1501 throw DifferentDimension();
1513 (dim > 1 && nbinsy != h2->
GetNbinsY()) ||
1514 (dim > 2 && nbinsz != h2->
GetNbinsZ()) ) {
1515 throw DifferentNumberOfBins();
1831 Int_t ndf = 0, igood = 0;
1839 printf(
"Chi2 = %f, Prob = %g, NDF = %d, igood = %d\n", chi2,prob,ndf,igood);
1842 if (ndf == 0)
return 0;
1890 Int_t i_start, i_end;
1891 Int_t j_start, j_end;
1892 Int_t k_start, k_end;
1921 Error(
"Chi2TestX",
"Histograms have different dimensions.");
1926 if (nbinx1 != nbinx2) {
1927 Error(
"Chi2TestX",
"different number of x channels");
1929 if (nbiny1 != nbiny2) {
1930 Error(
"Chi2TestX",
"different number of y channels");
1932 if (nbinz1 != nbinz2) {
1933 Error(
"Chi2TestX",
"different number of z channels");
1937 i_start = j_start = k_start = 1;
1968 ndf = (i_end - i_start + 1) * (j_end - j_start + 1) * (k_end - k_start + 1) - 1;
1975 if (scaledHistogram && !comparisonUU) {
1976 Info(
"Chi2TestX",
"NORM option should be used together with UU option. It is ignored");
1983 Double_t effEntries1 = (s[1] ? s[0] * s[0] / s[1] : 0.0);
1987 Double_t effEntries2 = (s[1] ? s[0] * s[0] / s[1] : 0.0);
1989 if (!comparisonUU && !comparisonUW && !comparisonWW ) {
1991 if (
TMath::Abs(sumBinContent1 - effEntries1) < 1) {
1992 if (
TMath::Abs(sumBinContent2 - effEntries2) < 1) comparisonUU =
true;
1993 else comparisonUW =
true;
1995 else comparisonWW =
true;
1999 if (
TMath::Abs(sumBinContent1 - effEntries1) >= 1) {
2000 Warning(
"Chi2TestX",
"First histogram is not unweighted and option UW has been requested");
2003 if ( (!scaledHistogram && comparisonUU) ) {
2004 if ( (
TMath::Abs(sumBinContent1 - effEntries1) >= 1) || (
TMath::Abs(sumBinContent2 - effEntries2) >= 1) ) {
2005 Warning(
"Chi2TestX",
"Both histograms are not unweighted and option UU has been requested");
2011 if (comparisonUU && scaledHistogram) {
2012 for (
Int_t i = i_start; i <= i_end; ++i) {
2013 for (
Int_t j = j_start; j <= j_end; ++j) {
2014 for (
Int_t k = k_start; k <= k_end; ++k) {
2023 if (e1sq > 0.0) cnt1 =
TMath::Floor(cnt1 * cnt1 / e1sq + 0.5);
2026 if (e2sq > 0.0) cnt2 =
TMath::Floor(cnt2 * cnt2 / e2sq + 0.5);
2037 if (sumw1 <= 0.0 || sumw2 <= 0.0) {
2038 Error(
"Chi2TestX",
"Cannot use option NORM when one histogram has all zero errors");
2043 for (
Int_t i = i_start; i <= i_end; ++i) {
2044 for (
Int_t j = j_start; j <= j_end; ++j) {
2045 for (
Int_t k = k_start; k <= k_end; ++k) {
2059 if (sum1 == 0.0 || sum2 == 0.0) {
2060 Error(
"Chi2TestX",
"one histogram is empty");
2064 if ( comparisonWW && ( sumw1 <= 0.0 && sumw2 <= 0.0 ) ){
2065 Error(
"Chi2TestX",
"Hist1 and Hist2 have both all zero errors\n");
2075 for (
Int_t i = i_start; i <= i_end; ++i) {
2076 for (
Int_t j = j_start; j <= j_end; ++j) {
2077 for (
Int_t k = k_start; k <= k_end; ++k) {
2084 if (scaledHistogram) {
2089 if (e1sq > 0) cnt1 =
TMath::Floor(cnt1 * cnt1 / e1sq + 0.5);
2092 if (e2sq > 0) cnt2 =
TMath::Floor(cnt2 * cnt2 / e2sq + 0.5);
2096 if (
Int_t(cnt1) == 0 &&
Int_t(cnt2) == 0) --ndf;
2103 if (res) res[i - i_start] = (cnt1 - nexp1) /
TMath::Sqrt(nexp1);
2109 Double_t correc = (1. - sum1 /
sum) * (1. - cntsum / sum);
2112 Double_t delta = sum2 * cnt1 - sum1 * cnt2;
2113 chi2 += delta * delta / cntsum;
2118 chi2 /= sum1 * sum2;
2123 Info(
"Chi2TestX",
"There is a bin in h1 with less than 1 event.\n");
2127 Info(
"Chi2TestX",
"There is a bin in h2 with less than 1 event.\n");
2138 if ( comparisonUW ) {
2139 for (
Int_t i = i_start; i <= i_end; ++i) {
2140 for (
Int_t j = j_start; j <= j_end; ++j) {
2141 for (
Int_t k = k_start; k <= k_end; ++k) {
2150 if (cnt1 * cnt1 == 0 && cnt2 * cnt2 == 0) {
2156 if (cnt2 * cnt2 == 0 && e2sq == 0) {
2160 e2sq = sumw2 / sum2;
2165 Error(
"Chi2TestX",
"Hist2 has in bin (%d,%d,%d) zero content and zero errors\n", i, j, k);
2171 if (e2sq > 0 && cnt2 * cnt2 / e2sq < 10)
n++;
2173 Double_t var1 = sum2 * cnt2 - sum1 * e2sq;
2174 Double_t var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2179 while (var1 * var1 + cnt1 == 0 || var1 + var2 == 0) {
2182 var1 = sum2 * cnt2 - sum1 * e2sq;
2183 var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2187 while (var1 + var2 == 0) {
2190 var1 = sum2 * cnt2 - sum1 * e2sq;
2191 var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2192 while (var1 * var1 + cnt1 == 0 || var1 + var2 == 0) {
2195 var1 = sum2 * cnt2 - sum1 * e2sq;
2196 var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2201 Double_t probb = (var1 + var2) / (2. * sum2 * sum2);
2209 chi2 += delta1 * delta1 / nexp1;
2212 chi2 += delta2 * delta2 / e2sq;
2217 Double_t temp1 = sum2 * e2sq / var2;
2218 Double_t temp2 = 1.0 + (sum1 * e2sq - sum2 * cnt2) / var2;
2219 temp2 = temp1 * temp1 * sum1 * probb * (1.0 - probb) + temp2 * temp2 * e2sq / 4.0;
2232 Info(
"Chi2TestX",
"There is a bin in h1 with less than 1 event.\n");
2236 Info(
"Chi2TestX",
"There is a bin in h2 with less than 10 effective events.\n");
2246 for (
Int_t i = i_start; i <= i_end; ++i) {
2247 for (
Int_t j = j_start; j <= j_end; ++j) {
2248 for (
Int_t k = k_start; k <= k_end; ++k) {
2258 if (cnt1 * cnt1 == 0 && cnt2 * cnt2 == 0) {
2263 if (e1sq == 0 && e2sq == 0) {
2265 Error(
"Chi2TestX",
"h1 and h2 both have bin %d,%d,%d with all zero errors\n", i,j,k);
2270 Double_t delta = sum2 * cnt1 - sum1 * cnt2;
2271 chi2 += delta * delta /
sigma;
2274 Double_t temp = cnt1 * sum1 * e2sq + cnt2 * sum2 * e1sq;
2287 res[i - i_start] =
z;
2290 if (e1sq > 0 && cnt1 * cnt1 / e1sq < 10) m++;
2291 if (e2sq > 0 && cnt2 * cnt2 / e2sq < 10)
n++;
2297 Info(
"Chi2TestX",
"There is a bin in h1 with less than 10 effective events.\n");
2301 Info(
"Chi2TestX",
"There is a bin in h2 with less than 10 effective events.\n");
2318 Error(
"Chisquare",
"Function pointer is Null - return -1");
2369 for (
Int_t binz=1; binz <= nbinsz; ++binz) {
2370 for (
Int_t biny=1; biny <= nbinsy; ++biny) {
2371 for (
Int_t binx=1; binx <= nbinsx; ++binx) {
2374 if (onlyPositive && y < 0) {
2375 Error(
"ComputeIntegral",
"Bin content is negative - return a NaN value");
2386 Error(
"ComputeIntegral",
"Integral = zero");
return 0;
2429 hintegrated->
Reset();
2432 for (
Int_t binz = 1; binz <= nbinsz; ++binz) {
2433 for (
Int_t biny = 1; biny <= nbinsy; ++biny) {
2434 for (
Int_t binx = 1; binx <= nbinsx; ++binx) {
2435 const Int_t bin = hintegrated->
GetBin(binx, biny, binz);
2443 for (
Int_t binz = nbinsz; binz >= 1; --binz) {
2444 for (
Int_t biny = nbinsy; biny >= 1; --biny) {
2445 for (
Int_t binx = nbinsx; binx >= 1; --binx) {
2446 const Int_t bin = hintegrated->
GetBin(binx, biny, binz);
2472 ((
TH1&)obj).fDirectory->Remove(&obj);
2473 ((
TH1&)obj).fDirectory = 0;
2487 delete [] ((
TH1&)obj).fBuffer;
2488 ((
TH1&)obj).fBuffer = 0;
2494 ((
TH1&)obj).fBuffer = buf;
2499 if (a) a->
Set(fNcells);
2520 ((
TH1&)obj).fXaxis.SetParent(&obj);
2521 ((
TH1&)obj).fYaxis.SetParent(&obj);
2522 ((
TH1&)obj).fZaxis.SetParent(&obj);
2534 ((
TH1&)obj).fDirectory = 0;
2552 if(newname && strlen(newname) ) {
2607 Error(
"Add",
"Attempt to divide by a non-existing function");
2625 Int_t bin, binx, biny, binz;
2630 for (binz = 0; binz < nz; ++binz) {
2632 for (biny = 0; biny <
ny; ++biny) {
2634 for (binx = 0; binx <
nx; ++binx) {
2638 bin = binx + nx * (biny + ny * binz);
2675 Error(
"Divide",
"Input histogram passed does not exist (NULL).");
2684 }
catch(DifferentNumberOfBins&) {
2685 Error(
"Divide",
"Cannot divide histograms with different number of bins");
2687 }
catch(DifferentAxisLimits&) {
2688 Warning(
"Divide",
"Dividing histograms with different axis limits");
2689 }
catch(DifferentBinLimits&) {
2690 Warning(
"Divide",
"Dividing histograms with different bin limits");
2691 }
catch(DifferentLabels&) {
2692 Warning(
"Divide",
"Dividing histograms with different labels");
2747 Error(
"Divide",
"At least one of the input histograms passed does not exist (NULL).");
2757 }
catch(DifferentNumberOfBins&) {
2758 Error(
"Divide",
"Cannot divide histograms with different number of bins");
2760 }
catch(DifferentAxisLimits&) {
2761 Warning(
"Divide",
"Dividing histograms with different axis limits");
2762 }
catch(DifferentBinLimits&) {
2763 Warning(
"Divide",
"Dividing histograms with different bin limits");
2764 }
catch(DifferentLabels&) {
2765 Warning(
"Divide",
"Dividing histograms with different labels");
2770 Error(
"Divide",
"Coefficient of dividing histogram cannot be zero");
2807 fSumw2.
fArray[i] = c1sq * c2sq * (e1sq * b2sq + e2sq * b1sq) / (c2sq * c2sq * b2sq * b2sq);
2860 if (index>indb && index<indk) index = -1;
2866 if (!
gPad->IsEditable())
gROOT->MakeDefCanvas();
2868 if (
gPad->GetX1() == 0 &&
gPad->GetX2() == 1 &&
2869 gPad->GetY1() == 0 &&
gPad->GetY2() == 1 &&
2870 gPad->GetListOfPrimitives()->GetSize()==0) opt2.
Remove(index,4);
2878 if (index>=0) opt2.
Remove(index,4);
2927 Error(
"DrawNormalized",
"Sum of weights is null. Cannot normalize histogram: %s",
GetName());
2939 if (opt.
IsNull() || opt ==
"SAME") opt +=
"HIST";
2974 Int_t range, stat, add;
2994 for (
Int_t binz = 1; binz <= nbinsz; ++binz) {
2996 for (
Int_t biny = 1; biny <= nbinsy; ++biny) {
2998 for (
Int_t binx = 1; binx <= nbinsx; ++binx) {
3001 if (range && !f1->
IsInside(x))
continue;
3098 for (
Int_t binx = 1; binx<=ndim[0]; binx++) {
3099 for (
Int_t biny=1; biny<=ndim[1]; biny++) {
3100 for (
Int_t binz=1; binz<=ndim[2]; binz++) {
3130 if (bin <0)
return -1;
3163 if (bin <0)
return -1;
3196 if (bin <0)
return -1;
3232 for (i=0;i<ntimes;i+=stride) {
3239 DoFillN((ntimes-i)/stride,&x[i],&w[i],stride);
3243 DoFillN(ntimes, x, w, stride);
3258 for (i=0;i<ntimes;i+=stride) {
3260 if (bin <0)
continue;
3265 if (bin == 0 || bin > nbins) {
3297 if (!f1) {
Error(
"FillRandom",
"Unknown function: %s",fname);
return; }
3307 Info(
"FillRandom",
"Using function axis and range [%g,%g]",xmin, xmax);
3313 Int_t nbinsx = last-first+1;
3317 for (binx=1;binx<=nbinsx;binx++) {
3319 integral[binx] = integral[binx-1] + fint;
3323 if (integral[nbinsx] == 0 ) {
3325 Error(
"FillRandom",
"Integral = zero");
return;
3327 for (bin=1;bin<=nbinsx;bin++) integral[bin] /= integral[nbinsx];
3330 for (loop=0;loop<ntimes;loop++) {
3336 +xAxis->
GetBinWidth(ibin+first)*(r1-integral[ibin])/(integral[ibin+1] - integral[ibin]);
3360 if (!h) {
Error(
"FillRandom",
"Null histogram");
return; }
3362 Error(
"FillRandom",
"Histograms with different dimensions");
return;
3369 Int_t nbins = last-first+1;
3370 if (ntimes > 10*nbins) {
3374 if (sumw == 0)
return;
3376 for (
Int_t bin=first;bin<=last;bin++) {
3388 if (sumgen < ntimes) {
3390 for (i =
Int_t(sumgen+0.5); i < ntimes; ++i)
3396 else if (sumgen > ntimes) {
3398 i =
Int_t(sumgen+0.5);
3399 while( i > ntimes) {
3414 catch(std::exception&) {}
3421 for (loop=0;loop<ntimes;loop++) {
3447 return binx + nx*biny;
3455 return binx + nx*(biny +ny*binz);
3480 return binx + nx*biny;
3488 return binx + nx*(biny +ny*binz);
3502 Warning(
"FindFirstBinAbove",
"Invalid axis number : %d, axis x assumed\n",axis);
3521 Warning(
"FindLastBinAbove",
"Invalid axis number : %d, axis x assumed\n",axis);
3525 for (
Int_t bin=nbins;bin>=1;bin--) {
3564 linear= (
char*)strstr(fname,
"++");
3571 f1=
new TF1(fname, fname, xxmin, xxmax);
3572 return Fit(f1,option,goption,xxmin,xxmax);
3575 f2=
new TF2(fname, fname);
3576 return Fit(f2,option,goption,xxmin,xxmax);
3579 f3=
new TF3(fname, fname);
3580 return Fit(f3,option,goption,xxmin,xxmax);
3585 f1 = (
TF1*)
gROOT->GetFunction(fname);
3586 if (!f1) {
Printf(
"Unknown function: %s",fname);
return -1; }
3587 return Fit(f1,option,goption,xxmin,xxmax);
3915 gROOT->MakeDefCanvas();
3918 Error(
"FitPanel",
"Unable to create a default canvas");
3925 if (handler && handler->
LoadPlugin() != -1) {
3927 Error(
"FitPanel",
"Unable to create the FitPanel");
3930 Error(
"FitPanel",
"Unable to find the FitPanel plug-in");
3975 asym->SetTitle(title);
3985 top->
Add(h1,h2,1,-c2);
3986 bottom->
Add(h1,h2,1,c2);
3987 asym->Divide(top,bottom);
3991 Int_t zmax = asym->GetNbinsZ();
4001 for(
Int_t k=1; k<= zmax; k++){
4017 Double_t error = 2*
TMath::Sqrt(a*a*c2*c2*dbsq + c2*c2*b*b*dasq+a*a*b*b*dc2*dc2)/(bot*bot);
4018 asym->SetBinError(i,j,k,error);
4080 return (s[1] ? s[0]*s[0]/s[1] :
TMath::Abs(s[0]) );
4090 return ((
TH1*)
this)->GetPainter()->GetObjectInfo(px,py);
4191 Error(
"GetQuantiles",
"Only available for 1-d histograms");
4201 Int_t nq = nprobSum;
4206 for (i=1;i<nq;i++) {
4211 for (i = 0; i < nq; i++) {
4213 while (ibin < nbins-1 &&
fIntegral[ibin+1] == prob[i]) {
4214 if (
fIntegral[ibin+2] == prob[i]) ibin++;
4219 if (dint > 0) q[i] +=
GetBinWidth(ibin+1)*(prob[i]-fIntegral[ibin])/dint;
4222 if (!probSum)
delete [] prob;
4251 allcha = sumx = sumx2 = 0;
4252 for (bin=hxfirst;bin<=hxlast;bin++) {
4255 if (val > valmax) valmax = val;
4260 if (allcha == 0)
return;
4262 stddev = sumx2/allcha - mean*mean;
4265 if (stddev == 0) stddev = binwidx*(hxlast-hxfirst+1)/4;
4272 Double_t constant = 0.5*(valmax+binwidx*allcha/(sqrtpi*stddev));
4280 if ((mean < xmin || mean > xmax) && stddev > (xmax-xmin)) {
4281 mean = 0.5*(xmax+
xmin);
4282 stddev = 0.5*(xmax-
xmin);
4301 Int_t nchanx = hxlast - hxfirst + 1;
4322 Int_t nchanx = hxlast - hxfirst + 1;
4325 if (nchanx <=1 || npar == 1) {
4348 const Int_t idim = 20;
4359 if (m > idim || m > n)
return;
4362 for (l = 2; l <=
m; ++
l) {
4364 b[m + l*20 - 21] = zero;
4371 for (k = hxfirst; k <= hxlast; ++k) {
4376 for (l = 2; l <=
m; ++
l) {
4379 da[l-1] += power*yk;
4381 for (l = 2; l <=
m; ++
l) {
4383 b[m + l*20 - 21] += power;
4386 for (i = 3; i <=
m; ++i) {
4387 for (k = i; k <=
m; ++k) {
4388 b[k - 1 + (i-1)*20 - 21] = b[k + (i-2)*20 - 21];
4393 for (i=0; i<
m; ++i) a[i] = da[i];
4413 xbar = ybar = x2bar = xybar = 0;
4418 for (i = hxfirst; i <= hxlast; ++i) {
4422 if (yk <= 0) yk = 1
e-9;
4431 det = fn*x2bar - xbar*xbar;
4439 a0 = (x2bar*ybar - xbar*xybar) / det;
4440 a1 = (fn*xybar - xbar*ybar) / det;
4451 Int_t a_dim1, a_offset, b_dim1, b_offset;
4453 Int_t im1, jp1, nm1, nmi;
4459 b_offset = b_dim1 + 1;
4462 a_offset = a_dim1 + 1;
4465 if (idim < n)
return;
4468 for (j = 1; j <=
n; ++j) {
4469 if (a[j + j*a_dim1] <= 0) { ifail = -1;
return; }
4470 a[j + j*a_dim1] = one / a[j + j*a_dim1];
4471 if (j == n)
continue;
4473 for (l = jp1; l <=
n; ++
l) {
4474 a[j + l*a_dim1] = a[j + j*a_dim1] * a[l + j*a_dim1];
4475 s1 = -a[l + (j+1)*a_dim1];
4476 for (i = 1; i <= j; ++i) { s1 = a[l + i*a_dim1] * a[i + (j+1)*a_dim1] + s1; }
4477 a[l + (j+1)*a_dim1] = -s1;
4482 for (l = 1; l <= k; ++
l) {
4483 b[l*b_dim1 + 1] = a[a_dim1 + 1]*b[l*b_dim1 + 1];
4486 for (l = 1; l <= k; ++
l) {
4487 for (i = 2; i <=
n; ++i) {
4489 s21 = -b[i + l*b_dim1];
4490 for (j = 1; j <= im1; ++j) {
4491 s21 = a[i + j*a_dim1]*b[j + l*b_dim1] + s21;
4493 b[i + l*b_dim1] = -a[i + i*a_dim1]*s21;
4496 for (i = 1; i <= nm1; ++i) {
4498 s22 = -b[nmi + l*b_dim1];
4499 for (j = 1; j <= i; ++j) {
4501 s22 = a[nmi + nmjp1*a_dim1]*b[nmjp1 + l*b_dim1] + s22;
4503 b[nmi + l*b_dim1] = -s22;
4541 if (binx < 0) binx = 0;
4542 if (binx > ofx) binx = ofx;
4557 binx = binglobal%
nx;
4563 binx = binglobal%
nx;
4564 biny = ((binglobal-binx)/nx)%
ny;
4569 binx = binglobal%
nx;
4570 biny = ((binglobal-binx)/nx)%
ny;
4571 binz = ((binglobal-binx)/nx -biny)/
ny;
4588 Error(
"GetRandom",
"Function only valid for 1-d histograms");
4598 integral = ((
TH1*)
this)->ComputeIntegral(
true);
4600 if (integral == 0)
return 0;
4639 if (bin < 0) bin = 0;
4640 if (bin >= fNcells) bin = fNcells-1;
4665 Error(
"GetBinWithContent",
"function is only valid for 1-D histograms");
4671 if (firstx <= 0) firstx = 1;
4675 for (
Int_t i=firstx;i<=lastx;i++) {
4677 if (diff <= 0) {binx = i;
return diff;}
4678 if (diff < curmax && diff <= maxdiff) {curmax = diff, binminx=i;}
4713 return y0 + (x-x0)*((y1-y0)/(x1-x0));
4722 Error(
"Interpolate",
"This function must be called with 1 argument for a TH1");
4731 Error(
"Interpolate",
"This function must be called with 1 argument for a TH1");
4762 Error(
"IsBinOverflow",
"Invalid axis value");
4779 return (binx <= 0 || biny <= 0);
4781 return (binx <= 0 || biny <= 0 || binz <= 0);
4792 Error(
"IsBinUnderflow",
"Invalid axis value");
4809 Error(
"LabelsDeflate",
"Invalid axis option %s",ax);
4820 while ((obj = next())) {
4822 if (ibin > nbins) nbins = ibin;
4824 if (nbins < 1) nbins = 1;
4827 if (nbins==axis->
GetNbins())
return;
4829 TH1 *hold = (
TH1*)IsA()->New();
4837 if (xmax <= xmin) xmax = xmin +
nbins;
4839 axis->
Set(nbins,xmin,xmax);
4852 Int_t bin,binx,biny,binz;
4853 for (bin=0; bin < hold->
fNcells; ++bin) {
4880 TH1 *hold = (
TH1*)IsA()->New();;
4888 xmax = xmin + 2*(xmax-
xmin);
4891 axis->
Set(2*nbins,xmin,xmax);
4901 Int_t bin,ibin,binx,biny,binz;
4902 for (ibin =0; ibin < hold->
fNcells; ibin++) {
4905 bin =
GetBin(binx,biny,binz);
4942 Warning(
"LabelsOption",
"Cannot sort. No labels");
4975 if (sort < 0)
return;
4977 Error(
"LabelsOption",
"Sorting by value not implemented for 3-D histograms");
4983 std::vector<Int_t>
a(n+2);
4986 std::vector<Double_t> cont;
4987 std::vector<Double_t> errors;
4989 TIter nextold(labels);
4991 while ((obj=nextold())) {
5000 for (i=1;i<=
n;i++) {
5002 if (!errors.empty()) errors[i-1] =
GetBinError(i);
5006 for (i=1;i<=
n;i++) {
5008 if (!errors.empty())
SetBinError(i,errors[a[i-1]]);
5010 for (i=1;i<=
n;i++) {
5011 obj = labold->
At(a[i-1]);
5016 std::vector<Double_t> pcont(n+2);
5019 cont.resize( (nx+2)*(ny+2));
5020 if (
fSumw2.
fN) errors.resize( (nx+2)*(ny+2));
5021 for (i=1;i<=
nx;i++) {
5022 for (j=1;j<=
ny;j++) {
5024 if (!errors.empty()) errors[i+nx*j] =
GetBinError(i,j);
5027 pcont[k-1] += cont[i+nx*j];
5033 obj = labold->
At(a[i]);
5038 for (i=1;i<=
n;i++) {
5039 for (j=1;j<=
ny;j++) {
5041 if (!errors.empty())
SetBinError(i,j,errors[a[i-1]+1+nx*j]);
5047 for (i=1;i<=
nx;i++) {
5048 for (j=1;j<=
n;j++) {
5050 if (!errors.empty())
SetBinError(i,j,errors[i+nx*(a[j-1]+1)]);
5059 const UInt_t kUsed = 1<<18;
5063 for (i=1;i<=
n;i++) {
5064 const char *label =
"zzzzzzzzzzzz";
5065 for (j=1;j<=
n;j++) {
5066 obj = labold->
At(j-1);
5068 if (obj->
TestBit(kUsed))
continue;
5070 if (strcmp(label,obj->
GetName()) < 0)
continue;
5081 for (i=1;i<=
n;i++) {
5082 obj = labels->
At(i-1);
5090 for (i=1;i<=
n;i++) {
5092 if (!errors.empty()) errors[i] =
GetBinError(a[i]);
5094 for (i=1;i<=
n;i++) {
5102 if (
fSumw2.
fN) errors.resize(nx*ny);
5103 for (i=0;i<
nx;i++) {
5104 for (j=0;j<
ny;j++) {
5106 if (!errors.empty()) errors[i+nx*j] =
GetBinError(i,j);
5110 for (i=1;i<=
n;i++) {
5111 for (j=0;j<
ny;j++) {
5113 if (!errors.empty())
SetBinError(i,j,errors[a[i]+nx*j]);
5117 for (i=0;i<
nx;i++) {
5118 for (j=1;j<=
n;j++) {
5120 if (!errors.empty())
SetBinError(i,j,errors[i+nx*a[j]]);
5128 cont.resize(nx*ny*nz);
5129 if (
fSumw2.
fN) errors.resize(nx*ny*nz);
5130 for (i=0;i<
nx;i++) {
5131 for (j=0;j<
ny;j++) {
5132 for (k=0;k<nz;k++) {
5134 if (!errors.empty()) errors[i+nx*(j+ny*k)] =
GetBinError(i,j,k);
5140 for (i=1;i<=
n;i++) {
5141 for (j=0;j<
ny;j++) {
5142 for (k=0;k<nz;k++) {
5144 if (!errors.empty())
SetBinError(i,j,k,errors[a[i]+nx*(j+ny*k)]);
5151 for (i=0;i<
nx;i++) {
5152 for (j=1;j<=
n;j++) {
5153 for (k=0;k<nz;k++) {
5155 if (!errors.empty())
SetBinError(i,j,k,errors[i+nx*(a[j]+ny*k)]);
5162 for (i=0;i<
nx;i++) {
5163 for (j=0;j<
ny;j++) {
5164 for (k=1;k<=
n;k++) {
5166 if (!errors.empty())
SetBinError(i,j,k,errors[i+nx*(j+ny*a[k])]);
5202 bool isEquidistant =
true;
5204 for (
int i = 1; i < axis.
GetNbins(); ++i) {
5207 isEquidistant &= match;
5211 return isEquidistant;
5238 if (width1 == 0 || width2 == 0)
5269 delta = (xmax - destAxis.
GetXmax())/width1;
5274 delta = (xmax - anAxis.
GetXmax())/width2;
5279 delta = (xmax - destAxis.
GetXmax())/width1;
5284 printf(
"TH1::RecomputeAxisLimits - Impossible\n");
5364 Error(
"Add",
"Attempt to multiply by a non-existing function");
5386 for (
Int_t binz = 0; binz < nz; ++binz) {
5388 for (
Int_t biny = 0; biny <
ny; ++biny) {
5390 for (
Int_t binx = 0; binx <
nx; ++binx) {
5394 Int_t bin = binx + nx * (biny + ny *binz);
5426 Error(
"Multiply",
"Attempt to multiply by a non-existing histogram");
5435 }
catch(DifferentNumberOfBins&) {
5436 Error(
"Multiply",
"Attempt to multiply histograms with different number of bins");
5438 }
catch(DifferentAxisLimits&) {
5439 Warning(
"Multiply",
"Attempt to multiply histograms with different axis limits");
5440 }
catch(DifferentBinLimits&) {
5441 Warning(
"Multiply",
"Attempt to multiply histograms with different bin limits");
5442 }
catch(DifferentLabels&) {
5443 Warning(
"Multiply",
"Attempt to multiply histograms with different labels");
5488 Error(
"Multiply",
"Attempt to multiply by a non-existing histogram");
5498 }
catch(DifferentNumberOfBins&) {
5499 Error(
"Multiply",
"Attempt to multiply histograms with different number of bins");
5501 }
catch(DifferentAxisLimits&) {
5502 Warning(
"Multiply",
"Attempt to multiply histograms with different axis limits");
5503 }
catch(DifferentBinLimits&) {
5504 Warning(
"Multiply",
"Attempt to multiply histograms with different bin limits");
5505 }
catch(DifferentLabels&) {
5506 Warning(
"Multiply",
"Attempt to multiply histograms with different labels");
5607 if ((ngroup <= 0) || (ngroup > nbins)) {
5608 Error(
"Rebin",
"Illegal value of ngroup=%d",ngroup);
5613 Error(
"Rebin",
"Operation valid on 1-D histograms only");
5616 if (!newname && xbins) {
5617 Error(
"Rebin",
"if xbins is specified, newname must be given");
5621 Int_t newbins = nbins/ngroup;
5623 Int_t nbg = nbins/ngroup;
5624 if (nbg*ngroup != nbins) {
5625 Warning(
"Rebin",
"ngroup=%d is not an exact divider of nbins=%d.",ngroup,nbins);
5645 for (bin=0;bin<nbins+2;bin++) oldErrors[bin] =
GetBinError(bin);
5650 Warning(
"Rebin",
"underflow entries will not be used when rebinning");
5651 if (xbins[newbins] >
fXaxis.
GetXmax() && oldBins[nbins+1] != 0 )
5652 Warning(
"Rebin",
"overflow entries will not be used when rebinning");
5658 if ((newname && strlen(newname) > 0) || xbins) {
5668 bool resetStat =
false;
5670 if(!xbins && (newbins*ngroup != nbins)) {