-
Pierre-Alain Loizeau authoredPierre-Alain Loizeau authored
CbmHistoServer.cxx 2.56 KiB
/* Copyright (C) 2019 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
SPDX-License-Identifier: GPL-3.0-only
Authors: Florian Uhlig [committer] */
#include "CbmHistoServer.h"
#include <mutex>
//#include "CbmHistoCanvasDrawer.h"
#include <Logger.h>
#include "TH1.h"
#include "THttpServer.h"
#include "TMessage.h"
#include "TObjArray.h"
#include "RootSerializer.h"
std::mutex mtx;
CbmHistoServer::CbmHistoServer()
: FairMQDevice()
, fInputChannelName("histogram-in")
, fArrayHisto()
, fNMessages(0)
, fServer("http:8088")
// , fCanvasDrawer(nullptr)
, fStopThread(false)
{
}
CbmHistoServer::~CbmHistoServer() {}
void CbmHistoServer::InitTask()
{
OnData(fInputChannelName, &CbmHistoServer::ReceiveData);
/*
if (fCanvasDrawer)
{
fCanvasDrawer->CreateCanvases(fServer);
}
*/
}
bool CbmHistoServer::ReceiveData(FairMQMessagePtr& msg, int /*index*/)
{
TObject* tempObject = nullptr;
RootSerializer().Deserialize(*msg, tempObject);
if (TString(tempObject->ClassName()).EqualTo("TObjArray")) {
std::lock_guard<std::mutex> lk(mtx);
TObjArray* arrayHisto = static_cast<TObjArray*>(tempObject);
TH1* histogram_new;
TH1* histogram_existing;
for (Int_t i = 0; i < arrayHisto->GetEntriesFast(); i++) {
TObject* obj = arrayHisto->At(i);
TH1* histogram = static_cast<TH1*>(obj);
int index1 = FindHistogram(histogram->GetName());
if (-1 == index1) {
histogram_new = static_cast<TH1*>(histogram->Clone());
fArrayHisto.Add(histogram_new);
fServer.Register("Histograms", histogram_new);
}
else {
histogram_existing = static_cast<TH1*>(fArrayHisto.At(index1));
histogram_existing->Add(histogram);
}
}
arrayHisto->Clear();
}
fNMessages += 1;
delete tempObject;
return true;
}
void CbmHistoServer::PreRun()
{
fStopThread = false;
fThread = std::thread(&CbmHistoServer::UpdateHttpServer, this);
}
void CbmHistoServer::UpdateHttpServer()
{
while (!fStopThread) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
std::lock_guard<std::mutex> lk(mtx);
/*
if (fCanvasDrawer)
{
fCanvasDrawer->DrawHistograms(fArrayHisto);
}
*/
fServer.ProcessRequests();
}
}
void CbmHistoServer::PostRun()
{
fStopThread = true;
fThread.join();
}
int CbmHistoServer::FindHistogram(const std::string& name)
{
for (int i = 0; i < fArrayHisto.GetEntriesFast(); i++) {
TObject* obj = fArrayHisto.At(i);
if (TString(obj->GetName()).EqualTo(name)) { return i; }
}
return -1;
}