59using std::endl, std::ostream, std::list, std::vector, std::cout, std::min;
71inline Point getPoint(
TGraph const &
gr,
int i)
99 const RooArgSet *normVars,
double prec,
double resolution,
bool shiftToZero,
WingMode wmode,
100 Int_t nEvalError,
Int_t doEEVal,
double eeVal,
bool showProg)
101 : _showProgress(showProg)
109 if(0 != strlen(
f.getUnit()) || 0 != strlen(
x.getUnit())) {
111 if(0 != strlen(
f.getUnit())) {
115 if(0 != strlen(
x.getUnit())) {
125 std::unique_ptr<RooAbsFunc> funcPtr{scaledFunc.
bindVars(
x, normVars,
true)};
130 std::unique_ptr<std::list<double>> hint{
f.plotSamplingHint(
x,xlo,xhi)};
131 addPoints(*funcPtr,xlo,xhi,xbins+1,prec,resolution,wmode,nEvalError,doEEVal,eeVal,hint.get());
133 ccoutP(Plotting) << endl ;
138 int nBinsX =
x.numBins();
139 for(
int i=0; i<nBinsX; ++i){
140 double xval =
x.getBinning().binCenter(i);
149 for (
int i=0 ; i<
GetN() ; i++) {
165 double xlo,
double xhi,
UInt_t minPoints,
double prec,
double resolution,
170 addPoints(func,xlo,xhi,minPoints+1,prec,resolution,wmode,nEvalError,doEEVal,eeVal);
175 for (
int i=0 ; i<
GetN() ; i++) {
203 std::deque<double> pointList ;
207 for (
int i1=0 ; i1<n1 ; i1++) {
208 pointList.push_back(
c1.GetPointX(i1));
213 for (
int i2=0 ; i2<n2 ; i2++) {
214 pointList.push_back(
c2.GetPointX(i2));
218 std::sort(pointList.begin(),pointList.end()) ;
222 for (
auto point : pointList) {
224 if ((point-last)>1
e-10) {
226 addPoint(point,scale1*
c1.interpolate(point)+scale2*
c2.interpolate(point)) ;
257 double minVal = std::numeric_limits<double>::infinity();
258 double maxVal = -std::numeric_limits<double>::infinity();
261 for (
int i = 1; i <
GetN() - 1; i++) {
263 minVal = std::min(
y, minVal);
264 maxVal = std::max(
y, maxVal);
268 for (
int i = 1; i <
GetN() - 1; i++) {
269 Point point = getPoint(*
this, i);
270 SetPoint(i, point.x, point.y - minVal);
285 Int_t minPoints,
double prec,
double resolution,
WingMode wmode,
286 Int_t numee,
bool doEEVal,
double eeVal, list<double>* samplingHint)
290 coutE(InputArguments) <<
fName <<
"::addPoints: input function is not valid" << endl;
293 if(minPoints <= 0 || xhi <= xlo) {
294 coutE(InputArguments) <<
fName <<
"::addPoints: bad input (nothing added)" << endl;
303 minPoints = samplingHint->size() ;
306 double dx= (xhi-xlo)/(minPoints-1.);
308 std::vector<double> yval(minPoints);
312 std::vector<double> xval;
314 for(
int step= 0; step < minPoints; step++) {
315 xval.push_back(xlo + step*dx) ;
318 std::copy(samplingHint->begin(), samplingHint->end(), std::back_inserter(xval));
321 for (
unsigned int step=0; step < xval.size(); ++step) {
322 double xx = xval[step];
323 if (step ==
static_cast<unsigned int>(minPoints-1))
326 yval[step]= func(&xx);
334 coutW(Plotting) <<
"At observable [x]=" << xx <<
" " ;
344 const double ymax = *std::max_element(yval.begin(), yval.end());
345 const double ymin = *std::min_element(yval.begin(), yval.end());
349 double minDx= resolution*(xhi-xlo);
365 auto iter2 = xval.begin() ;
371 if (iter2==xval.end()) {
379 addRange(func,
x1,
x2,yval[step-1],yval[step],prec*yrangeEst,minDx,numee,doEEVal,eeVal,epsilon);
388 addPoint(xhi+dx,yval[minPoints-1]) ;
403 double y1,
double y2,
double minDy,
double minDx,
404 int numee,
bool doEEVal,
double eeVal,
double epsilon)
407 if (std::abs(
x2-
x1) <= epsilon) {
412 double xmid= 0.5*(
x1+
x2);
413 double ymid= func(&xmid);
421 coutW(Plotting) <<
"At observable [x]=" << xmid <<
" " ;
431 double dy= ymid - 0.5*(
y1+
y2);
432 if((xmid -
x1 >= minDx) && std::abs(dy)>0 && std::abs(dy) >= minDy) {
434 addRange(func,
x1,xmid,
y1,ymid,minDy,minDx,numee,doEEVal,eeVal,epsilon);
435 addRange(func,xmid,
x2,ymid,
y2,minDy,minDx,numee,doEEVal,eeVal,epsilon);
519 os <<
indent <<
"--- RooCurve ---" << endl ;
521 os <<
indent <<
" Contains " <<
n <<
" points" << endl;
522 os <<
indent <<
" Graph points:" << endl;
523 for(
Int_t i= 0; i <
n; i++) {
524 os <<
indent << std::setw(3) << i <<
") x = " <<
fX[i] <<
" , y = " <<
fY[i] << endl;
546 for (
int i=0 ; i<
np ; i++) {
549 Point point = getPoint(hist, i);
552 if (point.x<xstart || point.x>xstop) continue ;
560 double avg =
average(point.x-exl,point.x+exh) ;
564 double pull = (point.y>avg) ? ((point.y-avg)/eyl) : ((point.y-avg)/eyh) ;
571 return chisq.
Sum() / (nbin-nFitParam) ;
583 coutE(InputArguments) <<
"RooCurve::average(" <<
GetName()
584 <<
") invalid range (" << xFirst <<
"," << xLast <<
")" << endl ;
593 Int_t ifirst =
findPoint(xFirst, std::numeric_limits<double>::infinity());
594 Int_t ilast =
findPoint(xLast, std::numeric_limits<double>::infinity());
605 if (ilast < ifirst) {
606 return 0.5*(yFirst+yLast) ;
609 Point firstPt = getPoint(*
this, ifirst);
610 Point lastPt = getPoint(*
this, ilast);
613 double sum = 0.5 * (firstPt.x-xFirst)*(yFirst+firstPt.y);
616 for (
int i=ifirst ; i<ilast ; i++) {
617 Point p1 = getPoint(*
this, i) ;
618 Point p2 = getPoint(*
this, i+1) ;
619 sum += 0.5 * (p2.x-p1.x)*(p1.y+p2.y);
623 sum += 0.5 * (xLast-lastPt.x)*(lastPt.y+yLast);
624 return sum/(xLast-xFirst) ;
635 double delta(std::numeric_limits<double>::max());
638 for (
int i=0 ; i<
n ; i++) {
640 if (std::abs(xvalue-
x)<delta) {
641 delta = std::abs(xvalue-
x) ;
646 return (delta<tolerance)?ibest:-1 ;
662 Point pbest = getPoint(*
this, ibest);
665 if (std::abs(pbest.x-xvalue)<tolerance) {
671 if (pbest.x<xvalue) {
676 Point pother = getPoint(*
this, ibest+1);
677 if (pother.x==pbest.x)
return pbest.y ;
678 retVal = pbest.y + (pother.y-pbest.y)*(xvalue-pbest.x)/(pother.x-pbest.x) ;
685 Point pother = getPoint(*
this, ibest-1);
686 if (pother.x==pbest.x)
return pbest.y ;
687 retVal = pother.y + (pbest.y-pother.y)*(xvalue-pother.x)/(pbest.x-pother.x) ;
709 vector<double> bandLo(
GetN()) ;
710 vector<double> bandHi(
GetN()) ;
711 for (
int i=0 ; i<
GetN() ; i++) {
715 for (
int i=0 ; i<
GetN() ; i++) {
718 for (
int i=
GetN()-1 ; i>=0 ; i--) {
749 vector<double> bandLo(
GetN()) ;
750 vector<double> bandHi(
GetN()) ;
751 for (
int i=0 ; i<
GetN() ; i++) {
755 for (
int i=0 ; i<
GetN() ; i++) {
758 for (
int i=
GetN()-1 ; i>=0 ; i--) {
782 vector<double> y_plus(plusVar.size());
783 vector<double> y_minus(minusVar.size());
785 for (vector<RooCurve*>::const_iterator iter=plusVar.begin() ; iter!=plusVar.end() ; ++iter) {
786 y_plus[j++] = (*iter)->interpolate(
GetX()[i]) ;
789 for (vector<RooCurve*>::const_iterator iter=minusVar.begin() ; iter!=minusVar.end() ; ++iter) {
790 y_minus[j++] = (*iter)->interpolate(
GetX()[i]) ;
792 double y_cen =
GetY()[i] ;
797 for (j=0 ; j<
n ; j++) {
798 F[j] = (y_plus[j]-y_minus[j])/2 ;
802 double sum =
F*(C*
F) ;
804 lo= y_cen + sqrt(
sum) ;
805 hi= y_cen - sqrt(
sum) ;
814 vector<double>
y(variations.size()) ;
816 for (vector<RooCurve*>::const_iterator iter=variations.begin() ; iter!=variations.end() ; ++iter) {
817 y[j++] = (*iter)->interpolate(
GetX()[i]) ;
824 sort(
y.begin(),
y.end()) ;
826 hi =
y[
y.size()-delta] ;
831 for (
unsigned int k=0 ; k<
y.size() ; k++) {
833 sum_ysq +=
y[k]*
y[k] ;
836 sum_ysq /=
y.size() ;
838 double rms = sqrt(sum_ysq - (sum_y*sum_y)) ;
839 lo =
GetY()[i] - Z*rms ;
859 for(
Int_t i= 0; i <
n; i++) {
868 for(
Int_t i= 2; i <
n-2; i++) {
870 double rdy = std::abs(yTest-other.
fY[i])/Yrange ;
873 if(!verbose)
continue;
874 cout <<
"RooCurve::isIdentical[" << std::setw(3) << i <<
"] Y tolerance exceeded (" << std::setprecision(5) << std::setw(10) << rdy <<
">" << tol <<
"),";
875 cout <<
" x,y=(" << std::right << std::setw(10) <<
fX[i] <<
"," << std::setw(10) <<
fY[i] <<
")\tref: y="
876 << std::setw(10) << other.
interpolate(
fX[i], 1.E-15) <<
". [Nearest point from ref: ";
878 std::cout <<
"j=" << j <<
"\tx,y=(" << std::setw(10) << other.
fX[j] <<
"," << std::setw(10) << other.
fY[j] <<
") ]" <<
"\trange=" << Yrange << std::endl;
895 auto hint =
new std::list<double>;
904 hint->push_back(xlo + delta);
905 hint->push_back(xhi - delta);
909 for (
const double x : boundaries) {
910 if (
x - xlo > delta && xhi -
x > delta) {
911 hint->push_back(
x - delta);
912 hint->push_back(
x + delta);
static void indent(ostringstream &buf, int indent_level)
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t SetLineWidth
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 SetLineColor
Option_t Option_t TPoint TPoint const char x2
Option_t Option_t TPoint TPoint const char x1
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char y1
The Kahan summation is a compensated summation algorithm, which significantly reduces numerical error...
Abstract interface for evaluating a real-valued function of one real variable and performing numerica...
Abstract base class for objects that represent a real value that may appear on the left hand side of ...
Abstract base class for objects that represent a real value and implements functionality common to al...
RooFit::OwningPtr< RooAbsFunc > bindVars(const RooArgSet &vars, const RooArgSet *nset=nullptr, bool clipInvalid=false) const
Create an interface adaptor f(vars) that binds us to the specified variables (in arbitrary order).
static Int_t numEvalErrors()
Return the number of logged evaluation errors since the last clearing.
static void printEvalErrors(std::ostream &os=std::cout, Int_t maxPerNode=10000000)
Print all outstanding logged evaluation error on the given ostream.
static void clearEvalErrorLog()
Clear the stack of evaluation error messages.
RooArgSet is a container object that can hold multiple RooAbsArg objects.
One-dimensional graphical representation of a real-valued function.
void addPoints(const RooAbsFunc &func, double xlo, double xhi, Int_t minPoints, double prec, double resolution, WingMode wmode, Int_t numee=0, bool doEEVal=false, double eeVal=0.0, std::list< double > *samplingHint=nullptr)
Add points calculated with the specified function, over the range (xlo,xhi).
void printTitle(std::ostream &os) const override
Print the title of this curve.
void initialize()
Perform initialization that is common to all curves.
double getFitRangeBinW() const override
Get the bin width associated with this plotable object.
static constexpr double relativeXEpsilon()
The distance between two points x1 and x2 relative to the full plot range below which two points are ...
void addRange(const RooAbsFunc &func, double x1, double x2, double y1, double y2, double minDy, double minDx, int numee, bool doEEVal, double eeVal, double epsilon)
Fill the range (x1,x2) with points calculated using func(&x).
void printName(std::ostream &os) const override
Print name of object.
void printMultiline(std::ostream &os, Int_t contents, bool verbose=false, TString indent="") const override
Print the details of this curve.
double interpolate(double x, double tolerance=1e-10) const
Return linearly interpolated value of curve at xvalue.
static std::list< double > * plotSamplingHintForBinBoundaries(std::span< const double > boundaries, double xlo, double xhi)
Returns sampling hints for a histogram with given boundaries.
void printClassName(std::ostream &os) const override
Print the class name of this curve.
RooCurve()
Default constructor.
bool _showProgress
! Show progress indication when adding points
RooCurve * makeErrorBand(const std::vector< RooCurve * > &variations, double Z=1) const
Construct filled RooCurve represented error band that captures alpha% of the variations of the curves...
double chiSquare(const RooHist &hist, int nFitParam) const
Calculate the chi^2/NDOF of this curve with respect to the histogram 'hist' accounting nFitParam floa...
void calcBandInterval(const std::vector< RooCurve * > &variations, Int_t i, double Z, double &lo, double &hi, bool approxGauss) const
double getFitRangeNEvt() const override
Return the number of events associated with the plotable object, it is always 1 for curves.
void shiftCurveToZero()
Find lowest point in curve and move all points in curve so that lowest point will go exactly through ...
void addPoint(double x, double y)
Add a point with the specified coordinates. Update our y-axis limits.
bool isIdentical(const RooCurve &other, double tol=1e-6, bool verbose=true) const
Return true if curve is identical to other curve allowing for given absolute tolerance on each point ...
Int_t findPoint(double value, double tolerance=1e-10) const
Find the nearest point to xvalue.
double average(double lo, double hi) const
Return average curve value in [xFirst,xLast] by integrating curve between points and dividing by xLas...
Graphical representation of binned data based on the TGraphAsymmErrors class.
static constexpr double infinity()
Return internal infinity representation.
void updateYAxisLimits(double y)
void setYAxisLimits(double ymin, double ymax)
void setYAxisLabel(const char *label)
Represents the product of a given set of RooAbsReal objects.
virtual void SetFillColor(Color_t fcolor)
Set the fill area color.
virtual void SetLineWidth(Width_t lwidth)
Set the line width.
virtual void SetLineColor(Color_t lcolor)
Set the line color.
virtual void SetBinLabel(Int_t bin, const char *label)
Set label for bin.
Bool_t IsAlphanumeric() const
const char * GetBinLabel(Int_t bin) const
Return label for bin.
virtual void Set(Int_t nbins, Double_t xmin, Double_t xmax)
Initialize axis with fix bins.
Double_t * GetEXlow() const override
Double_t * GetEYhigh() const override
Double_t * GetEXhigh() const override
Double_t * GetEYlow() const override
A TGraph is an object made of two arrays X and Y with npoints each.
virtual Double_t GetPointX(Int_t i) const
Get x value for point i.
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
Double_t * fY
[fNpoints] array of Y points
virtual void Sort(Bool_t(*greater)(const TGraph *, Int_t, Int_t)=&TGraph::CompareX, Bool_t ascending=kTRUE, Int_t low=0, Int_t high=-1111)
Sorts the points of this TGraph using in-place quicksort (see e.g.
void SetName(const char *name="") override
Set graph name.
TAxis * GetXaxis() const
Get x axis of the graph.
Double_t * fX
[fNpoints] array of X points
virtual Double_t GetPointY(Int_t i) const
Get y value for point i.
void SetTitle(const char *title="") override
Change (i.e.
virtual Int_t GetPoint(Int_t i, Double_t &x, Double_t &y) const
Get x and y values for point number i.
const char * GetName() const override
Returns name of object.
const char * GetTitle() const override
Returns title of object.
virtual const char * ClassName() const
Returns name of class to which the object belongs.
const char * Data() const
TString & Append(const char *cs)
RooConstVar & RooConst(double val)
Double_t Erfc(Double_t x)
Computes the complementary error function erfc(x).
static uint64_t sum(uint64_t i)