BCHistogramFitter Class Reference

A class for fitting histograms with functions. More...

#include <BCHistogramFitter.h>

Inherits BCModel.

Inheritance diagram for BCHistogramFitter:

Inheritance graph
[legend]
Collaboration diagram for BCHistogramFitter:

Collaboration graph
[legend]
List of all members.

Public Member Functions

Member functions (get)
TH1D * GetHistogram ()
TF1 * GetFitFunction ()
TGraph * GetErrorBand ()
TGraph * GetGraphFitFunction ()
Member functions (set)
int SetHistogram (TH1D *hist)
int SetFitFunction (TF1 *func)
void SetFlagIntegration (bool flag)
Member functions (miscellaneous methods)
virtual double LogAPrioriProbability (std::vector< double > parameters)
virtual double LogLikelihood (std::vector< double > parameters)
double FitFunction (std::vector< double > x, std::vector< double > parameters)
int Fit ()
int Fit (TH1D *hist, TF1 *func)
void DrawFit (const char *options="", bool flaglegend=false)
int CalculatePValueFast (std::vector< double > par, double &pvalue)
int CalculatePValueLikelihood (std::vector< double > par, double &pvalue)
int CalculatePValueLeastSquares (std::vector< double > par, double &pvalue, bool weightExpect=true)
double CDF (const std::vector< double > &parameters, int index, bool lower=false)

Private Attributes

TH1D * fHistogram
TF1 * fFitFunction
bool fFlagIntegration
TGraph * fErrorBand
TGraph * fGraphFitFunction

Detailed Description

A class for fitting histograms with functions.

Author:
Daniel Kollar

Kevin Kröninger

Version:
1.0
Date:
11.2008 This class allows fitting of a TH1D histogram using a TF1 function.

Definition at line 34 of file BCHistogramFitter.h.


Constructor & Destructor Documentation

BCHistogramFitter::BCHistogramFitter (  ) 

The default constructor.

Definition at line 30 of file BCHistogramFitter.cxx.

00030                                      :
00031    BCModel("HistogramFitter")
00032 {
00033    fHistogram = 0;
00034    fFitFunction = 0;
00035 
00036    // set default options and values
00037    this -> MCMCSetNIterationsRun(2000);
00038    this -> SetFillErrorBand();
00039    fFlagIntegration = true;
00040    flag_discrete = true;
00041 }

BCHistogramFitter::BCHistogramFitter ( TH1D *  hist,
TF1 *  func 
)

A constructor.

Parameters:
hist The histogram (TH1D).
func The fit function.

Definition at line 45 of file BCHistogramFitter.cxx.

00045                                                             :
00046    BCModel("HistogramFitter")
00047 {
00048    fHistogram = 0;
00049    fFitFunction = 0;
00050 
00051    this -> SetHistogram(hist);
00052    this -> SetFitFunction(func);
00053 
00054    this -> MCMCSetNIterationsRun(2000);
00055    this -> SetFillErrorBand();
00056    fFlagIntegration = true;
00057    flag_discrete = true;
00058 }

BCHistogramFitter::~BCHistogramFitter (  ) 

The default destructor.

Definition at line 153 of file BCHistogramFitter.cxx.

00154 {
00155 }

BCHistogramFitter::BCHistogramFitter (  ) 

The default constructor.

Definition at line 30 of file BCHistogramFitter.cxx.

00030                                      :
00031    BCModel("HistogramFitter")
00032 {
00033    fHistogram = 0;
00034    fFitFunction = 0;
00035 
00036    // set default options and values
00037    this -> MCMCSetNIterationsRun(2000);
00038    this -> SetFillErrorBand();
00039    fFlagIntegration = true;
00040    flag_discrete = true;
00041 }

BCHistogramFitter::BCHistogramFitter ( TH1D *  hist,
TF1 *  func 
)

A constructor.

Parameters:
hist The histogram (TH1D).
func The fit function.

Definition at line 45 of file BCHistogramFitter.cxx.

00045                                                             :
00046    BCModel("HistogramFitter")
00047 {
00048    fHistogram = 0;
00049    fFitFunction = 0;
00050 
00051    this -> SetHistogram(hist);
00052    this -> SetFitFunction(func);
00053 
00054    this -> MCMCSetNIterationsRun(2000);
00055    this -> SetFillErrorBand();
00056    fFlagIntegration = true;
00057    flag_discrete = true;
00058 }

BCHistogramFitter::~BCHistogramFitter (  ) 

The default destructor.

Definition at line 153 of file BCHistogramFitter.cxx.

00154 {
00155 }


Member Function Documentation

TH1D* BCHistogramFitter::GetHistogram (  )  [inline]

Returns:
The histogram

Definition at line 62 of file BCHistogramFitter.h.

00063          { return fHistogram; };

TF1* BCHistogramFitter::GetFitFunction (  )  [inline]

Returns:
The fit function

Definition at line 67 of file BCHistogramFitter.h.

00068          { return fFitFunction; };

TGraph* BCHistogramFitter::GetErrorBand (  )  [inline]

Returns:
pointer to the error band

Definition at line 72 of file BCHistogramFitter.h.

00073          { return fErrorBand; };

TGraph* BCHistogramFitter::GetGraphFitFunction (  )  [inline]

Returns:
pointer to a graph for the fit function

Definition at line 77 of file BCHistogramFitter.h.

00078          { return fGraphFitFunction; };

int BCHistogramFitter::SetHistogram ( TH1D *  hist  ) 

Parameters:
hist The histogram @ return An error code (1:pass, 0:fail).

Definition at line 62 of file BCHistogramFitter.cxx.

00063 {
00064    // check if histogram exists
00065    if (!hist) {
00066       BCLog::Out(BCLog::error, BCLog::error,
00067             "BCHistogramFitter::SetHistogram() : TH1D not created.");
00068       return 0;
00069    }
00070 
00071    // set pointer to histogram
00072    fHistogram = hist;
00073 
00074    // create a data set. this is necessary in order to calculate the
00075    // error band. the data set contains as many data points as there
00076    // are bins. for now, the data points are empty.
00077    BCDataSet * ds = new BCDataSet();
00078 
00079    // create data points and add them to the data set.
00080    int nbins = fHistogram -> GetNbinsX();
00081    for (int i = 0; i < nbins; ++i) {
00082       BCDataPoint* dp = new BCDataPoint(2);
00083       ds -> AddDataPoint(dp);
00084    }
00085 
00086    // set the new data set.
00087    this -> SetDataSet(ds);
00088 
00089    // calculate the lower and upper edge in x.
00090    double xmin = hist -> GetBinLowEdge(1);
00091    double xmax = hist -> GetBinLowEdge(nbins + 1);
00092 
00093    // calculate the minimum and maximum range in y.
00094    double histymin = hist -> GetMinimum();
00095    double histymax = hist -> GetMaximum();
00096 
00097    // calculate the minimum and maximum of the function value based on
00098    // the minimum and maximum value in y.
00099    double ymin = TMath::Max(0., histymin - 5. * sqrt(histymin));
00100    double ymax = histymax + 5. * sqrt(histymax);
00101 
00102    // set the data boundaries for x and y values.
00103    this -> SetDataBoundaries(0, xmin, xmax);
00104    this -> SetDataBoundaries(1, ymin, ymax);
00105 
00106    // set the indeces for fitting.
00107    this -> SetFitFunctionIndices(0, 1);
00108 
00109    // no error
00110    return 1;
00111 }

int BCHistogramFitter::SetFitFunction ( TF1 *  func  ) 

Parameters:
func The fit function @ return An error code (1:pass, 0:fail).

Definition at line 115 of file BCHistogramFitter.cxx.

00116 {
00117    // check if function exists
00118    if (!func) {
00119       BCLog::Out(BCLog::error, BCLog::error,
00120             "BCHistogramFitter::SetFitFunction() : TF1 not created.");
00121       return 0;
00122    }
00123 
00124    // set the function
00125    fFitFunction = func;
00126 
00127    // update the model name to contain the function name
00128    this -> SetName(TString::Format("HistogramFitter with %s",
00129          fFitFunction->GetName()));
00130 
00131    // reset parameters
00132    fParameterSet -> clear();
00133 
00134    // get the new number of parameters
00135    int n = func -> GetNpar();
00136 
00137    // add parameters
00138    for (int i = 0; i < n; ++i) {
00139       double xmin;
00140       double xmax;
00141 
00142       func -> GetParLimits(i, xmin, xmax);
00143 
00144       this -> AddParameter(func->GetParName(i), xmin, xmax);
00145    }
00146 
00147    // no error
00148    return 1;
00149 }

void BCHistogramFitter::SetFlagIntegration ( bool  flag  )  [inline]

Sets the flag for integration.
true: use ROOT's TH1D::Integrate()
false: use linear interpolation

Definition at line 101 of file BCHistogramFitter.h.

00102          { fFlagIntegration = flag; };

double BCHistogramFitter::LogAPrioriProbability ( std::vector< double >  parameters  )  [virtual]

The log of the prior probability. Overloaded from BCModel.

Parameters:
parameters A vector of doubles containing the parameter values.

Reimplemented from BCModel.

Definition at line 159 of file BCHistogramFitter.cxx.

00160 {
00161    // using flat probability in all parameters
00162    double logprob = 0.;
00163    for (unsigned int i = 0; i < this -> GetNParameters(); i++)
00164       logprob -= log(this -> GetParameter(i) -> GetRangeWidth());
00165 
00166    return logprob;
00167 }

double BCHistogramFitter::LogLikelihood ( std::vector< double >  parameters  )  [virtual]

The log of the conditional probability. Overloaded from BCModel.

Parameters:
parameters A vector of doubles containing the parameter values.

Reimplemented from BCModel.

Definition at line 171 of file BCHistogramFitter.cxx.

00172 {
00173    // initialize probability
00174    double loglikelihood = 0;
00175 
00176    // set the parameters of the function
00177    fFitFunction -> SetParameters(&params[0]);
00178 
00179    // get the number of bins
00180    int nbins = fHistogram -> GetNbinsX();
00181 
00182    // get bin width
00183    double dx = fHistogram -> GetBinWidth(1);
00184 
00185    // get function value of lower bin edge
00186    double fedgelow = fFitFunction -> Eval(fHistogram -> GetBinLowEdge(1));
00187 
00188    // loop over all bins
00189    for (int ibin = 1; ibin <= nbins; ++ibin) {
00190       // get upper bin edge
00191       double xedgehi = fHistogram -> GetBinLowEdge(ibin) + dx;
00192 
00193       // get function value at upper bin edge
00194       double fedgehi = fFitFunction -> Eval(xedgehi);
00195 
00196       // get the number of observed events
00197       double y = fHistogram -> GetBinContent(ibin);
00198 
00199       double yexp = 0.;
00200 
00201       // use ROOT's TH1D::Integral method
00202       if (fFlagIntegration)
00203          yexp = fFitFunction -> Integral(xedgehi - dx, xedgehi);
00204 
00205       // use linear interpolation
00206       else {
00207          yexp = fedgelow * dx + (fedgehi - fedgelow) * dx / 2.;
00208 
00209          // make the upper edge the lower edge for the next iteration
00210          fedgelow = fedgehi;
00211       }
00212 
00213       // get the value of the Poisson distribution
00214       loglikelihood += BCMath::LogPoisson(y, yexp);
00215    }
00216 
00217    // // get bin boundaries
00218    // double xmin = fHistogram -> GetBinLowEdge(ibin);
00219    // double xmax = fHistogram -> GetBinLowEdge(ibin+1);
00220 
00221    // // get the number of observed events
00222    // double y = fHistogram -> GetBinContent(ibin);
00223 
00224    // // get the number of expected events
00225    // double yexp = fFitFunction -> Integral(xmin, xmax);
00226 
00227    // // get the value of the Poisson distribution
00228    // loglikelihood += BCMath::LogPoisson(y, yexp);
00229 
00230    return loglikelihood;
00231 }

double BCHistogramFitter::FitFunction ( std::vector< double >  x,
std::vector< double >  parameters 
) [virtual]

Returns the y-value of the 1-dimensional fit function at an x and for a set of parameters.

Parameters:
x A vector with the x-value.
parameters A set of parameters.

Reimplemented from BCIntegrate.

Definition at line 235 of file BCHistogramFitter.cxx.

00237 {
00238    // set the parameters of the function
00239    fFitFunction -> SetParameters(&params[0]);
00240 
00241    return fFitFunction -> Eval(x[0]) * fHistogram -> GetBinWidth(
00242          fHistogram -> FindBin(x[0]));
00243 }

int BCHistogramFitter::Fit (  )  [inline]

Performs the fit.

Returns:
An error code.

Definition at line 138 of file BCHistogramFitter.h.

00139          { return this -> Fit(fHistogram, fFitFunction); };

int BCHistogramFitter::Fit ( TH1D *  hist,
TF1 *  func 
)

Performs the fit.

Parameters:
hist The histogram (TH1D).
func The fit function.
Returns:
An error code.

Definition at line 247 of file BCHistogramFitter.cxx.

00248 {
00249    // set histogram
00250    if (hist)
00251       this -> SetHistogram(hist);
00252    else {
00253       BCLog::Out(BCLog::warning, BCLog::warning,
00254             "BCHistogramFitter::Fit() : Histogram not defined.");
00255       return 0;
00256    }
00257 
00258    // set function
00259    if (func)
00260       this -> SetFitFunction(func);
00261    else {
00262       BCLog::Out(BCLog::warning, BCLog::warning,
00263             "BCHistogramFitter::Fit() : Fit function not defined.");
00264       return 0;
00265    }
00266 
00267    // perform marginalization
00268    this -> MarginalizeAll();
00269 
00270    // maximize posterior probability, using the best-fit values close
00271    // to the global maximum from the MCMC
00272    this -> FindModeMinuit(this -> GetBestFitParameters(), -1);
00273 
00274    // calculate the p-value using the fast MCMC algorithm
00275    double pvalue;
00276    if (this -> CalculatePValueFast(this -> GetBestFitParameters(), pvalue))
00277       fPValue = pvalue;
00278    else
00279       BCLog::Out(BCLog::warning, BCLog::warning,
00280             "BCHistogramFitter::Fit() : Could not use the fast p-value evaluation.");
00281 
00282    // print summary to screen
00283    this -> PrintShortFitSummary();
00284 
00285    // no error
00286    return 1;
00287 }

void BCHistogramFitter::DrawFit ( const char *  options = "",
bool  flaglegend = false 
)

Draw the fit in the current pad.

Definition at line 291 of file BCHistogramFitter.cxx.

00292 {
00293    if (!fHistogram) {
00294       BCLog::Out(BCLog::warning, BCLog::warning,
00295             "BCHistogramFitter::DrawFit() : Histogram not defined.");
00296       return;
00297    }
00298 
00299    if (!fFitFunction) {
00300       BCLog::Out(BCLog::warning, BCLog::warning,
00301             "BCHistogramFitter::DrawFit() : Fit function not defined.");
00302       return;
00303    }
00304 
00305    // check wheather options contain "same"
00306    TString opt = options;
00307    opt.ToLower();
00308 
00309    // if not same, draw the histogram first to get the axes
00310    if (!opt.Contains("same"))
00311       fHistogram -> Draw(opt.Data());
00312 
00313    // draw the error band as central 68% probability interval
00314    fErrorBand = this -> GetErrorBandGraph(0.16, 0.84);
00315    fErrorBand -> Draw("f same");
00316 
00317    // now draw the histogram again since it was covered by the band
00318    fHistogram -> Draw(TString::Format("%ssame", opt.Data()));
00319 
00320    // draw the fit function on top
00321    fGraphFitFunction
00322          = this -> GetFitFunctionGraph(this->GetBestFitParameters());
00323    fGraphFitFunction -> SetLineColor(kRed);
00324    fGraphFitFunction -> SetLineWidth(2);
00325    fGraphFitFunction -> Draw("l same");
00326 
00327    // draw legend
00328    if (flaglegend) {
00329       TLegend * legend = new TLegend(0.25, 0.75, 0.55, 0.95);
00330       legend -> SetBorderSize(0);
00331       legend -> SetFillColor(kWhite);
00332       legend -> AddEntry(fHistogram, "Data", "L");
00333       legend -> AddEntry(fGraphFitFunction, "Best fit", "L");
00334       legend -> AddEntry(fErrorBand, "Error band", "F");
00335       legend -> Draw();
00336    }
00337 
00338    gPad -> RedrawAxis();
00339 }

int BCHistogramFitter::CalculatePValueFast ( std::vector< double >  par,
double &  pvalue 
)

Calculate the p-value using fast-MCMC.

Parameters:
par A set of parameter values
pvalue The pvalue
Returns:
An error code

Definition at line 342 of file BCHistogramFitter.cxx.

00344 {
00345    // check size of parameter vector
00346    if (par.size() != this -> GetNParameters()) {
00347       BCLog::Out(
00348             BCLog::warning,
00349             BCLog::warning,
00350             "BCHistogramFitter::CalculatePValueFast() : Number of parameters is inconsistent.");
00351       return 0;
00352    }
00353 
00354    // check if histogram exists
00355    if (!fHistogram) {
00356       BCLog::Out(BCLog::warning, BCLog::warning,
00357             "BCHistogramFitter::CalculatePValueFast() : Histogram not defined.");
00358       return 0;
00359    }
00360 
00361    // define temporary variables
00362    int nbins = fHistogram -> GetNbinsX();
00363 
00364    std::vector<int> histogram;
00365    std::vector<double> expectation;
00366    histogram.assign(nbins, 0);
00367    expectation.assign(nbins, 0);
00368 
00369    double logp = 0;
00370    double logp_start = 0;
00371    int counter_pvalue = 0;
00372 
00373    // define starting distribution
00374    for (int ibin = 0; ibin < nbins; ++ibin) {
00375       // get bin boundaries
00376       double xmin = fHistogram -> GetBinLowEdge(ibin + 1);
00377       double xmax = fHistogram -> GetBinLowEdge(ibin + 2);
00378 
00379       // get the number of expected events
00380       double yexp = fFitFunction -> Integral(xmin, xmax);
00381 
00382       histogram[ibin] = int(yexp);
00383       expectation[ibin] = yexp;
00384 
00385       // calculate p;
00386       logp += BCMath::LogPoisson(double(int(yexp)), yexp);
00387       logp_start += BCMath::LogPoisson(fHistogram -> GetBinContent(ibin + 1),
00388             yexp);
00389    }
00390 
00391    int niter = 100000;
00392 
00393    // loop over iterations
00394    for (int iiter = 0; iiter < niter; ++iiter) {
00395       // loop over bins
00396       for (int ibin = 0; ibin < nbins; ++ibin) {
00397          // random step up or down in statistics for this bin
00398          double ptest = fRandom -> Rndm() - 0.5;
00399 
00400          // increase statistics by 1
00401          if (ptest > 0) {
00402             // calculate factor of probability
00403             double r = expectation.at(ibin) / double(histogram.at(ibin) + 1);
00404 
00405             // walk, or don't (this is the Metropolis part)
00406             if (fRandom -> Rndm() < r) {
00407                histogram[ibin] = histogram.at(ibin) + 1;
00408                logp += log(r);
00409             }
00410          }
00411 
00412          // decrease statistics by 1
00413          else if (ptest <= 0 && histogram[ibin] > 0) {
00414             // calculate factor of probability
00415             double r = double(histogram.at(ibin)) / expectation.at(ibin);
00416 
00417             // walk, or don't (this is the Metropolis part)
00418             if (fRandom -> Rndm() < r) {
00419                histogram[ibin] = histogram.at(ibin) - 1;
00420                logp += log(r);
00421             }
00422          }
00423          // debugKK
00424          //   std::cout << " negative " << std::endl;
00425 
00426       } // end of looping over bins
00427 
00428       // increase counter
00429       if (logp < logp_start)
00430          counter_pvalue++;
00431 
00432    } // end of looping over iterations
00433 
00434    // calculate p-value
00435    pvalue = double(counter_pvalue) / double(niter);
00436 
00437    // no error
00438    return 1;
00439 }

int BCHistogramFitter::CalculatePValueLikelihood ( std::vector< double >  par,
double &  pvalue 
)

Calculate the p-value using approximate chi^2 distribution of scaled likelihood. Approximation is valid for bin contents >5, see eq. (32.12), PDG: Statistics, Monte Carlo, Group Theory. Physics Letters B 667, 316-339(2008).

Parameters:
par The set of parameter values used in the model, usually the best fit parameters
pvalue The pvalue
Returns:
An error code

Definition at line 441 of file BCHistogramFitter.cxx.

00443 {
00444    // initialize test statistic -2*lambda
00445    double logLambda = 0.0;
00446 
00447    // set the parameters of the function
00448    fFitFunction -> SetParameters(&par[0]);
00449 
00450    // get the number of bins
00451    int nbins = fHistogram -> GetNbinsX();
00452 
00453    // get bin width
00454    double dx = fHistogram -> GetBinWidth(1);
00455 
00456    // get function value of lower bin edge
00457    double fedgelow = fFitFunction -> Eval(fHistogram -> GetBinLowEdge(1));
00458 
00459    // loop over all bins, skip underflow
00460    for (int ibin = 1; ibin <= nbins; ++ibin) {
00461       // get upper bin edge
00462       double xedgehi = fHistogram -> GetBinLowEdge(ibin) + dx;
00463 
00464       // get function value at upper bin edge
00465       double fedgehi = fFitFunction -> Eval(xedgehi);
00466 
00467       // get the number of observed events
00468       double y = fHistogram -> GetBinContent(ibin);
00469 
00470       double yexp = 0.;
00471 
00472       // use ROOT's TH1D::Integral method
00473       if (fFlagIntegration)
00474          yexp = fFitFunction -> Integral(xedgehi - dx, xedgehi);
00475 
00476       // use linear interpolation
00477       else {
00478          yexp = fedgelow * dx + (fedgehi - fedgelow) * dx / 2.;
00479 
00480          // make the upper edge the lower edge for the next iteration
00481          fedgelow = fedgehi;
00482       }
00483 
00484       // get the contribution from this datapoint
00485       if (y == 0)
00486          logLambda += yexp;
00487       else
00488          logLambda += yexp - y + y * log(y / yexp);
00489    }
00490 
00491    // rescale
00492    logLambda *= 2.0;
00493 
00494    // compute degrees of freedom for Poisson case
00495    int nDoF = this->GetNDataPoints() - this->GetNParameters();
00496 
00497    //p value from chi^2 distribution, returns zero if logLambda < 0
00498    fPValueNDoF = TMath::Prob(logLambda, nDoF);
00499    pvalue = fPValueNDoF;
00500 
00501    // no error
00502    return 1;
00503 }

int BCHistogramFitter::CalculatePValueLeastSquares ( std::vector< double >  par,
double &  pvalue,
bool  weightExpect = true 
)

Calculate the p-value using approximate chi^2 distribution of squared difference for conventional weights. Approximation is valid for bin contents >5 and not as as good for little data as CalculatePValueLikelihood, see eq. (32.13), PDG: Statistics, Monte Carlo, Group Theory. Physics Letters B 667, 316-339(2008).

Parameters:
par The set of parameter values used in the model, usually the best fit parameters
pvalue The pvalue
weight use the variance from the expected counts (true) or the measured counts (false)
Returns:
An error code

Definition at line 505 of file BCHistogramFitter.cxx.

00507 {
00508    // initialize test statistic chi^2
00509    double chi2 = 0.0;
00510 
00511    // set the parameters of the function
00512    fFitFunction -> SetParameters(&par[0]);
00513 
00514    // get the number of bins
00515    int nbins = fHistogram -> GetNbinsX();
00516 
00517    // get bin width
00518    double dx = fHistogram -> GetBinWidth(1);
00519 
00520    // get function value of lower bin edge
00521    double fedgelow = fFitFunction -> Eval(fHistogram -> GetBinLowEdge(1));
00522 
00523    // loop over all bins, skip underflow
00524    for (int ibin = 1; ibin <= nbins; ++ibin) {
00525       // get upper bin edge
00526       double xedgehi = fHistogram -> GetBinLowEdge(ibin) + dx;
00527 
00528       // get function value at upper bin edge
00529       double fedgehi = fFitFunction -> Eval(xedgehi);
00530 
00531       // get the number of observed events
00532       double y = fHistogram -> GetBinContent(ibin);
00533 
00534       double yexp = 0.;
00535 
00536       // use ROOT's TH1D::Integral method
00537       if (fFlagIntegration)
00538          yexp = fFitFunction -> Integral(xedgehi - dx, xedgehi);
00539 
00540       // use linear interpolation
00541       else {
00542          yexp = fedgelow * dx + (fedgehi - fedgelow) * dx / 2.;
00543 
00544          // make the upper edge the lower edge for the next iteration
00545          fedgelow = fedgehi;
00546       }
00547 
00548       //convert 1/0.0 into 1 for weighted sum
00549       double weight;
00550       if (weightExpect)
00551          weight = (yexp > 0) ? yexp : 1.0;
00552       else
00553          weight = (y > 0) ? y : 1.0;
00554 
00555       // get the contribution from this datapoint
00556       chi2 += (y - yexp) * (y - yexp) / weight;
00557    }
00558 
00559    // compute degrees of freedom for Poisson case
00560    int nDoF = this->GetNDataPoints() - this->GetNParameters();
00561 
00562    // p value from chi^2 distribution, returns zero if logLambda < 0
00563    fPValueNDoF = TMath::Prob(chi2, nDoF);
00564    pvalue = fPValueNDoF;
00565 
00566    // no error
00567    return 1;
00568 }

double BCHistogramFitter::CDF ( const std::vector< double > &  parameters,
int  index,
bool  lower = false 
) [virtual]

1dim cumulative distribution function of the probability to get the data f(x|param) for a single measurement, assumed to be identical for all measurements

Parameters:
parameters The parameter values at which point to compute the cdf
index The data point index starting at 0,1...N-1
lower only needed for discrete distributions! Return the CDF for the count one less than actually observed, e.g. in Poisson process, if 3 actually observed, then CDF(2) is returned

Reimplemented from BCModel.

Definition at line 570 of file BCHistogramFitter.cxx.

00572 {
00573 
00574    if (parameters.empty())
00575       BCLog::OutWarning("BCHistogramFitter::CDF: parameter vector empty!");
00576    //histogram stores underflow in bin 0, so datapoint 0 is in bin 1
00577    index++;
00578 
00579    // get the number of observed events (should be integer)
00580    double yObs = fHistogram -> GetBinContent(index);
00581 
00582    // if(double( (unsigned int)yObs)==yObs)
00583    //    BCLog::OutWarning(Form(
00584    //          "BCHistogramFitter::CDF: using bin count %f that  is not an integer!",yObs));
00585 
00586    // get function value of lower bin edge
00587    double edgeLow = fHistogram -> GetBinLowEdge(index);
00588    double edgeHigh = edgeLow + fHistogram -> GetBinWidth(index);
00589 
00590    // expectation value of this bin
00591    double yExp = 0.0;
00592 
00593    // use ROOT's TH1D::Integral method
00594    if (fFlagIntegration)
00595       yExp = fFitFunction -> Integral(edgeLow, edgeHigh, &parameters[0]);
00596 
00597    // use linear interpolation
00598    else {
00599       double dx = fHistogram -> GetBinWidth(index);
00600       double fEdgeLow = fFitFunction -> Eval(edgeLow);
00601       double fEdgeHigh = fFitFunction -> Eval(edgeHigh);
00602       yExp = fEdgeLow * dx + (fEdgeHigh - fEdgeLow) * dx / 2.;
00603    }
00604 
00605    // usually Poisson bins do not agree with fixed probability bins
00606    // so choose where it should belong
00607 
00608    if (lower) {
00609       if ((int) yObs >= 1)
00610          return ROOT::Math::poisson_cdf((unsigned int) (yObs - 1), yExp);
00611       else
00612          return 0.0;
00613    }
00614    // what if yObs as double doesn't reprepsent a whole number? exceptioN?
00615    if ((double) (unsigned int) yObs != yObs){
00616       BCLog::OutWarning(Form(
00617             "BCHistogramFitter::CDF: Histogram values should be integer!\n"
00618                " Bin %d = %f", index, yObs));
00619 
00620       //convert randomly to integer
00621       // ex. yObs = 9.785 =>
00622 //      yObs --> 10 with P = 78.5%
00623 //      yObs --> 9  with P = 21.5%
00624       double U = fRandom -> Rndm() ;
00625       double yObsLower = (unsigned int)yObs;
00626       if( U > (yObs - yObsLower) )
00627          yObs = yObsLower;
00628       else
00629          yObs = yObsLower + 1;
00630    }
00631 
00632 // BCLog::OutDebug(Form("yExp= %f yObs= %f par2=%",yExp, yObs,parameters.at(2)));
00633 // BCLog::Out(TString::Format("yExp= %f yObs= %f par2=%",yExp, yObs,parameters.at(2)));
00634 
00635 return ROOT::Math::poisson_cdf(yObs, yExp);
00636 }


Member Data Documentation

TH1D* BCHistogramFitter::fHistogram [private]

The histogram containing the data.

Definition at line 189 of file BCHistogramFitter.h.

TF1* BCHistogramFitter::fFitFunction [private]

The fit function

Definition at line 193 of file BCHistogramFitter.h.

bool BCHistogramFitter::fFlagIntegration [private]

Flag for using the ROOT TH1D::Integral method (true), or linear interpolation (false)

Definition at line 198 of file BCHistogramFitter.h.

TGraph* BCHistogramFitter::fErrorBand [private]

Pointer to the error band (for legend)

Definition at line 202 of file BCHistogramFitter.h.

TGraph* BCHistogramFitter::fGraphFitFunction [private]

Pointer to a graph for displaying the fit function

Definition at line 206 of file BCHistogramFitter.h.


The documentation for this class was generated from the following files:
Generated on Thu Feb 11 11:29:35 2010 for BayesianAnalysisToolkit by  doxygen 1.5.1