9 #include "GeoModelKernel/throwExcept.h"
23 std::size_t cleanTrashed(PlotVec_t& toDraw) {
24 toDraw.erase(std::remove_if(toDraw.begin(), toDraw.end(),
26 return plot->trashed();
35 gROOT->SetStyle(
"ATLAS");
36 TStyle* plotStyle = gROOT->GetStyle(
"ATLAS");
37 plotStyle->SetOptTitle(0);
38 plotStyle->SetHistLineWidth(1.);
39 plotStyle->SetPalette(kViridis);
41 return StatusCode::SUCCESS;
44 if (token.preFixName.empty()){
46 return StatusCode::FAILURE;
50 if (!insert_itr.second) {
51 ATH_MSG_FATAL(
"The token "<<token.preFixName<<
" is already registered");
52 return StatusCode::FAILURE;
55 <<
", maximum number of plots "<<token.canvasLimit
56 <<
", formats: "<<token.fileFormats<<
", save single: "
57 <<(token.saveSinglePlots ?
"yay" :
"nay")
58 <<
", save summary: "<<(token.saveSummaryPlot ?
"yay" :
"nay"));
59 return StatusCode::SUCCESS;
62 std::shared_ptr<ICanvasObject>
64 const std::string& canvasName){
65 if (canvasName.empty()) {
75 cleanTrashed(dataHolder.
toDraw) < store_itr->first.canvasLimit){
76 const std::size_t
evt = ctx.eventID().event_number();
77 ATH_MSG_VERBOSE(
"Provide new canvas "<<canvasName<<
" for stream "<<token.preFixName
78 <<
" in "<<ctx.eventID());
79 auto newCanvas = dataHolder.
toDraw.emplace_back(std::make_shared<detail::DrawCanvasObject>(canvasName,
evt));
87 <<
" reached. Don't provide any new canvas");
97 return a->event() <
b->event();
100 std::unique_ptr<TCanvas> summaryCan{};
101 const std::string summaryPdfName =
std::format(
"{:}/All{}.pdf",
102 m_outDir.value(), token.preFixName);
103 if (token.saveSummaryPlot) {
104 ATH_MSG_DEBUG(
"Open "<<summaryPdfName<<
" to dump all canvases in a common file");
107 summaryCan->SaveAs(
std::format(
"{:}[", summaryPdfName).c_str());
109 if (token.fileFormats.count(
"root") && !
m_outFile) {
119 std::size_t currEvt{toDraw.back()->event()}, plotCount{0};
122 while (!drawMe.unique()) {
123 using namespace std::chrono_literals;
124 ATH_MSG_DEBUG(
"Wait until "<<drawMe->name()<<
" is finished.");
125 std::this_thread::sleep_for(10
ms);
128 if (currEvt != drawMe->event()) {
129 currEvt = drawMe->event();
133 token.subDirectory, token.preFixName,
134 drawMe->event(), ++plotCount,
140 using enum ICanvasObject::AxisRanges;
141 ATH_MSG_VERBOSE(
"Crate new canvas: "<<plotName<<
" ["<<drawMe->corner(xLow)<<
";"<<drawMe->corner(xHigh)
142 <<
"], ["<<drawMe->corner(yLow)<<
";"<<drawMe->corner(yHigh)<<
"].");
143 auto frameH = std::make_unique<TH2F>(
"frameH",
144 std::format(
"frame;{:};{:};{:}", drawMe->xTitle(), drawMe->yTitle(), drawMe->zTitle()).c_str(),
145 1, drawMe->corner(xLow), drawMe->corner(xHigh),
146 1, drawMe->corner(yLow), drawMe->corner(yHigh));
147 frameH->Draw(
"AXIS");
151 for (
auto& [primitive,
opt] : drawMe->primitives()) {
152 primitive->Draw(
opt.c_str());
155 if (token.saveSinglePlots){
156 for (
const std::string& fileExt : token.fileFormats) {
157 if (fileExt !=
"root") {
159 singleCan->SaveAs(
std::format(
"{:}.{:}", plotName, fileExt).c_str());
163 if (token.fileFormats.count(
"root")) {
165 if (!token.subDirectory.empty()) {
166 writeTo =
m_outFile->GetDirectory(token.subDirectory.c_str());
168 writeTo =
m_outFile->mkdir(token.subDirectory.c_str());
171 writeTo->WriteObject(singleCan.get(),
173 drawMe->event(), plotCount,
177 singleCan->SaveAs(summaryPdfName.c_str());
181 summaryCan->SaveAs(
std::format(
"{:}]", summaryPdfName).c_str());
185 ATH_MSG_DEBUG(
"Finalize the visualization service. Dump all canvases that not have yet been drawn");
186 for (
auto& [token, dataHolder] :
m_storage) {
187 if (!dataHolder.elementsDrawn) {
190 dataHolder.toDraw.clear();
193 return StatusCode::SUCCESS;