2 #include <TApplication.h>
4 #include <TRootCanvas.h>
11 #include "PointDraw.h"
13 #include "ROOT/RConfig.hxx"
22 std::string PointDraw::fgEnvironment =
"";
38 int PointDraw::Draw(std::string config, std::string userConfig, std::string environment, std::string userConfigRaw)
43 TApplication app(
"app",
nullptr,
nullptr);
45 std::string parameter =
"";
46 std::string resultsHnSparseName =
"results";
47 std::string parameterAxisName =
"parameters";
48 std::string inputFile;
50 fCurrentParameterName = parameter;
52 TH1::AddDirectory(kFALSE);
55 if (!Core::LoadConfig(config, userConfig, environment, userConfigRaw))
return 1;
58 bool histogramEnabled =
false;
59 if (!gCfg[
"ndmspc"][
"data"][
"histogram"][
"enabled"].is_null() ||
60 gCfg[
"ndmspc"][
"data"][
"histogram"][
"enabled"].is_boolean())
61 histogramEnabled = gCfg[
"ndmspc"][
"data"][
"histogram"][
"enabled"].get<
bool>();
64 std::string hostUrl = gCfg[
"ndmspc"][
"output"][
"host"].get<std::string>();
71 if (!hostUrl.empty()) path = hostUrl +
"/";
72 path += gCfg[
"ndmspc"][
"output"][
"dir"].get<std::string>() +
"/";
74 path += environment +
"/";
77 for (
auto & cut : gCfg[
"ndmspc"][
"cuts"]) {
78 if (cut[
"enabled"].is_boolean() && cut[
"enabled"].get<
bool>() ==
false)
continue;
87 path += Utils::GetCutsPath(gCfg[
"ndmspc"][
"cuts"]);
89 if (inputFile.empty()) inputFile = path +
"results.root";
91 Printf(
"Opening file '%s' ...", inputFile.c_str());
93 fIn = TFile::Open(inputFile.c_str());
95 Printf(
"Error: Input file '%s' was not found !!!", inputFile.c_str());
99 fResultHnSparse = (THnSparse *)fIn->Get(resultsHnSparseName.c_str());
101 if (!fResultHnSparse) {
102 Printf(
"Error: Results THnSparse histogram '%s' was not found !!!", resultsHnSparseName.c_str());
106 fMapAxesType = (TH1 *)fIn->Get(
"mapAxesType");
108 Printf(
"Error: 'mapAxesType' histogram was not found !!!");
111 for (
int iDim = 0; iDim < fResultHnSparse->GetNdimensions(); iDim++) fParameterPoint.push_back(-1);
113 if (fCurrentParameterName.empty()) {
114 int idxDefault = gCfg[
"ndmspc"][
"result"][
"parameters"][
"default"].get<
int>();
115 fCurrentParameterName = gCfg[
"ndmspc"][
"result"][
"parameters"][
"labels"][idxDefault].get<std::string>();
117 Printf(
"Parameter: %s", fCurrentParameterName.c_str());
119 TAxis * a = (TAxis *)fResultHnSparse->GetListOfAxes()->FindObject(parameterAxisName.c_str());
123 Int_t
id = fResultHnSparse->GetListOfAxes()->IndexOf(a);
124 Int_t idBin = a->FindBin(fCurrentParameterName.c_str());
126 Printf(
"Could not find bin label '%s' in '%s' axis !!!", parameterAxisName.c_str(), fCurrentParameterName.c_str());
131 fParameterPoint[id] = idBin;
132 fResultHnSparse->GetAxis(
id)->SetRange(idBin, idBin);
134 int nAxisX = fResultHnSparse->GetNdimensions();
135 int nAxisY = fResultHnSparse->GetAxis(0)->GetNbins();
136 int pointsSize = gCfg[
"ndmspc"][
"result"][
"axes"].size() + 1;
137 if (histogramEnabled) pointsSize += gCfg[
"ndmspc"][
"result"][
"data"][
"defaults"].size() + 1;
138 int points[pointsSize];
140 points[iPoint++] = nAxisY;
142 fMapTitle = fCurrentParameterName +
" [";
143 json axesArray = gCfg[
"ndmspc"][
"result"][
"axes"];
145 bool isDataSys =
true;
146 bool hasDataMc =
false;
147 for (
int iAxis = iAxisStart; iAxis < fResultHnSparse->GetNdimensions(); iAxis++) {
149 std::string axisType = fMapAxesType->GetXaxis()->GetBinLabel(iAxis + 1);
151 if (!hasDataMc) hasDataMc = !axisType.compare(
"data");
152 if (!axisType.compare(
"proj")) {
154 fProjectionAxes.push_back(iAxis);
156 else if (!axisType.compare(
"sys-in") || !axisType.compare(
"data")) {
158 idTmp = iAxis - iAxisStart;
160 idBin = gCfg[
"ndmspc"][
"result"][
"data"][
"defaults"][idTmp].get<
int>();
163 idTmp = iAxis - iAxisStart - fNDimCuts;
164 if (histogramEnabled) idTmp -= gCfg[
"ndmspc"][
"result"][
"data"][
"defaults"].size();
166 idBin = axesArray[idTmp][
"default"].get<
int>() + 1;
169 a = (TAxis *)fResultHnSparse->GetAxis(iAxis);
171 points[iAxis] = a->GetNbins();
172 fParameterPoint[iAxis] = idBin;
173 fResultHnSparse->GetAxis(iAxis)->SetRange(idBin, idBin);
174 std::string l = a->GetBinLabel(idBin);
176 fMapTitle += std::to_string(a->GetBinLowEdge(idBin));
183 fMapTitle[fMapTitle.size() - 1] =
']';
192 auto CanvasMain =
new TCanvas(
"CanvasMain",
"CanvasMain", 0, 0, 500, 800);
193 CanvasMain->Divide(1, 2);
195 CanvasMain->Connect(
"Highlighted(TVirtualPad*,TObject*,Int_t,Int_t)",
"Ndmspc::PointDraw",
this,
196 "HighlightMain(TVirtualPad*,TObject*,Int_t,Int_t)");
201 TH1 * hParamMain =
new TH1S(
"hParamMain",
"Param Main", fResultHnSparse->GetAxis(0)->GetNbins(), 0,
202 fResultHnSparse->GetAxis(0)->GetNbins());
204 for (
int i = 0; i < fResultHnSparse->GetAxis(0)->GetNbins(); i++) {
205 hParamMain->GetXaxis()->SetBinLabel(i + 1, fResultHnSparse->GetAxis(0)->GetBinLabel(i + 1));
215 hParamMain->SetStats(0);
219 hParamMain->SetHighlight();
223 fResultHnSparse->GetAxis(1)->SetRange();
224 fResultHnSparse->GetAxis(2)->SetRange();
226 fDataId.push_back(-1);
228 fData.push_back(
"x");
234 for (
auto & b1 : gCfg[
"ndmspc"][
"data"][
"histogram"][
"bins"]) {
235 std::vector<int> b = b1;
242 v += fResultHnSparse->GetAxis(2)->GetBinLabel(b[1]);
244 v += std::to_string(b[2]) +
"|";
245 v += std::to_string(b[3]);
247 fMcId.push_back(b[1]);
249 else if (b[1] == 1) {
251 v += fResultHnSparse->GetAxis(1)->GetBinLabel(b[0]);
253 v += std::to_string(b[2]) +
"|";
254 v += std::to_string(b[3]);
256 fDataId.push_back(b[0]);
261 TH1 * hDataMc =
new TH2S(
"hDataMc",
"Data vs. MC", fData.size(), 0, fData.size(), fMc.size(), 0, fMc.size());
265 hDataMc->SetStats(0);
266 for (
int i = 0; i < fData.size(); i++) {
267 hDataMc->GetXaxis()->SetBinLabel(i + 1, fData[i].c_str());
269 for (
int i = 0; i < fMc.size(); i++) {
270 hDataMc->GetYaxis()->SetBinLabel(i + 1, fMc[i].c_str());
273 for (
int i = 1; i < hDataMc->GetNbinsX() + 1; i++)
274 for (
int j = 1; j < hDataMc->GetNbinsY() + 1; j++) {
275 if (i == 1 && j == 1)
continue;
276 if (i == 1 || j == 1) hDataMc->SetBinContent(i, j, 1);
282 hDataMc->Draw(
"col");
283 hDataMc->SetHighlight();
287 CanvasMain->Modified();
288 CanvasMain->Update();
294 void PointDraw::DrawUser()
296 Printf(
"DrawUser : Getting '%s' ...", fCurrentContentPath.c_str());
297 auto CanvasUser = (TCanvas *)gROOT->GetListOfCanvases()->FindObject(
"CanvasUser");
299 CanvasUser =
new TCanvas(
"CanvasUser",
"CanvasUser", 910, 0, 400, 400);
301 CanvasUser->Divide(2, 2);
305 TH1 * hSigBg = (TH1 *)fIn->Get(TString::Format(
"%s/hSigBg", fCurrentContentPath.c_str()));
306 TH1 * hBg = (TH1 *)fIn->Get(TString::Format(
"%s/hBg", fCurrentContentPath.c_str()));
307 TH1 * hBgNorm = (TH1 *)fIn->Get(TString::Format(
"%s/hBgNorm", fCurrentContentPath.c_str()));
308 TH1 * hPeak = (TH1 *)fIn->Get(TString::Format(
"%s/hPeak", fCurrentContentPath.c_str()));
310 CanvasUser->Clear(
"D");
311 CanvasUser->Modified();
312 CanvasUser->Update();
319 hBg->SetLineColor(kViolet);
320 hBg->SetMarkerColor(kViolet);
323 hBgNorm->SetLineColor(kGreen);
324 hBgNorm->SetMarkerColor(kGreen);
328 if (hSigBg) hSigBg->Draw();
329 if (hBg) hBg->Draw(
"SAME");
331 if (hSigBg) hSigBg->Draw();
332 if (hBgNorm) hBgNorm->Draw(
"SAME");
334 if (hPeak) hPeak->Draw();
338 TF1 * funSignal = (TF1 *)hPeak->GetListOfFunctions()->At(0);
343 CanvasUser->Modified();
344 CanvasUser->Update();
347 void PointDraw::UpdateRanges()
349 for (
int iAxis = 0; iAxis < fResultHnSparse->GetNdimensions(); iAxis++) {
353 fResultHnSparse->GetAxis(iAxis)->SetRange(fParameterPoint[iAxis], fParameterPoint[iAxis]);
356 fCurrentContentPath.clear();
358 for (
auto & p : fParameterPoint) {
359 if (fCurrentContentPath.empty()) {
360 fCurrentContentPath =
"content/";
363 fCurrentContentPath += std::to_string(std::abs(p)) +
"/";
367 void PointDraw::DrawProjections(
bool ignoreMapping)
373 if (fParameterPoint.size() == 0)
return;
375 int xBin = fParameterPoint[fProjectionAxes[0]];
378 if (fProjectionAxes.size() == 2) {
379 xBin = fParameterPoint[fProjectionAxes[1]];
380 yBin = fParameterPoint[fProjectionAxes[0]];
386 if (!gCfg[
"ndmspc"][
"result"][
"parameters"][
"draw"][fCurrentParameterName].is_null()) {
389 min = gCfg[
"ndmspc"][
"result"][
"parameters"][
"draw"][fCurrentParameterName][
"min"].get<
double>();
390 max = gCfg[
"ndmspc"][
"result"][
"parameters"][
"draw"][fCurrentParameterName][
"max"].get<
double>();
393 auto CanvasProjectionMap = (TCanvas *)gROOT->GetListOfCanvases()->FindObject(
"CanvasProjectionMap");
394 if (!CanvasProjectionMap) {
395 CanvasProjectionMap =
new TCanvas(
"CanvasProjectionMap",
"CanvasProjectionMap", 505, 0, 400, 400);
398 CanvasProjectionMap->Connect(
"Highlighted(TVirtualPad*,TObject*,Int_t,Int_t)",
"Ndmspc::PointDraw",
this,
399 "HighlightProjectionPoint(TVirtualPad*,TObject*,Int_t,Int_t)");
402 if (!ignoreMapping) {
404 if (fProjectionAxes.size() == 1) {
405 CanvasProjectionMap->cd();
406 fResultHnSparse->GetAxis(fProjectionAxes[0])->SetRange();
407 TH1 * h = fResultHnSparse->Projection(fProjectionAxes[0],
"O");
415 CanvasProjectionMap->Modified();
416 CanvasProjectionMap->Update();
419 if (fProjectionAxes.size() == 2) {
420 CanvasProjectionMap->cd();
421 fResultHnSparse->GetAxis(fProjectionAxes[0])->SetRange();
422 fResultHnSparse->GetAxis(fProjectionAxes[1])->SetRange();
424 TH2 * h = fResultHnSparse->Projection(fProjectionAxes[1], fProjectionAxes[0],
"O");
427 CanvasProjectionMap->Modified();
428 CanvasProjectionMap->Update();
432 auto CanvasProjections = (TCanvas *)gROOT->GetListOfCanvases()->FindObject(
"CanvasProjections");
433 if (!CanvasProjections) {
434 CanvasProjections =
new TCanvas(
"CanvasProjections",
"CanvasProjections", 505, 445, 400, 350);
436 CanvasProjections->Divide(1, fProjectionAxes.size());
442 CanvasProjections->cd(1);
443 fResultHnSparse->GetAxis(fProjectionAxes[0])->SetRange();
444 fResultHnSparse->GetAxis(fProjectionAxes[1])->SetRange(xBin, xBin);
445 px = fResultHnSparse->Projection(fProjectionAxes[0],
"O");
453 if (fProjectionAxes.size() == 2) {
454 CanvasProjections->cd(2);
455 if (fProjectionAxes.size() > 1) fResultHnSparse->GetAxis(fProjectionAxes[1])->SetRange();
456 if (yBin > 0) fResultHnSparse->GetAxis(fProjectionAxes[0])->SetRange(yBin, yBin);
457 py = fResultHnSparse->Projection(fProjectionAxes[1],
"O");
467 CanvasProjections->Modified();
468 CanvasProjections->Update();
471 void PointDraw::HighlightMain(TVirtualPad * pad, TObject * obj, Int_t xBin, Int_t yBin)
474 std::string hName = h->GetName();
475 if (!hName.compare(
"hParamMain")) {
476 HighlightParam(pad, obj, xBin, yBin);
478 else if (!hName.compare(
"hDataMc")) {
479 HighlightData(pad, obj, xBin, yBin);
483 void PointDraw::HighlightParam(TVirtualPad * pad, TObject * obj, Int_t xBin, Int_t yBin)
486 TH1 * fParamMapHistogram = (TH1 *)obj;
487 if (!fParamMapHistogram)
return;
491 fParamMapHistogram->SetTitle(fParamMapHistogram->GetXaxis()->GetBinLabel(xBin));
492 fParameterPoint[0] = xBin;
493 fCurrentParameterName = fParamMapHistogram->GetXaxis()->GetBinLabel(xBin);
501 void PointDraw::HighlightData(TVirtualPad * pad, TObject * obj, Int_t xBin, Int_t yBin)
504 TH2 * hDataMc = (TH2 *)obj;
505 if (!hDataMc)
return;
507 if (hDataMc->GetBinContent(xBin, yBin) <= 0) {
508 hDataMc->SetTitle(
"Data vs. MC");
514 std::string data = hDataMc->GetXaxis()->GetBinLabel(xBin);
515 std::string mc = hDataMc->GetYaxis()->GetBinLabel(yBin);
516 hDataMc->SetTitle(TString::Format(
"%s vs %s", data.c_str(), mc.c_str()).Data());
517 Printf(
"data=%s[%d] mc=%s[%d]", data.c_str(), xBin, mc.c_str(), yBin);
518 fParameterPoint[1] = xBin;
519 fParameterPoint[2] = yBin;
521 if (xBin == 1 && yBin > 1) {
523 ptrdiff_t pos = distance(fMc.begin(), find(fMc.begin(), fMc.end(), mc));
524 fParameterPoint[2] = fMcId[int(pos)];
525 std::vector<std::string> tok = Ndmspc::Utils::Tokenize(mc,
'|');
526 fParameterPoint[3] = atoi(tok[1].c_str());
527 fParameterPoint[4] = atoi(tok[2].c_str());
529 else if (yBin == 1 && xBin > 1) {
531 ptrdiff_t pos = distance(fData.begin(), find(fData.begin(), fData.end(), data));
532 fParameterPoint[1] = fDataId[int(pos)];
533 std::vector<std::string> tok = Ndmspc::Utils::Tokenize(data,
'|');
534 fParameterPoint[3] = atoi(tok[1].c_str());
535 fParameterPoint[4] = atoi(tok[2].c_str());
551 void PointDraw::HighlightProjectionPoint(TVirtualPad * pad, TObject * obj, Int_t xBin, Int_t yBin)
554 if (fProjectionAxes.size() == 1) {
555 fParameterPoint[fProjectionAxes[0]] = xBin;
557 else if (fProjectionAxes.size() == 2) {
558 fParameterPoint[fProjectionAxes[0]] = xBin;
559 fParameterPoint[fProjectionAxes[1]] = yBin;
562 DrawProjections(
true);
int Draw(std::string config="myAnalysis.json", std::string userConfig="", std::string environment="", std::string userConfigRaw="")