Skip to content
Snippets Groups Projects
CbmTbDaqBuffer.h 3.1 KiB
Newer Older
/* Copyright (C) 2012-2020 PI-UHd, GSI
   SPDX-License-Identifier: GPL-3.0-only
   Authors: Volker Friese, Norbert Herrmann [committer] */
/** @file CbmDaqBuffer.h
 ** @author Volker Friese <v.friese@gsi.de>
 ** @date 17 July 2012
 **/

#ifndef CBMTBDAQBUFFER_H
#define CBMTBDAQBUFFER_H 1

Administrator's avatar
Administrator committed
#include "CbmDefs.h"
#include <RtypesCore.h>  // for Double_t, Int_t
#include <boost/any.hpp>
Administrator's avatar
Administrator committed
#include <map>      // for multimap, __map_const_iterator, multimap<>::...
#include <utility>  // for pair

/** @class CbmTbDaqBuffer
 ** @author Volker Friese <v.friese@gsi.de>
 ** @date 13 December 2012
 ** @brief Singleton buffer class for CBM raw data
 **
 ** The CbmTbDaqBuffer stores and sorts (w.r.t. time) CBM raw data
 ** (currently: boost::any) transiently.
 ** Data can be send to the buffer by the method InsertData.
 ** They can be retrieved by GetNextData, which delivers a
 ** time-ordered sequence of raw data objects.
 **
 ** There is only one buffer stream, irrespective of the detector system.
 **
 ** The buffer handles objects only by pointer, i.e. the data have
 ** to be instantiated by the sending task (digitiser) and
 ** deleted by the receiving class (CbmDaq).
 **/
Administrator's avatar
Administrator committed
class CbmTbDaqBuffer {
public:
  typedef std::pair<boost::any, ECbmModuleId> Data;
Administrator's avatar
Administrator committed

  /**   Destructor  **/
  ~CbmTbDaqBuffer();
Administrator's avatar
Administrator committed

  /** Pointer to next raw data object
   ** up to given time
   ** @param time  maximal time [ns]
   ** @return pointer to raw data object
   **
   ** A NULL pointer will be returned if no further data can be released.
   ** This does not mean that the buffer is empty.
   **/
  //  boost::any GetNextData(Double_t time);
  Data GetNextData(Double_t time);
  /** Current buffer size
   ** @return number of objects in buffer
   */
  Int_t GetSize() const { return fData.size(); }
  /**  Get first digi time  **/
  Double_t GetTimeFirst() const;
Administrator's avatar
Administrator committed

  /**  Get last digi time  **/
  Double_t GetTimeLast() const;
Administrator's avatar
Administrator committed

  /**   Access to singleton instance
   ** @return pointer to instance
   **/
  static CbmTbDaqBuffer* Instance();
Administrator's avatar
Administrator committed

  /**   Print buffer status  **/
  void PrintStatus() const;

  /** Insert digi of any type into the buffer */
Administrator's avatar
Administrator committed
  template<class Digi>
  void InsertData(Digi* digi)
  {
Administrator's avatar
Administrator committed
    Double_t digi_time    = digi->GetTime();
    ECbmModuleId systemID = Digi::GetSystem();
    InsertData(digi, digi_time, systemID);
  }
Administrator's avatar
Administrator committed
private:
  /** Buffer management **/
  std::multimap<Double_t, Data> fData;

Administrator's avatar
Administrator committed

  /** Pointer to singleton instance **/
  static CbmTbDaqBuffer* fgInstance;

Administrator's avatar
Administrator committed

  /**  Default constructor
   **  Declared private to prevent instantiation.
   **/
  CbmTbDaqBuffer();
  /**  Copy constructor. Defined private to prevent usage. **/
  CbmTbDaqBuffer(const CbmTbDaqBuffer&);
  /**  Assignment operator. Defined private to prevent usage. **/
  CbmTbDaqBuffer& operator=(const CbmTbDaqBuffer&);
  /** Insert data into the buffer
   ** @param digi  pointer to data object to be inserted
   **/
  //  void InsertData(boost::any digi);
  void InsertData(boost::any digi, Double_t time, ECbmModuleId systemID)
  {
    fData.insert(std::make_pair(time, std::make_pair(std::move(digi), systemID)));
  }
};


#endif /* CBMTBDAQBUFFER_H */