A class for fitting several templates to a data set. More...
#include <BCTemplateFitter.h>
Public Member Functions | |
int | AddSystError (const char *errorname, const char *errtype="gauss") |
int | AddTemplate (TH1D hist, const char *name, double Nmin=0, double Nmax=0) |
BCTemplateFitter () | |
BCTemplateFitter (const char *name) | |
double | CalculateChi2 () |
double | CalculateChi2Prob () |
double | CalculateKSProb () |
double | CalculateMaxLike () |
double | CalculatePValue () |
int | CalculateRatio (int index, std::vector< int > indices, double rmin=-1.0, double rmax=1.0) |
TH1D | CombineUncertainties (const char *name) |
int | CompareHistogramProperties (TH1D hist1, TH1D hist2) |
int | ConstrainSum (std::vector< int > indices, double mean, double rms) |
TH1D | CreateErrorHist (TH1D hist, TH1D histerr) |
TH1D | GetData () |
TH1D | GetHistRatio1D (int index) |
std::vector< TH1D > | GetHistRatios1D () |
int | GetIndexSystError (const char *name) |
int | GetIndexTemplate (const char *name) |
int | GetNDF () |
int | GetNRatios () |
int | GetNSystErrors () |
int | GetNTemplates () |
int | GetParIndexEff (const char *name) |
int | GetParIndexSystError (const char *name) |
int | GetParIndexTemplate (const char *name) |
int | GetParIndexTemplate (int index) |
int | Initialize () |
double | LogAPrioriProbability (std::vector< double > parameters) |
double | LogLikelihood (std::vector< double > parameters) |
void | MCMCUserIterationInterface () |
int | PerformFit () |
void | PrintRatios (const char *filename="ratio.ps", int option=0, double ovalue=0.) |
void | PrintStack (const char *filename="stack.ps", const char *options="LE2E0D") |
void | PrintTemp () |
int | PrintTemplate (const char *name, const char *filename) |
int | SetData (const TH1D &hist) |
void | SetFlagFixNorm (bool flag) |
void | SetFlagPhysicalLimits (bool flag) |
void | SetNorm (double norm) |
int | SetTemplateEfficiency (const char *name, TH1D eff, TH1D efferr) |
int | SetTemplateEfficiency (const char *name, double effmean=1., double effsigma=0.) |
int | SetTemplatePrior (const char *name, TH1D prior) |
int | SetTemplatePrior (const char *name, double mean, double sigma) |
int | SetTemplateSystError (const char *errorname, const char *templatename, TH1D parerror) |
~BCTemplateFitter () | |
Protected Attributes | |
std::vector< std::vector< int > > | fConstraintSumIndices |
std::vector< double > | fConstraintSumMean |
std::vector< double > | fConstraintSumRMS |
std::vector< TH1D > | fEffErrHistogramContainer |
std::vector< TH1D > | fEffHistogramContainer |
std::vector< int > | fEffParIndexContainer |
bool | fFlagFixNorm |
bool | fFlagPhysicalLimits |
TH1D | fHistData |
TH1D | fHistNorm |
std::vector< TH1D > | fHistRatios1D |
std::vector< std::vector< int > > | fIndicesRatios1D |
int | fNBins |
double | fNorm |
std::vector< TH1D > | fPriorContainer |
int | fPriorNBins |
std::vector< std::vector< TH1D > > | fSystErrorHistogramContainer |
std::vector< std::string > | fSystErrorNameContainer |
std::vector< int > | fSystErrorParIndexContainer |
std::vector< std::string > | fSystErrorTypeContainer |
std::vector< TH1D > | fTemplateHistogramContainer |
std::vector< std::string > | fTemplateNameContainer |
std::vector< int > | fTemplateParIndexContainer |
TH2D * | fUncertaintyHistogramExp |
TH2D * | fUncertaintyHistogramObsPosterior |
double | fXmax |
double | fXmin |
A class for fitting several templates to a data set.
This class can be used for fitting several template histograms to a data histogram. The templates are assumed to have no statistical uncertainty whereas the data are assumed to have Poissonian fluctuations in each bin. Several methods to judge the validity of the model are available.
Definition at line 34 of file BCTemplateFitter.h.
BCTemplateFitter::BCTemplateFitter | ( | ) |
The default constructor.
Definition at line 23 of file BCTemplateFitter.cxx.
: BCModel() , fFlagFixNorm(false) , fFlagPhysicalLimits(true) , fUncertaintyHistogramExp(0) , fUncertaintyHistogramObsPosterior(0) , fNorm(-1) , fNBins(-1) , fXmin(1.) , fXmax(0.) , fPriorNBins(1000) { }
BCTemplateFitter::BCTemplateFitter | ( | const char * | name | ) |
A constructor.
Definition at line 38 of file BCTemplateFitter.cxx.
: BCModel(name) , fFlagFixNorm(false) , fFlagPhysicalLimits(true) , fUncertaintyHistogramExp(0) , fUncertaintyHistogramObsPosterior(0) , fNorm(-1) , fNBins(-1) , fXmin(1.) , fXmax(0.) , fPriorNBins(1000) { }
BCTemplateFitter::~BCTemplateFitter | ( | ) |
The default destructor.
Definition at line 53 of file BCTemplateFitter.cxx.
{ if (fUncertaintyHistogramExp) delete fUncertaintyHistogramExp; if (fUncertaintyHistogramObsPosterior) delete fUncertaintyHistogramObsPosterior; }
int BCTemplateFitter::AddSystError | ( | const char * | errorname, | |
const char * | errtype = "gauss" | |||
) |
Add a source of systematic uncertainty.
errorname | The name of the source. | |
errortype | The shape of the uncertainty in each bin. |
Definition at line 368 of file BCTemplateFitter.cxx.
{ // define parameter range double dx = 1.0; // check error type if (std::string(errtype) == std::string("gauss")) dx = 5.0; else if (std::string(errtype) == std::string("flat")) dx = 1.0; else { BCLog::OutError("BCTemplateFitter::AddSystError : Unknown error type."); return 0; } // add a parameter for the expectation value AddParameter(Form("systerr_%i", GetNSystErrors()), -dx, dx); // add name and index to containers fSystErrorNameContainer.push_back(errorname); fSystErrorParIndexContainer.push_back(GetNParameters()-1); // create histogram TH1D hist = TH1D("", "", fNBins, fXmin, fXmax); // fill histograms for (int i = 1; i <= fNBins; ++i) hist.SetBinContent(i, 0.); // get number of templates int n = GetNTemplates(); // define vector of histograms std::vector<TH1D> histvector; // add histograms for (int i = 0; i < n; ++i) histvector.push_back(hist); // add histogram vector fSystErrorHistogramContainer.push_back(histvector); // add error type to container fSystErrorTypeContainer.push_back(std::string(errtype)); // no error return 1; }
int BCTemplateFitter::AddTemplate | ( | TH1D | hist, | |
const char * | name, | |||
double | Nmin = 0 , |
|||
double | Nmax = 0 | |||
) |
Add a template histogram. The templates do not have to be normalized. The histogram has to have the same number of bins and cover the same region as the data histogram.
hist | The template histogram | |
name | The name of the template | |
Nmin | The lower limit of the normalization. | |
Nmax | The upper limit of the normalization. |
Definition at line 218 of file BCTemplateFitter.cxx.
{ // check if histogram if filled if (hist.Integral() <= 0.) { BCLog::OutError("BCTemplateFitter::AddTemplate : Normalization is zero or less than that."); return 0; } // compare template properties with data if (CompareHistogramProperties(fHistData, hist) != 1) { BCLog::OutError("BCTemplateFitter::AddTemplate : Data and template histogram properties are incompatible."); return 0; } // check if prior makes sense if (fFlagPhysicalLimits && Nmin < 0) Nmin = 0; if (Nmin > Nmax) { BCLog::OutError("BCTemplateFitter::AddTemplate : Lower limit exceeds upper limit."); return 0; } // get number of templates int ntemplates = int(fTemplateHistogramContainer.size()); // set histogram color and style hist.SetFillColor(2 + ntemplates); hist.SetFillStyle(1001); hist.SetStats(kFALSE); // scale histogram hist.Scale(1.0 / hist.Integral()); // check if template is consistent with other templates if (ntemplates > 0) if (!CompareHistogramProperties(fTemplateHistogramContainer.at(0), hist)) { BCLog::OutError("BCTemplateFitter::AddTemplate : Properties of template histogram is not compatible with older template histograms."); return 0; } // histograms TH1D histprior = TH1D("", "", fPriorNBins, Nmin, Nmax); TH1D histsysterror = TH1D("", "", fNBins, fXmin, fXmax); // set style histprior.SetXTitle(name); // fill histograms for (int i = 1; i <= fPriorNBins; ++i) histprior.SetBinContent(i, 1.); for (int i = 1; i <= fNBins; ++i) histsysterror.SetBinContent(i, 0.); // get parameter index int parindex = GetNParameters(); int partemplateindex = GetNTemplates(); // add a parameter for the expectation value AddParameter(Form("N_%i", partemplateindex), Nmin, Nmax); // get efficiency parameter index int effindex = GetNParameters(); // add a parameter for the efficiency AddParameter(Form("eff_%i", partemplateindex), -5.0, 5.0); // add histogram, name and index to containers fTemplateHistogramContainer.push_back(hist); fPriorContainer.push_back(histprior); fTemplateNameContainer.push_back(name); fTemplateParIndexContainer.push_back(parindex); fEffParIndexContainer.push_back(effindex); // set efficiency histograms to one without uncertainty fEffHistogramContainer.push_back(TH1D()); fEffErrHistogramContainer.push_back(TH1D()); SetTemplateEfficiency(name, 1., 0.); // add systematic uncertainties for (int i = 0; i < GetNSystErrors(); ++i) { std::vector <TH1D> histvector = fSystErrorHistogramContainer.at(i); histvector.push_back(histsysterror); } // successfully added histogram to container return 1; }
double BCTemplateFitter::CalculateChi2 | ( | ) |
Calculates and returns the chi2 value. The chi2 is calculated using the expectation value for the uncertainty.
Definition at line 871 of file BCTemplateFitter.cxx.
{ int nbins = fHistData.GetNbinsX(); int ntemplates = int(fTemplateHistogramContainer.size()); std::vector <double> parameters = GetBestFitParameters(); double chi2 = 0; // loop over all bins for (int ibin = 1; ibin <= nbins; ++ibin) { double nexp = 0; double ndata = fHistData.GetBinContent(ibin); // loop over all templates for (int itemp = 0; itemp < ntemplates; ++itemp) { int tempindex = fTemplateParIndexContainer.at(itemp); int effindex = fEffParIndexContainer.at(itemp); // get efficiency for the bin double efficiency = fEffHistogramContainer.at(itemp).GetBinContent(ibin); // modify efficiency by uncertainty double efferr = fEffErrHistogramContainer.at(itemp).GetBinContent(ibin); // check efficiency error if (efferr > 0) efficiency = TMath::Max(0., efficiency + parameters.at(effindex) * efferr); // add expectation from bin nexp += parameters.at(tempindex) * efficiency * fTemplateHistogramContainer.at(itemp).GetBinContent(ibin); } // add to chi2 chi2 += (nexp - ndata) * (nexp - ndata) / nexp; } // return chi2 return chi2; }
double BCTemplateFitter::CalculateChi2Prob | ( | ) |
Calculates and returns the chi2-probability.
Definition at line 913 of file BCTemplateFitter.cxx.
{ double chi2 = CalculateChi2(); int ndf = GetNDF(); // return chi2 probability return TMath::Prob(chi2, ndf); }
double BCTemplateFitter::CalculateKSProb | ( | ) |
Calculates and returns the Kolmogorov-Smirnov-probability.
Definition at line 930 of file BCTemplateFitter.cxx.
{ // create a histogram with the sum of all contributions TH1 * histsum = (TH1D*)(fTemplateHistogramContainer.at(0)).Clone("temp"); int nbins = fHistData.GetNbinsX(); int ntemplates = int(fTemplateHistogramContainer.size()); std::vector <double> parameters = GetBestFitParameters(); // loop over all bins for (int ibin = 1; ibin <= nbins; ++ibin) { double bincontent = 0; // loop over all templates for (int itemp = 0; itemp < ntemplates; ++itemp) { int tempindex = fTemplateParIndexContainer.at(itemp); int effindex = fEffParIndexContainer.at(itemp); // get efficiency for the bin double efficiency = fEffHistogramContainer.at(itemp).GetBinContent(ibin); // modify efficiency by uncertainty double efferr = fEffErrHistogramContainer.at(itemp).GetBinContent(ibin); // check efficiency error if (efferr > 0) efficiency = TMath::Max(0., efficiency + parameters.at(effindex) * efferr); // add expectation from bin bincontent += parameters.at(tempindex) * efficiency * fTemplateHistogramContainer.at(itemp).GetBinContent(ibin); } // set bin content histsum->SetBinContent(ibin, bincontent); } // perform KS test double ksprob = histsum->KolmogorovTest(&fHistData); // delete histogram delete histsum; return ksprob; }
double BCTemplateFitter::CalculateMaxLike | ( | ) |
Calculates and returns the Likelihood at the global mode.
Definition at line 923 of file BCTemplateFitter.cxx.
{ // return maximum likelihood return Eval( GetBestFitParameters() ); }
double BCTemplateFitter::CalculatePValue | ( | ) |
Calculates and returns the p-value for the global mode.
Definition at line 977 of file BCTemplateFitter.cxx.
{ // get best fit parameters std::vector<double> par = GetBestFitParameters(); // check size of parameter vector if (par.size() != GetNParameters()) { BCLog::OutWarning("BCBCTemplateFitter::CalculatePValueFast : Number of parameters is inconsistent."); return -1; } // define temporary variables int nbins = fHistData.GetNbinsX(); int ntemplates = int( fTemplateHistogramContainer.size() ); std::vector <int> histogram; std::vector <double> expectation; histogram.assign(nbins, 0); expectation.assign(nbins, 0); double logp = 0; double logp_start = 0; int counter_pvalue = 0; // define starting distribution for (int ibin = 1; ibin <= nbins; ++ibin) { double nexp = 0; // loop over all templates for (int itemp = 0; itemp < ntemplates; ++itemp) { int tempindex = fTemplateParIndexContainer.at(itemp); int effindex = fEffParIndexContainer.at(itemp); // get efficiency for the bin double efficiency = fEffHistogramContainer.at(itemp).GetBinContent(ibin); // modify efficiency by uncertainty double efferr = fEffErrHistogramContainer.at(itemp).GetBinContent(ibin); // check efficiency error if (efferr > 0) efficiency = TMath::Max(0., efficiency + par.at(effindex) * efferr); // add expectation from bin nexp += par.at(tempindex) * efficiency * fTemplateHistogramContainer.at(itemp).GetBinContent(ibin); } histogram[ibin-1] = int(nexp); expectation[ibin-1] = nexp; // calculate p; logp += BCMath::LogPoisson(double(int(nexp)), nexp); logp_start += BCMath::LogPoisson(fHistData.GetBinContent(ibin), nexp); } int niter = 100000; // loop over iterations for (int iiter = 0; iiter < niter; ++iiter) { // loop over bins for (int ibin = 0; ibin < nbins; ++ibin) { // random step up or down in statistics for this bin double ptest = fRandom->Rndm() - 0.5; // increase statistics by 1 if (ptest > 0) { // calculate factor of probability double r = expectation.at(ibin) / double(histogram.at(ibin) + 1); // walk, or don't (this is the Metropolis part) if (fRandom->Rndm() < r) { histogram[ibin] = histogram.at(ibin) + 1; logp += log(r); } } // decrease statistics by 1 else if (ptest <= 0 && histogram[ibin] > 0) { // calculate factor of probability double r = double(histogram.at(ibin)) / expectation.at(ibin); // walk, or don't (this is the Metropolis part) if (fRandom->Rndm() < r) { histogram[ibin] = histogram.at(ibin) - 1; logp += log(r); } } } // end of looping over bins // increase counter if (logp < logp_start) counter_pvalue++; } // end of looping over iterations // calculate p-value return double(counter_pvalue) / double(niter); }
int BCTemplateFitter::CalculateRatio | ( | int | index, | |
std::vector< int > | indices, | |||
double | rmin = -1.0 , |
|||
double | rmax = 1.0 | |||
) |
Add the calculation of a certain ratio.
index | Index in the numerator. | |
indices | Vector of indices in the denominator. | |
rmin | The minimum ratio | |
rmax | The maximum ratio |
Definition at line 499 of file BCTemplateFitter.cxx.
{ // get number of templates int ntemplates = int( fTemplateHistogramContainer.size() ); // check index if (index < 0 || index >= ntemplates) { return 0; } // check indices for (int i = 0; i < int(indices.size()); ++i) { if (indices.at(i) < 0 || indices.at(i) >= ntemplates) { return 0; } } // create temporary vector std::vector<int> tempvec; tempvec.push_back(index); for (int i = 0; i < int(indices.size()); ++i) tempvec.push_back(indices.at(i)); // add ratio fIndicesRatios1D.push_back(tempvec); // get number of ratios int nratios = int(fHistRatios1D.size()); // create histogram double fmin = rmin; double fmax = rmax; if (fFlagPhysicalLimits) { fmin = TMath::Max(rmin, 0.0); fmax = TMath::Min(1.0, rmax); } TH1D hist_ratio1d(TString::Format("ratio %i", nratios), ";r;p(r|data)", 100, fmin, fmax); fHistRatios1D.push_back(hist_ratio1d); // no error return 1; }
TH1D BCTemplateFitter::CombineUncertainties | ( | const char * | name | ) |
Cobine all sources of systematic uncertainties (including efficiency) by summing the squares.
name | The name of the template |
Definition at line 1406 of file BCTemplateFitter.cxx.
{ // get number of sources of systematic uncertainty int nsyst = GetNSystErrors(); // get template index int tempindex = GetIndexTemplate(name); // create new histogram TH1D hist = TH1D("", "", fNBins, fXmin, fXmax); // fill histogram for (int ibin = 1; ibin <= fNBins; ++ibin) { // define total uncertainty double err = 0; // add efficiency uncertainty squared double erreff = fEffErrHistogramContainer.at(tempindex).GetBinContent(ibin); err += erreff * erreff; // add systematic uncertainty squared for (int isyst = 0; isyst < nsyst; ++isyst) { double errsyst = fSystErrorHistogramContainer.at(isyst).at(tempindex).GetBinContent(ibin); err += errsyst*errsyst; } // take square root err = sqrt(err); // set bin content hist.SetBinContent(ibin, err); } // return histogram return hist; }
int BCTemplateFitter::CompareHistogramProperties | ( | TH1D | hist1, | |
TH1D | hist2 | |||
) |
Checks if two histograms have the same properties.
Definition at line 544 of file BCTemplateFitter.cxx.
{ // compare number of bins if (hist1.GetNbinsX() != hist2.GetNbinsX()) return 0; // compare minimum x-values if (hist1.GetXaxis()->GetXmin() != hist2.GetXaxis()->GetXmin()) return 0; // compare maximum x-values if (hist1.GetXaxis()->GetXmax() != hist2.GetXaxis()->GetXmax()) return 0; // conclusion: they have the same properties return 1; }
int BCTemplateFitter::ConstrainSum | ( | std::vector< int > | indices, | |
double | mean, | |||
double | rms | |||
) |
Add a correlation among two sources of systematic uncertainty.
errorname1 | The name of the first source. | |
errorname2 | The name of the second source. | |
corr | The correlation coefficiency. |
indices | The vector of indicies for the contributions. | |
mean | The mean value of the prior. | |
rms | The standard deviation of the prior. |
Definition at line 1228 of file BCTemplateFitter.cxx.
{ // add contraint to container(s) fConstraintSumIndices.push_back(indices); fConstraintSumMean.push_back(mean); fConstraintSumRMS.push_back(rms); // no error return 1; }
TH1D BCTemplateFitter::CreateErrorHist | ( | TH1D | hist, | |
TH1D | histerr | |||
) |
Create a histogram with specified uncertainties.
hist | The histogram to be copied. | |
histerr | The uncertainties of the new histogram. |
Definition at line 1378 of file BCTemplateFitter.cxx.
{ // check histogram properties if (CompareHistogramProperties(fHistData, hist) != 1) { BCLog::OutError("BCTemplateFitter::CreateErrorHist : Histograms are incompatible."); return hist; } // copy histogram TH1D h = hist; // set style h.SetStats(kFALSE); h.SetFillColor(kYellow); h.SetFillStyle(1001); // get number of bins int nbins = hist.GetNbinsX(); // loop over bins for (int i = 1; i <= nbins; ++i) h.SetBinError(i, histerr.GetBinContent(i) * hist.GetBinContent(i)); // return histogram return h; }
TH1D BCTemplateFitter::GetData | ( | ) | [inline] |
Return a template histogram.
name | The template name. Return the histogram containing the data. |
Definition at line 134 of file BCTemplateFitter.h.
{ return fHistData; }
TH1D BCTemplateFitter::GetHistRatio1D | ( | int | index | ) | [inline] |
Return a ratio histogram
Definition at line 86 of file BCTemplateFitter.h.
{ return fHistRatios1D.at(index); }
std::vector<TH1D> BCTemplateFitter::GetHistRatios1D | ( | ) | [inline] |
Return the vector of histgrams containing the ratios.
Definition at line 80 of file BCTemplateFitter.h.
{ return fHistRatios1D; }
int BCTemplateFitter::GetIndexSystError | ( | const char * | name | ) |
Return the index of a source of systematic uncertainty.
name | The name of the source. |
Definition at line 1464 of file BCTemplateFitter.cxx.
{ int index = -1; int n = GetNSystErrors(); for (int i = 0; i < n; i++) if (name == fSystErrorNameContainer.at(i)) index = i; if (index < 0) { BCLog::OutWarning("BCTemplateFitter::GetIndexSystError : Template does not exist."); return 0; } // return index return index; }
int BCTemplateFitter::GetIndexTemplate | ( | const char * | name | ) |
Return the index of a template.
name | The template name. |
Definition at line 1445 of file BCTemplateFitter.cxx.
{ int index = -1; int n = GetNTemplates(); for (int i = 0; i < n; i++) if (name == fTemplateNameContainer.at(i)) index = i; if (index < 0) { BCLog::OutWarning("BCTemplateFitter::GetIndexTemplate : Template does not exist."); return 0; } // return index return index; }
int BCTemplateFitter::GetNDF | ( | ) | [inline] |
Return the number of degrees of freedom.
Definition at line 68 of file BCTemplateFitter.h.
{ return fHistData.GetNbinsX() - GetNParameters(); }
int BCTemplateFitter::GetNRatios | ( | ) | [inline] |
Return the number of ratios to calculate.
Definition at line 74 of file BCTemplateFitter.h.
{ return int(fHistRatios1D.size()); }
int BCTemplateFitter::GetNSystErrors | ( | ) | [inline] |
Return the number of sources of systematic uncertainties.
Definition at line 62 of file BCTemplateFitter.h.
{ return int(fSystErrorParIndexContainer.size()); }
int BCTemplateFitter::GetNTemplates | ( | ) | [inline] |
Return the number of templates.
Definition at line 56 of file BCTemplateFitter.h.
{ return int(fTemplateParIndexContainer.size()); }
int BCTemplateFitter::GetParIndexEff | ( | const char * | name | ) |
Return the parameter index corresponding to an efficiency.
name | The name of the template associated with the efficiency. |
Definition at line 1517 of file BCTemplateFitter.cxx.
{ int index = -1; int n = GetNTemplates(); for (int i = 0; i < n; i++) if (name == fTemplateNameContainer.at(i)) index = fTemplateParIndexContainer.at(i); if (index < 0) { BCLog::OutWarning("BCTemplateFitter::GetParIndexEff : Template does not exist."); return 0; } // return index return index; }
int BCTemplateFitter::GetParIndexSystError | ( | const char * | name | ) |
Return the parameter index corresponding to an efficiency.
index | The index of the template associated with the efficiency. |
Definition at line 1536 of file BCTemplateFitter.cxx.
{ int index = -1; int n = GetNTemplates(); for (int i = 0; i < n; i++) if (name == fSystErrorNameContainer.at(i)) index = fSystErrorParIndexContainer.at(i); if (index < 0) { BCLog::OutWarning("BCTemplateFitter::GetParIndexStatError : Systematic error does not exist."); return 0; } // return index return index; }
int BCTemplateFitter::GetParIndexTemplate | ( | const char * | name | ) |
Return the parameter index corresponding to a template.
name | The template name. |
Definition at line 1483 of file BCTemplateFitter.cxx.
{ int index = -1; int n = GetNTemplates(); for (int i = 0; i < n; i++) if (name == fTemplateNameContainer.at(i)) index = fTemplateParIndexContainer.at(i); if (index < 0) { BCLog::OutWarning("BCTemplateFitter::GetParIndexTemplate : Template does not exist."); return 0; } // return index return index; }
int BCTemplateFitter::GetParIndexTemplate | ( | int | index | ) |
Return the parameter index corresponding to a template.
index | The template index. |
Definition at line 1502 of file BCTemplateFitter.cxx.
{ // get number of templates int n = GetNTemplates(); if (index < 0 || index > n) { BCLog::OutError("BCTemplateFitter::GetParIndexTemplate : Index out of range."); return -1; } // return index return fTemplateParIndexContainer.at(index); }
int BCTemplateFitter::Initialize | ( | ) |
Initialize the fitting procedure.
Definition at line 449 of file BCTemplateFitter.cxx.
{ // check data integral if (fHistData.Integral() <= 0) { BCLog::OutError("BCTemplateFitter::Initialize : Normalization of data histogram is zero or less than that."); return 0; } // create histograms for uncertainty determination double maximum = 1.5 * fHistData.GetMaximum(); fUncertaintyHistogramExp = new TH2D( TString::Format("UncertaintyExp_%i", BCLog::GetHIndex()), "", fHistData.GetNbinsX(), fHistData.GetXaxis()->GetXmin(), fHistData.GetXaxis()->GetXmax(), 100, 0., maximum); fUncertaintyHistogramObsPosterior = new TH2D( TString::Format("UncertaintyObsPosterior_%i", BCLog::GetHIndex()), "", fHistData.GetNbinsX(), fHistData.GetXaxis()->GetXmin(), fHistData.GetXaxis()->GetXmax(), int(maximum) + 1, -0.5, double(int(maximum))+0.5); // create histogram containing the normalization double xmin = 0; double xmax = 0; int ntemplates = int(fTemplateParIndexContainer.size()); // calculate the limits on the norm from the sum of all parameter // limits for (int i = 0; i < ntemplates; ++i) { // get parameter index int parindex = fTemplateParIndexContainer.at(i); int effindex = fEffParIndexContainer.at(i); // get parameter BCParameter * par = this->GetParameter(parindex); BCParameter * eff = this->GetParameter(effindex); // increate limits xmin += par->GetLowerLimit() * eff->GetLowerLimit(); xmax += par->GetUpperLimit() * eff->GetUpperLimit(); } // create new histogram for norm fHistNorm = TH1D("", ";N_{norm};dN/dN_{norm}", 100, xmin, xmax); // no error return 1; }
double BCTemplateFitter::LogAPrioriProbability | ( | std::vector< double > | parameters | ) | [virtual] |
Calculates and returns the log of the prior probability at a given point in parameter space.
Reimplemented from BCModel.
Definition at line 132 of file BCTemplateFitter.cxx.
{ double logprob = 0.; // get number of templates int ntemplates = GetNTemplates(); // loop over templates for (int i = 0; i < ntemplates; ++i) { // prior on process contributions double par = parameters.at(fTemplateParIndexContainer.at(i)); int bin = fPriorContainer.at(i).FindBin(par); logprob += log( fPriorContainer.at(i).GetBinContent(bin) ); // prior on efficiences par = parameters.at(fEffParIndexContainer.at(i)); logprob += BCMath::LogGaus(par, 0.0, 1.0); } // get number of sources of systematic uncertainties int nsyst = GetNSystErrors(); // loop over sources of systematic uncertainties for (int i = 0; i < nsyst; ++i) { double par = parameters.at(fSystErrorParIndexContainer.at(i)); if (fSystErrorTypeContainer.at(i) == "gauss") logprob += BCMath::LogGaus(par, 0.0, 1.0); } // constraints int nconstraints = int(fConstraintSumIndices.size()); if (nconstraints > 0) { // loop over constraints for (int i = 0; i < nconstraints; ++i) { // initialize sum double sum = 0; // get number of summands int nsummands = int( (fConstraintSumIndices.at(i)).size() ); // loop over summands and add to sum for (int j = 0; j < nsummands; ++j) { int index = fConstraintSumIndices.at(i).at(j); double par = parameters.at(fTemplateParIndexContainer.at(index)); sum += par; } // add to prior logprob += BCMath::LogGaus(sum, fConstraintSumMean.at(i), fConstraintSumRMS.at(i)); } } return logprob; }
double BCTemplateFitter::LogLikelihood | ( | std::vector< double > | parameters | ) | [virtual] |
Calculates and returns the log of the Likelihood at a given point in parameter space.
Reimplemented from BCModel.
Definition at line 63 of file BCTemplateFitter.cxx.
{ double logprob = 0.; // get number pf templates int ntemplates = GetNTemplates(); // get number of sources of systematic uncertainties int nsyst = GetNSystErrors(); // loop over bins for (int ibin = 1; ibin <= fNBins; ++ibin) { double nexp = 0; double ndata = fHistData.GetBinContent(ibin); // loop over all templates for (int itemp = 0; itemp < ntemplates; ++itemp) { int templateindex = fTemplateParIndexContainer.at(itemp); int effindex = fEffParIndexContainer.at(itemp); // get efficiency for the bin double efficiency = fEffHistogramContainer.at(itemp).GetBinContent(ibin); // modify efficiency by uncertainty double efferr = fEffErrHistogramContainer.at(itemp).GetBinContent(ibin); // check efficiency error if (efferr > 0) efficiency += parameters.at(effindex) * efferr; // loop over sources of systematic uncertainties for (int isyst = 0; isyst < nsyst; ++isyst) { // get parameter index int systindex = fSystErrorParIndexContainer.at(isyst); // add efficiency double deff = fSystErrorHistogramContainer.at(isyst).at(itemp).GetBinContent(ibin); if (deff > 0) efficiency += deff * parameters.at(systindex); } // make sure efficiency is between 0 and 1 if (efficiency < 0.) efficiency = 0.; if (efficiency > 1.) efficiency = 1.; // calculate expectation nvalue nexp += parameters.at(templateindex) * efficiency * fTemplateHistogramContainer.at(itemp).GetBinContent(ibin); } // check that expectation is larger or equal to zero if (nexp < 0) { BCLog::OutWarning("BCTemplateFitter::LogLikelihood : Expectation value smaller than 0. Force it to be 0."); nexp = 0; } // add Poisson term logprob += BCMath::LogPoisson(ndata, nexp); } // return log likelihood return logprob; }
void BCTemplateFitter::MCMCUserIterationInterface | ( | ) | [virtual] |
Overloaded from BCIntegrate.
Reimplemented from BCIntegrate.
Definition at line 1077 of file BCTemplateFitter.cxx.
{ int nbins = fHistData.GetNbinsX(); int ntemplates = int(fTemplateHistogramContainer.size()); // loop over all bins for (int ibin = 1; ibin <= nbins; ++ibin) { double bincontent = 0; // loop over all templates for (int itemp = 0; itemp < ntemplates; ++itemp) { int tempindex = fTemplateParIndexContainer.at(itemp); int effindex = fEffParIndexContainer.at(itemp); // get efficiency for the bin double efficiency = fEffHistogramContainer.at(itemp).GetBinContent(ibin); // modify efficiency by uncertainty double efferr = fEffErrHistogramContainer.at(itemp).GetBinContent(ibin); // check efficiency error if (efferr > 0) efficiency = TMath::Max(0., efficiency + fMCMCx.at(effindex) * efferr); bincontent += fMCMCx.at(tempindex) * efficiency * fTemplateHistogramContainer.at(itemp).GetBinContent(ibin); } // set bin content fUncertaintyHistogramExp->Fill(fHistData.GetBinCenter(ibin), bincontent); // loop over bins in the other direction int nbinsy = fUncertaintyHistogramObsPosterior->GetNbinsY(); for (int jbin = 1; jbin <= nbinsy; ++jbin) { int n = jbin - 1; if (fabs(n - bincontent) < 2*sqrt(bincontent)) fUncertaintyHistogramObsPosterior->Fill(fHistData.GetBinCenter(ibin), n, TMath::Poisson(bincontent, n)); } } // fill normalization fHistNorm.Fill(fNorm); // fill ratios int nratios = int( fIndicesRatios1D.size() ); // loop over fractions to fill for (int i = 0; i < nratios; ++i) { int nsum = int( (fIndicesRatios1D.at(i)).size() ) - 1; double sum = 0; for (int j = 1; j <= nsum; ++j) { int indexsum = fIndicesRatios1D.at(i).at(j); sum += fMCMCx.at(fTemplateParIndexContainer.at(indexsum)); } fHistRatios1D.at(i).Fill(fMCMCx.at(fTemplateParIndexContainer.at(fIndicesRatios1D.at(i).at(0)))/sum); } }
int BCTemplateFitter::PerformFit | ( | ) |
Perform the template fit.
Definition at line 1555 of file BCTemplateFitter.cxx.
{ // initialize if (!Initialize()) { BCLog::OutError("BCTemplateFitter::PerformFit : Could not initialize template fitter."); return 0; } // run Markov Chains MarginalizeAll(); // find global mode FindMode(); // no error return 1; }
void BCTemplateFitter::PrintRatios | ( | const char * | filename = "ratio.ps" , |
|
int | option = 0 , |
|||
double | ovalue = 0. | |||
) |
Print the ratios and the norm.
filename | The filename. | |
option | Plot options | |
pvalue | Value which goes with plot options (see BAT manual). |
Definition at line 1137 of file BCTemplateFitter.cxx.
{ int nratios = int(fHistRatios1D.size()); TCanvas * c1 = new TCanvas(""); TPostScript * ps = new TPostScript(filename, 112); ps->NewPage(); c1->cd(); BCH1D * h1temp = new BCH1D(&fHistNorm); h1temp->Draw(); c1->Update(); ps->NewPage(); for (int i = 0; i < nratios; ++i) { c1->Update(); ps->NewPage(); c1->cd(); BCH1D* h1temp = new BCH1D(&fHistRatios1D.at(i)); h1temp->Draw(options, ovalue); } c1->Update(); ps->Close(); delete c1; delete ps; }
void BCTemplateFitter::PrintStack | ( | const char * | filename = "stack.ps" , |
|
const char * | options = "LE2E0D" | |||
) |
Prints the stack of templates scaled with the global mode. The data is plotted on top. The following options are available:
"L" : adds a legend
"E0" : symmetric errorbars on the data points with a length of sqrt(obs).
"E1" : symmetric errorbars on the sum of templates with a length of sqrt(exp).
"E2" : asymmetric errorbars on the sum of templates from error propagation of the parameters.
"E3" : asymmetric errorbars on the data points. The errorbars mark the 16% and 85% quantiles of the Poisson distribution rounded to the lower or upper integer, respectively.
filename | The name of the file the output is printed to. | |
options | Plotting options |
Definition at line 563 of file BCTemplateFitter.cxx.
{ int nbins = fHistData.GetNbinsX(); int ntemplates = int( fTemplateHistogramContainer.size() ); // check options bool flag_legend = false; bool flag_error0 = false; // symm. poisson error for data bool flag_error1 = false; // symm. poisson error for exp. bool flag_error2 = false; // asymm. poisson error of expectation value bool flag_error3 = false; // asymm. poisson error of expected no. of events bool flag_diff = false; // plot difference between data and expectation below stack plot if (std::string(options).find("L") < std::string(options).size()) flag_legend = true; if (std::string(options).find("E0") < std::string(options).size()) flag_error0 = true; if (std::string(options).find("E1") < std::string(options).size()) flag_error1 = true; if (std::string(options).find("E2") < std::string(options).size()) flag_error2 = true; if (std::string(options).find("E3") < std::string(options).size()) flag_error3 = true; if (std::string(options).find("D") < std::string(options).size()) flag_diff = true; // create canvas TCanvas* c1 = new TCanvas("", "", 700, 700); c1->cd(); TPad * pad1; TPad * pad2; double fraction_pads = 0.3; if(!flag_diff) fraction_pads=0.0; if (flag_diff) { pad1 = new TPad("pad1", "", 0.0, fraction_pads, 1.0, 1.0); pad1->SetTopMargin (0.13/(1.0-fraction_pads)); pad1->SetBottomMargin(0.0); pad1->SetLeftMargin (0.15); pad1->SetRightMargin (0.13); pad1->SetFillColor(kWhite); pad2 = new TPad("pad2", "", 0.0, 0.0, 1.0, fraction_pads); pad2->SetTopMargin (0.0); pad2->SetBottomMargin(0.15 / fraction_pads); pad2->SetLeftMargin (0.15); pad2->SetRightMargin (0.13); pad2->SetFillColor(kWhite); pad1->Draw(); pad2->Draw(); } else { pad1 = new TPad("pad1", "",0.0, 0.0, 1.0, 1.0); pad1->SetFillColor(kWhite); pad2 = new TPad(); pad1->Draw(); } pad1->cd(); // set style and draw data double ymin = 0.01; double ymax = 1.1 * (fHistData.GetMaximum() + sqrt(fHistData.GetMaximum())); fHistData.GetYaxis()->SetRangeUser(ymin, ymax); fHistData.GetXaxis()->SetNdivisions(505); if (flag_diff) { fHistData.GetXaxis()->SetLabelSize(fHistData.GetXaxis()->GetLabelSize()/(1.0-fraction_pads)); fHistData.GetXaxis()->SetLabelOffset(fHistData.GetXaxis()->GetLabelOffset()*(1.0-fraction_pads)); fHistData.GetXaxis()->SetTitleSize(fHistData.GetXaxis()->GetTitleSize()/(1.0-fraction_pads)); fHistData.GetXaxis()->SetTitleOffset(fHistData.GetXaxis()->GetTitleOffset()*(1.0-fraction_pads)); fHistData.GetYaxis()->SetLabelSize(fHistData.GetYaxis()->GetLabelSize()/(1.0-fraction_pads)); fHistData.GetYaxis()->SetLabelOffset(fHistData.GetYaxis()->GetLabelOffset()/(fraction_pads)); fHistData.GetYaxis()->SetTitleSize(fHistData.GetYaxis()->GetTitleSize()/(1.0-fraction_pads)); fHistData.GetYaxis()->SetTitleOffset(fHistData.GetYaxis()->GetTitleOffset()*(1.0-fraction_pads)); } fHistData.Draw("P"); // create a histogram with the sum of all contributions TH1D * histsum = (TH1D*) fHistData.Clone("temp"); // create stack THStack stack("histostack",""); // create legends TLegend* legend1; TLegend* legend2; if (flag_diff) legend1 = new TLegend(0.15, (0.88-fraction_pads)/(1-fraction_pads), 0.50, 0.99); else legend1 = new TLegend(0.15, 0.88, 0.50, 0.99); legend1->SetBorderSize(0); legend1->SetFillColor(kWhite); legend1->AddEntry(&fHistData, "Data", "LEP"); legend1->AddEntry(&fHistData, "Total expected uncertainty", "LE"); double y = 0.99; if (ntemplates > 2 && ntemplates <7) y -= 0.11 / 4. * double(ntemplates - 2); legend2 = new TLegend(0.50,(y-fraction_pads)/(1-fraction_pads) , 0.85, 0.99); legend2->SetBorderSize(0); legend2->SetFillColor(kWhite); // scale histograms and add to stack and legend for (int itemp = 0; itemp < ntemplates; ++itemp) { int tempindex = fTemplateParIndexContainer.at(itemp); int effindex = fEffParIndexContainer.at(itemp); // scale histogram fTemplateHistogramContainer.at(itemp).Scale( GetBestFitParameter(tempindex)/ fTemplateHistogramContainer.at(itemp).Integral()); // loop over bins and scale these for (int ibin = 1; ibin <= fNBins; ++ibin) { // get efficiency for the bin double efficiency = fEffHistogramContainer.at(itemp).GetBinContent(ibin); // modify efficiency by uncertainty double efferr = fEffErrHistogramContainer.at(itemp).GetBinContent(ibin); // check efficiency error if (efferr > 0) efficiency = TMath::Max(0., efficiency + GetBestFitParameter(effindex) * efferr); fTemplateHistogramContainer.at(itemp).SetBinContent( ibin,fTemplateHistogramContainer.at(itemp).GetBinContent(ibin) * efficiency); } // add histogram to stack stack.Add(&(fTemplateHistogramContainer.at(itemp))); if (itemp < 2) legend1->AddEntry(&(fTemplateHistogramContainer.at(itemp)), fTemplateNameContainer.at(itemp).data(), "F"); else if (itemp < 6) legend2->AddEntry(&(fTemplateHistogramContainer.at(itemp)), fTemplateNameContainer.at(itemp).data(), "F"); } // loop over all bins for (int ibin = 1; ibin <= nbins; ++ibin) { double bincontent = 0; // loop over all templates for (int itemp = 0; itemp < ntemplates; ++itemp) bincontent +=fTemplateHistogramContainer.at(itemp).GetBinContent(ibin); // set bin content histsum->SetBinContent(ibin, bincontent); } // define error graph TGraphAsymmErrors * graph_error_exp = new TGraphAsymmErrors(nbins); graph_error_exp->SetLineWidth(2); graph_error_exp->SetMarkerStyle(0); TGraphAsymmErrors * graph_error_obs = new TGraphAsymmErrors(nbins); graph_error_obs->SetMarkerStyle(0); // calculate uncertainty if (flag_error1) for (int i = 1; i <= nbins; ++i) { double nexp = histsum->GetBinContent(i); histsum->SetBinError(i, sqrt(nexp)); histsum->SetMarkerStyle(0); } if (flag_error2) for (int i = 1; i <= nbins; ++i) { TH1D * proj = fUncertaintyHistogramExp->ProjectionY("_py", i, i); if (proj->Integral() > 0) proj->Scale(1.0 / proj->Integral()); double quantiles[3]; double sums[3] = {0.16, 0.5, 0.84}; proj->GetQuantiles(3, quantiles, sums); graph_error_exp->SetPoint(i-1, histsum->GetBinCenter(i), quantiles[1]); graph_error_exp->SetPointError(i-1, 0.0, 0.0, quantiles[1] - quantiles[0], quantiles[2]-quantiles[1]); delete proj; } if (flag_error3) for (int i = 1; i <= nbins; ++i) { TH1D * proj = fUncertaintyHistogramObsPosterior->ProjectionY("_py", i, i); if (proj->Integral() > 0) proj->Scale(1.0 / proj->Integral()); double quantiles[3]; double sums[3] = {0.16, 0.5, 0.84}; proj->GetQuantiles(3, quantiles, sums); graph_error_obs->SetPoint(i-1, histsum->GetBinCenter(i), quantiles[1]); graph_error_obs->SetPointError(i-1, 0.0, 0.0, quantiles[1] - TMath::Floor(quantiles[0]), TMath::Ceil(quantiles[2])-quantiles[1]); delete proj; } // create difference histogram TH1D * hist_diff = 0; TGraphAsymmErrors * graph_diff_exp = 0; if (flag_diff) { ymin = 0; ymax = 0; hist_diff = new TH1D("hist_diff", "", nbins, histsum->GetXaxis()->GetXmin(), histsum->GetXaxis()->GetXmax() ); hist_diff->GetXaxis()->SetTitle(fHistData.GetXaxis()->GetTitle()); hist_diff->GetYaxis()->SetTitle("#Delta N"); hist_diff->GetXaxis()->SetNdivisions(505); hist_diff->GetXaxis()->SetLabelSize(hist_diff->GetXaxis()->GetLabelSize()/(fraction_pads)); hist_diff->GetXaxis()->SetLabelOffset(hist_diff->GetXaxis()->GetLabelOffset()/fraction_pads*2.); hist_diff->GetXaxis()->SetTitleSize(hist_diff->GetXaxis()->GetTitleSize()/(fraction_pads)); hist_diff->GetXaxis()->SetTitleOffset((hist_diff->GetXaxis()->GetTitleOffset()-(1.0-fraction_pads))/(fraction_pads)); hist_diff->GetYaxis()->SetNdivisions(503); hist_diff->GetYaxis()->SetLabelSize(hist_diff->GetYaxis()->GetLabelSize()/(fraction_pads)); hist_diff->GetYaxis()->SetLabelOffset(hist_diff->GetYaxis()->GetLabelOffset()/(fraction_pads)); hist_diff->GetYaxis()->SetTitleSize(hist_diff->GetYaxis()->GetTitleSize()/(fraction_pads)); hist_diff->GetYaxis()->SetTitleOffset(hist_diff->GetYaxis()->GetTitleOffset()*(fraction_pads)); hist_diff->SetStats(kFALSE); graph_diff_exp = new TGraphAsymmErrors(nbins); graph_diff_exp->SetLineWidth(2); graph_diff_exp->SetMarkerStyle(0); graph_diff_exp->SetFillColor(kYellow); for (int i = 0; i < nbins; ++i) { hist_diff->SetBinContent(i+1, fHistData.GetBinContent(i+1)-histsum->GetBinContent(i+1)); hist_diff->SetBinError(i+1, fHistData.GetBinError(i+1)); graph_diff_exp->SetPoint(i, (graph_error_exp->GetX())[i], 0.0); graph_diff_exp->SetPointEXlow(i, 0.0); graph_diff_exp->SetPointEXhigh(i, 0.0); graph_diff_exp->SetPointEYlow(i, (graph_error_exp->GetEYlow())[i]); graph_diff_exp->SetPointEYhigh(i, (graph_error_exp->GetEYhigh())[i]); if (-(graph_error_exp->GetEYlow())[i] < ymin) ymin = -(graph_error_exp->GetEYlow())[i]; if ((graph_error_exp->GetEYhigh())[i] > ymax) ymax = (graph_error_exp->GetEYhigh())[i]; } if (ymax < (hist_diff->GetMaximum() + hist_diff->GetBinError(hist_diff->GetMaximumBin()))) ymax = 1.1 * (hist_diff->GetMaximum() + hist_diff->GetBinError(hist_diff->GetMaximumBin())); if (ymin>(hist_diff->GetMinimum() - hist_diff->GetBinError(hist_diff->GetMaximumBin()))) ymin = 1.1 * (hist_diff->GetMinimum() - hist_diff->GetBinError(hist_diff->GetMaximumBin())); (hist_diff->GetYaxis())->SetRangeUser(-1.1*TMath::Max(-ymin, ymax), 1.1*TMath::Max(-ymin, ymax)); } // draw histograms stack.Draw("SAMEA"); stack.GetHistogram() -> SetXTitle(""); stack.GetHistogram() -> SetYTitle(""); stack.GetHistogram() -> GetXaxis() -> SetLabelSize(0); stack.GetHistogram() -> GetYaxis() -> SetLabelSize(0); stack.Draw("SAME"); fHistData.Draw("SAMEP"); if (flag_error0) fHistData.Draw("SAMEPE"); if (flag_error1) histsum->Draw("SAMEE"); if (flag_error3) graph_error_obs->Draw("SAMEZ"); if (flag_error2) graph_error_exp->Draw("SAME||"); if (flag_legend) { legend1->Draw(); if (ntemplates>2) legend2->Draw(); } TLine * line = 0; if (flag_diff) { pad2->cd(); hist_diff->Draw("P"); graph_diff_exp->Draw("SAME4"); line = new TLine((hist_diff->GetXaxis())->GetXmin(), 0.0, (hist_diff->GetXaxis())->GetXmax(), 0.0); line->SetLineWidth(2); line->SetLineColor(kBlack); line->Draw("SAME"); hist_diff->Draw("SAMEP"); } c1->Print(filename); // rescale for (int i = 0; i < ntemplates; ++i) fTemplateHistogramContainer.at(i).Scale(1.0 / fTemplateHistogramContainer.at(i).Integral()); // delete temporary histograms delete pad1; delete pad2; delete c1; delete legend1; delete legend2; delete graph_error_exp; delete graph_error_obs; delete histsum; if (flag_diff) { delete hist_diff; delete graph_diff_exp; delete line; } }
void BCTemplateFitter::PrintTemp | ( | ) |
Temporary entry. Used for debugging.
Definition at line 1240 of file BCTemplateFitter.cxx.
{ TCanvas * c1 = new TCanvas(""); c1->cd(); fUncertaintyHistogramExp->Draw("COL"); c1->Print("uncertainty_exp.eps"); c1->cd(); fUncertaintyHistogramObsPosterior->Draw("COL"); c1->Print("uncertainty_obs.eps"); delete c1; }
int BCTemplateFitter::PrintTemplate | ( | const char * | name, | |
const char * | filename | |||
) |
Print a template to a file.
name | The template name. | |
filename | The filename. |
Definition at line 1256 of file BCTemplateFitter.cxx.
{ // get number of sources of systematic uncertainty int nsyst = GetNSystErrors(); // get index int index = GetIndexTemplate(name); // check index if (index < 0) { BCLog::OutError("BCTemplateFitter::PrintTemplate : Could not find template."); return 0; } // remember old directory TDirectory* dir = gDirectory; // create postscript TPostScript * ps = new TPostScript(filename); // create new canvas TCanvas * c1 = new TCanvas("", "", 700, 700); c1->Update(); ps->NewPage(); c1->cd(); // create legend TLegend l1(0.18, 0.75, 0.85, 0.85); l1.SetBorderSize(0); l1.SetFillColor(kWhite); // draw histogram and uncertainties TH1D hist_template = fTemplateHistogramContainer.at(index); hist_template.SetFillColor(kWhite); hist_template.SetFillStyle(0); hist_template.SetMarkerSize(0); hist_template.SetLineWidth(0); l1.AddEntry(&hist_template, name, "L"); TH1D hist_totalerr = CombineUncertainties(name); TH1D hist_template_totalerr = CreateErrorHist(hist_template, hist_totalerr); hist_template_totalerr.SetFillColor(kYellow); hist_template_totalerr.SetFillStyle(1001); hist_template_totalerr.SetMarkerSize(0); l1.AddEntry(&hist_template_totalerr, "Systematic uncertainties", "F"); TH1D hist_efferr = fEffErrHistogramContainer.at(index); TH1D hist_template_efferr = CreateErrorHist(hist_template, hist_efferr); hist_template_totalerr.SetFillColor(kRed); hist_template_totalerr.SetFillStyle(1001); hist_template_efferr.SetMarkerSize(0); l1.AddEntry(&hist_template_efferr, "Efficiency uncertainties", "F"); int binmax = hist_template.GetMaximumBin(); double ymax = hist_template.GetBinContent(binmax) + 2.0 * hist_template_totalerr.GetBinError(binmax); hist_template_totalerr.GetYaxis()->SetRangeUser(0.0, 1.25 * ymax); hist_template_totalerr.Draw("E2"); hist_template_efferr.Draw("SAMEE2"); hist_template.Draw("SAME"); // draw legend l1.Draw(); // update ps c1->Update(); ps->NewPage(); c1->cd(); // create legend TLegend l2(0.18, 0.75, 0.85, 0.85); l2.SetBorderSize(0); l2.SetFillColor(kWhite); // print uncertainties c1->cd(2); hist_efferr = fEffErrHistogramContainer.at(index); double ymin = hist_efferr.GetMinimum(); ymax = hist_efferr.GetMaximum(); l2.AddEntry(&hist_efferr, "Efficiency", "L"); hist_efferr.SetStats(kFALSE); hist_efferr.Draw(); // loop over all uncertainties for (int i = 0; i < nsyst; ++i) { TH1D * hist = new TH1D(fSystErrorHistogramContainer.at(i).at(index)); hist->SetLineColor(2 + i); if (hist->GetMaximum()>ymax) ymax = hist->GetMaximum(); if (hist->GetMinimum()<ymin) ymin = hist->GetMinimum(); l2.AddEntry(hist, fSystErrorNameContainer.at(i).c_str(), "L"); hist->Draw("SAME"); } if (ymin < 0) ymin = 1.25*ymin; else ymin = 0.8*ymin; if (ymax > 0) ymax = 1.25*ymax; else ymax = 0.8*ymax; hist_efferr.GetYaxis()->SetRangeUser(ymin, ymax); // draw legend l2.Draw(); // close ps c1->Update(); ps->Close(); // change to old directory dir->cd(); // free memory delete c1; delete ps; // no error return 1; }
int BCTemplateFitter::SetData | ( | const TH1D & | hist | ) |
Set the histogram containing the data.
hist | The data histogram. |
Definition at line 191 of file BCTemplateFitter.cxx.
{ // create histogram fNBins = hist.GetNbinsX(); fXmin = (hist.GetXaxis())->GetXmin(); fXmax = (hist.GetXaxis())->GetXmax(); fHistData = TH1D("", "", fNBins, fXmin, fXmax); // copy histogram content for (int i = 1; i <= fNBins; ++i) fHistData.SetBinContent(i, hist.GetBinContent(i)); // set histogram style fHistData.SetXTitle((hist.GetXaxis())->GetTitle()); fHistData.SetYTitle((hist.GetYaxis())->GetTitle()); fHistData.SetMarkerStyle(20); fHistData.SetMarkerSize(1.1); fHistData.SetStats(kFALSE); // calculate norm fNorm = hist.Integral(); // no errors return 1; }
void BCTemplateFitter::SetFlagFixNorm | ( | bool | flag | ) | [inline] |
Set the flag for using a fixed normalization (true) or floating normalization (false).
Definition at line 149 of file BCTemplateFitter.h.
{ fFlagFixNorm = flag; }
void BCTemplateFitter::SetFlagPhysicalLimits | ( | bool | flag | ) | [inline] |
Set a flag for having physical limits (expectation values greater or equal to 0).
flag | The flag. |
Definition at line 142 of file BCTemplateFitter.h.
{ fFlagPhysicalLimits = flag; }
void BCTemplateFitter::SetNorm | ( | double | norm | ) | [inline] |
int BCTemplateFitter::SetTemplateEfficiency | ( | const char * | name, | |
TH1D | eff, | |||
TH1D | efferr | |||
) |
Describe the efficiency and the uncertainty for each bin.
name | The template name. | |
eff | A histogram describing the efficieny. | |
efferr | A histogram describing the uncertainty on the efficiency. |
Definition at line 1166 of file BCTemplateFitter.cxx.
{ // get index int index = GetIndexTemplate(name); // check index if (index < 0) { BCLog::OutError("BCTemplateFitter::SetTemplateEfficiency : Could not find template."); return 0; } // check efficiency histogram if (CompareHistogramProperties(fTemplateHistogramContainer.at(index), eff) != 1) { BCLog::OutError("BCTemplateFitter::SetTemplate efficiency : Template and efficiency histogram properties are incompatible."); return 0; } // set histogram style eff.SetXTitle((fHistData.GetXaxis())->GetTitle()); eff.SetYTitle("Efficiency"); efferr.SetXTitle((fHistData.GetXaxis())->GetTitle()); efferr.SetYTitle("Efficiency uncertainty"); // set efficiency histogram fEffHistogramContainer[index] = eff; fEffErrHistogramContainer[index] = efferr; // no error return 1; }
int BCTemplateFitter::SetTemplateEfficiency | ( | const char * | name, | |
double | effmean = 1. , |
|||
double | effsigma = 0. | |||
) |
Describe the efficiency and the uncertainty for all bins.
name | The template name. | |
effmean | The mean value of the efficiency. | |
errsigma | The uncertainty on the efficiency. |
Definition at line 1199 of file BCTemplateFitter.cxx.
{ // get index int index = GetIndexTemplate(name); // check index if (index < 0) { BCLog::OutError("BCTemplateFitter::SetTemplateEfficiency : Could not find template."); return 0; } // create histograms TH1D histeff = TH1D("", "", fNBins, fXmin, fXmax); TH1D histefferr = TH1D("", "", fNBins, fXmin, fXmax); // fill histograms for (int i = 1; i <= fNBins; ++i) { histeff.SetBinContent(i, effmean); histefferr.SetBinContent(i, effsigma); } // set histograms int err = SetTemplateEfficiency(name, histeff, histefferr); // return error code return err; }
int BCTemplateFitter::SetTemplatePrior | ( | const char * | name, | |
double | mean, | |||
double | sigma | |||
) |
Set a Gaussian prior on the template.
name | The name of the template. | |
mean | The mean value of the prior. | |
rms | The standard deviation of the prior. |
Definition at line 336 of file BCTemplateFitter.cxx.
{ // get index int parindex = GetParIndexTemplate(name); // check parameter index if (parindex < 0) { BCLog::OutError("BCTemplateFitter::SetTemplatePrior : Did not find parameter."); return 0; } // get parameter BCParameter * par = this->GetParameter(parindex); // create new histogram TH1D hist("", "", fPriorNBins, par->GetLowerLimit(), par->GetUpperLimit()); // loop over bins and fill histogram for (int i = 1; i < fPriorNBins; ++i) { double x = hist.GetBinCenter(i); double fx = TMath::Gaus(x, mean, sigma); hist.SetBinContent(i, fx); } // set template prior int err = SetTemplatePrior(name, hist); // return error code return err; }
int BCTemplateFitter::SetTemplatePrior | ( | const char * | name, | |
TH1D | prior | |||
) |
Set an arbitrary prior on the template
name | The name of the template. | |
prior | A histogram describing the prior. |
Definition at line 308 of file BCTemplateFitter.cxx.
{ // get index int parindex = GetIndexTemplate(name); // check parameter index if (parindex < 0) { BCLog::OutError("BCTemplateFitter::SetTemplatePrior : Did not find parameter."); return 0; } // check prior if (prior.Integral() <= 0) { BCLog::OutError("BCTemplateFitter::SetTemplatePrior : Integral of prior is equal to zero or less than that."); return 0; } // normalize prior to unity prior.Scale(1.0/prior.Integral()); // replace histogram fPriorContainer[parindex] = prior; // no error return 1; }
int BCTemplateFitter::SetTemplateSystError | ( | const char * | errorname, | |
const char * | templatename, | |||
TH1D | parerror | |||
) |
Set the systematic uncertainty on a template.
errorname | The name of the source. | |
templatename | The template name. | |
parerror | A histogram describing the uncertainty. |
Definition at line 418 of file BCTemplateFitter.cxx.
{ // get error index int errindex = GetIndexSystError(errorname); // check parameter index if (errindex < 0) { BCLog::OutError("BCTemplateFitter::SetTemplateSystError : Did not find parameter."); return 0; } // get template index int tempindex = GetIndexTemplate(templatename); // check index if (tempindex < 0) { BCLog::OutError("BCTemplateFitter::SetTemplateSystError : Could not find template."); return 0; } // set style parerror.SetStats(kFALSE); // set histogram (fSystErrorHistogramContainer.at(errindex))[tempindex] = parerror; // no error return 1; }
std::vector< std::vector<int> > BCTemplateFitter::fConstraintSumIndices [protected] |
A container for constrained sums: indices.
Definition at line 432 of file BCTemplateFitter.h.
std::vector< double > BCTemplateFitter::fConstraintSumMean [protected] |
A container for constrained sums: mean values.
Definition at line 437 of file BCTemplateFitter.h.
std::vector< double > BCTemplateFitter::fConstraintSumRMS [protected] |
A container for constrained sums: mean values.
Definition at line 442 of file BCTemplateFitter.h.
std::vector<TH1D> BCTemplateFitter::fEffErrHistogramContainer [protected] |
A container of efficiency uncertainty histograms.
Definition at line 388 of file BCTemplateFitter.h.
std::vector<TH1D> BCTemplateFitter::fEffHistogramContainer [protected] |
A container of efficiency histograms.
Definition at line 384 of file BCTemplateFitter.h.
std::vector<int> BCTemplateFitter::fEffParIndexContainer [protected] |
A container of parameter indeces for efficiencies.
Definition at line 416 of file BCTemplateFitter.h.
bool BCTemplateFitter::fFlagFixNorm [protected] |
Flag for fixing the normalization or not
Definition at line 462 of file BCTemplateFitter.h.
bool BCTemplateFitter::fFlagPhysicalLimits [protected] |
Flag for having physical limits (expectation values greater or equal to 0).
Definition at line 468 of file BCTemplateFitter.h.
TH1D BCTemplateFitter::fHistData [protected] |
The data histogram.
Definition at line 374 of file BCTemplateFitter.h.
TH1D BCTemplateFitter::fHistNorm [protected] |
Histogram containing the overall number of expected events.
Definition at line 447 of file BCTemplateFitter.h.
std::vector<TH1D> BCTemplateFitter::fHistRatios1D [protected] |
1-D histograms containing ratios.
Definition at line 457 of file BCTemplateFitter.h.
std::vector< std::vector<int> > BCTemplateFitter::fIndicesRatios1D [protected] |
Vector of indices for the calculation of ratios.
Definition at line 452 of file BCTemplateFitter.h.
int BCTemplateFitter::fNBins [protected] |
The number of bins in the data.
Definition at line 487 of file BCTemplateFitter.h.
double BCTemplateFitter::fNorm [protected] |
Normalization constant
Definition at line 483 of file BCTemplateFitter.h.
std::vector<TH1D> BCTemplateFitter::fPriorContainer [protected] |
A container of prior histograms.
Reimplemented from BCModel.
Definition at line 396 of file BCTemplateFitter.h.
int BCTemplateFitter::fPriorNBins [protected] |
The number of bins for a prior distribution.
Definition at line 499 of file BCTemplateFitter.h.
std::vector< std::vector<TH1D> > BCTemplateFitter::fSystErrorHistogramContainer [protected] |
A matrix of histograms describing systematic uncertainties.
Definition at line 392 of file BCTemplateFitter.h.
std::vector<std::string> BCTemplateFitter::fSystErrorNameContainer [protected] |
A container of names of sources of systematic uncertainties.
Definition at line 406 of file BCTemplateFitter.h.
std::vector<int> BCTemplateFitter::fSystErrorParIndexContainer [protected] |
A container of parameter indeces for sources of systematic uncertainty.
Definition at line 421 of file BCTemplateFitter.h.
std::vector<std::string> BCTemplateFitter::fSystErrorTypeContainer [protected] |
A container of error types.
Definition at line 427 of file BCTemplateFitter.h.
std::vector<TH1D> BCTemplateFitter::fTemplateHistogramContainer [protected] |
A container of template histograms.
Definition at line 380 of file BCTemplateFitter.h.
std::vector<std::string> BCTemplateFitter::fTemplateNameContainer [protected] |
A container of template names.
Definition at line 402 of file BCTemplateFitter.h.
std::vector<int> BCTemplateFitter::fTemplateParIndexContainer [protected] |
A container of parameter indeces for templates.
Definition at line 412 of file BCTemplateFitter.h.
TH2D* BCTemplateFitter::fUncertaintyHistogramExp [protected] |
A 2-d histogram for calculating the error bars
Definition at line 473 of file BCTemplateFitter.h.
TH2D* BCTemplateFitter::fUncertaintyHistogramObsPosterior [protected] |
A 2-d histogram for calculating the error bars
Definition at line 478 of file BCTemplateFitter.h.
double BCTemplateFitter::fXmax [protected] |
The maximum value of the data range.
Definition at line 495 of file BCTemplateFitter.h.
double BCTemplateFitter::fXmin [protected] |
The minimum value of the data range.
Definition at line 491 of file BCTemplateFitter.h.