ATLAS Offline Software
Loading...
Searching...
No Matches
TRTProcessingOfBarrelHits.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
5// Class header
7
8// Package headers
10
11// Athena headers
13#include "MCTruth/TrackHelper.h"
14#include "TRT_G4Utilities/TRTParameters.hh"
15
16// Geant4 headers
17#include "G4AffineTransform.hh"
18#include "G4NavigationHistory.hh"
19#include "G4Step.hh"
20#include "G4StepPoint.hh"
21#include "G4ThreeVector.hh"
22#include "G4TouchableHandle.hh"
23#include "G4TouchableHistory.hh"
24#include "G4Track.hh"
25
26// STL headers
27#include <cmath>
28
29// Called by TRTSensitiveDetector::InitializeHitProcessing
30
32(TRTSensitiveDetector* pSensitiveDet):
33 m_printMessages(0), //FIXME obsolete?
45 m_strawIDToLayerIDA(nullptr),
46 m_strawIDToLayerIDB(nullptr),
47 m_strawIDToLayerIDC(nullptr),
48 m_pParameters(nullptr),
49 m_pSensitiveDetector(pSensitiveDet),
50 m_verboseLevel(pSensitiveDet->verboseLevel)
51{
52 m_pParameters = TRTParameters::GetPointer();
53
54 m_printMessages = m_pParameters->GetInteger("PrintMessages"); //FIXME obsolete?
55
56 if (m_verboseLevel>5) { G4cout << "##### Constructor TRTProcessingOfBarrelHits" << G4endl; }
57
58 this->Initialize();
59
60 m_pParameters = nullptr;
61
62 if (m_verboseLevel>5) { G4cout << "##### Constructor TRTProcessingOfBarrelHits done" << G4endl; }
63}
64
65
66// Called by TRTSensitiveDetector::DeleteObjects
67
69{
70
71 if (m_verboseLevel>5) { G4cout << "##### Destructor TRTProcessingOfBarrelHits" << G4endl; }
72
73 this->DeleteArrays();
74
75 if (m_verboseLevel>5) { G4cout << "##### Destructor TRTProcessingOfBarrelHits done" << G4endl; }
76
77}
78
79
80// Called by TRTProcessingOfBarrelHits
81
83{
84 if (m_verboseLevel>5) { G4cout << "######### Method TRTProcessingOfBarrelHits::Initialize" << G4endl; }
85
86
87 m_barrelIdentifier = m_pParameters->GetInteger("BarrelIdentifier");
89 m_pParameters->GetInteger("TestLocalCoordinatesOfHits");
90
91 if (m_barrelIdentifier == 1)
92 {
93 m_strawIDToLayerIDA = nullptr;
94 m_strawIDToLayerIDB = nullptr;
95 m_strawIDToLayerIDC = nullptr;
96 }
97
98
99 if (m_barrelIdentifier == 2)
100 {
101 m_numberOfStrawsA = m_pParameters->GetInteger("NumberOfStrawsA");
102 m_numberOfStrawsB = m_pParameters->GetInteger("NumberOfStrawsB");
103 m_numberOfStrawsC = m_pParameters->GetInteger("NumberOfStrawsC");
104
108 }
109
110 m_numberOfStrawLayersA = m_pParameters->GetInteger("NumberOfStrawLayersA");
111 m_numberOfStrawLayersB = m_pParameters->GetInteger("NumberOfStrawLayersB");
112 m_numberOfStrawLayersC = m_pParameters->GetInteger("NumberOfStrawLayersC");
113
117
118 if (m_verboseLevel>5) { G4cout << "######### Method TRTProcessingOfBarrelHits::Initialize done" << G4endl; }
119}
120
121
122// Called by Geant4
123
125{
126 G4StepPoint* pPreStepPoint = pStep->GetPreStepPoint();
127
128 G4TouchableHandle pTouchableHandle = pPreStepPoint->GetTouchableHandle();
129 int depth = 2;
130
131 int gasID = pTouchableHandle->GetReplicaNumber();
132 int strawID = pTouchableHandle->GetReplicaNumber(depth++);
133 int ringID = pTouchableHandle->GetReplicaNumber(depth++);
134 int moduleID = pTouchableHandle->GetReplicaNumber(depth);
135
136 int hitID = gasID % 2;
137
138 G4Track* pTrack = pStep->GetTrack();
139 // get the HepMC barcode using the track helper
140 TrackHelper trHelp(pTrack);
141
142 G4ThreeVector globalPreStepPoint = pPreStepPoint->GetPosition();
143
144 G4StepPoint* pPostStepPoint = pStep->GetPostStepPoint();
145 G4ThreeVector globalPostStepPoint = pPostStepPoint->GetPosition();
146
147
148 const G4TouchableHistory* pTouchableHistory =
149 static_cast<const G4TouchableHistory*>(pPreStepPoint->GetTouchable());
150
151 const G4AffineTransform& topTransform = pTouchableHistory->GetHistory()->
152 GetTopTransform();
153
154 G4ThreeVector localPreStepPoint = topTransform.TransformPoint(globalPreStepPoint);
155 G4ThreeVector localPostStepPoint = topTransform.TransformPoint(globalPostStepPoint);
156
157 double preStepZ = localPreStepPoint.z();
158 double postStepZ = localPostStepPoint.z();
159
160
161 double preStepX = localPreStepPoint.x();
162 double preStepY = localPreStepPoint.y();
163
164 double postStepX = localPostStepPoint.x();
165 double postStepY = localPostStepPoint.y();
166
168 {
169 double preStepR = std::sqrt(preStepX * preStepX + preStepY * preStepY);
170 double postStepR = std::sqrt(postStepX * postStepX + postStepY * postStepY);
171
172 if (preStepR > 2.0000001 || postStepR > 2.0000001)
173 {
174 G4int particleEncoding = m_pSensitiveDetector->m_particleEncoding;
175 G4double kineticEnergy = m_pSensitiveDetector->m_kineticEnergy;
176 G4double energyDeposit = m_pSensitiveDetector->m_energyDeposit;
177
178 std::cout << "!!!!! Barrel. Error in local coordinates of hits!" << std::endl;
179 std::cout << " barrelID=" << hitID << " ringID=" << ringID
180 << " moduleID=" << moduleID << " strawID=" << strawID
181 << " trackID=" << trHelp.GetUniqueID() << std::endl;
182 std::cout << " particleEncoding=" << particleEncoding;
183
184 if (kineticEnergy < 0.0001)
185 std::cout << " kineticEnergy=" << kineticEnergy * 1000000. << " eV";
186 else if (kineticEnergy < 0.1)
187 std::cout << " kineticEnergy=" << kineticEnergy * 1000. << " keV";
188 else if (kineticEnergy >= 100.)
189 std::cout << " kineticEnergy=" << kineticEnergy / 1000. << " GeV";
190 else if (kineticEnergy >= 100000.)
191 std::cout << " kineticEnergy=" << kineticEnergy / 1000000. << " TeV";
192 else
193 std::cout << " kineticEnergy=" << kineticEnergy << " MeV";
194
195 if (energyDeposit < 0.1)
196 std::cout << " energyDeposit=" << energyDeposit * 1000. << " eV"
197 << std::endl;
198 else if (energyDeposit >= 100.)
199 std::cout << " energyDeposit=" << energyDeposit / 1000. << " MeV"
200 << std::endl;
201 else
202 std::cout << " energyDeposit=" << energyDeposit << " keV" << std::endl;
203
204 std::cout << " preStepX=" << preStepX << " mm preStepY=" << preStepY
205 << " mm preStepR=" << preStepR << " mm" << std::endl;
206 std::cout << " postStepX=" << postStepX << " mm postStepY=" << postStepY
207 << " mm postStepR=" << postStepR << " mm" << std::endl << std::endl;
208 }
209 }
210
211 double preStepGlobalTime = pPreStepPoint->GetGlobalTime();
212 double postStepGlobalTime = pPostStepPoint->GetGlobalTime();
213 double globalTime = (preStepGlobalTime + postStepGlobalTime) / 2.;
214
215 int layerID;
216
217 if (m_barrelIdentifier == 1)
218 layerID = GetLayerID1(ringID, strawID);
219 else
220 layerID = GetLayerID2(ringID, strawID);
221
222 hitID <<= 20;
223 hitID += (ringID << 15);
224 hitID += (moduleID << 10);
225 hitID += (layerID << 5);
226 hitID += strawID;
227
228 m_pSensitiveDetector->m_hitID = hitID;
229 auto* eventInfo = m_pSensitiveDetector->m_g4UserEventInfo;
230 m_pSensitiveDetector->m_partLink = trHelp.GenerateParticleLink(eventInfo ? eventInfo->GetEventStore() : nullptr);
231 m_pSensitiveDetector->m_preStepX = preStepX;
232 m_pSensitiveDetector->m_preStepY = preStepY;
233 m_pSensitiveDetector->m_preStepZ = preStepZ;
234 m_pSensitiveDetector->m_postStepX = postStepX;
235 m_pSensitiveDetector->m_postStepY = postStepY;
236 m_pSensitiveDetector->m_postStepZ = postStepZ;
237 m_pSensitiveDetector->m_globalTime = globalTime;
238
239 return true;
240}
241
242
243// Called by ProcessHit
244
246 int& strawID) const
247{
248 ++strawID;
249 int layerID = 15;
250
251 if (ringID == 0)
252 {
253 if (strawID <= m_integralDistributionOfStrawsA[layerID])
254 {
255 layerID -= 8;
256 if (strawID > m_integralDistributionOfStrawsA[layerID])
257 layerID += 4;
258 else
259 layerID -= 4;
260 }
261 if (strawID > m_integralDistributionOfStrawsA[layerID])
262 layerID += 2;
263 else
264 layerID -= 2;
265 if (strawID > m_integralDistributionOfStrawsA[layerID])
266 ++layerID;
267 else
268 --layerID;
269 if (strawID > m_integralDistributionOfStrawsA[layerID])
270 ++layerID;
271
272 if (layerID > 0)
273 strawID -= m_integralDistributionOfStrawsA[layerID - 1];
274 }
275 else if (ringID == 1)
276 {
277 if (strawID > m_integralDistributionOfStrawsB[layerID])
278 layerID += 8;
279 else
280 layerID -= 8;
281 if (strawID > m_integralDistributionOfStrawsB[layerID])
282 layerID += 4;
283 else
284 layerID -= 4;
285 if (strawID > m_integralDistributionOfStrawsB[layerID])
286 layerID += 2;
287 else
288 layerID -= 2;
289 if (strawID > m_integralDistributionOfStrawsB[layerID])
290 ++layerID;
291 else
292 --layerID;
293 if (strawID > m_integralDistributionOfStrawsB[layerID])
294 ++layerID;
295
296 if (layerID > 0)
297 strawID -= m_integralDistributionOfStrawsB[layerID - 1];
298 }
299 else
300 {
301 if (strawID > m_integralDistributionOfStrawsC[layerID])
302 layerID += 8;
303 else
304 layerID -= 8;
305 if (strawID > m_integralDistributionOfStrawsC[layerID])
306 layerID += 4;
307 else
308 layerID -= 4;
309 if (strawID > m_integralDistributionOfStrawsC[layerID])
310 layerID += 2;
311 else
312 layerID -= 2;
313 if (strawID > m_integralDistributionOfStrawsC[layerID])
314 ++layerID;
315 else
316 --layerID;
317 if (strawID > m_integralDistributionOfStrawsC[layerID])
318 ++layerID;
319
320 if (layerID > 0)
321 strawID -= m_integralDistributionOfStrawsC[layerID - 1];
322 }
323
324 --strawID;
325 return layerID;
326}
327
328
329// Called by ProcessHit
330
332 int& strawID) const
333{
334 int layerID;
335 if (ringID == 0)
336 {
337 layerID = m_strawIDToLayerIDA[strawID];
338 if (layerID > 0)
339 strawID -= m_integralDistributionOfStrawsA[layerID - 1];
340 }
341 else if (ringID == 1)
342 {
343 layerID = m_strawIDToLayerIDB[strawID];
344 if (layerID > 0)
345 strawID -= m_integralDistributionOfStrawsB[layerID - 1];
346 }
347 else
348 {
349 layerID = m_strawIDToLayerIDC[strawID];
350 if (layerID > 0)
351 strawID -= m_integralDistributionOfStrawsC[layerID - 1];
352 }
353
354 return layerID;
355}
356
357
358// Called by ~TRTProcessingOfBarrelHits
359
361{
362
363 if (m_verboseLevel>5) { G4cout << "######### Method TRTProcessingOfBarrelHits::DeleteArrays" << G4endl; }
364
368
369 if (m_barrelIdentifier == 2)
370 {
371 delete [] m_strawIDToLayerIDA;
372 delete [] m_strawIDToLayerIDB;
373 delete [] m_strawIDToLayerIDC;
374 }
375
376 if (m_verboseLevel>5) { G4cout << "######### Method TRTProcessingOfBarrelHits::DeleteArrays done" << G4endl; }
377}
int GetLayerID2(const int &, int &) const
TRTProcessingOfBarrelHits(TRTSensitiveDetector *)
TRTSensitiveDetector * m_pSensitiveDetector
int GetLayerID1(const int &, int &) const
HepMcParticleLink GenerateParticleLink()
Generates a creates new HepMcParticleLink object on the stack based on GetUniqueID(),...
Definition TrackHelper.h:52
int GetUniqueID() const
std::string depth
tag string for intendation
Definition fastadd.cxx:46