20 fRefHistosNames(nullptr),
30 runs =
new Int_t[
nRuns]{6, 7};
31 setups =
new TString[
nRuns]{
"BM@N",
"SRC"};
43 Fatal(
"BmnQaMonitor::BmnQaMonitor(TString dir)",
"Histogram directory is empty or does no exist!!!");
44 isOneRefDrawn = kFALSE;
56 RegisterUserCommands();
79void BmnQaMonitor::CreateInfoLists() {
83 fRefList =
new TList();
84 fRefList->SetName(
"refList");
88 for (Int_t iRelease = 0; iRelease < nReleases; iRelease++) {
90 TList *listForRel =
new TList();
91 listForRel->SetName(listOfReleases[iRelease].Data());
92 fRefList->Add(listForRel);
94 for (Int_t iRun = 0; iRun <
nRuns; iRun++) {
95 bri[iRelease][iRun] =
new BmnRunInfo**[nSetups];
96 TList *listForPeriod =
new TList();
97 listForPeriod->SetName(Form(
"%d", runs[iRun]));
98 listForRel->Add(listForPeriod);
100 for (Int_t iSetup = 0; iSetup < nSetups; iSetup++) {
101 TString prefix = TString::Format(
"RELEASE%s_RUN%d_SETUP_%s_", listOfReleases[iRelease].Data(), runs[iRun], setups[iSetup].Data());
103 pair <Int_t, Int_t> borderFiles = fSteering->
GetBorderRuns(runs[iRun], setups[iSetup]);
104 const Int_t nFiles = borderFiles.second - borderFiles.first + 1;
106 TList *listForSetup =
new TList();
107 listForSetup->SetName(Form(
"%s", setups[iSetup].Data()));
108 listForPeriod->Add(listForSetup);
110 bri[iRelease][iRun][iSetup] =
new BmnRunInfo*[nFiles];
112 for (Int_t iFile = borderFiles.first; iFile < borderFiles.second + 1; iFile++) {
113 TFile*
f =
new TFile(Form(
"%s/%s/run%d/%s/qa_%d.root", fHistoDir.Data(), listOfReleases[iRelease].Data(), runs[iRun], setups[iSetup].Data(), iFile),
"r");
121 bri[iRelease][iRun][iSetup][iFile - borderFiles.first] =
new BmnRunInfo(
run);
122 listForSetup->Add((TObject*) bri[iRelease][iRun][iSetup][iFile - borderFiles.first]);
131 TString
name =
"infoCanvas";
132 infoCanvas =
new TCanvas(name, name, 3 * 320, 1 * 240 * 2 / 3);
133 infoCanvas->Divide(3, 1);
136void BmnQaMonitor::DivideCanvases() {
137 for (Int_t iDim = 0; iDim < nDims; iDim++)
138 for (Int_t iCanvas = 0; iCanvas < nCanvases; iCanvas++) {
139 TString
name = TString(fCanvases[iDim][iCanvas]->GetName());
140 TString prefix =
name.Contains(
"1d") ?
"1d" :
"2d";
141 Int_t nRows = fSteering->
GetCanvasSizes(runs[fPeriod], setups[fSetup].Data(), name, prefix).first;
142 Int_t nColumns = fSteering->
GetCanvasSizes(runs[fPeriod], setups[fSetup].Data(), name, prefix).second;
144 if (nRows == -1 && nColumns == -1)
147 fCanvases[iDim][iCanvas]->Divide(nColumns, nRows);
153 AllHistos* currHistos = GetCurrentRun(fCurrentRun);
154 vector <TH1F*> h1Curr = currHistos->
Get1D();
155 vector <TH2F*> h2Curr = currHistos->
Get2D();
158 vector <TH1F*> h1Ref = refHistos->
Get1D();
159 vector <TH2F*> h2Ref = refHistos->
Get2D();
161 vector <TNamed*> hCurr;
162 vector <TNamed*> hRef;
165 fRefHistosNames =
new vector <TString>;
167 for (
auto it : h1Curr)
168 hCurr.push_back((TNamed*) it);
169 for (
auto it : h2Curr)
170 hCurr.push_back((TNamed*) it);
171 for (
auto it : h1Ref)
172 hRef.push_back((TNamed*) it);
173 for (
auto it : h2Ref)
174 hRef.push_back((TNamed*) it);
179 detectors.push_back(
"TRIGGERS");
180 detectors.push_back(
"DST");
182 for (Int_t iDim = 0; iDim < nDims; iDim++)
183 for (Int_t iCanvas = 0; iCanvas < nCanvases; iCanvas++) {
184 TCanvas * c = fCanvases[iDim][iCanvas];
185 Int_t padCounter = 1;
186 TString nameCanvas = (TString) c->GetName();
188 for (
auto det : detectors) {
189 if (!nameCanvas.Contains(det.Data()))
192 for (
auto itCurr : hCurr)
193 for (
auto itRef : hRef) {
194 TString currName = (TString) itCurr->GetName();
195 TString refName = (TString) itRef->GetName();
197 if (currName != refName)
200 TString nameHisto = (TString) itRef->GetName();
201 if (!nameHisto.Contains(det.Data()) || !nameHisto.Contains(nameCanvas.Data()))
203 TVirtualPad* pad = c->cd(padCounter);
207 vector <TString>& vec = *fRefHistosNames;
208 for (
auto it : vec) {
209 TObject* obj = pad->GetPrimitive(it.Data());
213 pad->GetListOfPrimitives()->Remove(obj);
216 TString baseName = TString(itRef->GetName());
218 itRef->SetName(baseName.Data());
219 fRefHistosNames->push_back(itRef->GetName());
227 if (!currName.Contains(
"vs.") && !refName.Contains(
"vs.")) {
228 TH1F* cur = (TH1F*) itCurr;
230 if (!refName.Contains(
", Ref")) {
232 itRef->SetName(refName.Data());
235 TH1F* ref = (TH1F*) itRef;
237 Double_t maxCurr = cur->GetMaximum();
238 Double_t maxRef = ref->GetMaximum();
240 if (maxRef > maxCurr) {
241 TH1F* h = (TH1F*) pad->GetPrimitive(cur->GetName());
242 pad->GetListOfPrimitives()->Remove(h);
245 ref->SetLineColor(kRed);
246 cur->GetYaxis()->SetRangeUser(0., maxRef * 1.3);
248 if (ref->GetSumOfWeights() > FLT_EPSILON)
249 cur->DrawNormalized(
"same", ref->Integral());
251 if (ref->GetSumOfWeights() > FLT_EPSILON)
252 ref->DrawNormalized(
"same", cur->Integral())->SetLineColor(kRed);
265 isOneRefDrawn = kTRUE;
267 TList* periodList = (TList*) fRefList->At(fRelease);
268 TList* setupList = (TList*) periodList->At(fPeriod);
269 TList* runList = (TList*) setupList->At(fSetup);
272 if (tmp->GetRunNumber() ==
run) {
282 vector <TH1F*> h1 = allHistos->
Get1D();
283 vector <TH2F*> h2 = allHistos->
Get2D();
286 delete fRefHistosNames;
288 isOneRefDrawn = kFALSE;
293 h.push_back((TNamed*) it);
295 h.push_back((TNamed*) it);
300 detectors.push_back(
"TRIGGERS");
301 detectors.push_back(
"DST");
306 for (Int_t iDim = 0; iDim < nDims; iDim++)
307 for (Int_t iCanvas = 0; iCanvas < nCanvases; iCanvas++) {
308 TCanvas* c = fCanvases[iDim][iCanvas];
309 Int_t padCounter = 1;
310 TString nameCanvas = (TString) c->GetName();
312 for (
auto det : detectors) {
313 if (!nameCanvas.Contains(det.Data()))
317 TString nameHisto = (TString) it->GetName();
318 if (!nameHisto.Contains(det.Data()) || !nameHisto.Contains(nameCanvas.Data()))
325 Bool_t isColz = nameHisto.Contains(
"vs.") ? kTRUE : kFALSE;
327 TH2F* tmp = (TH2F*) it;
330 TH1F* tmp = (TH1F*) it;
332 tmp->GetYaxis()->UnZoom();
340 TList* periodList = (TList*) fRefList->At(fRelease);
341 TList* setupList = (TList*) periodList->At(fPeriod);
342 TList* runList = (TList*) setupList->At(fSetup);
345 if (tmp->GetRunNumber() ==
run) {
353void BmnQaMonitor::InitServer() {
354 const Char_t* cgiStr = Form(
"fastcgi:%d", 9000);
355 const Char_t* httpStr = Form(
"http:%d;noglobal", 8080);
358 fServer =
new THttpServer(httpStr);
361 fServer->CreateEngine(cgiStr);
362 fServer->SetTimer(100, kFALSE);
365void BmnQaMonitor::RegisterCanvases() {
366 fCanvases =
new TCanvas**[nDims];
367 for (Int_t iDim = 0; iDim < nDims; iDim++) {
368 fCanvases[iDim] =
new TCanvas*[nCanvases];
369 for (Int_t iCanvas = 0; iCanvas < nCanvases; iCanvas++) {
370 TString prefix = (iDim == 0) ?
"1d" :
"2d";
372 fCanvases[iDim][iCanvas] =
373 new TCanvas(Form(
"%s_%s", fSteering->
GetListOfCanvases()[iCanvas].Data(), prefix.Data()),
374 Form(
"%s_%s", fSteering->
GetListOfCanvases()[iCanvas].Data(), prefix.Data()), 800, 800);
396 for (Int_t iRun = 0; iRun <
nRuns; iRun++) {
414 for (Int_t iSetup = 0; iSetup < nSetups; iSetup++) {
415 if (iRun == 0 && iSetup == 1)
417 vector <TString> detectors = fSteering->
GetDetectors(runs[iRun], setups[iSetup]);
418 vector <TString> triggs = fSteering->
GetTriggers(runs[iRun], setups[iSetup]);
420 if (detectors.size() == 0 && triggs.size() == 0)
423 UInt_t
id = fSteering->
GetBorderRuns(runs[iRun], setups[iSetup]).first;
424 for (
auto det : detectors) {
427 else if (det ==
"SILICON")
429 else if (det ==
"CSC" && iRun != 0)
431 else if (det ==
"TOF400")
433 else if (det ==
"TOF700")
435 else if (det ==
"MWPC")
437 else if (det ==
"DCH")
439 else if (det ==
"ECAL")
441 else if (det ==
"ZDC")
446 dst[iRun][iSetup] =
new BmnDstQa(
id);
450 for (Int_t iRun = 0; iRun <
nRuns; iRun++)
451 for (Int_t iSetup = 0; iSetup < nSetups; iSetup++) {
453 if (iRun == 0 && iSetup == 1)
457 GetHistoNames <BmnTrigDetQa> (triggers[iRun][iSetup]);
459 GetHistoNames <BmnCoordinateDetQa> (gem[iRun][iSetup]);
460 GetHistoNames <BmnCoordinateDetQa> (silicon[iRun][iSetup]);
462 GetHistoNames <BmnCoordinateDetQa> (csc[iRun][iSetup]);
464 GetHistoNames <BmnTimeDetQa> (tof400[iRun][iSetup]);
465 GetHistoNames <BmnTimeDetQa> (tof700[iRun][iSetup]);
466 GetHistoNames <BmnTimeDetQa> (dch[iRun][iSetup]);
467 GetHistoNames <BmnTimeDetQa> (mwpc[iRun][iSetup]);
469 GetHistoNames <BmnCalorimeterDetQa> (ecal[iRun][iSetup]);
470 GetHistoNames <BmnCalorimeterDetQa> (zdc[iRun][iSetup]);
472 GetHistoNames <BmnDstQa> (dst[iRun][iSetup]);
475 GetHistosToBeRegistered <BmnTrigDetQa> (triggers[iRun][iSetup]);
477 GetHistosToBeRegistered <BmnCoordinateDetQa> (gem[iRun][iSetup]);
478 GetHistosToBeRegistered <BmnCoordinateDetQa> (silicon[iRun][iSetup]);
480 GetHistosToBeRegistered <BmnCoordinateDetQa> (csc[iRun][iSetup]);
482 GetHistosToBeRegistered <BmnTimeDetQa> (tof400[iRun][iSetup]);
483 GetHistosToBeRegistered <BmnTimeDetQa> (tof700[iRun][iSetup]);
484 GetHistosToBeRegistered <BmnTimeDetQa> (dch[iRun][iSetup]);
485 GetHistosToBeRegistered <BmnTimeDetQa> (mwpc[iRun][iSetup]);
487 GetHistosToBeRegistered <BmnCalorimeterDetQa> (ecal[iRun][iSetup]);
488 GetHistosToBeRegistered <BmnCalorimeterDetQa> (zdc[iRun][iSetup]);
490 GetHistosToBeRegistered <BmnDstQa> (dst[iRun][iSetup]);
493 for (Int_t iDim = 0; iDim < nDims; iDim++) {
494 for (Int_t iCanvas = 0; iCanvas < nCanvases; iCanvas++)
495 fServer->Register(
"/Objects", fCanvases[iDim][iCanvas]);
498 fServer->Register(
"/Objects", fRefList);
499 fServer->Register(
"/Objects", infoCanvas);
502void BmnQaMonitor::RegisterUserCommands() {
503 TString cmdTitle0 =
"SelectRelease";
504 TString cmdTitle1 =
"SelectPeriod";
505 TString cmdTitle2 =
"SelectSetup";
506 TString cmdTitle3 =
"SelectRun";
507 TString cmdTitle4 =
"SelectReference";
508 TString cmdTitle5 =
"Clear";
511 fServer->Register(
"/",
this);
515 TString cmd0 =
"/" + fName +
"/->SetRelease(%arg1%)";
516 fServer->RegisterCommand(cmdTitle0.Data(), cmd0.Data(),
"button;");
519 TString cmd1 =
"/" + fName +
"/->SetPeriod(%arg1%)";
520 fServer->RegisterCommand(cmdTitle1.Data(), cmd1.Data(),
"button;");
523 TString cmd2 =
"/" + fName +
"/->SetSetup(%arg1%)";
524 fServer->RegisterCommand(cmdTitle2.Data(), cmd2.Data(),
"button;");
527 TString cmd3 =
"/" + fName +
"/->ShowCurrentHistos(%arg1%)";
528 fServer->RegisterCommand(cmdTitle3.Data(), cmd3.Data(),
"button;");
531 TString cmd4 =
"/" + fName +
"/->ShowReferenceHistos(%arg1%)";
532 fServer->RegisterCommand(cmdTitle4.Data(), cmd4.Data(),
"button;");
535 TString cmd5 =
"/" + fName +
"/->ClearCanvases()";
536 fServer->RegisterCommand(cmdTitle5.Data(), cmd5.Data(),
"button;");
540 for (Int_t iDim = 0; iDim < nDims; iDim++)
541 for (Int_t iCanvas = 0; iCanvas < nCanvases; iCanvas++)
542 fCanvases[iDim][iCanvas]->Clear(
"C");
558 if (fHistoNames.size() == 0) {
559 cout <<
"BmnQaMonitor::GetHistosFromFile(), No histos to be displayed" << endl;
563 TString path = fHistoDir +
"/" + fSteering->
GetListOfReleases()[fRelease] +
"/" +
564 TString::Format(
"run%d", runs[fPeriod]) +
"/" + setups[fSetup] +
565 TString::Format(
"/qa_%d.root",
run);
567 TFile*
file =
new TFile(path.Data(),
"read");
568 if (!
file->IsOpen()) {
569 cout <<
"File does not exist! Exiting ... " << endl;
573 for (
auto it : fHistoNames) {
574 if (!it.Contains(TString::Format(
"RUN%d_SETUP_%s", period,
setup.Data()).Data()))
578 h = (TNamed*)
file->Get(TString(
"TRIGGERS/" + it).Data());
581 h = (TNamed*)
file->Get(TString(
"GEM/" + it).Data());
583 h = (TNamed*)
file->Get(TString(
"SILICON/" + it).Data());
585 h = (TNamed*)
file->Get(TString(
"CSC/" + it).Data());
587 h = (TNamed*)
file->Get(TString(
"TOF400/" + it).Data());
589 h = (TNamed*)
file->Get(TString(
"TOF700/" + it).Data());
591 h = (TNamed*)
file->Get(TString(
"DCH/" + it).Data());
593 h = (TNamed*)
file->Get(TString(
"MWPC/" + it).Data());
595 h = (TNamed*)
file->Get(TString(
"ECAL/" + it).Data());
597 h = (TNamed*)
file->Get(TString(
"ZDC/" + it).Data());
599 h = (TNamed*)
file->Get(TString(
"DST/" + it).Data());
602 TString hName = TString::Format(
"%s", h->GetName());
604 if (hName.Contains(
".vs"))
605 fHistos->
Set2D((TH2F*) h);
607 fHistos->
Set1D((TH1F*) h);
610 cout <<
"Run #" <<
run <<
" processed " << endl;
614void BmnQaMonitor::DrawInfoC() {
616 TVirtualPad *pad = infoCanvas->cd(1);
619 Tl.SetTextSize(0.10);
620 Tl.SetTextColor(kBlue);
622 Tl.DrawLatex(0.1, 0.9, Form(
"Current Run: %i", fCurRunInfo->
GetRunNumber()));
623 Tl.DrawLatex(0.1, 0.75, Form(
"Energy: %1.2f", fCurRunInfo->
GetEnergy()));
624 Tl.DrawLatex(0.1, 0.6, Form(
"Beam: %s", fCurRunInfo->
GetBeamParticle().Data()));
625 Tl.DrawLatex(0.1, 0.45, Form(
"Target: %s", fCurRunInfo->
GetTargetParticle().Data()));
631 pad = infoCanvas->cd(2);
634 Tl.SetTextSize(0.10);
635 Tl.SetTextColor(kRed);
637 Tl.DrawLatex(0.1, 0.9, Form(
"Ref. Run: %i", fRefRunInfo->
GetRunNumber()));
638 Tl.DrawLatex(0.1, 0.75, Form(
"Energy: %1.2f", fRefRunInfo->
GetEnergy()));
639 Tl.DrawLatex(0.1, 0.6, Form(
"Beam: %s", fRefRunInfo->
GetBeamParticle().Data()));
640 Tl.DrawLatex(0.1, 0.45, Form(
"Target: %s", fRefRunInfo->
GetTargetParticle().Data()));
646 pad = infoCanvas->cd(3);
649 Tl.SetTextSize(0.10);
650 Tl.SetTextColor(kBlack);
651 Tl.DrawLatex(0.1, 0.9, Form(
"Release: %s", fSteering->
GetListOfReleases()[fRelease].Data()));
652 Tl.DrawLatex(0.1, 0.75, Form(
"Period: %d", runs[fPeriod]));
653 Tl.DrawLatex(0.1, 0.6, Form(
"Setup: %s", setups[fSetup].Data()));
pair< Int_t, Int_t > GetCanvasSizes(Int_t run, TString setup, TString name, TString dim)
vector< TString > GetListOfReleases()
vector< TString > GetDetectors(Int_t period, TString setup="BM@N")
pair< Int_t, TString > GetRunAndSetupByRunId(Int_t id)
vector< TString > GetTriggers(Int_t period, TString setup="BM@N")
pair< Int_t, Int_t > GetBorderRuns(Int_t period, TString setup="BM@N")
vector< TString > GetListOfCanvases()
void ShowReferenceHistos(Int_t)
void ShowCurrentHistos(Int_t)
TString GetBeamParticle()
get beam particle of the current run
Double_t GetEnergy()
get energy of the current run
TString GetTargetParticle()
get target particle of the current run
Int_t GetRunNumber()
get run number of the current run
static UniRun * GetRun(int period_number, int run_number)
get run from the database