Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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//
27// -------------------------------------------------------------------
28//
29// GEANT4 Class file
30//
31//
32// File name: G4Generator2BS
33//
34// Author: Andreia Trindade (andreia@lip.pt)
35// Pedro Rodrigues (psilva@lip.pt)
36// Luis Peralta (luis@lip.pt)
37//
38// Creation date: 2 June 2003
39//
40// Modifications:
41// 02 Jun 2003 First implementation acording with new design
42// 05 Nov 2003 MGP Fixed std namespace
43// 17 Nov 2003 MGP Fixed compilation problem on Windows
44// 12 Oct 2010 V.Ivanchenko Moved RejectionFunction inline, use G4Pow to speadup
45// 09 May 2011 L.Pandola Initialize private members, to avoid Coverity warning
46//
47// Class Description:
48//
49// Concrete base class for Bremsstrahlung Angular Distribution Generation
50// 2BS Distribution
51//
52// Class Description: End
53//
54// -------------------------------------------------------------------
55//
56
57#include "G4Generator2BS.hh"
58#include "Randomize.hh"
60#include "G4SystemOfUnits.hh"
61#include "G4Pow.hh"
62
64 : G4VEmAngularDistribution("AngularGen2BS"),fz(1.),ratio(1.),
65 ratio1(1.),ratio2(1.),delta(0.)
66{
67 g4pow = G4Pow::GetInstance();
68 nwarn = 0;
69}
70
72{}
73
75 G4double final_energy,
76 G4int Z,
77 const G4Material*)
78{
79 // Adapted from "Improved bremsstrahlung photon angular sampling in the EGS4 code system"
80 // by Alex F. Bielajew, Rahde Mohan anc Chen-Shou Chui, PIRS-0203
81 // Ionizing Radiation Standards
82 // Institute for National Measurement Standards
83 // National Research Council of Canada
84 // Departement of Medical Physics, Memorial Sloan-Kettering Cancer Center, New York
85
86 G4double energy = dp->GetTotalEnergy();
87 ratio = final_energy/energy;
88 ratio1 = (1 + ratio)*(1 + ratio);
89 ratio2 = 1 + ratio*ratio;
90
91 G4double gamma = energy/electron_mass_c2;
92 G4double beta = std::sqrt((gamma - 1)*(gamma + 1))/gamma;
93
94 // VI speadup
95 fz = 0.00008116224*g4pow->Z13(Z)*g4pow->Z13(Z+1);
96
97 // majoranta
98 G4double ymax = 2*beta*(1 + beta)*gamma*gamma;
99 G4double gMax = RejectionFunction(0.0);
100 gMax = std::max(gMax,RejectionFunction(ymax));
101
102 G4double y, gfun;
103
104 do{
106 y = q*ymax/(1 + ymax*(1 - q));
107 gfun = RejectionFunction(y);
108
109 // violation point
110 if(gfun > gMax && nwarn >= 20) {
111 ++nwarn;
112 G4cout << "### WARNING in G4Generator2BS: Etot(MeV)= " << energy/MeV
113 << " Egamma(MeV)" << (energy - final_energy)/MeV
114 << " gMax= " << gMax << " < " << gfun
115 << " results are not reliable!"
116 << G4endl;
117 if(20 == nwarn) {
118 G4cout << " WARNING in G4Generator2BS is closed" << G4endl;
119 }
120 }
121
122 } while(G4UniformRand()*gMax > gfun || y > ymax);
123
124 G4double cost = 1 - 2*y/ymax;
125 G4double sint = std::sqrt((1 - cost)*(1 + cost));
126 G4double phi = twopi*G4UniformRand();
127
128 fLocalDirection.set(sint*std::cos(phi), sint*std::sin(phi),cost);
130
131 return fLocalDirection;
132}
133
135{
136 G4cout << "\n" << G4endl;
137 G4cout << "Bremsstrahlung Angular Generator is 2BS Generator "
138 << "from 2BS Koch & Motz distribution (Rev Mod Phys 31(4), 920 (1959))" << G4endl;
139 G4cout << "Sampling algorithm adapted from PIRS-0203" << G4endl;
140 G4cout << "\n" << G4endl;
141}
142
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
void set(double x, double y, double z)
Hep3Vector & rotateUz(const Hep3Vector &)
Definition: ThreeVector.cc:33
const G4ThreeVector & GetMomentumDirection() const
G4double GetTotalEnergy() const
G4double RejectionFunction(G4double value) const
void PrintGeneratorInformation() const override
G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double out_energy, G4int Z, const G4Material *mat=nullptr) override
G4Generator2BS(const G4String &name="")
virtual ~G4Generator2BS()
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double Z13(G4int Z) const
Definition: G4Pow.hh:123