CbmRoot
CbmMqHistoServer.cxx
Go to the documentation of this file.
1 /********************************************************************************
2  * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH *
3  * *
4  * This software is distributed under the terms of the *
5  * GNU Lesser General Public Licence (LGPL) version 3, *
6  * copied verbatim in the file "LICENSE" *
7  ********************************************************************************/
8 #include <mutex>
9 
10 #include "CbmMqHistoServer.h"
11 
12 #include "CbmFlesCanvasTools.h"
13 
14 #include "BoostSerializer.h"
15 #include "FairLogger.h"
16 #include "FairMQProgOptions.h" // device->fConfig
17 #include "RootSerializer.h"
18 
19 #include "TCanvas.h"
20 #include "TFile.h"
21 #include "TH1.h"
22 #include "TH2.h"
23 #include "THttpServer.h"
24 #include "TMessage.h"
25 #include "TObjArray.h"
26 #include "TProfile.h"
27 #include "TRootSniffer.h"
28 
29 #include <boost/serialization/utility.hpp>
30 
32 
33 Bool_t bMqHistoServerResetHistos = kFALSE;
34 Bool_t bMqHistoServerSaveHistos = kFALSE;
35 
37  : FairMQDevice()
38  , fsChannelNameHistosInput("histogram-in")
39  , fsChannelNameHistosConfig("histo-conf")
40  , fsChannelNameCanvasConfig("canvas-conf")
41  , fsHistoFileName("HistosMonitorPulser.root")
42  , fuHttpServerPort(8098)
43  , fArrayHisto()
44  , fvpsHistosFolder()
45  , fvpsCanvasConfig()
46  , fvHistos()
47  , fvCanvas()
48  , fNMessages(0)
49  , fServer(nullptr)
50  , fStopThread(false) {}
51 
53 
56  LOG(info) << "Init options for CbmMqHistoServer.";
57  fsChannelNameHistosInput = fConfig->GetValue<std::string>("ChNameIn");
58  fsChannelNameHistosConfig = fConfig->GetValue<std::string>("ChNameHistCfg");
59  fsChannelNameCanvasConfig = fConfig->GetValue<std::string>("ChNameCanvCfg");
60  fsHistoFileName = fConfig->GetValue<std::string>("HistoFileName");
61  fuHttpServerPort = fConfig->GetValue<uint32_t>("histport");
62 
67 
68  fServer = new THttpServer(Form("http:%u", fuHttpServerPort));
70  fServer->GetSniffer()->SetScanGlobalDir(kFALSE);
71 
72  fServer->RegisterCommand("/Reset_Hist", "bMqHistoServerResetHistos=kTRUE");
73  fServer->RegisterCommand("/Save_Hist", "bMqHistoServerSaveHistos=kTRUE");
74 
75  fServer->Restrict("/Reset_Moni_Hist", "allow=admin");
76  fServer->Restrict("/Save_Pulser_Hist", "allow=admin");
77 }
78 
79 bool CbmMqHistoServer::ReceiveData(FairMQMessagePtr& msg, int /*index*/) {
80  TObject* tempObject = nullptr;
81 
82  Deserialize<RootSerializer>(*msg, tempObject);
83 
84  if (TString(tempObject->ClassName()).EqualTo("TObjArray")) {
85  std::lock_guard<std::mutex> lk(mtx);
86  TObjArray* arrayHisto = static_cast<TObjArray*>(tempObject);
87  for (Int_t i = 0; i < arrayHisto->GetEntriesFast(); i++) {
88  TObject* pObj = arrayHisto->At(i);
89 
90  if (nullptr != dynamic_cast<TProfile*>(pObj)) {
91  if (!ReadHistogram<TProfile>(dynamic_cast<TProfile*>(pObj)))
92  return false;
93  } // if( nullptr != dynamic_cast< TProfile *>( pObj ) )
94  else if (nullptr != dynamic_cast<TH2*>(pObj)) {
95  if (!ReadHistogram<TH2>(dynamic_cast<TH2*>(pObj))) return false;
96  } // if( nullptr != dynamic_cast< TH2 *>( pObj ) )
97  else if (nullptr != dynamic_cast<TH1*>(pObj)) {
98  if (!ReadHistogram<TH1>(dynamic_cast<TH1*>(pObj))) return false;
99  } // if( nullptr != dynamic_cast< TH1 *>( pObj ) )
100  else
101  LOG(warning) << "Unsupported object type for " << pObj->GetName();
102  } // for (Int_t i = 0; i < arrayHisto->GetEntriesFast(); i++)
103 
105  arrayHisto->Delete();
106 
109  if (!fbAllCanvasReady) {
110  for (uint32_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv) {
112  if (fvbCanvasReady[uCanv]) continue;
113 
115  fvbCanvasReady[uCanv] = PrepareCanvas(uCanv);
116  } // for( uint32_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv )
117  } // if( !fbAllCanvasReady )
118  } // if (TString(tempObject->ClassName()).EqualTo("TObjArray"))
119  else
120  LOG(fatal)
121  << "CbmMqHistoServer::ReceiveData => Wrong object type at input: "
122  << tempObject->ClassName();
123 
124  fNMessages += 1;
125 
126  if (nullptr != tempObject) delete tempObject;
127 
131  std::lock_guard<std::mutex> lk(mtx);
132  // LOG(info) << "Reset Monitor histos ";
133  ResetHistograms();
134  bMqHistoServerResetHistos = kFALSE;
135  } // if( bMqHistoServerResetHistos )
136 
138  std::lock_guard<std::mutex> lk(mtx);
139  // LOG(info) << "Save All histos & canvases";
140  SaveHistograms();
141  bMqHistoServerSaveHistos = kFALSE;
142  } // if( bMqHistoServerSaveHistos )
143 
144  return true;
145 }
146 
147 bool CbmMqHistoServer::ReceiveHistoConfig(FairMQMessagePtr& msg,
148  int /*index*/) {
149  std::pair<std::string, std::string> tempObject;
150 
151  Deserialize<BoostSerializer<std::pair<std::string, std::string>>>(*msg,
152  tempObject);
153 
154  LOG(info) << " Received configuration for histo " << tempObject.first << " : "
155  << tempObject.second;
156 
159  UInt_t uPrevHist = 0;
160  for (uPrevHist = 0; uPrevHist < fvpsHistosFolder.size(); ++uPrevHist) {
161  if (fvpsHistosFolder[uPrevHist].first == tempObject.first) break;
162  } // for( UInt_t uPrevHist = 0; uPrevHist < fvpsHistosFolder.size(); ++uPrevHist )
163 
164  if (uPrevHist < fvpsHistosFolder.size()) {
165  LOG(info) << " Ignored new configuration for histo " << tempObject.first
166  << " due to previously received one: " << tempObject.second;
168  } // if( uPrevHist < fvpsHistosFolder.size() )
169  else {
170  fvpsHistosFolder.push_back(tempObject);
171  fvHistos.push_back(std::pair<TNamed*, std::string>(nullptr, ""));
172  fvbHistoRegistered.push_back(false);
173  fbAllHistosRegistered = false;
174  } // else of if( uPrevHist < fvpsHistosFolder.size() )
175 
176  return true;
177 }
178 
179 bool CbmMqHistoServer::ReceiveCanvasConfig(FairMQMessagePtr& msg,
180  int /*index*/) {
181  std::pair<std::string, std::string> tempObject;
182 
183  Deserialize<BoostSerializer<std::pair<std::string, std::string>>>(*msg,
184  tempObject);
185 
186  LOG(info) << " Received configuration for canvas " << tempObject.first
187  << " : " << tempObject.second;
188 
191  uint32_t uPrevCanv = 0;
192  for (uPrevCanv = 0; uPrevCanv < fvpsCanvasConfig.size(); ++uPrevCanv) {
193  if (fvpsCanvasConfig[uPrevCanv].first == tempObject.first) break;
194  } // for( UInt_t uPrevCanv = 0; uPrevCanv < fvpsCanvasConfig.size(); ++uPrevCanv )
195 
196  if (uPrevCanv < fvpsCanvasConfig.size()) {
197  LOG(warning) << " Ignored new configuration for histo " << tempObject.first
198  << " due to previously received one: " << tempObject.second;
200  } // if( uPrevCanv < fvpsCanvasConfig.size() )
201  else {
202  fvpsCanvasConfig.push_back(tempObject);
203  fvbCanvasReady.push_back(false);
204  fbAllCanvasReady = false;
205 
206  fvCanvas.push_back(std::pair<TCanvas*, std::string>(nullptr, ""));
207  fvbCanvasRegistered.push_back(false);
208  fbAllCanvasRegistered = false;
209  } // else of if( uPrevCanv < fvpsCanvasConfig.size() )
210  return true;
211 }
212 
214  fStopThread = false;
215  fThread = std::thread(&CbmMqHistoServer::UpdateHttpServer, this);
216 }
217 
219  while (!fStopThread) {
220  std::this_thread::sleep_for(std::chrono::milliseconds(10));
221  std::lock_guard<std::mutex> lk(mtx);
222 
223  fServer->ProcessRequests();
224  }
225 }
226 
228  fStopThread = true;
229  fThread.join();
230 }
231 
232 template<class HistoT>
233 bool CbmMqHistoServer::ReadHistogram(HistoT* pHist) {
234  int index1 = FindHistogram(pHist->GetName());
235  if (-1 == index1) {
236  HistoT* histogram_new = static_cast<HistoT*>(pHist->Clone());
237  fArrayHisto.Add(histogram_new);
238 
239  LOG(info) << "Received new histo " << pHist->GetName();
240 
242  if (!fbAllHistosRegistered) {
243  for (uint32_t uHist = 0; uHist < fvpsHistosFolder.size(); ++uHist) {
245  if (fvbHistoRegistered[uHist]) continue;
246 
248  if (fvpsHistosFolder[uHist].first == histogram_new->GetName()) {
249  fvHistos[uHist] = std::pair<TNamed*, std::string>(
250  histogram_new, fvpsHistosFolder[uHist].second);
251  fServer->Register(Form("/%s", fvHistos[uHist].second.data()),
252  fvHistos[uHist].first);
253  fvbHistoRegistered[uHist] = true;
254 
255  LOG(info) << "registered histo " << fvHistos[uHist].first->GetName()
256  << " in folder " << fvHistos[uHist].second;
257 
258 
260  fbAllHistosRegistered = true;
261  for (uint32_t uIdx = 0; uIdx < fvbHistoRegistered.size(); ++uIdx) {
262  if (!fvbHistoRegistered[uIdx]) {
263  fbAllHistosRegistered = false;
264  break;
265  } // if( !fvbHistoRegistered[ uIdx ] )
266  } // for( uint32_t uIdx = 0; uIdx < fvbHistoRegistered.size(); ++uIdx )
267 
268  break;
269  } // if( fvpsHistosFolder[ uHist ].first == histogram_new->GetName() )
270  } // for( uint32_t uCanv = 0; uCanv < fvpsCanvasConfig.size(); ++uCanv )
271  } // if( !fbAllCanvasReady )
272  } // if (-1 == index1)
273  else {
274  HistoT* histogram_existing = dynamic_cast<HistoT*>(fArrayHisto.At(index1));
275  if (nullptr == histogram_existing) {
276  LOG(error) << "CbmMqHistoServer::ReadHistogram => "
277  << "Incompatible type found during update for histo "
278  << pHist->GetName();
279  return false;
280  } // if( nullptr == histogram_existing )
281 
282  histogram_existing->Add(pHist);
283  } // else of if (-1 == index1)
284  return true;
285 }
286 
287 int CbmMqHistoServer::FindHistogram(const std::string& name) {
288  for (int iHist = 0; iHist < fArrayHisto.GetEntriesFast(); ++iHist) {
289  TObject* obj = fArrayHisto.At(iHist);
290  if (TString(obj->GetName()).EqualTo(name)) {
291  return iHist;
292  } // if( TString( obj->GetName() ).EqualTo( name ) )
293  } // for( int iHist = 0; iHist < fArrayHisto.GetEntriesFast(); ++iHist )
294  return -1;
295 }
296 
298  for (int iHist = 0; iHist < fArrayHisto.GetEntriesFast(); ++iHist) {
299  dynamic_cast<TH1*>(fArrayHisto.At(iHist))->Reset();
300  } // for( int iHist = 0; iHist < fArrayHisto.GetEntriesFast(); ++iHist )
301  return true;
302 }
303 bool CbmMqHistoServer::PrepareCanvas(uint32_t uCanvIdx) {
304  CanvasConfig conf(
306 
308  uint32_t uNbPads(conf.GetNbPads());
309  for (uint32_t uPadIdx = 0; uPadIdx < uNbPads; ++uPadIdx) {
310  uint32_t uNbObj(conf.GetNbObjsInPad(uPadIdx));
311  for (uint32_t uObjIdx = 0; uObjIdx < uNbObj; ++uObjIdx) {
312  std::string sName(conf.GetObjName(uPadIdx, uObjIdx));
314  if ("nullptr" != sName) {
315  if (FindHistogram(sName) < 0) {
316  return false;
317  } // if( FindHistogram( conf.GetObjName( uPadIdx, uObjIdx ) ) < 0 )
318  } // if( "nullptr" != sName )
319  } // for( uint32_t uObjIdx = 0; uObjIdx < uNbObj; ++uObjIdx )
320  } // for( uint32_t uPadIdx = 0; uPadIdx < uNbPads; ++uPadIdx )
321 
323  TCanvas* pNewCanv =
324  new TCanvas(conf.GetName().data(), conf.GetTitle().data());
325  pNewCanv->Divide(conf.GetNbPadsX(), conf.GetNbPadsY());
326 
328  for (uint32_t uPadIdx = 0; uPadIdx < uNbPads; ++uPadIdx) {
329  pNewCanv->cd(1 + uPadIdx);
330 
332  gPad->SetGrid(conf.GetGridx(uPadIdx), conf.GetGridy(uPadIdx));
333  gPad->SetLogx(conf.GetLogx(uPadIdx));
334  gPad->SetLogy(conf.GetLogy(uPadIdx));
335  gPad->SetLogz(conf.GetLogz(uPadIdx));
336 
338  uint32_t uNbObj(conf.GetNbObjsInPad(uPadIdx));
339  for (uint32_t uObjIdx = 0; uObjIdx < uNbObj; ++uObjIdx) {
340  std::string sName(conf.GetObjName(uPadIdx, uObjIdx));
341  if ("nullptr" != sName) {
342  TObject* pObj = fArrayHisto[FindHistogram(sName)];
343 
344  if (nullptr != dynamic_cast<TProfile*>(pObj)) {
345  dynamic_cast<TProfile*>(pObj)->Draw(
346  conf.GetOption(uPadIdx, uObjIdx).data());
347  } // if( nullptr != dynamic_cast< TProfile *>( pObj ) )
348  else if (nullptr != dynamic_cast<TH2*>(pObj)) {
349  dynamic_cast<TH2*>(pObj)->Draw(
350  conf.GetOption(uPadIdx, uObjIdx).data());
351  } // if( nullptr != dynamic_cast< TH2 *>( pObj ) )
352  else if (nullptr != dynamic_cast<TH1*>(pObj)) {
353  dynamic_cast<TH1*>(pObj)->Draw(
354  conf.GetOption(uPadIdx, uObjIdx).data());
355  } // if( nullptr != dynamic_cast< TH1 *>( pObj ) )
356  else
357  LOG(warning) << "Unsupported object type for " << sName
358  << " when preparing canvas " << conf.GetName();
359  } // if( "nullptr" != sName )
360  } // for( uint32_t uObjIdx = 0; uObjIdx < uNbObj; ++uObjIdx )
361  } // for( uint32_t uPadIdx = 0; uPadIdx < uNbPads; ++uPadIdx )
362 
363  fvCanvas[uCanvIdx] = std::pair<TCanvas*, std::string>(pNewCanv, "canvases");
364  fServer->Register(Form("/%s", fvCanvas[uCanvIdx].second.data()),
365  fvCanvas[uCanvIdx].first);
366  fvbCanvasRegistered[uCanvIdx] = true;
367 
368  LOG(info) << "registered canvas " << fvCanvas[uCanvIdx].first->GetName()
369  << " in folder " << fvCanvas[uCanvIdx].second;
370 
372  fbAllCanvasRegistered = true;
373  for (uint32_t uIdx = 0; uIdx < fvbCanvasRegistered.size(); ++uIdx) {
374  if (!fvbCanvasRegistered[uIdx]) {
375  fbAllCanvasRegistered = false;
376  break;
377  } // if( !fvbCanvasRegistered[ uIdx ] )
378  } // for( uint32_t uIdx = 0; uIdx < fvbCanvasRegistered.size(); ++uIdx )
379 
380  return true;
381 }
382 
385  TDirectory* oldDir = NULL;
386  TFile* histoFile = NULL;
387  // Store current directory position to allow restore later
388  oldDir = gDirectory;
389  // open separate histo file in recreate mode
390  histoFile = new TFile(fsHistoFileName.data(), "RECREATE");
391 
392  if (nullptr == histoFile) return false;
393 
395  for (UInt_t uHisto = 0; uHisto < fvHistos.size(); ++uHisto) {
397  TString sFolder = fvHistos[uHisto].second.data();
398  if (nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder);
399  gDirectory->cd(sFolder);
400 
402  fvHistos[uHisto].first->Write();
403 
404  histoFile->cd();
405  } // for( UInt_t uHisto = 0; uHisto < fvHistos.size(); ++uHisto )
406 
407  for (UInt_t uCanvas = 0; uCanvas < fvCanvas.size(); ++uCanvas) {
409  TString sFolder = fvCanvas[uCanvas].second.data();
410  if (nullptr == gDirectory->Get(sFolder)) gDirectory->mkdir(sFolder);
411  gDirectory->cd(sFolder);
412 
414  fvCanvas[uCanvas].first->Write();
415 
416  histoFile->cd();
417  } // for( UInt_t uHisto = 0; uHisto < fvCanvas.size(); ++uHisto )
418 
419  // Restore original directory position
420  oldDir->cd();
421  histoFile->Close();
422 
423  return true;
424 }
CanvasConfig::GetObjName
std::string GetObjName(uint32_t uPadIdx, uint32_t uObjIdx) const
Definition: CbmFlesCanvasTools.cxx:127
CbmMqHistoServer::fThread
std::thread fThread
Definition: CbmMqHistoServer.h:77
ExtractCanvasConfigFromString
CanvasConfig ExtractCanvasConfigFromString(std::string sFullConfig)
Extraction.
Definition: CbmFlesCanvasTools.cxx:373
CbmMqHistoServer::fbAllCanvasRegistered
bool fbAllCanvasRegistered
Definition: CbmMqHistoServer.h:70
CbmMqHistoServer::fsChannelNameHistosInput
std::string fsChannelNameHistosInput
Parameters.
Definition: CbmMqHistoServer.h:46
bMqHistoServerResetHistos
Bool_t bMqHistoServerResetHistos
Definition: CbmMqHistoServer.cxx:33
CbmMqHistoServer::ReceiveCanvasConfig
bool ReceiveCanvasConfig(FairMQMessagePtr &msg, int index)
Definition: CbmMqHistoServer.cxx:179
CanvasConfig::GetLogy
bool GetLogy(uint32_t uPadIdx) const
Definition: CbmFlesCanvasTools.cxx:91
CbmMqHistoServer::fServer
THttpServer * fServer
Definition: CbmMqHistoServer.h:75
CanvasConfig::GetNbPadsY
uint32_t GetNbPadsY() const
Definition: CbmFlesCanvasTools.h:32
mtx
std::mutex mtx
Definition: CbmMqHistoServer.cxx:31
CbmMqHistoServer::UpdateHttpServer
void UpdateHttpServer()
Definition: CbmMqHistoServer.cxx:218
CanvasConfig::GetName
std::string GetName() const
accessors
Definition: CbmFlesCanvasTools.h:28
i
int i
Definition: L1/vectors/P4_F32vec4.h:25
CbmFlesCanvasTools.h
CbmMqHistoServer::ReceiveHistoConfig
bool ReceiveHistoConfig(FairMQMessagePtr &msg, int index)
Definition: CbmMqHistoServer.cxx:147
CbmMqHistoServer::fvHistos
std::vector< std::pair< TNamed *, std::string > > fvHistos
Definition: CbmMqHistoServer.h:64
CanvasConfig::GetLogz
bool GetLogz(uint32_t uPadIdx) const
Definition: CbmFlesCanvasTools.cxx:103
CbmMqHistoServer::FindHistogram
int FindHistogram(const std::string &name)
Definition: CbmMqHistoServer.cxx:287
CbmMqHistoServer.h
CbmMqHistoServer::ReadHistogram
bool ReadHistogram(HistoT *pHist)
Definition: CbmMqHistoServer.cxx:233
CbmMqHistoServer::fNMessages
int fNMessages
Internal status.
Definition: CbmMqHistoServer.h:73
CbmMqHistoServer::ResetHistograms
bool ResetHistograms()
Definition: CbmMqHistoServer.cxx:297
CbmMqHistoServer::PostRun
virtual void PostRun()
Definition: CbmMqHistoServer.cxx:227
CbmMqHistoServer::fStopThread
bool fStopThread
Definition: CbmMqHistoServer.h:78
CbmMqHistoServer::ReceiveData
bool ReceiveData(FairMQMessagePtr &msg, int index)
Definition: CbmMqHistoServer.cxx:79
CbmMqHistoServer::fvbHistoRegistered
std::vector< bool > fvbHistoRegistered
Vector of Histos pointers and folder path.
Definition: CbmMqHistoServer.h:65
CanvasConfig
Definition: CbmFlesCanvasTools.h:17
CanvasConfig::GetNbObjsInPad
uint32_t GetNbObjsInPad(uint32_t uPadIdx) const
Definition: CbmFlesCanvasTools.cxx:115
CanvasConfig::GetTitle
std::string GetTitle() const
Definition: CbmFlesCanvasTools.h:29
CbmMqHistoServer::CbmMqHistoServer
CbmMqHistoServer()
Definition: CbmMqHistoServer.cxx:36
CbmMqHistoServer::InitTask
virtual void InitTask()
Definition: CbmMqHistoServer.cxx:54
CbmMqHistoServer::~CbmMqHistoServer
virtual ~CbmMqHistoServer()
Definition: CbmMqHistoServer.cxx:52
CbmMqHistoServer::fsHistoFileName
std::string fsHistoFileName
Definition: CbmMqHistoServer.h:49
CbmMqHistoServer::fvCanvas
std::vector< std::pair< TCanvas *, std::string > > fvCanvas
Definition: CbmMqHistoServer.h:68
CbmMqHistoServer::PreRun
virtual void PreRun()
Definition: CbmMqHistoServer.cxx:213
bMqHistoServerSaveHistos
Bool_t bMqHistoServerSaveHistos
Definition: CbmMqHistoServer.cxx:34
CanvasConfig::GetOption
std::string GetOption(uint32_t uPadIdx, uint32_t uObjIdx) const
Definition: CbmFlesCanvasTools.cxx:148
CbmMqHistoServer::fuHttpServerPort
uint32_t fuHttpServerPort
Definition: CbmMqHistoServer.h:50
first
bool first
Definition: LKFMinuit.cxx:143
CbmMqHistoServer::fsChannelNameCanvasConfig
std::string fsChannelNameCanvasConfig
Definition: CbmMqHistoServer.h:48
CbmMqHistoServer::fvpsCanvasConfig
std::vector< std::pair< std::string, std::string > > fvpsCanvasConfig
Definition: CbmMqHistoServer.h:59
mutex
spin_mutex mutex
Definition: CbmRichParallelQa.cxx:30
CbmMqHistoServer::PrepareCanvas
bool PrepareCanvas(uint32_t uCanvIdx)
Definition: CbmMqHistoServer.cxx:303
CbmMqHistoServer::fbAllHistosRegistered
bool fbAllHistosRegistered
Definition: CbmMqHistoServer.h:66
CanvasConfig::GetLogx
bool GetLogx(uint32_t uPadIdx) const
Definition: CbmFlesCanvasTools.cxx:79
CbmMqHistoServer::fsChannelNameHistosConfig
std::string fsChannelNameHistosConfig
Definition: CbmMqHistoServer.h:47
CbmMqHistoServer::fArrayHisto
TObjArray fArrayHisto
Array of histograms with unique names.
Definition: CbmMqHistoServer.h:53
CbmMqHistoServer::SaveHistograms
bool SaveHistograms()
Definition: CbmMqHistoServer.cxx:383
CbmMqHistoServer::fvbCanvasRegistered
std::vector< bool > fvbCanvasRegistered
Vector of Canvas pointers and folder path.
Definition: CbmMqHistoServer.h:69
CbmMqHistoServer::fbAllCanvasReady
bool fbAllCanvasReady
Definition: CbmMqHistoServer.h:61
CanvasConfig::GetNbPads
uint32_t GetNbPads() const
Definition: CbmFlesCanvasTools.h:30
CanvasConfig::GetGridy
bool GetGridy(uint32_t uPadIdx) const
Definition: CbmFlesCanvasTools.cxx:67
CanvasConfig::GetNbPadsX
uint32_t GetNbPadsX() const
Definition: CbmFlesCanvasTools.h:31
CbmMqHistoServer::fvbCanvasReady
std::vector< bool > fvbCanvasReady
Definition: CbmMqHistoServer.h:60
CbmMqHistoServer::fvpsHistosFolder
std::vector< std::pair< std::string, std::string > > fvpsHistosFolder
Vector of string with ( HistoName, FolderPath ) to send to the histogram server.
Definition: CbmMqHistoServer.h:55
CanvasConfig::GetGridx
bool GetGridx(uint32_t uPadIdx) const
accessors
Definition: CbmFlesCanvasTools.cxx:55