Geant4 Cross Reference |
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 // This example is provided by the Geant4-DNA collaboration 27 // chem6 example is derived from chem4 and chem5 examples 28 // 29 // Any report or published results obtained using the Geant4-DNA software 30 // shall cite the following Geant4-DNA collaboration publication: 31 // J. Appl. Phys. 125 (2019) 104301 32 // Med. Phys. 45 (2018) e722-e739 33 // J. Comput. Phys. 274 (2014) 841-882 34 // Med. Phys. 37 (2010) 4692-4708 35 // Int. J. Model. Simul. Sci. Comput. 1 (2010) 157-178 36 // The Geant4-DNA web site is available at http://geant4-dna.org 37 // 38 // Authors: W. G. Shin and S. Incerti (CENBG, France) 39 // 40 // $Id$ 41 // 42 /// \file ScoreLET.cc 43 /// \brief Implementation of the ScoreLET class 44 45 #include "ScoreLET.hh" 46 47 #include "G4RunManager.hh" 48 #include "G4SystemOfUnits.hh" 49 50 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 51 52 ScoreLET::ScoreLET(G4String name) : G4VPrimitiveScorer(name), G4UImessenger(), fEvtMap(0) 53 { 54 fpLETDir = new G4UIdirectory("/scorer/LET/"); 55 fpLETDir->SetGuidance("LET scorer commands"); 56 57 fpCutoff = new G4UIcmdWithADoubleAndUnit("/scorer/LET/cutoff", this); 58 } 59 60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 61 62 ScoreLET::~ScoreLET() 63 { 64 delete fpLETDir; 65 delete fpCutoff; 66 } 67 68 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 69 70 void ScoreLET::SetNewValue(G4UIcommand* command, G4String newValue) 71 { 72 if (command == fpCutoff) fCutoff = atof(newValue); 73 } 74 75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 76 77 G4bool ScoreLET::ProcessHits(G4Step* aStep, G4TouchableHistory* /*TH*/) 78 { 79 // In order to follow the primary track 80 // regardless charge increasing or decreasing 81 if (aStep->GetTrack()->GetTrackID() != 1 82 && aStep->GetTrack()->GetParticleDefinition()->GetPDGEncoding() != 11) 83 { 84 G4int subType = aStep->GetTrack()->GetCreatorProcess()->GetProcessSubType(); 85 if (subType == 56 || subType == 57) { 86 fTrackID = aStep->GetTrack()->GetTrackID(); 87 } 88 } 89 90 // Ignore the step if it is not primary. 91 if (aStep->GetTrack()->GetTrackID() != fTrackID) 92 return false; 93 else { 94 fStepL += aStep->GetStepLength() / um; 95 fEdep += aStep->GetTotalEnergyDeposit() / keV; 96 97 G4int subType = aStep->GetPostStepPoint()->GetProcessDefinedStep()->GetProcessSubType(); 98 99 // Don't add the kinetic energy of primary particle 100 if (subType == 56 || subType == 57) return false; 101 102 const std::vector<const G4Track*>* secondary = aStep->GetSecondaryInCurrentStep(); 103 104 size_t nbtrk = (*secondary).size(); 105 106 if (nbtrk) { 107 for (size_t lp = 0; lp < nbtrk; lp++) { 108 // Store the kinetic energy of secondaries 109 // which less than cutoff energy. 110 if ((*secondary)[lp]->GetKineticEnergy() / eV < fCutoff) { 111 fEdep += (*secondary)[lp]->GetKineticEnergy() / keV; 112 } 113 } 114 } 115 } 116 return true; 117 } 118 119 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 120 121 void ScoreLET::Initialize(G4HCofThisEvent* HCE) 122 { 123 fEvtMap = new G4THitsMap<G4double>(GetMultiFunctionalDetector()->GetName(), GetName()); 124 125 fEvtMap->clear(); 126 fNEvent = 0; 127 static G4int HCID = -1; 128 if (HCID < 0) { 129 HCID = GetCollectionID(0); 130 } 131 HCE->AddHitsCollection(HCID, (G4VHitsCollection*)fEvtMap); 132 } 133 134 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 135 136 void ScoreLET::EndOfEvent(G4HCofThisEvent*) 137 { 138 if (fStepL > 0) { 139 fLET = fEdep / fStepL; 140 if (!G4RunManager::GetRunManager()->GetCurrentEvent()->IsAborted()) { 141 fEvtMap->add(fNEvent, fLET); 142 fNEvent++; 143 } 144 } 145 fTrackID = 1; 146 fLET = 0; 147 fEdep = 0; 148 fStepL = 0; 149 } 150 151 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 152 153 G4int ScoreLET::GetIndex(G4Step* /*aStep*/) 154 { 155 return 0; 156 } 157 158 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo..... 159