DEPRECETED class for fitting several templates to a data set. More...
#include <BCTemplateFitter.h>
Inherits BCModel.
Public Member Functions | |
BCTemplateFitter () | |
BCTemplateFitter (const char *name) | |
~BCTemplateFitter () | |
int | GetNTemplates () |
int | GetNTemplatesType (int templatetype) |
int | GetNSystErrors () |
int | GetNDF () |
int | GetNRatios () |
std::vector< TH1D > | GetHistRatios1D () |
std::vector< TH1D > | GetTemplateHistogramContainer () |
std::vector< TF1 > | GetTemplateFunctionContainer () |
TH1D | GetHistRatio1D (int index) |
TH2D * | GetUncertaintyHistogramExp () |
TH2D * | GetUncertaintyHistogramObsPosterior () |
int | GetIndexTemplate (const char *name) |
int | GetIndexSystError (const char *name) |
int | GetParIndexTemplate (const char *name) |
int | GetParIndexTemplate (int index) |
int | GetParIndexEff (const char *name) |
int | GetParIndexSystError (const char *name) |
TH1D | GetData () |
int | GetHistogramIndex (int templatenumber) |
int | GetFunctionIndex (int templatenumber) |
std::vector< int > | GetTemplateParIndexContainer () |
double | Expectation (int binnumber, const std::vector< double > ¶meters) |
double | TemplateEfficiency (int templatenumber, int binnumber, const std::vector< double > ¶meters) |
double | TemplateProbability (int templatenumber, int binnumber, const std::vector< double > ¶meters) |
void | SetFlagPhysicalLimits (bool flag) |
void | SetFlagFixNorm (bool flag) |
void | SetNorm (double norm) |
int | SetData (const TH1D &hist) |
int | FixTemplateFunctions (const std::vector< double > ¶meters) |
int | Initialize () |
int | AddTemplate (TH1D hist, const char *name, double Nmin=0, double Nmax=0) |
int | AddTemplate (TF1 func, const char *name, double Nmin=0, double Nmax=0, const char *options="") |
int | SetTemplateEfficiency (const char *name, double effmean=1., double effsigma=0.) |
int | SetTemplateEfficiency (const char *name, TH1D eff, TH1D efferr) |
int | AddSystError (const char *errorname, const char *errtype="gauss") |
int | SetTemplateSystError (const char *errorname, const char *templatename, TH1D parerror) |
int | ConstrainSum (std::vector< int > indices, double mean, double rms) |
int | CalculateRatio (int index, std::vector< int > indices, double rmin=-1.0, double rmax=1.0) |
int | CompareHistogramProperties (TH1D hist1, TH1D hist2) |
double | CalculateChi2 (const std::vector< double > ¶meters) |
double | CalculateChi2Prob (const std::vector< double > ¶meters) |
double | CalculateMaxLike () |
double | CalculatePValue () |
double | CalculateKSProb () |
void | MCMCUserIterationInterface () |
void | PrintStack (const char *filename="stack.ps", const char *options="LE2E0D") |
void | PrintRatios (const char *filename="ratio.ps", int option=0, double ovalue=0.) |
int | PrintTemplate (const char *name, const char *filename) |
void | PrintTemp () |
TH1D | CreateErrorHist (TH1D hist, TH1D histerr) |
double | LogLikelihood (const std::vector< double > ¶meters) |
int | PerformFit () |
TH1D | CombineUncertainties (const char *name) |
Protected Attributes | |
TH1D | fHistData |
std::vector< TH1D > | fTemplateHistogramContainer |
std::vector< TF1 > | fTemplateFunctionContainer |
std::vector< TH1D > | fEffHistogramContainer |
std::vector< TH1D > | fEffErrHistogramContainer |
std::vector< std::vector< TH1D > > | fSystErrorHistogramContainer |
std::vector< std::string > | fTemplateNameContainer |
std::vector< std::string > | fSystErrorNameContainer |
std::vector< int > | fTemplateParIndexContainer |
std::vector< int > | fHistogramIndexContainer |
std::vector< int > | fFunctionIndexContainer |
std::vector< int > | fEffParIndexContainer |
std::vector< int > | fSystErrorParIndexContainer |
std::vector< std::string > | fSystErrorTypeContainer |
std::vector< int > | fTemplateTypeContainer |
std::vector< std::vector< int > > | fConstraintSumIndices |
std::vector< double > | fConstraintSumMean |
std::vector< double > | fConstraintSumRMS |
TH1D | fHistNorm |
std::vector< std::vector< int > > | fIndicesRatios1D |
std::vector< TH1D > | fHistRatios1D |
bool | fFlagFixNorm |
bool | fFlagPhysicalLimits |
TH2D * | fUncertaintyHistogramExp |
TH2D * | fUncertaintyHistogramObsPosterior |
double | fNorm |
int | fNBins |
double | fXmin |
double | fXmax |
DEPRECETED class for fitting several templates to a data set.
This class is DEPRECETED and it will be removed in the future version of BAT. Use BCMTF instead.
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 40 of file BCTemplateFitter.h.
BCTemplateFitter::BCTemplateFitter | ( | ) |
The default constructor.
Definition at line 32 of file BCTemplateFitter.cxx.
: BCModel() , fFlagFixNorm(false) , fFlagPhysicalLimits(true) , fUncertaintyHistogramExp(0) , fUncertaintyHistogramObsPosterior(0) , fNorm(-1) , fNBins(-1) , fXmin(1.) , fXmax(0.) { BCLog::OutWarning("Class BCTemplateFitter is depreceted and it will be removed"); BCLog::OutWarning("in the future version of BAT. Use the new class BCMTF instead."); }
BCTemplateFitter::BCTemplateFitter | ( | const char * | name | ) |
A constructor.
Definition at line 48 of file BCTemplateFitter.cxx.
: BCModel(name) , fFlagFixNorm(false) , fFlagPhysicalLimits(true) , fUncertaintyHistogramExp(0) , fUncertaintyHistogramObsPosterior(0) , fNorm(-1) , fNBins(-1) , fXmin(1.) , fXmax(0.) { BCLog::OutWarning("Class BCTemplateFitter is depreceted and it will be removed"); BCLog::OutWarning("in the future version of BAT. Use the new class BCMTF instead."); }
BCTemplateFitter::~BCTemplateFitter | ( | ) |
The default destructor.
Definition at line 64 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 406 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("%s", errorname), -dx, dx); // set prior for systematics SetPriorGauss(Form("%s", errorname), 0., 1.); // add name and index to containers fSystErrorNameContainer.push_back(errorname); fSystErrorParIndexContainer.push_back(GetNParameters()-1); // create histogram TH1D hist = TH1D(fHistData); // 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 257 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 (fHistData.Integral() > 0.) { if (CompareHistogramProperties(fHistData, hist) != 1) { BCLog::OutError("BCTemplateFitter::AddTemplate : Data and template histogram properties are incompatible."); return 0; } } else { SetData( TH1D("", "", hist.GetNbinsX(), hist.GetXaxis()->GetXmin(), hist.GetXaxis()->GetXmax()) ); } // 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 = GetNTemplates(); // 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 histsysterror = TH1D(fHistData); // fill histograms for (int i = 1; i <= fNBins; ++i) histsysterror.SetBinContent(i, 0.); // get parameter index int parindex = GetNParameters(); // add a parameter for the expectation value AddParameter(name, Nmin, Nmax); // get efficiency parameter index int effindex = GetNParameters(); // add a parameter for the efficiency AddParameter(Form("Efficiency_%s", name), -5.0, 5.0); // add histogram, name and index to containers fTemplateHistogramContainer.push_back(hist); fHistogramIndexContainer.push_back(GetNTemplatesType(0)); fFunctionIndexContainer.push_back(-1); fTemplateTypeContainer.push_back(0); 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.); // set prior for efficiencies SetPriorGauss(Form("Efficiency_%s", name), 0., 1.); // 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; }
int BCTemplateFitter::AddTemplate | ( | TF1 | func, | |
const char * | name, | |||
double | Nmin = 0 , |
|||
double | Nmax = 0 , |
|||
const char * | options = "" | |||
) |
Definition at line 350 of file BCTemplateFitter.cxx.
{ // 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 parameter index int parindex = GetNParameters(); // add a parameter for the expectation value AddParameter(name, Nmin, Nmax); // get efficiency parameter index int effindex = GetNParameters(); // add a parameter for the efficiency AddParameter(Form("Efficiency_%s", name), -5.0, 5.0); // add all additional parameters int npar = func.GetNpar(); for (int i = 0; i < npar; ++i) { double parmin; double parmax; func.GetParLimits(i, parmin, parmax); AddParameter(func.GetParName(i), parmin, parmax); } // add histogram, name and index to containers fTemplateFunctionContainer.push_back(func); fHistogramIndexContainer.push_back(-1); fFunctionIndexContainer.push_back(GetNTemplatesType(1)); fTemplateTypeContainer.push_back(1); 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.); // set prior for efficiencies SetPriorGauss(Form("Efficiency_%s", name), 0., 1.); // successfully added histogram to container return 1; }
double BCTemplateFitter::CalculateChi2 | ( | const std::vector< double > & | parameters | ) |
Calculates and returns the chi2 value. The chi2 is calculated using the expectation value for the uncertainty.
Definition at line 975 of file BCTemplateFitter.cxx.
{ double chi2 = 0; // loop over bins for (int ibin = 1; ibin <= fNBins; ++ibin) { // get expectation double nexp = Expectation(ibin, parameters); // get data double ndata = fHistData.GetBinContent(ibin); // add to chi2 chi2 += (nexp - ndata) * (nexp - ndata) / nexp; } // return chi2 return chi2; }
double BCTemplateFitter::CalculateChi2Prob | ( | const std::vector< double > & | parameters | ) |
Calculates and returns the chi2-probability.
Definition at line 996 of file BCTemplateFitter.cxx.
{ double chi2 = CalculateChi2(parameters); int ndf = GetNDF(); // return chi2 probability return TMath::Prob(chi2, ndf); }
double BCTemplateFitter::CalculateKSProb | ( | ) |
Calculates and returns the Kolmogorov-Smirnov-probability.
Definition at line 1013 of file BCTemplateFitter.cxx.
{ // create a temporary histogram with the sum of all contributions TH1D * histsum = new TH1D(fHistData); // get best fit parameters std::vector<double> parameters = GetBestFitParameters(); // loop over bins for (int ibin = 1; ibin <= fNBins; ++ibin) { // get expectation double nexp = Expectation(ibin, parameters); // set bin content histsum->SetBinContent(ibin, nexp); } // 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 1006 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 1040 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; } std::vector<int> histogram; std::vector<double> expectation; histogram.assign(fNBins, 0); expectation.assign(fNBins, 0); double logp = 0; double logp_start = 0; int counter_pvalue = 0; // define starting distribution for (int ibin = 1; ibin <= fNBins; ++ibin) { // get expectation double nexp = Expectation(ibin, par); /* 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 < fNBins; ++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 550 of file BCTemplateFitter.cxx.
{ // get number of templates int ntemplates = GetNTemplates(); // 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 1454 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); TH1D hist = TH1D(fHistData); // 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 595 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 1276 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 1426 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; }
double BCTemplateFitter::Expectation | ( | int | binnumber, | |
const std::vector< double > & | parameters | |||
) |
Return the expectation value in a certain bin.
binnumber | The number of the bin. | |
parameters | The parameter values. |
Definition at line 98 of file BCTemplateFitter.cxx.
{ // initialize number of expected events with 0 double nexp = 0; // get number of templates int ntemplates = GetNTemplates(); // loop over all templates for (int itemp = 0; itemp < ntemplates; ++itemp) { // get template index int templateindex = fTemplateParIndexContainer.at(itemp); // calculate efficiency for this template and bin double efficiency = TemplateEfficiency(itemp, binnumber, parameters); // calculate probability for this template and bin double probability = TemplateProbability(itemp, binnumber, parameters); // calculate expectation value for this template nexp += parameters.at(templateindex) * efficiency * probability; } // check that expectation is larger or equal to zero if (nexp < 0) { BCLog::OutWarning("BCTemplateFitter::Expectation : Expectation value smaller than 0. Force it to be 0."); nexp = 0; } return nexp; }
int BCTemplateFitter::FixTemplateFunctions | ( | const std::vector< double > & | parameters | ) |
Definition at line 200 of file BCTemplateFitter.cxx.
{ // get number of templates int ntemplates = GetNTemplates(); // fix all function parameters for (int i = 0; i < ntemplates; ++i) { if (fTemplateTypeContainer.at(i) == 1) { int index = GetFunctionIndex(i); TF1* func = &(fTemplateFunctionContainer.at(index)); int npar = func->GetNpar(); int tempindex = GetParIndexTemplate(i); for (int i = 0; i < npar; ++i) { func->FixParameter(i, parameters.at(tempindex+2+i)); } } } // no errors return 1; }
TH1D BCTemplateFitter::GetData | ( | ) | [inline] |
Return a template histogram.
name | The template name. Return the histogram containing the data. |
Definition at line 164 of file BCTemplateFitter.h.
{ return fHistData; }
int BCTemplateFitter::GetFunctionIndex | ( | int | templatenumber | ) | [inline] |
Get function index of template. The number of the template
Definition at line 178 of file BCTemplateFitter.h.
{ return fFunctionIndexContainer.at(templatenumber); };
int BCTemplateFitter::GetHistogramIndex | ( | int | templatenumber | ) | [inline] |
Get histogram index of template. The number of the template
Definition at line 171 of file BCTemplateFitter.h.
{ return fHistogramIndexContainer.at(templatenumber); };
TH1D BCTemplateFitter::GetHistRatio1D | ( | int | index | ) | [inline] |
Return a ratio histogram
Definition at line 110 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 92 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 1513 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 1494 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 80 of file BCTemplateFitter.h.
{ return fHistData.GetNbinsX() - GetNParameters(); }
int BCTemplateFitter::GetNRatios | ( | ) | [inline] |
Return the number of ratios to calculate.
Definition at line 86 of file BCTemplateFitter.h.
{ return int(fHistRatios1D.size()); }
int BCTemplateFitter::GetNSystErrors | ( | ) | [inline] |
Return the number of sources of systematic uncertainties.
Definition at line 74 of file BCTemplateFitter.h.
{ return int(fSystErrorParIndexContainer.size()); }
int BCTemplateFitter::GetNTemplates | ( | ) | [inline] |
Return the number of templates.
Definition at line 62 of file BCTemplateFitter.h.
{ return int(fTemplateParIndexContainer.size()); }
int BCTemplateFitter::GetNTemplatesType | ( | int | templatetype | ) |
Return the number of templates of a certain type
templatetype | the type of the template |
Definition at line 1623 of file BCTemplateFitter.cxx.
{ // get number of templates int ntemplates = GetNTemplates(); // initialize counter to zero int counter = 0; // loop over all templates for (int i = 0; i < ntemplates; ++i) { // increase counter if template of same type if (templatetype == fTemplateTypeContainer.at(i)) counter++; } // return counter return counter; }
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 1566 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 1585 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 1532 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 1551 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); }
std::vector<TF1> BCTemplateFitter::GetTemplateFunctionContainer | ( | ) | [inline] |
Return the container of template functions.
Definition at line 104 of file BCTemplateFitter.h.
{ return fTemplateFunctionContainer; };
std::vector<TH1D> BCTemplateFitter::GetTemplateHistogramContainer | ( | ) | [inline] |
Return the container of template histograms.
Definition at line 98 of file BCTemplateFitter.h.
{ return fTemplateHistogramContainer; };
std::vector<int> BCTemplateFitter::GetTemplateParIndexContainer | ( | ) | [inline] |
Return container of parameter indeces for templates
Definition at line 184 of file BCTemplateFitter.h.
{ return fTemplateParIndexContainer; };
TH2D* BCTemplateFitter::GetUncertaintyHistogramExp | ( | ) | [inline] |
Definition at line 113 of file BCTemplateFitter.h.
{ return fUncertaintyHistogramExp; };
TH2D* BCTemplateFitter::GetUncertaintyHistogramObsPosterior | ( | ) | [inline] |
Definition at line 116 of file BCTemplateFitter.h.
{ return fUncertaintyHistogramObsPosterior; };
int BCTemplateFitter::Initialize | ( | ) |
Initialize the fitting procedure.
Definition at line 490 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(); double minimum = TMath::Max(0., fHistData.GetMinimum() - 5.*sqrt(fHistData.GetMinimum())); double maximum = fHistData.GetMaximum() + 5.*sqrt(fHistData.GetMaximum()); std::vector<double> a(fHistData.GetNbinsX()+1); for (int i = 0; i < fHistData.GetNbinsX()+1; ++i) { a[i] = fHistData.GetXaxis()->GetBinLowEdge(i+1); } fUncertaintyHistogramExp = new TH2D( TString::Format("UncertaintyExp_%i", BCLog::GetHIndex()), "", // fHistData.GetNbinsX(), fHistData.GetXaxis()->GetXbins()->GetArray(), fHistData.GetNbinsX(), &a[0], // fHistData.GetNbinsX(), fHistData.GetXaxis()->GetXmin(), fHistData.GetXaxis()->GetXmax(), 100, minimum, maximum); fUncertaintyHistogramObsPosterior = new TH2D( TString::Format("UncertaintyObsPosterior_%i", BCLog::GetHIndex()), "", fHistData.GetNbinsX(), &a[0], // fHistData.GetNbinsX(), fHistData.GetXaxis()->GetXbins()->GetArray(), // 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 = GetNTemplates(); // 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::LogLikelihood | ( | const std::vector< double > & | parameters | ) | [virtual] |
Calculates and returns the log of the Likelihood at a given point in parameter space.
Implements BCModel.
Definition at line 74 of file BCTemplateFitter.cxx.
{ double logprob = 0.; // fix the parameters of all functions FixTemplateFunctions(parameters); // loop over bins for (int ibin = 1; ibin <= fNBins; ++ibin) { // get expectation double nexp = Expectation(ibin, parameters); // get data double ndata = fHistData.GetBinContent(ibin); // 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 1143 of file BCTemplateFitter.cxx.
{ // loop over all bins for (int ibin = 1; ibin <= fNBins; ++ibin) { // get bin content double bincontent = Expectation(ibin, fMCMCx); // 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 1604 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 1183 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(); // free memory 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 614 of file BCTemplateFitter.cxx.
{ int nbins = fHistData.GetNbinsX(); int ntemplates = GetNTemplates(); // 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 bool flag_logx = false; // plot x-axis in log-scale bool flag_logy = false; // plot y-axis in log-scale 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; if (std::string(options).find("logx") < std::string(options).size()) flag_logx = true; if (std::string(options).find("logy") < std::string(options).size()) flag_logy = 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); if (flag_logx) { pad1->SetLogx(); pad2->SetLogx(); } if (flag_logy) pad1->SetLogy(); pad1->Draw(); pad2->Draw(); } else { pad1 = new TPad("pad1", "",0.0, 0.0, 1.0, 1.0); pad1->SetFillColor(kWhite); pad2 = new TPad(); if (flag_logx) pad1->SetLogx(); if (flag_logy) pad1->SetLogy(); 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"); TH1D * histsum = new TH1D(fHistData); // 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); // create new histograms for plotting std::vector<TH1D*> histcontainer; // get best fit parameters std::vector<double> parameters = GetBestFitParameters(); // fix the parameters of all functions FixTemplateFunctions(parameters); // scale histograms and add to stack and legend for (int itemp = 0; itemp < ntemplates; ++itemp) { // get template index int templateindex = fTemplateParIndexContainer.at(itemp); // create new histogram TH1D* hist; if (fTemplateTypeContainer[itemp] == 0) { int histogramindex = GetHistogramIndex(itemp); hist = new TH1D( fTemplateHistogramContainer.at(histogramindex) ); } else if (fTemplateTypeContainer[itemp] == 1) { hist = new TH1D( fHistData ); for (int i = 1; i <= fNBins; ++i) { double bincenter = fHistData.GetBinCenter(i); int index = GetFunctionIndex(itemp); double bincontent = fTemplateFunctionContainer.at(index).Eval(bincenter); hist->SetBinContent(i, bincontent); } // scale histogram hist->Scale(1.0/hist->Integral()); } // set histogram color and style hist->SetFillColor(2 + itemp); hist->SetFillStyle(1001); hist->SetStats(kFALSE); // add histogram to list of histograms histcontainer.push_back(hist); // loop over bins and set them for (int ibin = 1; ibin <= fNBins; ++ibin) { // calculate efficiency for this template and bin double efficiency = TemplateEfficiency(itemp, ibin, parameters); // calculate probability for this template and bin double probability = TemplateProbability(itemp, ibin, parameters); // calculate expectation value for this template double nexp = parameters.at(templateindex) * efficiency * probability; // set bin content hist->SetBinContent(ibin, nexp); } // add histogram to stack stack.Add(hist); if (itemp < 2) legend1->AddEntry(hist, fTemplateNameContainer.at(itemp).data(), "F"); else if (itemp < 6) legend2->AddEntry(hist, fTemplateNameContainer.at(itemp).data(), "F"); } // loop over all bins for (int ibin = 1; ibin <= nbins; ++ibin) { // set bin content histsum->SetBinContent(ibin, Expectation(ibin, parameters)); } // 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 = new TH1D(*histsum); std::vector<double> a(fHistData.GetNbinsX()+1); for (int i = 0; i < fHistData.GetNbinsX()+1; ++i) { a[i] = fHistData.GetXaxis()->GetBinLowEdge(i+1); } hist_diff = new TH1D("hist_diff", "", nbins, &a[0]); hist_diff->SetName("hist_diff"); 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(TMath::Floor(-1.1*TMath::Max(-ymin, ymax)), TMath::Ceil(1.1*TMath::Max(-ymin, ymax))); } // draw histograms stack.Draw("SAMEAF"); 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); // 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 1288 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 1304 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 222 of file BCTemplateFitter.cxx.
{ // compare previous data set with this one if (fHistData.Integral() > 0.) { if (CompareHistogramProperties(fHistData, hist) != 1) { BCLog::OutError("BCTemplateFitter::SetData : Data and this histogram properties are incompatible."); return 0; } } // create histogram fNBins = hist.GetNbinsX(); fXmin = (hist.GetXaxis())->GetXmin(); fXmax = (hist.GetXaxis())->GetXmax(); fHistData = TH1D(hist); // 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 223 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 216 of file BCTemplateFitter.h.
{ fFlagPhysicalLimits = flag; }
void BCTemplateFitter::SetNorm | ( | double | norm | ) | [inline] |
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 1247 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(fHistData); TH1D histefferr = TH1D(fHistData); // 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::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 1213 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 (fTemplateTypeContainer[index]==0) 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::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 459 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; }
double BCTemplateFitter::TemplateEfficiency | ( | int | templatenumber, | |
int | binnumber, | |||
const std::vector< double > & | parameters | |||
) |
Return the efficiency of a template in a certain bin.
templatenumber | The number of the template. | |
binnumber | The bin number. | |
parameters | The parameter values. |
Definition at line 134 of file BCTemplateFitter.cxx.
{ // get number of sources of systematic uncertainties int nsyst = GetNSystErrors(); // get efficiency index int effindex = fEffParIndexContainer.at(templatenumber); // get efficiency for the bin double efficiency = fEffHistogramContainer.at(templatenumber).GetBinContent(binnumber); // modify efficiency by uncertainty double efferr = fEffErrHistogramContainer.at(templatenumber).GetBinContent(binnumber); // check that efficiency error is larger than 0 // add efficiency contribution from template 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(templatenumber).GetBinContent(binnumber); // add efficiency contribution from systematic efficiency += parameters.at(systindex) * deff; } // make sure efficiency is between 0 and 1 if (efficiency < 0.) efficiency = 0.; if (efficiency > 1.) efficiency = 1.; // return efficiency return efficiency; }
double BCTemplateFitter::TemplateProbability | ( | int | templatenumber, | |
int | binnumber, | |||
const std::vector< double > & | parameters | |||
) |
Return the probability of a template in a certain bin.
templateindex | The number of the template. | |
binnumber | The bin number. | |
parameters | The parameter values. |
Definition at line 175 of file BCTemplateFitter.cxx.
{ // initialize probability double probability = 0; // get template type int templatetype = fTemplateTypeContainer[templatenumber]; // calculate probability from template histogram if (templatetype == 0) { int index = GetHistogramIndex(templatenumber); probability = fTemplateHistogramContainer.at(index).GetBinContent(binnumber); } else if (templatetype == 1) { double bincenter = fHistData.GetBinCenter(binnumber); int index = GetFunctionIndex(templatenumber); probability = fTemplateFunctionContainer.at(index).Eval(bincenter); } // return probability return probability; }
std::vector< std::vector<int> > BCTemplateFitter::fConstraintSumIndices [protected] |
A container for constrained sums: indices.
Definition at line 502 of file BCTemplateFitter.h.
std::vector< double > BCTemplateFitter::fConstraintSumMean [protected] |
A container for constrained sums: mean values.
Definition at line 507 of file BCTemplateFitter.h.
std::vector< double > BCTemplateFitter::fConstraintSumRMS [protected] |
A container for constrained sums: mean values.
Definition at line 512 of file BCTemplateFitter.h.
std::vector<TH1D> BCTemplateFitter::fEffErrHistogramContainer [protected] |
A container of efficiency uncertainty histograms.
Definition at line 447 of file BCTemplateFitter.h.
std::vector<TH1D> BCTemplateFitter::fEffHistogramContainer [protected] |
A container of efficiency histograms.
Definition at line 443 of file BCTemplateFitter.h.
std::vector<int> BCTemplateFitter::fEffParIndexContainer [protected] |
A container of parameter indeces for efficiencies.
Definition at line 479 of file BCTemplateFitter.h.
bool BCTemplateFitter::fFlagFixNorm [protected] |
Flag for fixing the normalization or not
Definition at line 532 of file BCTemplateFitter.h.
bool BCTemplateFitter::fFlagPhysicalLimits [protected] |
Flag for having physical limits (expectation values greater or equal to 0).
Definition at line 538 of file BCTemplateFitter.h.
std::vector<int> BCTemplateFitter::fFunctionIndexContainer [protected] |
A container of function indeces for templates.
Definition at line 475 of file BCTemplateFitter.h.
TH1D BCTemplateFitter::fHistData [protected] |
The data histogram.
Definition at line 429 of file BCTemplateFitter.h.
TH1D BCTemplateFitter::fHistNorm [protected] |
Histogram containing the overall number of expected events.
Definition at line 517 of file BCTemplateFitter.h.
std::vector<int> BCTemplateFitter::fHistogramIndexContainer [protected] |
A container of histogram indeces for templates.
Definition at line 471 of file BCTemplateFitter.h.
std::vector<TH1D> BCTemplateFitter::fHistRatios1D [protected] |
1-D histograms containing ratios.
Definition at line 527 of file BCTemplateFitter.h.
std::vector< std::vector<int> > BCTemplateFitter::fIndicesRatios1D [protected] |
Vector of indices for the calculation of ratios.
Definition at line 522 of file BCTemplateFitter.h.
int BCTemplateFitter::fNBins [protected] |
The number of bins in the data.
Definition at line 557 of file BCTemplateFitter.h.
double BCTemplateFitter::fNorm [protected] |
Normalization constant
Definition at line 553 of file BCTemplateFitter.h.
std::vector< std::vector<TH1D> > BCTemplateFitter::fSystErrorHistogramContainer [protected] |
A matrix of histograms describing systematic uncertainties.
Definition at line 451 of file BCTemplateFitter.h.
std::vector<std::string> BCTemplateFitter::fSystErrorNameContainer [protected] |
A container of names of sources of systematic uncertainties.
Definition at line 461 of file BCTemplateFitter.h.
std::vector<int> BCTemplateFitter::fSystErrorParIndexContainer [protected] |
A container of parameter indeces for sources of systematic uncertainty.
Definition at line 484 of file BCTemplateFitter.h.
std::vector<std::string> BCTemplateFitter::fSystErrorTypeContainer [protected] |
A container of error types.
Definition at line 490 of file BCTemplateFitter.h.
std::vector<TF1> BCTemplateFitter::fTemplateFunctionContainer [protected] |
A container of template functions.
Definition at line 439 of file BCTemplateFitter.h.
std::vector<TH1D> BCTemplateFitter::fTemplateHistogramContainer [protected] |
A container of template histograms.
Definition at line 435 of file BCTemplateFitter.h.
std::vector<std::string> BCTemplateFitter::fTemplateNameContainer [protected] |
A container of template names.
Definition at line 457 of file BCTemplateFitter.h.
std::vector<int> BCTemplateFitter::fTemplateParIndexContainer [protected] |
A container of parameter indeces for templates.
Definition at line 467 of file BCTemplateFitter.h.
std::vector<int> BCTemplateFitter::fTemplateTypeContainer [protected] |
A container for template types.
0: histogram 1: function
Definition at line 497 of file BCTemplateFitter.h.
TH2D* BCTemplateFitter::fUncertaintyHistogramExp [protected] |
A 2-d histogram for calculating the error bars
Definition at line 543 of file BCTemplateFitter.h.
TH2D* BCTemplateFitter::fUncertaintyHistogramObsPosterior [protected] |
A 2-d histogram for calculating the error bars
Definition at line 548 of file BCTemplateFitter.h.
double BCTemplateFitter::fXmax [protected] |
The maximum value of the data range.
Definition at line 565 of file BCTemplateFitter.h.
double BCTemplateFitter::fXmin [protected] |
The minimum value of the data range.
Definition at line 561 of file BCTemplateFitter.h.