ECCE @ EIC Software
 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 {;}*/
59 { }
60 
63 {;}
64 
67 {
69 
70  G4Track* track = aStep->GetTrack();
71  G4String volumeName = aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName();
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+"){
97  return;
98  }
99 
100  //Get the source position if the process name is annihilation
101  if(processName == "annihil" && volumeName=="phantom_physicalV"){
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;
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 }