From 8adfa6a2971a0828e7b17c8fd8ab16d82192a935 Mon Sep 17 00:00:00 2001
From: Volker Friese <v.friese@gsi.de>
Date: Thu, 10 Nov 2022 15:13:27 +0000
Subject: [PATCH] Introduce T-ZERO digitizer (Refs #2630)

---
 core/data/CMakeLists.txt              |   1 +
 core/data/CbmDataLinkDef.h            |   4 +-
 core/data/global/CbmTzdDigi.cxx       |   5 ++
 core/data/global/CbmTzdDigi.h         |  75 +++++++++++++++++++
 sim/detectors/CMakeLists.txt          |   1 +
 sim/detectors/tzd/CMakeLists.txt      |  24 ++++++
 sim/detectors/tzd/CbmTzdDigitize.cxx  | 103 ++++++++++++++++++++++++++
 sim/detectors/tzd/CbmTzdDigitize.h    |  78 +++++++++++++++++++
 sim/detectors/tzd/CbmTzdSimLinkDef.h  |  14 ++++
 sim/response/CMakeLists.txt           |   1 +
 sim/response/base/CbmDigitization.cxx |  11 ++-
 11 files changed, 314 insertions(+), 3 deletions(-)
 create mode 100644 core/data/global/CbmTzdDigi.cxx
 create mode 100644 core/data/global/CbmTzdDigi.h
 create mode 100644 sim/detectors/tzd/CMakeLists.txt
 create mode 100644 sim/detectors/tzd/CbmTzdDigitize.cxx
 create mode 100644 sim/detectors/tzd/CbmTzdDigitize.h
 create mode 100644 sim/detectors/tzd/CbmTzdSimLinkDef.h

diff --git a/core/data/CMakeLists.txt b/core/data/CMakeLists.txt
index 3e9bd576f3..58d59d289a 100644
--- a/core/data/CMakeLists.txt
+++ b/core/data/CMakeLists.txt
@@ -98,6 +98,7 @@ set(SRCS
   psd/CbmPsdAddress.cxx
   psd/CbmPsdMCbmHit.cxx
 
+  global/CbmTzdDigi.cxx
   global/CbmGlobalTrack.cxx
   global/CbmVertex.cxx
   global/CbmTofTrack.cxx
diff --git a/core/data/CbmDataLinkDef.h b/core/data/CbmDataLinkDef.h
index ecec751d79..3669806a48 100644
--- a/core/data/CbmDataLinkDef.h
+++ b/core/data/CbmDataLinkDef.h
@@ -28,7 +28,7 @@
 #pragma link C++ class CbmErrorMessage + ;
 #pragma link C++ class CbmRawEvent + ;
 #pragma link C++ class CbmTsEventHeader + ;
-#pragma link C++ class std::vector<CbmErrorMessage> + ;
+#pragma link C++ class std::vector < CbmErrorMessage> + ;
 
 // ---In base
 #pragma link C++ class CbmDigiBranchBase + ;
@@ -93,6 +93,7 @@
 // --- data/global
 #pragma link C++ class CbmGlobalTrack + ;
 #pragma link C++ class CbmTofTrack + ;
+#pragma link C++ class CbmTzdDigi + ;
 #pragma link C++ class CbmVertex + ;
 #pragma link C++ class std::vector < CbmDigiEvent>;
 
@@ -123,6 +124,7 @@
 #pragma link C++ class vector < CbmMuchBeamTimeDigi> + ;
 #pragma link C++ class vector < CbmTrdDigi> + ;
 #pragma link C++ class vector < CbmTofDigi> + ;
+#pragma link C++ class vector < CbmTzdDigi> + ;
 #pragma link C++ class vector < CbmPsdDigi> + ;
 #pragma link C++ class vector < CbmPsdDsp> + ;
 #pragma link C++ class vector < CbmMatch> + ;
diff --git a/core/data/global/CbmTzdDigi.cxx b/core/data/global/CbmTzdDigi.cxx
new file mode 100644
index 0000000000..de9c0d515c
--- /dev/null
+++ b/core/data/global/CbmTzdDigi.cxx
@@ -0,0 +1,5 @@
+/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Volker Friese [committer] */
+
+#include "CbmTzdDigi.h"
diff --git a/core/data/global/CbmTzdDigi.h b/core/data/global/CbmTzdDigi.h
new file mode 100644
index 0000000000..d43ea4c63d
--- /dev/null
+++ b/core/data/global/CbmTzdDigi.h
@@ -0,0 +1,75 @@
+/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Volker Friese [committer] */
+
+
+#ifndef CBMTZDDIGI_H
+#define CBMTZDDIGI_H 1
+
+#include "CbmDefs.h"
+
+#include <cstdint>
+
+/** @class CbmTzdDigi
+ ** @brief Data class for a signal in the t-zero detector
+ **
+ ** The current implementation is a placeholder, storing just the event time. To be replaced
+ ** with a real detector measurement model once available.
+ **/
+class CbmTzdDigi {
+
+public:
+  /** @brief Constructor
+   ** @param time Measurement time [ns]
+   ** @param charge Measured charge]
+   **/
+  CbmTzdDigi(double time = -1., float charge = -1.) : fTime(time), fCharge(charge) {};
+
+
+  /** @brief Destructor **/
+  virtual ~CbmTzdDigi() {};
+
+
+  /** @brief Get the desired name of the branch for this objects in the cbm output tree  (static)
+   ** @return "BmonDigi"
+   **/
+  static const char* GetBranchName() { return "TzdDigi"; }
+
+
+  /** @brief Class name (static)
+   ** @return CbmTzdDigi
+   **/
+  static const char* GetClassName() { return "CbmTzdDigi"; }
+
+
+  /** @brief Charge
+   ** @return Charge
+   **/
+  double GetCharge() const { return fCharge; }
+
+
+  /** @brief Time
+   ** @return Time of measurement [ns]
+   **/
+  double GetTime() const { return fTime; }
+
+
+  /** @brief Set the measured charge
+   ** @param charge Charge
+   **/
+  void SetCharge(float charge) { fCharge = charge; }
+
+
+  /** @brief Set the measurement time
+   ** @param time Measurement time [ns]
+   **/
+  void SetTime(double time) { fTime = time; }
+
+
+private:
+  int32_t fAddress = ToIntegralType<ECbmModuleId>(ECbmModuleId::kT0);  ///< Unique CBM address
+  double fTime     = -1.;                                              ///< Time of signal in TZD [ns]
+  float fCharge    = -1.;                                              ///< Charge
+};
+
+#endif /* CBMTZDDIGI_H */
diff --git a/sim/detectors/CMakeLists.txt b/sim/detectors/CMakeLists.txt
index fed93c0fba..567a04c82f 100644
--- a/sim/detectors/CMakeLists.txt
+++ b/sim/detectors/CMakeLists.txt
@@ -7,4 +7,5 @@ add_subdirectory(rich)
 add_subdirectory(sts)
 add_subdirectory(tof)
 add_subdirectory(trd)
+add_subdirectory(tzd)
 
diff --git a/sim/detectors/tzd/CMakeLists.txt b/sim/detectors/tzd/CMakeLists.txt
new file mode 100644
index 0000000000..6edb78fbb9
--- /dev/null
+++ b/sim/detectors/tzd/CMakeLists.txt
@@ -0,0 +1,24 @@
+set(INCLUDE_DIRECTORIES
+  ${CMAKE_CURRENT_SOURCE_DIR}
+  )
+
+
+set(SRCS
+  CbmTzdDigitize.cxx
+  )
+
+
+set(LIBRARY_NAME CbmTzdSim)
+set(LINKDEF ${LIBRARY_NAME}LinkDef.h)
+set(PUBLIC_DEPENDENCIES
+  CbmBase
+  CbmData
+  )
+
+set(PRIVATE_DEPENDENCIES
+  ROOT::Core
+  ROOT::MathCore
+  )
+
+generate_cbm_library()
+
diff --git a/sim/detectors/tzd/CbmTzdDigitize.cxx b/sim/detectors/tzd/CbmTzdDigitize.cxx
new file mode 100644
index 0000000000..8ac5c8b765
--- /dev/null
+++ b/sim/detectors/tzd/CbmTzdDigitize.cxx
@@ -0,0 +1,103 @@
+/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Volker Friese [committer] */
+
+/** @file CbmTzdDigitize.cxx
+ ** @author Volker Friese <v.friese@gsi.de>
+ ** @date 07.11.2022
+ **/
+
+#include "CbmTzdDigitize.h"
+
+#include <Logger.h>
+
+#include <TRandom.h>
+#include <TStopwatch.h>
+
+#include <iomanip>
+
+using std::fixed;
+using std::left;
+using std::setprecision;
+using std::setw;
+
+
+// -----   Standard constructor   ------------------------------------------
+CbmTzdDigitize::CbmTzdDigitize(double sigma) : CbmDigitize<CbmTzdDigi>("TzdDigitize"), fResolution(sigma) {}
+// -------------------------------------------------------------------------
+
+
+// -----   Destructor   ----------------------------------------------------
+CbmTzdDigitize::~CbmTzdDigitize() {}
+// -------------------------------------------------------------------------
+
+
+// -----   Task execution   ------------------------------------------------
+void CbmTzdDigitize::Exec(Option_t*)
+{
+
+  // --- Start timer and reset counters
+  TStopwatch timer;
+  timer.Start();
+
+  // --- Get event time
+  GetEventInfo();
+
+  // --- Create digi and send it to DAQ
+  double digiTime  = fCurrentEventTime + gRandom->Gaus(0., fResolution);
+  double charge    = 1.;  // Placeholder
+  CbmTzdDigi* digi = new CbmTzdDigi(digiTime, charge);
+  if (fCreateMatches) {
+    CbmMatch* digiMatch = new CbmMatch();
+    SendData(digiTime, digi, digiMatch);
+  }
+  else
+    SendData(digiTime, digi);
+
+  // --- Event log
+  LOG(info) << left << setw(15) << GetName() << "[" << fixed << setprecision(3) << timer.RealTime() << " s]"
+            << " event time: " << fCurrentEventTime << " ns, measurement time " << digiTime << " ns";
+
+  // --- Monitor
+  timer.Stop();
+  fNofEvents++;
+  fTimeTot += timer.RealTime();
+}
+// -------------------------------------------------------------------------
+
+
+// -----   Finish run    ---------------------------------------------------
+void CbmTzdDigitize::Finish()
+{
+  std::cout << std::endl;
+  LOG(info) << "=====================================";
+  LOG(info) << GetName() << ": Run summary";
+  LOG(info) << "Events processed       : " << fNofEvents;
+  LOG(info) << "Real time per event    : " << fTimeTot / Double_t(fNofEvents) << " s";
+  LOG(info) << "=====================================";
+}
+// -------------------------------------------------------------------------
+
+
+// -----   Initialisation    -----------------------------------------------
+InitStatus CbmTzdDigitize::Init()
+{
+  std::cout << std::endl;
+  LOG(info) << "==========================================================";
+  LOG(info) << GetName() << ": Initialisation";
+  LOG(info) << "Time resolution is " << fResolution << " [ns]";
+  RegisterOutput();
+  LOG(info) << GetName() << ": Initialisation successful";
+  LOG(info) << "==========================================================";
+  std::cout << std::endl;
+  return kSUCCESS;
+}
+// -------------------------------------------------------------------------
+
+
+// -----   Private method ReInit   -----------------------------------------
+InitStatus CbmTzdDigitize::ReInit() { return kSUCCESS; }
+// -------------------------------------------------------------------------
+
+
+ClassImp(CbmTzdDigitize)
diff --git a/sim/detectors/tzd/CbmTzdDigitize.h b/sim/detectors/tzd/CbmTzdDigitize.h
new file mode 100644
index 0000000000..b4ec862cbc
--- /dev/null
+++ b/sim/detectors/tzd/CbmTzdDigitize.h
@@ -0,0 +1,78 @@
+/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Volker Friese [committer] */
+
+/** @file CbmBmonDigitize.h
+ ** @author Volker Friese <v.friese@gsi.de>
+ ** @date 07.11.2022
+ **/
+
+#ifndef CBMTZDDIGITIZE_H
+#define CBMTZDDIGITIZE_H 1
+
+#include "CbmDefs.h"
+#include "CbmDigitize.h"
+#include "CbmTzdDigi.h"
+
+#include <Rtypes.h>
+
+
+/** @class CbmTzdDigitize
+ ** @brief Task class for simulating the detector response of the t-zero detector
+ ** @author Volker Friese <v.friese@gsi.de>
+ ** @since 07.11.2022
+ ** @version 1.0
+ **
+ ** The current implementation of the TZD simulation is a placeholder until a realistic
+ ** detector response model is available. It smears the MC event time with a Gaussian resolution.
+ **/
+class CbmTzdDigitize : public CbmDigitize<CbmTzdDigi> {
+
+public:
+  /** Constructor **/
+  CbmTzdDigitize(double resolution = 0.025);
+
+
+  /** Destructor **/
+  virtual ~CbmTzdDigitize();
+
+
+  /** @brief Detector system ID
+   ** @return kT0
+   **/
+  ECbmModuleId GetSystemId() const { return ECbmModuleId::kT0; }
+
+
+  /** Execution **/
+  virtual void Exec(Option_t* opt);
+
+
+  /** Re-initialisation **/
+  virtual InitStatus ReInit();
+
+
+  /** Set the time resolution **/
+  void SetResolution(double sigma) { fResolution = sigma; }
+
+
+private:
+  // --- Parameters
+  double fResolution = 0.025;  ///< Time resolution [ns]
+
+  // --- Run counters
+  size_t fNofEvents = 0;   ///< Total number of procesed events
+  Double_t fTimeTot = 0.;  ///< Total execution time
+
+
+  /** End-of-run action **/
+  virtual void Finish();
+
+
+  /** Initialisation **/
+  virtual InitStatus Init();
+
+
+  ClassDef(CbmTzdDigitize, 1);
+};
+
+#endif
diff --git a/sim/detectors/tzd/CbmTzdSimLinkDef.h b/sim/detectors/tzd/CbmTzdSimLinkDef.h
new file mode 100644
index 0000000000..f013780b35
--- /dev/null
+++ b/sim/detectors/tzd/CbmTzdSimLinkDef.h
@@ -0,0 +1,14 @@
+/* Copyright (C) 2022 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Volker Friese [committer] */
+
+#ifdef __CINT__
+
+#pragma link off all globals;
+#pragma link off all classes;
+#pragma link off all functions;
+
+#pragma link C++ class CbmDigitize < CbmTzdDigi> + ;
+#pragma link C++ class CbmTzdDigitize + ;
+
+#endif /* __CINT__ */
diff --git a/sim/response/CMakeLists.txt b/sim/response/CMakeLists.txt
index dc7028155e..86185d5aa2 100644
--- a/sim/response/CMakeLists.txt
+++ b/sim/response/CMakeLists.txt
@@ -29,6 +29,7 @@ set(PRIVATE_DEPENDENCIES
   CbmStsSim
   CbmTofSim
   CbmTrdSim
+  CbmTzdSim
   FairRoot::FairTools
   FairRoot::ParBase
   )
diff --git a/sim/response/base/CbmDigitization.cxx b/sim/response/base/CbmDigitization.cxx
index 641599131c..5109b7f44c 100644
--- a/sim/response/base/CbmDigitization.cxx
+++ b/sim/response/base/CbmDigitization.cxx
@@ -19,6 +19,7 @@
 #include "CbmStsDigitize.h"
 #include "CbmTofDigitize.h"
 #include "CbmTrdDigitizer.h"
+#include "CbmTzdDigitize.h"
 
 #include "FairFileSource.h"
 #include "FairMCEventHeader.h"
@@ -151,8 +152,8 @@ Int_t CbmDigitization::CreateDefaultDigitizers()
     // --- Skip if marked inactive
     if (!it->second->IsActive()) continue;
 
-    // --- Skip if MC data branch is not present
-    if (!it->second->IsPresent()) continue;
+    // --- Skip if MC data branch is not present. Exception: BMON does not need an input branch.
+    if (it->first != ECbmModuleId::kT0 && !it->second->IsPresent()) continue;
 
     // --- Skip if a digitizer was set explicitly
     if (it->second->GetDigitizer() != nullptr) continue;
@@ -202,6 +203,11 @@ Int_t CbmDigitization::CreateDefaultDigitizers()
         ss << "PSD ";
         nDigis++;
         break;
+      case ECbmModuleId::kT0:
+        fDigitizers[system]->SetDigitizer(new CbmTzdDigitize());
+        ss << "BMON ";
+        nDigis++;
+        break;
       default: LOG(fatal) << fName << ": Unknown system " << system; break;
     }  //? system
   }    //# present systems
@@ -491,6 +497,7 @@ void CbmDigitization::SetDefaultBranches()
   fDigitizers[ECbmModuleId::kTrd]  = new CbmDigitizeInfo(ECbmModuleId::kTrd, "TrdPoint");
   fDigitizers[ECbmModuleId::kTof]  = new CbmDigitizeInfo(ECbmModuleId::kTof, "TofPoint");
   fDigitizers[ECbmModuleId::kPsd]  = new CbmDigitizeInfo(ECbmModuleId::kPsd, "PsdPoint");
+  fDigitizers[ECbmModuleId::kT0]   = new CbmDigitizeInfo(ECbmModuleId::kT0, "");
 }
 // --------------------------------------------------------------------------
 
-- 
GitLab