540class DifferentDimension:
public std::exception {};
541class DifferentNumberOfBins:
public std::exception {};
542class DifferentAxisLimits:
public std::exception {};
543class DifferentBinLimits:
public std::exception {};
544class DifferentLabels:
public std::exception {};
644 if (nbins <= 0) {
Warning(
"TH1",
"nbins is <=0 - set to nbins = 1"); nbins = 1; }
666 if (nbins <= 0) {
Warning(
"TH1",
"nbins is <=0 - set to nbins = 1"); nbins = 1; }
688 if (nbins <= 0) {
Warning(
"TH1",
"nbins is <=0 - set to nbins = 1"); nbins = 1; }
716 Draw(
b ?
b->GetDrawOption() :
"");
781 Error(
"Add",
"Attempt to add a non-existing function");
801 for (
Int_t i = 0; i < 10; ++i)
s1[i] = 0;
807 Int_t bin, binx, biny, binz;
812 for (binz = 0; binz < ncellsz; ++binz) {
814 for (biny = 0; biny < ncellsy; ++biny) {
816 for (binx = 0; binx < ncellsx; ++binx) {
820 bin = binx + ncellsx * (biny + ncellsy * binz);
866 Error(
"Add",
"Attempt to add a non-existing histogram");
877 }
catch(DifferentNumberOfBins&) {
879 Info(
"Add",
"Attempt to add histograms with different number of bins - trying to use TH1::Merge");
881 Error(
"Add",
"Attempt to add histograms with different number of bins : nbins h1 = %d , nbins h2 = %d",
GetNbinsX(),
h1->
GetNbinsX());
884 }
catch(DifferentAxisLimits&) {
886 Info(
"Add",
"Attempt to add histograms with different axis limits - trying to use TH1::Merge");
888 Warning(
"Add",
"Attempt to add histograms with different axis limits");
889 }
catch(DifferentBinLimits&) {
891 Info(
"Add",
"Attempt to add histograms with different bin limits - trying to use TH1::Merge");
893 Warning(
"Add",
"Attempt to add histograms with different bin limits");
894 }
catch(DifferentLabels&) {
897 Info(
"Add",
"Attempt to add histograms with different labels - trying to use TH1::Merge");
899 Info(
"Warning",
"Attempt to add histograms with different labels");
904 l.Add(
const_cast<TH1*
>(
h1));
947 if (e1sq) w1 = 1. / e1sq;
952 double sf = (s2[0] != 0) ? s2[1]/s2[0] : 1;
956 if (e2sq) w2 = 1. / e2sq;
961 double sf = (
s1[0] != 0) ?
s1[1]/
s1[0] : 1;
966 double y = (w1*y1 + w2*y2)/(w1 + w2);
969 double err2 = 1./(w1 + w2);
970 if (err2 < 1.E-200) err2 = 0;
986 if (i == 1)
s1[i] +=
c1*
c1*s2[i];
987 else s1[i] +=
c1*s2[i];
1028 Error(
"Add",
"Attempt to add a non-existing histogram");
1036 if (
h1 == h2 &&
c2 < 0) {
c2 = 0; normWidth =
kTRUE;}
1045 }
catch(DifferentNumberOfBins&) {
1047 Info(
"Add",
"Attempt to add histograms with different number of bins - trying to use TH1::Merge");
1049 Error(
"Add",
"Attempt to add histograms with different number of bins : nbins h1 = %d , nbins h2 = %d",
GetNbinsX(),
h1->
GetNbinsX());
1052 }
catch(DifferentAxisLimits&) {
1054 Info(
"Add",
"Attempt to add histograms with different axis limits - trying to use TH1::Merge");
1056 Warning(
"Add",
"Attempt to add histograms with different axis limits");
1057 }
catch(DifferentBinLimits&) {
1059 Info(
"Add",
"Attempt to add histograms with different bin limits - trying to use TH1::Merge");
1061 Warning(
"Add",
"Attempt to add histograms with different bin limits");
1062 }
catch(DifferentLabels&) {
1065 Info(
"Add",
"Attempt to add histograms with different labels - trying to use TH1::Merge");
1067 Info(
"Warning",
"Attempt to add histograms with different labels");
1073 l.Add(
const_cast<TH1*
>(
h1));
1074 l.Add(
const_cast<TH1*
>(h2));
1096 Bool_t resetStats = (
c1*
c2 < 0) || normWidth;
1103 if (i == 1) s3[i] =
c1*
c1*
s1[i] +
c2*
c2*s2[i];
1105 else s3[i] =
c1*
s1[i] +
c2*s2[i];
1121 Int_t bin, binx, biny, binz;
1122 for (binz = 0; binz < nbinsz; ++binz) {
1124 for (biny = 0; biny < nbinsy; ++biny) {
1126 for (binx = 0; binx < nbinsx; ++binx) {
1128 bin =
GetBin(binx, biny, binz);
1149 if (e1sq) w1 = 1./ e1sq;
1153 double sf = (
s1[0] != 0) ?
s1[1]/
s1[0] : 1;
1157 if (e2sq) w2 = 1./ e2sq;
1161 double sf = (s2[0] != 0) ? s2[1]/s2[0] : 1;
1166 double y = (w1*y1 + w2*y2)/(w1 + w2);
1169 double err2 = 1./(w1 + w2);
1170 if (err2 < 1.E-200) err2 = 0;
1244 return ((next &&
x > 0.) || (!next &&
x <= 0.)) ?
std::ldexp(std::copysign(1., f2), nn)
1299 Double_t rr = (xhma - xhmi) / (xma - xmi);
1309 Int_t nbup = (xhma - xma) / bw;
1312 if (nbup != nbside) {
1314 xhma -= bw * (nbup - nbside);
1315 nb -= (nbup - nbside);
1319 Int_t nblw = (xmi - xhmi) / bw;
1322 if (nblw != nbside) {
1324 xhmi += bw * (nblw - nbside);
1325 nb -= (nblw - nbside);
1355 if (nbentries == 0) {
1365 if (nbentries < 0 && action == 0)
return 0;
1368 if (nbentries < 0) {
1369 nbentries = -nbentries;
1381 for (
Int_t i=1;i<nbentries;i++) {
1391 "incosistency found by power-of-2 autobin algorithm: fallback to standard method");
1409 DoFillN(nbentries,&buffer[2],&buffer[1],2);
1443 if (nbentries < 0) {
1446 nbentries = -nbentries;
1478 if ( h2Array->
fN != fN ) {
1479 throw DifferentBinLimits();
1483 for (
int i = 0; i < fN; ++i ) {
1488 throw DifferentBinLimits();
1509 throw DifferentLabels();
1514 throw DifferentLabels();
1517 for (
int i = 1; i <= a1->
GetNbins(); ++i) {
1520 if (label1 != label2) {
1521 throw DifferentLabels();
1539 throw DifferentAxisLimits();
1552 ::Info(
"CheckEqualAxes",
"Axes have different number of bins : nbin1 = %d nbin2 = %d",a1->
GetNbins(),a2->
GetNbins() );
1557 }
catch (DifferentAxisLimits&) {
1558 ::Info(
"CheckEqualAxes",
"Axes have different limits");
1563 }
catch (DifferentBinLimits&) {
1564 ::Info(
"CheckEqualAxes",
"Axes have different bin limits");
1571 }
catch (DifferentLabels&) {
1572 ::Info(
"CheckEqualAxes",
"Axes have different labels");
1587 Int_t nbins1 = lastBin1-firstBin1 + 1;
1595 if (firstBin2 < lastBin2) {
1597 nbins2 = lastBin1-firstBin1 + 1;
1602 if (nbins1 != nbins2 ) {
1603 ::Info(
"CheckConsistentSubAxes",
"Axes have different number of bins");
1611 ::Info(
"CheckConsistentSubAxes",
"Axes have different limits");
1623 if (
h1 == h2)
return true;
1626 throw DifferentDimension();
1638 (dim > 1 && nbinsy != h2->
GetNbinsY()) ||
1639 (dim > 2 && nbinsz != h2->
GetNbinsZ()) ) {
1640 throw DifferentNumberOfBins();
1955 Int_t ndf = 0, igood = 0;
1963 printf(
"Chi2 = %f, Prob = %g, NDF = %d, igood = %d\n", chi2,prob,ndf,igood);
1966 if (ndf == 0)
return 0;
2014 Int_t i_start, i_end;
2015 Int_t j_start, j_end;
2016 Int_t k_start, k_end;
2045 Error(
"Chi2TestX",
"Histograms have different dimensions.");
2050 if (nbinx1 != nbinx2) {
2051 Error(
"Chi2TestX",
"different number of x channels");
2053 if (nbiny1 != nbiny2) {
2054 Error(
"Chi2TestX",
"different number of y channels");
2056 if (nbinz1 != nbinz2) {
2057 Error(
"Chi2TestX",
"different number of z channels");
2061 i_start = j_start = k_start = 1;
2092 ndf = (i_end - i_start + 1) * (j_end - j_start + 1) * (k_end - k_start + 1) - 1;
2099 if (scaledHistogram && !comparisonUU) {
2100 Info(
"Chi2TestX",
"NORM option should be used together with UU option. It is ignored");
2107 Double_t effEntries1 = (
s[1] ?
s[0] *
s[0] /
s[1] : 0.0);
2111 Double_t effEntries2 = (
s[1] ?
s[0] *
s[0] /
s[1] : 0.0);
2113 if (!comparisonUU && !comparisonUW && !comparisonWW ) {
2115 if (
TMath::Abs(sumBinContent1 - effEntries1) < 1) {
2116 if (
TMath::Abs(sumBinContent2 - effEntries2) < 1) comparisonUU =
true;
2117 else comparisonUW =
true;
2119 else comparisonWW =
true;
2123 if (
TMath::Abs(sumBinContent1 - effEntries1) >= 1) {
2124 Warning(
"Chi2TestX",
"First histogram is not unweighted and option UW has been requested");
2127 if ( (!scaledHistogram && comparisonUU) ) {
2128 if ( (
TMath::Abs(sumBinContent1 - effEntries1) >= 1) || (
TMath::Abs(sumBinContent2 - effEntries2) >= 1) ) {
2129 Warning(
"Chi2TestX",
"Both histograms are not unweighted and option UU has been requested");
2135 if (comparisonUU && scaledHistogram) {
2136 for (
Int_t i = i_start; i <= i_end; ++i) {
2137 for (
Int_t j = j_start; j <= j_end; ++j) {
2138 for (
Int_t k = k_start; k <= k_end; ++k) {
2147 if (e1sq > 0.0) cnt1 =
TMath::Floor(cnt1 * cnt1 / e1sq + 0.5);
2150 if (e2sq > 0.0) cnt2 =
TMath::Floor(cnt2 * cnt2 / e2sq + 0.5);
2161 if (sumw1 <= 0.0 || sumw2 <= 0.0) {
2162 Error(
"Chi2TestX",
"Cannot use option NORM when one histogram has all zero errors");
2167 for (
Int_t i = i_start; i <= i_end; ++i) {
2168 for (
Int_t j = j_start; j <= j_end; ++j) {
2169 for (
Int_t k = k_start; k <= k_end; ++k) {
2183 if (sum1 == 0.0 || sum2 == 0.0) {
2184 Error(
"Chi2TestX",
"one histogram is empty");
2188 if ( comparisonWW && ( sumw1 <= 0.0 && sumw2 <= 0.0 ) ){
2189 Error(
"Chi2TestX",
"Hist1 and Hist2 have both all zero errors\n");
2199 for (
Int_t i = i_start; i <= i_end; ++i) {
2200 for (
Int_t j = j_start; j <= j_end; ++j) {
2201 for (
Int_t k = k_start; k <= k_end; ++k) {
2208 if (scaledHistogram) {
2213 if (e1sq > 0) cnt1 =
TMath::Floor(cnt1 * cnt1 / e1sq + 0.5);
2216 if (e2sq > 0) cnt2 =
TMath::Floor(cnt2 * cnt2 / e2sq + 0.5);
2220 if (
Int_t(cnt1) == 0 &&
Int_t(cnt2) == 0) --ndf;
2227 if (res) res[i - i_start] = (cnt1 - nexp1) /
TMath::Sqrt(nexp1);
2236 Double_t delta = sum2 * cnt1 - sum1 * cnt2;
2237 chi2 += delta * delta / cntsum;
2242 chi2 /= sum1 * sum2;
2247 Info(
"Chi2TestX",
"There is a bin in h1 with less than 1 event.\n");
2251 Info(
"Chi2TestX",
"There is a bin in h2 with less than 1 event.\n");
2262 if ( comparisonUW ) {
2263 for (
Int_t i = i_start; i <= i_end; ++i) {
2264 for (
Int_t j = j_start; j <= j_end; ++j) {
2265 for (
Int_t k = k_start; k <= k_end; ++k) {
2274 if (cnt1 * cnt1 == 0 && cnt2 * cnt2 == 0) {
2280 if (cnt2 * cnt2 == 0 && e2sq == 0) {
2284 e2sq = sumw2 / sum2;
2289 Error(
"Chi2TestX",
"Hist2 has in bin (%d,%d,%d) zero content and zero errors\n", i, j, k);
2295 if (e2sq > 0 && cnt2 * cnt2 / e2sq < 10)
n++;
2297 Double_t var1 = sum2 * cnt2 - sum1 * e2sq;
2298 Double_t var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2303 while (var1 * var1 + cnt1 == 0 || var1 + var2 == 0) {
2306 var1 = sum2 * cnt2 - sum1 * e2sq;
2307 var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2311 while (var1 + var2 == 0) {
2314 var1 = sum2 * cnt2 - sum1 * e2sq;
2315 var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2316 while (var1 * var1 + cnt1 == 0 || var1 + var2 == 0) {
2319 var1 = sum2 * cnt2 - sum1 * e2sq;
2320 var2 = var1 * var1 + 4. * sum2 * sum2 * cnt1 * e2sq;
2325 Double_t probb = (var1 + var2) / (2. * sum2 * sum2);
2333 chi2 += delta1 * delta1 / nexp1;
2336 chi2 += delta2 * delta2 / e2sq;
2341 Double_t temp1 = sum2 * e2sq / var2;
2342 Double_t temp2 = 1.0 + (sum1 * e2sq - sum2 * cnt2) / var2;
2343 temp2 = temp1 * temp1 * sum1 * probb * (1.0 - probb) + temp2 * temp2 * e2sq / 4.0;
2356 Info(
"Chi2TestX",
"There is a bin in h1 with less than 1 event.\n");
2360 Info(
"Chi2TestX",
"There is a bin in h2 with less than 10 effective events.\n");
2370 for (
Int_t i = i_start; i <= i_end; ++i) {
2371 for (
Int_t j = j_start; j <= j_end; ++j) {
2372 for (
Int_t k = k_start; k <= k_end; ++k) {
2382 if (cnt1 * cnt1 == 0 && cnt2 * cnt2 == 0) {
2387 if (e1sq == 0 && e2sq == 0) {
2389 Error(
"Chi2TestX",
"h1 and h2 both have bin %d,%d,%d with all zero errors\n", i,j,k);
2394 Double_t delta = sum2 * cnt1 - sum1 * cnt2;
2395 chi2 += delta * delta /
sigma;
2398 Double_t temp = cnt1 * sum1 * e2sq + cnt2 * sum2 * e1sq;
2411 res[i - i_start] = z;
2414 if (e1sq > 0 && cnt1 * cnt1 / e1sq < 10)
m++;
2415 if (e2sq > 0 && cnt2 * cnt2 / e2sq < 10)
n++;
2421 Info(
"Chi2TestX",
"There is a bin in h1 with less than 10 effective events.\n");
2425 Info(
"Chi2TestX",
"There is a bin in h2 with less than 10 effective events.\n");
2442 Error(
"Chisquare",
"Function pointer is Null - return -1");
2488 Int_t nbins = nbinsx * nbinsy * nbinsz;
2493 for (
Int_t binz=1; binz <= nbinsz; ++binz) {
2494 for (
Int_t biny=1; biny <= nbinsy; ++biny) {
2495 for (
Int_t binx=1; binx <= nbinsx; ++binx) {
2498 if (onlyPositive &&
y < 0) {
2499 Error(
"ComputeIntegral",
"Bin content is negative - return a NaN value");
2510 Error(
"ComputeIntegral",
"Integral = zero");
return 0;
2553 hintegrated->
Reset();
2556 for (
Int_t binz = 1; binz <= nbinsz; ++binz) {
2557 for (
Int_t biny = 1; biny <= nbinsy; ++biny) {
2558 for (
Int_t binx = 1; binx <= nbinsx; ++binx) {
2559 const Int_t bin = hintegrated->
GetBin(binx, biny, binz);
2567 for (
Int_t binz = nbinsz; binz >= 1; --binz) {
2568 for (
Int_t biny = nbinsy; biny >= 1; --biny) {
2569 for (
Int_t binx = nbinsx; binx >= 1; --binx) {
2570 const Int_t bin = hintegrated->
GetBin(binx, biny, binz);
2596 ((
TH1&)obj).fDirectory->Remove(&obj);
2597 ((
TH1&)obj).fDirectory = 0;
2611 delete [] ((
TH1&)obj).fBuffer;
2612 ((
TH1&)obj).fBuffer = 0;
2618 ((
TH1&)obj).fBuffer = buf;
2644 ((
TH1&)obj).fXaxis.SetParent(&obj);
2645 ((
TH1&)obj).fYaxis.SetParent(&obj);
2646 ((
TH1&)obj).fZaxis.SetParent(&obj);
2656 ((
TH1&)obj).fFunctions->UseRWLock();
2669 TH1* obj = (
TH1*)IsA()->GetNew()(0);
2684 oldparent = oldstats->GetParent();
2685 oldstats->SetParent(
nullptr);
2691 oldstats->SetParent(oldparent);
2703 if(newname && strlen(newname) ) {
2758 Error(
"Divide",
"Attempt to divide by a non-existing function");
2776 Int_t bin, binx, biny, binz;
2781 for (binz = 0; binz < nz; ++binz) {
2783 for (biny = 0; biny < ny; ++biny) {
2785 for (binx = 0; binx < nx; ++binx) {
2789 bin = binx + nx * (biny + ny * binz);
2826 Error(
"Divide",
"Input histogram passed does not exist (NULL).");
2835 }
catch(DifferentNumberOfBins&) {
2836 Error(
"Divide",
"Cannot divide histograms with different number of bins");
2838 }
catch(DifferentAxisLimits&) {
2839 Warning(
"Divide",
"Dividing histograms with different axis limits");
2840 }
catch(DifferentBinLimits&) {
2841 Warning(
"Divide",
"Dividing histograms with different bin limits");
2842 }
catch(DifferentLabels&) {
2843 Warning(
"Divide",
"Dividing histograms with different labels");
2898 Error(
"Divide",
"At least one of the input histograms passed does not exist (NULL).");
2908 }
catch(DifferentNumberOfBins&) {
2909 Error(
"Divide",
"Cannot divide histograms with different number of bins");
2911 }
catch(DifferentAxisLimits&) {
2912 Warning(
"Divide",
"Dividing histograms with different axis limits");
2913 }
catch(DifferentBinLimits&) {
2914 Warning(
"Divide",
"Dividing histograms with different bin limits");
2915 }
catch(DifferentLabels&) {
2916 Warning(
"Divide",
"Dividing histograms with different labels");
2921 Error(
"Divide",
"Coefficient of dividing histogram cannot be zero");
2958 fSumw2.
fArray[i] = c1sq * c2sq * (e1sq * b2sq + e2sq * b1sq) / (c2sq * c2sq * b2sq * b2sq);
3011 if (index>indb && index<indk) index = -1;
3017 if (!
gPad->IsEditable())
gROOT->MakeDefCanvas();
3019 if (
gPad->GetX1() == 0 &&
gPad->GetX2() == 1 &&
3020 gPad->GetY1() == 0 &&
gPad->GetY2() == 1 &&
3021 gPad->GetListOfPrimitives()->GetSize()==0) opt2.
Remove(index,4);
3028 gPad->IncrementPaletteColor(1, opt1);
3030 if (index>=0) opt2.
Remove(index,4);
3056 if (
gPad)
gPad->IncrementPaletteColor(1, opt);
3081 Error(
"DrawNormalized",
"Sum of weights is null. Cannot normalize histogram: %s",
GetName());
3093 if (opt.
IsNull() || opt ==
"SAME") opt +=
"HIST";
3128 Int_t range, stat, add;
3148 for (
Int_t binz = 1; binz <= nbinsz; ++binz) {
3150 for (
Int_t biny = 1; biny <= nbinsy; ++biny) {
3152 for (
Int_t binx = 1; binx <= nbinsx; ++binx) {
3252 for (
Int_t binx = 1; binx<=ndim[0]; binx++) {
3253 for (
Int_t biny=1; biny<=ndim[1]; biny++) {
3254 for (
Int_t binz=1; binz<=ndim[2]; binz++) {
3284 if (bin <0)
return -1;
3317 if (bin <0)
return -1;
3350 if (bin <0)
return -1;
3386 for (i=0;i<ntimes;i+=stride) {
3392 if (i < ntimes &&
fBuffer==0) {
3393 auto weights = w ? &w[i] :
nullptr;
3394 DoFillN((ntimes-i)/stride,&
x[i],weights,stride);
3414 for (i=0;i<ntimes;i+=stride) {
3416 if (bin <0)
continue;
3421 if (bin == 0 || bin > nbins) {
3449 Int_t bin, binx, ibin, loop;
3453 if (!
f1) {
Error(
"FillRandom",
"Unknown function: %s",fname);
return; }
3463 Info(
"FillRandom",
"Using function axis and range [%g,%g]",
xmin,
xmax);
3473 for (binx=1;binx<=nbinsx;binx++) {
3475 integral[binx] = integral[binx-1] + fint;
3479 if (integral[nbinsx] == 0 ) {
3481 Error(
"FillRandom",
"Integral = zero");
return;
3483 for (bin=1;bin<=nbinsx;bin++) integral[bin] /= integral[nbinsx];
3486 for (loop=0;loop<ntimes;loop++) {
3492 +xAxis->
GetBinWidth(ibin+
first)*(r1-integral[ibin])/(integral[ibin+1] - integral[ibin]);
3516 if (!
h) {
Error(
"FillRandom",
"Null histogram");
return; }
3518 Error(
"FillRandom",
"Histograms with different dimensions");
return;
3521 Error(
"FillRandom",
"Histograms contains negative bins, does not represent probabilities");
3530 if (ntimes > 10*nbins) {
3534 if (sumw == 0)
return;
3537 Double_t mean =
h->RetrieveBinContent(bin)*ntimes/sumw;
3548 if (sumgen < ntimes) {
3550 for (i =
Int_t(sumgen+0.5); i < ntimes; ++i)
3556 else if (sumgen > ntimes) {
3558 i =
Int_t(sumgen+0.5);
3559 while( i > ntimes) {
3574 catch(std::exception&) {}
3578 if (
h->ComputeIntegral() ==0)
return;
3581 for (loop=0;loop<ntimes;loop++) {
3607 return binx + nx*biny;
3615 return binx + nx*(biny +ny*binz);
3640 return binx + nx*biny;
3648 return binx + nx*(biny +ny*binz);
3666 Warning(
"FindFirstBinAbove",
"Invalid axis number : %d, axis x assumed\n",axis);
3680 for (
Int_t binx = firstBin; binx <= lastBin; binx++) {
3681 for (
Int_t biny = 1; biny <= nbinsy; biny++) {
3682 for (
Int_t binz = 1; binz <= nbinsz; binz++) {
3688 else if (axis == 2) {
3692 for (
Int_t biny = firstBin; biny <= lastBin; biny++) {
3693 for (
Int_t binx = 1; binx <= nbinsx; binx++) {
3694 for (
Int_t binz = 1; binz <= nbinsz; binz++) {
3700 else if (axis == 3) {
3704 for (
Int_t binz = firstBin; binz <= lastBin; binz++) {
3705 for (
Int_t binx = 1; binx <= nbinsx; binx++) {
3706 for (
Int_t biny = 1; biny <= nbinsy; biny++) {
3730 Warning(
"FindFirstBinAbove",
"Invalid axis number : %d, axis x assumed\n",axis);
3744 for (
Int_t binx = lastBin; binx >= firstBin; binx--) {
3745 for (
Int_t biny = 1; biny <= nbinsy; biny++) {
3746 for (
Int_t binz = 1; binz <= nbinsz; binz++) {
3752 else if (axis == 2) {
3756 for (
Int_t biny = lastBin; biny >= firstBin; biny--) {
3757 for (
Int_t binx = 1; binx <= nbinsx; binx++) {
3758 for (
Int_t binz = 1; binz <= nbinsz; binz++) {
3764 else if (axis == 3) {
3768 for (
Int_t binz = lastBin; binz >= firstBin; binz--) {
3769 for (
Int_t binx = 1; binx <= nbinsx; binx++) {
3770 for (
Int_t biny = 1; biny <= nbinsy; biny++) {
3813 linear= (
char*)strstr(fname,
"++");
3817 TF1 f1(fname, fname, xxmin, xxmax);
3818 return Fit(&
f1,option,goption,xxmin,xxmax);
3821 TF2 f2(fname, fname);
3822 return Fit(&f2,option,goption,xxmin,xxmax);
3825 TF3 f3(fname, fname);
3826 return Fit(&f3,option,goption,xxmin,xxmax);
3831 if (!
f1) {
Printf(
"Unknown function: %s",fname);
return -1; }
3832 return Fit(
f1,option,goption,xxmin,xxmax);
4160 gROOT->MakeDefCanvas();
4163 Error(
"FitPanel",
"Unable to create a default canvas");
4170 if (handler && handler->
LoadPlugin() != -1) {
4172 Error(
"FitPanel",
"Unable to create the FitPanel");
4175 Error(
"FitPanel",
"Unable to find the FitPanel plug-in");
4232 asym->
Divide(top,bottom);
4246 for(
Int_t k=1; k<= zmax; k++){
4336 Info(
"SetHighlight",
"Supported only 1-D or 2-D histograms");
4341 Info(
"SetHighlight",
"Need to draw histogram first");
4355 return ((
TH1*)
this)->GetPainter()->GetObjectInfo(px,py);
4456 Error(
"GetQuantiles",
"Only available for 1-d histograms");
4466 Int_t nq = nprobSum;
4471 for (i=1;i<nq;i++) {
4476 for (i = 0; i < nq; i++) {
4478 while (ibin < nbins-1 &&
fIntegral[ibin+1] == prob[i]) {
4479 if (
fIntegral[ibin+2] == prob[i]) ibin++;
4487 if (!probSum)
delete [] prob;
4505 Double_t allcha, sumx, sumx2,
x, val, stddev, mean;
4516 allcha = sumx = sumx2 = 0;
4517 for (bin=hxfirst;bin<=hxlast;bin++) {
4520 if (val > valmax) valmax = val;
4525 if (allcha == 0)
return;
4527 stddev = sumx2/allcha - mean*mean;
4530 if (stddev == 0) stddev = binwidx*(hxlast-hxfirst+1)/4;
4537 Double_t constant = 0.5*(valmax+binwidx*allcha/(sqrtpi*stddev));
4545 if ((mean < xmin || mean >
xmax) && stddev > (
xmax-
xmin)) {
4566 Int_t nchanx = hxlast - hxfirst + 1;
4587 Int_t nchanx = hxlast - hxfirst + 1;
4590 if (nchanx <=1 || npar == 1) {
4613 const Int_t idim = 20;
4624 if (
m > idim ||
m >
n)
return;
4627 for (
l = 2;
l <=
m; ++
l) {
4629 b[
m +
l*20 - 21] = zero;
4636 for (k = hxfirst; k <= hxlast; ++k) {
4641 for (
l = 2;
l <=
m; ++
l) {
4644 da[
l-1] += power*yk;
4646 for (
l = 2;
l <=
m; ++
l) {
4648 b[
m +
l*20 - 21] += power;
4651 for (i = 3; i <=
m; ++i) {
4652 for (k = i; k <=
m; ++k) {
4653 b[k - 1 + (i-1)*20 - 21] =
b[k + (i-2)*20 - 21];
4658 for (i=0; i<
m; ++i)
a[i] = da[i];
4678 xbar = ybar = x2bar = xybar = 0;
4683 for (i = hxfirst; i <= hxlast; ++i) {
4687 if (yk <= 0) yk = 1
e-9;
4696 det = fn*x2bar - xbar*xbar;
4704 a0 = (x2bar*ybar - xbar*xybar) / det;
4705 a1 = (fn*xybar - xbar*ybar) / det;
4716 Int_t a_dim1, a_offset, b_dim1, b_offset;
4718 Int_t im1, jp1, nm1, nmi;
4724 b_offset = b_dim1 + 1;
4727 a_offset = a_dim1 + 1;
4730 if (idim <
n)
return;
4733 for (j = 1; j <=
n; ++j) {
4734 if (
a[j + j*a_dim1] <= 0) { ifail = -1;
return; }
4735 a[j + j*a_dim1] = one /
a[j + j*a_dim1];
4736 if (j ==
n)
continue;
4738 for (
l = jp1;
l <=
n; ++
l) {
4739 a[j +
l*a_dim1] =
a[j + j*a_dim1] *
a[
l + j*a_dim1];
4740 s1 = -
a[
l + (j+1)*a_dim1];
4741 for (i = 1; i <= j; ++i) {
s1 =
a[
l + i*a_dim1] *
a[i + (j+1)*a_dim1] +
s1; }
4742 a[
l + (j+1)*a_dim1] = -
s1;
4747 for (
l = 1;
l <= k; ++
l) {
4748 b[
l*b_dim1 + 1] =
a[a_dim1 + 1]*
b[
l*b_dim1 + 1];
4751 for (
l = 1;
l <= k; ++
l) {
4752 for (i = 2; i <=
n; ++i) {
4754 s21 = -
b[i +
l*b_dim1];
4755 for (j = 1; j <= im1; ++j) {
4756 s21 =
a[i + j*a_dim1]*
b[j +
l*b_dim1] + s21;
4758 b[i +
l*b_dim1] = -
a[i + i*a_dim1]*s21;
4761 for (i = 1; i <= nm1; ++i) {
4763 s22 = -
b[nmi +
l*b_dim1];
4764 for (j = 1; j <= i; ++j) {
4766 s22 =
a[nmi + nmjp1*a_dim1]*
b[nmjp1 +
l*b_dim1] + s22;
4768 b[nmi +
l*b_dim1] = -s22;
4806 if (binx < 0) binx = 0;
4807 if (binx > ofx) binx = ofx;
4822 binx = binglobal%nx;
4828 binx = binglobal%nx;
4829 biny = ((binglobal-binx)/nx)%ny;
4834 binx = binglobal%nx;
4835 biny = ((binglobal-binx)/nx)%ny;
4836 binz = ((binglobal-binx)/nx -biny)/ny;
4853 Error(
"GetRandom",
"Function only valid for 1-d histograms");
4863 integral = ((
TH1*)
this)->ComputeIntegral(
true);
4865 if (integral == 0)
return 0;
4904 if (bin < 0) bin = 0;
4930 Error(
"GetBinWithContent",
"function is only valid for 1-D histograms");
4936 if (firstx <= 0) firstx = 1;
4940 for (
Int_t i=firstx;i<=lastx;i++) {
4942 if (diff <= 0) {binx = i;
return diff;}
4943 if (diff < curmax && diff <= maxdiff) {curmax = diff, binminx=i;}
4978 return y0 + (
x-x0)*((y1-y0)/(
x1-x0));
4987 Error(
"Interpolate",
"This function must be called with 1 argument for a TH1");
4996 Error(
"Interpolate",
"This function must be called with 1 argument for a TH1");
5024 Int_t binx, biny, binz;
5046 Error(
"IsBinOverflow",
"Invalid axis value");
5056 Int_t binx, biny, binz;
5063 return (binx <= 0 || biny <= 0);
5065 return (binx <= 0 || biny <= 0 || binz <= 0);
5076 Error(
"IsBinUnderflow",
"Invalid axis value");
5093 Error(
"LabelsDeflate",
"Invalid axis option %s",ax);
5104 while ((obj = next())) {
5106 if (ibin > nbins) nbins = ibin;
5108 if (nbins < 1) nbins = 1;
5111 if (nbins==axis->
GetNbins())
return;
5113 TH1 *hold = (
TH1*)IsA()->New();