diff --git a/macro/beamtime/mcbm2022/mcbm_event.C b/macro/beamtime/mcbm2022/mcbm_event.C new file mode 100644 index 0000000000000000000000000000000000000000..1d2b281e157cd19550fd9a25e85e3f74aa3e80b4 --- /dev/null +++ b/macro/beamtime/mcbm2022/mcbm_event.C @@ -0,0 +1,504 @@ +/* Copyright (C) 2022 Facility for Antiproton and Ion Research in Europe, Darmstadt + SPDX-License-Identifier: GPL-3.0-only + Authors: Pierre-Alain Loizeau [committer], Adrian Weber */ + + +// --- Includes needed for IDE +#include <RtypesCore.h> + +#include <cstdint> +#include <memory> +#include <string> +#include <vector> + +#include <math.h> +#include <stdio.h> +#if !defined(__CLING__) +#include "CbmTrdRawMessageSpadic.h" +#include "CbmTrdSpadic.h" + +#include <FairLogger.h> +#include <FairRootFileSink.h> +#include <FairRunOnline.h> +#include <Logger.h> + +#include <TStopwatch.h> +#include <TSystem.h> +#endif + +/// FIXME: Disable clang formatting to keep easy parameters overview +/* clang-format off */ +Bool_t mcbm_event(std::string infile, + UInt_t uRunId, + uint32_t uTriggerSet = 3, + std::int32_t nTimeslices = -1, + std::string sOutDir = "data/") +{ + /// FIXME: Re-enable clang formatting after parameters initial values setting + /* clang-format on */ + + std::vector<std::string> vInFile = {infile}; + + // --- Logger settings ---------------------------------------------------- + TString logLevel = "INFO"; + TString logVerbosity = "LOW"; + // ------------------------------------------------------------------------ + + // ----- Environment -------------------------------------------------- + TString myName = "mcbm_event"; // this macro's name for screen output + TString srcDir = gSystem->Getenv("VMCWORKDIR"); // top source directory + // ------------------------------------------------------------------------ + + + // ----- EventBuilder Settings---------------- + /// FIXME: Disable clang formatting to keep easy parameters overview + /* clang-format off */ + UInt_t eb_TriggerMinNumberBmon { 0 }; + UInt_t eb_TriggerMinNumberSts { 0 }; + UInt_t eb_TriggerMinNumberMuch { 0 }; + UInt_t eb_TriggerMinNumberTrd1d { 0 }; + UInt_t eb_TriggerMinNumberTrd2d { 0 }; + UInt_t eb_TriggerMinNumberTof { 4 }; + UInt_t eb_TriggerMinNumberRich { 0 }; + + Int_t eb_TriggerMaxNumberBMon { -1 }; + Int_t eb_TriggerMaxNumberSts { -1 }; + Int_t eb_TriggerMaxNumberMuch { -1 }; + Int_t eb_TriggerMaxNumberTrd1d { -1 }; + Int_t eb_TriggerMaxNumberTrd2d { -1 }; + Int_t eb_TriggerMaxNumberTof { -1 }; + Int_t eb_TriggerMaxNumberRich { -1 }; + + UInt_t eb_TriggerMinLayersNumberTof { 0 }; + UInt_t eb_TriggerMinLayersNumberSts { 0 }; + + Double_t eb_TrigWinMinBMon { -20}; + Double_t eb_TrigWinMaxBMon { 20}; + Double_t eb_TrigWinMinSts { -40}; + Double_t eb_TrigWinMaxSts { 40}; + Double_t eb_TrigWinMinMuch { -50}; + Double_t eb_TrigWinMaxMuch { 500}; + Double_t eb_TrigWinMinTrd1d { -50}; + Double_t eb_TrigWinMaxTrd1d { 400}; + Double_t eb_TrigWinMinTrd2d { -60}; + Double_t eb_TrigWinMaxTrd2d { 350}; + Double_t eb_TrigWinMinTof { -10}; + Double_t eb_TrigWinMaxTof { 70}; + Double_t eb_TrigWinMinRich { -10}; + Double_t eb_TrigWinMaxRich { 40}; + + + bool bTrigSet = true; + switch (uTriggerSet) { + case 0: { + // default, any Tof hit + eb_TriggerMaxNumberBMon = 1000; + + eb_TriggerMinNumberTof = 1; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -80; + eb_TrigWinMaxTof = 120; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 1: { + // default, Tof - T0 concidences (pulser) + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 1000; + + eb_TriggerMinNumberTof = 2; + eb_TriggerMinLayersNumberTof = 1; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -180; + eb_TrigWinMaxTof = 220; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 2: { + // Tof standalone track trigger (cosmic) + eb_TriggerMaxNumberBMon = 1000; + + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -30; + eb_TrigWinMaxTof = 70; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 3: { + // # Tof track trigger with T0 + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 2; + + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -20; + eb_TrigWinMaxTof = 60; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 4: { + // mCbm track trigger Tof, T0 & STS + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 2; + + eb_TriggerMinNumberSts = 2; + eb_TriggerMinLayersNumberSts = 1; + + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -20; + eb_TrigWinMaxTof = 60; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 5: { + // mCbm lambda trigger + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 2; + + eb_TriggerMinNumberSts = 8; + eb_TriggerMinLayersNumberSts = 2; + + eb_TriggerMinNumberTof = 16; + eb_TriggerMinLayersNumberTof = 8; // # PAL 07/04/2022: Not sure here if it should be 4 or 8 (2 tracks in same det. stack excluded?) + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -20; + eb_TrigWinMaxTof = 60; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 6: { + // One hit per detector system w/ big acceptance = mCbm full track trigger + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 1; + + eb_TriggerMinNumberSts = 4; + eb_TriggerMinLayersNumberSts = 0; + + eb_TriggerMinNumberMuch = 2; + + eb_TriggerMinNumberTrd1d = 2; + + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -20; + eb_TrigWinMaxTof = 60; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 7: { + /// PAL default: T0 + STS + TOF, only digi cut + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 2; + eb_TriggerMinNumberTof = 4; + break; + } + case 8: { + // default, Tof - T0 concidences (pulser) + eb_TriggerMinNumberBmon = 4; + eb_TriggerMinNumberTof = 2; + eb_TriggerMinLayersNumberTof = 1; + break; + } + case 9: { + // Tof standalone track trigger (cosmic) + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + break; + } + case 10: { + // # Tof track trigger with T0 + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + break; + } + case 11: { + // mCbm track trigger Tof, T0 & STS + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 2; + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + break; + } + case 12: { + // mCbm lambda trigger + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 8; + eb_TriggerMinNumberTof = 16; + eb_TriggerMinLayersNumberTof = 8; // # PAL 07/04/2022: Not sure here if it should be 4 or 8 (2 tracks in same det. stack excluded?) + break; + } + case 13: { + // One hit per detector system w/ big acceptance = mCbm full track trigger + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 4; + eb_TriggerMinNumberTrd1d = 2; + eb_TriggerMinNumberTrd1d = 1; + eb_TriggerMinNumberTof = 8; + eb_TriggerMinNumberRich = 1; + break; + } + case 14: { + /// PAL mCbm track trigger Tof, T0 & STS + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 4; + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + eb_TriggerMinLayersNumberSts = 2; + break; + } + default: { + bTrigSet = false; + break; + } + } + /// FIXME: Re-enable clang formatting after parameters initial values setting + /* clang-format on */ + // ------------------------------------------------------------------------ + + + // ----- Output filename ---------------------------------------------- + std::string filename = Form("%d%s.event.root", uRunId, (bTrigSet ? Form("_%u", uTriggerSet) : "")); + std::string outfilename = sOutDir + "/" + filename; + std::cout << "-I- " << myName << ": Output file will be " << outfilename << std::endl; + std::string histosfilename = sOutDir + "/" + filename; + histosfilename.replace(histosfilename.find(".event.root"), 11, ".hist.root"); + std::cout << "-I- " << myName << ": Histos file will be " << histosfilename << std::endl; + // ------------------------------------------------------------------------ + + // --------------------event builder--------------------------------------- + CbmTaskBuildRawEvents* evBuildRaw = new CbmTaskBuildRawEvents(); + + //Choose between NoOverlap, MergeOverlap, AllowOverlap + evBuildRaw->SetEventOverlapMode(EOverlapModeRaw::AllowOverlap); + + // Set TOF as reference detector + evBuildRaw->SetReferenceDetector(kRawEventBuilderDetTof); + evBuildRaw->AddDetector(kRawEventBuilderDetT0); + + // Set T0 as reference detector + evBuildRaw->SetReferenceDetector(kRawEventBuilderDetT0); + evBuildRaw->AddDetector(kRawEventBuilderDetTof); + + // Remove detectors not there in 2022 + evBuildRaw->RemoveDetector(kRawEventBuilderDetSts); + evBuildRaw->RemoveDetector(kRawEventBuilderDetMuch); + evBuildRaw->RemoveDetector(kRawEventBuilderDetTrd); + evBuildRaw->RemoveDetector(kRawEventBuilderDetTrd2D); + evBuildRaw->RemoveDetector(kRawEventBuilderDetRich); + evBuildRaw->RemoveDetector(kRawEventBuilderDetPsd); + + // Add all 2022 detectors in the right order + evBuildRaw->AddDetector(kRawEventBuilderDetSts); + // evBuildRaw->AddDetector(kRawEventBuilderDetMuch); + evBuildRaw->AddDetector(kRawEventBuilderDetTrd); + evBuildRaw->AddDetector(kRawEventBuilderDetTrd2D); + evBuildRaw->AddDetector(kRawEventBuilderDetRich); + + // void SetTsParameters(double TsStartTime, double TsLength, double TsOverLength): + // => TsStartTime=0, TsLength=256ms in 2021, TsOverLength=TS overlap, not used in mCBM2021 + //evBuildRaw->SetTsParameters(0.0, 2.56e8, 0.0);, 0.0); + + // void SetTsParameters(double TsStartTime, double TsLength, double TsOverLength): + // => TsStartTime=0, TsLength=102.4ms in 2022, TsOverLength=TS overlap not used in mCBM2022? + evBuildRaw->SetTsParameters(0.0, 1.28e8, 1.12928e8); + + /// FIXME: Disable clang formatting to keep easy parameters overview + /* clang-format off */ + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kT0, eb_TriggerMinNumberBmon); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kT0, eb_TriggerMaxNumberBMon); + + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kSts, eb_TriggerMinNumberSts); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kSts, eb_TriggerMaxNumberSts); + evBuildRaw->SetTriggerMinLayersNumber(ECbmModuleId::kSts, eb_TriggerMinLayersNumberSts); +/* + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kMuch, eb_TriggerMinNumberMuch); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kMuch, eb_TriggerMaxNumberMuch); +*/ + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kTrd, eb_TriggerMinNumberTrd1d); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kTrd, eb_TriggerMaxNumberTrd1d); + + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kTrd2d, eb_TriggerMinNumberTrd2d); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kTrd2d, eb_TriggerMaxNumberTrd2d); + + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kTof, eb_TriggerMinNumberTof); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kTof, eb_TriggerMaxNumberTof); + evBuildRaw->SetTriggerMinLayersNumber(ECbmModuleId::kTof, eb_TriggerMinLayersNumberTof); + + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kRich, eb_TriggerMinNumberRich); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kRich, eb_TriggerMaxNumberRich); + + + evBuildRaw->SetTriggerWindow(ECbmModuleId::kT0, eb_TrigWinMinBMon, eb_TrigWinMaxBMon); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kSts, eb_TrigWinMinSts, eb_TrigWinMaxSts); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kMuch, eb_TrigWinMinMuch, eb_TrigWinMaxMuch); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kTrd, eb_TrigWinMinTrd1d, eb_TrigWinMaxTrd1d); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kTrd2d, eb_TrigWinMinTrd2d, eb_TrigWinMaxTrd2d); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kTof, eb_TrigWinMinTof, eb_TrigWinMaxTof); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kRich, eb_TrigWinMinRich, eb_TrigWinMaxRich); + + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kT0, + (0 < eb_TriggerMaxNumberBMon ? eb_TriggerMaxNumberBMon : 50)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kSts, + (0 < eb_TriggerMaxNumberSts ? eb_TriggerMaxNumberSts : 2000)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kMuch, + (0 < eb_TriggerMaxNumberMuch ? eb_TriggerMaxNumberMuch : 1000)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kTrd, + (0 < eb_TriggerMaxNumberTrd1d ? eb_TriggerMaxNumberTrd1d : 1500)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kTrd2d, + (0 < eb_TriggerMaxNumberTrd2d ? eb_TriggerMaxNumberTrd2d : 500)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kTof, + (0 < eb_TriggerMaxNumberTof ? eb_TriggerMaxNumberTof : 500)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kRich, + (0 < eb_TriggerMaxNumberRich ? eb_TriggerMaxNumberRich : 600)); + + /// FIXME: Re-enable clang formatting after parameters initial values setting + /* clang-format on */ + + // Use standard MUCH digis + evBuildRaw->ChangeMuchBeamtimeDigiFlag(); + + evBuildRaw->SetOutFilename(histosfilename); + // evBuildRaw->SetOutputBranchPersistent("CbmEvent", kFALSE); + evBuildRaw->SetWriteHistosToFairSink(kFALSE); + // ------------------------------------------------------------------------ + + // In general, the following parts need not be touched + // ======================================================================== + + // ----- Timer -------------------------------------------------------- + TStopwatch timer; + timer.Start(); + // ------------------------------------------------------------------------ + + + // ----- FairRunAna --------------------------------------------------- + auto run = new FairRunAna(); + auto inputSource = new FairFileSource(infile); + run->SetSource(inputSource); + auto sink = new FairRootFileSink(outfilename.data()); + run->SetSink(sink); + run->SetRunId(uRunId); + + run->AddTask(evBuildRaw); + // ------------------------------------------------------------------------ + + + // ----- Logger settings ---------------------------------------------- + FairLogger::GetLogger()->SetLogScreenLevel(logLevel.Data()); + FairLogger::GetLogger()->SetLogVerbosityLevel(logVerbosity.Data()); + // ------------------------------------------------------------------------ + + + // ----- Run initialisation ------------------------------------------- + std::cout << std::endl; + std::cout << "-I- " << myName << ": Initialise run" << std::endl; + run->Init(); + // ------------------------------------------------------------------------ + + + // ----- Start run ---------------------------------------------------- + std::cout << std::endl << std::endl; + if (nTimeslices < 0) { + std::cout << "-I- " << myName << ": Starting run over all timeslices in input" << std::endl; + run->Run(0, -1); + } + else { + std::cout << "-I- " << myName << ": Starting run over " << nTimeslices + << " timeslices (or less if not enough in input)" << std::endl; + run->Run(0, nTimeslices); + } + // ------------------------------------------------------------------------ + + + // ----- Finish ------------------------------------------------------- + timer.Stop(); + std::cout << "Macro finished successfully." << std::endl; + std::cout << "After CpuTime = " << timer.CpuTime() << " s RealTime = " << timer.RealTime() << " s." << std::endl; + // ------------------------------------------------------------------------ + + return kTRUE; +} // End of main macro function diff --git a/macro/beamtime/mcbm2022/mcbm_unp_event.C b/macro/beamtime/mcbm2022/mcbm_unp_event.C index f2bb0ef9a91198b026168db893f9ffb38a2dd0a9..a22719c1baa5b565edebc193b73b82cf4040b919 100644 --- a/macro/beamtime/mcbm2022/mcbm_unp_event.C +++ b/macro/beamtime/mcbm2022/mcbm_unp_event.C @@ -1,6 +1,6 @@ -/* Copyright (C) 2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt +/* Copyright (C) 2022 Facility for Antiproton and Ion Research in Europe, Darmstadt SPDX-License-Identifier: GPL-3.0-only - Authors: Jan de Cuveland, Volker Friese, Pierre-Alain Loizeau, Pascal Raisig [committer], Dominik Smith, Adrian A. Weber */ + Authors: Pierre-Alain Loizeau [committer], Adrian Weber */ // --- Includes needed for IDE @@ -26,22 +26,18 @@ #include <TSystem.h> #endif -std::shared_ptr<CbmTrdUnpackMonitor> GetTrdMonitor(std::string treefilename, bool fasp = false); std::shared_ptr<CbmTrdSpadic> GetTrdSpadic(bool useAvgBaseline = false); -std::shared_ptr<CbmStsUnpackMonitor> GetStsMonitor(std::string treefilename, bool bDebugMode = false); -std::shared_ptr<CbmMuchUnpackMonitor> GetMuchMonitor(std::string treefilename, bool bDebugMode = false); -std::shared_ptr<CbmRichUnpackMonitor> GetRichMonitor(std::string treefilename, bool bDebugMode = false); -std::shared_ptr<CbmTofUnpackMonitor> GetTofMonitor(std::string treefilename, bool bBmonMode = false); -const char* defaultSetupName = "mcbm_beam_2021_07_surveyed"; +std::string defaultSetupName = "mcbm_beam_2021_07_surveyed"; /// FIXME: Disable clang formatting to keep easy parameters overview /* clang-format off */ -Bool_t mcbm_unp_event(bool bBmoninTof = false, +Bool_t mcbm_unp_event(std::string infile, + UInt_t uRunId, + uint32_t uTriggerSet = 3, std::int32_t nTimeslices = -1, - std::string infile = "/scratch/mcbm_data/2022_iron/2160_node8_0000.tsa;/scratch/mcbm_data/2022_iron/2160_node9_0000.tsa", - UInt_t uRunId = 2160, - const char* setupName = defaultSetupName, - std::string sOutDir = "data/") + std::string setupName = defaultSetupName, + std::string sOutDir = "data/", + bool bBmoninTof = false) { /// FIXME: Re-enable clang formatting after parameters initial values setting /* clang-format on */ @@ -55,36 +51,307 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, // ------------------------------------------------------------------------ // ----- Environment -------------------------------------------------- - TString myName = "mcbm_eventmcbm_unp_event_reco"; // this macro's name for screen output - TString srcDir = gSystem->Getenv("VMCWORKDIR"); // top source directory + TString myName = "mcbm_unp_event"; // this macro's name for screen output + TString srcDir = gSystem->Getenv("VMCWORKDIR"); // top source directory // ------------------------------------------------------------------------ // ----- EventBuilder Settings---------------- /// FIXME: Disable clang formatting to keep easy parameters overview /* clang-format off */ - const UInt_t eb_TriggerMinNumberBmon { 1 }; - const UInt_t eb_TriggerMinNumberSts { 0 }; - const UInt_t eb_TriggerMinNumberMuch { 0 }; - const UInt_t eb_TriggerMinNumberTof { 4 }; - const UInt_t eb_TriggerMinNumberRich { 0 }; - - const Int_t eb_TriggerMaxNumberBMon { -1 }; - const Int_t eb_TriggerMaxNumberSts { -1 }; - const Int_t eb_TriggerMaxNumberMuch { -1 }; - const Int_t eb_TriggerMaxNumberTof { -1 }; - const Int_t eb_TriggerMaxNumberRich { -1 }; + UInt_t eb_TriggerMinNumberBmon { 0 }; + UInt_t eb_TriggerMinNumberSts { 0 }; + UInt_t eb_TriggerMinNumberMuch { 0 }; + UInt_t eb_TriggerMinNumberTrd1d { 0 }; + UInt_t eb_TriggerMinNumberTrd2d { 0 }; + UInt_t eb_TriggerMinNumberTof { 4 }; + UInt_t eb_TriggerMinNumberRich { 0 }; + + Int_t eb_TriggerMaxNumberBMon { -1 }; + Int_t eb_TriggerMaxNumberSts { -1 }; + Int_t eb_TriggerMaxNumberMuch { -1 }; + Int_t eb_TriggerMaxNumberTrd1d { -1 }; + Int_t eb_TriggerMaxNumberTrd2d { -1 }; + Int_t eb_TriggerMaxNumberTof { -1 }; + Int_t eb_TriggerMaxNumberRich { -1 }; + + UInt_t eb_TriggerMinLayersNumberTof { 0 }; + UInt_t eb_TriggerMinLayersNumberSts { 0 }; + + Double_t eb_TrigWinMinBMon { -20}; + Double_t eb_TrigWinMaxBMon { 20}; + Double_t eb_TrigWinMinSts { -40}; + Double_t eb_TrigWinMaxSts { 40}; + Double_t eb_TrigWinMinMuch { -50}; + Double_t eb_TrigWinMaxMuch { 500}; + Double_t eb_TrigWinMinTrd1d { -50}; + Double_t eb_TrigWinMaxTrd1d { 400}; + Double_t eb_TrigWinMinTrd2d { -60}; + Double_t eb_TrigWinMaxTrd2d { 350}; + Double_t eb_TrigWinMinTof { -10}; + Double_t eb_TrigWinMaxTof { 70}; + Double_t eb_TrigWinMinRich { -10}; + Double_t eb_TrigWinMaxRich { 40}; + + + bool bTrigSet = true; + switch (uTriggerSet) { + case 0: { + // default, any Tof hit + eb_TriggerMaxNumberBMon = 1000; + + eb_TriggerMinNumberTof = 1; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -80; + eb_TrigWinMaxTof = 120; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 1: { + // default, Tof - T0 concidences (pulser) + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 1000; + + eb_TriggerMinNumberTof = 2; + eb_TriggerMinLayersNumberTof = 1; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -180; + eb_TrigWinMaxTof = 220; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 2: { + // Tof standalone track trigger (cosmic) + eb_TriggerMaxNumberBMon = 1000; + + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -30; + eb_TrigWinMaxTof = 70; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 3: { + // # Tof track trigger with T0 + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 2; + + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -20; + eb_TrigWinMaxTof = 60; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 4: { + // mCbm track trigger Tof, T0 & STS + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 2; + + eb_TriggerMinNumberSts = 2; + eb_TriggerMinLayersNumberSts = 1; + + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -20; + eb_TrigWinMaxTof = 60; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 5: { + // mCbm lambda trigger + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 2; + + eb_TriggerMinNumberSts = 8; + eb_TriggerMinLayersNumberSts = 2; + + eb_TriggerMinNumberTof = 16; + eb_TriggerMinLayersNumberTof = 8; // # PAL 07/04/2022: Not sure here if it should be 4 or 8 (2 tracks in same det. stack excluded?) + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -20; + eb_TrigWinMaxTof = 60; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 6: { + // One hit per detector system w/ big acceptance = mCbm full track trigger + eb_TriggerMinNumberBmon = 1; + eb_TriggerMaxNumberBMon = 1; + + eb_TriggerMinNumberSts = 4; + eb_TriggerMinLayersNumberSts = 0; + + eb_TriggerMinNumberMuch = 2; + + eb_TriggerMinNumberTrd1d = 2; + + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + + eb_TrigWinMinBMon = -50; + eb_TrigWinMaxBMon = 50; + eb_TrigWinMinSts = -60; + eb_TrigWinMaxSts = 60; + eb_TrigWinMinTrd1d = -300; + eb_TrigWinMaxTrd1d = 300; + eb_TrigWinMinTrd2d = -200; + eb_TrigWinMaxTrd2d = 200; + + eb_TrigWinMinTof = -20; + eb_TrigWinMaxTof = 60; + + eb_TrigWinMinRich = -60; + eb_TrigWinMaxRich = 60; + break; + } + case 7: { + /// PAL default: T0 + STS + TOF, only digi cut + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 2; + eb_TriggerMinNumberTof = 4; + break; + } + case 8: { + // default, Tof - T0 concidences (pulser) + eb_TriggerMinNumberBmon = 4; + eb_TriggerMinNumberTof = 2; + eb_TriggerMinLayersNumberTof = 1; + break; + } + case 9: { + // Tof standalone track trigger (cosmic) + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + break; + } + case 10: { + // # Tof track trigger with T0 + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + break; + } + case 11: { + // mCbm track trigger Tof, T0 & STS + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 2; + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + break; + } + case 12: { + // mCbm lambda trigger + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 8; + eb_TriggerMinNumberTof = 16; + eb_TriggerMinLayersNumberTof = 8; // # PAL 07/04/2022: Not sure here if it should be 4 or 8 (2 tracks in same det. stack excluded?) + break; + } + case 13: { + // One hit per detector system w/ big acceptance = mCbm full track trigger + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 4; + eb_TriggerMinNumberTrd1d = 2; + eb_TriggerMinNumberTrd1d = 1; + eb_TriggerMinNumberTof = 8; + eb_TriggerMinNumberRich = 1; + break; + } + case 14: { + /// PAL mCbm track trigger Tof, T0 & STS + eb_TriggerMinNumberBmon = 1; + eb_TriggerMinNumberSts = 4; + eb_TriggerMinNumberTof = 8; + eb_TriggerMinLayersNumberTof = 4; + eb_TriggerMinLayersNumberSts = 2; + break; + } + default: { + bTrigSet = false; + break; + } + } /// FIXME: Re-enable clang formatting after parameters initial values setting /* clang-format on */ // ------------------------------------------------------------------------ // ----- Output filename ---------------------------------------------- - std::string filename = Form("%d_%s.digi.root", uRunId, (bBmoninTof ? "BmonInTof" : "BmonSepar")); + std::string filename = Form("%d%s.digi_event.root", uRunId, (bTrigSet ? Form("_%u", uTriggerSet) : "")); std::string outfilename = sOutDir + "/" + filename; std::cout << "-I- " << myName << ": Output file will be " << outfilename << std::endl; std::string histosfilename = sOutDir + "/" + filename; - histosfilename.replace(histosfilename.find(".digi.root"), 10, ".hist.root"); + histosfilename.replace(histosfilename.find(".digi_event.root"), 16, ".hist.root"); std::cout << "-I- " << myName << ": Histos file will be " << histosfilename << std::endl; // ------------------------------------------------------------------------ @@ -94,9 +361,11 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, bool doPerfProfiling = true; // Define if you want a special path and name for the performance profiling output file std::string perfProfFileName = sOutDir + "/" + filename; - perfProfFileName.replace(perfProfFileName.find(".digi.root"), 10, ".perf.root"); + perfProfFileName.replace(perfProfFileName.find(".digi_event.root"), 16, ".perf.root"); + std::cout << "-I- " << myName << ": Unpack perf file will be " << perfProfFileName << std::endl; // ------------------------------------------------------------------------ + // ----- CbmSetup ----------------------------------------------------- if (2060 <= uRunId && defaultSetupName == setupName) { /// Setup changed multiple times between the 2022 carbon and uranium runs @@ -112,9 +381,20 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, /// Uranium runs: 2176 - 2310 = 30/03/2022 - 01/04/2022 setupName = "mcbm_beam_2022_03_28_uranium"; } + else if (2350 <= uRunId && uRunId <= 2397) { + /// Nickel runs: 2350 - 2397 = 23/05/2022 - 25/05/2022 + setupName = "mcbm_beam_2022_05_23_nickel"; + } + else if (2454 <= uRunId && uRunId <= 2497) { + /// Lambda Benchmark Gold runs: 2454 - 2497 = 16/06/2022 - 18/06/2022 + setupName = "mcbm_beam_2022_06_16_gold"; + } + if (defaultSetupName != setupName) { + std::cout << "Automatic setup choice for run " << uRunId << ": " << setupName << std::endl; + } } auto cbmGeoSetup = CbmSetup::Instance(); - cbmGeoSetup->LoadSetup(setupName); + cbmGeoSetup->LoadSetup(setupName.c_str()); // ------------------------------------------------------------------------ // ----- UnpackerConfigs ---------------------------------------------- @@ -135,8 +415,10 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, if (2160 <= uRunId) { bmonconfig->SetSystemTimeOffset(-80); // [ns] value to be updated } - /// Enable Monitor plots - // bmonconfig->SetMonitor(GetTofMonitor(outfilename, true)); + + if (2350 <= uRunId) { + bmonconfig->SetSystemTimeOffset(0); // [ns] value to be updated + } } } // ------------- @@ -157,12 +439,13 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, stsconfig->SetParFilesBasePath(parfilesbasepathSts); /// Enable duplicates rejection, Ignores the ADC for duplicates check stsconfig->SetDuplicatesRejection(true, true); - /// Enable Monitor plots - //stsconfig->SetMonitor(GetStsMonitor(outfilename, true)); stsconfig->SetSystemTimeOffset(-2221); // [ns] value to be updated if (2160 <= uRunId) { stsconfig->SetSystemTimeOffset(-1075); // [ns] value to be updated } + if (2350 <= uRunId) { + stsconfig->SetSystemTimeOffset(-970); // [ns] value to be updated + } stsconfig->SetMinAdcCut(1, 1); stsconfig->SetMinAdcCut(2, 1); @@ -202,11 +485,12 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, int sensor, asic; std::ifstream asicTimeWalk_par(Form("%s/mStsAsicTimeWalk.par", parfilesbasepathSts.data())); while (asicTimeWalk_par >> std::hex >> sensor >> std::dec >> asic >> p0 >> p1 >> p2 >> p3) { - std::cout << Form("Setting time-walk parametersfor: module %x, ASIC %u\n", sensor, asic); + // std::cout << Form("Setting time-walk parameters for: module %x, ASIC %u\n", sensor, asic); parAsic->SetWalkCoef({p0, p1, p2, p3}); if (walkMap.find(sensor) == walkMap.end()) { walkMap[sensor] = CbmStsParModule(*parMod); } walkMap[sensor].SetAsic(asic, *parAsic); + // std::cout << Form("Done with time-walk parameters for: module %x, ASIC %u\n", sensor, asic); } stsconfig->SetWalkMap(walkMap); @@ -230,14 +514,32 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, /// Starting to use CRI Based MUCH setup with 2GEM and 1 RPC since 09/03/2022 Carbon run muchconfig->SetParFileName("mMuchParUpto26032022.par"); } + else if (2163 <= uRunId && uRunId <= 2291) { + /// + muchconfig->SetParFileName("mMuchParUpto03042022.par"); + } + else if (2311 <= uRunId && uRunId <= 2315) { + /// + muchconfig->SetParFileName("mMuchParUpto10042022.par"); + } + else if (2316 <= uRunId && uRunId <= 2366) { + /// + muchconfig->SetParFileName("mMuchParUpto23052022.par"); + } + else if (2367 <= uRunId && uRunId <= 2397) { + /// Starting to use GEM 2 moved to CRI 0 on 24/05/2022 + muchconfig->SetParFileName("mMuchParUpto26052022.par"); + } + /// 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 if (2160 <= uRunId) { muchconfig->SetSystemTimeOffset(-1020); // [ns] value to be updated } + if (2350 <= uRunId) { + muchconfig->SetSystemTimeOffset(-980); // [ns] value to be updated + } // muchconfig->SetMinAdcCut(1, 1); @@ -261,13 +563,15 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, std::string parfilesbasepathTrd = Form("%s/parameters/trd", srcDir.Data()); trd1Dconfig->SetParFilesBasePath(parfilesbasepathTrd); - // trd1Dconfig->SetMonitor(GetTrdMonitor(outfilename)); // Get the spadic configuration true = avg baseline active / false plain sample 0 trd1Dconfig->SetSpadicObject(GetTrdSpadic(true)); trd1Dconfig->SetSystemTimeOffset(0); // [ns] value to be updated if (2160 <= uRunId) { trd1Dconfig->SetSystemTimeOffset(1140); // [ns] value to be updated } + if (2350 <= uRunId) { + trd1Dconfig->SetSystemTimeOffset(1300); // [ns] value to be updated + } } // ------------- @@ -281,22 +585,46 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, // 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"); uint8_t map[NFASPMOD]; + uint16_t crob_map[NCROBMOD]; + for (uint32_t i(0); i < NFASPMOD; i++) + map[i] = i; if (uRunId <= 1588) { + const size_t nfasps = 12; 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); + for (uint32_t i(0); i < nfasps; i++) + map[i] = map21[i]; + uint16_t crob_map21[] = {0x00f0, 0, 0, 0, 0}; + for (uint32_t i(0); i < NCROBMOD; i++) + crob_map[i] = crob_map21[i]; + } + else if (uRunId >= 2335) { + const size_t nfasp0 = 72; + const size_t nfasps = 36; + uint8_t map22[] = { + 84, 85, 86, 87, 88, 89, // FEB14/0xffc1 + 90, 91, 92, 93, 94, 95, // FEB17/0xffc1 + 96, 97, 98, 99, 100, 101, // FEB18/0xffc1 + 102, 103, 104, 105, 106, 107, // FEB16/0xffc1 + 72, 73, 74, 75, 76, 77, // FEB9/0xffc1 + 78, 79, 80, 81, 82, 83 // FEB8/0xffc1 + }; + for (uint32_t i(0); i < nfasps; i++) + map[i + nfasp0] = map22[i]; + uint16_t crob_map22[] = {0xffc2, 0xffc5, 0xffc1, 0, 0}; + for (uint32_t i(0); i < NCROBMOD; i++) + crob_map[i] = crob_map22[i]; } - else - for (int i(0); i < NFASPMOD; i++) - map[i] = i; trdfasp2dconfig->SetFaspMapping(5, map); + trdfasp2dconfig->SetCrobMapping(5, crob_map); std::string parfilesbasepathTrdfasp2d = Form("%s/parameters/trd", srcDir.Data()); trdfasp2dconfig->SetParFilesBasePath(parfilesbasepathTrdfasp2d); trdfasp2dconfig->SetSystemTimeOffset(-1800); // [ns] value to be updated if (2160 <= uRunId) { trdfasp2dconfig->SetSystemTimeOffset(-570); // [ns] value to be updated } - // trdfasp2dconfig->SetMonitor(dynamic_pointer_cast<CbmTrdUnpackFaspMonitor>(GetTrdMonitor(outfilename, 1))); + if (2350 <= uRunId) { + trdfasp2dconfig->SetSystemTimeOffset(-510); // [ns] value to be updated + } } // ------------- @@ -321,12 +649,24 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, else if (2150 <= uRunId && uRunId <= 2160) { /// Iron runs: 2150 - 2160 parFileNameTof = "mTofCriParIron.par"; - if (bBmoninTof) { parFileNameTof = "mTofCriParIron_withBmon.par"; } + if (bBmoninTof) { + /// Map the BMon components in the TOF par file + parFileNameTof = "mTofCriParIron_withBmon.par"; + } } else if (2176 <= uRunId && uRunId <= 2310) { /// Uranium runs: 2176 - 2310 parFileNameTof = "mTofCriParUranium.par"; } + else if (2335 <= uRunId) { + /// Nickel runs: 2335 - 2397 + /// Gold runs: 2400 - xxxx + parFileNameTof = "mTofCriParNickel.par"; + if (bBmoninTof) { + /// Map the BMon components in the TOF par file + parFileNameTof = "mTofCriParNickel_withBmon.par"; + } + } } tofconfig->SetParFilesBasePath(parfilesbasepathTof); tofconfig->SetParFileName(parFileNameTof); @@ -334,12 +674,13 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, if (2160 <= uRunId) { tofconfig->SetSystemTimeOffset(0); // [ns] value to be updated } + if (2350 <= uRunId) { + tofconfig->SetSystemTimeOffset(40); // [ns] value to be updated + } if (uRunId <= 1659) { /// Switch ON the -4 offset in epoch count (hack for Spring-Summer 2021) tofconfig->SetFlagEpochCountHack2021(); } - /// Enable Monitor plots - // tofconfig->SetMonitor(GetTofMonitor(outfilename, false)); } // ------------- @@ -351,7 +692,6 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, if (1904 < uRunId) { /// Switch to new unpacking algo starting from first combined cosmics run in 2022 richconfig->SetUnpackerVersion(CbmRichUnpackerVersion::v03); - richconfig->SetMonitor(GetRichMonitor(outfilename, true)); } richconfig->DoTotOffsetCorrection(); // correct ToT offset @@ -364,6 +704,9 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, if (2160 <= uRunId) { richconfig->SetSystemTimeOffset(50); // [ns] value to be updated } + if (2350 <= uRunId) { + richconfig->SetSystemTimeOffset(100); // [ns] value to be updated + } if (uRunId == 1588) richconfig->MaskDiRICH(0x7150); } // ------------- @@ -378,9 +721,13 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, // Set TOF as reference detector evBuildRaw->SetReferenceDetector(kRawEventBuilderDetTof); + evBuildRaw->AddDetector(kRawEventBuilderDetT0); + + // Set T0 as reference detector + evBuildRaw->SetReferenceDetector(kRawEventBuilderDetT0); + evBuildRaw->AddDetector(kRawEventBuilderDetTof); // Remove detectors not there in 2022 - evBuildRaw->RemoveDetector(kRawEventBuilderDetT0); evBuildRaw->RemoveDetector(kRawEventBuilderDetSts); evBuildRaw->RemoveDetector(kRawEventBuilderDetMuch); evBuildRaw->RemoveDetector(kRawEventBuilderDetTrd); @@ -389,43 +736,71 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, evBuildRaw->RemoveDetector(kRawEventBuilderDetPsd); // Add all 2022 detectors in the right order - evBuildRaw->AddDetector(kRawEventBuilderDetT0); evBuildRaw->AddDetector(kRawEventBuilderDetSts); - evBuildRaw->AddDetector(kRawEventBuilderDetMuch); + // evBuildRaw->AddDetector(kRawEventBuilderDetMuch); evBuildRaw->AddDetector(kRawEventBuilderDetTrd); evBuildRaw->AddDetector(kRawEventBuilderDetTrd2D); evBuildRaw->AddDetector(kRawEventBuilderDetRich); - // void SetTsParameters(double TsStartTime, double TsLength, double TsOverLength): TsStartTime=0, TsLength=256ms in 2021, TsOverLength=TS overlap, not used in mCBM2021 + // void SetTsParameters(double TsStartTime, double TsLength, double TsOverLength): + // => TsStartTime=0, TsLength=256ms in 2021, TsOverLength=TS overlap, not used in mCBM2021 //evBuildRaw->SetTsParameters(0.0, 2.56e8, 0.0);, 0.0); - // void SetTsParameters(double TsStartTime, double TsLength, double TsOverLength): TsStartTime=0, TsLength=102.4ms in 2022, TsOverLength=TS overlap not used in mCBM202? - evBuildRaw->SetTsParameters(0.0, 1.28e8, 1.12928e8); - evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kTof, eb_TriggerMinNumberTof); - evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kTof, eb_TriggerMaxNumberTof); - - evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kT0, eb_TriggerMinNumberBmon); - evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kT0, eb_TriggerMaxNumberBMon); + // void SetTsParameters(double TsStartTime, double TsLength, double TsOverLength): + // => TsStartTime=0, TsLength=102.4ms in 2022, TsOverLength=TS overlap not used in mCBM2022? + evBuildRaw->SetTsParameters(0.0, 1.28e8, 1.12928e8); - evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kSts, eb_TriggerMinNumberSts); - evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kSts, eb_TriggerMaxNumberSts); + /// FIXME: Disable clang formatting to keep easy parameters overview + /* clang-format off */ + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kT0, eb_TriggerMinNumberBmon); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kT0, eb_TriggerMaxNumberBMon); + + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kSts, eb_TriggerMinNumberSts); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kSts, eb_TriggerMaxNumberSts); + evBuildRaw->SetTriggerMinLayersNumber(ECbmModuleId::kSts, eb_TriggerMinLayersNumberSts); +/* + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kMuch, eb_TriggerMinNumberMuch); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kMuch, eb_TriggerMaxNumberMuch); +*/ + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kTrd, eb_TriggerMinNumberTrd1d); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kTrd, eb_TriggerMaxNumberTrd1d); - evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kMuch, eb_TriggerMinNumberMuch); - evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kMuch, eb_TriggerMaxNumberMuch); + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kTrd2d, eb_TriggerMinNumberTrd2d); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kTrd2d, eb_TriggerMaxNumberTrd2d); - evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kRich, eb_TriggerMinNumberRich); - evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kRich, eb_TriggerMaxNumberRich); + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kTof, eb_TriggerMinNumberTof); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kTof, eb_TriggerMaxNumberTof); + evBuildRaw->SetTriggerMinLayersNumber(ECbmModuleId::kTof, eb_TriggerMinLayersNumberTof); + + evBuildRaw->SetTriggerMinNumber(ECbmModuleId::kRich, eb_TriggerMinNumberRich); + evBuildRaw->SetTriggerMaxNumber(ECbmModuleId::kRich, eb_TriggerMaxNumberRich); + + + evBuildRaw->SetTriggerWindow(ECbmModuleId::kT0, eb_TrigWinMinBMon, eb_TrigWinMaxBMon); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kSts, eb_TrigWinMinSts, eb_TrigWinMaxSts); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kMuch, eb_TrigWinMinMuch, eb_TrigWinMaxMuch); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kTrd, eb_TrigWinMinTrd1d, eb_TrigWinMaxTrd1d); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kTrd2d, eb_TrigWinMinTrd2d, eb_TrigWinMaxTrd2d); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kTof, eb_TrigWinMinTof, eb_TrigWinMaxTof); + evBuildRaw->SetTriggerWindow(ECbmModuleId::kRich, eb_TrigWinMinRich, eb_TrigWinMaxRich); + + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kT0, + (0 < eb_TriggerMaxNumberBMon ? eb_TriggerMaxNumberBMon : 50)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kSts, + (0 < eb_TriggerMaxNumberSts ? eb_TriggerMaxNumberSts : 2000)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kMuch, + (0 < eb_TriggerMaxNumberMuch ? eb_TriggerMaxNumberMuch : 1000)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kTrd, + (0 < eb_TriggerMaxNumberTrd1d ? eb_TriggerMaxNumberTrd1d : 1500)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kTrd2d, + (0 < eb_TriggerMaxNumberTrd2d ? eb_TriggerMaxNumberTrd2d : 500)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kTof, + (0 < eb_TriggerMaxNumberTof ? eb_TriggerMaxNumberTof : 500)); + evBuildRaw->SetHistogramMaxDigiNb(ECbmModuleId::kRich, + (0 < eb_TriggerMaxNumberRich ? eb_TriggerMaxNumberRich : 600)); - if (bBmoninTof) { evBuildRaw->SetTriggerWindow(ECbmModuleId::kT0, -180, 20); } - else { - evBuildRaw->SetTriggerWindow(ECbmModuleId::kT0, -100, 100); - } - evBuildRaw->SetTriggerWindow(ECbmModuleId::kSts, -60, 60); - evBuildRaw->SetTriggerWindow(ECbmModuleId::kMuch, -100, 500); - evBuildRaw->SetTriggerWindow(ECbmModuleId::kTrd, -100, 350); - evBuildRaw->SetTriggerWindow(ECbmModuleId::kTrd2d, -200, 200); - evBuildRaw->SetTriggerWindow(ECbmModuleId::kTof, -60, 60); - evBuildRaw->SetTriggerWindow(ECbmModuleId::kRich, -60, 60); + /// FIXME: Re-enable clang formatting after parameters initial values setting + /* clang-format on */ // Use standard MUCH digis evBuildRaw->ChangeMuchBeamtimeDigiFlag(); @@ -434,6 +809,8 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, if (bBmoninTof) { evBuildRaw->SetT0InTofDetType(); } evBuildRaw->SetOutFilename(histosfilename); + // evBuildRaw->SetOutputBranchPersistent("CbmEvent", kFALSE); + evBuildRaw->SetWriteHistosToFairSink(kFALSE); // ------------------------------------------------------------------------ // In general, the following parts need not be touched @@ -448,6 +825,7 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, auto source = new CbmSourceTsArchive(vInFile); auto unpack = source->GetRecoUnpack(); unpack->SetDoPerfProfiling(doPerfProfiling); + unpack->SetDoPerfProfilingPerTs(doPerfProfiling); unpack->SetOutputFilename(perfProfFileName); // Enable full time sorting instead sorting per FLIM link unpack->SetTimeSorting(true); @@ -489,10 +867,15 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, // ----- Start run ---------------------------------------------------- std::cout << std::endl << std::endl; - std::cout << "-I- " << myName << ": Starting run" << std::endl; - if (nTimeslices < 0) run->Run(-1, 0); - else + if (nTimeslices < 0) { + std::cout << "-I- " << myName << ": Starting run over all timeslices in input" << std::endl; + run->Run(-1, 0); + } + else { + std::cout << "-I- " << myName << ": Starting run over " << nTimeslices + << " timeslices (or less if not enough in input)" << std::endl; run->Run(0, nTimeslices); + } // ------------------------------------------------------------------------ @@ -523,70 +906,6 @@ Bool_t mcbm_unp_event(bool bBmoninTof = false, } // End of main macro function -/** - * @brief Get the Trd Monitor. Extra function to keep default macro part more silent. - * @return std::shared_ptr<CbmTrdUnpackMonitor> -*/ -std::shared_ptr<CbmTrdUnpackMonitor> GetTrdMonitor(std::string treefilename, bool fasp = false) -{ - // ----- Output filename and path ------------------------------------- - std::string sOutDir = ""; - std::string filename = ""; - auto filenamepos = treefilename.find_last_of("/"); - if (filenamepos != treefilename.npos) { - sOutDir = treefilename.substr(0, filenamepos); - filename = treefilename.substr(filenamepos++); - } - if (sOutDir.empty()) sOutDir = gSystem->GetWorkingDirectory(); - std::string mydir = "/qa"; - sOutDir += mydir; - - auto currentdir = gSystem->GetWorkingDirectory(); - - if (!gSystem->cd(sOutDir.data())) gSystem->MakeDirectory(sOutDir.data()); - else - gSystem->cd(currentdir.data()); - - std::string outfilename = sOutDir + filename; - auto filetypepos = outfilename.find(".digi.root"); - if (filetypepos != outfilename.npos) outfilename.replace(filetypepos, 10, ".mon.trd.root"); - else - outfilename += ".mon.trd.root"; - // ------------------------------------------------------------------------ - - std::vector<CbmTrdUnpackMonitor::eDigiHistos> digihistovec = { - CbmTrdUnpackMonitor::eDigiHistos::kMap, CbmTrdUnpackMonitor::eDigiHistos::kMap_St, - CbmTrdUnpackMonitor::eDigiHistos::kMap_Nt, CbmTrdUnpackMonitor::eDigiHistos::kCharge, - CbmTrdUnpackMonitor::eDigiHistos::kCharge_St, CbmTrdUnpackMonitor::eDigiHistos::kCharge_Nt, - CbmTrdUnpackMonitor::eDigiHistos::kChannel, CbmTrdUnpackMonitor::eDigiHistos::kChannel_St, - CbmTrdUnpackMonitor::eDigiHistos::kChannel_Nt, CbmTrdUnpackMonitor::eDigiHistos::kTriggerType, - CbmTrdUnpackMonitor::eDigiHistos::kDigiDeltaT}; - - std::vector<CbmTrdUnpackMonitor::eRawHistos> rawhistovec = { - CbmTrdUnpackMonitor::eRawHistos::kSignalshape, CbmTrdUnpackMonitor::eRawHistos::kSignalshape_St, - CbmTrdUnpackMonitor::eRawHistos::kSignalshape_Nt, CbmTrdUnpackMonitor::eRawHistos::kElinkId, - CbmTrdUnpackMonitor::eRawHistos::kSampleDistStdDev, CbmTrdUnpackMonitor::eRawHistos::kSample0perChannel, - CbmTrdUnpackMonitor::eRawHistos::kHitType}; - - std::vector<CbmTrdUnpackMonitor::eOtherHistos> otherhistovec = {CbmTrdUnpackMonitor::eOtherHistos::kSpadic_Info_Types, - CbmTrdUnpackMonitor::eOtherHistos::kMs_Flags}; - std::shared_ptr<CbmTrdUnpackMonitor> monitor(nullptr); - if (!fasp) { // SPADIC monitor - monitor = std::make_shared<CbmTrdUnpackMonitor>(); - monitor->SetActiveHistos(digihistovec); - monitor->SetActiveHistos(rawhistovec); - monitor->SetActiveHistos(otherhistovec); - monitor->SetWriteToFile(outfilename.data()); - } - else { // FASP monitoring settings - monitor = std::make_shared<CbmTrdUnpackFaspMonitor>(); - monitor->SetActiveHistos(digihistovec); - monitor->SetWriteToFile(outfilename.data()); - } - return monitor; -} - - /** * @brief Get the Trd Spadic * @return std::shared_ptr<CbmTrdSpadic> @@ -599,154 +918,3 @@ std::shared_ptr<CbmTrdSpadic> GetTrdSpadic(bool useAvgBaseline) return spadic; } - -/** - * @brief Get the Sts Monitor. Extra function to keep default macro part more silent. - * @return std::shared_ptr<CbmStsUnpackMonitor> -*/ -std::shared_ptr<CbmStsUnpackMonitor> GetStsMonitor(std::string treefilename, bool bDebugMode = false) -{ - // ----- Output filename and path ------------------------------------- - std::string outpath = ""; - std::string filename = ""; - auto filenamepos = treefilename.find_last_of("/"); - if (filenamepos != treefilename.npos) { - outpath = treefilename.substr(0, filenamepos); - filename = treefilename.substr(filenamepos++); - } - if (outpath.empty()) outpath = gSystem->GetWorkingDirectory(); - //std::string mydir = "/qa"; - //outpath += mydir; - - auto currentdir = gSystem->GetWorkingDirectory(); - - if (!gSystem->cd(outpath.data())) gSystem->MakeDirectory(outpath.data()); - else - gSystem->cd(currentdir.data()); - - std::string outfilename = outpath + filename; - auto filetypepos = outfilename.find(".digi.root"); - if (filetypepos != outfilename.npos) outfilename.replace(filetypepos, 10, ".mon.sts.root"); - else - outfilename += ".mon.sts.root"; - // ------------------------------------------------------------------------ - - auto monitor = std::make_shared<CbmStsUnpackMonitor>(); - monitor->SetHistoFileName(outfilename); - monitor->SetDebugMode(bDebugMode); - return monitor; -} - -/** - * @brief Get the Much Monitor. Extra function to keep default macro part more silent. - * @return std::shared_ptr<CbmMuchUnpackMonitor> -*/ -std::shared_ptr<CbmMuchUnpackMonitor> GetMuchMonitor(std::string treefilename, bool bDebugMode = false) -{ - // ----- Output filename and path ------------------------------------- - std::string outpath = ""; - std::string filename = ""; - auto filenamepos = treefilename.find_last_of("/"); - if (filenamepos != treefilename.npos) { - outpath = treefilename.substr(0, filenamepos); - filename = treefilename.substr(filenamepos++); - } - if (outpath.empty()) outpath = gSystem->GetWorkingDirectory(); - - auto currentdir = gSystem->GetWorkingDirectory(); - - if (!gSystem->cd(outpath.data())) gSystem->MakeDirectory(outpath.data()); - else - gSystem->cd(currentdir.data()); - - std::string outfilename = outpath + filename; - auto filetypepos = outfilename.find(".digi.root"); - if (filetypepos != outfilename.npos) outfilename.replace(filetypepos, 10, ".mon.much.root"); - else - outfilename += ".mon.much.root"; - // ------------------------------------------------------------------------ - - auto monitor = std::make_shared<CbmMuchUnpackMonitor>(); - monitor->SetHistoFileName(outfilename); - monitor->SetDebugMode(bDebugMode); - return monitor; -} - -/** - * @brief Get the Rich Monitor. Extra function to keep default macro part more silent. - * @return std::shared_ptr<CbmRichUnpackMonitor> -*/ -std::shared_ptr<CbmRichUnpackMonitor> GetRichMonitor(std::string treefilename, bool bDebugMode = false) -{ - // ----- Output filename and path ------------------------------------- - std::string outpath = ""; - std::string filename = ""; - auto filenamepos = treefilename.find_last_of("/"); - if (filenamepos != treefilename.npos) { - outpath = treefilename.substr(0, filenamepos); - filename = treefilename.substr(filenamepos++); - } - if (outpath.empty()) outpath = gSystem->GetWorkingDirectory(); - - auto currentdir = gSystem->GetWorkingDirectory(); - - if (!gSystem->cd(outpath.data())) gSystem->MakeDirectory(outpath.data()); - else - gSystem->cd(currentdir.data()); - - std::string outfilename = outpath + filename; - auto filetypepos = outfilename.find(".digi.root"); - if (filetypepos != outfilename.npos) outfilename.replace(filetypepos, 10, ".mon.rich.root"); - else - outfilename += ".mon.rich.root"; - // ------------------------------------------------------------------------ - - auto monitor = std::make_shared<CbmRichUnpackMonitor>(); - monitor->SetHistoFileName(outfilename); - monitor->SetDebugMode(bDebugMode); - - return monitor; -} - -/** - * @brief Get the Tof Monitor. Extra function to keep default macro part more silent. - * @return std::shared_ptr<CbmTofUnpackMonitor> -*/ -std::shared_ptr<CbmTofUnpackMonitor> GetTofMonitor(std::string treefilename, bool bBmonMode = false) -{ - // ----- Output filename and path ------------------------------------- - std::string outpath = ""; - std::string filename = ""; - auto filenamepos = treefilename.find_last_of("/"); - if (filenamepos != treefilename.npos) { - outpath = treefilename.substr(0, filenamepos); - filename = treefilename.substr(filenamepos++); - } - if (outpath.empty()) outpath = gSystem->GetWorkingDirectory(); - //std::string mydir = "/qa"; - //outpath += mydir; - - auto currentdir = gSystem->GetWorkingDirectory(); - - if (!gSystem->cd(outpath.data())) gSystem->MakeDirectory(outpath.data()); - else - gSystem->cd(currentdir.data()); - - std::string sSystemType = ".mon.tof.root"; - if (bBmonMode) { - // - sSystemType = ".mon.bmon.root"; - } - - std::string outfilename = outpath + filename; - auto filetypepos = outfilename.find(".digi.root"); - if (filetypepos != outfilename.npos) outfilename.replace(filetypepos, 10, sSystemType); - else - outfilename += sSystemType; - // ------------------------------------------------------------------------ - - auto monitor = std::make_shared<CbmTofUnpackMonitor>(); - monitor->SetHistoFileName(outfilename); - monitor->SetBmonMode(bBmonMode); - return monitor; -}