ECCE @ EIC Software
Reference for
ECCE @ EIC
simulation and reconstruction software on GitHub
Home page
Related Pages
Modules
Namespaces
Classes
Files
External Links
File List
File Members
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
doiPETSteppingAction.cc
Go to the documentation of this file.
Or view
the newest version in sPHENIX GitHub for file doiPETSteppingAction.cc
1
//
2
// ********************************************************************
3
// * License and Disclaimer *
4
// * *
5
// * The Geant4 software is copyright of the Copyright Holders of *
6
// * the Geant4 Collaboration. It is provided under the terms and *
7
// * conditions of the Geant4 Software License, included in the file *
8
// * LICENSE and available at http://cern.ch/geant4/license . These *
9
// * include a list of copyright holders. *
10
// * *
11
// * Neither the authors of this software system, nor their employing *
12
// * institutes,nor the agencies providing financial support for this *
13
// * work make any representation or warranty, express or implied, *
14
// * regarding this software system or assume any liability for its *
15
// * use. Please see the license in the file LICENSE and URL above *
16
// * for the full disclaimer and the limitation of liability. *
17
// * *
18
// * This code implementation is the result of the scientific and *
19
// * technical work of the GEANT4 collaboration. *
20
// * By using, copying, modifying or distributing the software (or *
21
// * any work based on the software) you agree to acknowledge its *
22
// * use in resulting scientific publications, and indicate your *
23
// * acceptance of all terms of the Geant4 Software license. *
24
// ********************************************************************
25
26
//GEANT4 - Depth-of-Interaction enabled Positron emission tomography (PET) advanced example
27
28
//Authors and contributors
29
30
// Author list to be updated, with names of co-authors and contributors from National Institute of Radiological Sciences (NIRS)
31
32
// Abdella M. Ahmed (1, 2), Andrew Chacon (1, 2), Harley Rutherford (1, 2),
33
// Hideaki Tashima (3), Go Akamatsu (3), Akram Mohammadi (3), Eiji Yoshida (3), Taiga Yamaya (3)
34
// Susanna Guatelli (2), and Mitra Safavi-Naeini (1, 2)
35
36
// (1) Australian Nuclear Science and Technology Organisation, Australia
37
// (2) University of Wollongong, Australia
38
// (3) National Institute of Radiological Sciences, Japan
39
40
41
#include "
doiPETSteppingAction.hh
"
42
#include "
doiPETAnalysis.hh
"
43
#include "
doiPETRun.hh
"
44
#include "
doiPETEventAction.hh
"
45
46
#include "
G4Step.hh
"
47
#include "
G4RunManager.hh
"
48
#include "
G4SteppingManager.hh
"
49
50
#include "
G4SystemOfUnits.hh
"
51
#include "
G4PhysicalConstants.hh
"
52
#include <limits>
53
55
/*doiPETSteppingAction::doiPETSteppingAction()
56
{;}*/
57
doiPETSteppingAction::doiPETSteppingAction
()
58
:
G4UserSteppingAction
()
59
{ }
60
62
doiPETSteppingAction::~doiPETSteppingAction
()
63
{;}
64
66
void
doiPETSteppingAction::UserSteppingAction
(
const
G4Step
* aStep)
67
{
68
doiPETRun
* run =
static_cast<
doiPETRun
*
>
(
G4RunManager::GetRunManager
()->
GetNonConstCurrentRun
());
69
70
G4Track
*
track
= aStep->
GetTrack
();
71
G4String
volumeName = aStep->
GetPreStepPoint
()->
GetPhysicalVolume
()->
GetName
();
72
G4double
edep
= aStep->
GetTotalEnergyDeposit
();
73
G4String
processName =aStep->
GetPostStepPoint
()->
GetProcessDefinedStep
()->
GetProcessName
();
74
G4String
particleName = track->
GetDynamicParticle
()->
GetDefinition
()->
GetParticleName
();
75
//G4int eventID = G4RunManager::GetRunManager()->GetCurrentEvent() -> GetEventID();
76
G4ThreeVector
pos
= track->
GetPosition
();
77
78
//G4StepPoint* point1 = aStep->GetPreStepPoint();
79
//G4ThreeVector posIntCrystal = point1->GetPosition();
80
81
//G4StepPoint* p2 = aStep->GetPostStepPoint();
82
G4StepPoint
* p1 = aStep->
GetPreStepPoint
();
83
G4ThreeVector
coord1 = p1->
GetPosition
();
84
85
//The following is to get the local position of the with respect to the crystal volume
86
const
G4AffineTransform
transformation = p1->
GetTouchable
()-> GetHistory()->GetTopTransform();
87
G4ThreeVector
localPosition = transformation.
TransformPoint
(coord1);
88
89
G4int
blockID;
90
G4int
crystalID;
91
92
G4int
scatterIndex = 0;
//For checking
93
94
//If an event is created in a cold region or outside the physical volume, then it will be killed.
95
if
((volumeName !=
"phantom_physicalV"
|| volumeName ==
"coldRegion_physicalV"
) && particleName==
"e+"
){
96
track->
SetTrackStatus
(
fStopAndKill
);
97
return
;
98
}
99
100
//Get the source position if the process name is annihilation
101
if
(processName ==
"annihil"
&& volumeName==
"phantom_physicalV"
){
102
doiPETAnalysis::GetInstance
()->
SetSourcePosition
(pos);
103
run->
SetAnnihilationTime
((track->
GetGlobalTime
()));
104
}
105
106
//get event ID
107
//doiPETAnalysis::GetInstance()->SetEventID (eventID);
108
109
//Get scatter information in the phantom by the annihilation photon before detected by the detector. Note that the scatter index is initialized to 0.
110
//If there is scatter, the index is 1, and if not it is 0.
111
if
(edep>0 && (volumeName ==
"phantom_physicalV"
)) scatterIndex = 1;
112
doiPETAnalysis::GetInstance
()->
GetScatterIndexInPhantom
(scatterIndex);
113
115
if
(edep>0. && volumeName==
"Crystal_physicalV"
){
116
117
//get the copy number of the block
118
blockID = aStep->
GetPreStepPoint
()->
GetTouchableHandle
()->
GetCopyNumber
(2);
119
120
//get the crystal copy number
121
crystalID = aStep->
GetPreStepPoint
()->
GetTouchableHandle
()->
GetCopyNumber
(0);
122
123
//G4cout<<localPosition.x()<<" "<<localPosition.y()<<" "<<localPosition.z()<<G4endl;
124
125
//get event ID
126
//doiPETAnalysis::GetInstance()->GetEventID (eventID);
127
128
//define a pointer for extracting information
129
InteractionInformation
* ExtractIntInfo =
new
InteractionInformation
();
130
131
//get the energy deposition of each interaction
132
ExtractIntInfo->
SetEdep
( edep );
133
134
135
//get the blockID
136
ExtractIntInfo->
SetBlockNo
( blockID );
137
138
139
//get the crystal ID
140
ExtractIntInfo->
SetCrystalNo
( crystalID );
141
142
143
//get local position interaction in the crystal
144
ExtractIntInfo->
SetInteractionPositionInCrystal
(localPosition);
145
146
//get the global time of the interaction with the crystal
147
ExtractIntInfo->
SetGlobalTime
( track->
GetGlobalTime
());
148
//G4cout<<"Step: "<<eventID<<" "<<blockID<<" "<<crystalID<<" "<<edep<<G4endl;
149
150
//pass all the obtained information to the doiPETAnalysis class
151
//doiPETAnalysis::GetInstance()->GetIntractionInfomation(ExtractIntInfo);
152
run->
GetIntractionInfomation
(ExtractIntInfo);
153
154
}
155
}
geant4
tree
geant4-10.6-release
examples
advanced
doiPET
src
doiPETSteppingAction.cc
Built by
Jin Huang
. updated:
Wed Jun 29 2022 17:24:57
using
1.8.2 with
ECCE GitHub integration