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