From b730b712335c947e4afbf2e5b58fd625d555d77b Mon Sep 17 00:00:00 2001
From: P-A Loizeau <p.-a.loizeau@gsi.de>
Date: Wed, 20 Nov 2024 15:27:51 +0100
Subject: [PATCH] online par generation: changes needed to regenerate
 consistent files for mCBM 2024-05

- fix deprecated Sink usage by using new Dummy Sink class
- use new mTOF 2024 calib file from Norbert
- use geometry file in macro/run/data as generated by the CI (instead of the one by the mCBM simulation)
- add missing system time offset for TRD1D and TRD2D, copied from the run_unpack_tsa.C macro
---
 reco/steer/CbmOnlineParWrite.cxx        | 10 +++--
 reco/steer/CbmSinkDummy.h               | 51 +++++++++++++++++++++++++
 reco/tasks/CbmTaskTrdUnpackParWrite.cxx | 15 ++++++++
 3 files changed, 72 insertions(+), 4 deletions(-)
 create mode 100644 reco/steer/CbmSinkDummy.h

diff --git a/reco/steer/CbmOnlineParWrite.cxx b/reco/steer/CbmOnlineParWrite.cxx
index 3b5fe641a5..eac56543db 100644
--- a/reco/steer/CbmOnlineParWrite.cxx
+++ b/reco/steer/CbmOnlineParWrite.cxx
@@ -6,6 +6,7 @@
 
 #include "CbmMcbmUtils.h"
 #include "CbmSetup.h"
+#include "CbmSinkDummy.h"
 #include "CbmSourceDummy.h"
 #include "CbmStsAddress.h"
 #include "CbmStsParAsic.h"
@@ -142,7 +143,7 @@ void CbmOnlineParWrite::AddTof()
       break;
     case Setup::mCBM2024_05:
       doCalibration = true;
-      cFname        = Form("%s/3036_1_TofCal.hst.root", TofFileFolder.Data());
+      cFname        = Form("%s/3026_1_TofCal.hst.root", TofFileFolder.Data());
       break;
     default: throw std::runtime_error("TOF: Unknown setup type");
   }
@@ -346,7 +347,7 @@ void CbmOnlineParWrite::Run(const Config& config)
 
   LOG(info) << "Using geometry setup: " << geoSetupTag;
 
-  TString geoFile = fSrcDir + "/macro/mcbm/data/" + geoSetupTag + ".geo.root";
+  TString geoFile = fSrcDir + "/macro/run/data/" + geoSetupTag + ".geo.root";
   fSetup          = CbmSetup::Instance();
   fSetup->LoadSetup(geoSetupTag);
 
@@ -357,8 +358,9 @@ void CbmOnlineParWrite::Run(const Config& config)
   fRun = new FairRunAna();
 
   // Dummy source required for the FairRunAna as it will crash without a source
-  auto* inputSource = new CbmSourceDummy{};
-  fRun->SetSource(inputSource);
+  fRun->SetSource(new CbmSourceDummy{});
+  fRun->SetSink(new CbmSinkDummy{});
+
 
   // =========================================================================
   // ===                   Alignment Correction                            ===
diff --git a/reco/steer/CbmSinkDummy.h b/reco/steer/CbmSinkDummy.h
new file mode 100644
index 0000000000..d18e215990
--- /dev/null
+++ b/reco/steer/CbmSinkDummy.h
@@ -0,0 +1,51 @@
+/* Copyright (C) 2023-2024 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Sergei Zharko [committer] */
+
+/// \file   CbmSinkDummy.cxx
+/// \date   15.06.2024
+/// \brief  A dummy FairSink class for the FairRunAna instance, if no output is really needed
+/// \author S.Zharko <s.zharko@gsi.de>
+
+#pragma once
+
+#include <FairSink.h>
+
+/// \class CbmSinkDummy
+/// \brief A dummy sink class, which is to be passed to a FairRunAna, if no output is required
+class CbmSinkDummy : public FairSink {
+ public:
+  /// \brief Default constructor
+  CbmSinkDummy() = default;
+
+  /// \brief Copy constructor
+  CbmSinkDummy(const CbmSinkDummy&) = default;
+
+  /// \brief Move constructor
+  CbmSinkDummy(CbmSinkDummy&&) = default;
+
+  /// \brief Destructor
+  ~CbmSinkDummy() = default;
+
+  /// \brief Copy assignment operator
+  CbmSinkDummy& operator=(const CbmSinkDummy&) = default;
+
+  /// \brief Copy assignment operator
+  CbmSinkDummy& operator=(CbmSinkDummy&&) = default;
+
+  // FairSink virtual function implementations
+  Bool_t InitSink() { return kTRUE; }
+  void Close() {}
+  void Reset() {}
+  Sink_Type GetSinkType() { return kFILESINK; }
+  void SetOutTree(TTree*) {}
+  void Fill() {}
+  Int_t Write(const char*, Int_t, Int_t) { return 0; }
+  void RegisterImpl(const char*, const char*, void*) {}
+  void RegisterAny(const char*, const std::type_info&, const std::type_info&, void*) {}
+  void WriteFolder() {}
+  bool CreatePersistentBranchesAny() { return true; }
+  void WriteObject(TObject*, const char*, Int_t) {}
+  void WriteGeometry() {}  // TODO: if(gGeoManager) gGeoManager->Write();
+  FairSink* CloneSink() { return new CbmSinkDummy(*this); }
+};
diff --git a/reco/tasks/CbmTaskTrdUnpackParWrite.cxx b/reco/tasks/CbmTaskTrdUnpackParWrite.cxx
index f4baf1a72b..c7c3667f31 100644
--- a/reco/tasks/CbmTaskTrdUnpackParWrite.cxx
+++ b/reco/tasks/CbmTaskTrdUnpackParWrite.cxx
@@ -84,6 +84,13 @@ InitStatus CbmTaskTrdUnpackParWrite::Init()
     trd2dConfig.InitComponentMap(crobMap);
     trd2dConfig.InitChannelMap(channelMap);
 
+    // Apply system time offset
+    // See <source_dir>/macro/run/run_unpack_tsa.C
+    if (fPars.setup == Setup::mCBM2022 || fPars.setup == Setup::mCBM2024_03 || fPars.setup == Setup::mCBM2024_05) {
+      // Ni 2022, Au 2022, Ni 2024
+      trd2dConfig.SetSystemTimeOffset(-510);
+    }
+
     std::ofstream("Trd2dReadoutSetup.yaml") << yaml::Dump{}(trd2dConfig);
   }
 
@@ -139,8 +146,16 @@ InitStatus CbmTaskTrdUnpackParWrite::Init()
     }
     trdConfig.Init(addressMap, channelMap);
 
+    // Apply system time offset
+    // See <source_dir>/macro/run/run_unpack_tsa.C
+    if (fPars.setup == Setup::mCBM2022 || fPars.setup == Setup::mCBM2024_03 || fPars.setup == Setup::mCBM2024_05) {
+      // Ni 2022, Au 2022, Ni 2024
+      trdConfig.SetSystemTimeOffset(1300);
+    }
+
     // Apply time offset per elink
     // See: https://git.cbm.gsi.de/computing/cbmroot/-/merge_requests/1751
+    // and <source_dir>/macro/run/run_unpack_tsa.C
     if (fPars.setup == Setup::mCBM2024_05) {
       for (int elinkId = 0; elinkId < 36; ++elinkId) {
         trdConfig.SetElinkTimeOffset(20736, elinkId, -36);
-- 
GitLab