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;
-}