ATLAS Offline Software
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 // Geant4 headers
9 #include "G4ParticleDefinition.hh"
10 #include "G4Step.hh"
11 #include "G4StepPoint.hh"
12 #include "G4TouchableHistory.hh"
13 #include "G4ThreeVector.hh"
14 #include "G4Track.hh"
15 
16 // STL header
17 #include <sstream>
18 #include <limits>
19 #include <cmath>
20 
21 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
22 
23 ALFA_SensitiveDetector::ALFA_SensitiveDetector(const std::string& name, const std::string& hitCollectionName, const std::string& ODhitCollectionName)
24  : G4VSensitiveDetector( name ),
25  m_HitCollection(hitCollectionName),
26  m_ODHitCollection(ODhitCollectionName)
27 {
28 
29  m_hitID = -1;
30 
31  m_eventNumber = 0;
32  m_numberOfHits = 0;
33  m_numberOfODHits = 0;
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 
45 {
46  m_numberOfHits = 0;
47  m_numberOfODHits = 0;
48 }
49 
50 // Initialize from G4 - necessary to new the write handle for now
51 void ALFA_SensitiveDetector::Initialize(G4HCofThisEvent *)
52 {
53  if (!m_HitCollection.isValid()) m_HitCollection = std::make_unique<ALFA_HitCollection>(m_HitCollection.name());
54  if (!m_ODHitCollection.isValid()) m_ODHitCollection = std::make_unique<ALFA_ODHitCollection>(m_ODHitCollection.name());
55 }
56 
57 bool ALFA_SensitiveDetector::ProcessHits(G4Step* pStep, G4TouchableHistory*)
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;
107  if(m_HitCollection.isValid())
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  m_numberOfHits++;
114  }
115  else
116  {
117  G4ExceptionDescription description;
118  description << "ProcessHits: Can't access HitCollection with key " << m_HitCollection.key() << " from store " << m_HitCollection.store();
119  G4Exception("ALFA_SensitiveDetector", "InvalidHitColl1", FatalException, description);
120  return false; //The G4Exception call above should abort the job, but Coverity does not seem to pick this up.
121  }
122  }
123 
124  if (vol_test_str.compare("ALFA_Fi") == 0)
125  {
126  if (std::abs(energyDeposit)<std::numeric_limits<double>::epsilon()) { return true; }
127  m_pos2 = 10;
128  std::string substring (vol_name);
129  std::string num_string (vol_name);
130 
131 
132  std::string test_str ("A");
133  test_str = substring.substr(m_pos2,1);
134  int sign_fiber(0);
135  if (test_str.compare("U") == 0)
136  {
137  sign_fiber = 1;
138  }
139 
140  if (test_str.compare("V") == 0)
141  {
142  sign_fiber = -1;
143  }
144 
145 
146  for ( int k = 0; k < 3; k++ )
147  {
148  substring = substring.substr(m_pos2+1);
149  m_pos1 = int(substring.find('['));
150  m_pos2 = int(substring.find(']'));
151  num_string = substring.substr(m_pos1+1,m_pos2-1);
152  std::istringstream is(num_string);
153  is >> m_num[k];
154  }
155 
156  n_station = m_num[0];
157  n_plate = m_num[1];
158  n_fiber = m_num[2];
159 
160 
161  if(m_HitCollection.isValid())
162  {
163  m_HitCollection->Emplace(m_hitID,
164  trackID,
165  particleEncoding,
166  (float) kineticEnergy,
167  (float) energyDeposit,
168  (float) preStepX, (float) preStepY, (float) preStepZ,
169  (float) postStepX, (float) postStepY, (float) postStepZ,
170  (float) globalTime,
171  (int) sign_fiber, (int) n_plate, (int) n_fiber, (int) n_station
172  );
173  ++m_numberOfHits;
174  }
175  else
176  {
177  G4ExceptionDescription description;
178  description << "ProcessHits: Can't access HitCollection with key " << m_HitCollection.key() << " from store " << m_HitCollection.store();
179  G4Exception("ALFA_SensitiveDetector", "InvalidHitColl2", FatalException, description);
180  return false; //The G4Exception call above should abort the job, but Coverity does not seem to pick this up.
181  }
182  }
183 
184  if (vol_test_str.compare("ODFiber") == 0)
185  {
186  if (std::abs(energyDeposit)<std::numeric_limits<double>::epsilon()) { return true; }
187  m_pos2 = 7;
188  std::string substring (vol_name);
189  std::string num_string (std::move(vol_name));
190 
191  std::string test_str = substring.substr(m_pos2,1);
192  int sign_fiber(0);
193  if (test_str.compare("U") == 0)
194  {
195  sign_fiber = 1;
196  }
197 
198  if (test_str.compare("V") == 0)
199  {
200  sign_fiber = -1;
201  }
202 
203  std::string test_str_side ("A");
204  test_str_side = substring.substr(m_pos2+1,1);
205 
206  int OD_side(0);
207  if (test_str_side.compare("0") == 0)
208  {
209  OD_side = 0;
210  }
211 
212  if (test_str_side.compare("1") == 0)
213  {
214  OD_side = 1;
215  }
216 
217  for ( int k = 0; k < 3; k++ )
218  {
219  substring = substring.substr(m_pos2+1);
220  m_pos1 = int(substring.find('['));
221  m_pos2 = int(substring.find(']'));
222  num_string = substring.substr(m_pos1+1,m_pos2-1);
223  std::istringstream is(num_string);
224  is >> m_num[k];
225  }
226 
227  n_station = m_num[0];
228  n_plate = m_num[1];
229  n_fiber = m_num[2];
230 
231  if(m_ODHitCollection.isValid())
232  {
233  m_ODHitCollection->Emplace(m_hitID,
234  trackID,
235  particleEncoding,
236  (float) kineticEnergy,
237  (float) energyDeposit,
238  (float) preStepX, (float) preStepY, (float) preStepZ,
239  (float) postStepX, (float) postStepY, (float) postStepZ,
240  (float) globalTime,
241  (int) sign_fiber, (int) OD_side, (int) n_plate, (int) n_fiber, (int) n_station
242  );
244  }
245  else
246  {
247  G4ExceptionDescription description;
248  description << "ProcessHits: Can't access HitCollection with key " << m_ODHitCollection.key() << " from store " << m_ODHitCollection.store();
249  G4Exception("ALFA_SensitiveDetector", "InvalidHitColl3", FatalException, description);
250  return false; //The G4Exception call above should abort the job, but Coverity does not seem to pick this up.
251  }
252 
253  }
254 
255 
256  return true;
257 }
258 
260 {
261  G4cout << " Total number of hits in MD: " << m_numberOfHits << G4endl;
262  G4cout << " Total number of hits in OD: " << m_numberOfODHits << G4endl;
263  G4cout << "*************************************************************" << G4endl;
264 
265  ++m_eventNumber;
266 
267  m_numberOfHits = 0;
268  m_numberOfODHits = 0;
269 }
ALFA_SensitiveDetector::m_HitCollection
SG::WriteHandle< ALFA_HitCollection > m_HitCollection
Definition: ALFA_SensitiveDetector.h:59
ALFA_SensitiveDetector::m_ODHitCollection
SG::WriteHandle< ALFA_ODHitCollection > m_ODHitCollection
Definition: ALFA_SensitiveDetector.h:60
ALFA_SensitiveDetector.h
CaloClusterMLCalib::epsilon
constexpr float epsilon
Definition: CaloClusterMLGaussianMixture.h:16
ALFA_SensitiveDetector::m_numberOfODHits
int m_numberOfODHits
Definition: ALFA_SensitiveDetector.h:56
Trk::energyDeposit
@ energyDeposit
Definition: MeasurementType.h:32
ALFA_SensitiveDetector::m_num
int m_num[3]
Definition: ALFA_SensitiveDetector.h:64
ALFA_SensitiveDetector::m_eventNumber
int m_eventNumber
Definition: ALFA_SensitiveDetector.h:54
ALFA_SensitiveDetector::Initialize
void Initialize(G4HCofThisEvent *) override final
Definition: ALFA_SensitiveDetector.cxx:51
ALFA_SensitiveDetector::m_hitID
int m_hitID
Templated method to stuff a single hit into the sensitive detector class.
Definition: ALFA_SensitiveDetector.h:52
ALFA_SensitiveDetector::m_numberOfHits
int m_numberOfHits
Definition: ALFA_SensitiveDetector.h:55
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
ALFA_SensitiveDetector::ProcessHits
G4bool ProcessHits(G4Step *, G4TouchableHistory *) override final
Definition: ALFA_SensitiveDetector.cxx:57
ALFA_SensitiveDetector::EndOfAthenaEvent
void EndOfAthenaEvent()
Definition: ALFA_SensitiveDetector.cxx:259
ALFA_SensitiveDetector::ALFA_SensitiveDetector
ALFA_SensitiveDetector(const std::string &name, const std::string &hitCollectionName, const std::string &ODhitCollectionName)
Definition: ALFA_SensitiveDetector.cxx:23
python.CaloAddPedShiftConfig.int
int
Definition: CaloAddPedShiftConfig.py:45
ALFA_SensitiveDetector::m_pos2
int m_pos2
Definition: ALFA_SensitiveDetector.h:62
ALFA_SensitiveDetector::StartOfAthenaEvent
void StartOfAthenaEvent()
Definition: ALFA_SensitiveDetector.cxx:44
ALFA_SensitiveDetector::m_pos1
int m_pos1
Definition: ALFA_SensitiveDetector.h:62
fitman.k
k
Definition: fitman.py:528
description
std::string description
glabal timer - how long have I taken so far?
Definition: hcg.cxx:88