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 /// \file eventgenerator/particleGun/src/Prima 27 /// \brief Implementation of the PrimaryGenera 28 // 29 // 30 // 31 //....oooOO0OOooo........oooOO0OOooo........oo 32 //....oooOO0OOooo........oooOO0OOooo........oo 33 34 #include "PrimaryGeneratorAction2.hh" 35 36 #include "PrimaryGeneratorAction.hh" 37 38 #include "G4Event.hh" 39 #include "G4ParticleDefinition.hh" 40 #include "G4ParticleGun.hh" 41 #include "G4ParticleTable.hh" 42 #include "G4PhysicalConstants.hh" 43 #include "G4SystemOfUnits.hh" 44 #include "Randomize.hh" 45 46 //....oooOO0OOooo........oooOO0OOooo........oo 47 48 PrimaryGeneratorAction2::PrimaryGeneratorActio 49 { 50 // energy distribution 51 // 52 InitFunction(); 53 } 54 55 //....oooOO0OOooo........oooOO0OOooo........oo 56 57 void PrimaryGeneratorAction2::GeneratePrimarie 58 { 59 // uniform solid angle 60 G4double cosAlpha = 1. - 2 * G4UniformRand() 61 G4double sinAlpha = std::sqrt(1. - cosAlpha 62 G4double psi = twopi * G4UniformRand(); // 63 G4ThreeVector dir(sinAlpha * std::cos(psi), 64 65 fParticleGun->SetParticleMomentumDirection(d 66 67 // set energy from a tabulated distribution 68 // 69 // G4double energy = RejectAccept(); 70 G4double energy = InverseCumul(); 71 fParticleGun->SetParticleEnergy(energy); 72 73 // create vertex 74 // 75 fParticleGun->GeneratePrimaryVertex(anEvent) 76 } 77 //....oooOO0OOooo........oooOO0OOooo........oo 78 79 void PrimaryGeneratorAction2::InitFunction() 80 { 81 // tabulated function 82 // Y is assumed positive, linear per segment 83 // 84 fNPoints = 16; 85 const G4double xx[] = {37 * keV, 39 * keV, 86 71 * keV, 75 * keV, 87 125 * keV, 145 * keV, 88 89 const G4double yy[] = {0.000, 0.077, 0.380 90 17.644, 18.518, 17.77 91 92 // copy arrays in std::vector and compute fM 93 // 94 fX.resize(fNPoints); 95 fY.resize(fNPoints); 96 fYmax = 0.; 97 for (G4int j = 0; j < fNPoints; j++) { 98 fX[j] = xx[j]; 99 fY[j] = yy[j]; 100 if (fYmax < fY[j]) fYmax = fY[j]; 101 }; 102 103 // compute slopes 104 // 105 fSlp.resize(fNPoints); 106 for (G4int j = 0; j < fNPoints - 1; j++) { 107 fSlp[j] = (fY[j + 1] - fY[j]) / (fX[j + 1] 108 }; 109 110 // compute cumulative function 111 // 112 fYC.resize(fNPoints); 113 fYC[0] = 0.; 114 for (G4int j = 1; j < fNPoints; j++) { 115 fYC[j] = fYC[j - 1] + 0.5 * (fY[j] + fY[j 116 }; 117 } 118 119 //....oooOO0OOooo........oooOO0OOooo........oo 120 121 G4double PrimaryGeneratorAction2::RejectAccept 122 { 123 // tabulated function 124 // Y is assumed positive, linear per segment 125 // (see Particle Data Group: pdg.lbl.gov --> 126 // 127 G4double Xrndm = 0., Yrndm = 0., Yinter = -1 128 129 while (Yrndm > Yinter) { 130 // choose a point randomly 131 Xrndm = fX[0] + G4UniformRand() * (fX[fNPo 132 Yrndm = G4UniformRand() * fYmax; 133 // find bin 134 G4int j = fNPoints - 2; 135 while ((fX[j] > Xrndm) && (j > 0)) 136 j--; 137 // compute Y(x_rndm) by linear interpolati 138 Yinter = fY[j] + fSlp[j] * (Xrndm - fX[j]) 139 }; 140 return Xrndm; 141 } 142 143 //....oooOO0OOooo........oooOO0OOooo........oo 144 145 G4double PrimaryGeneratorAction2::InverseCumul 146 { 147 // tabulated function 148 // Y is assumed positive, linear per segment 149 // --> cumulative function is second order p 150 // (see Particle Data Group: pdg.lbl.gov --> 151 152 // choose y randomly 153 G4double Yrndm = G4UniformRand() * fYC[fNPoi 154 // find bin 155 G4int j = fNPoints - 2; 156 while ((fYC[j] > Yrndm) && (j > 0)) 157 j--; 158 // y_rndm --> x_rndm : fYC(x) is second ord 159 G4double Xrndm = fX[j]; 160 G4double a = fSlp[j]; 161 if (a != 0.) { 162 G4double b = fY[j] / a, c = 2 * (Yrndm - f 163 G4double delta = b * b + c; 164 G4int sign = 1; 165 if (a < 0.) sign = -1; 166 Xrndm += sign * std::sqrt(delta) - b; 167 } 168 else if (fY[j] > 0.) { 169 Xrndm += (Yrndm - fYC[j]) / fY[j]; 170 }; 171 return Xrndm; 172 } 173 174 //....oooOO0OOooo........oooOO0OOooo........oo 175