From 9a84d73b9ba8be96beed83db79b564c827e06a3f Mon Sep 17 00:00:00 2001 From: "P.-A. Loizeau" <p.-a.loizeau@gsi.de> Date: Mon, 4 Apr 2022 13:02:02 +0200 Subject: [PATCH] [MQ] Add Bmon and Much support to unpack and event building + various fixes and improvements - Add proper Bmon support to unpack + build digi events chain - Add proper Much support to unpack + build digi events chain - Add user parameter + flags to CbmDeviceUnpack to enable/disable the unpacking of each detector - Add proper handling of disabled detectors in MQ transfer ib both CbmDeviceUnpack and CbmDeviceBuildDigiEvents - Add parameter to set "MaxNb" type selection in CbmDeviceBuildDigiEvents - Synchronize unpackers configuration in CbmDeviceUnpack with the one in the current `macro/run/run_unpack_tsa.C` - Use fles::SubsystemIdentifier instead of hard coded values in CbmDeviceUnpack --- MQ/mcbm/CMakeLists.txt | 6 +- MQ/mcbm/CbmDeviceBuildDigiEvents.cxx | 198 +++++++++++------ MQ/mcbm/CbmDeviceBuildDigiEvents.h | 1 + MQ/mcbm/CbmDeviceUnpack.cxx | 251 ++++++++++++++++----- MQ/mcbm/CbmDeviceUnpack.h | 50 +++-- MQ/mcbm/runBuildDigiEvents.cxx | 3 + MQ/mcbm/runUnpack.cxx | 8 + MQ/mcbm/startBuildRawEvents2022.sh.in | 308 ++++++++++++++++++++++++++ MQ/parmq/ParameterMQServer.cxx | 2 + 9 files changed, 683 insertions(+), 144 deletions(-) create mode 100755 MQ/mcbm/startBuildRawEvents2022.sh.in diff --git a/MQ/mcbm/CMakeLists.txt b/MQ/mcbm/CMakeLists.txt index b0919fbee2..8e6c685d9e 100644 --- a/MQ/mcbm/CMakeLists.txt +++ b/MQ/mcbm/CMakeLists.txt @@ -4,6 +4,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQBuildRawEvents.sh.in ${CMAKE_B configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startBuildRawEvents2021.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startBuildRawEvents2021.sh) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startBuildRawEventsCosmics2021.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startBuildRawEventsCosmics2021.sh) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startEventBuilder.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startEventBuilder.sh) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startBuildRawEvents2022.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startBuildRawEvents2022.sh) set(INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR} @@ -19,12 +20,13 @@ set(INCLUDE_DIRECTORIES ${CBMROOT_SOURCE_DIR}/fles/flestools ${CBMROOT_SOURCE_DIR}/reco/eventbuilder/digis ${CBMROOT_SOURCE_DIR}/reco/base/ + ${CBMROOT_SOURCE_DIR}/reco/detectors/much/unpack ${CBMROOT_SOURCE_DIR}/reco/detectors/psd/unpack + ${CBMROOT_SOURCE_DIR}/reco/detectors/rich/unpack ${CBMROOT_SOURCE_DIR}/reco/detectors/sts/unpack ${CBMROOT_SOURCE_DIR}/reco/detectors/tof/unpack ${CBMROOT_SOURCE_DIR}/reco/detectors/trd/unpack ${CBMROOT_SOURCE_DIR}/reco/detectors/trd/rawToDigiMethods - ${CBMROOT_SOURCE_DIR}/reco/detectors/rich/unpack ${CBMDATA_DIR} ${CBMDATA_DIR}/raw ${CBMDATA_DIR}/sts @@ -41,6 +43,7 @@ set(INCLUDE_DIRECTORIES ${CBMROOT_SOURCE_DIR}/sim/transport/geosetup # For CbmGeoSetupDbProvider.h, needed by CbmSetup ${CBMDETECTORBASE_DIR}/sts # required for parameter handling of the sts + ${CBMDETECTORBASE_DIR}/much # required for parameter handling of the much ${CBMDETECTORBASE_DIR}/trd # required for parameter handling of the trd ${CBMDETECTORBASE_DIR}/tof # required for parameter handling of the tof ${CBMDETECTORBASE_DIR}/rich # required for parameter handling of the rich @@ -218,6 +221,7 @@ set(DEPENDENCIES CbmFlibFlesTools CbmBase CbmRecoBase + CbmMuchReco CbmPsdReco CbmRichReco CbmRecoSts diff --git a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx index b504518e7a..f9d19d8507 100644 --- a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx +++ b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx @@ -67,6 +67,7 @@ try { fvsDelDet = fConfig->GetValue<std::vector<std::string>>("DelDet"); fvsSetTrigWin = fConfig->GetValue<std::vector<std::string>>("SetTrigWin"); fvsSetTrigMinNb = fConfig->GetValue<std::vector<std::string>>("SetTrigMinNb"); + fvsSetTrigMaxNb = fConfig->GetValue<std::vector<std::string>>("SetTrigMaxNb"); fsChannelNameDataInput = fConfig->GetValue<std::string>("TsNameIn"); fsChannelNameDataOutput = fConfig->GetValue<std::string>("EvtNameOut"); @@ -110,14 +111,15 @@ try { : EOverlapModeRaw::NoOverlap))); fpAlgo->SetEventOverlapMode(mode); /// Extract refdet - RawEventBuilderDetector refDet = ("kT0" == fsRefDet ? kRawEventBuilderDetT0 - : ("kSts" == fsRefDet ? kRawEventBuilderDetSts - : ("kMuch" == fsRefDet ? kRawEventBuilderDetMuch - : ("kTrd" == fsRefDet ? kRawEventBuilderDetTrd - : ("kTof" == fsRefDet ? kRawEventBuilderDetTof - : ("kRich" == fsRefDet ? kRawEventBuilderDetRich - : ("kPsd" == fsRefDet ? kRawEventBuilderDetPsd - : kRawEventBuilderDetUndef))))))); + RawEventBuilderDetector refDet = ("kT0" == fsRefDet ? kRawEventBuilderDetT0 + : ("kSts" == fsRefDet ? kRawEventBuilderDetSts + : ("kMuch" == fsRefDet ? kRawEventBuilderDetMuch + : ("kTrd" == fsRefDet ? kRawEventBuilderDetTrd + : ("kTrd2D" == fsRefDet ? kRawEventBuilderDetTrd2D + : ("kTof" == fsRefDet ? kRawEventBuilderDetTof + : ("kRich" == fsRefDet ? kRawEventBuilderDetRich + : ("kPsd" == fsRefDet ? kRawEventBuilderDetPsd + : kRawEventBuilderDetUndef)))))))); if (kRawEventBuilderDetUndef != refDet) { fpAlgo->SetReferenceDetector(refDet); } @@ -131,14 +133,15 @@ try { for (std::vector<std::string>::iterator itStrAdd = fvsAddDet.begin(); itStrAdd != fvsAddDet.end(); ++itStrAdd) { - RawEventBuilderDetector addDet = ("kT0" == *itStrAdd ? kRawEventBuilderDetT0 - : ("kSts" == *itStrAdd ? kRawEventBuilderDetSts - : ("kMuch" == *itStrAdd ? kRawEventBuilderDetMuch - : ("kTrd" == *itStrAdd ? kRawEventBuilderDetTrd - : ("kTof" == *itStrAdd ? kRawEventBuilderDetTof - : ("kRich" == *itStrAdd ? kRawEventBuilderDetRich - : ("kPsd" == *itStrAdd ? kRawEventBuilderDetPsd - : kRawEventBuilderDetUndef))))))); + RawEventBuilderDetector addDet = ("kT0" == *itStrAdd ? kRawEventBuilderDetT0 + : ("kSts" == *itStrAdd ? kRawEventBuilderDetSts + : ("kMuch" == *itStrAdd ? kRawEventBuilderDetMuch + : ("kTrd" == *itStrAdd ? kRawEventBuilderDetTrd + : ("kTrd2D" == *itStrAdd ? kRawEventBuilderDetTrd2D + : ("kTof" == *itStrAdd ? kRawEventBuilderDetTof + : ("kRich" == *itStrAdd ? kRawEventBuilderDetRich + : ("kPsd" == *itStrAdd ? kRawEventBuilderDetPsd + : kRawEventBuilderDetUndef)))))))); if (kRawEventBuilderDetUndef != addDet) { fpAlgo->AddDetector(addDet); } @@ -154,14 +157,15 @@ try { for (std::vector<std::string>::iterator itStrRem = fvsDelDet.begin(); itStrRem != fvsDelDet.end(); ++itStrRem) { - RawEventBuilderDetector remDet = ("kT0" == *itStrRem ? kRawEventBuilderDetT0 - : ("kSts" == *itStrRem ? kRawEventBuilderDetSts - : ("kMuch" == *itStrRem ? kRawEventBuilderDetMuch - : ("kTrd" == *itStrRem ? kRawEventBuilderDetTrd - : ("kTof" == *itStrRem ? kRawEventBuilderDetTof - : ("kRich" == *itStrRem ? kRawEventBuilderDetRich - : ("kPsd" == *itStrRem ? kRawEventBuilderDetPsd - : kRawEventBuilderDetUndef))))))); + RawEventBuilderDetector remDet = ("kT0" == *itStrRem ? kRawEventBuilderDetT0 + : ("kSts" == *itStrRem ? kRawEventBuilderDetSts + : ("kMuch" == *itStrRem ? kRawEventBuilderDetMuch + : ("kTrd" == *itStrRem ? kRawEventBuilderDetTrd + : ("kTrd2D" == *itStrRem ? kRawEventBuilderDetTrd2D + : ("kTof" == *itStrRem ? kRawEventBuilderDetTof + : ("kRich" == *itStrRem ? kRawEventBuilderDetRich + : ("kPsd" == *itStrRem ? kRawEventBuilderDetPsd + : kRawEventBuilderDetUndef)))))))); if (kRawEventBuilderDetUndef != remDet) { fpAlgo->RemoveDetector(remDet); } @@ -188,14 +192,15 @@ try { /// Detector Enum Tag std::string sSelDet = (*itStrTrigWin).substr(0, charPosDel); - ECbmModuleId selDet = ("kT0" == sSelDet ? ECbmModuleId::kT0 - : ("kSts" == sSelDet ? ECbmModuleId::kSts - : ("kMuch" == sSelDet ? ECbmModuleId::kMuch - : ("kTrd" == sSelDet ? ECbmModuleId::kTrd - : ("kTof" == sSelDet ? ECbmModuleId::kTof - : ("kRich" == sSelDet ? ECbmModuleId::kRich - : ("kPsd" == sSelDet ? ECbmModuleId::kPsd - : ECbmModuleId::kNotExist))))))); + ECbmModuleId selDet = ("kT0" == sSelDet ? ECbmModuleId::kT0 + : ("kSts" == sSelDet ? ECbmModuleId::kSts + : ("kMuch" == sSelDet ? ECbmModuleId::kMuch + : ("kTrd" == sSelDet ? ECbmModuleId::kTrd + : ("kTrd2D" == sSelDet ? ECbmModuleId::kTrd2d + : ("kTof" == sSelDet ? ECbmModuleId::kTof + : ("kRich" == sSelDet ? ECbmModuleId::kRich + : ("kPsd" == sSelDet ? ECbmModuleId::kPsd + : ECbmModuleId::kNotExist)))))))); if (ECbmModuleId::kNotExist == selDet) { LOG(info) << "CbmDeviceBuildDigiEvents::InitTask => " @@ -224,7 +229,7 @@ try { fpAlgo->SetTriggerWindow(selDet, dWinBeg, dWinEnd); } - /// Extract MinNb for trigger if any + /// Extract MinNb for trigger if any for (std::vector<std::string>::iterator itStrMinNb = fvsSetTrigMinNb.begin(); itStrMinNb != fvsSetTrigMinNb.end(); ++itStrMinNb) { @@ -240,14 +245,15 @@ try { /// Detector Enum Tag std::string sSelDet = (*itStrMinNb).substr(0, charPosDel); - ECbmModuleId selDet = ("kT0" == sSelDet ? ECbmModuleId::kT0 - : ("kSts" == sSelDet ? ECbmModuleId::kSts - : ("kMuch" == sSelDet ? ECbmModuleId::kMuch - : ("kTrd" == sSelDet ? ECbmModuleId::kTrd - : ("kTof" == sSelDet ? ECbmModuleId::kTof - : ("kRich" == sSelDet ? ECbmModuleId::kRich - : ("kPsd" == sSelDet ? ECbmModuleId::kPsd - : ECbmModuleId::kNotExist))))))); + ECbmModuleId selDet = ("kT0" == sSelDet ? ECbmModuleId::kT0 + : ("kSts" == sSelDet ? ECbmModuleId::kSts + : ("kMuch" == sSelDet ? ECbmModuleId::kMuch + : ("kTrd" == sSelDet ? ECbmModuleId::kTrd + : ("kTrd2D" == sSelDet ? ECbmModuleId::kTrd2d + : ("kTof" == sSelDet ? ECbmModuleId::kTof + : ("kRich" == sSelDet ? ECbmModuleId::kRich + : ("kPsd" == sSelDet ? ECbmModuleId::kPsd + : ECbmModuleId::kNotExist)))))))); if (ECbmModuleId::kNotExist == selDet) { LOG(info) << "CbmDeviceBuildDigiEvents::InitTask => " @@ -263,6 +269,46 @@ try { fpAlgo->SetTriggerMinNumber(selDet, uMinNb); } + /// Extract MaxNb for trigger if any + for (std::vector<std::string>::iterator itStrMaxNb = fvsSetTrigMaxNb.begin(); + itStrMaxNb != fvsSetTrigMaxNb.end(); + ++itStrMaxNb) { + size_t charPosDel = (*itStrMaxNb).find(','); + if (std::string::npos == charPosDel) { + LOG(info) + << "CbmDeviceBuildDigiEvents::InitTask => " + << "Trying to set trigger Max Nb with invalid option pattern, ignored! " + << " (Should be ECbmModuleId,uMaxNb but instead found " << (*itStrMaxNb) + << " )"; + continue; + } + + /// Detector Enum Tag + std::string sSelDet = (*itStrMaxNb).substr(0, charPosDel); + ECbmModuleId selDet = ("kT0" == sSelDet ? ECbmModuleId::kT0 + : ("kSts" == sSelDet ? ECbmModuleId::kSts + : ("kMuch" == sSelDet ? ECbmModuleId::kMuch + : ("kTrd" == sSelDet ? ECbmModuleId::kTrd + : ("kTrd2D" == sSelDet ? ECbmModuleId::kTrd2d + : ("kTof" == sSelDet ? ECbmModuleId::kTof + : ("kRich" == sSelDet ? ECbmModuleId::kRich + : ("kPsd" == sSelDet ? ECbmModuleId::kPsd + : ECbmModuleId::kNotExist)))))))); + if (ECbmModuleId::kNotExist == selDet) { + LOG(info) + << "CbmDeviceBuildDigiEvents::InitTask => " + << "Trying to set trigger Max Nb for unsupported detector, ignored! " + << sSelDet; + continue; + } + + /// Max number + charPosDel++; + UInt_t uMaxNb = std::stoul((*itStrMaxNb).substr(charPosDel)); + + fpAlgo->SetTriggerMaxNumber(selDet, uMaxNb); + } + /// FIXME: Re-enable clang formatting after formatted lines /* clang-format on */ @@ -388,52 +434,66 @@ bool CbmDeviceBuildDigiEvents::HandleData(FairMQParts& parts, int /*index*/) ++uPartIdx; /// T0 - std::string msgStrT0(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); - std::istringstream issT0(msgStrT0); - boost::archive::binary_iarchive inputArchiveT0(issT0); - inputArchiveT0 >> *fvDigiT0; + if (0 < (parts.At(uPartIdx))->GetSize()) { + std::string msgStrT0(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); + std::istringstream issT0(msgStrT0); + boost::archive::binary_iarchive inputArchiveT0(issT0); + inputArchiveT0 >> *fvDigiT0; + } ++uPartIdx; /// STS - std::string msgStrSts(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); - std::istringstream issSts(msgStrSts); - boost::archive::binary_iarchive inputArchiveSts(issSts); - inputArchiveSts >> *fvDigiSts; + if (0 < (parts.At(uPartIdx))->GetSize()) { + std::string msgStrSts(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); + std::istringstream issSts(msgStrSts); + boost::archive::binary_iarchive inputArchiveSts(issSts); + inputArchiveSts >> *fvDigiSts; + } ++uPartIdx; /// MUCH - std::string msgStrMuch(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); - std::istringstream issMuch(msgStrMuch); - boost::archive::binary_iarchive inputArchiveMuch(issMuch); - inputArchiveMuch >> *fvDigiMuch; + if (0 < (parts.At(uPartIdx))->GetSize()) { + std::string msgStrMuch(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); + std::istringstream issMuch(msgStrMuch); + boost::archive::binary_iarchive inputArchiveMuch(issMuch); + inputArchiveMuch >> *fvDigiMuch; + } ++uPartIdx; /// TRD - std::string msgStrTrd(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); - std::istringstream issTrd(msgStrTrd); - boost::archive::binary_iarchive inputArchiveTrd(issTrd); - inputArchiveTrd >> *fvDigiTrd; + if (0 < (parts.At(uPartIdx))->GetSize()) { + std::string msgStrTrd(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); + std::istringstream issTrd(msgStrTrd); + boost::archive::binary_iarchive inputArchiveTrd(issTrd); + inputArchiveTrd >> *fvDigiTrd; + } ++uPartIdx; /// T0F - std::string msgStrTof(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); - std::istringstream issTof(msgStrTof); - boost::archive::binary_iarchive inputArchiveTof(issTof); - inputArchiveTof >> *fvDigiTof; + if (0 < (parts.At(uPartIdx))->GetSize()) { + std::string msgStrTof(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); + std::istringstream issTof(msgStrTof); + boost::archive::binary_iarchive inputArchiveTof(issTof); + inputArchiveTof >> *fvDigiTof; + } ++uPartIdx; /// RICH - std::string msgStrRich(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); - std::istringstream issRich(msgStrRich); - boost::archive::binary_iarchive inputArchiveRich(issRich); - inputArchiveRich >> *fvDigiRich; + if (0 < (parts.At(uPartIdx))->GetSize()) { + std::string msgStrRich(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); + std::istringstream issRich(msgStrRich); + boost::archive::binary_iarchive inputArchiveRich(issRich); + inputArchiveRich >> *fvDigiRich; + } ++uPartIdx; /// PSD - std::string msgStrPsd(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); - std::istringstream issPsd(msgStrPsd); - boost::archive::binary_iarchive inputArchivePsd(issPsd); - inputArchivePsd >> *fvDigiPsd; + if (0 < (parts.At(uPartIdx))->GetSize()) { + std::string msgStrPsd(static_cast<char*>(parts.At(uPartIdx)->GetData()), (parts.At(uPartIdx))->GetSize()); + std::istringstream issPsd(msgStrPsd); + boost::archive::binary_iarchive inputArchivePsd(issPsd); + inputArchivePsd >> *fvDigiPsd; + } ++uPartIdx; /// TS metadata diff --git a/MQ/mcbm/CbmDeviceBuildDigiEvents.h b/MQ/mcbm/CbmDeviceBuildDigiEvents.h index 3dc2afbfbf..cbb7b02e56 100644 --- a/MQ/mcbm/CbmDeviceBuildDigiEvents.h +++ b/MQ/mcbm/CbmDeviceBuildDigiEvents.h @@ -63,6 +63,7 @@ private: std::vector<std::string> fvsDelDet = {}; std::vector<std::string> fvsSetTrigWin = {}; std::vector<std::string> fvsSetTrigMinNb = {}; + std::vector<std::string> fvsSetTrigMaxNb = {}; /// message queues std::string fsChannelNameDataInput = "unpts_0"; std::string fsChannelNameDataOutput = "events"; diff --git a/MQ/mcbm/CbmDeviceUnpack.cxx b/MQ/mcbm/CbmDeviceUnpack.cxx index 50c08718f1..96db68cbca 100644 --- a/MQ/mcbm/CbmDeviceUnpack.cxx +++ b/MQ/mcbm/CbmDeviceUnpack.cxx @@ -11,9 +11,10 @@ #include "CbmDeviceUnpack.h" +#include "CbmBmonUnpackConfig.h" #include "CbmFlesCanvasTools.h" #include "CbmMQDefs.h" -#include "CbmMuchDigi.h" +#include "CbmMuchUnpackConfig.h" #include "CbmPsdUnpackConfig.h" #include "CbmRichUnpackConfig.h" #include "CbmSetup.h" @@ -62,6 +63,14 @@ try { LOG(info) << "Init options for CbmDeviceUnpack."; fsSetupName = fConfig->GetValue<std::string>("Setup"); fuRunId = fConfig->GetValue<uint32_t>("RunId"); + fbUnpBmon = fConfig->GetValue<bool>("UnpBmon"); + fbUnpSts = fConfig->GetValue<bool>("UnpSts"); + fbUnpMuch = fConfig->GetValue<bool>("UnpMuch"); + fbUnpTrd1D = fConfig->GetValue<bool>("UnpTrd1d"); + fbUnpTrd2D = fConfig->GetValue<bool>("UnpTrd2d"); + fbUnpTof = fConfig->GetValue<bool>("UnpTof"); + fbUnpRich = fConfig->GetValue<bool>("UnpRich"); + fbUnpPsd = fConfig->GetValue<bool>("UnpPsd"); fbIgnoreOverlapMs = fConfig->GetValue<bool>("IgnOverMs"); fbOutputFullTimeSorting = fConfig->GetValue<bool>("FullTimeSort"); fvsSetTimeOffs = fConfig->GetValue<std::vector<std::string>>("SetTimeOffs"); @@ -118,11 +127,28 @@ Bool_t CbmDeviceUnpack::InitContainers() // ------------------------------------------------------------------------ /// Initialize the UnpackerConfigs objects and their "user options" + // ---- BMON ---- + std::shared_ptr<CbmBmonUnpackConfig> bmonconfig = nullptr; + if (fbUnpBmon) { + bmonconfig = std::make_shared<CbmBmonUnpackConfig>("", fuRunId); + if (bmonconfig) { + // bmonconfig->SetDebugState(); + bmonconfig->SetDoWriteOutput(); + // bmonconfig->SetDoWriteOptOutA("CbmBmonErrors"); + std::string parfilesbasepathBmon = Form("%s/macro/beamtime/mcbm2022/", srcDir.Data()); + bmonconfig->SetParFilesBasePath(parfilesbasepathBmon); + bmonconfig->SetParFileName("mBmonCriPar.par"); + bmonconfig->SetSystemTimeOffset(-1220); // [ns] value to be updated + /// Enable Monitor plots + // bmonconfig->SetMonitor(GetTofMonitor(outfilename, true)); // FIXME: Unsupported for now + } + } + // ------------- // ---- STS ---- std::shared_ptr<CbmStsUnpackConfig> stsconfig = nullptr; TString stsSetupTag = ""; cbmsetup->GetGeoTag(ECbmModuleId::kSts, stsSetupTag); - if ("" != stsSetupTag) { + if ("" != stsSetupTag && fbUnpSts) { LOG(info) << "From received setup, using STS tag: " << stsSetupTag; stsconfig = std::make_shared<CbmStsUnpackConfig>(std::string(fsSetupName), fuRunId); if (stsconfig) { @@ -130,6 +156,10 @@ Bool_t CbmDeviceUnpack::InitContainers() stsconfig->SetDoWriteOutput(); stsconfig->SetDoWriteOptOutA("StsDigiPulser"); std::string parfilesbasepathSts = Form("%s/macro/beamtime/mcbm2021/", srcDir.Data()); + if (2060 <= fuRunId) { + /// Starting to readout the U3 since 10/03/2022 Carbon run + parfilesbasepathSts = Form("%s/macro/beamtime/mcbm2022/", srcDir.Data()); + } stsconfig->SetParFilesBasePath(parfilesbasepathSts); /// Enable duplicates rejection, Ignores the ADC for duplicates check stsconfig->SetDuplicatesRejection(true, true); @@ -186,11 +216,37 @@ Bool_t CbmDeviceUnpack::InitContainers() } } // if ("" != stsSetupTag) // ------------- + // ---- MUCH ---- + std::shared_ptr<CbmMuchUnpackConfig> muchconfig = nullptr; + TString muchSetupTag = ""; + cbmsetup->GetGeoTag(ECbmModuleId::kMuch, muchSetupTag); + if ("" != muchSetupTag && fbUnpMuch) { + LOG(info) << "From received setup, using MUCH tag: " << muchSetupTag; + + muchconfig = std::make_shared<CbmMuchUnpackConfig>(std::string(fsSetupName), fuRunId); + if (muchconfig) { + // muchconfig->SetDebugState(); + muchconfig->SetDoWriteOutput(); + muchconfig->SetDoWriteOptOutA("MuchDigiPulser"); + std::string parfilesbasepathMuch = Form("%s/macro/beamtime/mcbm2022/", srcDir.Data()); + muchconfig->SetParFilesBasePath(parfilesbasepathMuch); + /// Enable duplicates rejection, Ignores the ADC for duplicates check + muchconfig->SetDuplicatesRejection(true, true); + /// Enable Monitor plots + //muchconfig->SetMonitor(GetMuchMonitor(outfilename, true)); + muchconfig->SetSystemTimeOffset(-2221); // [ns] value to be updated + + // muchconfig->SetMinAdcCut(1, 1); + + // muchconfig->MaskNoisyChannel(3, 56); + } + } + // ------------- // ---- TRD ---- std::shared_ptr<CbmTrdUnpackConfig> trd1Dconfig = nullptr; TString trdsetuptag = ""; cbmsetup->GetGeoTag(ECbmModuleId::kTrd, trdsetuptag); - if ("" != trdsetuptag) { + if ("" != trdsetuptag && fbUnpTrd1D) { LOG(info) << "From received setup, using TRD tag: " << trdsetuptag; // trd1Dconfig = std::make_shared<CbmTrdUnpackConfig>(trdsetuptag.Data(), fuRunId); trd1Dconfig = std::make_shared<CbmTrdUnpackConfig>(trdsetuptag.Data(), 3); @@ -212,16 +268,26 @@ Bool_t CbmDeviceUnpack::InitContainers() // ------------- // ---- TRDFASP2D ---- std::shared_ptr<CbmTrdUnpackFaspConfig> trdfasp2dconfig = nullptr; - if ("" != trdsetuptag) { + if ("" != trdsetuptag && fbUnpTrd2D) { trdfasp2dconfig = std::make_shared<CbmTrdUnpackFaspConfig>(trdsetuptag.Data(), 3); if (trdfasp2dconfig) { // trdfasp2dconfig->SetDebugState(); trdfasp2dconfig->SetDoWriteOutput(); // Activate the line below to write Trd1D digis to a separate "TrdFaspDigi" branch. Can be used to separate between Fasp and Spadic digis - trdfasp2dconfig->SetOutputBranchName("TrdFaspDigi"); + //trdfasp2dconfig->SetOutputBranchName("TrdFaspDigi"); std::string parfilesbasepathTrdfasp2d = Form("%s/parameters/trd", srcDir.Data()); trdfasp2dconfig->SetParFilesBasePath(parfilesbasepathTrdfasp2d); trdfasp2dconfig->SetSystemTimeOffset(-1800); // [ns] value to be updated + uint8_t map[NFASPMOD]; + if (fuRunId <= 1588) { + uint8_t map21[] = {9, 2, 3, 11, 10, 7, 8, 0, 1, 4, 6, 5}; + for (int i(0); i < NFASPMOD; i++) + map[i] = (i < 12 ? map21[i] : i); + } + else + for (int i(0); i < NFASPMOD; i++) + map[i] = i; + trdfasp2dconfig->SetFaspMapping(5, map); } } // if ("" != trdsetuptag) // ------------- @@ -229,7 +295,7 @@ Bool_t CbmDeviceUnpack::InitContainers() std::shared_ptr<CbmTofUnpackConfig> tofconfig = nullptr; TString tofSetupTag = ""; cbmsetup->GetGeoTag(ECbmModuleId::kTof, tofSetupTag); - if ("" != tofSetupTag) { + if ("" != tofSetupTag && fbUnpTof) { LOG(info) << "From received setup, using TOF tag: " << tofSetupTag; tofconfig = std::make_shared<CbmTofUnpackConfig>("", fuRunId); if (tofconfig) { @@ -237,6 +303,10 @@ Bool_t CbmDeviceUnpack::InitContainers() tofconfig->SetDoWriteOutput(); // tofconfig->SetDoWriteOptOutA("CbmTofErrors"); std::string parfilesbasepathTof = Form("%s/macro/beamtime/mcbm2021/", srcDir.Data()); + if (2060 <= fuRunId) { + /// Additional modules added just before the 10/03/2022 Carbon run + parfilesbasepathTof = Form("%s/macro/beamtime/mcbm2022/", srcDir.Data()); + } tofconfig->SetParFilesBasePath(parfilesbasepathTof); tofconfig->SetSystemTimeOffset(-1220); // [ns] value to be updated if (fuRunId <= 1659) { @@ -250,7 +320,7 @@ Bool_t CbmDeviceUnpack::InitContainers() std::shared_ptr<CbmRichUnpackConfig> richconfig = nullptr; TString richSetupTag = ""; cbmsetup->GetGeoTag(ECbmModuleId::kRich, richSetupTag); - if ("" != richSetupTag) { + if ("" != richSetupTag && fbUnpRich) { LOG(info) << "From received setup, using RICH tag: " << richSetupTag; richconfig = std::make_shared<CbmRichUnpackConfig>("", fuRunId); if (richconfig) { @@ -258,11 +328,13 @@ Bool_t CbmDeviceUnpack::InitContainers() /// Switch to new unpacking algo starting from first combined cosmics run in 2022 richconfig->SetUnpackerVersion(CbmRichUnpackerVersion::v03); } + richconfig->DoTotOffsetCorrection(); // correct ToT offset richconfig->SetDebugState(); richconfig->SetDoWriteOutput(); std::string parfilesbasepathRich = Form("%s/macro/beamtime/mcbm2021/", srcDir.Data()); richconfig->SetParFilesBasePath(parfilesbasepathRich); richconfig->SetSystemTimeOffset(256000 - 1200); // [ns] 1 MS and additional correction + if (1904 < fuRunId) richconfig->SetSystemTimeOffset(-1200); if (1588 == fuRunId) richconfig->MaskDiRICH(0x7150); } } // if ("" != richSetupTag) @@ -271,7 +343,7 @@ Bool_t CbmDeviceUnpack::InitContainers() std::shared_ptr<CbmPsdUnpackConfig> psdconfig = nullptr; TString psdSetupTag = ""; cbmsetup->GetGeoTag(ECbmModuleId::kPsd, psdSetupTag); - if ("" != psdSetupTag) { + if ("" != psdSetupTag && fbUnpPsd) { LOG(info) << "From received setup, using PSD tag: " << psdSetupTag; psdconfig = std::make_shared<CbmPsdUnpackConfig>("", fuRunId); if (psdconfig) { @@ -287,9 +359,11 @@ Bool_t CbmDeviceUnpack::InitContainers() /// Enable full time sorting instead of time sorting per FLIM link if (stsconfig) SetUnpackConfig(stsconfig); + if (muchconfig) SetUnpackConfig(muchconfig); if (trd1Dconfig) SetUnpackConfig(trd1Dconfig); if (trdfasp2dconfig) SetUnpackConfig(trdfasp2dconfig); if (tofconfig) SetUnpackConfig(tofconfig); + if (bmonconfig) SetUnpackConfig(bmonconfig); if (richconfig) SetUnpackConfig(richconfig); if (psdconfig) SetUnpackConfig(psdconfig); @@ -309,14 +383,15 @@ Bool_t CbmDeviceUnpack::InitContainers() charPosDel++; int32_t iOffset = std::stoi((*itStrOffs).substr(charPosDel)); - if ("kSTS" == sSelDet && fStsConfig) { // + if ("kT0" == sSelDet && fBmonConfig) { // + fBmonConfig->SetSystemTimeOffset(iOffset); + } // else if( "kT0" == sSelDet ) + else if ("kSTS" == sSelDet && fStsConfig) { // fStsConfig->SetSystemTimeOffset(iOffset); } // if( "kSTS" == sSelDet && fStsConfig) - /* - else if ("kMUCH" == sSelDet) { - fUnpAlgoMuch->SetSystemTimeOffset(iOffset); + else if ("kMUCH" == sSelDet && fMuchConfig) { + fMuchConfig->SetSystemTimeOffset(iOffset); } // else if( "kMUCH" == sSelDet ) -*/ else if ("kTRD" == sSelDet && fTrd1DConfig) { fTrd1DConfig->SetSystemTimeOffset(iOffset); } // else if( "kTRD" == sSelDet && fTrd2DConfig ) @@ -351,16 +426,14 @@ Bool_t CbmDeviceUnpack::InitContainers() fStsConfig->InitAlgo(); // initPerformanceMaps(fkFlesSts, "STS"); } - // --- Tof - if (fTofConfig) { - fTofConfig->InitOutput(); - // RegisterOutputs( ioman, fTofConfig ); /// Framework bound work = kept in this Task - fTofConfig->SetDoIgnoreOverlappMs(fbIgnoreOverlapMs); - fTofConfig->SetAlgo(); - initOK &= InitParameters(fTofConfig->GetParContainerRequest()); /// Framework bound work = kept in this Device - LOG(info) << "TOF call InitAlgo()"; - fTofConfig->InitAlgo(); - // initPerformanceMaps(fkFlesTof, "TOF"); + // --- Much + if (fMuchConfig) { + fMuchConfig->InitOutput(); + // RegisterOutputs(ioman, fMuchConfig); /// Framework bound work = kept in this Task + fMuchConfig->SetAlgo(); + initOK &= InitParameters(fMuchConfig->GetParContainerRequest()); /// Framework bound work = kept in this Device + fMuchConfig->InitAlgo(); + // initPerformanceMaps(fkFlesMuch, "MUCH"); } // --- Trd if (fTrd1DConfig) { @@ -393,6 +466,27 @@ Bool_t CbmDeviceUnpack::InitContainers() // are created, as far as I am aware. // The second option workaround is in in Init() to look for the fasp config and create a separate branch // for fasp created CbmTrdDigis PR 072021 + // --- Tof + if (fTofConfig) { + fTofConfig->InitOutput(); + // RegisterOutputs( ioman, fTofConfig ); /// Framework bound work = kept in this Task + fTofConfig->SetDoIgnoreOverlappMs(fbIgnoreOverlapMs); + fTofConfig->SetAlgo(); + initOK &= InitParameters(fTofConfig->GetParContainerRequest()); /// Framework bound work = kept in this Device + LOG(info) << "TOF call InitAlgo()"; + fTofConfig->InitAlgo(); + // initPerformanceMaps(fkFlesTof, "TOF"); + } + // --- Bmon + if (fBmonConfig) { + fBmonConfig->InitOutput(); + // RegisterOutputs(ioman, fBmonConfig); /// Framework bound work = kept in this Task + fBmonConfig->SetAlgo(); + fBmonConfig->LoadParFileName(); /// Needed to change the Parameter file name before it is used!!! + initOK &= InitParameters(fBmonConfig->GetParContainerRequest()); /// Framework bound work = kept in this Device + fBmonConfig->InitAlgo(); + // initPerformanceMaps(fkFlesBmon, "Bmon"); + } // --- Rich if (fRichConfig) { fRichConfig->InitOutput(); @@ -523,6 +617,19 @@ bool CbmDeviceUnpack::InitHistograms() // Method called by run loop and requesting new data from the TS source whenever bool CbmDeviceUnpack::ConditionalRun() { + /// First do Algo related Initialization steps if needed + if (0 == fulNumMessages) { + try { + InitContainers(); + } + catch (InitTaskError& e) { + LOG(error) << e.what(); + ChangeState(fair::mq::Transition::ErrorFound); + } + } // if( 0 == fulNumMessages) + + if (0 == fulNumMessages) InitHistograms(); + /// First request a new TS (full one) std::string message = "full"; LOG(debug) << "Requesting new TS by sending message: full" << message; @@ -542,19 +649,6 @@ bool CbmDeviceUnpack::ConditionalRun() return false; } // else if (rep->GetSize() == 0) - /// Message received, do Algo related Initialization steps if needed - if (0 == fulNumMessages) { - try { - InitContainers(); - } - catch (InitTaskError& e) { - LOG(error) << e.what(); - ChangeState(fair::mq::Transition::ErrorFound); - } - } // if( 0 == fulNumMessages) - - if (0 == fulNumMessages) InitHistograms(); - fulNumMessages++; LOG(debug) << "Received message number " << fulNumMessages << " with size " << rep->GetSize(); @@ -599,14 +693,18 @@ bool CbmDeviceUnpack::ConditionalRun() fCbmTsEventHeader->Reset(); // Reset the unpackers for a new timeslice, e.g. clear the output vectors + // ---- Bmon ---- + if (fBmonConfig) fBmonConfig->Reset(); // ---- Sts ---- if (fStsConfig) fStsConfig->Reset(); - // ---- Tof ---- - if (fTofConfig) fTofConfig->Reset(); + // ----Much ---- + if (fMuchConfig) fMuchConfig->Reset(); // ---- Trd ---- if (fTrd1DConfig) fTrd1DConfig->Reset(); // ---- Trd2D ---- if (fTrd2DConfig) fTrd2DConfig->Reset(); + // ---- Tof ---- + if (fTofConfig) fTofConfig->Reset(); // ---- Rich ---- if (fRichConfig) fRichConfig->Reset(); // ---- Psd ---- @@ -644,17 +742,21 @@ bool CbmDeviceUnpack::SendUnpData() parts.AddPart(std::move(messTsHeader)); // ---- T0 ---- - std::stringstream ossT0; - boost::archive::binary_oarchive oaT0(ossT0); - // oaT0 << fUnpAlgoTof->GetOptOutAVec(); - oaT0 << (std::vector<CbmTofDigi>()); - std::string* strMsgT0 = new std::string(ossT0.str()); + std::stringstream ossBmon; + boost::archive::binary_oarchive oaBmon(ossBmon); + if (fBmonConfig) { // + oaBmon << *(fBmonConfig->GetOutputVec()); + } + else { + oaBmon << (std::vector<CbmTofDigi>()); + } + std::string* strMsgBmon = new std::string(ossBmon.str()); parts.AddPart(NewMessage( - const_cast<char*>(strMsgT0->c_str()), // data - strMsgT0->length(), // size + const_cast<char*>(strMsgBmon->c_str()), // data + strMsgBmon->length(), // size [](void*, void* object) { delete static_cast<std::string*>(object); }, - strMsgT0)); // object that manages the data + strMsgBmon)); // object that manages the data // ---- Sts ---- std::stringstream ossSts; @@ -662,6 +764,9 @@ bool CbmDeviceUnpack::SendUnpData() if (fStsConfig) { // oaSts << *(fStsConfig->GetOutputVec()); } + else { + oaSts << (std::vector<CbmStsDigi>()); + } std::string* strMsgSts = new std::string(ossSts.str()); parts.AddPart(NewMessage( @@ -673,8 +778,12 @@ bool CbmDeviceUnpack::SendUnpData() // ---- Much ---- std::stringstream ossMuch; boost::archive::binary_oarchive oaMuch(ossMuch); - // oaMuch << fUnpAlgoMuch->GetVector(); - oaMuch << (std::vector<CbmMuchDigi>()); + if (fMuchConfig) { // + oaMuch << *(fMuchConfig->GetOutputVec()); + } + else { + oaMuch << (std::vector<CbmMuchDigi>()); + } std::string* strMsgMuch = new std::string(ossMuch.str()); parts.AddPart(NewMessage( @@ -690,6 +799,9 @@ bool CbmDeviceUnpack::SendUnpData() if (fTrd1DConfig || fTrd2DConfig) { // oaTrd << *(fTrd1DConfig ? fTrd1DConfig->GetOutputVec() : fTrd2DConfig->GetOutputVec()); } + else { + oaTrd << (std::vector<CbmTrdDigi>()); + } std::string* strMsgTrd = new std::string(ossTrd.str()); parts.AddPart(NewMessage( @@ -704,6 +816,9 @@ bool CbmDeviceUnpack::SendUnpData() if (fTofConfig) { // oaTof << *(fTofConfig->GetOutputVec()); } + else { + oaTof << (std::vector<CbmTofDigi>()); + } std::string* strMsgTof = new std::string(ossTof.str()); parts.AddPart(NewMessage( @@ -718,6 +833,9 @@ bool CbmDeviceUnpack::SendUnpData() if (fRichConfig) { // oaRich << *(fRichConfig->GetOutputVec()); } + else { + oaRich << (std::vector<CbmRichDigi>()); + } std::string* strMsgRich = new std::string(ossRich.str()); parts.AddPart(NewMessage( @@ -732,6 +850,9 @@ bool CbmDeviceUnpack::SendUnpData() if (fPsdConfig) { // oaPsd << *(fPsdConfig->GetOutputVec()); } + else { + oaPsd << (std::vector<CbmPsdDigi>()); + } std::string* strMsgPsd = new std::string(ossPsd.str()); parts.AddPart(NewMessage( @@ -839,10 +960,12 @@ bool CbmDeviceUnpack::SendHistograms() CbmDeviceUnpack::~CbmDeviceUnpack() { + if (fBmonConfig) fBmonConfig->GetUnpacker()->Finish(); if (fStsConfig) fStsConfig->GetUnpacker()->Finish(); - if (fTofConfig) fTofConfig->GetUnpacker()->Finish(); + if (fMuchConfig) fMuchConfig->GetUnpacker()->Finish(); if (fTrd1DConfig) fTrd1DConfig->GetUnpacker()->Finish(); if (fTrd2DConfig) fTrd2DConfig->GetUnpacker()->Finish(); + if (fTofConfig) fTofConfig->GetUnpacker()->Finish(); if (fRichConfig) fRichConfig->GetUnpacker()->Finish(); if (fPsdConfig) fPsdConfig->GetUnpacker()->Finish(); } @@ -864,6 +987,13 @@ Bool_t CbmDeviceUnpack::DoUnpack(const fles::Timeslice& ts, size_t /*component*/ auto systemId = static_cast<std::uint16_t>(ts.descriptor(component, 0).sys_id); switch (systemId) { + case fkFlesBmon: { + if (fBmonConfig) { + fCbmTsEventHeader->AddNDigisBmon( + unpack(systemId, &ts, component, fBmonConfig, fBmonConfig->GetOptOutAVec(), fBmonConfig->GetOptOutBVec())); + } + break; + } case fkFlesSts: { if (fStsConfig) { fCbmTsEventHeader->AddNDigisSts( @@ -871,10 +1001,10 @@ Bool_t CbmDeviceUnpack::DoUnpack(const fles::Timeslice& ts, size_t /*component*/ } break; } - case fkFlesTof: { - if (fTofConfig) { - fCbmTsEventHeader->AddNDigisTof( - unpack(systemId, &ts, component, fTofConfig, fTofConfig->GetOptOutAVec(), fTofConfig->GetOptOutBVec())); + case fkFlesMuch: { + if (fMuchConfig) { + fCbmTsEventHeader->AddNDigisMuch( + unpack(systemId, &ts, component, fMuchConfig, fMuchConfig->GetOptOutAVec(), fMuchConfig->GetOptOutBVec())); } break; } @@ -892,6 +1022,13 @@ Bool_t CbmDeviceUnpack::DoUnpack(const fles::Timeslice& ts, size_t /*component*/ } break; } + case fkFlesTof: { + if (fTofConfig) { + fCbmTsEventHeader->AddNDigisTof( + unpack(systemId, &ts, component, fTofConfig, fTofConfig->GetOptOutAVec(), fTofConfig->GetOptOutBVec())); + } + break; + } case fkFlesRich: { if (fRichConfig) { fCbmTsEventHeader->AddNDigisRich( @@ -915,18 +1052,22 @@ Bool_t CbmDeviceUnpack::DoUnpack(const fles::Timeslice& ts, size_t /*component*/ if (fbOutputFullTimeSorting) { /// Time sort the output vectors of all unpackers present + if (fBmonConfig && fBmonConfig->GetOutputVec()) { timesort(fBmonConfig->GetOutputVec()); } if (fStsConfig && fStsConfig->GetOutputVec()) { timesort(fStsConfig->GetOutputVec()); } - if (fTofConfig && fTofConfig->GetOutputVec()) { timesort(fTofConfig->GetOutputVec()); } + if (fMuchConfig && fMuchConfig->GetOutputVec()) { timesort(fMuchConfig->GetOutputVec()); } if (fTrd1DConfig && fTrd1DConfig->GetOutputVec()) { timesort(fTrd1DConfig->GetOutputVec()); } if (fTrd2DConfig && fTrd2DConfig->GetOutputVec()) { timesort(fTrd2DConfig->GetOutputVec()); } + if (fTofConfig && fTofConfig->GetOutputVec()) { timesort(fTofConfig->GetOutputVec()); } if (fRichConfig && fRichConfig->GetOutputVec()) { timesort(fRichConfig->GetOutputVec()); } if (fPsdConfig && fPsdConfig->GetOutputVec()) { timesort(fPsdConfig->GetOutputVec()); } /// Time sort the output vectors of all unpackers present + if (fBmonConfig && fBmonConfig->GetOptOutAVec()) { timesort(fBmonConfig->GetOptOutAVec()); } if (fStsConfig && fStsConfig->GetOptOutAVec()) { timesort(fStsConfig->GetOptOutAVec()); } - if (fTofConfig && fTofConfig->GetOptOutAVec()) { timesort(fTofConfig->GetOptOutAVec()); } + if (fMuchConfig && fMuchConfig->GetOptOutAVec()) { timesort(fMuchConfig->GetOptOutAVec()); } if (fTrd1DConfig && fTrd1DConfig->GetOptOutAVec()) { timesort(fTrd1DConfig->GetOptOutAVec()); } if (fTrd2DConfig && fTrd2DConfig->GetOptOutAVec()) { timesort(fTrd2DConfig->GetOptOutAVec()); } + if (fTofConfig && fTofConfig->GetOptOutAVec()) { timesort(fTofConfig->GetOptOutAVec()); } if (fRichConfig && fRichConfig->GetOptOutAVec()) { timesort(fRichConfig->GetOptOutAVec()); } if (fPsdConfig && fPsdConfig->GetOptOutAVec()) { timesort(fPsdConfig->GetOptOutAVec()); } } diff --git a/MQ/mcbm/CbmDeviceUnpack.h b/MQ/mcbm/CbmDeviceUnpack.h index 3b585a3ef5..2cd1b89810 100644 --- a/MQ/mcbm/CbmDeviceUnpack.h +++ b/MQ/mcbm/CbmDeviceUnpack.h @@ -28,12 +28,14 @@ #include <vector> class TList; -class CbmPsdUnpackConfig; -class CbmRichUnpackConfig; +class CbmBmonUnpackConfig; class CbmStsUnpackConfig; -class CbmTofUnpackConfig; +class CbmMuchUnpackConfig; class CbmTrdUnpackFaspConfig; class CbmTrdUnpackConfig; +class CbmTofUnpackConfig; +class CbmRichUnpackConfig; +class CbmPsdUnpackConfig; class TimesliceMetaData; @@ -49,11 +51,14 @@ protected: bool ConditionalRun(); bool HandleCommand(FairMQMessagePtr&, int); + /** @brief Set the Bmon Unpack Config @param config */ + void SetUnpackConfig(std::shared_ptr<CbmBmonUnpackConfig> config) { fBmonConfig = config; } + /** @brief Set the Sts Unpack Config @param config */ void SetUnpackConfig(std::shared_ptr<CbmStsUnpackConfig> config) { fStsConfig = config; } - // /** @brief Set the Tof Unpack Config @param config */ - void SetUnpackConfig(std::shared_ptr<CbmTofUnpackConfig> config) { fTofConfig = config; } + /** @brief Set the Much Unpack Config @param config */ + void SetUnpackConfig(std::shared_ptr<CbmMuchUnpackConfig> config) { fMuchConfig = config; } /** @brief Set the Trd Unpack Config @param config */ void SetUnpackConfig(std::shared_ptr<CbmTrdUnpackConfig> config) { fTrd1DConfig = config; } @@ -61,6 +66,9 @@ protected: /** @brief Set the Trd2D Unpack Config @param config */ void SetUnpackConfig(std::shared_ptr<CbmTrdUnpackFaspConfig> config) { fTrd2DConfig = config; } + /** @brief Set the Tof Unpack Config @param config */ + void SetUnpackConfig(std::shared_ptr<CbmTofUnpackConfig> config) { fTofConfig = config; } + /** @brief Set the Rich Unpack Config @param config */ void SetUnpackConfig(std::shared_ptr<CbmRichUnpackConfig> config) { fRichConfig = config; } @@ -69,14 +77,7 @@ protected: private: /// Constants - static const uint16_t kusSysIdSts = 0x10; - static const uint16_t kusSysIdMuch = 0x50; - static const uint16_t kusSysIdTrd = 0x40; - static const uint16_t kusSysIdTof = 0x60; - static const uint16_t kusSysIdT0 = 0x90; - static const uint16_t kusSysIdRich = 0x30; - static const uint16_t kusSysIdPsd = 0x80; - + static constexpr std::uint16_t fkFlesBmon = static_cast<std::uint16_t>(fles::SubsystemIdentifier::T0); static constexpr std::uint16_t fkFlesMvd = static_cast<std::uint16_t>(fles::SubsystemIdentifier::MVD); static constexpr std::uint16_t fkFlesSts = static_cast<std::uint16_t>(fles::SubsystemIdentifier::STS); static constexpr std::uint16_t fkFlesMuch = static_cast<std::uint16_t>(fles::SubsystemIdentifier::MUCH); @@ -101,6 +102,15 @@ private: /// User settings parameters std::string fsSetupName = "mcbm_beam_2021_07_surveyed"; uint32_t fuRunId = 1588; + /// ---> for selective unpacking + bool fbUnpBmon = false; + bool fbUnpSts = true; + bool fbUnpMuch = false; + bool fbUnpTrd1D = true; + bool fbUnpTrd2D = true; + bool fbUnpTof = true; + bool fbUnpRich = true; + bool fbUnpPsd = true; /// message queues std::string fsChannelNameDataInput = "ts-request"; std::string fsChannelNameDataOutput = "unpts_0"; @@ -127,12 +137,14 @@ private: std::map<std::uint16_t, std::pair<double, double>> fDataSizeMap = {}; //! /// Configuration of the unpackers. Provides the configured algorithm - std::shared_ptr<CbmStsUnpackConfig> fStsConfig = nullptr; - std::shared_ptr<CbmTrdUnpackFaspConfig> fTrd2DConfig = nullptr; - std::shared_ptr<CbmTrdUnpackConfig> fTrd1DConfig = nullptr; - std::shared_ptr<CbmTofUnpackConfig> fTofConfig = nullptr; - std::shared_ptr<CbmRichUnpackConfig> fRichConfig = nullptr; - std::shared_ptr<CbmPsdUnpackConfig> fPsdConfig = nullptr; + std::shared_ptr<CbmBmonUnpackConfig> fBmonConfig = nullptr; + std::shared_ptr<CbmStsUnpackConfig> fStsConfig = nullptr; + std::shared_ptr<CbmMuchUnpackConfig> fMuchConfig = nullptr; + std::shared_ptr<CbmTrdUnpackFaspConfig> fTrd2DConfig = nullptr; + std::shared_ptr<CbmTrdUnpackConfig> fTrd1DConfig = nullptr; + std::shared_ptr<CbmTofUnpackConfig> fTofConfig = nullptr; + std::shared_ptr<CbmRichUnpackConfig> fRichConfig = nullptr; + std::shared_ptr<CbmPsdUnpackConfig> fPsdConfig = nullptr; /// Pointer to the Timeslice header conatining start time and index CbmTsEventHeader* fCbmTsEventHeader = nullptr; diff --git a/MQ/mcbm/runBuildDigiEvents.cxx b/MQ/mcbm/runBuildDigiEvents.cxx index e0187f23c1..ef0a0c5871 100644 --- a/MQ/mcbm/runBuildDigiEvents.cxx +++ b/MQ/mcbm/runBuildDigiEvents.cxx @@ -32,6 +32,9 @@ void addCustomOptions(bpo::options_description& options) options.add_options()("SetTrigMinNb", bpo::value<std::vector<std::string>>()->multitoken()->composing(), "Set minimum number of digis for selected detector, use string matching " "ECbmModuleId,uMinNb e.g. kTof,10"); + options.add_options()("SetTrigMaxNb", bpo::value<std::vector<std::string>>()->multitoken()->composing(), + "Set maximum number of digis for selected detector, use string matching " + "ECbmModuleId,uMaxNb e.g. kTof,10"); 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"), diff --git a/MQ/mcbm/runUnpack.cxx b/MQ/mcbm/runUnpack.cxx index 5259fd39a4..95332c7479 100644 --- a/MQ/mcbm/runUnpack.cxx +++ b/MQ/mcbm/runUnpack.cxx @@ -17,6 +17,14 @@ void addCustomOptions(bpo::options_description& options) options.add_options()("Setup", bpo::value<std::string>()->default_value("mcbm_beam_2021_07_surveyed"), "Name/tag of the geomatry setup"); options.add_options()("RunId", bpo::value<uint32_t>()->default_value(1588), "Run ID"); + options.add_options()("UnpBmon", bpo::value<bool>()->default_value(false), "Enable Bmon unpacking if true"); + options.add_options()("UnpSts", bpo::value<bool>()->default_value(true), "Enable STS unpacking if true"); + options.add_options()("UnpMuch", bpo::value<bool>()->default_value(false), "Enable MUCH unpacking if true"); + options.add_options()("UnpTrd1d", bpo::value<bool>()->default_value(true), "Enable TRD 1D unpacking if true"); + options.add_options()("UnpTrd2d", bpo::value<bool>()->default_value(true), "Enable TRD 2D unpacking if true"); + options.add_options()("UnpTof", bpo::value<bool>()->default_value(true), "Enable TOF unpacking if true"); + options.add_options()("UnpRich", bpo::value<bool>()->default_value(true), "Enable RICH unpacking if true"); + options.add_options()("UnpPsd", bpo::value<bool>()->default_value(true), "Enable PSD unpacking if true"); options.add_options()("IgnOverMs", bpo::value<bool>()->default_value(true), "Ignore overlap MS if true"); options.add_options()("FullTimeSort", bpo::value<bool>()->default_value(true), "Full time sorting per detector before sending output array"); diff --git a/MQ/mcbm/startBuildRawEvents2022.sh.in b/MQ/mcbm/startBuildRawEvents2022.sh.in new file mode 100755 index 0000000000..33542299a4 --- /dev/null +++ b/MQ/mcbm/startBuildRawEvents2022.sh.in @@ -0,0 +1,308 @@ +#!/bin/bash + +if [ -e @SIMPATH@/bin/fairmq-shmmonitor ]; then + @SIMPATH@/bin/fairmq-shmmonitor --cleanup +fi + +if [ $# -ge 1 ]; then + _nbmoni=$1 + ((_pubfreqts = $_nbmoni*100 )) + _pubminsec=1.0 + _pubmaxsec=10.0 + + if [ $# -ge 4 ]; then + _filename="" + _dirname="" + _hostname=$4 + + if [ $# -ge 5 ]; then + _pubfreqts=$5 + + if [ $# -ge 6 ]; then + _pubminsec=$6 + + if [ $# -ge 7 ]; then + _pubmaxsec=$7 + fi + fi + fi + elif [ $# -ge 2 ]; then + _filename=$2 + _hostname="" + if [ $# -eq 3 ]; then + _dirname=$3 + else + _dirname="" + fi + else + echo 'Starting connection to local stream' + echo ' for other usages, please supply at least a filename.' + echo 'Possible usages are:' + echo 'startBuildRawEvents2022.sh' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> <full filename pattern list>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> <filename pattern> <folder_path>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS> <Min Hist pub. in s>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS> <Min Hist pub. in s> <Max Hist pub. in s>' + _filename="" + _dirname="" + _hostname="localhost" + fi +else + echo 'Starting connection to local stream with 1 monitor process' + echo ' for other usages, please supply at least a filename.' + echo 'Possible usages are:' + echo 'startBuildRawEvents2022.sh' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> <full filename pattern list>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> <filename pattern> <folder_path>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS> <Min Hist pub. in s>' + echo 'startBuildRawEvents2022.sh <Nb Unp & Moni processes> "" "" <hostname(s) list> <Hist publish freq. in TS> <Min Hist pub. in s> <Max Hist pub. in s>' + _filename="" + _dirname="" + _hostname="localhost" + _nbmoni=1 + _pubfreqts=100 + _pubminsec=1.0 + _pubmaxsec=10.0 +fi + +_parfileSts=@VMCWORKDIR@/macro/beamtime/mcbm2022/mStsPar.par +_parfileMuch=@VMCWORKDIR@/macro/beamtime/mcbm2022/mMuchPar.par +_parfileTrdAsic=@VMCWORKDIR@/parameters/trd/trd_v22d_mcbm.asic.par +_parfileTrdDigi=@VMCWORKDIR@/parameters/trd/trd_v22d_mcbm.digi.par +_parfileTrdGas=@VMCWORKDIR@/parameters/trd/trd_v22d_mcbm.gas.par +_parfileTrdGain=@VMCWORKDIR@/parameters/trd/trd_v22d_mcbm.gain.par +_parfileTof=@VMCWORKDIR@/macro/beamtime/mcbm2022/mTofCriPar.par +_parfileBmon=@VMCWORKDIR@/macro/beamtime/mcbm2022/mBmonCriPar.par +_parfileRich=@VMCWORKDIR@/macro/beamtime/mcbm2021/mRichPar_70.par +_parfilePsd=@VMCWORKDIR@/macro/beamtime/mcbm2021/mPsdPar.par +_setup_name=mcbm_beam_2022_03_22_iron +_run_id=2158 + +_ratelog=0 # hides ZMQ messages rates and bandwidth +#_ratelog=1 # display ZMQ messages rates and bandwidth + +LOGFILETAG=`hostname` +LOGFILETAG+="_" +LOGFILETAG+=`date +%Y_%m_%d_%H_%M_%S` +LOGFILETAG+=".log" + +LIST_OF_PIDS="" + +(( _paraBuffSz=100 )) +(( _singBuffSz=_paraBuffSz*_nbmoni )) + +echo "Buffer size for parallel devices $_paraBuffSz" +echo "Buffer size for singleton devices $_singBuffSz" + + +SAMPLER="RepReqTsSampler" +SAMPLER+=" --control static" +SAMPLER+=" --id sampler1" +#SAMPLER+=" --max-timeslices 0" +#SAMPLER+=" --max-timeslices 10" +#SAMPLER+=" --max-timeslices 100" +#SAMPLER+=" --max-timeslices 300" +#SAMPLER+=" --max-timeslices 1000" +#SAMPLER+=" --severity info" +#SAMPLER+=" --flib-port 10" +if [ "$_hostname" != "" ]; then + SAMPLER+=" --fles-host $_hostname" +elif [ "$_filename" != "" ]; then + SAMPLER+=" --filename $_filename" + if [ "$_dirname" != "" ]; then + SAMPLER+=" --dirname $_dirname" + fi +fi +SAMPLER+=" --high-water-mark 10" +SAMPLER+=" --no-split-ts 1" +SAMPLER+=" --ChNameMissTs missedts" +SAMPLER+=" --ChNameCmds commands" +SAMPLER+=" --PubFreqTs $_pubfreqts" +SAMPLER+=" --PubTimeMin $_pubminsec" +SAMPLER+=" --PubTimeMax $_pubmaxsec" +SAMPLER+=" --channel-config name=ts-request,type=rep,method=bind,transport=zeromq,address=tcp://127.0.0.1:11555,rateLogging=$_ratelog" +SAMPLER+=" --channel-config name=histogram-in,type=pub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog" +SAMPLER+=" --channel-config name=missedts,type=pub,method=bind,address=tcp://127.0.0.1:11006,rateLogging=$_ratelog" +SAMPLER+=" --channel-config name=commands,type=pub,method=bind,address=tcp://127.0.0.1:11007,rateLogging=$_ratelog" +SAMPLER+=" --transport zeromq" +# Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX +# with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log +SAMPLER_LOG="sampler1_$LOGFILETAG" +# xterm -l -lf $SAMPLER_LOG -geometry 80x23+0+0 -hold -e @CMAKE_BINARY_DIR@/bin/MQ/source/$SAMPLER & +nohup @CMAKE_BINARY_DIR@/bin/MQ/source/$SAMPLER &> $SAMPLER_LOG & + +echo $SAMPLER + +LIST_OF_PIDS+=$! +LIST_OF_PIDS+=" " + +PARAMETERSERVER="parmq-server" +PARAMETERSERVER+=" --control static" +PARAMETERSERVER+=" --id parmq-server" +PARAMETERSERVER+=" --severity info" +PARAMETERSERVER+=" --channel-name parameters" +PARAMETERSERVER+=" --channel-config name=parameters,type=rep,method=bind,transport=zeromq,address=tcp://127.0.0.1:11005,rateLogging=0" +PARAMETERSERVER+=" --first-input-name $_parfileSts;$_parfileMuch;$_parfileTrdAsic;$_parfileTrdDigi;$_parfileTrdGas;$_parfileTrdGain;$_parfileTof;$_parfileBmon;$_parfileRich;$_parfilePsd" +PARAMETERSERVER+=" --first-input-type ASCII" +#PARAMETERSERVER+=" --libs-to-load=CbmStsBase;CbmMuchBase;CbmTrdBase;CbmTofBase;CbmRichBase" # doesn't work due to runtime problem +PARAMETERSERVER+=" --setup $_setup_name" +# Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX +# with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log +PARAMSRV_LOG="parmq_$LOGFILETAG" +# xterm -l -lf $PARAMSRV_LOG -geometry 80x23+1600+0 -hold -e @CMAKE_BINARY_DIR@/bin/MQ/parmq/$PARAMETERSERVER & +nohup @CMAKE_BINARY_DIR@/bin/MQ/parmq/$PARAMETERSERVER &> $PARAMSRV_LOG & + +LIST_OF_PIDS+=$! +LIST_OF_PIDS+=" " + +HISTSERVER="MqHistoServer" +HISTSERVER+=" --control static" +HISTSERVER+=" --id server1" +HISTSERVER+=" --severity info" +HISTSERVER+=" --histport 8081" +HISTSERVER+=" --channel-config name=histogram-in,type=sub,method=bind,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog" +HISTSERVER+=" --channel-config name=histo-conf,type=sub,method=bind,transport=zeromq,address=tcp://127.0.0.1:11667,rateLogging=0" +HISTSERVER+=" --channel-config name=canvas-conf,type=sub,method=bind,transport=zeromq,address=tcp://127.0.0.1:11668,rateLogging=0" +# Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX +# with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log +HISTSRV_LOG="server1_$LOGFILETAG" +# xterm -l -lf $HISTSRV_LOG -geometry 80x23+2000+0 -hold -e @CMAKE_BINARY_DIR@/bin/MQ/histogramServer/$HISTSERVER & +nohup @CMAKE_BINARY_DIR@/bin/MQ/histogramServer/$HISTSERVER &> $HISTSRV_LOG & + +LIST_OF_PIDS+=$! +LIST_OF_PIDS+=" " + +sleep 1 + +_iMoni=0 +while (( _iMoni < _nbmoni )); do + (( _yOffset=200*_iMoni )) + (( _iMoni += 1 )) + (( _iPort = 11680 + _iMoni )) + + UNPACKER="MqUnpack" + UNPACKER+=" --control static" + UNPACKER+=" --id unp$_iMoni" + #UNPACKER+=" --severity error" + UNPACKER+=" --severity info" + #UNPACKER+=" --severity debug" + UNPACKER+=" --Setup $_setup_name" + UNPACKER+=" --RunId $_run_id" + UNPACKER+=" --IgnOverMs 1" + UNPACKER+=" --UnpBmon true" + UNPACKER+=" --UnpMuch true" + UNPACKER+=" --UnpPsd false" + UNPACKER+=" --SetTimeOffs kT0,-40" + UNPACKER+=" --SetTimeOffs kSTS,-1025" + UNPACKER+=" --SetTimeOffs kMUCH,-1020" + UNPACKER+=" --SetTimeOffs kTRD,1190" + UNPACKER+=" --SetTimeOffs kTRD2D,-540" + UNPACKER+=" --SetTimeOffs kTOF,0" + UNPACKER+=" --SetTimeOffs kRICH,50" + UNPACKER+=" --PubFreqTs $_pubfreqts" + UNPACKER+=" --PubTimeMin $_pubminsec" + UNPACKER+=" --PubTimeMax $_pubmaxsec" + UNPACKER+=" --TsNameOut unpts$_iMoni" + UNPACKER+=" --channel-config name=ts-request,type=req,method=connect,transport=zeromq,address=tcp://127.0.0.1:11555,rateLogging=$_ratelog" + UNPACKER+=" --channel-config name=parameters,type=req,method=connect,transport=zeromq,address=tcp://127.0.0.1:11005,rateLogging=0" + UNPACKER+=" --channel-config name=unpts$_iMoni,type=push,method=bind,transport=zeromq,sndBufSize=2,address=tcp://127.0.0.1:$_iPort,rateLogging=$_ratelog" +# UNPACKER+=" --channel-config name=commands,type=sub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11007" + UNPACKER+=" --channel-config name=histogram-in,type=pub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog" + UNPACKER+=" --transport zeromq" + # Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX + # with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log + UNPACKER_LOG="unp$_iMoni" + UNPACKER_LOG+="_$LOGFILETAG" + # xterm -l -lf $UNPACKER_LOG -geometry 132x23+400+$_yOffset -hold -e @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$UNPACKER & + nohup @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$UNPACKER &> $UNPACKER_LOG & + + LIST_OF_PIDS+=$! + LIST_OF_PIDS+=" " + + EVTBUILDER="BuildDigiEvents" + EVTBUILDER+=" --control static" + EVTBUILDER+=" --id build$_iMoni" + EVTBUILDER+=" --severity info" + #EVTBUILDER+=" --severity debug" + EVTBUILDER+=" --PubFreqTs $_pubfreqts" + EVTBUILDER+=" --PubTimeMin $_pubminsec" + EVTBUILDER+=" --PubTimeMax $_pubmaxsec" + EVTBUILDER+=" --FillHistos true" +# EVTBUILDER+=" --FillHistos false" + EVTBUILDER+=" --IgnTsOver false" + EVTBUILDER+=" --EvtOverMode AllowOverlap" + EVTBUILDER+=" --RefDet kTof" + EVTBUILDER+=" --AddDet kT0" + EVTBUILDER+=" --AddDet kMuch" + EVTBUILDER+=" --DelDet kPsd" + EVTBUILDER+=" --SetTrigWin kT0,-100,100" + EVTBUILDER+=" --SetTrigWin kSts,-60,60" + EVTBUILDER+=" --SetTrigWin kMuch,-400,400" + EVTBUILDER+=" --SetTrigWin kTrd,-300,300" + EVTBUILDER+=" --SetTrigWin kTrd2D,-300,300" + EVTBUILDER+=" --SetTrigWin kTof,-100,100" + EVTBUILDER+=" --SetTrigWin kRich,0,80" + EVTBUILDER+=" --SetTrigMinNb kT0,0" + EVTBUILDER+=" --SetTrigMinNb kSts,0" + EVTBUILDER+=" --SetTrigMinNb kMuch,0" + EVTBUILDER+=" --SetTrigMinNb kTrd,0" + EVTBUILDER+=" --SetTrigMinNb kTrd2D,0" + EVTBUILDER+=" --SetTrigMinNb kTof,8" # Beam +# EVTBUILDER+=" --SetTrigMinNb kTof,40" #Pulser + EVTBUILDER+=" --SetTrigMinNb kRich,0" + EVTBUILDER+=" --TsNameIn unpts$_iMoni" + EVTBUILDER+=" --EvtNameOut events" + EVTBUILDER+=" --channel-config name=unpts$_iMoni,type=pull,method=connect,transport=zeromq,rcvBufSize=2,address=tcp://127.0.0.1:$_iPort,rateLogging=$_ratelog" + EVTBUILDER+=" --channel-config name=events,type=push,method=connect,transport=zeromq,sndBufSize=2,address=tcp://127.0.0.1:11556,rateLogging=$_ratelog" +# EVTBUILDER+=" --channel-config name=commands,type=sub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11007" + EVTBUILDER+=" --channel-config name=parameters,type=req,method=connect,transport=zeromq,address=tcp://127.0.0.1:11005,rateLogging=0" + EVTBUILDER+=" --channel-config name=histogram-in,type=pub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog" + EVTBUILDER+=" --transport zeromq" + # Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX + # with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log + EVTBUILDER_LOG="build$_iMoni" + EVTBUILDER_LOG+="_$LOGFILETAG" + # xterm -l -lf $EVTBUILDER_LOG -geometry 80x23+800+$_yOffset -hold -e @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTBUILDER & + nohup @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTBUILDER &> $EVTBUILDER_LOG & + VALGRIND_EVT="valgrind -v --error-limit=no --suppressions=$ROOTSYS/etc/root/valgrind-root.supp --leak-check=full --show-reachable=yes --log-file=valgrind_evt_log.txt" + VALGHEAP_EVT="valgrind --tool=massif --massif-out-file=valgrind_evt_massif.out" +# nohup $VALGRIND_EVT @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTBUILDER &> $EVTBUILDER_LOG & +# nohup $VALGHEAP_EVT @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTBUILDER &> $EVTBUILDER_LOG & + + LIST_OF_PIDS+=$! + LIST_OF_PIDS+=" " +done + +EVTSINK="DigiEventSink" +EVTSINK+=" --control static" +EVTSINK+=" --id evtsink1" +EVTSINK+=" --severity info" +#EVTSINK+=" --severity debug" +#EVTSINK+=" --StoreFullTs 1" +EVTSINK+=" --OutFileName mcbm_digis_events.root" +EVTSINK+=" --FillHistos true" +EVTSINK+=" --PubFreqTs $_pubfreqts" +EVTSINK+=" --PubTimeMin $_pubminsec" +EVTSINK+=" --PubTimeMax $_pubmaxsec" +EVTSINK+=" --EvtNameIn events" +EVTSINK+=" --channel-config name=events,type=pull,method=bind,transport=zeromq,rcvBufSize=$_nbmoni,address=tcp://127.0.0.1:11556,rateLogging=$_ratelog" +EVTSINK+=" --channel-config name=missedts,type=sub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11006,rateLogging=$_ratelog" +EVTSINK+=" --channel-config name=commands,type=sub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11007,rateLogging=$_ratelog" +EVTSINK+=" --channel-config name=histogram-in,type=pub,method=connect,transport=zeromq,address=tcp://127.0.0.1:11666,rateLogging=$_ratelog" +# Replaces log filename Xterm.log.hostname.yyyy.mm.dd.hh.mm.ss.XXXXXX +# with ProcessName_hostname_yyyy_mm_dd_hh_mm_ss.log +EVTSINK_LOG="evtsink1_$LOGFILETAG" +# xterm -l -lf $EVTSINK_LOG -geometry 80x23+1200+0 -hold -e @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTSINK & +nohup @CMAKE_BINARY_DIR@/bin/MQ/mcbm/$EVTSINK &> $EVTSINK_LOG & + +LIST_OF_PIDS+=$! +LIST_OF_PIDS+=" " + +PID_LOG="pids_$LOGFILETAG" +echo $LIST_OF_PIDS &> $PID_LOG diff --git a/MQ/parmq/ParameterMQServer.cxx b/MQ/parmq/ParameterMQServer.cxx index 58275549db..8703861ca1 100644 --- a/MQ/parmq/ParameterMQServer.cxx +++ b/MQ/parmq/ParameterMQServer.cxx @@ -70,6 +70,8 @@ void ParameterMQServer::InitTask() fChannelName = fConfig->GetValue<string>("channel-name"); fsSetupName = fConfig->GetValue<std::string>("setup"); + LOG(info) << "Using setup: " << fsSetupName; + if (fRtdb != 0) { // Set first input -- GitLab