Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 /// \file eventgenerator/particleGun/src/Prima 26 /// \file eventgenerator/particleGun/src/PrimaryGeneratorAction2.cc 27 /// \brief Implementation of the PrimaryGenera 27 /// \brief Implementation of the PrimaryGeneratorAction2 class 28 // 28 // 29 // 29 // 30 // << 30 // $Id$ >> 31 // 31 //....oooOO0OOooo........oooOO0OOooo........oo 32 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 32 //....oooOO0OOooo........oooOO0OOooo........oo 33 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 33 34 34 #include "PrimaryGeneratorAction2.hh" 35 #include "PrimaryGeneratorAction2.hh" 35 << 36 #include "PrimaryGeneratorAction.hh" 36 #include "PrimaryGeneratorAction.hh" 37 37 38 #include "G4Event.hh" 38 #include "G4Event.hh" 39 #include "G4ParticleDefinition.hh" << 40 #include "G4ParticleGun.hh" 39 #include "G4ParticleGun.hh" 41 #include "G4ParticleTable.hh" 40 #include "G4ParticleTable.hh" >> 41 #include "G4ParticleDefinition.hh" 42 #include "G4PhysicalConstants.hh" 42 #include "G4PhysicalConstants.hh" 43 #include "G4SystemOfUnits.hh" 43 #include "G4SystemOfUnits.hh" 44 #include "Randomize.hh" 44 #include "Randomize.hh" 45 45 46 //....oooOO0OOooo........oooOO0OOooo........oo 46 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 47 47 48 PrimaryGeneratorAction2::PrimaryGeneratorActio << 48 PrimaryGeneratorAction2::PrimaryGeneratorAction2(G4ParticleGun* gun) 49 { << 49 : fParticleGun(gun) >> 50 { 50 // energy distribution 51 // energy distribution 51 // 52 // 52 InitFunction(); 53 InitFunction(); 53 } 54 } 54 55 55 //....oooOO0OOooo........oooOO0OOooo........oo 56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 56 57 >> 58 PrimaryGeneratorAction2::~PrimaryGeneratorAction2() >> 59 { } >> 60 >> 61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 62 57 void PrimaryGeneratorAction2::GeneratePrimarie 63 void PrimaryGeneratorAction2::GeneratePrimaries(G4Event* anEvent) 58 { 64 { 59 // uniform solid angle << 65 //cosAlpha uniform in [cos(0), cos(pi)] 60 G4double cosAlpha = 1. - 2 * G4UniformRand() << 66 G4double cosAlpha = 1. - 2*G4UniformRand(); 61 G4double sinAlpha = std::sqrt(1. - cosAlpha << 67 G4double sinAlpha = std::sqrt(1. - cosAlpha*cosAlpha); 62 G4double psi = twopi * G4UniformRand(); // << 68 G4double psi = twopi*G4UniformRand(); //psi uniform in [0, 2*pi] 63 G4ThreeVector dir(sinAlpha * std::cos(psi), << 69 G4ThreeVector dir(sinAlpha*std::cos(psi),sinAlpha*std::sin(psi),cosAlpha); 64 70 65 fParticleGun->SetParticleMomentumDirection(d 71 fParticleGun->SetParticleMomentumDirection(dir); 66 << 72 67 // set energy from a tabulated distribution << 73 //set energy from a tabulated distribution 68 // 74 // 69 // G4double energy = RejectAccept(); << 75 //G4double energy = RejectAccept(); 70 G4double energy = InverseCumul(); << 76 G4double energy = InverseCumul(); 71 fParticleGun->SetParticleEnergy(energy); << 77 fParticleGun->SetParticleEnergy(energy); 72 78 73 // create vertex << 79 //create vertex 74 // << 80 // 75 fParticleGun->GeneratePrimaryVertex(anEvent) 81 fParticleGun->GeneratePrimaryVertex(anEvent); 76 } 82 } 77 //....oooOO0OOooo........oooOO0OOooo........oo 83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 78 84 79 void PrimaryGeneratorAction2::InitFunction() 85 void PrimaryGeneratorAction2::InitFunction() 80 { 86 { 81 // tabulated function << 87 // tabulated function 82 // Y is assumed positive, linear per segment 88 // Y is assumed positive, linear per segment, continuous 83 // 89 // 84 fNPoints = 16; 90 fNPoints = 16; 85 const G4double xx[] = {37 * keV, 39 * keV, << 91 const G4double xx[] = 86 71 * keV, 75 * keV, << 92 { 37*keV, 39*keV, 45*keV, 51*keV, 57*keV, 69*keV, 71*keV, 75*keV, 87 125 * keV, 145 * keV, << 93 83*keV, 91*keV, 97*keV, 107*keV, 125*keV, 145*keV, 159*keV, 160*keV }; 88 << 94 89 const G4double yy[] = {0.000, 0.077, 0.380 << 95 const G4double yy[] = 90 17.644, 18.518, 17.77 << 96 { 0.000, 0.077, 0.380, 2.044, 5.535, 15.077, 12.443, 14.766, 91 << 97 17.644, 18.518, 17.772, 14.776, 8.372, 3.217, 0.194, 0.000 }; 92 // copy arrays in std::vector and compute fM << 98 >> 99 //copy arrays in std::vector and compute fMax 93 // 100 // 94 fX.resize(fNPoints); << 101 fX.resize(fNPoints); fY.resize(fNPoints); 95 fY.resize(fNPoints); << 96 fYmax = 0.; 102 fYmax = 0.; 97 for (G4int j = 0; j < fNPoints; j++) { << 103 for (G4int j=0; j<fNPoints; j++) { 98 fX[j] = xx[j]; << 104 fX[j] = xx[j]; fY[j] = yy[j]; 99 fY[j] = yy[j]; << 100 if (fYmax < fY[j]) fYmax = fY[j]; 105 if (fYmax < fY[j]) fYmax = fY[j]; 101 }; 106 }; 102 << 107 103 // compute slopes << 108 //compute slopes 104 // 109 // 105 fSlp.resize(fNPoints); 110 fSlp.resize(fNPoints); 106 for (G4int j = 0; j < fNPoints - 1; j++) { << 111 for (G4int j=0; j<fNPoints-1; j++) { 107 fSlp[j] = (fY[j + 1] - fY[j]) / (fX[j + 1] << 112 fSlp[j] = (fY[j+1] - fY[j])/(fX[j+1] - fX[j]); 108 }; 113 }; 109 << 114 110 // compute cumulative function << 115 //compute cumulative function 111 // 116 // 112 fYC.resize(fNPoints); << 117 fYC.resize(fNPoints); 113 fYC[0] = 0.; 118 fYC[0] = 0.; 114 for (G4int j = 1; j < fNPoints; j++) { << 119 for (G4int j=1; j<fNPoints; j++) { 115 fYC[j] = fYC[j - 1] + 0.5 * (fY[j] + fY[j << 120 fYC[j] = fYC[j-1] + 0.5*(fY[j] + fY[j-1])*(fX[j] - fX[j-1]); 116 }; << 121 }; 117 } 122 } 118 123 119 //....oooOO0OOooo........oooOO0OOooo........oo 124 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 120 125 121 G4double PrimaryGeneratorAction2::RejectAccept 126 G4double PrimaryGeneratorAction2::RejectAccept() 122 { 127 { 123 // tabulated function << 128 // tabulated function 124 // Y is assumed positive, linear per segment 129 // Y is assumed positive, linear per segment, continuous 125 // (see Particle Data Group: pdg.lbl.gov --> << 130 // 126 // << 127 G4double Xrndm = 0., Yrndm = 0., Yinter = -1 131 G4double Xrndm = 0., Yrndm = 0., Yinter = -1.; 128 << 132 129 while (Yrndm > Yinter) { 133 while (Yrndm > Yinter) { 130 // choose a point randomly << 134 //choose a point randomly 131 Xrndm = fX[0] + G4UniformRand() * (fX[fNPo << 135 Xrndm = fX[0] + G4UniformRand()*(fX[fNPoints-1] - fX[0]); 132 Yrndm = G4UniformRand() * fYmax; << 136 Yrndm = G4UniformRand()*fYmax; 133 // find bin << 137 //find bin 134 G4int j = fNPoints - 2; << 138 G4int j = fNPoints-2; 135 while ((fX[j] > Xrndm) && (j > 0)) << 139 while ((fX[j] > Xrndm) && (j > 0)) j--; 136 j--; << 140 //compute Y(x_rndm) by linear interpolation 137 // compute Y(x_rndm) by linear interpolati << 141 Yinter = fY[j] + fSlp[j]*(Xrndm - fX[j]); 138 Yinter = fY[j] + fSlp[j] * (Xrndm - fX[j]) << 139 }; 142 }; 140 return Xrndm; 143 return Xrndm; 141 } 144 } 142 145 143 //....oooOO0OOooo........oooOO0OOooo........oo 146 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 144 147 145 G4double PrimaryGeneratorAction2::InverseCumul 148 G4double PrimaryGeneratorAction2::InverseCumul() 146 { 149 { 147 // tabulated function 150 // tabulated function 148 // Y is assumed positive, linear per segment << 151 // Y is assumed positive, linear per segment, continuous 149 // --> cumulative function is second order p 152 // --> cumulative function is second order polynomial 150 // (see Particle Data Group: pdg.lbl.gov --> << 153 151 << 154 //choose y randomly 152 // choose y randomly << 155 G4double Yrndm = G4UniformRand()*fYC[fNPoints-1]; 153 G4double Yrndm = G4UniformRand() * fYC[fNPoi << 156 //find bin 154 // find bin << 157 G4int j = fNPoints-2; 155 G4int j = fNPoints - 2; << 158 while ((fYC[j] > Yrndm) && (j > 0)) j--; 156 while ((fYC[j] > Yrndm) && (j > 0)) << 159 //y_rndm --> x_rndm : fYC(x) is second order polynomial 157 j--; << 158 // y_rndm --> x_rndm : fYC(x) is second ord << 159 G4double Xrndm = fX[j]; 160 G4double Xrndm = fX[j]; 160 G4double a = fSlp[j]; 161 G4double a = fSlp[j]; 161 if (a != 0.) { 162 if (a != 0.) { 162 G4double b = fY[j] / a, c = 2 * (Yrndm - f << 163 G4double b = fY[j]/a, c = 2*(Yrndm - fYC[j])/a; 163 G4double delta = b * b + c; << 164 G4double delta = b*b + c; 164 G4int sign = 1; << 165 G4int sign = 1; if (a < 0.) sign = -1; 165 if (a < 0.) sign = -1; << 166 Xrndm += sign*std::sqrt(delta) - b; 166 Xrndm += sign * std::sqrt(delta) - b; << 167 } else if (fY[j] > 0.) { 167 } << 168 Xrndm += (Yrndm - fYC[j])/fY[j]; 168 else if (fY[j] > 0.) { << 169 Xrndm += (Yrndm - fYC[j]) / fY[j]; << 170 }; 169 }; 171 return Xrndm; 170 return Xrndm; 172 } 171 } 173 172 174 //....oooOO0OOooo........oooOO0OOooo........oo 173 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 175 174