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
#include <RtypesCore.h> // for Double_t, Int_t
#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).
**/
typedef std::pair<boost::any, ECbmModuleId> Data;
/** Destructor **/
~CbmTbDaqBuffer();
/** 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;
/** Get last digi time **/
Double_t GetTimeLast() const;
/** Access to singleton instance
** @return pointer to instance
**/
static CbmTbDaqBuffer* Instance();
/** Print buffer status **/
void PrintStatus() const;
/** Insert digi of any type into the buffer */
void InsertData(Digi* digi)
{
Double_t digi_time = digi->GetTime();
ECbmModuleId systemID = Digi::GetSystem();
InsertData(digi, digi_time, systemID);
}
/** Buffer management **/
std::multimap<Double_t, Data> fData;
/** Pointer to singleton instance **/
static CbmTbDaqBuffer* fgInstance;
/** 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 */