8#include <boost/beast/core/detail/base64.hpp>
10#include "TClonesArray.h"
14#include <FairRootManager.h>
15#include <fairlogger/Logger.h>
18#include "BmnHistManager.h"
21#include <THttpServer.h>
22#include <THttpWSHandler.h>
24namespace fs = std::filesystem;
25namespace b64 = boost::beast::detail::base64;
29 , fPadConfDirWeb(
"config/")
30 , fPadConfDir(
"config/")
31 , fPadConfFileNameDefault(fPadConfDir +
"pad-sample-default.json")
32 , fPadConfFileName(padConfFile)
33 , fPadGenerator(nullptr)
38 SetTitle((name +
"_title").c_str());
39 LOGF(info,
"fName %s", fName.Data());
40 LOGF(info,
"fTitle %s", fTitle.Data());
54 LOGF(info,
"~BmnCustomQa()");
67 fServer->AddLocation(fPadConfDirWeb.c_str(), fPadConfDir.c_str());
69 TString path =
"/" + fTitle +
"/";
70 TString cmd =
"/" + fName +
"/->ResetPadTree()";
71 TString cmdTitle = path +
"Reset";
72 LOGF(info,
"cmdTitle %s", cmdTitle.Data());
73 fServer->RegisterCommand(cmdTitle.Data(), cmd.Data(),
"button;");
75 cmd =
"/" + fName +
"/->SaveConfig(%arg1%)";
76 cmdTitle = path +
"SaveConfig";
77 LOGF(info,
"cmdTitle %s", cmdTitle.Data());
78 fServer->RegisterCommand(cmdTitle.Data(), cmd.Data(),
"button;");
80 fServer->Restrict((TString(
"/") + fName).Data(),
81 (TString(
"allow_method=") +
"FetchConfig,LoadDefaultConfig").Data());
96 chrono::seconds time = chrono::duration_cast<chrono::seconds>(SysClock::now() -
fTicksLastUpdate);
115 can->SaveAs(
"custom.pdf");
118void BmnCustomQa::Redraw()
120 LOGF(info,
"Redraw pid %d", getpid());
139void BmnCustomQa::ReadDataBranches()
141 FairRootManager* ioman = FairRootManager::Instance();
142 if (
nullptr == ioman)
143 Fatal(
"Init",
"BmnRootManager is not instantiated");
144 fTreeTemp =
new TTree(fName +
"_tree",
"qq");
145 fTreeTemp->SetDirectory(
nullptr);
146 TList* brList = ioman->GetBranchNameList();
147 for (Int_t
i = 0;
i < brList->GetEntries();
i++) {
148 TString str =
static_cast<TObjString*
>(brList->At(
i))->GetString();
149 LOGF(debug,
" str: %s", str.Data());
150 TObject* obj = ioman->GetObject(str);
153 LOGF(debug,
" obj: %p", (
void*)obj);
154 TClass* cl = TClass::GetClass(obj->ClassName());
155 LOGF(debug,
"ClassName: %s", obj->ClassName());
156 if (cl == TClonesArray::Class()) {
157 TClonesArray* newTCA =
static_cast<TClonesArray*
>(obj);
158 fTreeTemp->Branch(str.Data(), &newTCA);
162 if (cl == TFolder::Class())
164 TNamed* workObj =
dynamic_cast<TNamed*
>(obj);
165 if (workObj ==
nullptr) {
166 LOGF(error,
"%s is not a TNamed!", str.Data());
169 LOGF(debug,
" TNamed obj n: %s t: %s", workObj->GetName(), workObj->GetTitle());
170 TBranch* b = fTreeTemp->Branch(str.Data(),
"TObject", workObj);
171 LOGF(debug,
" branch 0x%016lX", (uint64_t)b);
175 printf(
"\nBRANCHES READ!\n\n");
178void BmnCustomQa::CreateHistograms()
180 can =
new TCanvas(
"CustomCan",
"Custom Canvas", 1920, 1080);
182 printf(
"\nHISTOGRAMS CREATED!\n\n");
185void BmnCustomQa::RecreateHistTree()
187 LOGF(info,
"RecreateHistTree pid %d", getpid());
200 }
catch (std::exception& e) {
201 LOGF(error,
"RecreateHistTree exception: %s", e.what());
207void BmnCustomQa::ProcessGlobal()
215 LOGF(info,
"ResetPadTree");
219void BmnCustomQa::ReloadConf()
222 delete fPadGenerator;
224 std::ifstream ifs(fPadConfFileName, std::ios::binary);
226 LOGF(error,
"Failed to open config file: %s", fPadConfFileName.c_str());
229 string str_out{std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>()};
230 fCurConfig.String() = TString(str_out.c_str());
237 LOGF(info,
"SaveConfig");
239 conf_str.resize(b64::decoded_size(str.size()));
240 auto res = b64::decode(&conf_str[0], str.data(), str.size());
241 conf_str.resize(res.first);
242 LOG(debug) << conf_str;
243 ofstream out(fPadConfFileName, std::ios::out);
245 LOGF(error,
"SaveConfig failed to open %s for writing", fPadConfFileName.c_str());
254 LOGF(info,
"LoadDefaultConfig pid %d", getpid());
256 fs::copy(fPadConfFileNameDefault, fPadConfFileName, fs::copy_options::overwrite_existing);
257 }
catch (fs::filesystem_error& e) {
258 LOGF(error,
"LoadDefaultConfig failed to copy %s to %s: %s", fPadConfFileNameDefault.c_str(),
259 fPadConfFileName.c_str(), e.what());
268 LOGF(info,
"FetchConfig");
TObjString * LoadDefaultConfig()
virtual void Exec(Option_t *opt)
Derived from FairTask.
virtual void Finish()
Derived from FairTask.
virtual ~BmnCustomQa()
Destructor.
TObjString * FetchConfig()
void SaveConfig(string str)
virtual InitStatus Init()
Derived from FairTask.
BmnCustomQa()
Constructor.
void WriteToFile()
Write all histograms to current opened file.
static BmnStatus DrawPadFromTree(BmnPadBranch *br)
static void ResetPadTree(BmnPadBranch *br)
static BmnStatus FillPadFromTree(BmnPadBranch *br, TTree *tree)
Generates pad tree from the scheme.
static void PadTree2Canvas(BmnPadBranch *br, TVirtualPad *pad)
Create pad structure in the canvas from the pad tree and associate pad branch instances with the pad ...
BmnPadBranch * GetPadBranch()
void LoadPTFrom(string FileName)
Load pad tree from json config.
chrono::time_point< chrono::system_clock > fTicksLastUpdate
const Int_t fNItersToUpdate
const chrono::seconds fTimeToUpdate
Int_t fNItersSinceUpdate
redraw each timeout seconds