ghit
Loading...
Searching...
No Matches
calculations.cc
Go to the documentation of this file.
1// ghit
2#include "ghit.h"
3
4// glibrary
5#include "gutsConventions.h"
6
7// See header for API docs.
8
17 // Bit 0: always present - calculate total energy, average time, and average positions.
18 if (bit == 0) {
19 // Ensure total energy is available (and cached).
20 double tote = getTotalEnergyDeposited();
21
22 double avgx = 0, avgy = 0, avgz = 0;
23 double avglx = 0, avgly = 0, avglz = 0;
24 averageTime = 0;
25
26 auto nsteps = edeps.size();
27 for (size_t s = 0; s < nsteps; s++) {
28 // Energy-weighted average when possible; otherwise arithmetic average.
29 if (tote > 0) {
30 averageTime += times[s] * edeps[s] / tote;
31 avgx += globalPositions[s].getX() * edeps[s] / tote;
32 avgy += globalPositions[s].getY() * edeps[s] / tote;
33 avgz += globalPositions[s].getZ() * edeps[s] / tote;
34 avglx += localPositions[s].getX() * edeps[s] / tote;
35 avgly += localPositions[s].getY() * edeps[s] / tote;
36 avglz += localPositions[s].getZ() * edeps[s] / tote;
37 }
38 else {
39 // Fallback to simple averaging if no energy is deposited.
40 averageTime += times[s] / nsteps;
41 avgx += globalPositions[s].getX() / nsteps;
42 avgy += globalPositions[s].getY() / nsteps;
43 avgz += globalPositions[s].getZ() / nsteps;
44 avglx += localPositions[s].getX() / nsteps;
45 avgly += localPositions[s].getY() / nsteps;
46 avglz += localPositions[s].getZ() / nsteps;
47 }
48 }
49 avgGlobalPosition = G4ThreeVector(avgx, avgy, avgz);
50 avgLocalPosition = G4ThreeVector(avglx, avgly, avglz);
51
52 // Use the first process name if available as a representative label.
53 if (!processNames.empty()) {
54 processName = processNames.front();
55 }
56 }
57 // Future extensions for bits 1-4 can be added below.
58 else if (bit == 1) {
59 // Placeholder for step length and track information.
60 }
61 else if (bit == 2) {
62 // Placeholder for mother particle tracks information.
63 }
64 else if (bit == 3) {
65 // Placeholder for meta information.
66 }
67 else if (bit == 4) {
68 // Placeholder for optical photon specific information.
69 }
70}
71
73 if (!totalEnergyDeposited.has_value()) {
74 // Cache the sum of per-step energy depositions.
75 double sum = 0;
76 for (const auto& ei : edeps) {
77 sum += ei;
78 }
79 totalEnergyDeposited = sum;
80 }
81 return totalEnergyDeposited.value();
82}
83
85 if (averageTime == UNINITIALIZEDNUMBERQUANTITY) {
86 double tote = getTotalEnergyDeposited();
87
88 averageTime = 0;
89 auto nsteps = edeps.size();
90 for (size_t s = 0; s < nsteps; s++) {
91 // Keep the existing behavior: compare against totalEnergyDeposited (optional) as written.
92 // This block computes an energy-weighted average when possible.
93 if (totalEnergyDeposited > 0) {
94 averageTime += times[s] * edeps[s] / tote;
95 }
96 else {
97 averageTime += times[s] / nsteps;
98 }
99 }
100 }
101
102 return averageTime;
103}
104
106 if (avgGlobalPosition.getX() == UNINITIALIZEDNUMBERQUANTITY && avgGlobalPosition.getY() ==
108 double tote = getTotalEnergyDeposited();
109
110 double avgx = 0, avgy = 0, avgz = 0;
111
112 auto nsteps = edeps.size();
113 for (size_t s = 0; s < nsteps; s++) {
114 // Energy-weighted average when possible; otherwise arithmetic average.
115 if (totalEnergyDeposited > 0) {
116 avgx += globalPositions[s].getX() * edeps[s] / tote;
117 avgy += globalPositions[s].getY() * edeps[s] / tote;
118 avgz += globalPositions[s].getZ() * edeps[s] / tote;
119 }
120 else {
121 // Preserve existing behavior (note: this branch also increments averageTime as written).
122 averageTime += times[s] / nsteps;
123 avgx += globalPositions[s].getX() / nsteps;
124 avgy += globalPositions[s].getY() / nsteps;
125 avgz += globalPositions[s].getZ() / nsteps;
126 }
127 }
128 avgGlobalPosition = G4ThreeVector(avgx, avgy, avgz);
129 }
130
131 return avgGlobalPosition;
132}
133
135 if (avgLocalPosition.getX() == UNINITIALIZEDNUMBERQUANTITY && avgLocalPosition.getY() ==
137 double tote = getTotalEnergyDeposited();
138
139 double avgx = 0, avgy = 0, avgz = 0;
140
141 auto nsteps = edeps.size();
142 for (size_t s = 0; s < nsteps; s++) {
143 // Energy-weighted average when possible; otherwise arithmetic average.
144 if (totalEnergyDeposited > 0) {
145 avgx += localPositions[s].getX() * edeps[s] / tote;
146 avgy += localPositions[s].getY() * edeps[s] / tote;
147 avgz += localPositions[s].getZ() * edeps[s] / tote;
148 }
149 else {
150 // Preserve existing behavior (note: this branch also increments averageTime as written).
151 averageTime += times[s] / nsteps;
152 avgx += localPositions[s].getX() / nsteps;
153 avgy += localPositions[s].getY() / nsteps;
154 avgz += localPositions[s].getZ() / nsteps;
155 }
156 }
157 avgLocalPosition = G4ThreeVector(avgx, avgy, avgz);
158 }
159 return avgLocalPosition;
160}
size_t nsteps() const
Number of recorded steps for the optional-energy vector.
Definition ghit.h:322
void calculateInfosForBit(int bit)
Compute and cache derived information for the requested bit.
G4ThreeVector getAvgGlobaPosition()
Get the average global position of the hit.
double getTotalEnergyDeposited()
Get the total deposited energy across all recorded steps.
double getAverageTime()
Get the average time associated with the hit.
G4ThreeVector getAvgLocalPosition()
Get the average local position of the hit.
#define UNINITIALIZEDNUMBERQUANTITY