Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4Generator2BS.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id$
27//
28// -------------------------------------------------------------------
29//
30// GEANT4 Class file
31//
32//
33// File name: G4Generator2BS
34//
35// Author: Andreia Trindade (andreia@lip.pt)
36// Pedro Rodrigues (psilva@lip.pt)
37// Luis Peralta (luis@lip.pt)
38//
39// Creation date: 2 June 2003
40//
41// Modifications:
42// 02 Jun 2003 First implementation acording with new design
43// 05 Nov 2003 MGP Fixed std namespace
44// 17 Nov 2003 MGP Fixed compilation problem on Windows
45// 12 Oct 2010 V.Ivanchenko Moved RejectionFunction inline, use G4Pow to speadup
46// 09 May 2011 L.Pandola Initialize private members, to avoid Coverity warning
47//
48// Class Description:
49//
50// Concrete base class for Bremsstrahlung Angular Distribution Generation
51// 2BS Distribution
52//
53// Class Description: End
54//
55// -------------------------------------------------------------------
56//
57
58#include "G4Generator2BS.hh"
59#include "Randomize.hh"
61#include "G4SystemOfUnits.hh"
62#include "G4Pow.hh"
63
65 : G4VEmAngularDistribution("AngularGen2BS"),fz(1),ratio(1),
66 ratio1(1),ratio2(1),delta(0)
67{
68 g4pow = G4Pow::GetInstance();
69 nwarn = 0;
70}
71
73{}
74
76 G4double final_energy,
77 G4int Z,
78 const G4Material*)
79{
80
81 // Adapted from "Improved bremsstrahlung photon angular sampling in the EGS4 code system"
82 // by Alex F. Bielajew, Rahde Mohan anc Chen-Shou Chui, PIRS-0203
83 // Ionizing Radiation Standards
84 // Institute for National Measurement Standards
85 // National Research Council of Canada
86 // Departement of Medical Physics, Memorial Sloan-Kettering Cancer Center, New York
87
88 G4double energy = dp->GetTotalEnergy();
89 ratio = final_energy/energy;
90 ratio1 = (1 + ratio)*(1 + ratio);
91 ratio2 = 1 + ratio*ratio;
92
93 G4double gamma = energy/electron_mass_c2;
94 G4double beta = std::sqrt((gamma - 1)*(gamma + 1))/gamma;
95
96 //G4double Zeff = std::sqrt(static_cast<G4double>(Z) * (static_cast<G4double>(Z) + 1.0));
97 //z = (0.00008116224*(std::pow(Zeff,0.3333333)));
98
99 // VI speadup
100 fz = 0.00008116224*g4pow->Z13(Z)*g4pow->Z13(Z+1);
101
102 // majoranta
103 G4double ymax = 2*beta*(1 + beta)*gamma*gamma;
104 G4double gMax = RejectionFunction(0.0);
105 gMax = std::max(gMax,RejectionFunction(ymax));
106
107 G4double y, gfun;
108
109 do{
111 y = q*ymax/(1 + ymax*(1 - q));
112 gfun = RejectionFunction(y);
113
114 // violation point
115 if(gfun > gMax && nwarn >= 20) {
116 ++nwarn;
117 G4cout << "### WARNING in G4Generator2BS: Etot(MeV)= " << energy/MeV
118 << " Egamma(MeV)" << (energy - final_energy)/MeV
119 << " gMax= " << gMax << " < " << gfun
120 << " results are not reliable!"
121 << G4endl;
122 if(20 == nwarn) {
123 G4cout << " WARNING in G4Generator2BS is closed" << G4endl;
124 }
125 }
126
127 } while(G4UniformRand()*gMax > gfun || y > ymax);
128
129
130 G4double cost = 1 - 2*y/ymax;
131 G4double sint = std::sqrt((1 - cost)*(1 + cost));
132 G4double phi = twopi*G4UniformRand();
133
134 fLocalDirection.set(sint*std::cos(phi), sint*std::sin(phi),cost);
136
137 return fLocalDirection;
138}
139
141{
142 G4cout << "\n" << G4endl;
143 G4cout << "Bremsstrahlung Angular Generator is 2BS Generator "
144 << "from 2BS Koch & Motz distribution (Rev Mod Phys 31(4), 920 (1959))" << G4endl;
145 G4cout << "Sampling algorithm adapted from PIRS-0203" << G4endl;
146 G4cout << "\n" << G4endl;
147}
148
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:53
void set(double x, double y, double z)
Hep3Vector & rotateUz(const Hep3Vector &)
Definition: ThreeVector.cc:72
const G4ThreeVector & GetMomentumDirection() const
G4double GetTotalEnergy() const
virtual G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double out_energy, G4int Z, const G4Material *mat=0)
G4double RejectionFunction(G4double value) const
void PrintGeneratorInformation() const
G4Generator2BS(const G4String &name="")
virtual ~G4Generator2BS()
static G4Pow * GetInstance()
Definition: G4Pow.cc:50
G4double Z13(G4int Z)
Definition: G4Pow.hh:110