ATLAS Offline Software
Loading...
Searching...
No Matches
ALFA_SensitiveDetector.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Class header
7
8// Athena headers
11
12// Geant4 headers
13#include "G4ParticleDefinition.hh"
14#include "G4Step.hh"
15#include "G4StepPoint.hh"
16#include "G4TouchableHistory.hh"
17#include "G4ThreeVector.hh"
18#include "G4Track.hh"
19
20// STL header
21#include <sstream>
22#include <limits>
23#include <cmath>
24
25//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
26
27ALFA_SensitiveDetector::ALFA_SensitiveDetector(const std::string& name, const std::string& hitCollectionName, const std::string& ODhitCollectionName)
28 : G4VSensitiveDetector( name ),
29 m_hitCollectionName(hitCollectionName),
30 m_ODHitCollectionName(ODhitCollectionName)
31{
32
33 m_hitID = -1;
34
35 m_pos1 = 0;
36 m_pos2 = 0;
37
38 m_num[0] = 0;
39 m_num[1] = 0;
40 m_num[2] = 0;
41
42}
43
44// Initialize from G4.
50
51bool ALFA_SensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
52{
53 if (!m_HitCollection) {
55 }
56 if (!m_ODHitCollection) {
58 }
59
60 const double energyDeposit(pStep->GetTotalEnergyDeposit());
61
62 // Get kinetic energy of depositing particle
63
64 const G4StepPoint *pPreStepPoint(pStep->GetPreStepPoint());
65 const G4StepPoint *pPostStepPoint(pStep->GetPostStepPoint());
66
67 const double kineticEnergy(pPreStepPoint->GetKineticEnergy());
68
69 const G4ThreeVector preStepPoint(pPreStepPoint->GetPosition());
70 const G4ThreeVector postStepPoint(pPostStepPoint->GetPosition());
71
72 // Get name of physical volume
73 const G4String vol_name(pPreStepPoint->GetTouchableHandle()->GetVolume()->GetName());
74
75 const double preStepX(preStepPoint.x());
76 const double preStepY(preStepPoint.y());
77 const double preStepZ(preStepPoint.z());
78
79 const double postStepX(postStepPoint.x());
80 const double postStepY(postStepPoint.y());
81 const double postStepZ(postStepPoint.z());
82
83 int n_plate(0);
84 int n_fiber(0);
85 int n_station(0);
86
87 m_hitID++;
88
89 // particle encoding
90 const G4Track *pTrack(pStep->GetTrack());
91 const int particleEncoding(pTrack->GetDefinition()->GetPDGEncoding());
92
93 const double globalTime(pTrack->GetGlobalTime());
94 const int trackID(pTrack->GetTrackID()); //DC 2-29-04 use it as barcode
95
96 std::string vol_test_str = vol_name.substr(0,7);
97
98
99 if(vol_name.find("GVS") != std::string::npos)
100 {
101
102 if(vol_name.find("B7L1") != std::string::npos) n_station=0;
103 else if(vol_name.find("A7L1") != std::string::npos) n_station=1;
104 else if(vol_name.find("A7R1") != std::string::npos) n_station=2;
105 else if(vol_name.find("B7R1") != std::string::npos) n_station=3;
106 else n_station=-1;
108 {
109 m_HitCollection->Emplace(m_hitID, trackID, particleEncoding, (float) kineticEnergy,
110 (float) energyDeposit,(float) preStepX, (float) preStepY, (float) preStepZ,
111 (float) postStepX, (float) postStepY, (float) postStepZ,(float) globalTime,
112 -1, 100, -1, (int) n_station);
113 }
114 else
115 {
116 G4ExceptionDescription description;
117 description << "ProcessHits: Can't access HitCollection with key " << m_hitCollectionName;
118 G4Exception("ALFA_SensitiveDetector", "InvalidHitColl1", FatalException, description);
119 return false; //The G4Exception call above should abort the job, but Coverity does not seem to pick this up.
120 }
121 }
122
123 if (vol_test_str.compare("ALFA_Fi") == 0)
124 {
125 if (std::abs(energyDeposit)<std::numeric_limits<double>::epsilon()) { return true; }
126 m_pos2 = 10;
127 std::string substring (vol_name);
128 std::string num_string (vol_name);
129
130
131 std::string test_str ("A");
132 test_str = substring.substr(m_pos2,1);
133 int sign_fiber(0);
134 if (test_str.compare("U") == 0)
135 {
136 sign_fiber = 1;
137 }
138
139 if (test_str.compare("V") == 0)
140 {
141 sign_fiber = -1;
142 }
143
144
145 for ( int k = 0; k < 3; k++ )
146 {
147 substring = substring.substr(m_pos2+1);
148 m_pos1 = int(substring.find('['));
149 m_pos2 = int(substring.find(']'));
150 num_string = substring.substr(m_pos1+1,m_pos2-1);
151 std::istringstream is(num_string);
152 is >> m_num[k];
153 }
154
155 n_station = m_num[0];
156 n_plate = m_num[1];
157 n_fiber = m_num[2];
158
159
161 {
162 m_HitCollection->Emplace(m_hitID,
163 trackID,
164 particleEncoding,
165 (float) kineticEnergy,
166 (float) energyDeposit,
167 (float) preStepX, (float) preStepY, (float) preStepZ,
168 (float) postStepX, (float) postStepY, (float) postStepZ,
169 (float) globalTime,
170 (int) sign_fiber, (int) n_plate, (int) n_fiber, (int) n_station
171 );
172 }
173 else
174 {
175 G4ExceptionDescription description;
176 description << "ProcessHits: Can't access HitCollection with key " << m_hitCollectionName;
177 G4Exception("ALFA_SensitiveDetector", "InvalidHitColl2", FatalException, description);
178 return false; //The G4Exception call above should abort the job, but Coverity does not seem to pick this up.
179 }
180 }
181
182 if (vol_test_str.compare("ODFiber") == 0)
183 {
184 if (std::abs(energyDeposit)<std::numeric_limits<double>::epsilon()) { return true; }
185 m_pos2 = 7;
186 std::string substring (vol_name);
187 std::string num_string (std::move(vol_name));
188
189 std::string test_str = substring.substr(m_pos2,1);
190 int sign_fiber(0);
191 if (test_str.compare("U") == 0)
192 {
193 sign_fiber = 1;
194 }
195
196 if (test_str.compare("V") == 0)
197 {
198 sign_fiber = -1;
199 }
200
201 std::string test_str_side ("A");
202 test_str_side = substring.substr(m_pos2+1,1);
203
204 int OD_side(0);
205 if (test_str_side.compare("0") == 0)
206 {
207 OD_side = 0;
208 }
209
210 if (test_str_side.compare("1") == 0)
211 {
212 OD_side = 1;
213 }
214
215 for ( int k = 0; k < 3; k++ )
216 {
217 substring = substring.substr(m_pos2+1);
218 m_pos1 = int(substring.find('['));
219 m_pos2 = int(substring.find(']'));
220 num_string = substring.substr(m_pos1+1,m_pos2-1);
221 std::istringstream is(num_string);
222 is >> m_num[k];
223 }
224
225 n_station = m_num[0];
226 n_plate = m_num[1];
227 n_fiber = m_num[2];
228
230 {
231 m_ODHitCollection->Emplace(m_hitID,
232 trackID,
233 particleEncoding,
234 (float) kineticEnergy,
235 (float) energyDeposit,
236 (float) preStepX, (float) preStepY, (float) preStepZ,
237 (float) postStepX, (float) postStepY, (float) postStepZ,
238 (float) globalTime,
239 (int) sign_fiber, (int) OD_side, (int) n_plate, (int) n_fiber, (int) n_station
240 );
241 }
242 else
243 {
244 G4ExceptionDescription description;
245 description << "ProcessHits: Can't access HitCollection with key " << m_ODHitCollectionName;
246 G4Exception("ALFA_SensitiveDetector", "InvalidHitColl3", FatalException, description);
247 return false; //The G4Exception call above should abort the job, but Coverity does not seem to pick this up.
248 }
249
250 }
251
252
253 return true;
254}
255
257{
258 auto* eventInfo = AtlasG4EventUserInfo::GetEventUserInfo();
259 if (!eventInfo) {
260 return nullptr;
261 }
262 auto hitCollections = eventInfo->GetHitCollectionMap();
263 return hitCollections ? hitCollections->Find<ALFA_HitCollection>(m_hitCollectionName) : nullptr;
264}
265
267{
268 auto* eventInfo = AtlasG4EventUserInfo::GetEventUserInfo();
269 if (!eventInfo) {
270 return nullptr;
271 }
272 auto hitCollections = eventInfo->GetHitCollectionMap();
273 return hitCollections ? hitCollections->Find<ALFA_ODHitCollection>(m_ODHitCollectionName) : nullptr;
274}
AtlasHitsVector< ALFA_Hit > ALFA_HitCollection
AtlasHitsVector< ALFA_ODHit > ALFA_ODHitCollection
void Initialize(G4HCofThisEvent *) override final
ALFA_ODHitCollection * getODHitCollection() const
G4bool ProcessHits(G4Step *, G4TouchableHistory *) override final
ALFA_HitCollection * m_HitCollection
ALFA_SensitiveDetector(const std::string &name, const std::string &hitCollectionName, const std::string &ODhitCollectionName)
ALFA_ODHitCollection * m_ODHitCollection
ALFA_HitCollection * getHitCollection() const
Templated method to stuff a single hit into the sensitive detector class.
static AtlasG4EventUserInfo * GetEventUserInfo()
std::string description
glabal timer - how long have I taken so far?
Definition hcg.cxx:93