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