Geant4-11
Public Member Functions | Private Types | Static Private Attributes
G4AngularDistributionPP Class Reference

#include <G4AngularDistributionPP.hh>

Inheritance diagram for G4AngularDistributionPP:
G4VAngularDistribution

Public Member Functions

virtual G4double CosTheta (G4double s, G4double m1, G4double m2) const
 
 G4AngularDistributionPP ()
 
virtual G4double Phi () const
 
virtual ~G4AngularDistributionPP ()
 

Private Types

enum  { NENERGY =40 , NENERGYC =22 , NANGLE =180 }
 

Static Private Attributes

static const G4float dsigmax [NENERGY]
 
static const G4float elab [NENERGY]
 
static const G4float pcm [NENERGY]
 
static const G4float sig [NENERGY][NANGLE]
 
static const G4float sigtot [NENERGY]
 

Detailed Description

Definition at line 40 of file G4AngularDistributionPP.hh.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
private
Enumerator
NENERGY 
NENERGYC 
NANGLE 

Definition at line 45 of file G4AngularDistributionPP.hh.

Constructor & Destructor Documentation

◆ G4AngularDistributionPP()

G4AngularDistributionPP::G4AngularDistributionPP ( )
inline

Definition at line 49 of file G4AngularDistributionPP.hh.

49{ }

◆ ~G4AngularDistributionPP()

virtual G4AngularDistributionPP::~G4AngularDistributionPP ( )
inlinevirtual

Definition at line 51 of file G4AngularDistributionPP.hh.

51{ }

Member Function Documentation

◆ CosTheta()

G4double G4AngularDistributionPP::CosTheta ( G4double  s,
G4double  m1,
G4double  m2 
) const
virtual

Implements G4VAngularDistribution.

Definition at line 37 of file G4AngularDistributionPP.cc.

38{
39 G4int verboseLevel=1;
40
41 G4double ek= ((S - sqr(m_1) -sqr(m_2) )/(2*m_1) - m_1 )/GeV ; // kinetic energy in GeV
42
43 // Find energy bin
44
45 G4int je1 = 0;
46 G4int je2 = NENERGY - 1;
47 G4int iterationsLeft=2*NENERGY +1;
48 do {
49 G4int midBin = (je1 + je2)/2;
50 if (ek < elab[midBin])
51 je2 = midBin;
52 else
53 je1 = midBin;
54 } while ( (je2 - je1) > 1 && --iterationsLeft > 0 ); /* Loop checking, 30-Oct-2015, G.Folger */
55 if ( iterationsLeft <= 0 ) {
56 G4Exception("G4AngularDistributionPP", "im_r_matrix020", FatalException,
57 "Problem with energy bin (elab) data");
58
59 }
60 // G4int j;
61 //std::abs(ek-elab[je1]) < std::abs(ek-elab[je2]) ? j = je1 : j = je2;
62 G4double delab = elab[je2] - elab[je1];
63
64 // Sample the angle
65
66 G4double sample = G4UniformRand();
67 G4int ke1 = 0;
68 G4int ke2 = NANGLE - 1;
69 G4double dsig = sig[je2][0] - sig[je1][0];
70 G4double rc = dsig/delab;
71 G4double b = sig[je1][0] - rc*elab[je1];
72 G4double sigint1 = rc*ek + b;
73 G4double sigint2 = 0.;
74
75 if (verboseLevel > 1) G4cout << "sample=" << sample << G4endl
76 << ek << " " << ke1 << " " << ke2 << " "
77 << sigint1 << " " << sigint2 << G4endl;
78
79 iterationsLeft= 2*NANGLE +1;
80 do {
81 G4int midBin = (ke1 + ke2)/2;
82 dsig = sig[je2][midBin] - sig[je1][midBin];
83 rc = dsig/delab;
84 b = sig[je1][midBin] - rc*elab[je1];
85 G4double sigint = rc*ek + b;
86 if (sample < sigint) {
87 ke2 = midBin;
88 sigint2 = sigint;
89 }
90 else {
91 ke1 = midBin;
92 sigint1 = sigint;
93 }
94 if (verboseLevel > 1)G4cout << ke1 << " " << ke2 << " "
95 << sigint1 << " " << sigint2 << G4endl;
96 } while ( (ke2 - ke1) > 1 && --iterationsLeft > 0); /* Loop checking, 30-Oct-2015, G.Folger */
97 if ( iterationsLeft <= 0 ) {
98 G4Exception("G4AngularDistributionPP", "im_r_matrix021", FatalException,
99 "Problem with angular distribution (sig) data");
100 }
101
102 // sigint1 and sigint2 should be recoverable from above loop
103
104 // G4double dsig = sig[je2][ke1] - sig[je1][ke1];
105 // G4double rc = dsig/delab;
106 // G4double b = sig[je1][ke1] - rc*elab[je1];
107 // G4double sigint1 = rc*ek + b;
108
109 // G4double dsig = sig[je2][ke2] - sig[je1][ke2];
110 // G4double rc = dsig/delab;
111 // G4double b = sig[je1][ke2] - rc*elab[je1];
112 // G4double sigint2 = rc*ek + b;
113
114 dsig = sigint2 - sigint1;
115 rc = 1./dsig;
116 b = ke1 - rc*sigint1;
117 G4double kint = rc*sample + b;
118 G4double theta = (0.5 + kint)*pi/180.;
119
120 // G4int k;
121 //std::abs(sample-sig[j][ke1]) < std::abs(sample-sig[j][ke2]) ? k = ke1 : k = ke2;
122 // G4double theta = (0.5 + k)*pi/180.;
123
124 if (verboseLevel > 1) {
125 G4cout << " energy bin " << je1 << " energy=" << elab[je1] << G4endl;
126 G4cout << " angle bin " << kint << " angle=" << theta/degree << G4endl;
127 }
128 G4double costh= std::cos(theta);
129// G4cout << "scattering angle hpw "<<costh<<" "<<s<<" "<<m1<<" "<<m2<<G4endl;
130 return costh;
131}
G4double S(G4double temp)
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:35
static constexpr double GeV
Definition: G4SIunits.hh:203
static constexpr double degree
Definition: G4SIunits.hh:124
static constexpr double pi
Definition: G4SIunits.hh:55
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
static const G4float elab[NENERGY]
static const G4float sig[NENERGY][NANGLE]
T sqr(const T &x)
Definition: templates.hh:128

References degree, elab, FatalException, G4cout, G4endl, G4Exception(), G4UniformRand, GeV, NANGLE, NENERGY, pi, S(), sig, and sqr().

◆ Phi()

G4double G4AngularDistributionPP::Phi ( ) const
virtual

Reimplemented from G4VAngularDistribution.

Definition at line 133 of file G4AngularDistributionPP.cc.

134{
135 return twopi * G4UniformRand();
136}
static constexpr double twopi
Definition: G4SIunits.hh:56

References G4UniformRand, and twopi.

Field Documentation

◆ dsigmax

const G4float G4AngularDistributionPP::dsigmax
staticprivate
Initial value:
= {
63.9f, 29.9f, 14.5f, 8.97f, 7.23f, 6.66f, 6.30f,
5.89f, 5.68f, 5.57f, 5.56f, 5.57f, 5.74f, 6.38f,
7.66f, 9.65f, 12.4f, 15.6f, 18.0f, 20.1f, 22.0f, 23.8f,
26.710f, 28.910f, 31.000f, 32.990f, 34.900f, 36.730f, 38.520f,
40.270f, 43.680f, 46.950f, 50.100f, 53.160f, 55.880f, 58.820f,
57.420f, 57.820f, 58.590f, 57.800f
}

Definition at line 62 of file G4AngularDistributionPP.hh.

◆ elab

const G4float G4AngularDistributionPP::elab
staticprivate
Initial value:
= {
0.100E-01f, 0.200E-01f, 0.400E-01f, 0.700E-01f, 0.100f, 0.120f, 0.140f,
0.180f, 0.220f, 0.260f, 0.280f, 0.300f, 0.340f, 0.420f,
0.520f, 0.620f, 0.700f, 0.800f, 0.900f, 1.00f, 1.10f, 1.20f,
1.30f, 1.40f, 1.50f, 1.60f, 1.70f, 1.80f, 1.90f,
2.00f, 2.20f, 2.40f, 2.60f, 2.80f, 3.00f, 3.40f,
3.80f, 4.20f, 4.60f, 5.00f
}

Definition at line 61 of file G4AngularDistributionPP.hh.

Referenced by CosTheta().

◆ pcm

const G4float G4AngularDistributionPP::pcm
staticprivate
Initial value:
= {
0.685E-01f, 0.969E-01f, 0.137f, 0.181f, 0.217f, 0.237f, 0.256f,
0.291f, 0.321f, 0.349f, 0.363f, 0.375f, 0.400f, 0.444f,
0.494f, 0.540f, 0.573f, 0.613f, 0.650f, 0.685f, 0.719f, 0.751f,
0.781f, 0.810f, 0.839f, 0.866f, 0.893f, 0.919f, 0.944f,
0.969f, 1.016f, 1.061f, 1.104f, 1.146f, 1.186f, 1.263f,
1.335f, 1.404f, 1.469f, 1.532f
}

Definition at line 61 of file G4AngularDistributionPP.hh.

◆ sig

const G4float G4AngularDistributionPP::sig
staticprivate

Definition at line 60 of file G4AngularDistributionPP.hh.

Referenced by CosTheta().

◆ sigtot

const G4float G4AngularDistributionPP::sigtot
staticprivate
Initial value:
= {
396.f, 179.f, 80.7f, 44.5f, 32.8f, 29.0f, 26.9f,
24.9f, 24.4f, 24.3f, 24.4f, 24.4f, 24.7f, 25.5f,
26.4f, 26.1f, 25.6f, 25.1f, 24.4f, 23.4f, 22.4f, 21.5f,
22.765f, 23.275f, 23.744f, 24.188f, 24.620f, 25.058f, 25.509f,
25.981f, 26.984f, 28.055f, 29.242f, 30.608f, 32.026f, 34.457f,
34.394f, 33.885f, 34.122f, 33.603f
}

Definition at line 62 of file G4AngularDistributionPP.hh.


The documentation for this class was generated from the following files: