1 #include "BCRooInterface.h"
2 #include "../../BAT/BCMath.h"
3 #include "../../BAT/BCParameter.h"
5 #include <RooGlobalFunc.h>
6 #include <RooMsgService.h>
7 #include <RooProdPdf.h>
8 #include <RooUniform.h>
9 #include <RooWorkspace.h>
13 #include "RooRealVar.h"
14 #include "RooAbsReal.h"
15 #include "RooRandom.h"
22 RooAbsPdf& prior_trans,
23 const RooArgSet* params,
24 const RooArgSet& listPOI )
31 RooAbsPdf* prior_total = &prior_trans;
32 if (prior_total!=0 ) {
36 std::cout <<
"No prior PDF: without taking action the program would crash\n";
37 std::cout <<
"No prior PDF: adding dummy uniform pdf on the interval [0..1]\n";
38 priorhelpvar =
new RooRealVar(
"priorhelpvar",
"",0.0, 1.0 );
39 _addeddummyprior =
true;
40 RooUniform* priorhelpdist =
new RooUniform(
"priorhelpdist",
"", *priorhelpvar);
41 fPrior = priorhelpdist;
44 std::cout <<
"Imported parameters:\n";
45 fParams =
new RooArgList(listPOI);
46 const RooArgSet* paramsTmp = params;
48 fParams->add(*paramsTmp);
51 fParamsPOI =
new RooArgList(listPOI);
55 RooArgSet* constrainedParams = fModel->getParameters(*fData);
56 fNll = fModel->createNLL(*fData, RooFit::Constrain(*constrainedParams) );
70 const char* modelName,
71 const char* priorName,
72 const char* priorNuisanceName,
73 const char* paramsName,
74 const char* listPOIName )
90 std::cout <<
"Opening " << rootFile << std::endl;
91 TFile* file = TFile::Open(rootFile);
92 std::cout <<
"content :\n";
95 RooWorkspace* bat_ws = (RooWorkspace*) file->Get(wsName);
98 fData = (RooAbsData*) bat_ws->data(dataName);
99 fModel = (RooAbsPdf*) bat_ws->function(modelName);
102 RooAbsPdf* priorPOI = (RooAbsPdf*) bat_ws->function(priorName);
103 RooAbsPdf* priorNuisance = (RooAbsPdf*) bat_ws->pdf(priorNuisanceName);
104 if (priorNuisance!=0 && priorPOI!=0) {
105 fPrior =
new RooProdPdf(
"fPrior",
"complete prior",*priorPOI,*priorNuisance);
108 if ( priorNuisance!=0 )
109 fPrior=priorNuisance;
110 else if ( priorPOI!=0 )
113 std::cout <<
"No prior PDF: without taking action the program would crash\n";
114 std::cout <<
"No prior PDF: adding dummy uniform pdf on the interval [0..1]\n";
115 priorhelpvar =
new RooRealVar(
"priorhelpvar",
"",0.0, 1.0 );
116 _addeddummyprior =
true;
117 RooUniform* priorhelpdist =
new RooUniform(
"priorhelpdist",
"", *priorhelpvar);
118 fPrior = priorhelpdist;
122 std::cout <<
"Imported parameters:\n";
123 fParams =
new RooArgList(*(bat_ws->set(listPOIName)));
124 RooArgSet* paramsTmp = (RooArgSet*) bat_ws->set(paramsName);
126 fParams->add(*paramsTmp);
128 if (_addeddummyprior ==
true ) {
129 fParams->add(*priorhelpvar);
135 RooArgSet* constrainedParams = fModel->getParameters(*fData);
136 fNll = fModel->createNLL(*fData, RooFit::Constrain(*constrainedParams) );
144 BCRooInterface::BCRooInterface(
const char* name,
bool fillChain) :
155 _addeddummyprior(false),
156 _fillChain(fillChain),
157 fFirstComparison(false),
158 _roostatsMarkovChain(NULL)
161 SetMarginalizationMethod(BCIntegrate::kMargMetropolis);
165 BCRooInterface::~BCRooInterface()
168 delete _roostatsMarkovChain;
176 int nParams = fParams->getSize();
177 for (
int iParam=0; iParam<nParams; iParam++) {
178 RooRealVar* ipar = (RooRealVar*) fParams->at(iParam);
180 bcpar->SetNbins(_default_nbins);
182 std::cout <<
"added parameter: " << bcpar->
GetName() <<
" defined in range [ " << bcpar->
GetLowerLimit() <<
" - "
183 << bcpar->
GetUpperLimit() <<
" ] with number of bins: " << bcpar->GetNbins() <<
" \n";
186 for(std::list< std::pair<const char*,int> >::iterator listiter = _nbins_list.begin(); listiter != _nbins_list.end(); listiter++) {
187 GetParameter((*listiter).first)->SetNbins((*listiter).second);
188 std::cout <<
"adjusted parameter: " << (*listiter).first <<
" to number of bins: " << (*listiter).second <<
" \n";
197 int nParams = fParams->getSize();
198 for (
int iParam=0; iParam<nParams; iParam++) {
199 RooRealVar* ipar = (RooRealVar*) fParams->at(iParam);
200 ipar->setVal(parameters.at(iParam));
204 double logprob = -fNll->getVal();
212 int nParams = fParams->getSize();
213 for (
int iParam=0; iParam<nParams; iParam++) {
214 RooRealVar* ipar = (RooRealVar*) fParams->at(iParam);
215 ipar->setVal(parameters.at(iParam));
218 RooArgSet* tmpArgSet =
new RooArgSet(*fParams);
219 double prob = fPrior->getVal(tmpArgSet);
228 for(std::list< std::pair<const char*,int> >::iterator listiter = _nbins_list.begin(); listiter != _nbins_list.end(); listiter++) {
229 if(!strcmp((*listiter).first, parname)) {
230 (*listiter).second = nbins;
234 _nbins_list.push_back( std::make_pair(parname,nbins) );
239 _default_nbins = nbins;
252 _parametersForMarkovChainPrevious.add(*fParams);
253 _parametersForMarkovChainCurrent.add(*fParams);
255 std::cout <<
"size of _parametersForMarkovChain: " << _parametersForMarkovChainCurrent.getSize() << std::endl;
256 std::cout <<
"size of fParamsPOI: " << fParamsPOI->getSize() << std::endl;
259 _roostatsMarkovChain =
new RooStats::MarkovChain();
264 std::cout <<
"setting up parameters for RooStats markov chain" << std::endl;
265 _parametersForMarkovChainPrevious.writeToStream(std::cout,
false);
268 int nchains = MCMCGetNChains();
269 for(
int countChains = 1; countChains<=nchains ; countChains++ ) {
270 double tempweight = 1.0;
271 fVecWeights.push_back(tempweight);
272 std::vector<double> tempvec;
273 TIterator* setiter = fParamsPOI->createIterator();
275 while(setiter->Next()){
276 tempvec.push_back(tempval);
278 fPreviousStep.push_back(tempvec);
279 fCurrentStep.push_back(tempvec);
282 fFirstComparison =
true;
301 int nchains = MCMCGetNChains();
304 int npar = GetNParameters();
308 for (
int i = 0; i < nchains; ++i) {
313 TIterator* setiter = fParams->createIterator();
320 while(setiter->Next()){
327 const char * paramnamepointer = (tempBCparam->
GetName()).c_str();
328 double xij = fMCMCx.at(i * npar + j);
329 AddToCurrentChainElement(xij, i, j);
330 RooRealVar* parampointer = (RooRealVar*) &(_parametersForMarkovChainCurrent[paramnamepointer]);
331 parampointer->setVal(xij);
346 if( !(EqualsLastChainElement(i)) ) {
347 double weight = GetWeightForChain(i);
348 _roostatsMarkovChain->Add(_parametersForMarkovChainPrevious, -1.* MCMCGetLogProbx(j), weight);
349 _parametersForMarkovChainPrevious = _parametersForMarkovChainCurrent;
355 void BCRooInterface::AddToCurrentChainElement(
double xij,
int chainNum,
int poiNum)
357 fCurrentStep[chainNum][poiNum] = xij;
360 bool BCRooInterface::EqualsLastChainElement(
int chainNum)
363 std::vector<double>::iterator itPrevious = fPreviousStep[chainNum].begin();
365 if(fFirstComparison ==
true) {
366 fFirstComparison =
false;
367 _parametersForMarkovChainPrevious = _parametersForMarkovChainCurrent;
372 for (std::vector<double>::iterator itCurrent = fCurrentStep[chainNum].begin(); itCurrent != fCurrentStep[chainNum].end(); ++itCurrent) {
373 if(*itCurrent != *itPrevious) {
375 fPreviousStep[chainNum] = fCurrentStep[chainNum];
382 fVecWeights[chainNum] += 1.0;
389 double BCRooInterface::GetWeightForChain(
int chainNum)
391 double retval = fVecWeights[chainNum];
392 fVecWeights[chainNum]= 1.0 ;
void SetupRooStatsMarkovChain()
setup RooStats Markov Chain
double GetLowerLimit() const
void MCMCIterationInterface()
overloaded function from BCIntegrate to fill RooStats Markov Chain with every accepted step ...
void SetNumBins(const char *parname, int nbins)
set the number of histogram bins for a specific parameter
The base class for all user-defined models.
void DefineParameters()
Overloaded methods.
A class representing a parameter of a model.
double LogLikelihood(const std::vector< double > ¶meters)
void Initialize(RooAbsData &data, RooAbsPdf &model, RooAbsPdf &prior, const RooArgSet *params, const RooArgSet &listPOI)
Other method of this class.
virtual int AddParameter(BCParameter *parameter)
double LogAPrioriProbability(const std::vector< double > ¶meters)
double GetUpperLimit() const
const std::string & GetName() const