A class for ... More...
#include <BCMTF.h>
Inherits BCModel.

Public Member Functions | |
| BCMTF () | |
| BCMTF (const char *name) | |
| ~BCMTF () | |
| int | GetNChannels () |
| int | GetNProcesses () |
| int | GetNSystematics () |
| int | GetChannelIndex (const char *name) |
| int | GetProcessIndex (const char *name) |
| int | GetSystematicIndex (const char *name) |
| int | GetParIndexProcess (int index) |
| int | GetParIndexSystematic (int index) |
| BCMTFChannel * | GetChannel (int index) |
| BCMTFProcess * | GetProcess (int index) |
| BCMTFSystematic * | GetSystematic (int index) |
| int | AddChannel (const char *name) |
| int | AddProcess (const char *name, double nmin=0., double nmax=1.) |
| int | AddSystematic (const char *name, double min=-5., double max=5.) |
| int | SetTemplate (const char *channelname, const char *processname, TH1D hist, double efficiency=1.) |
| int | SetTemplate (const char *channelname, const char *processname, std::vector< TF1 * > *funccont, int nbins, double efficiency=1.) |
| int | SetSystematicVariation (const char *channelname, const char *processname, const char *systematicname, double variation_up, double variation_down) |
| int | SetSystematicVariation (const char *channelname, const char *processname, const char *systematicname, TH1D hist_up, TH1D hist_down) |
| int | SetSystematicVariation (const char *channelname, const char *processname, const char *systematicname, TH1D hist, TH1D hist_up, TH1D hist_down) |
| int | SetData (const char *channelname, TH1D hist) |
| void | SetFlagEfficiencyConstraint (bool flag) |
| void | SetExpectationFunction (int parindex, TF1 *func) |
| int | PrintSummary (const char *filename="summary.txt") |
| double | Expectation (int channelindex, int binindex, const std::vector< double > ¶meters) |
| double | ExpectationFunction (int parindex, int channelindex, int processindex, const std::vector< double > ¶meters) |
| double | Efficiency (int channelindex, int processindex, int binindex, const std::vector< double > ¶meters) |
| double | Probability (int channelindex, int processindex, int binindex, const std::vector< double > ¶meters) |
| int | PrintStack (int channelindex, const std::vector< double > ¶meters, const char *filename="stack.eps", const char *options="") |
| int | PrintStack (const char *channelname, const std::vector< double > ¶meters, const char *filename="stack.eps", const char *options="") |
| double | CalculateChi2 (int channelindex, const std::vector< double > ¶meters) |
| double | CalculateChi2 (const std::vector< double > ¶meters) |
| double | CalculateCash (int channelindex, const std::vector< double > ¶meters) |
| double | CalculateCash (const std::vector< double > ¶meters) |
| double | LogLikelihood (const std::vector< double > ¶meters) |
Private Attributes | |
| std::vector< BCMTFChannel * > | fChannelContainer |
| std::vector< BCMTFProcess * > | fProcessContainer |
| std::vector< BCMTFSystematic * > | fSystematicContainer |
| int | fNChannels |
| int | fNProcesses |
| int | fNSystematics |
| std::vector< int > | fProcessParIndexContainer |
| std::vector< int > | fSystematicParIndexContainer |
| bool | fFlagEfficiencyConstraint |
| std::vector< TF1 * > | fExpectationFunctionContainer |
A class for ...
Definition at line 37 of file BCMTF.h.
| BCMTF::BCMTF | ( | ) |
Definition at line 31 of file BCMTF.cxx.
: BCModel("Multi-template Fitter") , fNChannels(0) , fNProcesses(0) , fNSystematics(0) , fFlagEfficiencyConstraint(false) {}
| BCMTF::BCMTF | ( | const char * | name | ) |
Definition at line 40 of file BCMTF.cxx.
: BCModel(name) , fNChannels(0) , fNProcesses(0) , fNSystematics(0) , fFlagEfficiencyConstraint(false) {}
| BCMTF::~BCMTF | ( | ) |
Definition at line 49 of file BCMTF.cxx.
{
for (int i = 0; i < fNChannels; ++i)
delete fChannelContainer.at(i);
}
| int BCMTF::AddChannel | ( | const char * | name | ) |
Definition at line 233 of file BCMTF.cxx.
{
// check if channel exists
for (int i = 0; i < fNChannels; ++i) {
// compare names
if (GetChannelIndex(name) >= 0) {
BCLog::OutWarning("BCMultitemplateFitter::AddChannel() : Channel with this name exists already.");
return -1;
}
}
// create new channel
BCMTFChannel * channel = new BCMTFChannel(name);
// create new data
BCMTFTemplate * bctemplate = new BCMTFTemplate(channel->GetName().c_str(), "data");
// add data
channel->SetData(bctemplate);
// add process templates
for (int i = 0; i < fNProcesses; ++i) {
// get process
BCMTFProcess * process = GetProcess(i);
// create new template
BCMTFTemplate * bctemplate = new BCMTFTemplate(name, process->GetName().c_str());
// add template
channel->AddTemplate(bctemplate);
}
// loop over all systematics
for (int i = 0; i < fNSystematics; ++i) {
// get systematic
BCMTFSystematic * systematic = GetSystematic(i);
// create new systematic variation
BCMTFSystematicVariation * variation = new BCMTFSystematicVariation(name, systematic->GetName().c_str(), fNProcesses);
// add systematic variation
channel->AddSystematicVariation(variation);
}
// add channel
fChannelContainer.push_back(channel);
// increase number of channels
fNChannels++;
// no error
return 1;
}
| int BCMTF::AddProcess | ( | const char * | name, | |
| double | nmin = 0., |
|||
| double | nmax = 1. | |||
| ) |
Definition at line 288 of file BCMTF.cxx.
{
// check if process exists
for (int i = 0; i < fNProcesses; ++i) {
// compare names
if (GetProcessIndex(name) >= 0) {
BCLog::OutWarning("BCMultitemplateFitter::AddProcess() : Process with this name exists already.");
return -1;
}
}
// create new process
BCMTFProcess * process = new BCMTFProcess(name);
// add process
fProcessContainer.push_back(process);
// add process templates
for (int i = 0; i < fNChannels; ++i) {
// get channel
BCMTFChannel * channel = GetChannel(i);
// create new template
BCMTFTemplate * bctemplate = new BCMTFTemplate(channel->GetName().c_str(), name);
// add template
channel->AddTemplate(bctemplate);
// loop over all systematic
for (int j = 0; j < fNSystematics; ++j) {
// get systematic variation
BCMTFSystematicVariation * variation = channel->GetSystematicVariation(j);
// add histogram
variation->AddHistograms(0, 0);
}
}
// increase number of processes
fNProcesses++;
// add parameter index to container
fProcessParIndexContainer.push_back(GetNParameters());
// add parameter
AddParameter(name, nmin, nmax);
// add a functional form for the expectation
fExpectationFunctionContainer.push_back(0);
// no error
return 1;
}
| int BCMTF::AddSystematic | ( | const char * | name, | |
| double | min = -5., |
|||
| double | max = 5. | |||
| ) |
Definition at line 343 of file BCMTF.cxx.
{
// check if systematic exists
for (int i = 0; i < fNSystematics; ++i) {
// compare names
if (GetSystematicIndex(name) >= 0) {
BCLog::OutWarning("BCMultitemplateFitter::AddSystematic() : Systematic with this name exists already.");
return -1;
}
}
// create new systematic
BCMTFSystematic * systematic = new BCMTFSystematic(name);
// add systematic
fSystematicContainer.push_back(systematic);
// add systematic variations
for (int i = 0; i < fNChannels; ++i) {
// get channel
BCMTFChannel * channel = GetChannel(i);
// create new systematic variation
BCMTFSystematicVariation * variation = new BCMTFSystematicVariation(channel->GetName().c_str(), name, fNProcesses);
// add systematic variation
channel->AddSystematicVariation(variation);
}
// ...
// increase number of systematices
fNSystematics++;
// add parameter index to container
fSystematicParIndexContainer.push_back(GetNParameters());
// add parameter
AddParameter(name, min, max);
// add a functional form for the expectation
fExpectationFunctionContainer.push_back(0);
// no error
return 1;
}
| double BCMTF::CalculateCash | ( | int | channelindex, | |
| const std::vector< double > & | parameters | |||
| ) |
Definition at line 905 of file BCMTF.cxx.
{
if (parameters.size() == 0)
return -1;
double cash = 0;
// get channel
BCMTFChannel * channel = GetChannel(channelindex);
// get data
BCMTFTemplate * data = channel->GetData();
// get histogram
TH1D * hist = data->GetHistogram();
// check if histogram exists
if (hist) {
// get number of bins in data
int nbins = hist->GetNbinsX();
// loop over all bins
for (int ibin = 1; ibin <= nbins; ++ibin) {
// get expectation value
double expectation = Expectation(channelindex, ibin, parameters);
// get observation
double observation = hist->GetBinContent(ibin);
// calculate Cash statistic
cash += 2. * (expectation - observation);
// check negative log
if (observation > 0)
cash += 2. * observation * log (observation/expectation);
}
}
// return cash;
return cash;
}
| double BCMTF::CalculateCash | ( | const std::vector< double > & | parameters | ) |
Definition at line 949 of file BCMTF.cxx.
{
if (parameters.size() == 0)
return -1;
double cash = 0;
// get number of channels
int nchannels = GetNChannels();
// loop over all channels
for (int i = 0; i < nchannels; ++i) {
cash += CalculateCash(i, parameters);
}
// return cash
return cash;
}
| double BCMTF::CalculateChi2 | ( | int | channelindex, | |
| const std::vector< double > & | parameters | |||
| ) |
Definition at line 846 of file BCMTF.cxx.
{
if (parameters.size() == 0)
return -1;
double chi2 = 0;
// get channel
BCMTFChannel * channel = GetChannel(channelindex);
// get data
BCMTFTemplate * data = channel->GetData();
// get histogram
TH1D * hist = data->GetHistogram();
// check if histogram exists
if (hist) {
// get number of bins in data
int nbins = hist->GetNbinsX();
// loop over all bins
for (int ibin = 1; ibin <= nbins; ++ibin) {
// get expectation value
double expectation = Expectation(channelindex, ibin, parameters);
// get observation
double observation = hist->GetBinContent(ibin);
// add Poisson term
chi2 += (expectation - observation) * (expectation - observation) / expectation;
}
}
// return chi2;
return chi2;
}
| double BCMTF::CalculateChi2 | ( | const std::vector< double > & | parameters | ) |
Definition at line 885 of file BCMTF.cxx.
{
if (parameters.size() == 0)
return -1;
double chi2 = 0;
// get number of channels
int nchannels = GetNChannels();
// loop over all channels
for (int i = 0; i < nchannels; ++i) {
chi2 += CalculateChi2(i, parameters);
}
// return chi2
return chi2;
}
| double BCMTF::Efficiency | ( | int | channelindex, | |
| int | processindex, | |||
| int | binindex, | |||
| const std::vector< double > & | parameters | |||
| ) |
Definition at line 637 of file BCMTF.cxx.
{
// get channel
BCMTFChannel * channel = fChannelContainer[channelindex];
double efficiency = channel->GetTemplate(processindex)->GetEfficiency();
double defficiency = 1.;
// loop over all systematics
for (int i = 0; i < fNSystematics; ++i) {
if (!(fSystematicContainer[i]->GetFlagSystematicActive()))
continue;
// get parameter index
int parindex = fSystematicParIndexContainer[i];
// get histogram
TH1D * hist = 0;
if (parameters[parindex] > 0)
hist = channel->GetSystematicVariation(i)->GetHistogramUp(processindex);
else
hist = channel->GetSystematicVariation(i)->GetHistogramDown(processindex);
// check if histogram exists
if (!hist)
continue;
// multiply efficiency
defficiency += parameters[parindex] * hist->GetBinContent(binindex);
}
// calculate efficiency
efficiency *= defficiency;
// make sure efficiency is between 0 and 1
if (fFlagEfficiencyConstraint) {
if (efficiency < 0.)
efficiency = 0.;
if (efficiency > 1.)
efficiency = 1.;
}
return efficiency;
}
| double BCMTF::Expectation | ( | int | channelindex, | |
| int | binindex, | |||
| const std::vector< double > & | parameters | |||
| ) |
Definition at line 590 of file BCMTF.cxx.
{
double expectation = 0.;
// loop over all processes
for (int i = 0; i < fNProcesses; ++i) {
// get efficiency
double efficiency = Efficiency(channelindex, i, binindex, parameters);
// get probability
double probability = Probability(channelindex, i, binindex, parameters);
// get parameter index
int parindex = fProcessParIndexContainer[i];
// add to expectation
expectation += ExpectationFunction(parindex, channelindex, i, parameters)
* efficiency
* probability;
}
// check if expectation is positive
if (expectation < 0)
expectation = 0.;
return expectation;
}
| double BCMTF::ExpectationFunction | ( | int | parindex, | |
| int | channelindex, | |||
| int | processindex, | |||
| const std::vector< double > & | parameters | |||
| ) |
Definition at line 619 of file BCMTF.cxx.
{
// get function container
std::vector<TF1 *> * funccont = fChannelContainer[channelindex]->GetTemplate(processindex)->GetFunctionContainer();
if (funccont->size()>0)
return 1.;
else if (!fExpectationFunctionContainer[parindex])
return parameters[parindex];
else {
TF1 * func = fExpectationFunctionContainer[parindex];
return func->Eval(parameters[parindex]);
}
}
| BCMTFChannel* BCMTF::GetChannel | ( | int | index | ) | [inline] |
Definition at line 81 of file BCMTF.h.
{ return fChannelContainer.at(index); };
| int BCMTF::GetChannelIndex | ( | const char * | name | ) |
Definition at line 57 of file BCMTF.cxx.
{
// loop over all channels and compare names
for (int i = 0; i < fNChannels; ++i) {
// get channel
BCMTFChannel * channel = GetChannel(i);
// compare names
if (!channel->GetName().compare(name))
return i;
}
// if channel does not exist, return -1
return -1;
}
| int BCMTF::GetNChannels | ( | ) | [inline] |
Definition at line 52 of file BCMTF.h.
{ return fNChannels; };
| int BCMTF::GetNProcesses | ( | ) | [inline] |
Definition at line 56 of file BCMTF.h.
{ return fNProcesses; };
| int BCMTF::GetNSystematics | ( | ) | [inline] |
Definition at line 60 of file BCMTF.h.
{ return fNSystematics; };
| int BCMTF::GetParIndexProcess | ( | int | index | ) | [inline] |
Definition at line 73 of file BCMTF.h.
{ return fProcessParIndexContainer.at(index); };
| int BCMTF::GetParIndexSystematic | ( | int | index | ) | [inline] |
Definition at line 77 of file BCMTF.h.
{ return fSystematicParIndexContainer.at(index); };
| BCMTFProcess* BCMTF::GetProcess | ( | int | index | ) | [inline] |
Definition at line 85 of file BCMTF.h.
{ return fProcessContainer.at(index); };
| int BCMTF::GetProcessIndex | ( | const char * | name | ) |
Definition at line 74 of file BCMTF.cxx.
{
// loop over all processs and compare names
for (int i = 0; i < fNProcesses; ++i) {
// get process
BCMTFProcess * process = GetProcess(i);
// compare names
if (!process->GetName().compare(name))
return i;
}
// if process does not exist, return -1
return -1;
}
| BCMTFSystematic* BCMTF::GetSystematic | ( | int | index | ) | [inline] |
Definition at line 89 of file BCMTF.h.
{ return fSystematicContainer.at(index); };
| int BCMTF::GetSystematicIndex | ( | const char * | name | ) |
Definition at line 91 of file BCMTF.cxx.
{
// loop over all systematics and compare names
for (int i = 0; i < fNSystematics; ++i) {
// get systematic
BCMTFSystematic * systematic = GetSystematic(i);
// compare names
if (!systematic->GetName().compare(name))
return i;
}
// if process does not exist, return -1
return -1;
}
| double BCMTF::LogLikelihood | ( | const std::vector< double > & | params | ) | [virtual] |
Calculates natural logarithm of the likelihood. Method needs to be overloaded by the user.
| params | A set of parameter values |
Implements BCModel.
Definition at line 969 of file BCMTF.cxx.
{
double logprob = 0.;
// loop over all channels
for (int ichannel = 0; ichannel < fNChannels; ++ichannel) {
// get channel
BCMTFChannel * channel = fChannelContainer[ichannel];
// check if channel is active
if (!(channel->GetFlagChannelActive()))
continue;
// get data
BCMTFTemplate * data = channel->GetData();
// get histogram
TH1D * hist = data->GetHistogram();
// check if histogram exists
if (!hist)
continue;
// get number of bins in data
int nbins = data->GetNBins();
// loop over all bins
for (int ibin = 1; ibin <= nbins; ++ibin) {
// get expectation value
double expectation = Expectation(ichannel, ibin, parameters);
// get observation
double observation = hist->GetBinContent(ibin);
// add Poisson term
logprob += BCMath::LogPoisson(observation, expectation);
}
}
return logprob;
}
| int BCMTF::PrintStack | ( | const char * | channelname, | |
| const std::vector< double > & | parameters, | |||
| const char * | filename = "stack.eps", |
|||
| const char * | options = "" | |||
| ) |
Definition at line 706 of file BCMTF.cxx.
{
int index = GetChannelIndex(channelname);
return PrintStack(index, parameters, filename, options);
}
| int BCMTF::PrintStack | ( | int | channelindex, | |
| const std::vector< double > & | parameters, | |||
| const char * | filename = "stack.eps", |
|||
| const char * | options = "" | |||
| ) |
Definition at line 714 of file BCMTF.cxx.
{
// check if parameters are filled
if (!parameters.size())
return -1;
// check options
bool flag_logx = false; // plot x-axis in log-scale
bool flag_logy = false; // plot y-axis in log-scale
bool flag_bw = false; // plot in black and white
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;
if (std::string(options).find("bw") < std::string(options).size())
flag_bw = true;
// get channel
BCMTFChannel * channel = GetChannel(channelindex);
// create canvas
TCanvas * c1 = new TCanvas();
c1->cd();
// set log or linear scale
if (flag_logx)
c1->SetLogx();
if (flag_logy)
c1->SetLogy();
// create stack
THStack * stack = new THStack("", "");
// create a container of temporary histograms
std::vector<TH1D *> histcontainer;
// get number of templates
unsigned int ntemplates = GetNProcesses();
// loop over all templates
for (unsigned int i = 0; i < ntemplates; ++i) {
// get histogram
TH1D * temphist = channel->GetTemplate(i)->GetHistogram();
// get function container
std::vector<TF1 *> * funccont = channel->GetTemplate(i)->GetFunctionContainer();
// create new histogram
TH1D * hist(0);
if (temphist)
hist = new TH1D( *(temphist) );
else if (funccont)
hist = new TH1D( *(channel->GetData()->GetHistogram()));
else
continue;
if (flag_bw) {
hist->SetFillColor(0);
hist->SetLineWidth(0);
hist->SetLineStyle(int(1+i));
}
else {
hist->SetFillColor(2 + i);
hist->SetFillStyle(1001);
}
// get number of bins
int nbins = hist->GetNbinsX();
// scale histogram
for (int ibin = 1; ibin <= nbins; ++ibin) {
// get efficiency
double efficiency = Efficiency(channelindex, i, ibin, parameters);
// get probability
double probability = Probability(channelindex, i, ibin, parameters);
// get parameter index
int parindex = GetParIndexProcess(i);
// add to expectation
double expectation = parameters[parindex] * efficiency * probability;
// set bin content
hist->SetBinContent(ibin, expectation);
}
// add histogram to container (for memory management)
histcontainer.push_back(hist);
// add histogram to stack
stack->Add(hist);
}
//draw data
channel->GetData()->GetHistogram()->Draw("PE");
// set range user
channel->GetData()->GetHistogram()->GetYaxis()->SetRangeUser(0., channel->GetData()->GetHistogram()->GetMaximum() + 2. * sqrt(channel->GetData()->GetHistogram()->GetMaximum()));
// draw stack
stack->Draw("SAMEHIST");
//draw data again
channel->GetData()->GetHistogram()->Draw("SAMEPE");
// redraw the axes
gPad->RedrawAxis();
// print
c1->Print(filename);
// free memory
for (unsigned int i = 0; i < histcontainer.size(); ++i) {
TH1D * hist = histcontainer.at(i);
delete hist;
}
delete stack;
delete c1;
// no error
return 1;
}
| int BCMTF::PrintSummary | ( | const char * | filename = "summary.txt" |
) |
Definition at line 511 of file BCMTF.cxx.
{
// open file
std::ofstream ofi(filename);
ofi.precision(3);
// check if file is open
if(!ofi.is_open()) {
BCLog::OutWarning(Form("BCMultitemplateFitter::PrintSummary() : Could not open file %s", filename));
return 0;
}
ofi
<< " Multi template fitter summary " << std::endl
<< " ----------------------------- " << std::endl
<< std::endl
<< " Number of channels : " << fNChannels << std::endl
<< " Number of processes : " << fNProcesses << std::endl
<< " Number of systematics : " << fNSystematics << std::endl
<< std::endl;
ofi
<< " Channels :" << std::endl;
for (int i = 0; i < GetNChannels(); ++i) {
ofi
<< " " << i
<< " : \"" << GetChannel(i)->GetName().c_str() << "\""
<< std::endl;
}
ofi
<< std::endl;
ofi
<< " Processes :" << std::endl;
for (int i = 0; i < GetNProcesses(); ++i) {
ofi
<< " " << i
<< " : \"" << GetProcess(i)->GetName().c_str() << "\""
<< " (par index " << GetParIndexProcess(i) << ")"
<< std::endl;
}
ofi
<< std::endl;
ofi
<< " Systematics :" << std::endl;
for (int i = 0; i < GetNSystematics(); ++i) {
ofi
<< " " << i
<< " : \"" << GetSystematic(i)->GetName().c_str() << "\""
<< " (par index " << GetParIndexSystematic(i) << ")"
<< std::endl;
}
ofi
<< std::endl;
if (GetNSystematics() == 0)
ofi
<< " - none - " << std::endl;
ofi
<< " Goodness-of-fit: " << std::endl;
for (int i = 0; i < GetNChannels(); ++i) {
ofi
<< " i : \"" << GetChannel(i)->GetName().c_str() << "\" : chi2 = "
<< CalculateChi2( i, GetBestFitParameters() )
<< std::endl;
}
ofi
<< std::endl;
// close file
ofi.close();
// no error
return 1;
}
| double BCMTF::Probability | ( | int | channelindex, | |
| int | processindex, | |||
| int | binindex, | |||
| const std::vector< double > & | parameters | |||
| ) |
Definition at line 685 of file BCMTF.cxx.
{
// get histogram
TH1D * hist = fChannelContainer[channelindex]->GetTemplate(processindex)->GetHistogram();
// get function container
std::vector<TF1 *> * funccont = fChannelContainer[channelindex]->GetTemplate(processindex)->GetFunctionContainer();
// this needs to be fast
if (!hist && !(funccont->size()>0))
return 0.;
if (hist)
return hist->GetBinContent(binindex);
else {
int parindex = fProcessParIndexContainer[processindex];
return funccont->at(binindex-1)->Eval(parameters[parindex]);
}
}
| int BCMTF::SetData | ( | const char * | channelname, | |
| TH1D | hist | |||
| ) |
Definition at line 196 of file BCMTF.cxx.
{
int channelindex = GetChannelIndex(channelname);
// check if channel exists
if (channelindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Channel does not exist.");
return -1;
}
// get channel
BCMTFChannel * channel = GetChannel(channelindex);
// get template
BCMTFTemplate * data = channel->GetData();
// remove statistics box
hist.SetStats(kFALSE);
// set marker
hist.SetMarkerStyle(20);
hist.SetMarkerSize(1.1);
// remove old data set if it exists
if (data->GetHistogram()) {
delete data->GetHistogram();
data->SetHistogram(0);
}
// set histogram
data->SetHistogram(new TH1D(hist));
// no error
return 1;
}
| void BCMTF::SetExpectationFunction | ( | int | parindex, | |
| TF1 * | func | |||
| ) | [inline] |
Definition at line 126 of file BCMTF.h.
{ fExpectationFunctionContainer[parindex] = func; };
| void BCMTF::SetFlagEfficiencyConstraint | ( | bool | flag | ) | [inline] |
Definition at line 122 of file BCMTF.h.
{ fFlagEfficiencyConstraint = flag; };
| int BCMTF::SetSystematicVariation | ( | const char * | channelname, | |
| const char * | processname, | |||
| const char * | systematicname, | |||
| TH1D | hist_up, | |||
| TH1D | hist_down | |||
| ) |
Definition at line 449 of file BCMTF.cxx.
{
// get channel index
int channelindex = GetChannelIndex(channelname);
// check if channel exists
if (channelindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Channel does not exist.");
return -1;
}
// get process index
int processindex = GetProcessIndex(processname);
// check if process exists
if (processindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Process does not exist.");
return -1;
}
// get systematic index
int systematicindex = GetSystematicIndex(systematicname);
// check if systematic exists
if (systematicindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Systematic does not exist.");
return -1;
}
// get channel
BCMTFChannel * channel = GetChannel(channelindex);
// get systematic variation
BCMTFSystematicVariation * variation = channel->GetSystematicVariation(systematicindex);
// set histogram
variation->SetHistograms(processindex, new TH1D(hist_up), new TH1D(hist_down));
// no error
return 1;
}
| int BCMTF::SetSystematicVariation | ( | const char * | channelname, | |
| const char * | processname, | |||
| const char * | systematicname, | |||
| double | variation_up, | |||
| double | variation_down | |||
| ) |
Definition at line 390 of file BCMTF.cxx.
{
// get channel index
int channelindex = GetChannelIndex(channelname);
// check if channel exists
if (channelindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Channel does not exist.");
return -1;
}
// get process index
int processindex = GetProcessIndex(processname);
// check if process exists
if (processindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Process does not exist.");
return -1;
}
// get systematic index
int systematicindex = GetSystematicIndex(systematicname);
// check if systematic exists
if (systematicindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Systematic does not exist.");
return -1;
}
// get channel
BCMTFChannel * channel = GetChannel(channelindex);
BCMTFTemplate * bctemplate = channel->GetTemplate(processindex);
TH1D * hist_template = bctemplate->GetHistogram();
TH1D hist_up = TH1D(*hist_template);
TH1D hist_down = TH1D(*hist_template);
int nbins = hist_up.GetNbinsX();
// loop over all bins
for (int ibin = 1; ibin <= nbins; ++ibin) {
hist_up.SetBinContent(ibin, variation_up);
hist_down.SetBinContent(ibin, variation_down);
}
// get systematic variation
BCMTFSystematicVariation * variation = channel->GetSystematicVariation(systematicindex);
// set histogram
variation->SetHistograms(processindex, new TH1D(hist_up), new TH1D(hist_down));
// no error
return 1;
}
| int BCMTF::SetSystematicVariation | ( | const char * | channelname, | |
| const char * | processname, | |||
| const char * | systematicname, | |||
| TH1D | hist, | |||
| TH1D | hist_up, | |||
| TH1D | hist_down | |||
| ) |
Definition at line 492 of file BCMTF.cxx.
{
// get number of bins
int nbins = hist.GetNbinsX();
TH1D * hist_up_rel = new TH1D(hist);
TH1D * hist_down_rel = new TH1D(hist);
// loop over all bins
for (int ibin = 1; ibin <= nbins; ++ibin) {
hist_up_rel->SetBinContent(ibin, (hist_up.GetBinContent(ibin) - hist.GetBinContent(ibin)) / hist.GetBinContent(ibin));
hist_down_rel->SetBinContent(ibin, (hist.GetBinContent(ibin) - hist_down.GetBinContent(ibin)) / hist.GetBinContent(ibin));
}
// set the systematic variation
return SetSystematicVariation(channelname, processname, systematicname, *hist_up_rel, *hist_down_rel);
}
| int BCMTF::SetTemplate | ( | const char * | channelname, | |
| const char * | processname, | |||
| std::vector< TF1 * > * | funccont, | |||
| int | nbins, | |||
| double | efficiency = 1. | |||
| ) |
Definition at line 159 of file BCMTF.cxx.
{
// get channel index
int channelindex = GetChannelIndex(channelname);
// check if channel exists
if (channelindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Channel does not exist.");
return -1;
}
// get process index
int processindex = GetProcessIndex(processname);
// check if process exists
if (processindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Process does not exist.");
return -1;
}
// get channel
BCMTFChannel * channel = GetChannel(channelindex);
// get template
BCMTFTemplate * bctemplate = channel->GetTemplate(processindex);
// set histogram
bctemplate->SetFunctionContainer(funccont, nbins);
// set efficiency
bctemplate->SetEfficiency(efficiency);
// no error
return 1;
}
| int BCMTF::SetTemplate | ( | const char * | channelname, | |
| const char * | processname, | |||
| TH1D | hist, | |||
| double | efficiency = 1. | |||
| ) |
Definition at line 108 of file BCMTF.cxx.
{
// get channel index
int channelindex = GetChannelIndex(channelname);
// check if channel exists
if (channelindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Channel does not exist.");
return -1;
}
// get process index
int processindex = GetProcessIndex(processname);
// check if process exists
if (processindex < 0) {
BCLog::OutWarning("BCMultitemplateFitter::SetTemplate() : Process does not exist.");
return -1;
}
// get channel
BCMTFChannel * channel = GetChannel(channelindex);
// get template
BCMTFTemplate * bctemplate = channel->GetTemplate(processindex);
// normalize histogram
if (hist.Integral())
hist.Scale(1.0 / hist.Integral());
// remove statistics box
hist.SetStats(kFALSE);
// set color and fill style
hist.SetFillColor(2 + processindex);
hist.SetFillStyle(1001);
// create new histogram
TH1D * temphist = new TH1D(hist);
// set histogram
bctemplate->SetHistogram(temphist);
// set efficiency
bctemplate->SetEfficiency(efficiency);
// no error
return 1;
}
std::vector<BCMTFChannel *> BCMTF::fChannelContainer [private] |
std::vector<TF1 *> BCMTF::fExpectationFunctionContainer [private] |
bool BCMTF::fFlagEfficiencyConstraint [private] |
int BCMTF::fNChannels [private] |
int BCMTF::fNProcesses [private] |
int BCMTF::fNSystematics [private] |
std::vector<BCMTFProcess *> BCMTF::fProcessContainer [private] |
std::vector<int> BCMTF::fProcessParIndexContainer [private] |
std::vector<BCMTFSystematic *> BCMTF::fSystematicContainer [private] |
std::vector<int> BCMTF::fSystematicParIndexContainer [private] |
1.7.1