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
84
86 if (averageTime == UNINITIALIZEDNUMBERQUANTITY) {
87 double tote = getTotalEnergyDeposited();
88
89 averageTime = 0;
90 auto nsteps = edeps.size();
91 for (size_t s = 0; s < nsteps; s++) {
92 // Keep the existing behavior: compare against totalEnergyDeposited (optional) as written.
93 // This block computes an energy-weighted average when possible.
94 if (totalEnergyDeposited > 0) {
95 averageTime += times[s] * edeps[s] / tote;
96 }
97 else {
98 averageTime += times[s] / nsteps;
99 }
100 }
101 }
102
103 return averageTime;
104}
105
107 if (avgGlobalPosition.getX() == UNINITIALIZEDNUMBERQUANTITY && avgGlobalPosition.getY() ==
109 double tote = getTotalEnergyDeposited();
110
111 double avgx = 0, avgy = 0, avgz = 0;
112
113 auto nsteps = edeps.size();
114 for (size_t s = 0; s < nsteps; s++) {
115 // Energy-weighted average when possible; otherwise arithmetic average.
116 if (totalEnergyDeposited > 0) {
117 avgx += globalPositions[s].getX() * edeps[s] / tote;
118 avgy += globalPositions[s].getY() * edeps[s] / tote;
119 avgz += globalPositions[s].getZ() * edeps[s] / tote;
120 }
121 else {
122 // Preserve existing behavior (note: this branch also increments averageTime as written).
123 averageTime += times[s] / nsteps;
124 avgx += globalPositions[s].getX() / nsteps;
125 avgy += globalPositions[s].getY() / nsteps;
126 avgz += globalPositions[s].getZ() / nsteps;
127 }
128 }
129 avgGlobalPosition = G4ThreeVector(avgx, avgy, avgz);
130 }
131
132 return avgGlobalPosition;
133}
134
136 if (avgLocalPosition.getX() == UNINITIALIZEDNUMBERQUANTITY && avgLocalPosition.getY() ==
138 double tote = getTotalEnergyDeposited();
139
140 double avgx = 0, avgy = 0, avgz = 0;
141
142 auto nsteps = edeps.size();
143 for (size_t s = 0; s < nsteps; s++) {
144 // Energy-weighted average when possible; otherwise arithmetic average.
145 if (totalEnergyDeposited > 0) {
146 avgx += localPositions[s].getX() * edeps[s] / tote;
147 avgy += localPositions[s].getY() * edeps[s] / tote;
148 avgz += localPositions[s].getZ() * edeps[s] / tote;
149 }
150 else {
151 // Preserve existing behavior (note: this branch also increments averageTime as written).
152 averageTime += times[s] / nsteps;
153 avgx += localPositions[s].getX() / nsteps;
154 avgy += localPositions[s].getY() / nsteps;
155 avgz += localPositions[s].getZ() / nsteps;
156 }
157 }
158 avgLocalPosition = G4ThreeVector(avgx, avgy, avgz);
159 }
160 return avgLocalPosition;
161}
size_t nsteps() const
Number of recorded steps for the optional-energy vector.
Definition ghit.h:323
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