Skip to content
Snippets Groups Projects
CbmDeviceMcbmUnpack.h 3.17 KiB
Newer Older
/* Copyright (C) 2020 Facility for Antiproton and Ion Research in Europe, Darmstadt
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Pierre-Alain Loizeau [committer] */
/**
 * CbmDeviceMcbmUnpack.h
 *
 * @since 2020-05-04
 * @author P.-A. Loizeau
 */

#ifndef CBMDEVICEMCBMUNPACK_H_
#define CBMDEVICEMCBMUNPACK_H_

#include "FairMQDevice.h"

#include "Rtypes.h"
#include "TObjArray.h"

#include <map>
Administrator's avatar
Administrator committed
#include <vector>

class TList;
class CbmMcbm2018UnpackerAlgoSts;
class CbmMcbm2018UnpackerAlgoMuch;
class CbmMcbm2018UnpackerAlgoTrdR;
class CbmMcbm2018UnpackerAlgoTof;
class CbmMcbm2018UnpackerAlgoRich;
class CbmMcbm2018UnpackerAlgoPsd;
class TimesliceMetaData;

Administrator's avatar
Administrator committed
class CbmDeviceMcbmUnpack : public FairMQDevice {
public:
  CbmDeviceMcbmUnpack();
  virtual ~CbmDeviceMcbmUnpack();

protected:
  virtual void InitTask();
  bool HandleData(FairMQMessagePtr&, int);
  bool HandleCommand(FairMQMessagePtr&, int);

private:
  /// Constants
  static const uint16_t kusSysIdSts  = 0x10;
  static const uint16_t kusSysIdMuch = 0x50;
  static const uint16_t kusSysIdTrd  = 0x40;
  static const uint16_t kusSysIdTof  = 0x60;
  static const uint16_t kusSysIdBmon = 0x90;
Administrator's avatar
Administrator committed
  static const uint16_t kusSysIdRich = 0x30;
  static const uint16_t kusSysIdPsd  = 0x80;

  /// Control flags
  Bool_t fbIgnoreOverlapMs       = false;  //! Ignore Overlap Ms: all fuOverlapMsNb MS at the end of timeslice
Administrator's avatar
Administrator committed
  Bool_t fbComponentsAddedToList = kFALSE;

  /// User settings parameters
  std::string fsChannelNameDataInput  = "fullts";
  std::string fsChannelNameDataOutput = "unpts_0";
  std::string fsChannelNameCommands   = "commands";
  UInt_t fuDigiMaskedIdBmon           = 0x00005006;
Administrator's avatar
Administrator committed
  UInt_t fuDigiMaskId                 = 0x0001FFFF;

  /// List of MQ channels names
  std::vector<std::string> fsAllowedChannels = {fsChannelNameDataInput};

  /// Parameters management
  //      TList* fParCList = nullptr;
  Bool_t InitParameters(TList* fParCList);

  /// Statistics & first TS rejection
  uint64_t fulNumMessages = 0;
  uint64_t fulTsCounter   = 0;

  /// Processing algos
  CbmMcbm2018UnpackerAlgoSts* fUnpAlgoSts   = nullptr;
  CbmMcbm2018UnpackerAlgoMuch* fUnpAlgoMuch = nullptr;
  CbmMcbm2018UnpackerAlgoTrdR* fUnpAlgoTrd  = nullptr;
  CbmMcbm2018UnpackerAlgoTof* fUnpAlgoTof   = nullptr;
  CbmMcbm2018UnpackerAlgoRich* fUnpAlgoRich = nullptr;
  CbmMcbm2018UnpackerAlgoPsd* fUnpAlgoPsd   = nullptr;

  /// Time offsets
  std::vector<std::string> fvsSetTimeOffs = {};

  /// TS MetaData storage
  size_t fuNbCoreMsPerTs    = 0;        //!
  size_t fuNbOverMsPerTs    = 0;        //!
  Double_t fdMsSizeInNs     = 1280000;  //! Size of a single MS, [nanoseconds]
  Double_t fdTsCoreSizeInNs = -1.0;     //! Total size of the core MS in a TS, [nanoseconds]
  Double_t fdTsOverSizeInNs = -1.0;     //! Total size of the overlap MS in a TS, [nanoseconds]
  Double_t fdTsFullSizeInNs = -1.0;     //! Total size of all MS in a TS, [nanoseconds]
Administrator's avatar
Administrator committed
  TimesliceMetaData* fTsMetaData;

  bool IsChannelNameAllowed(std::string channelName);
  Bool_t InitContainers();
  Bool_t DoUnpack(const fles::Timeslice& ts, size_t component);
  void Finish();
  bool SendUnpData();