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 /// \file medical/dna/range/src/SteppingAction.cc 27 /// \brief Implementation of the SteppingAction class 28 // 29 // $Id: SteppingAction.cc 78723 2014-01-20 10:32:17Z gcosmo $ 30 // 31 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 33 34 #include "SteppingAction.hh" 35 36 #include "DetectorConstruction.hh" 37 #include "HistoManager.hh" 38 #include "Run.hh" 39 40 #include "G4Electron.hh" 41 #include "G4RunManager.hh" 42 43 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 44 45 SteppingAction::SteppingAction() : G4UserSteppingAction(), fpDetector(0), fRNP(0), fRAbs(0) 46 { 47 fpDetector = dynamic_cast<const DetectorConstruction*>( 48 G4RunManager::GetRunManager()->GetUserDetectorConstruction()); 49 fRNP = fpDetector->GetNPRadius() / CLHEP::nm; 50 fRAbs = fpDetector->GetAbsRadius() / CLHEP::nm; 51 fTrackCut = fpDetector->GetTrackingCut() / CLHEP::eV; 52 } 53 54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 55 56 SteppingAction::~SteppingAction() {} 57 58 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 59 60 void SteppingAction::UserSteppingAction(const G4Step* aStep) 61 { 62 fpDetector = dynamic_cast<const DetectorConstruction*>( 63 G4RunManager::GetRunManager()->GetUserDetectorConstruction()); 64 fRNP = fpDetector->GetNPRadius() / CLHEP::nm; 65 fRAbs = fpDetector->GetAbsRadius() / CLHEP::nm; 66 fTrackCut = fpDetector->GetTrackingCut() / CLHEP::eV; 67 68 G4ThreeVector pos = aStep->GetPreStepPoint()->GetPosition(); 69 G4ThreeVector postpos = aStep->GetPostStepPoint()->GetPosition(); 70 71 G4double R = pos.mag() / CLHEP::nm; 72 73 if (fRNP < R) { 74 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); 75 G4double energy = aStep->GetTotalEnergyDeposit() / CLHEP::joule; 76 analysisManager->FillH1(1, R, energy); 77 } 78 79 R = pos.mag() / CLHEP::nm; 80 if (fRNP < R) { 81 if (std::abs(pos.z()) < 10 * CLHEP::nm) { 82 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); 83 G4double energy = aStep->GetTotalEnergyDeposit() / CLHEP::joule; 84 G4double theta = std::atan2(pos.y(), pos.x()) / CLHEP::deg; 85 if (0 <= theta) { 86 analysisManager->FillH2(0, theta, R, energy); 87 } 88 else { 89 analysisManager->FillH2(0, theta + 360, R, energy); 90 } 91 } 92 } 93 94 if (aStep->GetPreStepPoint()->GetPhysicalVolume()->GetName() == "NanoParticle") { 95 if (aStep->GetPostStepPoint()->GetStepStatus() == fGeomBoundary) { 96 //*** WARNING: this line will kill all incident electrons 97 //*** at the end NP surface*** 98 G4AnalysisManager* analysisManager = G4AnalysisManager::Instance(); 99 G4Track* track = aStep->GetTrack(); 100 G4double trackE = track->GetKineticEnergy() / CLHEP::eV; 101 102 if (aStep->GetTrack()->GetTrackID() == 1) { 103 if (pos.x() < 0) { 104 analysisManager->FillH1(8, trackE); 105 } 106 else { 107 analysisManager->FillH1(9, trackE); 108 } 109 aStep->GetTrack()->SetTrackStatus(fStopAndKill); 110 } 111 else { 112 G4ThreeVector dir = aStep->GetPostStepPoint()->GetMomentumDirection(); 113 G4double dot = dir.dot(postpos); 114 if (dot < 0.0) { 115 return; 116 } 117 118 if (trackE < fTrackCut) { 119 aStep->GetTrack()->SetTrackStatus(fStopAndKill); 120 return; 121 } 122 123 if (track->GetDefinition()->GetPDGCharge() != 0) { 124 analysisManager->FillH1(4, trackE); 125 } 126 else { 127 analysisManager->FillH1(5, trackE); 128 } 129 } 130 } 131 } 132 } 133 134 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 135