51 namespace HFitInterface {
56 if (func ==0)
return false;
79 void ExamineRange(
const TAxis * axis, std::pair<double,double> range,
int &hxfirst,
int &hxlast) {
82 double xlow = range.first;
83 double xhigh = range.second;
85 std::cout <<
"xlow " << xlow <<
" xhigh = " << xhigh << std::endl;
90 if (ilow > hxlast || ihigh < hxfirst) {
91 Warning(
"ROOT::Fit::FillData",
"fit range is outside histogram range, no fit data for %s",axis->
GetName());
94 hxfirst = std::min( std::max( ilow, hxfirst), hxlast+1) ;
95 hxlast = std::max( std::min( ihigh, hxlast), hxfirst-1) ;
97 if (hxfirst < hxlast) {
142 if (range.
Size(0) != 0) {
144 if (range.
Size(0) > 1 ) {
145 Warning(
"ROOT::Fit::FillData",
"support only one range interval for X coordinate");
151 if (range.
Size(1) > 1 )
152 Warning(
"ROOT::Fit::FillData",
"support only one range interval for Y coordinate");
157 if (range.
Size(2) > 1 )
158 Warning(
"ROOT::Fit::FillData",
"support only one range interval for Z coordinate");
162 int n = (hxlast-hxfirst+1)*(hylast-hyfirst+1)*(hzlast-hzfirst+1);
165 std::cout <<
"THFitInterface: ifirst = " << hxfirst <<
" ilast = " << hxlast
166 <<
" total bins " << n
176 if (func !=0 && func->
GetNdim() == hdim-1) ndim = hdim-1;
194 for ( binx = hxfirst; binx <= hxlast; ++binx) {
203 for ( biny = hyfirst; biny <= hylast; ++biny) {
211 for ( binz = hzfirst; binz <= hzlast; ++binz) {
229 double error = hfit->
GetBinError(binx, biny, binz);
232 if (ndim == hdim -1) {
236 if (hdim == 2) dv.
Add( x, x[1], yaxis->
GetBinWidth(biny) / error );
237 if (hdim == 3) dv.
Add( x, x[2], zaxis->
GetBinWidth(binz) / error );
239 dv.
Add( x, value, error );
247 std::cout <<
"bin " << binx <<
" add point " << x[0] <<
" " << hfit->
GetBinContent(binx) << std::endl;
256 std::cout <<
"THFitInterface::FillData: Hist FitData size is " << dv.
Size() << std::endl;
267 unsigned int n = data.
Size();
274 double valxmax = valxmin;
276 for (
unsigned int i = 1; i <
n; ++ i) {
290 if (valxmin <= 0 && valxmax > 0 ) valxmin = valxmax;
291 else if (valxmax <=0 && valxmin > 0) valxmax = valxmin;
292 else if (valxmin <=0 && valxmax <= 0) { valxmin = 1; valxmax = 1; }
294 double slope =
std::log( valxmax/valxmin) / (xmax -
xmin);
308 static const double sqrtpi = 2.506628;
311 unsigned int n = data.
Size();
317 double rangex = data.
Coords(n-1)[0] - data.
Coords(0)[0];
320 if ( rangex > 0) binwidth = rangex;
322 for (
unsigned int i = 0; i <
n; ++ i) {
328 if (val > valmax) valmax = val;
331 if (dx < binwidth) binwidth = dx;
336 if (allcha <= 0)
return;
337 double mean = sumx/allcha;
338 double rms = sumx2/allcha - mean*mean;
357 double constant = 0.5*(valmax+ binwidth*allcha/(sqrtpi*rms));
378 std::cout <<
"Gaussian initial par values" << constant <<
" " << mean <<
" " << rms << std::endl;
391 static const double sqrtpi = 2.506628;
394 unsigned int n = data.
Size();
396 double sumx = 0, sumy = 0;
397 double sumx2 = 0, sumy2 = 0;
400 double rangex = data.
Coords(n-1)[0] - data.
Coords(0)[0];
401 double rangey = data.
Coords(n-1)[1] - data.
Coords(0)[1];
403 double binwidthx = 1, binwidthy = 1;
404 if ( rangex > 0) binwidthx = rangex;
405 if ( rangey > 0) binwidthy = rangey;
406 double x0 = 0, y0 = 0;
407 for (
unsigned int i = 0; i <
n; ++i) {
409 const double *coords = data.
GetPoint(i,val);
410 double x = coords[0],
y = coords[1];
416 if (val > valmax) valmax = val;
419 if (dx < binwidthx) binwidthx = dx;
421 if (dy < binwidthy) binwidthy = dy;
427 if (allcha <= 0)
return;
428 double meanx = sumx/allcha, meany = sumy/allcha;
429 double rmsx = sumx2/allcha - meanx*meanx;
430 double rmsy = sumy2/allcha - meany*meany;
436 rmsx = binwidthx*n/4;
441 rmsy = binwidthy*n/4;
451 double constant = 0.5 * (valmax+ binwidthx*allcha/(sqrtpi*rmsx))*
452 (valmax+ binwidthy*allcha/(sqrtpi*rmsy));
463 std::cout <<
"2D Gaussian initial par values" 487 if (fitOpt.
fErrors1 || ( ey == 0 && ( eyl == 0 || eyh == 0 ) ) ) {
501 else if ( ( eyl != 0 && eyh != 0) && fitOpt.
fAsymErrors) {
504 bool zeroErrorX =
true;
505 bool zeroErrorY =
true;
506 while (i < gr->GetN() && (zeroErrorX || zeroErrorY)) {
508 double e2Y = eyl[i] + eyh[i];
509 zeroErrorX &= (e2X <= 0);
510 zeroErrorY &= (e2Y <= 0);
513 if (zeroErrorX && zeroErrorY)
515 else if (!zeroErrorX && zeroErrorY)
517 else if (zeroErrorX && !zeroErrorY) {
529 bool zeroError =
true;
530 while (i < gr->GetN() && zeroError) {
531 if (ey[i] > 0) zeroError =
false;;
539 std::cout <<
"type is " << type <<
" graph type is " << gr->IsA()->
GetName() << std::endl;
549 double *ez = gr->
GetEZ();
568 std::cout <<
"type is " << type <<
" graph2D type is " << gr->IsA()->
GetName() << std::endl;
583 int nPoints = gr->
GetN();
584 double *gx = gr->
GetX();
585 double *gy = gr->
GetY();
588 bool useRange = ( range.
Size(0) > 0);
596 std::cout <<
"DoFillData: graph npoints = " << nPoints <<
" type " << type << std::endl;
598 double a1,a2; func->
GetRange(a1,a2); std::cout <<
"func range " << a1 <<
" " << a2 << std::endl;
603 for (
int i = 0; i < nPoints; ++i) {
608 if (useRange && ( x[0] < xmin || x[0] > xmax) )
continue;
620 dv.
Add( gx[i], gy[i] );
629 dv.
Add( gx[i], gy[i], errorY );
632 std::cout <<
"Point " << i <<
" " << gx[i] <<
" " << gy[i] <<
" " << errorY << std::endl;
647 double errorY = std::max(gr->
GetErrorY(i), 0.);
652 if ( errorX <=0 && errorY <= 0 )
continue;
661 dv.
Add( gx[i], gy[i], errorX, errorY );
668 std::cout <<
"TGraphFitInterface::FillData Graph FitData size is " << dv.
Size() << std::endl;
676 std::vector<double> min(dim);
677 std::vector<double> max(dim);
680 for (
int i = 0; i < ncells; ++i ) {
720 std::vector<double> min(dim);
721 std::vector<double> max(dim);
722 std::vector<Int_t> coord(dim);
725 for (
ULong64_t i = 0; i < nEntries; i++ )
728 if ( !value )
continue;
733 bool insertBox =
true;
734 for (
int j = 0; j < dim && insertBox; ++j )
764 std::vector<double>
xmin(ndim);
765 std::vector<double>
xmax(ndim);
766 for (
unsigned int i = 0; i < ndim; ++i ) {
812 if (dv.
Size() > 0 && dv.
NDim() == 1 ) {
815 Error(
"FillData",
"Inconsistent TGraph with previous data set- skip all graph data");
819 Error(
"FillData",
"Inconsistent TGraph with previous data set- skip all graph data");
823 Error(
"FillData",
"Inconsistent TGraph with previous data set- skip all graph data");
827 Error(
"FillData",
"Inconsistent TGraph with previous data set- skip all graph data");
848 std::cout <<
"multi-graph list of graps: " << std::endl;
849 while ((obj = itr())) {
850 std::cout << obj->IsA()->
GetName() << std::endl;
863 while ((gr = (
TGraph*) next())) {
865 if (t > type ) type = t;
874 std::cout <<
"Fitting MultiGraph of type " << type << std::endl;
879 while ((gr = (
TGraph*) next())) {
884 std::cout <<
"TGraphFitInterface::FillData MultiGraph FitData size is " << dv.
Size() << std::endl;
903 int nPoints = gr->
GetN();
904 double *gx = gr->
GetX();
905 double *gy = gr->
GetY();
906 double *gz = gr->
GetZ();
916 bool useRangeX = ( range.Size(0) > 0);
917 bool useRangeY = ( range.Size(1) > 0);
922 range.GetRange(xmin,xmax,ymin,ymax);
926 for (
int i = 0; i < nPoints; ++i) {
932 if (useRangeX && (
x[0] < xmin ||
x[0] > xmax) )
continue;
933 if (useRangeY && (
x[1] < ymin ||
x[1] > ymax) )
continue;
952 dv.
Add(
x, gz[i], errorZ );
957 dv.
Add(
x, gz[i],
ex, errorZ );
963 std::cout <<
"Point " << i <<
" " << gx[i] <<
" " << gy[i] <<
" " << errorZ << std::endl;
969 std::cout <<
"THFitInterface::FillData Graph2D FitData size is " << dv.
Size() << std::endl;
978 Error(
"GetConfidenceIntervals",
"Invalid object used for storing confidence intervals");
985 double * ci = gr->
GetEY();
988 for (
unsigned int ipoint = 0; ipoint < d.
NPoints(); ++ipoint) {
989 const double *
x = d.
Coords(ipoint);
991 gr->
SetPoint(ipoint, x[0], (*func)(x) );
unsigned int Size() const
return number of fit points
Double_t GetBinError(const Int_t *idx) const
virtual const char * GetName() const
Returns name of object.
virtual Int_t GetNcells() const
virtual Double_t GetErrorYhigh(Int_t bin) const
This function is called by GraphFitChisquare.
void Initialize(unsigned int maxpoints, unsigned int dim=1, ErrorType err=kValueError)
preallocate a data set with given size , dimension and error type (to get the full point size) If the...
virtual void SetParameters(const Double_t *params)
virtual Double_t * GetEX() const
Bool_t IsBinUnderflow(Int_t bin, Int_t axis=0) const
Return true if the bin is underflow.
Int_t GetFirst() const
Return first bin on the axis i.e.
virtual Double_t GetErrorZ(Int_t bin) const
This function is called by Graph2DFitChisquare.
virtual Double_t GetErrorY(Int_t bin) const
This function is called by GraphFitChisquare.
This namespace contains pre-defined functions to be used in conjuction with TExecutor::Map and TExecu...
Bool_t IsBinOverflow(Int_t bin, Int_t axis=0) const
Return true if the bin is overflow.
virtual Long64_t GetNbins() const =0
void GetConfidenceIntervals(unsigned int n, unsigned int stride1, unsigned int stride2, const double *x, double *ci, double cl=0.95, bool norm=true) const
get confidence intervals for an array of n points x.
virtual Double_t GetBinLowEdge(Int_t bin) const
Return low edge of bin.
virtual Double_t * GetEYlow() const
virtual Double_t GetBinContent(Int_t bin) const
Return content of bin number bin.
Double_t GetBinContent(const Int_t *idx) const
A TMultiGraph is a collection of TGraph (or derived) objects.
virtual Double_t * GetEY() const
virtual void GetBinXYZ(Int_t binglobal, Int_t &binx, Int_t &biny, Int_t &binz) const
Return binx, biny, binz corresponding to the global bin number globalbin see TH1::GetBin function abo...
unsigned int NPoints() const
return number of fit points
void ExamineRange(const TAxis *axis, std::pair< double, double > range, int &hxfirst, int &hxlast)
const IModelFunction * FittedFunction() const
fitting quantities
void AddBinUpEdge(const double *xup)
add the bin width data, a pointer to an array with the bin upper edge information.
virtual Double_t GetErrorYlow(Int_t bin) const
This function is called by GraphFitChisquare.
bool GetConfidenceIntervals(const TH1 *h1, const ROOT::Fit::FitResult &r, TGraphErrors *gr, double cl=0.95)
compute confidence intervals at level cl for a fitted histogram h1 in a TGraphErrors gr ...
virtual Double_t GetBinUpEdge(Int_t bin) const
Return up edge of bin.
const double * GetPoint(unsigned int ipoint, double &value) const
retrieve at the same time a pointer to the coordinate data and the fit value More efficient than call...
virtual Int_t GetDimension() const
virtual Double_t * GetEY() const
virtual Double_t GetBinCenter(Int_t bin) const
Return center of bin.
bool AdjustError(const DataOptions &option, double &error, double value=1)
virtual Int_t GetNdim() const
virtual Double_t * GetEZ() const
virtual Double_t GetErrorY(Int_t bin) const
This function is called by Graph2DFitChisquare.
void InitGaus(const ROOT::Fit::BinData &data, TF1 *f1)
compute initial parameter for gaussian function given the fit data Set the sigma limits for zero top ...
virtual void SetParLimits(Int_t ipar, Double_t parmin, Double_t parmax)
Set limits for parameter ipar.
virtual Double_t GetErrorXlow(Int_t bin) const
This function is called by GraphFitChisquare.
void FillData(BinData &dv, const TH1 *hist, TF1 *func=0)
fill the data vector from a TH1.
TAxis * GetAxis(Int_t dim) const
BinData::ErrorType GetDataType(const TGraph *gr, DataOptions &fitOpt)
DataOptions : simple structure holding the options on how the data are filled.
Int_t GetLast() const
Return last bin on the axis i.e.
Class to manage histogram axis.
IParamFunction interface (abstract class) describing multi-dimensional parameteric functions It is a ...
void DoFillData(BinData &dv, const TGraph *gr, BinData::ErrorType type, TF1 *func)
unsigned int Size(unsigned int icoord=0) const
return range size for coordinate icoord (starts from zero) Size == 0 indicates no range is present [-...
void GetBinDataIntegral(BinData &) const
const double * Coords(unsigned int ipoint) const
return a pointer to the coordinates data for the given fit point
const DataOptions & Opt() const
access to options
static void RejectPoint(Bool_t reject=kTRUE)
Static function to set the global flag to reject points the fgRejectPoint global flag is tested by al...
Class describing the binned data sets : vectors of x coordinates, y values and optionally error on y ...
unsigned int PointSize() const
return the size of a fit point (is the coordinate dimension + 1 for the value and eventually the numb...
void InitExpo(const ROOT::Fit::BinData &data, TF1 *f1)
compute initial parameter for an exponential function given the fit data Set the constant and slope a...
void Warning(const char *location, const char *msgfmt,...)
virtual Double_t * GetEX() const
class containg the result of the fit and all the related information (fitted parameter values...
class describing the range in the coordinates it supports multiple range in a coordinate.
void Init2DGaus(const ROOT::Fit::BinData &data, TF1 *f1)
compute initial parameter for 2D gaussian function given the fit data Set the sigma limits for zero t...
void Add(double x, double y)
add one dim data with only coordinate and values
TFitResultPtr Fit(FitObject *h1, TF1 *f1, Foption_t &option, const ROOT::Math::MinimizerOptions &moption, const char *goption, ROOT::Fit::DataRange &range)
unsigned long long ULong64_t
double func(double *x, double *p)
void GetRange(unsigned int icoord, double &xmin, double &xmax) const
get the first range for given coordinate.
virtual Double_t GetErrorX(Int_t bin) const
This function is called by Graph2DFitChisquare.
Int_t GetNdimensions() const
Mother of all ROOT objects.
virtual Int_t FindFixBin(Double_t x) const
Find bin number corresponding to abscissa x.
you should not use this method at all Int_t Int_t z
unsigned int NDim() const
return coordinate data dimension
virtual Bool_t IsInside(const Double_t *x) const
return kTRUE if the point is inside the function range
virtual Double_t GetBinWidth(Int_t bin) const
Return bin width.
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Set x and y values for point number i.
TList * GetListOfGraphs() const
static Bool_t RejectedPoint()
See TF1::RejectPoint above.
bool IsPointOutOfRange(const TF1 *func, const double *x)
virtual void GetRange(Double_t *xmin, Double_t *xmax) const
Return range of a generic N-D function.
A Graph is a graphics object made of two arrays X and Y with npoints each.
A TGraphErrors is a TGraph with error bars.
Multidimensional histogram base.
virtual void SetParameter(Int_t param, Double_t value)
const DataRange & Range() const
access to range
virtual Double_t * GetEYhigh() const
const Bool_t kIterBackward
Graphics object made of three arrays X, Y and Z with the same number of points each.
virtual const char * GetName() const
Returns name of object.
virtual void Set(Int_t n)
Set number of points in the graph Existing coordinates are preserved New coordinates above fNpoints a...
virtual Double_t GetErrorXhigh(Int_t bin) const
This function is called by GraphFitChisquare.
void Add(std::vector< double > &min, std::vector< double > &max, const double content, const double error=1.0)
void Error(ErrorHandler_t func, int code, const char *va_(fmt),...)
Write error message and call a handler, if required.
virtual Double_t GetBinError(Int_t bin) const
Return value of error associated to bin number bin.