ATLAS Offline Software
Loading...
Searching...
No Matches
TrackFastSimSD.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
10
11// Geant4 headers
12#include "G4ChargedGeantino.hh"
13#include "G4DynamicParticle.hh"
14#include "G4Geantino.hh"
15#include "G4Track.hh"
16#include "G4VPhysicalVolume.hh"
17#include "G4VSolid.hh"
18
19// STL headers
20#include <cmath>
21
22TrackFastSimSD::TrackFastSimSD(const std::string& name, const std::string& outputCollectionName, const int SD_type)
23 : G4VSensitiveDetector( name )
24 , m_trackRecordCollection( outputCollectionName )
25 , m_SD_type( SD_type )
26{
27}
28
29// Initialize from G4 - necessary to new the write handle for now
30void TrackFastSimSD::Initialize(G4HCofThisEvent *)
31{
32 if (!m_trackRecordCollection.isValid()) m_trackRecordCollection = std::make_unique<TrackRecordCollection>(m_trackRecordCollection.name());
33}
34
35G4bool TrackFastSimSD::ProcessHits(G4Step* aStep,G4TouchableHistory* )
36{
37 if (!m_SD_type) { return false; }
38 const G4StepPoint *preStep=aStep->GetPreStepPoint();
39 const G4VPhysicalVolume *preVol=preStep->GetPhysicalVolume();
40 const G4StepPoint *postStep=aStep->GetPostStepPoint();
41 const G4VPhysicalVolume *postVol=postStep->GetPhysicalVolume();
42
43 if (preVol==postVol) { return false; }
44
45 const G4Track *track(aStep->GetTrack());
46
47 // PDG Code
48 int pdgcode = (track->GetDefinition())?track->GetDefinition()->GetPDGEncoding():0;
49 if (track->GetDefinition() == G4Geantino::Definition() ) pdgcode=999;
50 if (track->GetDefinition() == G4ChargedGeantino::Definition() ) pdgcode=998;
51
52 // Position and Momentum
53 G4ThreeVector pos=postStep->GetPosition();
54 G4ThreeVector mom=postStep->GetMomentum();
55
56 if(m_SD_type==2)
57 {
58 // need to get the local position
59 const G4TouchableHistory* touchHist = static_cast<const G4TouchableHistory*>(preStep->GetTouchable());
60 const G4AffineTransform trans = track->GetTouchable()->GetHistory()->GetTopTransform(); // trans from global to local
61 G4ThreeVector localPos=trans.TransformPoint(pos);
62 G4ThreeVector localMom=mom;
63 trans.ApplyAxisTransform(localMom); // rotate momentum as needed
64 const G4VSolid *shape= touchHist->GetSolid();
65 const G4ThreeVector normal=shape->SurfaceNormal(localPos);
66 // check if particle is entering. if it is extiting don't record it.
67 if(normal.dot(localPos)>=0.) return false;
68 }
69
70 // Energy
71 const double ener=postStep->GetTotalEnergy();
72
73 // Time
74 const double time=postStep->GetGlobalTime();
75
76 // Barcode
77 TrackHelper trHelp(track);
78 const int barcode = trHelp.GetBarcode(); // FIXME barcode based
79 const int id = trHelp.GetUniqueID();
80 const int status = trHelp.GetStatus();
81
82 //create the TimedTrackRecord
84 pdgcode,
85 status,
86 ener,
87 mom,
88 pos,
89 time,
90 barcode, // FIXME barcode based
91 id,
92 preVol->GetName());
93
94 return true;
95}
96
97void TrackFastSimSD::WriteTrack(const G4Track* track, const bool originPos, const bool originMom)
98{
99 if (!track) { G4cout << "ERROR: the track pointer was zero" << G4endl; return; }
100
101 G4VPhysicalVolume *preVol=track->GetVolume();
102
103 const int pdgcode = (track->GetDefinition())?track->GetDefinition()->GetPDGEncoding():0;
104
105 const G4ThreeVector pos = originPos?track->GetVertexPosition():track->GetPosition();
106 const double ener=originMom?(track->GetVertexKineticEnergy()+track->GetDynamicParticle()->GetMass()):track->GetTotalEnergy();
107 G4ThreeVector mom = track->GetMomentum();
108 if (originMom){
109 double mommag = std::sqrt(std::pow(ener,2)-std::pow(track->GetDynamicParticle()->GetMass(),2));
110 mom = track->GetVertexMomentumDirection()*mommag;
111 }
112
113 const double time=track->GetGlobalTime();
114 TrackHelper trHelp(track);
115 const int barcode = trHelp.GetBarcode(); // FIXME barcode based
116 const int id = trHelp.GetUniqueID();
117 const int status = trHelp.GetStatus();
118
119 //create the TimedTrackRecord
121 pdgcode,
122 status,
123 ener,
124 mom,
125 pos,
126 time,
127 barcode, // FIXME barcode based
128 id,
129 preVol?preVol->GetName():"Unknown");
130}
131
G4bool ProcessHits(G4Step *, G4TouchableHistory *) override final
SG::WriteHandle< TrackRecordCollection > m_trackRecordCollection
TrackFastSimSD(const std::string &name, const std::string &outputCollectionName, const int SD_type=0)
void Initialize(G4HCofThisEvent *) override final
void WriteTrack(const G4Track *, const bool, const bool)
int GetBarcode() const
int GetUniqueID() const
int GetStatus() const