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 // $Id: G4DipBustGenerator.cc,v 1.1 2010-10-14 15:17:48 vnivanch Exp $ >> 27 // GEANT4 tag $Name: not supported by cvs2svn $ 26 // 28 // 27 // ------------------------------------------- 29 // ------------------------------------------------------------------- 28 // 30 // 29 // GEANT4 Class file 31 // GEANT4 Class file 30 // 32 // 31 // 33 // 32 // File name: G4DipBustGenerator 34 // File name: G4DipBustGenerator 33 // 35 // 34 // Author: Vladimir Grichine << 36 // Author: Vladimir Grichine 35 // << 37 // 36 // Creation date: 17 May 2011 38 // Creation date: 17 May 2011 37 // 39 // 38 // Modifications: << 40 // Modifications: 39 // << 41 // 40 // 17.07.2018 optimisations, using G4Pow in S << 41 // 42 // 42 // Class Description: << 43 // Class Description: 43 // 44 // 44 // Bremsstrahlung Angular Distribution Generat << 45 // Bremsstrahlung Angular Distribution Generation 45 // suggested the dipole approximation in the << 46 // suggested the dipole approximation in the rest frame of electron 46 // busted in the laboratory frame. 47 // busted in the laboratory frame. 47 // 48 // 48 // Class Description: End << 49 // Class Description: End 49 // 50 // 50 // ------------------------------------------- 51 // ------------------------------------------------------------------- 51 // 52 // 52 53 53 #include "G4DipBustGenerator.hh" 54 #include "G4DipBustGenerator.hh" 54 #include "Randomize.hh" 55 #include "Randomize.hh" 55 // #include "G4Log.hh" << 56 // #include "G4Exp.hh" << 57 #include "G4Pow.hh" << 58 #include <CLHEP/Units/PhysicalConstants.h> << 59 << 60 //....oooOO0OOooo........oooOO0OOooo........oo << 61 56 62 G4DipBustGenerator::G4DipBustGenerator(const G 57 G4DipBustGenerator::G4DipBustGenerator(const G4String&) 63 : G4VEmAngularDistribution("DipBustGen") << 58 : G4VBremAngularDistribution("AngularGenUrban") 64 {} << 59 {} 65 60 66 //....oooOO0OOooo........oooOO0OOooo........oo << 61 G4DipBustGenerator::~G4DipBustGenerator() 67 << 62 {} 68 G4DipBustGenerator::~G4DipBustGenerator() = de << 69 << 70 //....oooOO0OOooo........oooOO0OOooo........oo << 71 << 72 G4double G4DipBustGenerator::SampleCosTheta(co << 73 { << 74 const G4double c = 4. - 8.*G4UniformR << 75 const G4double delta = 0.5*(std::sqrt(c*c << 76 const G4double signc = (c < 0.) ? -1.0 : << 77 // const G4double cofA = -signc*G4Exp(G4Log( << 78 const G4double cofA = -signc*G4Pow::GetI << 79 const G4double cosTheta = std::min(1.,std::m << 80 const G4double tau = kinEnergy/CLHEP::e << 81 const G4double beta = std::sqrt(tau*(tau << 82 << 83 return (cosTheta + beta)/(1. + cosTheta*beta << 84 } << 85 << 86 //....oooOO0OOooo........oooOO0OOooo........oo << 87 63 88 G4ThreeVector& << 64 G4double G4DipBustGenerator::PolarAngle(const G4double eTkin, 89 G4DipBustGenerator::SampleDirection(const G4Dy << 65 const G4double, // final_energy 90 G4int, co << 66 const G4int ) // Z 91 { 67 { 92 const G4double cosTheta = SampleCosTheta(dp- << 68 G4double c, cosTheta, delta, cofA, signc = 1., a, power = 1./3.; >> 69 G4double gamma, beta, theta; 93 70 94 const G4double sinTheta = std::sqrt((1. - co << 71 c = 4. - 8.*G4UniformRand(); 95 const G4double phi = CLHEP::twopi*G4Uni << 72 a = c; 96 << 73 97 fLocalDirection.set(sinTheta*std::cos(phi), << 74 if( c < 0. ) 98 fLocalDirection.rotateUz(dp->GetMomentumDire << 75 { 99 << 76 signc = -1.; 100 return fLocalDirection; << 77 a = -c; 101 } << 78 } >> 79 delta = std::sqrt(a*a+4.); >> 80 delta += a; >> 81 delta *= 0.5; >> 82 >> 83 cofA = -signc*std::pow(delta, power); >> 84 >> 85 cosTheta = cofA - 1./cofA; >> 86 >> 87 gamma = 1. + eTkin/electron_mass_c2; >> 88 beta = std::sqrt(1. - 1./gamma/gamma); >> 89 >> 90 cosTheta = (cosTheta + beta)/(1 + cosTheta*beta); >> 91 >> 92 theta = std::acos(cosTheta); >> 93 >> 94 if( theta < 0. ) theta = 0.; >> 95 if( theta > pi ) theta = pi; >> 96 // G4cout <<"theta = "<<theta<<"; "; 102 97 103 //....oooOO0OOooo........oooOO0OOooo........oo << 104 << 105 G4double G4DipBustGenerator::PolarAngle(G4doub << 106 G4dou << 107 G4int << 108 { << 109 const G4double cosTheta = SampleCosTheta(eTk << 110 G4double theta = std::acos(cosTheta); << 111 theta = std::min(std::max(theta, 0.), CLHEP: << 112 return theta; 98 return theta; 113 } 99 } 114 100 115 //....oooOO0OOooo........oooOO0OOooo........oo << 116 << 117 void G4DipBustGenerator::SamplePairDirections( << 118 << 119 << 120 << 121 << 122 << 123 { << 124 const G4double phi = CLHEP::twopi * G4Unifo << 125 const G4double sinp = std::sin(phi); << 126 const G4double cosp = std::cos(phi); << 127 << 128 G4double cost = SampleCosTheta(elecKinEnergy << 129 G4double sint = std::sqrt((1. - cost)*(1. + << 130 << 131 dirElectron.set(sint*cosp, sint*sinp, cost); << 132 dirElectron.rotateUz(dp->GetMomentumDirectio << 133 << 134 cost = SampleCosTheta(posiKinEnergy); << 135 sint = std::sqrt((1. - cost)*(1. + cost)); << 136 << 137 dirPositron.set(-sint*cosp, -sint*sinp, cost << 138 dirPositron.rotateUz(dp->GetMomentumDirectio << 139 } << 140 << 141 //....oooOO0OOooo........oooOO0OOooo........oo << 142 << 143 void G4DipBustGenerator::PrintGeneratorInforma 101 void G4DipBustGenerator::PrintGeneratorInformation() const 144 { 102 { 145 G4cout << "\n" << G4endl; 103 G4cout << "\n" << G4endl; 146 G4cout << "Angular Generator based on classi << 104 G4cout << "Bremsstrahlung Angular Generator is Modified Tsai" << G4endl; 147 G4cout << "J.D. Jackson, Classical Electrody << 105 G4cout << "Distribution suggested by L.Urban (Geant3 manual (1993) Phys211)" 148 << G4endl; 106 << G4endl; 149 } << 107 G4cout << "Derived from Tsai distribution (Rev Mod Phys 49,421(1977)) \n" 150 << 108 << G4endl; 151 //....oooOO0OOooo........oooOO0OOooo........oo << 109 } 152 110