Skip to content
Snippets Groups Projects
CbmHistoServer.cxx 2.56 KiB
Newer Older
/* 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"
Administrator's avatar
Administrator committed
#include "TMessage.h"
#include "TObjArray.h"
Administrator's avatar
Administrator committed
#include "RootSerializer.h"

std::mutex mtx;

CbmHistoServer::CbmHistoServer()
Administrator's avatar
Administrator committed
  : FairMQDevice()
  , fInputChannelName("histogram-in")
  , fArrayHisto()
  , fNMessages(0)
  , fServer("http:8088")
  //    , fCanvasDrawer(nullptr)
  , fStopThread(false)
{
}

CbmHistoServer::~CbmHistoServer() {}

void CbmHistoServer::InitTask()
{
Administrator's avatar
Administrator committed
  OnData(fInputChannelName, &CbmHistoServer::ReceiveData);
Administrator's avatar
Administrator committed
  /*
    if (fCanvasDrawer)
    {
        fCanvasDrawer->CreateCanvases(fServer);
    }
*/
}

bool CbmHistoServer::ReceiveData(FairMQMessagePtr& msg, int /*index*/)
{
Administrator's avatar
Administrator committed
  TObject* tempObject = nullptr;
  RootSerializer().Deserialize(*msg, tempObject);
Administrator's avatar
Administrator committed
  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);
Administrator's avatar
Administrator committed
        histogram_existing = static_cast<TH1*>(fArrayHisto.At(index1));
        histogram_existing->Add(histogram);
      }
Administrator's avatar
Administrator committed
    arrayHisto->Clear();
  }

  fNMessages += 1;
Administrator's avatar
Administrator committed
  delete tempObject;
Administrator's avatar
Administrator committed
  return true;
void CbmHistoServer::PreRun()
{
Administrator's avatar
Administrator committed
  fStopThread = false;
  fThread     = std::thread(&CbmHistoServer::UpdateHttpServer, this);
void CbmHistoServer::UpdateHttpServer()
{
Administrator's avatar
Administrator committed
  while (!fStopThread) {
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
    std::lock_guard<std::mutex> lk(mtx);
Administrator's avatar
Administrator committed
    /*
        if (fCanvasDrawer)
        {
            fCanvasDrawer->DrawHistograms(fArrayHisto);
        }
*/

Administrator's avatar
Administrator committed
    fServer.ProcessRequests();
  }
void CbmHistoServer::PostRun()
{
Administrator's avatar
Administrator committed
  fStopThread = true;
  fThread.join();
int CbmHistoServer::FindHistogram(const std::string& name)
{
Administrator's avatar
Administrator committed
  for (int i = 0; i < fArrayHisto.GetEntriesFast(); i++) {
    TObject* obj = fArrayHisto.At(i);
    if (TString(obj->GetName()).EqualTo(name)) { return i; }
  }
  return -1;