Skip to content
Snippets Groups Projects
DigiData.h 3.11 KiB
Newer Older
/* Copyright (C) 2023 FIAS Frankfurt Institute for Advanced Studies, Frankfurt / Main
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Felix Weiglhofer [committer] */
#ifndef CBM_ALGO_BASE_DIGI_DATA_H
#define CBM_ALGO_BASE_DIGI_DATA_H

#include "CbmBmonDigi.h"
#include "CbmDigiData.h"
#include "CbmDigiEvent.h"
#include "CbmEventTriggers.h"
#include "CbmFsdDigi.h"
#include "CbmMuchDigi.h"
#include "CbmPsdDigi.h"
#include "CbmRichDigi.h"
#include "CbmStsDigi.h"
#include "CbmTofDigi.h"
#include "CbmTrdDigi.h"
#include "PODVector.h"

namespace cbm::algo
{
  /**
   * @brief Collection of digis from all detector systems
   *
   * Very similar to CbmDigiData. CbmDigiData is meant for file storage,
   * while this is used for the actual processing. Seperate classes
   * allow for more flexibility and easier optimization.
   *
   * @see CbmDigiData
   * @note Uses PODVector for storage, so memory is not initialized by default.
   */
  struct DigiData {
    PODVector<CbmStsDigi> fSts;    ///< Unpacked STS digis
    PODVector<CbmMuchDigi> fMuch;  ///< Unpacked MUCH digis
    PODVector<CbmTofDigi> fTof;    ///< Unpacked TOF digis
    PODVector<CbmBmonDigi> fBmon;  ///< Unpacked Bmon digis
    PODVector<CbmTrdDigi> fTrd;    ///< Unpacked TRD digis
    PODVector<CbmTrdDigi> fTrd2d;  ///< Unpacked TRD2D digis
    PODVector<CbmRichDigi> fRich;  ///< Unpacked RICH digis
    PODVector<CbmPsdDigi> fPsd;    ///< Unpacked PSD digis
    PODVector<CbmFsdDigi> fFsd;    ///< Unpacked FSD digis

    DigiData();
    ~DigiData();
    explicit DigiData(const CbmDigiData& storable);

    /**
     * @brief Get the number of digis for a given subsystem
     *
     * @param system Subsystem to get the number of digis for
     * @todo Should use fles::Subsystem instead ECbmModuleId
     */
    size_t Size(ECbmModuleId system) const;
    /**
     * @brief Get the total number of digis across all subsystems.
     */
    size_t TotalSize() const;

    /**
     * @brief Get the total number of bytes used by all digis.
     */
    size_t TotalSizeBytes() const;

    /**
     * @brief Convert to CbmDigiData for file storage
     *
     * @note This is a very expensive operation, as it copies all data.
     */
    CbmDigiData ToStorable() const;
  };

  /**
   * @brief Event data with event number and trigger time
   *
   * @see CbmDigitEvent
   * @note Uses PODVector for storage, so memory is not initialized by default.
   */
  struct DigiEvent : public DigiData {
    // FIXME: Event number not set yet!
    uint64_t fNumber = -1;  ///< Event identifier
    double fTime     = 0;   ///< Event trigger time [ns]
    CbmEventTriggers fSelectionTriggers;
    static std::vector<DigiEvent> FromCbmDigiEvents(const std::vector<CbmDigiEvent>& events);
    static std::vector<CbmDigiEvent> ToCbmDigiEvents(const std::vector<DigiEvent>& events);

    DigiEvent() = default;

    explicit DigiEvent(const CbmDigiEvent& storable);

    /**
   * @brief Convert to CbmDigiEvent for file storage
   *
   * @note This is a very expensive operation, as it copies all data.
   */
    CbmDigiEvent ToStorable() const;
  };

}  // namespace cbm::algo

#endif  // CBM_ALGO_BASE_DIGI_DATA_H