From d76d0df2c1fc0393109e9398de6b36d93ab0f318 Mon Sep 17 00:00:00 2001
From: "P.-A. Loizeau" <p.-a.loizeau@gsi.de>
Date: Mon, 13 Jun 2022 17:04:55 +0200
Subject: [PATCH] [MQ] in event builder device, add option to skip sending the
 events + fixes

- Add option to skip the emission of the built events (and unpacked TS) on the ZMQ output
- Fix wrong type for the MaxNb parameter (signed as default is -1)
- Fix potential segfaults in destructor
---
 MQ/mcbm/CbmDeviceBuildDigiEvents.cxx | 38 +++++++++++++++-------------
 MQ/mcbm/CbmDeviceBuildDigiEvents.h   |  2 ++
 MQ/mcbm/runBuildDigiEvents.cxx       |  1 +
 3 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx
index 46564aba17..98aab969cf 100644
--- a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx
+++ b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx
@@ -70,6 +70,7 @@ try {
   fvsSetTrigMaxNb       = fConfig->GetValue<std::vector<std::string>>("SetTrigMaxNb");
   fvsSetTrigMinLayersNb = fConfig->GetValue<std::vector<std::string>>("SetTrigMinLayersNb");
 
+  fbDoNotSend              = fConfig->GetValue<bool>("DoNotSend");
   fsChannelNameDataInput   = fConfig->GetValue<std::string>("TsNameIn");
   fsChannelNameDataOutput  = fConfig->GetValue<std::string>("EvtNameOut");
   fsChannelNameHistosInput = fConfig->GetValue<std::string>("ChNameIn");
@@ -137,7 +138,7 @@ try {
     }
   }
 
-     /// Extract detector to remove if any
+  /// Extract detector to remove if any
   for (std::vector<std::string>::iterator itStrRem = fvsDelDet.begin();
        itStrRem != fvsDelDet.end();
        ++itStrRem) {
@@ -152,7 +153,8 @@ try {
       continue;
     }
   }
-     /// Extract Trigger window to add if any
+
+  /// Extract Trigger window to add if any
   for (std::vector<std::string>::iterator itStrTrigWin = fvsSetTrigWin.begin();
        itStrTrigWin != fvsSetTrigWin.end();
        ++itStrTrigWin) {
@@ -257,9 +259,9 @@ try {
 
     /// Max number
     charPosDel++;
-    UInt_t uMaxNb = std::stoul((*itStrMaxNb).substr(charPosDel));
+    Int_t iMaxNb = std::stol((*itStrMaxNb).substr(charPosDel));
 
-    fpAlgo->SetTriggerMaxNumber(selDet, uMaxNb);
+    fpAlgo->SetTriggerMaxNumber(selDet, iMaxNb);
   }
 
   /// Extract MinLayersNb for trigger if any
@@ -541,7 +543,7 @@ bool CbmDeviceBuildDigiEvents::HandleData(FairMQParts& parts, int /*index*/)
   fpAlgo->ProcessTs();
 
   /// Send events vector to ouput
-  if (!SendEvents(parts)) return false;
+  if (!fbDoNotSend && !SendEvents(parts)) return false;
 
   /// Clear metadata
   fTimeSliceMetaDataArray->Clear();
@@ -707,23 +709,25 @@ bool CbmDeviceBuildDigiEvents::SendHistograms()
 CbmDeviceBuildDigiEvents::~CbmDeviceBuildDigiEvents()
 {
   /// Clear metadata
-  delete fCbmTsEventHeader;
+  if (fCbmTsEventHeader) delete fCbmTsEventHeader;
 
   /// Clear vectors
-  fvDigiT0->clear();
-  fvDigiSts->clear();
-  fvDigiMuch->clear();
-  fvDigiTrd->clear();
-  fvDigiTof->clear();
-  fvDigiRich->clear();
-  fvDigiPsd->clear();
+  if (fvDigiT0) fvDigiT0->clear();
+  if (fvDigiSts) fvDigiSts->clear();
+  if (fvDigiMuch) fvDigiMuch->clear();
+  if (fvDigiTrd) fvDigiTrd->clear();
+  if (fvDigiTof) fvDigiTof->clear();
+  if (fvDigiRich) fvDigiRich->clear();
+  if (fvDigiPsd) fvDigiPsd->clear();
 
   /// Clear metadata
-  fTimeSliceMetaDataArray->Clear();
-  delete fTsMetaData;
+  if (fTimeSliceMetaDataArray) {
+    fTimeSliceMetaDataArray->Clear();
+    delete fTsMetaData;
 
-  delete fTimeSliceMetaDataArray;
-  delete fpAlgo;
+    delete fTimeSliceMetaDataArray;
+  }
+  if (fpAlgo) delete fpAlgo;
 }
 
 void CbmDeviceBuildDigiEvents::Finish() {}
diff --git a/MQ/mcbm/CbmDeviceBuildDigiEvents.h b/MQ/mcbm/CbmDeviceBuildDigiEvents.h
index bd1e9dbe27..6632cd3ae1 100644
--- a/MQ/mcbm/CbmDeviceBuildDigiEvents.h
+++ b/MQ/mcbm/CbmDeviceBuildDigiEvents.h
@@ -65,6 +65,8 @@ private:
   std::vector<std::string> fvsSetTrigMinNb       = {};
   std::vector<std::string> fvsSetTrigMaxNb       = {};
   std::vector<std::string> fvsSetTrigMinLayersNb = {};
+  /// I/O control
+  bool fbDoNotSend = false;
   /// message queues
   std::string fsChannelNameDataInput   = "unpts_0";
   std::string fsChannelNameDataOutput  = "events";
diff --git a/MQ/mcbm/runBuildDigiEvents.cxx b/MQ/mcbm/runBuildDigiEvents.cxx
index a1184c1d8f..97be32d5a2 100644
--- a/MQ/mcbm/runBuildDigiEvents.cxx
+++ b/MQ/mcbm/runBuildDigiEvents.cxx
@@ -38,6 +38,7 @@ void addCustomOptions(bpo::options_description& options)
   options.add_options()("SetTrigMinLayersNb", bpo::value<std::vector<std::string>>()->multitoken()->composing(),
                         "Set minimum number of fired layers for selected detector, use string matching "
                         "ECbmModuleId,uMinLayersNb e.g. kTof,3");
+  options.add_options()("DoNotSend", bpo::value<bool>()->default_value(false), "Disable the sending of data if true");
   options.add_options()("TsNameIn", bpo::value<std::string>()->default_value("unpts_0"),
                         "MQ channel name for unpacked TS data");
   options.add_options()("EvtNameOut", bpo::value<std::string>()->default_value("events"),
-- 
GitLab