From 18a7d4e259d7011d92bf757fe3542fee5583c844 Mon Sep 17 00:00:00 2001
From: Norbert Herrmann <n.herrmann@physi.uni-heidelberg.de>
Date: Sun, 2 Aug 2020 10:19:48 +0200
Subject: [PATCH] Cleanup build system for MQ directory

Add class CbmTbDaqBuffer to MQ/unpacker. This is the only place where
the class is used. Cleanup build system files from uneccessary and
obsolete include directories. Add the CbmTbDaqBuffer to the list
of files for one specific executable where it is needed.
Add directories unpacker and hitbuilder
---
 MQ/CMakeLists.txt              |   4 +-
 MQ/hitbuilder/CMakeLists.txt   |  14 ++--
 MQ/unpacker/CMakeLists.txt     |   8 +--
 MQ/unpacker/CbmTbDaqBuffer.cxx |  87 ++++++++++++++++++++++++
 MQ/unpacker/CbmTbDaqBuffer.h   | 118 +++++++++++++++++++++++++++++++++
 5 files changed, 215 insertions(+), 16 deletions(-)
 create mode 100644 MQ/unpacker/CbmTbDaqBuffer.cxx
 create mode 100644 MQ/unpacker/CbmTbDaqBuffer.h

diff --git a/MQ/CMakeLists.txt b/MQ/CMakeLists.txt
index 3bc8ce8b40..0062e61c1b 100644
--- a/MQ/CMakeLists.txt
+++ b/MQ/CMakeLists.txt
@@ -5,7 +5,7 @@ EndIf()
 add_subdirectory(base)
 add_subdirectory(source)
 add_subdirectory(sink)
-#add_subdirectory(unpacker)
+add_subdirectory(unpacker)
 
 add_subdirectory(monitor)
 add_subdirectory(histoServer)
@@ -20,4 +20,4 @@ add_subdirectory(mcbm)
 # Don't compile it for the time being
 # TODO: Fix the compilation problems
   add_subdirectory(parmq)
-#  add_subdirectory(hitbuilder)
+  add_subdirectory(hitbuilder)
diff --git a/MQ/hitbuilder/CMakeLists.txt b/MQ/hitbuilder/CMakeLists.txt
index 819fb4e4d0..e20c7ecf36 100644
--- a/MQ/hitbuilder/CMakeLists.txt
+++ b/MQ/hitbuilder/CMakeLists.txt
@@ -4,14 +4,11 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQ_Mcbm.sh.in ${CMAKE_BINARY_DIR
 
 set(INCLUDE_DIRECTORIES
     ${CMAKE_CURRENT_SOURCE_DIR}
-    ${CBMROOT_SOURCE_DIR}/fles/cern2016/param
-    ${CBMROOT_SOURCE_DIR}/fles/cern2016/unpacker
-    ${CBMROOT_SOURCE_DIR}/beamtime/base
     ${CBMDATA_DIR}
+    ${CBMDATA_DIR}/base
     ${CBMDATA_DIR}/tof
     ${CBMBASE_DIR}
-    ${CBMROOT_SOURCE_DIR}/tof/TofParam
-    ${CBMROOT_SOURCE_DIR}/tof/TofTools
+    ${CBMDETECTORBASE_DIR}/tof
 )
 
 Set(SYSTEM_INCLUDE_DIRECTORIES
@@ -23,8 +20,8 @@ Set(SYSTEM_INCLUDE_DIRECTORIES
     ${FAIRMQ_INCLUDE_DIR}/options
 
     ${IPC_INCLUDE_DIRECTORY}
-    ${CBMROOT_SOURCE_DIR}/external/cppzmq    
-    ${CBMROOT_SOURCE_DIR}/tof/TofReco
+    ${CBMROOT_SOURCE_DIR}/external/cppzmq        
+    ${CBMROOT_SOURCE_DIR}/reco/detectors/tof
 )
 
 include_directories(${INCLUDE_DIRECTORIES})
@@ -72,10 +69,9 @@ set(DEPENDENCIES
   ${FAIR_LIBS}
   ${BOOST_LIBS}
 #    fles_ipc
-  CbmFlibCern2016
   CbmBase
   CbmData
-  CbmTof	
+  CbmTofBase
   Geom		
   Core
   MathCore
diff --git a/MQ/unpacker/CMakeLists.txt b/MQ/unpacker/CMakeLists.txt
index abceb285b8..a7ededc4ca 100644
--- a/MQ/unpacker/CMakeLists.txt
+++ b/MQ/unpacker/CMakeLists.txt
@@ -3,14 +3,12 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQSamplerUnpackerParserver.sh.in
 set(INCLUDE_DIRECTORIES
     ${CMAKE_CURRENT_SOURCE_DIR}
     ${CBMROOT_SOURCE_DIR}/MQ/base
-    ${CBMROOT_SOURCE_DIR}/fles/cern2016/param
-    ${CBMROOT_SOURCE_DIR}/fles/cern2016/unpacker
     ${CBMROOT_SOURCE_DIR}/fles/mcbm2018/parameter
     ${CBMROOT_SOURCE_DIR}/fles/mcbm2018/dataformat
     ${CBMROOT_SOURCE_DIR}/fles/mcbm2018/unpacker
     ${CBMROOT_SOURCE_DIR}/fles/mcbm2018/commonMQ
-    ${CBMROOT_SOURCE_DIR}/beamtime/base
     ${CBMDATA_DIR}
+    ${CBMDATA_DIR}/raw
     ${CBMDATA_DIR}/tof
     ${CBMBASE_DIR}
 )
@@ -64,16 +62,16 @@ If(FAIRLOGGER_FOUND)
 EndIf()
 
 set(EXE_NAME UnpackTofMcbm2018)
-set(SRCS CbmDeviceUnpackTofMcbm2018.cxx runUnpackTofMcbm2018.cxx)
+set(SRCS CbmTbDaqBuffer.cxx CbmDeviceUnpackTofMcbm2018.cxx runUnpackTofMcbm2018.cxx)
 
 set(DEPENDENCIES
   ${DEPENDENCIES}
   ${FAIR_LIBS}
   ${BOOST_LIBS}
   fles_ipc
-  CbmFlibCern2016
   CbmFlibMcbm2018
   CbmBase
+#  CbmBeamtimeBase
   CbmData
   Core
   RIO
diff --git a/MQ/unpacker/CbmTbDaqBuffer.cxx b/MQ/unpacker/CbmTbDaqBuffer.cxx
new file mode 100644
index 0000000000..56327c7f9b
--- /dev/null
+++ b/MQ/unpacker/CbmTbDaqBuffer.cxx
@@ -0,0 +1,87 @@
+/** @file CbmTbDaqBuffer.cxx
+ ** @author Volker Friese <v.friese@gsi.de>
+ ** @date 13 December 2013
+ **/
+
+#include "CbmTbDaqBuffer.h"
+
+#include <FairLogger.h>         // for Logger, LOG
+#include <stddef.h>             // for NULL
+#include <iomanip>              // for setprecision, __iom_t5
+#include <sstream>              // for basic_stringstream<>::string_type
+#include <boost/any.hpp>
+
+// -----   Initialisation of static variables   ------------------------------
+CbmTbDaqBuffer* CbmTbDaqBuffer::fgInstance = nullptr;
+// ---------------------------------------------------------------------------
+
+
+
+// -----   Constructor   -----------------------------------------------------
+CbmTbDaqBuffer::CbmTbDaqBuffer() : fData() {
+}
+// ---------------------------------------------------------------------------
+
+
+// -----   Destructor   ------------------------------------------------------
+CbmTbDaqBuffer::~CbmTbDaqBuffer() {
+}
+// ---------------------------------------------------------------------------
+
+Double_t CbmTbDaqBuffer::GetTimeFirst() const
+{
+  if ( ! GetSize() ) return -1.;
+  // Return the key from the first element in the map
+  // The key of the map is the time of digi
+  return fData.begin()->first;
+}
+
+Double_t CbmTbDaqBuffer::GetTimeLast() const
+{
+  if ( ! GetSize() ) return -1.;
+  // Return the key from the last element in the map
+  // The key of the map is the time of digi
+  return (--fData.end())->first;
+}
+
+// -----   Access to next data   ---------------------------------------------
+CbmTbDaqBuffer::Data CbmTbDaqBuffer::GetNextData(Double_t time) {
+
+  // --- Check for empty buffer
+  if ( ! fData.size() ) return std::make_pair(boost::any(), ECbmModuleId::kNotExist);
+
+  // --- Get data from buffer
+  std::multimap<Double_t, std::pair<boost::any, ECbmModuleId>>::iterator it = fData.begin();
+  Double_t digi_time = it->first;
+
+  if ( digi_time < time ) {
+    boost::any digi = it->second.first;
+    ECbmModuleId sysID = it->second.second;
+    fData.erase(it);
+    return std::make_pair(digi, sysID);
+  }
+  return std::make_pair(boost::any(), ECbmModuleId::kNotExist);
+}
+// ---------------------------------------------------------------------------
+
+// -----   Instance   --------------------------------------------------------
+CbmTbDaqBuffer* CbmTbDaqBuffer::Instance() {
+  if ( ! fgInstance ) fgInstance = new CbmTbDaqBuffer();
+  return fgInstance;
+}
+// ---------------------------------------------------------------------------
+
+// -----   Print status   ----------------------------------------------------
+void CbmTbDaqBuffer::PrintStatus() const {
+  Int_t size = GetSize();
+  std::stringstream ss;
+  ss << "CbmTbDaqBuffer: Status ";
+  if ( ! size ) {
+    LOG(info) << ss.str() << "empty";
+    return;
+  }
+  LOG(info) << ss.str() << GetSize() << " digis from "
+            << std::fixed << std::setprecision(9) << GetTimeFirst() * 1.e-9 << " s to "
+            << GetTimeLast() *1.e-9 << " s";
+}
+// ---------------------------------------------------------------------------
diff --git a/MQ/unpacker/CbmTbDaqBuffer.h b/MQ/unpacker/CbmTbDaqBuffer.h
new file mode 100644
index 0000000000..a66952b285
--- /dev/null
+++ b/MQ/unpacker/CbmTbDaqBuffer.h
@@ -0,0 +1,118 @@
+/** @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
+#include <boost/any.hpp>
+#include "CbmDefs.h"
+
+/** @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).
+ **/
+class CbmTbDaqBuffer
+{
+  public:
+  
+  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 */
+  template <class Digi>
+    void InsertData(Digi* digi)
+    {
+      Double_t digi_time = digi->GetTime();
+      ECbmModuleId systemID  = Digi::GetSystem();
+      InsertData(digi, digi_time, systemID);
+    }
+  
+ private:
+  
+
+  /** 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 */
-- 
GitLab