ATLAS Offline Software
Loading...
Searching...
No Matches
GeantFollowerMS.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6// GeantFollowerMS.cxx, (c) ATLAS Detector software
8
11
12#include "G4Event.hh"
13#include "G4Step.hh"
14#include "G4Material.hh"
15#include "G4Element.hh"
16#include "G4StepPoint.hh"
17#include "G4TouchableHistory.hh"
18#include "G4LogicalVolume.hh"
19#include "G4DynamicParticle.hh"
20#include "G4Track.hh"
21
22namespace G4UA
23{
24
26 : m_config(config)
27 , m_helperPointer(nullptr)
28 {}
29
31 {
32 // FIXME: thread-unsafe tool usage in thread-local action? ATLASSIM-3562.
33 m_helperPointer->beginEvent();
34 }
35
37 {
38 // FIXME: thread-unsafe tool usage in thread-local action? ATLASSIM-3562.
39 m_helperPointer->endEvent();
40 }
41
43 {
44 if(m_config.helper.retrieve()!=StatusCode::SUCCESS) {
45 G4ExceptionDescription description;
46 description << "Cannot retrieve GeantFollowerMS helper";
47 G4Exception("GeantFollowerMS", "GeantFollowerMS1", FatalException, description);
48 return;
49 }
50 m_helperPointer = (&(*m_config.helper));
51
52 if(m_config.trackingGeometrySvc.retrieve()!=StatusCode::SUCCESS) {
53 G4ExceptionDescription description;
54 description << "Cannot retrieve TrackingGeometrySvc in GeantFollowerMS";
55 G4Exception("GeantFollowerMS", "GeantFollowerMS2", FatalException, description);
56 return;
57 }
58
59 }
60
61 void GeantFollowerMS::UserSteppingAction(const G4Step* aStep)
62 {
63 // kill secondaries
64 if (aStep->GetTrack()->GetParentID()) {
65 aStep->GetTrack()->SetTrackStatus(fStopAndKill);
66 return;
67 }
68
69 // get the prestep point and follow this guy
70 G4StepPoint * g4PreStep = aStep->GetPreStepPoint();
71 G4ThreeVector g4Momentum = g4PreStep->GetMomentum();
72 const G4ThreeVector& g4Position = g4PreStep->GetPosition();
73
74 G4Track* g4Track = aStep->GetTrack();
75 const G4DynamicParticle* g4DynParticle = g4Track->GetDynamicParticle();
76
77 // the material information
78 const G4TouchableHistory* touchHist =
79 static_cast<const G4TouchableHistory*>(aStep->GetPreStepPoint()->GetTouchable());
80
81 if(touchHist) [[likely]] {
82 // G4LogicalVolume
83 const G4LogicalVolume *lv= touchHist->GetVolume()->GetLogicalVolume();
84
85 if(lv) [[likely]] {
86 const G4Material *mat = lv->GetMaterial();
87 // the step information
88 double steplength = aStep->GetStepLength();
89 // the position information
90 double X0 = mat->GetRadlen();
91 // update the track follower
92 m_helperPointer->trackParticle(g4Position, g4Momentum,
93 g4DynParticle->GetPDGcode(),
94 g4DynParticle->GetCharge(),
95 steplength, X0);
96 }
97 else {
98 G4ExceptionDescription description;
99 description << "GeantFollowerMS::SteppingAction NULL G4LogicalVolume pointer.";
100 G4Exception("GeantFollowerMS", "GeantFollowerMS3", FatalException, description);
101 }
102 }
103 else {
104 G4ExceptionDescription description;
105 description << "GeantFollowerMS::SteppingAction NULL G4TouchableHistory pointer.";
106 G4Exception("GeantFollowerMS", "GeantFollowerMS4", FatalException, description);
107 }
108 }
109
110} // namespace G4UA
virtual void BeginOfRunAction(const G4Run *) override
Trk::IGeantFollowerMSHelper * m_helperPointer
virtual void BeginOfEventAction(const G4Event *) override
virtual void EndOfEventAction(const G4Event *) override
GeantFollowerMS(const Config &config)
virtual void UserSteppingAction(const G4Step *) override
std::string description
glabal timer - how long have I taken so far?
Definition hcg.cxx:93
#define likely(x)