Skip to content
Snippets Groups Projects
Unpack.h 4.97 KiB
/* Copyright (C) 2023 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Volker Friese, Dominik Smith [committer] */


#ifndef UNPACK_H
#define UNPACK_H 1

#include "CbmDigiTimeslice.h"

#include "tof/TofReadoutConfig.h"
#include "tof/UnpackTof.h"
#include "trd/TrdReadoutConfig.h"
#include "trd/UnpackTrd.h"
#include "trd2d/Trd2dReadoutConfig.h"
#include "trd2d/UnpackTrd2d.h"

#include <optional>
#include <sstream>
#include <vector>

#include "bmon/BmonReadoutConfig.h"
#include "bmon/UnpackBmon.h"
#include "much/MuchReadoutConfig.h"
#include "much/UnpackMuch.h"
#include "rich/RichReadoutConfig.h"
#include "rich/UnpackRich.h"
#include "sts/StsReadoutConfigLegacy.h"
#include "sts/UnpackSts.h"

namespace cbm::algo
{

  /** @struct UnpackMonitorData
   ** @author Dominik Smith <d.smith@gsi.de>
   ** @since 2 Jun 2023
   ** @brief Monitoring data for unpacking
   **/
  struct UnpackMonitorData {
    std::vector<UnpackStsMonitorData> fSts;      ///< Monitoring data for STS
    std::vector<UnpackMuchMonitorData> fMuch;    ///< Monitoring data for MUCH
    std::vector<UnpackTofMonitorData> fTof;      ///< Monitoring data for TOF
    std::vector<UnpackBmonMonitorData> fBmon;    ///< Monitoring data for T0
    std::vector<UnpackTrdMonitorData> fTrd;      ///< Monitoring data for TRD
    std::vector<UnpackTrd2dMonitorData> fTrd2d;  ///< Monitoring data for TRD2D
    std::vector<UnpackRichMonitorData> fRich;    ///< Monitoring data for RICH
    size_t fNumMs       = 0;
    size_t fNumBytes    = 0;
    size_t fNumDigis    = 0;
    size_t fNumCompUsed = 0;
    std::string print()
    {
      std::stringstream ss;
      ss << "TS stats: num MS " << fNumMs << ", bytes " << fNumBytes << ", digis " << fNumDigis << ", components "
         << fNumCompUsed << std::endl;
      return ss.str();
    }
  };

  /** @class Unpack
 ** @brief Algo class for unpacking digi timeslicess
 ** @author Dominik Smith <d.smith@gsi.de>
 ** @since 02.06.2023
 **
 **/
  class Unpack {

  public:
    typedef std::pair<CbmDigiTimeslice, UnpackMonitorData> resultType;
    /** @brief Algorithm execution
     ** @param fles timeslice to unpack
     ** @return pair: digi timeslice, monitoring data
     **/
    resultType operator()(const fles::Timeslice* timeslice);

    /** @brief Default constructor **/
    Unpack() {};

    /** @brief Destructor **/
    ~Unpack() {};

    /** @brief Parameters for STS unpackers **/
    StsReadoutConfigLegacy fStsConfig {};

    /** @brief Parameters for MUCH unpackers **/
    MuchReadoutConfig fMuchConfig {};

    /** @brief Parameters for TOF unpackers **/
    TofReadoutConfig fTofConfig {};

    /** @brief Parameters for T0 unpackers **/
    BmonReadoutConfig fBmonConfig {};

    /** @brief Parameters for TRD unpackers **/
    TrdReadoutConfig fTrdConfig {};

    /** @brief Parameters for TRD2D unpackers **/
    Trd2dReadoutConfig fTrd2dConfig {};

    /** @brief Parameters for RICH unpackers **/
    RichReadoutConfig fRichConfig {};

    /** @brief Initialize unpackers and fill parameters from config objects
     * @param subIds: vector of subsystem identifiers to unpack, default: all
     * @see Init()
     **/
    bool Init(std::optional<std::vector<fles::SubsystemIdentifier>> subIds = {});

    bool DetectorEnabled(fles::SubsystemIdentifier subId)
    {
      return std::find(fSubIds.begin(), fSubIds.end(), subId) != fSubIds.end();
    }

  private:  // methods
    /** @brief Microslice loop **/
    template<class Digi, class UnpackAlgo, class MonitorData>
    void MsLoop(const fles::Timeslice* timeslice, std::map<uint16_t, UnpackAlgo>& algoMap, const uint64_t comp,
                const uint16_t eqId, std::vector<Digi>* digis, UnpackMonitorData& monitor,
                std::vector<MonitorData>* monitorMs, uint8_t sys_ver);


  private:                                                // members
    std::vector<fles::SubsystemIdentifier> fSubIds = {};  ///< Detector identifiers to unpack

    /** @brief STS unpackers **/
    std::map<uint16_t, UnpackSts> fAlgoSts = {};

    /** @brief MUCH unpackers **/
    std::map<uint16_t, UnpackMuch> fAlgoMuch = {};

    /** @brief TOF unpackers **/
    std::map<uint16_t, UnpackTof> fAlgoTof = {};

    /** @brief T0 unpackers **/
    std::map<uint16_t, UnpackBmon> fAlgoBmon = {};

    /** @brief TRD unpackers **/
    std::map<uint16_t, UnpackTrd> fAlgoTrd = {};
    /** @brief TRD2D unpackers **/
    std::map<uint16_t, UnpackTrd2d> fAlgoTrd2d = {};

    /** @brief RICH unpackers **/
    std::map<uint16_t, UnpackRich> fAlgoRich = {};

    /** @brief System time offsets **/
    std::map<fles::SubsystemIdentifier, int32_t> fSystemTimeOffset = {
      {fles::SubsystemIdentifier::STS, -970},  {fles::SubsystemIdentifier::MUCH, -980},
      {fles::SubsystemIdentifier::RICH, 100},  {fles::SubsystemIdentifier::RPC, 40},
      {fles::SubsystemIdentifier::T0, 0},      {fles::SubsystemIdentifier::TRD, 1300},
      {fles::SubsystemIdentifier::TRD2D, -510}};
  };
}  // namespace cbm::algo

#endif /* UNPACK_H */