55 using namespace RooFit;
56 using namespace RooStats;
59 void StandardHistFactoryPlotsWithCategories(
const char *infile =
"",
const char *workspaceName =
"combined",
60 const char *modelConfigName =
"ModelConfig",
61 const char *dataName =
"obsData")
64 double nSigmaToVary = 5.;
71 const char *filename =
"";
72 if (!strcmp(infile,
"")) {
73 filename =
"results/example_combined_GaussExample_model.root";
74 bool fileExist = !gSystem->AccessPathName(filename);
78 cout <<
"HistFactory file cannot be generated on Windows - exit" << endl;
82 cout <<
"will run standard hist2workspace example" << endl;
83 gROOT->ProcessLine(
".! prepareHistFactory .");
84 gROOT->ProcessLine(
".! hist2workspace config/example.xml");
85 cout <<
"\n\n---------------------" << endl;
86 cout <<
"Done creating example input" << endl;
87 cout <<
"---------------------\n\n" << endl;
94 TFile *file = TFile::Open(filename);
98 cout <<
"StandardRooStatsDemoMacro: Input file " << filename <<
" is not found" << endl;
107 RooWorkspace *w = (RooWorkspace *)file->Get(workspaceName);
109 cout <<
"workspace not found" << endl;
114 ModelConfig *mc = (ModelConfig *)w->obj(modelConfigName);
117 RooAbsData *data = w->data(dataName);
122 cout <<
"data or ModelConfig was not found" << endl;
129 RooRealVar *obs = (RooRealVar *)mc->GetObservables()->first();
130 TList *list =
new TList();
132 RooRealVar *firstPOI =
dynamic_cast<RooRealVar *
>(mc->GetParametersOfInterest()->first());
134 firstPOI->setVal(muVal);
137 mc->GetPdf()->fitTo(*data);
142 mc->GetNuisanceParameters()->Print(
"v");
143 int nPlotsMax = 1000;
144 cout <<
" check expectedData by category" << endl;
145 RooDataSet *simData = NULL;
146 RooSimultaneous *simPdf = NULL;
147 if (strcmp(mc->GetPdf()->ClassName(),
"RooSimultaneous") == 0) {
148 cout <<
"Is a simultaneous PDF" << endl;
149 simPdf = (RooSimultaneous *)(mc->GetPdf());
151 cout <<
"Is not a simultaneous PDF" << endl;
155 RooCategory *channelCat = (RooCategory *)(&simPdf->indexCat());
156 TIterator *iter = channelCat->typeIterator();
157 RooCatType *tt = NULL;
158 tt = (RooCatType *)iter->Next();
159 RooAbsPdf *pdftmp = ((RooSimultaneous *)mc->GetPdf())->getPdf(tt->GetName());
160 RooArgSet *obstmp = pdftmp->getObservables(*mc->GetObservables());
161 obs = ((RooRealVar *)obstmp->first());
162 RooPlot *frame = obs->frame();
163 cout << Form(
"%s==%s::%s", channelCat->GetName(), channelCat->GetName(), tt->GetName()) << endl;
164 cout << tt->GetName() <<
" " << channelCat->getLabel() << endl;
165 data->plotOn(frame, MarkerSize(1),
166 Cut(Form(
"%s==%s::%s", channelCat->GetName(), channelCat->GetName(), tt->GetName())),
167 DataError(RooAbsData::None));
170 data->sumEntries(Form(
"%s==%s::%s", channelCat->GetName(), channelCat->GetName(), tt->GetName()));
172 pdftmp->plotOn(frame, LineWidth(2.), Normalization(normCount, RooAbsReal::NumEvent));
174 cout <<
"expected events = " << mc->GetPdf()->expectedEvents(*data->get()) << endl;
181 TIterator *it = mc->GetNuisanceParameters()->createIterator();
182 RooRealVar *var = NULL;
183 while ((var = (RooRealVar *)it->Next()) != NULL) {
184 RooPlot *frame = obs->frame();
185 frame->SetYTitle(var->GetName());
186 data->plotOn(frame, MarkerSize(1));
188 mc->GetPdf()->plotOn(frame, LineWidth(1.));
190 mc->GetPdf()->plotOn(frame, LineColor(kRed), LineStyle(kDashed), LineWidth(1));
192 mc->GetPdf()->plotOn(frame, LineColor(kGreen), LineStyle(kDashed), LineWidth(1));
198 RooCategory *channelCat = (RooCategory *)(&simPdf->indexCat());
200 TIterator *iter = channelCat->typeIterator();
201 RooCatType *tt = NULL;
202 while (nPlots < nPlotsMax && (tt = (RooCatType *)iter->Next())) {
204 cout <<
"on type " << tt->GetName() <<
" " << endl;
206 RooAbsPdf *pdftmp = simPdf->getPdf(tt->GetName());
209 RooArgSet *obstmp = pdftmp->getObservables(*mc->GetObservables());
212 obs = ((RooRealVar *)obstmp->first());
214 TIterator *it = mc->GetNuisanceParameters()->createIterator();
215 RooRealVar *var = NULL;
216 while (nPlots < nPlotsMax && (var = (RooRealVar *)it->Next())) {
217 TCanvas *c2 =
new TCanvas(
"c2");
218 RooPlot *frame = obs->frame();
219 frame->SetName(Form(
"frame%d", nPlots));
220 frame->SetYTitle(var->GetName());
222 cout << Form(
"%s==%s::%s", channelCat->GetName(), channelCat->GetName(), tt->GetName()) << endl;
223 cout << tt->GetName() <<
" " << channelCat->getLabel() << endl;
224 data->plotOn(frame, MarkerSize(1),
225 Cut(Form(
"%s==%s::%s", channelCat->GetName(), channelCat->GetName(), tt->GetName())),
226 DataError(RooAbsData::None));
229 data->sumEntries(Form(
"%s==%s::%s", channelCat->GetName(), channelCat->GetName(), tt->GetName()));
231 if (strcmp(var->GetName(),
"Lumi") == 0) {
232 cout <<
"working on lumi" << endl;
233 var->setVal(w->var(
"nominalLumi")->getVal());
243 normCount = pdftmp->expectedEvents(*obs);
244 pdftmp->plotOn(frame, LineWidth(2.), Normalization(normCount, RooAbsReal::NumEvent));
246 if (strcmp(var->GetName(),
"Lumi") == 0) {
247 cout <<
"working on lumi" << endl;
248 var->setVal(w->var(
"nominalLumi")->getVal() + 0.05);
251 var->setVal(nSigmaToVary);
256 normCount = pdftmp->expectedEvents(*obs);
257 pdftmp->plotOn(frame, LineWidth(2.), LineColor(kRed), LineStyle(kDashed),
258 Normalization(normCount, RooAbsReal::NumEvent));
260 if (strcmp(var->GetName(),
"Lumi") == 0) {
261 cout <<
"working on lumi" << endl;
262 var->setVal(w->var(
"nominalLumi")->getVal() - 0.05);
265 var->setVal(-nSigmaToVary);
270 normCount = pdftmp->expectedEvents(*obs);
271 pdftmp->plotOn(frame, LineWidth(2.), LineColor(kGreen), LineStyle(kDashed),
272 Normalization(normCount, RooAbsReal::NumEvent));
275 if (strcmp(var->GetName(),
"Lumi") == 0) {
276 cout <<
"working on lumi" << endl;
277 var->setVal(w->var(
"nominalLumi")->getVal());
289 c2->SaveAs(Form(
"%s_%s_%s.pdf", tt->GetName(), obs->GetName(), var->GetName()));
298 TCanvas *c1 =
new TCanvas(
"c1",
"ProfileInspectorDemo", 800, 200);
299 if (list->GetSize() > 4) {
300 double n = list->GetSize();
301 int nx = (int)sqrt(n);
302 int ny = TMath::CeilNint(n / nx);
303 nx = TMath::CeilNint(sqrt(n));
306 c1->Divide(list->GetSize());
307 for (
int i = 0; i < list->GetSize(); ++i) {