140 if (exl)
fEXlow[i] = exl[i];
144 if (eyl)
fEYlow[i] = eyl[i];
202 fX[i] = vx(i+ivxlow);
203 fY[i] = vy(i+ivylow);
204 fEXlow[i] = vexl(i+ivexllow);
205 fEYlow[i] = veyl(i+iveyllow);
232 fX[i] = vx(i+ivxlow);
233 fY[i] = vy(i+ivylow);
234 fEXlow[i] = vexl(i+ivexllow);
235 fEYlow[i] = veyl(i+iveyllow);
254 fEYlow[i] =
h->GetBinErrorLow(i+1);
255 fEYhigh[i] =
h->GetBinErrorUp(i+1);;
265 :
TGraph((pass)?pass->GetNbinsX():0)
267 if (!pass || !
total) {
268 Error(
"TGraphAsymmErrors",
"Invalid histogram pointers");
273 std::string sname =
"divide_" + std::string(pass->
GetName()) +
"_by_" +
274 std::string(
total->GetName());
279 pass->TAttLine::Copy(*
this);
280 pass->TAttFill::Copy(*
this);
281 pass->TAttMarker::Copy(*
this);
310 std::ifstream infile(fname.
Data());
311 if (!infile.good()) {
313 Error(
"TGraphAsymmErrors",
"Cannot open file: %s, TGraphAsymmErrors is Zombie",
filename);
320 if (strcmp(
option,
"") == 0) {
324 while (std::getline(infile,
line,
'\n')) {
325 exl = exh = eyl = eyh = 0.;
328 }
else if (ncol < 5) {
331 res = sscanf(
line.c_str(),
format, &
x, &
y, &exl, &exh, &eyl, &eyh);
353 Error(
"TGraphAsymmErrors",
"Incorrect input format! Allowed format tags are {\"%%lg\",\"%%*lg\" or \"%%*s\"}");
358 Error(
"TGraphAsymmErrors",
"Incorrect input format! Only %d tag(s) in format whereas at least 2 \"%%lg\" tags are expected!", ntokens);
361 Int_t ntokensToBeSaved = 0;
363 for (
Int_t idx = 0; idx < ntokens; idx++) {
365 if (isTokenToBeSaved[idx] == 1) {
369 if (ntokens >= 2 && (ntokensToBeSaved < 2 || ntokensToBeSaved > 4)) {
370 Error(
"TGraphAsymmErrors",
"Incorrect input format! There are %d \"%%lg\" tag(s) in format whereas 2,3 or 4 are expected!", ntokensToBeSaved);
371 delete [] isTokenToBeSaved;
377 char *token =
nullptr;
381 for (
Int_t k = 0; k < 6; k++)
387 while (std::getline(infile,
line,
'\n')) {
389 if (
line[
line.size() - 1] ==
char(13)) {
392 token = R__STRTOK_R(
const_cast<char*
>(
line.c_str()),
option, &rest) ;
393 while (token !=
nullptr && value_idx < ntokensToBeSaved) {
394 if (isTokenToBeSaved[token_idx]) {
398 isLineToBeSkipped =
kTRUE ;
405 token = R__STRTOK_R(
nullptr,
option, &rest);
408 if (!isLineToBeSkipped && value_idx > 1) {
420 isLineToBeSkipped =
kFALSE;
428 delete [] isTokenToBeSaved;
465 Double_t x,
y,exl,exh,eyl,eyh,eyl_new,eyh_new,fxy;
483 if (
f->Eval(
x,
y-eyl)<
f->Eval(
x,
y+eyh)) {
586 if(!pass || !
total) {
587 Error(
"Divide",
"one of the passed pointers is zero");
593 Error(
"Divide",
"passed histograms are not one-dimensional");
599 Bool_t bEffective =
false;
605 for (
int i = 0; i < pass->
GetNcells(); ++i) {
619 if (
total->GetSumw2()->fN > 0) {
620 for (
int i = 0; i <
total->GetNcells(); ++i) {
621 tsumw +=
total->GetBinContent(i);
622 tsumw2 +=
total->GetSumw2()->At(i);
626 tsumw =
total->GetSumOfWeights();
651 Bool_t bIsBayesian =
false;
656 if(
option.Contains(
"v")) {
657 option.ReplaceAll(
"v",
"");
660 Info(
"Divide",
"weight will be considered in the Histogram Ratio");
665 if(
option.Contains(
"cl=")) {
668 sscanf(strstr(
option.Data(),
"cl="),
"cl=%lf",&level);
669 if((level > 0) && (level < 1))
672 Warning(
"Divide",
"given confidence level %.3lf is invalid",level);
673 option.ReplaceAll(
"cl=",
"");
679 Bool_t usePosteriorMode =
false;
680 Bool_t useShortestInterval =
false;
681 if (
option.Contains(
"b(")) {
684 sscanf(strstr(
option.Data(),
"b("),
"b(%lf,%lf)", &
a, &
b);
688 Warning(
"Divide",
"given shape parameter for alpha %.2lf is invalid",
a);
692 Warning(
"Divide",
"given shape parameter for beta %.2lf is invalid",
b);
693 option.ReplaceAll(
"b(",
"");
700 if (
option.Contains(
"mode")) {
701 usePosteriorMode =
true;
702 option.ReplaceAll(
"mode",
"");
704 if (
option.Contains(
"sh") || (usePosteriorMode && !
option.Contains(
"cen"))) {
705 useShortestInterval =
true;
709 else if (
option.Contains(
"n")) {
710 option.ReplaceAll(
"n",
"");
714 else if (
option.Contains(
"cp")) {
715 option.ReplaceAll(
"cp",
"");
719 else if (
option.Contains(
"w")) {
720 option.ReplaceAll(
"w",
"");
724 else if (
option.Contains(
"ac")) {
725 option.ReplaceAll(
"ac",
"");
729 else if (
option.Contains(
"fc")) {
730 option.ReplaceAll(
"fc",
"");
734 else if (
option.Contains(
"midp")) {
735 option.ReplaceAll(
"midp",
"");
740 Bool_t bPoissonRatio =
false;
741 if (
option.Contains(
"pois")) {
742 bPoissonRatio =
true;
743 option.ReplaceAll(
"pois",
"");
746 if (
option.Contains(
"e0")) {
748 option.ReplaceAll(
"e0",
"");
754 Warning(
"Divide",
"Histograms have weights: only Normal or Bayesian error calculation is supported");
755 Info(
"Divide",
"Using now the Normal approximation for weighted histograms");
760 Error(
"Divide",
"passed histograms are not of the same dimension");
765 Error(
"Divide",
"passed histograms are not consistent");
771 Error(
"Divide",
"passed histograms are not consistent");
786 double eff, low, upper;
791 Double_t tw = 0, tw2 = 0, pw = 0, pw2 = 0, wratio = 1;
802 tw =
total->GetBinContent(
b);
803 tw2 = (
total->GetSumw2()->fN > 0) ?
total->GetSumw2()->At(
b) : tw;
813 if (pw == 0 && pw2 == 0)
818 if (tw == 0 && tw2 == 0)
823 if (pw > 0 && tw > 0)
825 wratio = (pw * t) / (
p * tw);
826 else if (pw == 0 && tw > 0)
829 wratio = (psumw2 * t) / (psumw * tw);
830 else if (tw == 0 && pw > 0)
833 wratio = (pw * tsumw) / (
p * tsumw2);
838 if (!plot0Bins)
continue;
843 }
else if (tw <= 0 && !plot0Bins)
853 t = std::round(
total->GetBinContent(
b));
859 if (t == 0.0 && !plot0Bins)
867 if ((bEffective && !bPoissonRatio) && tw2 <= 0) {
870 low = eff; upper = eff;
874 if (bEffective && !bPoissonRatio) {
876 double norm = tw/tw2;
877 aa = pw * norm + alpha;
878 bb = (tw - pw) * norm + beta;
884 if (usePosteriorMode)
889 if (useShortestInterval) {
900 if (bEffective && !bPoissonRatio) {
909 double variance = ( pw2 * (1. - 2 * eff) + tw2 * eff *eff ) / ( tw * tw) ;
910 double sigma = sqrt(variance);
912 double prob = 0.5 * (1.-conf);
916 if (low < 0) low = 0;
917 if (upper > 1) upper = 1.;
925 low = pBound(t,
p,conf,
false);
926 upper = pBound(t,
p,conf,
true);
934 low = low/(1. - low);
935 upper = upper/(1.-upper);
957 Warning(
"Divide",
"Number of graph points is different than histogram bins - %d points have been skipped",nbins-npoint);
961 Info(
"Divide",
"made a graph with %d points from %d bins",npoint,nbins);
962 Info(
"Divide",
"used confidence level: %.2lf\n",conf);
964 Info(
"Divide",
"used prior probability ~ beta(%.2lf,%.2lf)",alpha,beta);
1034 memmove(&arrays[0][obegin], &
fEXlow[ibegin],
n);
1035 memmove(&arrays[1][obegin], &
fEXhigh[ibegin],
n);
1036 memmove(&arrays[2][obegin], &
fEYlow[ibegin],
n);
1037 memmove(&arrays[3][obegin], &
fEYhigh[ibegin],
n);
1074 if (
g->GetN() == 0)
return kFALSE;
1080 if (exl ==
nullptr || exh ==
nullptr || eyl ==
nullptr || eyh ==
nullptr) {
1082 Warning(
"DoMerge",
"Merging a %s is not compatible with a TGraphAsymmErrors - errors will be ignored",
g->IsA()->GetName());
1085 for (
Int_t i = 0 ; i <
g->GetN(); i++) {
1119 if (i < 0 || i >=
fNpoints)
return -1;
1124 return TMath::Sqrt(0.5*(elow*elow + ehigh*ehigh));
1134 if (i < 0 || i >=
fNpoints)
return -1;
1139 return TMath::Sqrt(0.5*(elow*elow + ehigh*ehigh));
1198 "Cannot merge - an object which doesn't inherit from TGraph found in the list");
1202 int n1 = n0+
g->GetN();
1210 for (
Int_t i = 0 ; i <
g->GetN(); i++) {
1212 if (exlow)
fEXlow[n0+i] = exlow[i];
1213 if (exhigh)
fEXhigh[n0+i] = exhigh[i];
1214 if (eylow)
fEYlow[n0+i] = eylow[i];
1215 if (eyhigh)
fEYhigh[n0+i] = eyhigh[i];
1227 printf(
"x[%d]=%g, y[%d]=%g, exl[%d]=%g, exh[%d]=%g, eyl[%d]=%g, eyh[%d]=%g\n"
1228 ,i,
fX[i],i,
fY[i],i,
fEXlow[i],i,
fEXhigh[i],i,
fEYlow[i],i,
fEYhigh[i]);
1238 out <<
" " << std::endl;
1239 static Int_t frameNumber = 3000;
1242 auto fXName =
SaveArray(out,
"fx", frameNumber,
fX);
1243 auto fYName =
SaveArray(out,
"fy", frameNumber,
fY);
1252 out <<
" TGraphAsymmErrors *";
1253 out <<
"grae = new TGraphAsymmErrors("<<
fNpoints <<
","
1254 << fXName <<
"," << fYName <<
","
1255 << fElXName <<
"," << fEhXName <<
","
1256 << fElYName <<
"," << fEhYName <<
");"
1297 Error(
"SetPointError",
"Cannot be used without gPad, requires last mouse position");
1311 if (dpx*dpx+dpy*dpy < 25) {ipoint = i;
break;}
1313 if (ipoint == -2)
return;
1401 if (
b.IsReading()) {
1403 Version_t R__v =
b.ReadVersion(&R__s, &R__c);
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
static unsigned int total
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t np
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t format
R__EXTERN TStyle * gStyle
R__EXTERN TSystem * gSystem
Double_t At(Int_t i) const
Buffer base class used for serializing objects.
Collection abstract base class.
static Double_t BetaMode(Double_t alpha, Double_t beta)
Compute the mode of the beta distribution.
static Bool_t BetaShortestInterval(Double_t level, Double_t alpha, Double_t beta, Double_t &lower, Double_t &upper)
Calculates the boundaries for a shortest confidence interval for a Beta distribution.
static Double_t BetaMean(Double_t alpha, Double_t beta)
Compute the mean (average) of the beta distribution.
static Double_t AgrestiCoull(Double_t total, Double_t passed, Double_t level, Bool_t bUpper)
Calculates the boundaries for the frequentist Agresti-Coull interval.
static Double_t FeldmanCousins(Double_t total, Double_t passed, Double_t level, Bool_t bUpper)
Calculates the boundaries for the frequentist Feldman-Cousins interval.
static Bool_t CheckBinning(const TH1 &pass, const TH1 &total)
Checks binning for each axis.
static Double_t BetaCentralInterval(Double_t level, Double_t alpha, Double_t beta, Bool_t bUpper)
Calculates the boundaries for a central confidence interval for a Beta distribution.
static Double_t MidPInterval(Double_t total, Double_t passed, Double_t level, Bool_t bUpper)
Calculates the boundaries using the mid-P binomial interval (Lancaster method) from B.
static Double_t Normal(Double_t total, Double_t passed, Double_t level, Bool_t bUpper)
Returns the confidence limits for the efficiency supposing that the efficiency follows a normal distr...
static Double_t Wilson(Double_t total, Double_t passed, Double_t level, Bool_t bUpper)
Calculates the boundaries for the frequentist Wilson interval.
static Bool_t CheckConsistency(const TH1 &pass, const TH1 &total, Option_t *opt="")
Checks the consistence of the given histograms.
static Double_t ClopperPearson(Double_t total, Double_t passed, Double_t level, Bool_t bUpper)
Calculates the boundaries for the frequentist Clopper-Pearson interval.
TGraph with asymmetric error bars.
Double_t * GetEXlow() const override
virtual void SetPointEYlow(Int_t i, Double_t eyl)
Set EYlow for point i.
Double_t * fEXhigh
[fNpoints] array of X high errors
Double_t GetErrorY(Int_t bin) const override
Returns the combined error along Y at point i by computing the average of the lower and upper varianc...
void FillZero(Int_t begin, Int_t end, Bool_t from_ctor=kTRUE) override
Set zero values for point arrays in the range [begin, end]
virtual void Divide(const TH1 *pass, const TH1 *total, Option_t *opt="cp")
Fill this TGraphAsymmErrors by dividing two 1-dimensional histograms pass/total.
Bool_t CtorAllocate()
Should be called from ctors after fNpoints has been set.
virtual void SetPointError(Double_t exl, Double_t exh, Double_t eyl, Double_t eyh)
Set ex and ey values for point pointed by the mouse.
Double_t GetErrorXhigh(Int_t i) const override
Get high error on X.
Double_t * fEYhigh
[fNpoints] array of Y high errors
Bool_t CopyPoints(Double_t **arrays, Int_t ibegin, Int_t iend, Int_t obegin) override
Copy errors from fE*** to arrays[***] or to f*** Copy points.
void ComputeRange(Double_t &xmin, Double_t &ymin, Double_t &xmax, Double_t &ymax) const override
Compute Range.
virtual void SetPointEXlow(Int_t i, Double_t exl)
Set EXlow for point i.
void Streamer(TBuffer &) override
Stream an object of class TGraphAsymmErrors.
virtual void SetPointEYhigh(Int_t i, Double_t eyh)
Set EYhigh for point i.
void SavePrimitive(std::ostream &out, Option_t *option="") override
Save primitive as a C++ statement(s) on output stream out.
virtual void BayesDivide(const TH1 *pass, const TH1 *total, Option_t *opt="")
This function is only kept for backward compatibility.
Double_t * GetEYhigh() const override
void Print(Option_t *chopt="") const override
Print graph and errors values.
Double_t GetErrorYhigh(Int_t i) const override
Get high error on Y.
Int_t Merge(TCollection *list) override
Adds all graphs with asymmetric errors from the collection to this graph.
Double_t GetErrorXlow(Int_t i) const override
Get low error on X.
Double_t * fEYlow
[fNpoints] array of Y low errors
void SwapPoints(Int_t pos1, Int_t pos2) override
Swap points.
Double_t * GetEXhigh() const override
Double_t * fEXlow
[fNpoints] array of X low errors
void Apply(TF1 *f) override
Apply a function to all data points .
Double_t ** Allocate(Int_t size) override
Allocate internal data structures for size points.
Double_t * GetEYlow() const override
Bool_t DoMerge(const TGraph *g) override
Protected function to perform the merge operation of a graph with asymmetric errors.
void CopyAndRelease(Double_t **newarrays, Int_t ibegin, Int_t iend, Int_t obegin) override
Copy and release.
TClass * IsA() const override
virtual void SetPointEXhigh(Int_t i, Double_t exh)
Set EXhigh for point i.
Double_t GetErrorYlow(Int_t i) const override
Get low error on Y.
Double_t GetErrorX(Int_t bin) const override
Returns the combined error along X at point i by computing the average of the lower and upper varianc...
TGraphAsymmErrors()
TGraphAsymmErrors default constructor.
TGraphAsymmErrors & operator=(const TGraphAsymmErrors &gr)
TGraphAsymmErrors assignment operator.
~TGraphAsymmErrors() override
TGraphAsymmErrors default destructor.
void Scale(Double_t c1=1., Option_t *option="y") override
Multiply the values and errors of a TGraphAsymmErrors by a constant c1.
static Int_t CalculateScanfFields(const char *fmt)
Calculate scan fields.
A TGraph is an object made of two arrays X and Y with npoints each.
Int_t fNpoints
Number of points <= fMaxSize.
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
Int_t fMaxSize
!Current dimension of arrays fX and fY
void SaveHistogramAndFunctions(std::ostream &out, const char *varname, Int_t &frameNumber, Option_t *option)
Save histogram and list of functions of TGraph as C++ statement Used in all TGraph-derived classes.
TH1F * fHistogram
Pointer to histogram used for drawing axis.
Double_t * fY
[fNpoints] array of Y points
Bool_t CtorAllocate()
In constructors set fNpoints than call this method.
TString SaveArray(std::ostream &out, const char *suffix, Int_t frameNumber, Double_t *arr)
Save array as C++ code Returns name of created array.
virtual void ComputeRange(Double_t &xmin, Double_t &ymin, Double_t &xmax, Double_t &ymax) const
Compute the x/y range of the points in this graph.
Double_t ** AllocateArrays(Int_t Narrays, Int_t arraySize)
Allocate arrays.
virtual void Scale(Double_t c1=1., Option_t *option="y")
Multiply the values of a TGraph by a constant c1.
static void SwapValues(Double_t *arr, Int_t pos1, Int_t pos2)
Swap values.
void Streamer(TBuffer &) override
Stream an object of class TGraph.
virtual Bool_t DoMerge(const TGraph *g)
protected function to perform the merge operation of a graph
void SetName(const char *name="") override
Set graph name.
virtual void SwapPoints(Int_t pos1, Int_t pos2)
Swap points.
virtual void FillZero(Int_t begin, Int_t end, Bool_t from_ctor=kTRUE)
Set zero values for point arrays in the range [begin, end) Should be redefined in descendant classes.
Double_t * fX
[fNpoints] array of X points
void SetTitle(const char *title="") override
Change (i.e.
virtual void Set(Int_t n)
Set number of points in the graph Existing coordinates are preserved New coordinates above fNpoints a...
virtual Int_t GetPoint(Int_t i, Double_t &x, Double_t &y) const
Get x and y values for point number i.
virtual Bool_t CopyPoints(Double_t **newarrays, Int_t ibegin, Int_t iend, Int_t obegin)
Copy points from fX and fY to arrays[0] and arrays[1] or to fX and fY if arrays == 0 and ibegin !...
TGraph & operator=(const TGraph &)
Equal operator for this graph.
TH1 is the base class of all histogram classes in ROOT.
virtual Double_t GetBinCenter(Int_t bin) const
Return bin center for 1D histogram.
virtual Int_t GetDimension() const
virtual Int_t GetNcells() const
virtual Int_t GetNbinsX() const
virtual Double_t GetBinLowEdge(Int_t bin) const
Return bin lower edge for 1D histogram.
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
virtual TArrayD * GetSumw2()
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width for 1D histogram.
virtual Double_t GetSumOfWeights() const
Return the sum of weights excluding under/overflows.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
Mother of all ROOT objects.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
void ToLower()
Change string to lower-case.
Int_t Atoi() const
Return integer value of string.
Double_t Atof() const
Return floating-point value contained in string.
Bool_t IsFloat() const
Returns kTRUE if string contains a floating point or integer number.
const char * Data() const
Bool_t IsDigit() const
Returns true if all characters in string are digits (0-9) or white spaces, i.e.
TString & ReplaceAll(const TString &s1, const TString &s2)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
Float_t GetErrorX() const
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
double normal_quantile_c(double z, double sigma)
Inverse ( ) of the cumulative distribution function of the upper tail of the normal (Gaussian) distri...
Int_t Finite(Double_t x)
Check if it is finite with a mask in order to be consistent in presence of fast math.
Double_t Sqrt(Double_t x)
Returns the square root of x.
Short_t Min(Short_t a, Short_t b)
Returns the smallest of a and b.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.