Skip to content
Snippets Groups Projects
  • Pierre-Alain Loizeau's avatar
    0dfd3e5e
    Add Sample, consummer example and Monitors following Rep-Req relation · 0dfd3e5e
    Pierre-Alain Loizeau authored and Florian Uhlig's avatar Florian Uhlig committed
    It was advised by the FariMQ expert to switch from a push-pull approach to a Rep-Req one.
    This should improve the balance of TS delivery when they have non uniform size/processing time
    and reduce the buffering in the Sample
    - Add new sampler class CbmMQTsSamplerRepReq using the reply model
    - Add example of a consummer device using the request model
    - Add new monitor classes for T0 and TOF using the request model
    0dfd3e5e
    History
    Add Sample, consummer example and Monitors following Rep-Req relation
    Pierre-Alain Loizeau authored and Florian Uhlig's avatar Florian Uhlig committed
    It was advised by the FariMQ expert to switch from a push-pull approach to a Rep-Req one.
    This should improve the balance of TS delivery when they have non uniform size/processing time
    and reduce the buffering in the Sample
    - Add new sampler class CbmMQTsSamplerRepReq using the reply model
    - Add example of a consummer device using the request model
    - Add new monitor classes for T0 and TOF using the request model
CbmMQTsaMultiSampler.h 5.02 KiB
/* Copyright (C) 2017-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Florian Uhlig [committer], Pierre-Alain Loizeau */

/**
 * CbmMQTsaSampler.h
 *
 * @since 2017-11-17
 * @author F. Uhlig
 */

#ifndef CBMMQTSAMULTISAMPLER_H_
#define CBMMQTSAMULTISAMPLER_H_


#include "MicrosliceDescriptor.hpp"
#include "StorableTimeslice.hpp"
#include "Timeslice.hpp"
#include "TimesliceSource.hpp"

#include "FairMQDevice.h"

class TCanvas;
class TH1F;
class TH1I;
class TProfile;
#include <TObjArray.h>

#include <ctime>
#include <string>
#include <utility>
#include <vector>

class CbmMQTsaMultiSampler : public FairMQDevice {
public:
  CbmMQTsaMultiSampler();
  virtual ~CbmMQTsaMultiSampler();

protected:
  uint64_t fMaxTimeslices;

  std::string fFileName;
  std::string fDirName;

  std::vector<std::string> fInputFileList;  ///< List of input files
  uint64_t fFileCounter;
  std::string fHost;
  uint64_t fPort;
  uint64_t fHighWaterMark;

  bool fbNoSplitTs        = false;
  bool fbSendTsPerSysId   = false;
  bool fbSendTsPerChannel = false;

  std::string fsChannelNameHistosInput  = "histogram-in";
  std::string fsChannelNameHistosConfig = "histo-conf";
  std::string fsChannelNameCanvasConfig = "canvas-conf";
  uint32_t fuPublishFreqTs              = 0;
  double_t fdMinPublishTime             = 0.5;
  double_t fdMaxPublishTime             = 5;

  uint64_t fuPrevTsIndex = 0;
  uint64_t fTSCounter;
  uint64_t fMessageCounter;

  int fMaxMemory = 0;

  virtual void InitTask();
  virtual bool ConditionalRun();
private:
  bool InitHistograms();
  bool CheckTimeslice(const fles::Timeslice& ts);
  void PrintMicroSliceDescriptor(const fles::MicrosliceDescriptor& mdsc);
  void CalcRuntime();
  bool IsChannelNameAllowed(std::string);
  bool CreateAndSendComponent(const fles::Timeslice&, int);
  bool CreateAndCombineComponentsPerSysId(const fles::Timeslice&);
  bool CreateAndCombineComponentsPerChannel(const fles::Timeslice&);
  bool CreateAndSendFullTs(const fles::Timeslice&);
  bool SendData(const fles::StorableTimeslice&, int);
  bool SendData(const fles::StorableTimeslice&, std::string);
  bool SendMissedTsIdx(std::vector<uint64_t> vIndices);
  bool SendCommand(std::string sCommand);
  bool SendHistograms();
  bool ResetHistograms();

  fles::TimesliceSource* fSource;  //!
  std::chrono::steady_clock::time_point fTime;
  std::chrono::system_clock::time_point fLastPublishTime;


  // The vector fAllowedChannels contain the list of defined channel names
  // which are used for connecting the different devices. For the time
  // being the correct connection are done checking the names. A connection
  // using the name stscomponent will receive timeslices containing the
  // sts component only. The corresponding system ids are defined in the
  // vector fSysId. At startup it is checked which channels are defined
  // in the startup script such that later on only timeslices whith the
  // corresponding data are send to the correct channels.
  // TODO: Up to now we have three disconnected vectors which is very
  //       error prone. Find a better solution


  std::vector<std::string> fAllowedChannels = {"stscomponent", "richcomponent", "trdcomponent", "muchcomponent",
                                               "tofcomponent", "t0component",   "psdcomponent"};
  //    std::vector<int> fSysId = {16, 48, 64, 96, 144, 80};
  std::vector<int> fSysId = {0x10, 0x30, 0x40, 0x50, 0x60, 0x90, 0x80};

  std::vector<int> fComponentsToSend                    = {0, 0, 0, 0, 0, 0, 0};
  std::vector<std::vector<std::string>> fChannelsToSend = {{}, {}, {}, {}, {}, {}, {}};

  bool fbListCompPerSysIdReady                       = false;
  std::vector<std::vector<uint32_t>> fvvCompPerSysId = {{}, {}, {}, {}, {}, {}, {}};

  bool fbListCompPerChannelReady                       = false;
  std::vector<std::string> fvChannelsToSend            = {};
  std::vector<std::vector<uint32_t>> fvvCompPerChannel = {};

  std::string fsChannelNameMissedTs = "";
  std::string fsChannelNameCommands = "";

  /// Array of histograms to send to the histogram server
  TObjArray fArrayHisto = {};
  /// Vector of string pairs with ( HistoName, FolderPath ) to send to the histogram server
  std::vector<std::pair<std::string, std::string>> fvpsHistosFolder = {};
  /// Vector of string pairs with ( CanvasName, CanvasConfig ) to send to the histogram server
  /// Format of Can config is "NbPadX(U);NbPadY(U);ConfigPad1(s);....;ConfigPadXY(s)"
  /// Format of Pad config is "GrixX(b),GridY(b),LogX(b),LogY(b),LogZ(b),HistoName(s),DrawOptions(s)"
  std::vector<std::pair<std::string, std::string>> fvpsCanvasConfig = {};

  /// Histograms
  TH1I* fhTsRate          = nullptr;
  TH1I* fhTsSize          = nullptr;
  TProfile* fhTsSizeEvo   = nullptr;
  TH1F* fhTsMaxSizeEvo    = nullptr;
  TH1I* fhMissedTS        = nullptr;
  TProfile* fhMissedTSEvo = nullptr;
  TCanvas* fcSummary      = nullptr;
  uint64_t fuStartTime    = 0;
  double_t fdTimeToStart  = 0.;
  double_t fdLastMaxTime  = 0.;
  double_t fdTsMaxSize    = 0.;
};

#endif /* CBMMQTSASAMPLER_H_ */