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
41{
42public:
51 explicit GTouchableModifiers(const std::vector<std::string>& touchableNames);
52
53private:
62 std::map<std::string, std::vector<double>> modifierWeightsMap;
63
72 std::map<std::string, std::vector<double>> modifierWeightsAndTimesMap;
73
74public:
82 void insertIdAndWeight(const std::string& touchableName, int idValue, double weight);
83
92 void insertIdWeightAndTime(const std::string& touchableName, int idValue, double weight, double time);
93
103 void assignOverallWeight(const std::string& touchableName, double totalWeight);
104
114 [[nodiscard]] inline bool isWeightsOnly() const { return !modifierWeightsMap.empty(); }
115
125 inline std::vector<double> getModifierWeightsVector(const std::string& touchableName) {
126 return modifierWeightsMap[touchableName];
127 }
128
138 inline std::vector<double> getModifierWeightsAndTimeVector(const std::string& touchableName) {
139 return modifierWeightsAndTimesMap[touchableName];
140 }
141};
142
149
150inline constexpr const char* to_string(CollectionMode mode)
151{
152 switch (mode) {
153 case event: return "event";
154 case run: return "run";
155 case frame: return "frame";
156 }
157 return "unknown";
158}
159
176class GDynamicDigitization : public GBase<GDynamicDigitization>
177{
178public:
184 explicit GDynamicDigitization(const std::shared_ptr<GOptions>& g) : GBase(g, GDIGITIZATION_LOGGER) {
185 }
186
188 virtual ~GDynamicDigitization() = default;
189
191
202 [[nodiscard]] double processStepTime(const std::shared_ptr<GTouchable>& gTouchID,
203 [[maybe_unused]] G4Step* thisStep) {
206 return processStepTimeImpl(gTouchID, thisStep);
207 }
208
218 [[nodiscard]] virtual double processStepTimeImpl(const std::shared_ptr<GTouchable>& gTouchID,
219 [[maybe_unused]] G4Step* thisStep);
220
221 [[nodiscard]] std::vector<std::string> variables_to_normalize() {
223
225
227 }
228
229
230 [[nodiscard]] virtual std::vector<std::string> variables_to_normalizeImpl() {
231 std::vector<std::string> variables;
232 return variables;
233 }
234
235
247 [[nodiscard]] std::vector<std::shared_ptr<GTouchable>> processTouchable(
248 std::shared_ptr<GTouchable> gtouchable, G4Step* thisStep) {
251 return processTouchableImpl(std::move(gtouchable), thisStep);
252 }
253
261 [[nodiscard]] virtual std::vector<std::shared_ptr<GTouchable>> processTouchableImpl(
262 std::shared_ptr<GTouchable> gtouchable, G4Step* thisStep);
263
273 [[nodiscard]] std::vector<std::shared_ptr<GTouchable>> processGTouchableModifiers(
274 const std::shared_ptr<GTouchable>& gTouchID, const GTouchableModifiers& gmods) {
277 return processGTouchableModifiersImpl(gTouchID, gmods);
278 }
279
289 virtual std::vector<std::shared_ptr<GTouchable>> processGTouchableModifiersImpl(
290 [[maybe_unused]] const std::shared_ptr<GTouchable>& gTouchID,
291 [[maybe_unused]] const GTouchableModifiers& gmods);
292
302 [[nodiscard]] std::unique_ptr<GTrueInfoData> collectTrueInformation(GHit* ghit, size_t hitn) {
304 log->info(2, "GDynamicDigitization::collect true information for hit number ", hitn, " with size ",
305 ghit->nsteps(), " steps");
306 return collectTrueInformationImpl(ghit, hitn);
307 }
308
316 [[nodiscard]] virtual std::unique_ptr<GTrueInfoData> collectTrueInformationImpl(GHit* ghit, size_t hitn);
317
327 [[nodiscard]] std::unique_ptr<GDigitizedData> digitizeHit(GHit* ghit, [[maybe_unused]] size_t hitn) {
329 log->info(2, "GDynamicDigitization::digitize hit number ", hitn, " with size ", ghit->nsteps(), " steps");
330 return digitizeHitImpl(ghit, hitn);
331 }
332
342 [[nodiscard]] virtual std::unique_ptr<GDigitizedData> digitizeHitImpl(
343 [[maybe_unused]] GHit* ghit, [[maybe_unused]] size_t hitn) { return nullptr; }
344
354 [[nodiscard]] bool loadConstants([[maybe_unused]] int runno, [[maybe_unused]] std::string const& variation) {
356 log->debug(NORMAL, "GDynamicDigitization::load constants");
357 return loadConstantsImpl(runno, variation);
358 }
359
369 virtual bool loadConstantsImpl([[maybe_unused]] int runno, [[maybe_unused]] std::string const& variation) {
370 return true;
371 }
372
382 [[nodiscard]] bool loadTT([[maybe_unused]] int runno, [[maybe_unused]] std::string const& variation) {
384 log->debug(NORMAL, "GDynamicDigitization::load Translation Table for run ", runno, " with variation ",
385 variation);
386 return loadTTImpl(runno, variation);
387 }
388
398 virtual bool loadTTImpl([[maybe_unused]] int runno, [[maybe_unused]] std::string const& variation) { return true; }
399
412 void chargeAndTimeAtHardware(int time, int q, const GHit* ghit, GDigitizedData& gdata);
413
421 [[nodiscard]] bool defineReadoutSpecs() {
423 log->debug(NORMAL, "GDynamicDigitization::define readout specs");
424 return defineReadoutSpecsImpl();
425 };
426
434 virtual bool defineReadoutSpecsImpl() = 0;
435
437 std::shared_ptr<const GReadoutSpecs> readoutSpecs;
438
440 std::shared_ptr<const GTranslationTable> translationTable;
441
451 static GDynamicDigitization* instantiate(const dlhandle h, std::shared_ptr<GOptions> g) {
452 if (!h) return nullptr;
453 using fptr = GDynamicDigitization* (*)(std::shared_ptr<GOptions>);
454
455 auto sym = dlsym(h, "GDynamicDigitizationFactory");
456 if (!sym) return nullptr;
457
458 auto func = reinterpret_cast<fptr>(sym);
459 return func(g);
460 }
461
471 virtual bool decisionToSkipHit(double energy) {
472 if (energy == 0 && !recordZeroEdep) {
473 return true;
474 }
475 return false;
476 }
477
486 // TODO: REMOVE THIS EVERYWHERE also remove check_if_log_defined
487 void set_loggers(const std::shared_ptr<GOptions>& g) { gopts = g; }
488
489private:
491 bool recordZeroEdep = false;
492
493protected:
495 std::shared_ptr<GOptions> gopts;
496
502 void check_if_log_defined() const {
503 if (gopts == nullptr) {
504 std::cerr << KRED
505 << "Fatal Error: GDynamicDigitization: goption is not set for this plugin or one of the loggers is null."
506 << std::endl;
507 std::cerr << "The set_loggers function needs to be called." << std::endl;
508 std::cerr << "For example: dynamicRoutines[\"ctof\"]->set_loggers(gopts);" << std::endl;
509 std::cerr << RST << std::endl;
510 exit(1);
511 }
512 }
513};
514
516 using dRoutinesMap = std::unordered_map<std::string, std::shared_ptr<GDynamicDigitization>>;
517
525 inline std::shared_ptr<GDynamicDigitization> load_dynamicRoutine(const std::string& plugin_name,
526 const std::shared_ptr<GOptions>& gopts) {
527 GManager manager(gopts);
529 }
530
541 inline std::shared_ptr<const dRoutinesMap> dynamicRoutinesMap(const std::vector<std::string>& plugin_names,
542 const std::shared_ptr<GOptions>& gopts) {
543 auto log = std::make_shared<GLogger>(gopts, SFUNCTION_NAME, GDIGITIZATION_LOGGER);
544 GManager manager(gopts);
545
546 auto routines = std::make_shared<dRoutinesMap>();
547
548 for (const auto& plugin : plugin_names) {
549 routines->emplace(plugin, manager.LoadAndRegisterObjectFromLibrary<GDynamicDigitization>(plugin, gopts));
550 log->info(0, "dynamicRoutinesMap[", plugin, "]: ", (*routines)[plugin]);
551 }
552
553 return routines;
554 }
555} // 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 ~GDynamicDigitization()=default
Virtual destructor.
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).
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::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.
std::unordered_map< std::string, std::shared_ptr< GDynamicDigitization > > dRoutinesMap