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 // This example is provided by the Geant4-DNA 27 // Any report or published results obtained us 28 // shall cite the following Geant4-DNA collabo 29 // Med. Phys. 37 (2010) 4692-4708 30 // and papers 31 // M. Batmunkh et al. J Radiat Res Appl Sci 8 32 // O. Belov et al. Physica Medica 32 (2016) 15 33 // The Geant4-DNA web site is available at htt 34 // 35 // ------------------------------------------- 36 // November 2016 37 // ------------------------------------------- 38 // 39 /// \file PrimaryGeneratorAction.cc 40 /// \brief Implementation of the PrimaryGenera 41 42 #include "PrimaryGeneratorAction.hh" 43 44 #include "G4SystemOfUnits.hh" 45 // 46 #include "CommandLineParser.hh" 47 48 #include "G4Box.hh" 49 #include "G4Event.hh" 50 #include "G4LogicalVolume.hh" 51 #include "G4LogicalVolumeStore.hh" 52 #include "G4Orb.hh" 53 #include "G4ParticleDefinition.hh" 54 #include "G4ParticleGun.hh" 55 #include "G4PhysicalConstants.hh" 56 #include "G4PhysicalVolumeStore.hh" 57 #include "G4Proton.hh" 58 #include "G4VPhysicalVolume.hh" 59 #include "Randomize.hh" 60 61 using namespace G4DNAPARSER; 62 63 //....oooOO0OOooo........oooOO0OOooo........oo 64 65 PrimaryGeneratorAction::PrimaryGeneratorAction 66 { 67 G4int n_particle = 1; 68 fpParticleGun = new G4ParticleGun(n_particle 69 // 70 G4ParticleDefinition* particle = G4Proton::P 71 fpParticleGun->SetParticleDefinition(particl 72 // default gun parameters 73 fpParticleGun->SetParticleEnergy(10. * MeV); 74 fpParticleGun->SetParticleMomentumDirection( 75 fpParticleGun->SetParticlePosition(G4ThreeVe 76 } 77 78 //....oooOO0OOooo........oooOO0OOooo........oo 79 80 PrimaryGeneratorAction::~PrimaryGeneratorActio 81 { 82 delete fpParticleGun; 83 } 84 85 //....oooOO0OOooo........oooOO0OOooo........oo 86 87 void PrimaryGeneratorAction::GeneratePrimaries 88 { 89 // Initial kinetic energy of particles beam 90 91 // G4double Ekin = 10.*MeV; 92 // G4double deltaEkin = 9.0955e-5*MeV; 93 // fpParticleGun->SetParticleEnergy(G4RandGa 94 95 // In order to avoid dependence of PrimaryGe 96 // on DetectorConstruction class we get worl 97 // from G4LogicalVolumeStore 98 99 // We included three options for particles d 100 101 G4double mediumRadius = 0.; 102 G4double boundingXHalfLength = 0.; 103 G4double boundingYHalfLength = 0.; 104 G4double boundingZHalfLength = 0.; 105 G4LogicalVolume* mediumLV = G4LogicalVolumeS 106 G4LogicalVolume* boundingLV = G4LogicalVolum 107 G4Orb* mediumSphere = 0; 108 G4Box* boundingSlice = 0; 109 if (mediumLV && boundingLV) { 110 mediumSphere = dynamic_cast<G4Orb*>(medium 111 boundingSlice = dynamic_cast<G4Box*>(bound 112 } 113 if (mediumSphere && boundingSlice) { 114 mediumRadius = mediumSphere->GetRadius(); 115 boundingXHalfLength = boundingSlice->GetXH 116 boundingYHalfLength = boundingSlice->GetYH 117 boundingZHalfLength = boundingSlice->GetZH 118 119 /// a) Partilces directed to "square" on t 120 /// (or YZ, XZ) 121 122 if (CommandLineParser::GetParser()->GetCom 123 // INITIAL BEAM DIVERGENCE 124 fpParticleGun->SetParticleMomentumDirect 125 // // INITIAL BEAM POSITION 126 fpParticleGun->SetParticlePosition(G4Thr 127 CLHEP::RandFlat::shoot(-boundingXHalfL 128 CLHEP::RandFlat::shoot(-boundingYHalfL 129 } 130 131 /// b) Partilces directed to "disk" on the 132 /// bounding slice (or YZ, XZ) 133 134 else if (CommandLineParser::GetParser()->G 135 fpParticleGun->SetParticleMomentumDirect 136 G4double x0, y0, z0; 137 x0 = 100. * mm; 138 y0 = 100. * mm; 139 z0 = -mediumRadius; // mediumRadius; 140 while (!(std::sqrt(x0 * x0 + y0 * y0) <= 141 x0 = CLHEP::RandFlat::shoot(-mediumRad 142 y0 = CLHEP::RandFlat::shoot(-mediumRad 143 } 144 fpParticleGun->SetParticlePosition(G4Thr 145 } 146 147 /// c) Partilces directed towards the boun 148 // Select a starting position on a sphere 149 // target volume and neuron morphology 150 else { 151 G4double cosTheta = 2. * G4UniformRand() 152 G4double sinTheta = std::sqrt(1. - cosTh 153 G4double phi = twopi * G4UniformRand(); 154 G4ThreeVector positionStart(mediumRadius 155 mediumRadius 156 fpParticleGun->SetParticlePosition(posit 157 // To compute the direction, select a po 158 G4ThreeVector positionDir(boundingXHalfL 159 boundingYHalfL 160 boundingZHalfL 161 fpParticleGun->SetParticleMomentumDirect 162 // Surface area of sphere 163 fGunArea = 4. * pi * mediumRadius * medi 164 } 165 } 166 else { 167 G4cerr << "Bounding slice volume not found 168 G4cerr << "Default particle kinematic used 169 } 170 171 fpParticleGun->GeneratePrimaryVertex(anEvent 172 } 173