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 // 27 // 28 // Author: Alfonso Mantero (Alfonso.Mantero@ge 29 // 30 // History: 31 // ----------- 32 // 02 Sep 2003 Alfonso Mantero created 33 // 34 // ------------------------------------------- 35 36 #include "XrayFluoPlanePrimaryGeneratorAction. 37 #include "XrayFluoPlaneDetectorConstruction.hh 38 #include "XrayFluoPlanePrimaryGeneratorMesseng 39 #include "XrayFluoRunAction.hh" 40 #include "XrayFluoAnalysisManager.hh" 41 #include "XrayFluoDataSet.hh" 42 #include "G4PhysicalConstants.hh" 43 #include "G4SystemOfUnits.hh" 44 #include "G4UnitsTable.hh" 45 #include "G4DataVector.hh" 46 #include "G4Event.hh" 47 #include "G4ParticleGun.hh" 48 #include "G4ParticleTable.hh" 49 #include "G4ParticleDefinition.hh" 50 #include "Randomize.hh" 51 52 //....oooOO0OOooo........oooOO0OOooo........oo 53 54 XrayFluoPlanePrimaryGeneratorAction::XrayFluoP 55 :rndmFlag("on"),beam("off"),spectrum("off"), 56 { 57 58 XrayFluoDetector = XrayFluoDC; 59 60 G4int n_particle = 1; 61 particleGun = new G4ParticleGun(n_particle) 62 63 //create a messenger for this class 64 gunMessenger = new XrayFluoPlanePrimaryGener 65 runManager = new XrayFluoRunAction(); 66 67 // default particle kinematic 68 69 G4ParticleTable* particleTable = G4ParticleT 70 G4String particleName; 71 G4ParticleDefinition* particle 72 = particleTable->FindParticle(particleName 73 particleGun->SetParticleDefinition(particle) 74 particleGun->SetParticleMomentumDirection(G4 75 76 77 particleGun->SetParticleEnergy(10.*keV); 78 G4double position = -0.5*(XrayFluoDetector-> 79 particleGun->SetParticlePosition(G4ThreeVect 80 81 G4cout << "XrayFluoPlanePrimaryGeneratorActi 82 83 } 84 85 86 //....oooOO0OOooo........oooOO0OOooo........oo 87 88 XrayFluoPlanePrimaryGeneratorAction::~XrayFluo 89 { 90 delete particleGun; 91 delete gunMessenger; 92 delete runManager; 93 94 G4cout << "XrayFluoPlanePrimaryGeneratorActi 95 96 } 97 98 //....oooOO0OOooo........oooOO0OOooo........oo 99 100 void XrayFluoPlanePrimaryGeneratorAction::Gene 101 { 102 //this function is called at the begining of 103 // 104 G4double z0 = -0.5*(XrayFluoDetector->GetWor 105 G4double y0 = 0.*m, x0 = 0.*m; 106 G4double dX = 0.5*(XrayFluoDetector->GetWorl 107 if (rndmFlag == "on") 108 109 {y0 = (XrayFluoDetector->GetPlaneSizeXY()) 110 x0 = (XrayFluoDetector->GetPlaneSizeXY())* 111 } 112 113 z0 = -1 * dX; 114 115 particleGun->SetParticleMomentumDirection(G4 116 117 particleGun->SetParticlePosition(G4ThreeVect 118 119 //randomize starting point 120 if (beam == "on") 121 { 122 G4double radius = 0.5 * mm; 123 G4double rho = radius*std::sqrt(G4Unifor 124 G4double theta = 2*pi*G4UniformRand()*ra 125 G4double position = -0.5*(XrayFluoDetect 126 127 G4double y = rho * std::sin(theta); 128 G4double x = rho * std::cos(theta); 129 130 particleGun->SetParticlePosition(G4Three 131 } 132 //shoot particles according to a certain spe 133 if (spectrum =="on") 134 { 135 G4String particle = particleGun->GetPar 136 ->GetParticleName(); 137 if(particle == "proton"|| particle == "a 138 { 139 G4DataVector* energies = runManager->GetE 140 G4DataVector* data = runManager->GetData( 141 142 G4double sum = runManager->GetDataSum(); 143 G4double partSum = 0; 144 G4int j = 0; 145 G4double random= sum*G4UniformRand(); 146 while (partSum<random) 147 { 148 partSum += (*data)[j]; 149 j++; 150 } 151 152 particleGun->SetParticleEnergy((*energies) 153 154 } 155 else if (particle == "gamma") 156 { 157 const XrayFluoDataSet* dataSet = runManage 158 159 G4int i = 0; 160 G4int id = 0; 161 G4double minEnergy = 0. * keV; 162 G4double particleEnergy= 0.; 163 G4double maxEnergy = 10. * keV; 164 G4double energyRange = maxEnergy - minEner 165 166 while ( i == 0) 167 { 168 G4double random = G4UniformRand(); 169 170 G4double randomNum = G4UniformRand(); 171 172 particleEnergy = (random*energyRange) 173 174 if ((dataSet->FindValue(particleEnergy 175 { 176 i = 1; 177 178 } 179 } 180 particleGun->SetParticleEnergy(particleEn 181 } 182 } 183 184 if (isoVert == "on") 185 { 186 G4double rho = 1. *m; 187 //theta in [0;pi/2] 188 G4double theta = (pi/2)*G4UniformRand(); 189 //phi in [-pi;pi] 190 G4double phi = (G4UniformRand()*2*pi)- p 191 G4double x = rho*std::sin(theta)*std::si 192 G4double y = rho*std::sin(theta)*std::co 193 G4double z = -(rho*std::cos(theta)); 194 particleGun->SetParticlePosition(G4Three 195 196 G4double Xdim = XrayFluoDetector->GetPla 197 G4double Ydim = XrayFluoDetector->GetPla 198 199 G4double Dx = Xdim*(G4UniformRand()-0.5) 200 201 G4double Dy = Ydim*(G4UniformRand()-0.5) 202 203 particleGun->SetParticleMomentumDirectio 204 205 } 206 #ifdef G4ANALYSIS_USE 207 208 G4double partEnergy = particleGun->GetPartic 209 XrayFluoAnalysisManager* analysis = XrayFlu 210 analysis->analysePrimaryGenerator(partEnergy 211 212 #endif 213 214 particleGun->GeneratePrimaryVertex(anEvent); 215 } 216 217 //....oooOO0OOooo........oooOO0OOooo........oo 218 219 220 221 222 223 224 225 226 227