gdynamicDigitization
Loading...
Searching...
No Matches
gdynamicdigitization.h
Go to the documentation of this file.
1#pragma once
2
3#include "greadoutSpecs.h"
4#include "gfactory_options.h"
5
6// gemc
7#include "gfactory.h"
8#include "gtouchable.h"
9#include "ghit.h"
10#include "gDigitizedData.h"
11#include "gTrueInfoData.h"
12#include "gtranslationTable.h"
14
15// c++
16#include <utility>
17#include <vector>
18#include <bitset>
19#include <map>
20#include <string>
21#include <optional>
22
23// geant4
24#include "G4Step.hh"
25
41public:
50 explicit GTouchableModifiers(const std::vector<std::string> &touchableNames);
51
52private:
61 std::map<std::string, std::vector<double> > modifierWeightsMap;
62
71 std::map<std::string, std::vector<double> > modifierWeightsAndTimesMap;
72
73public:
81 void insertIdAndWeight(const std::string &touchableName, int idValue, double weight);
82
91 void insertIdWeightAndTime(const std::string &touchableName, int idValue, double weight, double time);
92
102 void assignOverallWeight(const std::string &touchableName, double totalWeight);
103
113 [[nodiscard]] inline bool isWeightsOnly() const { return !modifierWeightsMap.empty(); }
114
124 inline std::vector<double> getModifierWeightsVector(const std::string &touchableName) {
125 return modifierWeightsMap[touchableName];
126 }
127
137 inline std::vector<double> getModifierWeightsAndTimeVector(const std::string &touchableName) {
138 return modifierWeightsAndTimesMap[touchableName];
139 }
140};
141
147
148inline constexpr const char *to_string(CollectionMode mode) {
149 switch (mode) {
150 case event: return "event";
151 case run: return "run";
152 case frame: return "frame";
153 }
154 return "unknown";
155}
156
173class GDynamicDigitization : public GBase<GDynamicDigitization> {
174public:
180 explicit GDynamicDigitization(const std::shared_ptr<GOptions> &g) : GBase(g, GDIGITIZATION_LOGGER) {
181 recordZeroEdep = g->getSwitch("recordZeroEdep");
182 }
183
185 ~GDynamicDigitization() override = default;
186
187 [[nodiscard]] virtual CollectionMode collection_mode() const { return CollectionMode::event; }
188
199 [[nodiscard]] double processStepTime(const std::shared_ptr<GTouchable> &gTouchID,
200 [[maybe_unused]] G4Step *thisStep) {
203 return processStepTimeImpl(gTouchID, thisStep);
204 }
205
215 [[nodiscard]] virtual double processStepTimeImpl(const std::shared_ptr<GTouchable> &gTouchID,
216 [[maybe_unused]] G4Step *thisStep);
217
218 [[nodiscard]] std::vector<std::string> variables_to_normalize() {
220
222
224 }
225
226
227 [[nodiscard]] virtual std::vector<std::string> variables_to_normalizeImpl() {
228 std::vector<std::string> variables;
229 return variables;
230 }
231
232
244 [[nodiscard]] std::vector<std::shared_ptr<GTouchable> > processTouchable(
245 std::shared_ptr<GTouchable> gtouchable, G4Step *thisStep) {
248 return processTouchableImpl(std::move(gtouchable), thisStep);
249 }
250
258 [[nodiscard]] virtual std::vector<std::shared_ptr<GTouchable> > processTouchableImpl(
259 std::shared_ptr<GTouchable> gtouchable, G4Step *thisStep);
260
270 [[nodiscard]] std::vector<std::shared_ptr<GTouchable> > processGTouchableModifiers(
271 const std::shared_ptr<GTouchable> &gTouchID, const GTouchableModifiers &gmods) {
274 return processGTouchableModifiersImpl(gTouchID, gmods);
275 }
276
286 virtual std::vector<std::shared_ptr<GTouchable> > processGTouchableModifiersImpl(
287 [[maybe_unused]] const std::shared_ptr<GTouchable> &gTouchID,
288 [[maybe_unused]] const GTouchableModifiers &gmods);
289
299 [[nodiscard]] std::unique_ptr<GTrueInfoData> collectTrueInformation(GHit *ghit, size_t hitn) {
301 log->info(2, "GDynamicDigitization::collect true information for hit number ", hitn, " with size ",
302 ghit->nsteps(), " steps");
303 return collectTrueInformationImpl(ghit, hitn);
304 }
305
313 [[nodiscard]] virtual std::unique_ptr<GTrueInfoData> collectTrueInformationImpl(GHit *ghit, size_t hitn);
314
324 [[nodiscard]] std::unique_ptr<GDigitizedData> digitizeHit(GHit *ghit, [[maybe_unused]] size_t hitn) {
326 log->info(2, "GDynamicDigitization::digitize hit number ", hitn, " with size ", ghit->nsteps(), " steps");
327 return digitizeHitImpl(ghit, hitn);
328 }
329
339 [[nodiscard]] virtual std::unique_ptr<GDigitizedData> digitizeHitImpl(
340 [[maybe_unused]] GHit *ghit, [[maybe_unused]] size_t hitn) { return nullptr; }
341
351 [[nodiscard]] bool loadConstants([[maybe_unused]] int runno, [[maybe_unused]] std::string const &variation) {
353 log->debug(NORMAL, "GDynamicDigitization::load constants");
354 return loadConstantsImpl(runno, variation);
355 }
356
366 virtual bool loadConstantsImpl([[maybe_unused]] int runno, [[maybe_unused]] std::string const &variation) {
367 return true;
368 }
369
379 [[nodiscard]] bool loadTT([[maybe_unused]] int runno, [[maybe_unused]] std::string const &variation) {
381 log->debug(NORMAL, "GDynamicDigitization::load Translation Table for run ", runno, " with variation ",
382 variation);
383 return loadTTImpl(runno, variation);
384 }
385
395 virtual bool loadTTImpl([[maybe_unused]] int runno, [[maybe_unused]] std::string const &variation) { return true; }
396
409 void chargeAndTimeAtHardware(int time, int q, const GHit *ghit, GDigitizedData &gdata);
410
418 [[nodiscard]] bool defineReadoutSpecs() {
420 log->debug(NORMAL, "GDynamicDigitization::define readout specs");
421 return defineReadoutSpecsImpl();
422 };
423
431 virtual bool defineReadoutSpecsImpl() = 0;
432
434 std::shared_ptr<const GReadoutSpecs> readoutSpecs;
435
437 std::shared_ptr<const GTranslationTable> translationTable;
438
448 static GDynamicDigitization *instantiate(const dlhandle h, std::shared_ptr<GOptions> g) {
449 if (!h) return nullptr;
450 using fptr = GDynamicDigitization* (*)(std::shared_ptr<GOptions>);
451
452 auto sym = dlsym(h, "GDynamicDigitizationFactory");
453 if (!sym) return nullptr;
454
455 auto func = reinterpret_cast<fptr>(sym);
456 return func(g);
457 }
458
468 virtual bool decisionToSkipHit(double energy) {
469 if (energy == 0 && !recordZeroEdep) {
470 return true;
471 }
472 return false;
473 }
474
483 // TODO: REMOVE THIS EVERYWHERE also remove check_if_log_defined
484 void set_loggers(const std::shared_ptr<GOptions> &g) { gopts = g; }
485
486private:
488 bool recordZeroEdep = false;
489
490protected:
492 std::shared_ptr<GOptions> gopts;
493
499 void check_if_log_defined() const {
500 if (gopts == nullptr) {
501 std::cerr << KRED
502 << "Fatal Error: GDynamicDigitization: goption is not set for this plugin or one of the loggers is null."
503 << std::endl;
504 std::cerr << "The set_loggers function needs to be called." << std::endl;
505 std::cerr << "For example: dynamicRoutines[\"ctof\"]->set_loggers(gopts);" << std::endl;
506 std::cerr << RST << std::endl;
507 exit(1);
508 }
509 }
510};
511
513 using dRoutinesMap = std::unordered_map<std::string, std::shared_ptr<GDynamicDigitization> >;
514
522 inline std::shared_ptr<GDynamicDigitization> load_dynamicRoutine(const std::string &plugin_name,
523 const std::shared_ptr<GOptions> &gopts) {
524 GManager manager(gopts);
526 }
527
538 inline std::shared_ptr<const dRoutinesMap> dynamicRoutinesMap(const std::vector<std::string> &plugin_names,
539 const std::shared_ptr<GOptions> &gopts) {
540 auto log = std::make_shared<GLogger>(gopts, SFUNCTION_NAME, GDIGITIZATION_LOGGER);
541 GManager manager(gopts);
542
543 auto routines = std::make_shared<dRoutinesMap>();
544
545 for (const auto &plugin: plugin_names) {
546 routines->emplace(plugin, manager.LoadAndRegisterObjectFromLibrary<GDynamicDigitization>(plugin, gopts));
547 log->info(0, "dynamicRoutinesMap[", plugin, "]: ", (*routines)[plugin]);
548 }
549
550 return routines;
551 }
552} // namespace gdynamicdigitization
std::shared_ptr< GLogger > log
Abstract base class for dynamically loaded digitization plugins.
virtual CollectionMode collection_mode() const
std::shared_ptr< GOptions > gopts
Options used by the digitization plugin instance.
virtual bool defineReadoutSpecsImpl()=0
Implementation hook to define readout specs.
std::vector< std::string > variables_to_normalize()
bool loadConstants(int runno, std::string const &variation)
Loads digitization constants (calibration/configuration).
~GDynamicDigitization() override=default
Virtual destructor.
virtual std::unique_ptr< GTrueInfoData > collectTrueInformationImpl(GHit *ghit, size_t hitn)
Implementation hook for true-information collection.
GDynamicDigitization(const std::shared_ptr< GOptions > &g)
Constructs the digitization base object.
bool loadTT(int runno, std::string const &variation)
Loads the translation table (identity -> electronics address).
double processStepTime(const std::shared_ptr< GTouchable > &gTouchID, G4Step *thisStep)
Computes the time associated with a simulation step for electronics binning.
virtual std::vector< std::shared_ptr< GTouchable > > processGTouchableModifiersImpl(const std::shared_ptr< GTouchable > &gTouchID, const GTouchableModifiers &gmods)
Implementation hook for touchable modifier application.
void check_if_log_defined() const
Ensures options/logging are configured before plugin methods run.
virtual double processStepTimeImpl(const std::shared_ptr< GTouchable > &gTouchID, G4Step *thisStep)
Implementation hook for step time computation.
std::unique_ptr< GTrueInfoData > collectTrueInformation(GHit *ghit, size_t hitn)
Collects standardized “true hit information” into a GTrueInfoData record.
std::shared_ptr< const GTranslationTable > translationTable
Translation table is typically loaded during initialization and treated as immutable.
std::vector< std::shared_ptr< GTouchable > > processTouchable(std::shared_ptr< GTouchable > gtouchable, G4Step *thisStep)
Processes a touchable based on the current step and readout specs.
static GDynamicDigitization * instantiate(const dlhandle h, std::shared_ptr< GOptions > g)
Dynamically instantiates a plugin instance from a dynamic library.
virtual std::vector< std::shared_ptr< GTouchable > > processTouchableImpl(std::shared_ptr< GTouchable > gtouchable, G4Step *thisStep)
Implementation hook for touchable processing.
std::shared_ptr< const GReadoutSpecs > readoutSpecs
Readout specs are created during initialization and treated as immutable.
virtual std::vector< std::string > variables_to_normalizeImpl()
virtual bool loadTTImpl(int runno, std::string const &variation)
Implementation hook for translation table loading.
void set_loggers(const std::shared_ptr< GOptions > &g)
Sets the options pointer required by the digitization base.
virtual std::unique_ptr< GDigitizedData > digitizeHitImpl(GHit *ghit, size_t hitn)
Implementation hook for hit digitization.
virtual bool decisionToSkipHit(double energy)
Decides whether a hit should be skipped based on deposited energy.
std::unique_ptr< GDigitizedData > digitizeHit(GHit *ghit, size_t hitn)
Digitizes a hit into a GDigitizedData record.
void chargeAndTimeAtHardware(int time, int q, const GHit *ghit, GDigitizedData &gdata)
Adds hardware-level time/charge and address fields to a digitized record.
virtual bool loadConstantsImpl(int runno, std::string const &variation)
Implementation hook for constant loading.
std::vector< std::shared_ptr< GTouchable > > processGTouchableModifiers(const std::shared_ptr< GTouchable > &gTouchID, const GTouchableModifiers &gmods)
Applies touchable modifiers.
bool defineReadoutSpecs()
Initializes readout specifications.
size_t nsteps() const
void debug(debug_type type, Args &&... args) const
void info(int level, Args &&... args) const
std::shared_ptr< T > LoadAndRegisterObjectFromLibrary(std::string_view name, const std::shared_ptr< GOptions > &gopts)
Helper container for representing touchable “modifier” information.
void insertIdAndWeight(const std::string &touchableName, int idValue, double weight)
Inserts a new (id, weight) pair for the specified touchable.
std::vector< double > getModifierWeightsVector(const std::string &touchableName)
Returns the weights vector for a touchable.
std::vector< double > getModifierWeightsAndTimeVector(const std::string &touchableName)
Returns the weights-and-times vector for a touchable.
bool isWeightsOnly() const
Returns whether the container currently reports weights-only modifiers.
void insertIdWeightAndTime(const std::string &touchableName, int idValue, double weight, double time)
Inserts a new (id, weight, time) triplet for the specified touchable.
void assignOverallWeight(const std::string &touchableName, double totalWeight)
Normalizes modifier weights by dividing by a provided total.
GTouchableModifiers(const std::vector< std::string > &touchableNames)
Constructs the container and declares supported touchable names.
void * dlhandle
constexpr const char * to_string(CollectionMode mode)
Options for the GDynamicDigitization module.
constexpr const char * GDIGITIZATION_LOGGER
Logger name used by this module.
#define FUNCTION_NAME
#define SFUNCTION_NAME
NORMAL
Readout electronics specifications used by time-binning and hit organization.
const std::string plugin_name
#define KRED
#define RST
std::shared_ptr< GDynamicDigitization > load_dynamicRoutine(const std::string &plugin_name, const std::shared_ptr< GOptions > &gopts)
Loads a single dynamic routine and returns it.
std::unordered_map< std::string, std::shared_ptr< GDynamicDigitization > > dRoutinesMap
std::shared_ptr< const dRoutinesMap > dynamicRoutinesMap(const std::vector< std::string > &plugin_names, const std::shared_ptr< GOptions > &gopts)
Loads multiple dynamic routines and returns an immutable shared map.