14 #if !defined(R__ALPHA) && !defined(R__SOLARIS) && !defined(R__ACC) && !defined(R__FBSD)
15 NamespaceImp(RooStats)
32 RooStatsConfig& GetGlobalRooStatsConfig() {
33 static RooStatsConfig theConfig;
37 Double_t AsimovSignificance(Double_t s, Double_t b, Double_t sigma_b ) {
41 double sb2 = sigma_b*sigma_b;
46 double bpsb2 = b + sb2;
49 double za2 = 2.*( (spb)* std::log( ( spb)*(bpsb2)/(b2+ spb*sb2) ) -
50 (b2/sb2) * std::log(1. + ( sb2 * s)/(b * bpsb2) ) );
55 double za2 = 2.*( (s+b) * std::log(1. + s/b) -s );
56 return std::sqrt(za2);
60 void UseNLLOffset(
bool on) {
61 GetGlobalRooStatsConfig().useLikelihoodOffset = on;
66 return GetGlobalRooStatsConfig().useLikelihoodOffset;
69 void FactorizePdf(
const RooArgSet &observables, RooAbsPdf &pdf, RooArgList &obsTerms, RooArgList &constraints) {
72 const std::type_info &
id =
typeid(pdf);
73 if (
id ==
typeid(RooProdPdf)) {
74 RooProdPdf *prod =
dynamic_cast<RooProdPdf *
>(&pdf);
75 RooArgList list(prod->pdfList());
76 for (
int i = 0, n = list.getSize(); i < n; ++i) {
77 RooAbsPdf *pdfi = (RooAbsPdf *) list.at(i);
78 FactorizePdf(observables, *pdfi, obsTerms, constraints);
80 }
else if (
id ==
typeid(RooExtendPdf)) {
81 TIterator *iter = pdf.serverIterator();
83 RooAbsPdf *updf =
dynamic_cast<RooAbsPdf *
>(iter->Next());
86 FactorizePdf(observables, *updf, obsTerms, constraints);
87 }
else if (
id ==
typeid(RooSimultaneous)) {
88 RooSimultaneous *sim =
dynamic_cast<RooSimultaneous *
>(&pdf);
90 RooAbsCategoryLValue *cat = (RooAbsCategoryLValue *) sim->indexCat().clone(sim->indexCat().GetName());
91 for (
int ic = 0, nc = cat->numBins((
const char *)0); ic < nc; ++ic) {
93 RooAbsPdf* catPdf = sim->getPdf(cat->getLabel());
95 if (catPdf != 0) FactorizePdf(observables, *catPdf, obsTerms, constraints);
98 }
else if (pdf.dependsOn(observables)) {
99 if (!obsTerms.contains(pdf)) obsTerms.add(pdf);
101 if (!constraints.contains(pdf)) constraints.add(pdf);
106 void FactorizePdf(RooStats::ModelConfig &model, RooAbsPdf &pdf, RooArgList &obsTerms, RooArgList &constraints) {
109 if (!model.GetObservables() ) {
110 oocoutE((TObject*)0,InputArguments) <<
"RooStatsUtils::FactorizePdf - invalid input model: missing observables" << endl;
113 return FactorizePdf(*model.GetObservables(), pdf, obsTerms, constraints);
117 RooAbsPdf * MakeNuisancePdf(RooAbsPdf &pdf,
const RooArgSet &observables,
const char *name) {
119 RooArgList obsTerms, constraints;
120 FactorizePdf(observables, pdf, obsTerms, constraints);
121 if(constraints.getSize() == 0) {
122 oocoutW((TObject *)0, Eval) <<
"RooStatsUtils::MakeNuisancePdf - no constraints found on nuisance parameters in the input model" << endl;
124 }
else if(constraints.getSize() == 1) {
125 return dynamic_cast<RooAbsPdf *
>(constraints.first()->clone(name));
127 return new RooProdPdf(name,
"", constraints);
130 RooAbsPdf * MakeNuisancePdf(
const RooStats::ModelConfig &model,
const char *name) {
132 if (!model.GetPdf() || !model.GetObservables() ) {
133 oocoutE((TObject*)0, InputArguments) <<
"RooStatsUtils::MakeNuisancePdf - invalid input model: missing pdf and/or observables" << endl;
136 return MakeNuisancePdf(*model.GetPdf(), *model.GetObservables(), name);
139 RooAbsPdf * StripConstraints(RooAbsPdf &pdf,
const RooArgSet &observables) {
140 const std::type_info &
id =
typeid(pdf);
142 if (
id ==
typeid(RooProdPdf)) {
144 RooProdPdf *prod =
dynamic_cast<RooProdPdf *
>(&pdf);
145 RooArgList list(prod->pdfList()); RooArgList newList;
147 for (
int i = 0, n = list.getSize(); i < n; ++i) {
148 RooAbsPdf *pdfi = (RooAbsPdf *) list.at(i);
149 RooAbsPdf *newPdfi = StripConstraints(*pdfi, observables);
150 if(newPdfi != NULL) newList.add(*newPdfi);
153 if(newList.getSize() == 0)
return NULL;
155 else if(newList.getSize() == 1)
return dynamic_cast<RooAbsPdf *>(newList.at(0)->clone(TString::Format(
"%s_unconstrained",
156 newList.at(0)->GetName())));
157 else return new RooProdPdf(TString::Format(
"%s_unconstrained", prod->GetName()).Data(),
158 TString::Format(
"%s without constraints", prod->GetTitle()).Data(), newList);
160 }
else if (
id ==
typeid(RooExtendPdf)) {
162 TIterator *iter = pdf.serverIterator();
164 RooAbsPdf *uPdf =
dynamic_cast<RooAbsPdf *
>(iter->Next());
165 RooAbsReal *extended_term =
dynamic_cast<RooAbsReal *
>(iter->Next());
166 assert(uPdf != NULL); assert(extended_term != NULL); assert(iter->Next() == NULL);
169 RooAbsPdf *newUPdf = StripConstraints(*uPdf, observables);
170 if(newUPdf == NULL)
return NULL;
171 else return new RooExtendPdf(TString::Format(
"%s_unconstrained", pdf.GetName()).Data(),
172 TString::Format(
"%s without constraints", pdf.GetTitle()).Data(), *newUPdf, *extended_term);
174 }
else if (
id ==
typeid(RooSimultaneous)) {
176 RooSimultaneous *sim =
dynamic_cast<RooSimultaneous *
>(&pdf); assert(sim != NULL);
177 RooAbsCategoryLValue *cat = (RooAbsCategoryLValue *) sim->indexCat().Clone(); assert(cat != NULL);
180 for (
int ic = 0, nc = cat->numBins((
const char *)NULL); ic < nc; ++ic) {
182 RooAbsPdf* catPdf = sim->getPdf(cat->getLabel());
183 RooAbsPdf* newPdf = NULL;
185 if (catPdf != NULL) newPdf = StripConstraints(*catPdf, observables);
186 if (newPdf == NULL) {
delete cat;
return NULL; }
187 pdfList.add(*newPdf);
190 return new RooSimultaneous(TString::Format(
"%s_unconstrained", sim->GetName()).Data(),
191 TString::Format(
"%s without constraints", sim->GetTitle()).Data(), pdfList, *cat);
193 }
else if (pdf.dependsOn(observables)) {
194 return (RooAbsPdf *) pdf.clone(TString::Format(
"%s_unconstrained", pdf.GetName()).Data());
200 RooAbsPdf * MakeUnconstrainedPdf(RooAbsPdf &pdf,
const RooArgSet &observables,
const char *name) {
202 RooAbsPdf * unconstrainedPdf = StripConstraints(pdf, observables);
203 if(!unconstrainedPdf) {
204 oocoutE((TObject *)NULL, InputArguments) <<
"RooStats::MakeUnconstrainedPdf - invalid observable list passed (observables not found in original pdf) or invalid pdf passed (without observables)" << endl;
207 if(name != NULL) unconstrainedPdf->SetName(name);
208 return unconstrainedPdf;
211 RooAbsPdf * MakeUnconstrainedPdf(
const RooStats::ModelConfig &model,
const char *name) {
213 if(!model.GetPdf() || !model.GetObservables()) {
214 oocoutE((TObject *)NULL, InputArguments) <<
"RooStatsUtils::MakeUnconstrainedPdf - invalid input model: missing pdf and/or observables" << endl;
217 return MakeUnconstrainedPdf(*model.GetPdf(), *model.GetObservables(), name);
223 std::map<TString, Double_t> fVarVals;
227 BranchStore(
const vector <TString> ¶ms = vector <TString>(),
double _inval = -999.) : fTree(0) {
229 for(
unsigned int i = 0;i<params.size();i++)
230 fVarVals[params[i]] = _inval;
235 for(std::map<TString, Double_t>::iterator it = fVarVals.begin();it!=fVarVals.end();++it) {
236 TBranch *br = fTree->GetBranch( it->first );
237 if (br) br->ResetAddress();
242 void AssignToTTree(TTree &myTree) {
244 for(std::map<TString, Double_t>::iterator it = fVarVals.begin();it!=fVarVals.end();++it) {
245 const TString& name = it->first;
246 myTree.Branch( name, &fVarVals[name], TString::Format(
"%s/D", name.Data()));
250 for(std::map<TString, Double_t>::iterator it = fVarVals.begin();it!=fVarVals.end();++it) {
251 const TString& name = it->first;
252 fVarVals[name] = fInval;
257 BranchStore* CreateBranchStore(
const RooDataSet& data) {
258 if (data.numEntries() == 0) {
259 return new BranchStore;
262 const RooArgSet* aset = data.get(0);
264 TIterator *it = aset->createIterator();
265 for(;(arg =
dynamic_cast<RooAbsArg*
>(it->Next()));) {
266 RooRealVar *rvar =
dynamic_cast<RooRealVar*
>(arg);
269 V.push_back(rvar->GetName());
270 if (rvar->hasAsymError()) {
271 V.push_back(TString::Format(
"%s_errlo", rvar->GetName()));
272 V.push_back(TString::Format(
"%s_errhi", rvar->GetName()));
274 else if (rvar->hasError()) {
275 V.push_back(TString::Format(
"%s_err", rvar->GetName()));
279 return new BranchStore(V);
282 void FillTree(TTree &myTree,
const RooDataSet &data) {
283 BranchStore *bs = CreateBranchStore(data);
284 bs->AssignToTTree(myTree);
286 for(
int entry = 0;entry<data.numEntries();entry++) {
288 const RooArgSet* aset = data.get(entry);
290 RooLinkedListIter it = aset->iterator();
291 for(;(arg =
dynamic_cast<RooAbsArg*
>(it.Next()));) {
292 RooRealVar *rvar =
dynamic_cast<RooRealVar*
>(arg);
295 bs->fVarVals[rvar->GetName()] = rvar->getValV();
296 if (rvar->hasAsymError()) {
297 bs->fVarVals[TString::Format(
"%s_errlo", rvar->GetName())] = rvar->getAsymErrorLo();
298 bs->fVarVals[TString::Format(
"%s_errhi", rvar->GetName())] = rvar->getAsymErrorHi();
300 else if (rvar->hasError()) {
301 bs->fVarVals[TString::Format(
"%s_err", rvar->GetName())] = rvar->getError();
310 TTree * GetAsTTree(TString name, TString desc,
const RooDataSet& data) {
311 TTree* myTree =
new TTree(name, desc);
312 FillTree(*myTree, data);
318 void PrintListContent(
const RooArgList & l, std::ostream & os ) {
321 for (
int i = 0; i< l.getSize(); ++i) {