4#include <gemc/gbase/gbase.h>
12#include <CLHEP/Units/SystemOfUnits.h>
65 default:
return "unknown-gtouchable";
89 GIdentifier(
const std::string& n,
int v) : idName{n}, idValue{v} {
106 [[nodiscard]]
inline std::string
getName()
const {
return idName; }
112 [[nodiscard]]
inline int getValue()
const {
return idValue; }
167 GTouchable(
const std::shared_ptr<GOptions>& gopt,
168 const std::string& digitization,
169 const std::string& gidentityString,
170 const std::vector<double>& dimensions,
186 GTouchable(
const std::shared_ptr<GLogger>& logger,
187 const std::string& digitization,
188 const std::string& gidentityString,
189 const std::vector<double>& dimensions,
204 GTouchable(
const std::shared_ptr<GTouchable>& base,
int newTimeIndex)
207 gidentity(base->gidentity),
208 trackId(base->trackId),
209 eMultiplier(base->eMultiplier),
210 stepTimeAtElectronicsIndex(newTimeIndex) {
277 [[nodiscard]]
inline std::vector<GIdentifier>
getIdentity()
const {
return gidentity; }
280 inline void setIdentityValue(
size_t index,
int value) { gidentity.at(index).setValue(value); }
291 std::string idString;
292 for (
const auto&
id : gidentity) { idString +=
id.getName() +
": " + std::to_string(
id.getValue()) +
" "; }
310 [[nodiscard]]
inline double getMass()
const {
return mass; }
322 for (
const auto& gt : v) {
324 log->
info(2,
"GTouchable",
this,
" exists in vector.");
328 log->
info(2,
"GTouchable",
this,
" does not exist in vector.");
343 static std::shared_ptr<GTouchable>
create(
const std::shared_ptr<GOptions>& gopt) {
344 int touchableNumber = globalGTouchableCounter.fetch_add(1, std::memory_order_relaxed);
345 int sector = ( touchableNumber % 6 ) + 1;
346 int paddle = ( touchableNumber % 20 ) + 1;
347 std::string identity =
"sector: " + std::to_string(sector) +
", paddle: " + std::to_string(paddle);
348 const auto& dimensions = {10.0, 20.0, 30.0};
349 const double& mass = 100 * CLHEP::g;
351 return std::make_shared<GTouchable>(gopt,
"readout", identity, dimensions, mass);
364 static std::shared_ptr<GTouchable>
create(
const std::shared_ptr<GLogger>& logger) {
365 int touchableNumber = globalGTouchableCounter.fetch_add(1, std::memory_order_relaxed);
366 int sector = ( touchableNumber % 6 ) + 1;
367 int paddle = ( touchableNumber % 20 ) + 1;
368 std::string identity =
"sector: " + std::to_string(sector) +
", paddle: " + std::to_string(paddle);
369 const auto& dimensions = {10.0, 20.0, 30.0};
370 const double& mass = 100 * CLHEP::g;
372 return std::make_shared<GTouchable>(logger,
"readout", identity, dimensions, mass);
377 std::vector<GIdentifier> gidentity;
381 int stepTimeAtElectronicsIndex;
382 std::vector<double> detectorDimensions;
389 static std::atomic<int> globalGTouchableCounter;
std::shared_ptr< GLogger > log
void debug(debug_type type, Args &&... args) const
void info(int level, Args &&... args) const
Represents a touchable sensitive detector element used as a hit-collection discriminator.
GTouchable(const GTouchable &)=default
static std::shared_ptr< GTouchable > create(const std::shared_ptr< GOptions > &gopt)
Creates a synthetic readout touchable for testing (options-based).
std::vector< GIdentifier > getIdentity() const
Returns a copy of the identity vector.
~GTouchable()
Destructor with debug trace.
void assignPId(int p)
Assigns the particle id used by particle counter discrimination.
bool operator==(const GTouchable >ouchable) const
Compares two GTouchable instances using the module comparison semantics.
void assignTrackId(int tid)
Assigns the track id used by flux and dosimeter discrimination.
void setIdentityValue(size_t index, int value)
Overwrites the value of the identity element at index. Throws std::out_of_range if out of bounds.
void assignStepTimeAtElectronicsIndex(int timeIndex)
Assigns the electronics time-cell index used by readout discrimination.
friend std::ostream & operator<<(std::ostream &stream, const GTouchable >ouchable)
Stream output helper used in logs and diagnostics.
double getEnergyMultiplier() const
Returns the energy multiplier used for energy sharing.
static std::shared_ptr< GTouchable > create(const std::shared_ptr< GLogger > &logger)
Creates a synthetic readout touchable for testing (logger-based).
GTouchable & operator=(const GTouchable &)=default
double getMass() const
Returns the mass of the sensitive g4volume.
int getStepTimeAtElectronicsIndex() const
Returns the electronics time-cell index.
bool exists_in_vector(const std::vector< GTouchable > &v) const
Checks whether this touchable exists in a vector using operator== semantics.
std::string getIdentityString() const
Builds a human-readable identity string from the stored identifiers.
std::vector< double > getDetectorDimensions() const
Returns the detector dimensions stored at construction time.
GTouchable(const std::shared_ptr< GTouchable > &base, int newTimeIndex)
Copy constructor that preserves identity but updates the electronics time-cell index.
Conventions and constants used by the gtouchable module.
#define INTEGRAL_COUNTERNAME
Digitization type name for integral_counter.
#define FLUXNAME
Digitization type name for flux-like detectors.
#define DOSIMETERNAME
Digitization type name for dosimeters.
#define COUNTERNAME
Digitization type name for simple particle counters.
#define GPHOTON_DETECTORNAME
Digitization type name for optical-photon flux detectors.
GTouchableType
Enumeration representing the type of a touchable sensitive element.
Options definition entry point for the gtouchable module.
const char * to_string(GTouchableType t)
Converts a GTouchableType value to a stable string for logging.
A single (name,value) identifier element used to build a touchable identity vector.
GIdentifier(const std::string &n, int v)
Constructs a GIdentifier.
friend std::ostream & operator<<(std::ostream &stream, const GIdentifier &gidentifier)
Stream output helper used in logs and diagnostics.
std::string getName() const
Returns the identifier name.
bool operator==(const GIdentifier &gid) const
Compares identifiers by value only.
int getValue() const
Returns the identifier value.
void setValue(int v)
Sets the identifier value. Used by digitization plugins that recompute the wire/layer address.