Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // Hadrontherapy advanced example for Geant4 27 // See more at: https://twiki.cern.ch/twiki/bi 28 29 #include "HadrontherapyDetectorSD.hh" 30 #include "HadrontherapyDetectorHit.hh" 31 #include "G4Step.hh" 32 #include "G4VTouchable.hh" 33 #include "G4TouchableHistory.hh" 34 #include "G4SDManager.hh" 35 #include "HadrontherapyMatrix.hh" 36 #include "HadrontherapyLet.hh" 37 #include "G4Track.hh" 38 #include "G4SystemOfUnits.hh" 39 #include "HadrontherapyMatrix.hh" 40 41 42 #include "G4SteppingManager.hh" 43 #include "G4TrackVector.hh" 44 #include "HadrontherapySteppingAction.hh" 45 #include "G4ios.hh" 46 #include "G4SteppingManager.hh" 47 #include "G4Track.hh" 48 #include "G4Step.hh" 49 #include "G4StepPoint.hh" 50 #include "G4TrackStatus.hh" 51 #include "G4TrackVector.hh" 52 #include "G4ParticleDefinition.hh" 53 #include "G4ParticleTypes.hh" 54 #include "G4UserEventAction.hh" 55 #include "G4TransportationManager.hh" 56 #include "G4VSensitiveDetector.hh" 57 #include "HadrontherapyRunAction.hh" 58 #include "G4SystemOfUnits.hh" 59 #include "HadrontherapyRBE.hh" 60 #include <G4AccumulableManager.hh> 61 62 63 ////////////////////////////////////////////// 64 HadrontherapyDetectorSD::HadrontherapyDetector 65 G4VSensitiveDetector(name) 66 { 67 G4String HCname; 68 collectionName.insert(HCname="Hadrontherap 69 HitsCollection = NULL; 70 sensitiveDetectorName = name; 71 72 } 73 74 ////////////////////////////////////////////// 75 HadrontherapyDetectorSD::~HadrontherapyDetecto 76 {} 77 78 ////////////////////////////////////////////// 79 void HadrontherapyDetectorSD::Initialize(G4HCo 80 { 81 82 HitsCollection = new HadrontherapyDetector 83 84 } 85 86 ////////////////////////////////////////////// 87 G4bool HadrontherapyDetectorSD::ProcessHits(G4 88 { 89 90 91 if (aStep -> GetPreStepPoint() -> GetPhysi 92 93 94 // Get kinetic energy 95 G4Track * theTrack = aStep -> GetTrack() 96 G4double kineticEnergy = theTrack->GetKine 97 G4ParticleDefinition *particleDef = theTra 98 //Get particle name 99 G4String particleName = particleDef -> Ge 100 101 // Get particle PDG code 102 G4int pdg = particleDef ->GetPDGEncoding() 103 104 // Get unique track_id (in an event) 105 G4int trackID = theTrack -> GetTrackID(); 106 107 G4double energyDeposit = aStep -> GetTotal 108 109 G4double DX = aStep -> GetStepLength(); 110 G4int Z = particleDef-> GetAtomicNumber(); 111 G4int A = particleDef-> GetAtomicMass(); 112 G4StepPoint* PreStep = aStep->GetPreStepPo 113 114 // Read voxel indexes: i is the x index, k 115 const G4VTouchable* touchable = aStep->Get 116 G4int k = touchable->GetReplicaNumber(0); 117 G4int i = touchable->GetReplicaNumber(2); 118 G4int j = touchable->GetReplicaNumber(1); 119 120 G4TouchableHandle touchPreStep = PreStep-> 121 G4VPhysicalVolume* volumePre = touchPreSte 122 G4String namePre = volumePre->GetName(); 123 124 125 126 HadrontherapyMatrix* matrix = Hadrontherap 127 HadrontherapyLet* let = HadrontherapyLet:: 128 129 G4int* hitTrack = matrix -> GetHitTrack(i, 130 131 132 // ******************** let ************* 133 if (let) 134 { 135 if ( !(Z==0 && A==1) ) // All but not 136 { 137 if( energyDeposit>0. && DX >0. )// 138 { 139 if (pdg !=22 && pdg !=11) // n 140 { 141 142 // Get the pre-step kineti 143 G4double eKinPre = aStep - 144 // Get the post-step kinet 145 G4double eKinPost = aStep 146 // Get the step average ki 147 G4double eKinMean = (eKinP 148 149 // get the material 150 const G4Material * materia 151 152 // get the secondary patic 153 G4Step fstep = *theTrack - 154 // store all the secondary 155 const std::vector<const G4 156 157 size_t SecondarySize = (*s 158 G4double EnergySecondary = 159 160 // get secondary electrons 161 if (SecondarySize) // calc 162 { 163 for (size_t numsec = 0 164 { 165 //Get the PDG code 166 G4int PDGSecondary 167 168 if(PDGSecondary == 169 { 170 // calculate t 171 EnergySecondar 172 } 173 } 174 175 } 176 177 // call the let filldatas 178 let -> FillEnergySpectrum( 179 180 } 181 } 182 } 183 } 184 185 186 if (matrix) 187 { 188 189 // Increment Fluences & accumulate ene 190 // Hit voxels are marked with track_id 191 //G4int* hitTrack = matrix -> GetHitTr 192 if ( *hitTrack != trackID ) 193 { 194 *hitTrack = trackID; 195 /* 196 * Fill FLUENCE data for every sin 197 * Exclude e-, neutrons, gamma, .. 198 */ 199 if ( Z >= 1) matrix -> Fill(trackI 200 201 } 202 203 if(energyDeposit != 0) 204 { 205 /* 206 * This method will fill a dose m 207 * A method of the HadrontherapyM 208 * is called automatically at the 209 * It permits to store all dose/f 210 */ 211 // if (A==1 && Z==1) // primary an 212 if ( Z>=1 ) // exclude e-, neu 213 matrix -> Fill(trackID, partic 214 /* 215 * Create a hit with the informati 216 */ 217 HadrontherapyDetectorHit* detector 218 detectorHit -> SetEdepAndPosition( 219 HitsCollection -> insert(detectorH 220 } 221 } 222 223 auto rbe = HadrontherapyRBE::GetInstance() 224 if (rbe->IsCalculationEnabled()) 225 { 226 if (!fRBEAccumulable) 227 { 228 fRBEAccumulable = dynamic_cast<Had 229 if (!fRBEAccumulable) 230 { 231 G4Exception("HadrontherapyDete 232 } 233 } 234 if (A>0) //protect against gammas, e- , etc 235 { 236 fRBEAccumulable->Accumulate(kineticEnerg 237 } 238 } 239 240 241 return true; 242 } 243 244 ////////////////////////////////////////////// 245 void HadrontherapyDetectorSD::EndOfEvent(G4HCo 246 { 247 248 static G4int HCID = -1; 249 if(HCID < 0) 250 { 251 HCID = GetCollectionID(0); 252 } 253 254 HCE -> AddHitsCollection(HCID,HitsCollecti 255 } 256 257