65 enum ETestCommandIdentifiers {
75 using namespace RooFit;
76 using namespace RooStats;
77 class ModelInspectorGUI :
public TGMainFrame {
80 TRootEmbeddedCanvas *fCanvas;
88 RooFitResult *fFitRes;
92 vector<RooPlot *> fPlotList;
93 map<TGTripleHSlider *, const char *> fSliderMap;
94 map<TGTripleHSlider *, TGLabel *> fLabelMap;
97 TGTextButton *fExitButton;
101 TGVerticalFrame *fVFrame;
103 TGHorizontalFrame *fHframe0, *fHframe1, *fHframe2;
104 TGLayoutHints *fBly, *fBfly1, *fBfly2, *fBfly3;
105 TGTripleHSlider *fHslider1;
106 TGTextBuffer *fTbh1, *fTbh2, *fTbh3;
107 TGCheckButton *fCheck1, *fCheck2;
110 ModelInspectorGUI(RooWorkspace *, ModelConfig *, RooAbsData *);
111 virtual ~ModelInspectorGUI();
114 void DoText(
const char *text);
116 void DoSlider(
const char *);
119 void HandleButtons();
121 ClassDef(ModelInspectorGUI, 0)
125 ModelInspectorGUI::ModelInspectorGUI(RooWorkspace *w, ModelConfig *mc, RooAbsData *data)
126 : TGMainFrame(gClient->GetRoot(), 100, 100)
129 RooMsgService::instance().getStream(1).removeTopic(RooFit::NumIntegration);
133 RooSimultaneous *simPdf = NULL;
135 if (strcmp(fMC->GetPdf()->ClassName(),
"RooSimultaneous") == 0) {
136 cout <<
"Is a simultaneous PDF" << endl;
137 simPdf = (RooSimultaneous *)(fMC->GetPdf());
138 RooCategory *channelCat = (RooCategory *)(&simPdf->indexCat());
139 cout <<
" with " << channelCat->numTypes() <<
" categories" << endl;
140 numCats = channelCat->numTypes();
142 cout <<
"Is not a simultaneous PDF" << endl;
146 SetCleanup(kDeepCleanup);
150 fCanvas =
new TRootEmbeddedCanvas(
"Canvas",
this, 600, 400);
151 fLcan =
new TGLayoutHints(kLHintsExpandX | kLHintsExpandY, 10, 10, 10, 10);
152 AddFrame(fCanvas, fLcan);
153 fPlotList.resize(numCats);
155 fCanvas->GetCanvas()->Divide(numCats);
156 for (
int i = 0; i < numCats; ++i) {
157 fCanvas->GetCanvas()->cd(i + 1)->SetBorderMode(0);
158 fCanvas->GetCanvas()->cd(i + 1)->SetGrid();
162 fHframe0 =
new TGHorizontalFrame(
this, 0, 0, 0);
164 fCheck1 =
new TGCheckButton(fHframe0,
"&Constrained", HCId1);
165 fCheck2 =
new TGCheckButton(fHframe0,
"&Relative", HCId2);
166 fCheck1->SetState(kButtonUp);
167 fCheck2->SetState(kButtonUp);
168 fCheck1->SetToolTipText(
"Pointer position constrained to slider sides");
169 fCheck2->SetToolTipText(
"Pointer position relative to slider position");
171 fHframe0->Resize(200, 50);
173 fHframe2 =
new TGHorizontalFrame(
this, 0, 0, 0);
175 fFitButton =
new TGTextButton(fHframe2,
"Fit");
176 fFitButton->Connect(
"Clicked()",
"ModelInspectorGUI",
this,
"DoFit()");
177 fExitButton =
new TGTextButton(fHframe2,
"Exit ");
178 fExitButton->Connect(
"Clicked()",
"ModelInspectorGUI",
this,
"DoExit()");
180 fCheck1->Connect(
"Clicked()",
"ModelInspectorGUI",
this,
"HandleButtons()");
181 fCheck2->Connect(
"Clicked()",
"ModelInspectorGUI",
this,
"HandleButtons()");
183 fHframe2->Resize(100, 25);
186 fBly =
new TGLayoutHints(kLHintsTop | kLHintsExpandX, 5, 5, 5, 5);
189 fBfly1 =
new TGLayoutHints(kLHintsTop | kLHintsCenterX, 5, 5, 5, 5);
190 fBfly2 =
new TGLayoutHints(kLHintsTop | kLHintsLeft, 5, 5, 5, 5);
191 fBfly3 =
new TGLayoutHints(kLHintsTop | kLHintsRight, 5, 5, 5, 5);
193 fHframe2->AddFrame(fFitButton, fBfly2);
194 fHframe2->AddFrame(fExitButton, fBfly3);
196 AddFrame(fHframe0, fBly);
197 AddFrame(fHframe2, fBly);
201 RooArgSet parameters;
202 parameters.add(*fMC->GetParametersOfInterest());
203 parameters.add(*fMC->GetNuisanceParameters());
204 TIterator *it = parameters.createIterator();
205 RooRealVar *param = NULL;
208 fCan =
new TGCanvas(
this, 100, 100, kFixedSize);
209 AddFrame(fCan,
new TGLayoutHints(kLHintsExpandY | kLHintsExpandX));
210 fVFrame =
new TGVerticalFrame(fCan->GetViewPort(), 10, 10);
211 fCan->SetContainer(fVFrame);
215 while ((param = (RooRealVar *)it->Next())) {
216 cout <<
"Adding Slider for " << param->GetName() << endl;
217 TGHorizontalFrame *hframek =
new TGHorizontalFrame(fVFrame, 0, 0, 0);
220 new TGLabel(hframek, Form(
"%s = %.3f +%.3f", param->GetName(), param->getVal(), param->getError()));
221 TGTripleHSlider *hsliderk =
new TGTripleHSlider(hframek, 190, kDoubleScaleBoth, HSId1, kHorizontalFrame,
222 GetDefaultFrameBackground(), kFALSE, kFALSE, kFALSE, kFALSE);
223 hsliderk->Connect(
"PointerPositionChanged()",
"ModelInspectorGUI",
this,
"DoSlider()");
224 hsliderk->Connect(
"PositionChanged()",
"ModelInspectorGUI",
this,
"DoSlider()");
225 hsliderk->SetRange(param->getMin(), param->getMax());
227 hframek->Resize(200, 25);
228 fSliderList.Add(hsliderk);
229 fFrameList.Add(hframek);
231 hsliderk->SetPosition(param->getVal() - param->getError(), param->getVal() + param->getError());
232 hsliderk->SetPointerPosition(param->getVal());
234 hframek->AddFrame(hlabel, fBly);
235 hframek->AddFrame(hsliderk, fBly);
236 fVFrame->AddFrame(hframek, fBly);
237 fSliderMap[hsliderk] = param->GetName();
238 fLabelMap[hsliderk] = hlabel;
243 SetWindowName(
"RooFit/RooStats Model Inspector");
245 Resize(GetDefaultSize());
252 ModelInspectorGUI::~ModelInspectorGUI()
260 void ModelInspectorGUI::CloseWindow()
268 void ModelInspectorGUI::DoText(
const char * )
272 TGTextEntry *te = (TGTextEntry *)gTQSender;
273 Int_t
id = te->WidgetId();
276 case HId1: fHslider1->SetPosition(atof(fTbh1->GetString()), fHslider1->GetMaxPosition());
break;
277 case HId2: fHslider1->SetPointerPosition(atof(fTbh2->GetString()));
break;
278 case HId3: fHslider1->SetPosition(fHslider1->GetMinPosition(), atof(fTbh1->GetString()));
break;
285 void ModelInspectorGUI::DoFit()
287 fFitRes = fMC->GetPdf()->fitTo(*fData, Save());
288 map<TGTripleHSlider *, const char *>::iterator it;
290 it = fSliderMap.begin();
291 for (; it != fSliderMap.end(); ++it) {
292 RooRealVar *param = fWS->var(it->second);
293 param = (RooRealVar *)fFitRes->floatParsFinal().find(it->second);
294 it->first->SetPosition(param->getVal() - param->getError(), param->getVal() + param->getError());
295 it->first->SetPointerPosition(param->getVal());
301 void ModelInspectorGUI::DoSlider(
const char *text)
303 cout <<
"." << text << endl;
307 void ModelInspectorGUI::DoSlider()
313 RooSimultaneous *simPdf = NULL;
315 if (strcmp(fMC->GetPdf()->ClassName(),
"RooSimultaneous") == 0) {
316 simPdf = (RooSimultaneous *)(fMC->GetPdf());
317 RooCategory *channelCat = (RooCategory *)(&simPdf->indexCat());
318 numCats = channelCat->numTypes();
329 map<TGTripleHSlider *, const char *>::iterator it;
332 fPlot = ((RooRealVar *)fMC->GetObservables()->first())->frame();
333 fData->plotOn(fPlot);
337 it = fSliderMap.begin();
338 for (; it != fSliderMap.end(); ++it) {
339 const char *name = it->second;
340 fWS->var(name)->setVal(it->first->GetMaxPosition());
341 RooRealVar *param = fWS->var(name);
342 fLabelMap[it->first]->SetText(Form(
"%s = %.3f [%.3f,%.3f]", param->GetName(), it->first->GetPointerPosition(),
343 it->first->GetMinPosition(), it->first->GetMaxPosition()));
345 normCount = fMC->GetPdf()->expectedEvents(*fMC->GetObservables());
346 fMC->GetPdf()->plotOn(fPlot, LineColor(kRed), Normalization(normCount, RooAbsReal::NumEvent));
349 it = fSliderMap.begin();
350 for (; it != fSliderMap.end(); ++it) {
351 const char *name = it->second;
352 fWS->var(name)->setVal(it->first->GetMinPosition());
354 normCount = fMC->GetPdf()->expectedEvents(*fMC->GetObservables());
355 fMC->GetPdf()->plotOn(fPlot, LineColor(kGreen), Normalization(normCount, RooAbsReal::NumEvent));
358 it = fSliderMap.begin();
359 for (; it != fSliderMap.end(); ++it) {
360 const char *name = it->second;
361 fWS->var(name)->setVal(it->first->GetPointerPosition());
363 normCount = fMC->GetPdf()->expectedEvents(*fMC->GetObservables());
364 fMC->GetPdf()->plotOn(fPlot, LineColor(kBlue), Normalization(normCount, RooAbsReal::NumEvent));
367 fCanvas->GetCanvas()->Modified();
368 fCanvas->GetCanvas()->Update();
374 RooCategory *channelCat = (RooCategory *)(&simPdf->indexCat());
376 TIterator *iter = channelCat->typeIterator();
377 RooCatType *tt = NULL;
378 Int_t frameIndex = 0;
379 while ((tt = (RooCatType *)iter->Next())) {
381 fCanvas->GetCanvas()->cd(frameIndex);
384 RooAbsPdf *pdftmp = simPdf->getPdf(tt->GetName());
385 RooArgSet *obstmp = pdftmp->getObservables(*fMC->GetObservables());
386 RooRealVar *obs = ((RooRealVar *)obstmp->first());
388 fPlot = fPlotList.at(frameIndex - 1);
391 fPlot = obs->frame();
392 fPlotList.at(frameIndex - 1) = fPlot;
394 RooFit::MsgLevel msglevel = RooMsgService::instance().globalKillBelow();
395 RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING);
396 fData->plotOn(fPlot, MarkerSize(1),
397 Cut(Form(
"%s==%s::%s", channelCat->GetName(), channelCat->GetName(), tt->GetName())),
398 DataError(RooAbsData::None));
399 RooMsgService::instance().setGlobalKillBelow(msglevel);
401 map<TGTripleHSlider *, const char *>::iterator it;
406 it = fSliderMap.begin();
407 for (; it != fSliderMap.end(); ++it) {
408 const char *name = it->second;
409 fWS->var(name)->setVal(it->first->GetMaxPosition());
410 RooRealVar *param = fWS->var(name);
411 fLabelMap[it->first]->SetText(Form(
"%s = %.3f [%.3f,%.3f]", param->GetName(),
412 it->first->GetPointerPosition(), it->first->GetMinPosition(),
413 it->first->GetMaxPosition()));
415 normCount = pdftmp->expectedEvents(*obs);
416 pdftmp->plotOn(fPlot, LineColor(kRed), LineWidth(2.), Normalization(normCount, RooAbsReal::NumEvent));
419 it = fSliderMap.begin();
420 for (; it != fSliderMap.end(); ++it) {
421 const char *name = it->second;
422 fWS->var(name)->setVal(it->first->GetMinPosition());
423 RooRealVar *param = fWS->var(name);
424 fLabelMap[it->first]->SetText(Form(
"%s = %.3f [%.3f,%.3f]", param->GetName(),
425 it->first->GetPointerPosition(), it->first->GetMinPosition(),
426 it->first->GetMaxPosition()));
428 normCount = pdftmp->expectedEvents(*obs);
429 pdftmp->plotOn(fPlot, LineColor(kGreen), LineWidth(2.), Normalization(normCount, RooAbsReal::NumEvent));
432 it = fSliderMap.begin();
433 for (; it != fSliderMap.end(); ++it) {
434 const char *name = it->second;
435 fWS->var(name)->setVal(it->first->GetPointerPosition());
436 RooRealVar *param = fWS->var(name);
437 fLabelMap[it->first]->SetText(Form(
"%s = %.3f [%.3f,%.3f]", param->GetName(),
438 it->first->GetPointerPosition(), it->first->GetMinPosition(),
439 it->first->GetMaxPosition()));
441 normCount = pdftmp->expectedEvents(*obs);
443 pdftmp->plotOn(fPlot, LineColor(kBlue), LineWidth(2.), Normalization(normCount, RooAbsReal::NumEvent));
445 pdftmp->plotOn(fPlot, Normalization(normCount, RooAbsReal::NumEvent),
446 VisualizeError(*fFitRes, *fMC->GetNuisanceParameters()), FillColor(kYellow));
447 pdftmp->plotOn(fPlot, LineColor(kBlue), LineWidth(2.), Normalization(normCount, RooAbsReal::NumEvent));
448 msglevel = RooMsgService::instance().globalKillBelow();
449 RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING);
450 fData->plotOn(fPlot, MarkerSize(1),
451 Cut(Form(
"%s==%s::%s", channelCat->GetName(), channelCat->GetName(), tt->GetName())),
452 DataError(RooAbsData::None));
453 RooMsgService::instance().setGlobalKillBelow(msglevel);
457 fCanvas->GetCanvas()->Modified();
458 fCanvas->GetCanvas()->Update();
465 void ModelInspectorGUI::HandleButtons()
469 TGButton *btn = (TGButton *)gTQSender;
470 Int_t
id = btn->WidgetId();
473 case HCId1: fHslider1->SetConstrained(fCheck1->GetState());
break;
474 case HCId2: fHslider1->SetRelative(fCheck2->GetState());
break;
478 void ModelInspectorGUI::DoExit()
480 printf(
"Exit application...");
481 gApplication->Terminate(0);
484 void ModelInspector(
const char *infile =
"",
const char *workspaceName =
"combined",
485 const char *modelConfigName =
"ModelConfig",
const char *dataName =
"obsData")
492 const char *filename =
"";
493 if (!strcmp(infile,
"")) {
494 filename =
"results/example_combined_GaussExample_model.root";
495 bool fileExist = !gSystem->AccessPathName(filename);
499 cout <<
"HistFactory file cannot be generated on Windows - exit" << endl;
503 cout <<
"will run standard hist2workspace example" << endl;
504 gROOT->ProcessLine(
".! prepareHistFactory .");
505 gROOT->ProcessLine(
".! hist2workspace config/example.xml");
506 cout <<
"\n\n---------------------" << endl;
507 cout <<
"Done creating example input" << endl;
508 cout <<
"---------------------\n\n" << endl;
515 TFile *file = TFile::Open(filename);
519 cout <<
"StandardRooStatsDemoMacro: Input file " << filename <<
" is not found" << endl;
528 RooWorkspace *w = (RooWorkspace *)file->Get(workspaceName);
530 cout <<
"workspace not found" << endl;
535 ModelConfig *mc = (ModelConfig *)w->obj(modelConfigName);
538 RooAbsData *data = w->data(dataName);
543 cout <<
"data or ModelConfig was not found" << endl;
547 new ModelInspectorGUI(w, mc, data);