34 ClassImp(RooStats::MarkovChain);
36 using namespace RooFit;
37 using namespace RooStats;
39 static const char* WEIGHT_NAME =
"weight_MarkovChain_local_";
40 static const char* NLL_NAME =
"nll_MarkovChain_local_";
41 static const char* DATASET_NAME =
"dataset_MarkovChain_local_";
42 static const char* DEFAULT_NAME =
"_markov_chain";
43 static const char* DEFAULT_TITLE =
"Markov Chain";
45 MarkovChain::MarkovChain() :
46 TNamed(DEFAULT_NAME, DEFAULT_TITLE)
55 MarkovChain::MarkovChain(RooArgSet& parameters) :
56 TNamed(DEFAULT_NAME, DEFAULT_TITLE)
63 SetParameters(parameters);
66 MarkovChain::MarkovChain(
const char* name,
const char* title,
67 RooArgSet& parameters) : TNamed(name, title)
74 SetParameters(parameters);
77 void MarkovChain::SetParameters(RooArgSet& parameters)
83 fParameters =
new RooArgSet();
84 fParameters->addClone(parameters);
89 RooRealVar nll(NLL_NAME,
"-log Likelihood", 0);
90 RooRealVar weight(WEIGHT_NAME,
"weight", 0);
92 fDataEntry =
new RooArgSet();
93 fDataEntry->addClone(parameters);
94 fDataEntry->addClone(nll);
95 fDataEntry->addClone(weight);
96 fNLL = (RooRealVar*)fDataEntry->find(NLL_NAME);
97 fWeight = (RooRealVar*)fDataEntry->find(WEIGHT_NAME);
99 fChain =
new RooDataSet(DATASET_NAME,
"Markov Chain", *fDataEntry,WEIGHT_NAME);
102 void MarkovChain::Add(RooArgSet& entry, Double_t nllValue, Double_t weight)
104 if (fParameters == NULL)
105 SetParameters(entry);
106 RooStats::SetParameters(&entry, fDataEntry);
107 fNLL->setVal(nllValue);
109 fWeight->setVal(weight);
110 fChain->add(*fDataEntry, weight);
114 void MarkovChain::AddWithBurnIn(MarkovChain& otherChain, Int_t burnIn)
118 if(fParameters == NULL) SetParameters(*(RooArgSet*)otherChain.Get());
120 for(
int i=0; i < otherChain.Size(); i++ ) {
121 RooArgSet* entry = (RooArgSet*)otherChain.Get(i);
123 if( counter > burnIn ) {
124 AddFast( *entry, otherChain.NLL(), otherChain.Weight() );
128 void MarkovChain::Add(MarkovChain& otherChain, Double_t discardEntries)
134 if(fParameters == NULL) SetParameters(*(RooArgSet*)otherChain.Get());
135 double counter = 0.0;
136 for(
int i=0; i < otherChain.Size(); i++ ) {
137 RooArgSet* entry = (RooArgSet*)otherChain.Get(i);
138 counter += otherChain.Weight();
139 if( counter > discardEntries ) {
140 AddFast( *entry, otherChain.NLL(), otherChain.Weight() );
145 void MarkovChain::AddFast(RooArgSet& entry, Double_t nllValue, Double_t weight)
147 RooStats::SetParameters(&entry, fDataEntry);
148 fNLL->setVal(nllValue);
150 fWeight->setVal(weight);
151 fChain->addFast(*fDataEntry, weight);
155 RooDataSet* MarkovChain::GetAsDataSet(RooArgSet* whichVars)
const
158 if (whichVars == NULL) {
161 args.add(*fDataEntry);
163 args.add(*whichVars);
168 data = (RooDataSet*)fChain->reduce(args);
173 RooDataSet* MarkovChain::GetAsDataSet(
const RooCmdArg& arg1,
const RooCmdArg& arg2,
174 const RooCmdArg& arg3,
const RooCmdArg& arg4,
const RooCmdArg& arg5,
175 const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8)
const
178 data = (RooDataSet*)fChain->reduce(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);
182 RooDataHist* MarkovChain::GetAsDataHist(RooArgSet* whichVars)
const
185 if (whichVars == NULL) {
186 args.add(*fParameters);
190 args.add(*whichVars);
193 RooDataSet* data = (RooDataSet*)fChain->reduce(args);
194 RooDataHist* hist = data->binnedClone();
200 RooDataHist* MarkovChain::GetAsDataHist(
const RooCmdArg& arg1,
const RooCmdArg& arg2,
201 const RooCmdArg& arg3,
const RooCmdArg& arg4,
const RooCmdArg& arg5,
202 const RooCmdArg& arg6,
const RooCmdArg& arg7,
const RooCmdArg& arg8)
const
206 data = (RooDataSet*)fChain->reduce(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);
207 hist = data->binnedClone();
213 THnSparse* MarkovChain::GetAsSparseHist(RooAbsCollection* whichVars)
const
216 if (whichVars == NULL)
217 axes.add(*fParameters);
219 axes.add(*whichVars);
221 Int_t dim = axes.getSize();
222 std::vector<Double_t> min(dim);
223 std::vector<Double_t> max(dim);
224 std::vector<Int_t> bins(dim);
225 std::vector<const char *> names(dim);
226 TIterator* it = axes.createIterator();
227 for (Int_t i = 0; i < dim; i++) {
228 RooRealVar * var =
dynamic_cast<RooRealVar*
>(it->Next() );
230 names[i] = var->GetName();
231 min[i] = var->getMin();
232 max[i] = var->getMax();
233 bins[i] = var->numBins();
236 THnSparseF* sparseHist =
new THnSparseF(
"posterior",
"MCMC Posterior Histogram",
237 dim, &bins[0], &min[0], &max[0]);
245 Int_t size = fChain->numEntries();
246 const RooArgSet* entry;
247 Double_t* x =
new Double_t[dim];
248 for (Int_t i = 0; i < size; i++) {
249 entry = fChain->get(i);
251 for (Int_t ii = 0; ii < dim; ii++) {
253 x[ii] = entry->getRealValue( names[ii]);
254 sparseHist->Fill(x, fChain->weight());
263 Double_t MarkovChain::NLL(Int_t i)
const
268 return fChain->get(i)->getRealValue(NLL_NAME);
271 Double_t MarkovChain::NLL()
const
276 return fChain->get()->getRealValue(NLL_NAME);
279 Double_t MarkovChain::Weight()
const
281 return fChain->weight();
284 Double_t MarkovChain::Weight(Int_t i)
const
287 return fChain->weight();