source: trunk/source/processes/electromagnetic/lowenergy/src/G4Generator2BN.cc @ 1196

Last change on this file since 1196 was 819, checked in by garnier, 16 years ago

import all except CVS

File size: 16.1 KB
Line 
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:     G4Generator2BN
33//
34// Author:        Andreia Trindade (andreia@lip.pt)
35//                Pedro Rodrigues  (psilva@lip.pt)
36//                Luis Peralta     (luis@lip.pt)
37//
38// Creation date: 21 June 2003
39//
40// Modifications:
41// 21 Jun 2003                                 First implementation acording with new design
42// 05 Nov 2003  MGP                            Fixed compilation warning
43// 14 Mar 2004                                 Code optimization
44//
45// Class Description:
46//
47// Concrete base class for Bremsstrahlung Angular Distribution Generation - 2BN Distribution
48//
49// Class Description: End
50//
51// -------------------------------------------------------------------
52//
53//   
54
55#include "G4Generator2BN.hh"
56#include "Randomize.hh"
57//   
58
59G4double G4Generator2BN::Atab[320] =
60         { 0.0264767, 0.0260006, 0.0257112, 0.0252475, 0.024792, 0.0243443, 0.0240726, 0.0236367,
61           0.023209,  0.0227892, 0.0225362, 0.0221284, 0.0217282,0.0214894, 0.0211005, 0.0207189,
62           0.0204935, 0.0201227, 0.0197588, 0.019546,  0.0191923,0.0188454, 0.0186445, 0.0183072,
63           0.0179763, 0.0177866, 0.0174649, 0.0172828, 0.0169702,0.0166634, 0.0164915, 0.0161933,
64           0.0160283, 0.0157384, 0.0155801, 0.0152981, 0.0151463,0.0148721, 0.0147263, 0.0144598,
65           0.01432,   0.0140607, 0.0139267, 0.0136744, 0.0135459,0.0133005, 0.0131773, 0.0129385,
66           0.0128205, 0.0125881, 0.012475,  0.0122488, 0.0121406,0.0119204, 0.0118167, 0.0117158,
67           0.0115032, 0.0114067, 0.0111995, 0.0111072, 0.0110175,0.0108173, 0.0107316, 0.0105365,
68           0.0104547, 0.0102646, 0.0101865, 0.010111,  0.00992684,0.0098548,0.00967532,0.00960671,
69           0.00943171,0.00936643,0.00930328,0.0091337, 0.00907372,0.00890831,0.00885141,0.00869003,
70           0.00863611,0.00858428,0.00842757,0.00837854,0.0082256,0.00817931,0.00803,0.00798639,
71           0.00784058,0.00779958,0.00776046,0.00761866,0.00758201,0.00744346,0.00740928,0.00727384,
72           0.00724201,0.00710969,0.00708004,0.00695074,0.00692333,0.00679688,0.00677166,0.00664801,
73           0.00662484,0.00650396,0.00648286,0.00636458,0.00634545,0.00622977,0.00621258,0.00609936,
74           0.00608412,0.00597331,0.00595991,0.00585143,0.00583988,0.0057337,0.0057239,0.00561991,
75           0.0056119, 0.00551005,0.00550377,0.00540399,0.00539938,0.00530162,0.00529872,0.00520292,
76           0.0051091, 0.00510777,0.00501582,0.00501608,0.00492594,0.00492781,0.00483942,0.0048429,
77           0.00475622,0.00476127,0.00467625,0.00468287,0.00459947,0.00451785,0.00452581,0.00444573,
78           0.00445522,0.00437664,0.00438768,0.00431057,0.00432316,0.00424745,0.0042616,0.00418726,
79           0.004203,  0.00413,   0.00405869,0.00407563,0.00400561,0.00402414,0.00395536,0.00397553,
80           0.00390795,0.00392975,0.00386339,0.00379862,0.00382167,0.00375805,0.00378276,0.00372031,
81           0.00374678,0.00368538,0.00371363,0.00365335,0.00359463,0.0036242, 0.00356653,0.003598,
82           0.00354139,0.00357481,0.00351921,0.00355464,0.00350005,0.0034471,0.00348403,0.00343208,
83           0.0034712, 0.00342026,0.00346165,0.00341172,0.00345548,0.00340657,0.00335944,0.00340491,
84           0.00335885,0.00340692,0.00336191,0.00341273,0.00336879,0.00342249,0.00337962,0.00333889,
85           0.00339463,0.00335506,0.00341401,0.00337558,0.00343797,0.00340067,0.00336584,0.00343059,
86           0.0033969, 0.00346557,0.00343302,0.00350594,0.00347448,0.00344563,0.00352163,0.00349383,
87           0.00357485,0.00354807,0.00352395,0.00360885,0.00358571,0.00367661,0.00365446,0.00375194,
88           0.00373078,0.00371234,0.00381532,0.00379787,0.00390882,0.00389241,0.00387881,0.00399675,
89           0.00398425,0.00411183,0.00410042,0.00409197,0.00422843,0.00422123,0.00436974,0.0043637,
90           0.00436082,0.00452075,0.00451934,0.00452125,0.00469406,0.00469756,0.00488741,0.00489221,
91           0.00490102,0.00510782,0.00511801,0.00513271,0.0053589, 0.00537524,0.00562643,0.00564452,
92           0.0056677, 0.00594482,0.00596999,0.0059999, 0.00630758,0.00634014,0.00637849,0.00672136,
93           0.00676236,0.00680914,0.00719407,0.0072439, 0.00730063,0.0077349, 0.00779494,0.00786293,
94           0.00835577,0.0084276, 0.00850759,0.00907162,0.00915592,0.00924925,0.00935226,0.00999779,
95           0.0101059, 0.0102249, 0.0109763, 0.0111003, 0.0112367, 0.0113862, 0.0122637, 0.0124196,
96           0.0125898, 0.0136311, 0.0138081, 0.0140011, 0.0142112, 0.0154536, 0.0156723, 0.0159099,
97           0.016168,  0.0176664, 0.0179339, 0.0182246, 0.0185396, 0.020381,  0.0207026, 0.0210558,
98           0.0214374, 0.0237377, 0.0241275, 0.0245528, 0.0250106, 0.0255038, 0.0284158, 0.0289213,
99           0.0294621, 0.0300526, 0.0338619, 0.0344537, 0.0351108, 0.0358099, 0.036554,  0.0416399
100         };
101
102G4double G4Generator2BN::ctab[320] =
103    { 0.482253, 0.482253, 0.489021, 0.489021, 0.489021, 0.489021, 0.495933,
104      0.495933, 0.495933, 0.495933, 0.502993, 0.502993, 0.502993, 0.510204,
105      0.510204, 0.510204, 0.517572, 0.517572, 0.517572, 0.5251,   0.5251,
106      0.5251,   0.532793, 0.532793, 0.532793, 0.540657, 0.540657, 0.548697,
107      0.548697, 0.548697, 0.556917, 0.556917, 0.565323, 0.565323, 0.573921,
108      0.573921, 0.582717, 0.582717, 0.591716, 0.591716, 0.600925, 0.600925,
109      0.610352, 0.610352, 0.620001, 0.620001, 0.629882, 0.629882, 0.64,
110      0.64,     0.650364, 0.650364, 0.660982, 0.660982, 0.671862, 0.683013,
111      0.683013, 0.694444, 0.694444, 0.706165, 0.718184, 0.718184, 0.730514,
112      0.730514, 0.743163, 0.743163, 0.756144, 0.769468, 0.769468, 0.783147,
113      0.783147, 0.797194, 0.797194, 0.811622, 0.826446, 0.826446, 0.84168,
114      0.84168,  0.857339, 0.857339, 0.873439, 0.889996, 0.889996, 0.907029,
115      0.907029, 0.924556, 0.924556, 0.942596, 0.942596, 0.961169, 0.980296,
116      0.980296, 1,        1,        1.0203,   1.0203,   1.04123,  1.04123,
117      1.06281,  1.06281,  1.08507,  1.08507,  1.10803,  1.10803,  1.13173,
118      1.13173,  1.1562,   1.1562,   1.18147,  1.18147,  1.20758,  1.20758,
119      1.23457,  1.23457,  1.26247,  1.26247,  1.29132,  1.29132,  1.32118,
120      1.32118,  1.35208,  1.35208,  1.38408,  1.38408,  1.41723,  1.41723,
121      1.45159,  1.45159,  1.45159,  1.48721,  1.48721,  1.52416,  1.52416,
122      1.5625,   1.5625,   1.60231,  1.60231,  1.64366,  1.64366,  1.68663,
123      1.68663,  1.68663,  1.7313,   1.7313,   1.77778,  1.77778,  1.82615,
124      1.82615,  1.87652,  1.87652,  1.92901,  1.92901,  1.98373,  1.98373,
125      1.98373,  2.04082,  2.04082,  2.1004,   2.1004,   2.16263,  2.16263,
126      2.22767,  2.22767,  2.22767,  2.29568,  2.29568,  2.36686,  2.36686,
127      2.44141,  2.44141,  2.51953,  2.51953,  2.51953,  2.60146,  2.60146,
128      2.68745,  2.68745,  2.77778,  2.77778,  2.87274,  2.87274,  2.87274,
129      2.97265,  2.97265,  3.07787,  3.07787,  3.18878,  3.18878,  3.30579,
130      3.30579,  3.30579,  3.42936,  3.42936,  3.55999,  3.55999,  3.69822,
131      3.69822,  3.84468,  3.84468,  3.84468,  4,        4,        4.16493,
132      4.16493,  4.34028,  4.34028,  4.34028,  4.52694,  4.52694,  4.7259,
133      4.7259,   4.93827,  4.93827,  4.93827,  5.16529,  5.16529,  5.40833,
134      5.40833,  5.40833,  5.66893,  5.66893,  5.94884,  5.94884,  6.25,
135      6.25,     6.25,     6.57462,  6.57462,  6.92521,  6.92521,  6.92521,
136      7.3046,   7.3046,   7.71605,  7.71605,  7.71605,  8.16327,  8.16327,
137      8.65052,  8.65052,  8.65052,  9.18274,  9.18274,  9.18274,  9.76562,
138      9.76562,  10.4058,  10.4058,  10.4058,  11.1111,  11.1111,  11.1111,
139      11.8906,  11.8906,  12.7551,  12.7551,  12.7551,  13.7174,  13.7174,
140      13.7174,  14.7929,  14.7929,  14.7929,  16,       16,       16,
141      17.3611,  17.3611,  17.3611,  18.9036,  18.9036,  18.9036,  20.6612,
142      20.6612,  20.6612,  22.6757,  22.6757,  22.6757,  22.6757,  25,
143      25,       25,       27.7008,  27.7008,  27.7008,  27.7008,  30.8642,
144      30.8642,  30.8642,  34.6021,  34.6021,  34.6021,  34.6021,  39.0625,
145      39.0625,  39.0625,  39.0625,  44.4444,  44.4444,  44.4444,  44.4444,
146      51.0204,  51.0204,  51.0204,  51.0204,  59.1716,  59.1716,  59.1716,
147      59.1716,  59.1716,  69.4444,  69.4444,  69.4444,  69.4444,  82.6446,
148      82.6446,  82.6446,  82.6446,  82.6446,  100
149    };
150
151
152G4Generator2BN::G4Generator2BN(const G4String& name):G4VBremAngularDistribution(name)
153{
154  b = 1.2;
155  index_min = -300;
156  index_max = 20;
157
158  // Set parameters minimum limits Ekelectron = 250 eV and kphoton = 100 eV
159  kmin = 100*eV;
160  Ekmin = 250*eV;
161  kcut = 100*eV;
162
163  // Increment Theta value for surface interpolation
164  dtheta = 0.1*rad;
165
166  // Construct Majorant Surface to 2BN cross-section
167  // (we dont need this. Pre-calculated values are used instead due to performance issues
168  // ConstructMajorantSurface();
169}
170
171//   
172
173G4Generator2BN::~G4Generator2BN() 
174{;}
175
176//
177
178G4double G4Generator2BN::PolarAngle(const G4double initial_energy,
179                                    const G4double final_energy,
180                                    const G4int) // Z
181{
182
183  G4double theta = 0;
184
185  G4double k = initial_energy - final_energy;
186
187  theta = Generate2BN(initial_energy, k);
188
189  return theta;
190}
191//
192
193G4double G4Generator2BN::CalculateFkt(G4double k, G4double theta, G4double A, G4double c) const
194{
195  G4double Fkt_value = 0;
196  Fkt_value = A*std::pow(k,-b)*theta/(1+c*theta*theta);
197  return Fkt_value;
198}
199
200G4double G4Generator2BN::Calculatedsdkdt(G4double kout, G4double theta, G4double Eel) const
201{
202
203  G4double dsdkdt_value = 0.;
204  G4double Z = 1;
205  // classic radius (in cm)
206  G4double r0 = 2.82E-13;
207  //squared classic radius (in barn)
208  G4double r02 = r0*r0*1.0E+24;
209
210  // Photon energy cannot be greater than electron kinetic energy
211  if(kout > (Eel-electron_mass_c2)){
212    dsdkdt_value = 0;
213    return dsdkdt_value;
214  }
215
216     G4double E0 = Eel/electron_mass_c2;
217     G4double k =  kout/electron_mass_c2;
218     G4double E =  E0 - k;
219
220     if(E <= 1*MeV ){                                 // Kinematic limit at 1 MeV !!
221       dsdkdt_value = 0;
222       return dsdkdt_value;
223     }
224
225
226     G4double p0 = std::sqrt(E0*E0-1);
227     G4double p = std::sqrt(E*E-1);
228     G4double L = std::log((E*E0-1+p*p0)/(E*E0-1-p*p0));
229     G4double delta0 = E0 - p0*std::cos(theta);
230     G4double epsilon = std::log((E+p)/(E-p));
231     G4double Z2 = Z*Z;
232     G4double sintheta2 = std::sin(theta)*std::sin(theta);
233     G4double E02 = E0*E0;
234     G4double E2 = E*E;
235     G4double p02 = E0*E0-1;
236     G4double k2 = k*k;
237     G4double delta02 = delta0*delta0;
238     G4double delta04 =  delta02* delta02;
239     G4double Q = std::sqrt(p02+k2-2*k*p0*std::cos(theta));
240     G4double Q2 = Q*Q;
241     G4double epsilonQ = std::log((Q+p)/(Q-p));
242
243
244     dsdkdt_value = Z2 * (r02/(8*pi*137)) * (1/k) * (p/p0) *
245       ( (8 * (sintheta2*(2*E02+1))/(p02*delta04)) -
246         ((2*(5*E02+2*E*E0+3))/(p02 * delta02)) -
247         ((2*(p02-k2))/((Q2*delta02))) +
248         ((4*E)/(p02*delta0)) +
249         (L/(p*p0))*(
250                 ((4*E0*sintheta2*(3*k-p02*E))/(p02*delta04)) +
251                 ((4*E02*(E02+E2))/(p02*delta02)) +
252                 ((2-2*(7*E02-3*E*E0+E2))/(p02*delta02)) +
253                 (2*k*(E02+E*E0-1))/((p02*delta0))
254                 ) -
255         ((4*epsilon)/(p*delta0)) +
256         ((epsilonQ)/(p*Q))*
257         (4/delta02-(6*k/delta0)-(2*k*(p02-k2))/(Q2*delta0))
258         );
259
260
261
262     dsdkdt_value = dsdkdt_value*std::sin(theta);
263     return dsdkdt_value;
264}
265
266void G4Generator2BN::ConstructMajorantSurface()
267{
268
269  G4double Eel;
270  G4int vmax;
271  G4double Ek;
272  G4double k, theta, k0, theta0, thetamax;
273  G4double ds, df, dsmax, dk, dt;
274  G4double ratmin;
275  G4double ratio = 0;
276  G4double Vds, Vdf;
277  G4double A, c;
278
279  G4cout << "**** Constructing Majorant Surface for 2BN Distribution ****" << G4endl;
280
281  if(kcut > kmin) kmin = kcut;
282
283  G4int i = 0;
284  // Loop on energy index
285  for(G4int index = index_min; index < index_max; index++){
286
287  G4double fraction = index/100.;
288  Ek = std::pow(10.,fraction);
289  Eel = Ek + electron_mass_c2;
290
291  // find x-section maximum at k=kmin
292  dsmax = 0.;
293  thetamax = 0.;
294
295  for(theta = 0.; theta < pi; theta = theta + dtheta){
296
297    ds = Calculatedsdkdt(kmin, theta, Eel);
298
299    if(ds > dsmax){
300      dsmax = ds;
301      thetamax = theta;
302    }
303  }
304
305  // Compute surface paremeters at kmin
306  if(Ek < kmin || thetamax == 0){
307    c = 0;
308    A = 0;
309  }else{
310    c = 1/(thetamax*thetamax);
311    A = 2*std::sqrt(c)*dsmax/(std::pow(kmin,-b));
312  }
313
314  // look for correction factor to normalization at kmin
315  ratmin = 1.;
316
317  // Volume under surfaces
318  Vds = 0.;
319  Vdf = 0.;
320  k0 = 0.;
321  theta0 = 0.;
322
323  vmax = G4int(100.*std::log10(Ek/kmin));
324
325  for(G4int v = 0; v < vmax; v++){
326    G4double fraction = (v/100.);
327    k = std::pow(10.,fraction)*kmin;
328
329    for(theta = 0.; theta < pi; theta = theta + dtheta){
330      dk = k - k0;
331      dt = theta - theta0;
332      ds = Calculatedsdkdt(k,theta, Eel);
333      Vds = Vds + ds*dk*dt;
334      df = CalculateFkt(k,theta, A, c);
335      Vdf = Vdf + df*dk*dt;
336
337      if(ds != 0.){
338        if(df != 0.) ratio = df/ds;
339      }
340
341      if(ratio < ratmin && ratio != 0.){
342        ratmin = ratio;
343      }
344    }
345  }
346
347
348  // sampling efficiency
349  Atab[i] = A/ratmin * 1.04;
350  ctab[i] = c;
351
352//  G4cout << Ek << " " << i << " " << index << " " << Atab[i] << " " << ctab[i] << " " << G4endl;
353  i++;
354  }
355
356}
357
358G4double G4Generator2BN::Generate2BN(G4double Ek, G4double k) const 
359{
360
361  G4double Eel;
362  G4double kmin2; 
363  G4double kmax, t;
364  G4double cte2;
365  G4double y, u;
366  G4double fk, ft;
367  G4double ds;
368  G4double A2;
369  G4double A, c;
370
371  G4int trials = 0;
372  G4int index;
373
374  // find table index
375  index = G4int(std::log10(Ek)*100) - index_min;
376  Eel = Ek + electron_mass_c2;
377
378  kmax = Ek;
379  kmin2 = kcut;
380
381  c = ctab[index];
382  A = Atab[index];
383  if(index < index_max){
384    A2 = Atab[index+1];
385    if(A2 > A) A = A2;
386  }
387
388  do{
389  // generate k accordimg to std::pow(k,-b)
390  trials++;
391
392  // normalization constant
393//  cte1 = (1-b)/(std::pow(kmax,(1-b))-std::pow(kmin2,(1-b)));
394//  y = G4UniformRand();
395//  k = std::pow(((1-b)/cte1*y+std::pow(kmin2,(1-b))),(1/(1-b)));
396
397  // generate theta accordimg to theta/(1+c*std::pow(theta,2)
398  // Normalization constant
399  cte2 = 2*c/std::log(1+c*pi2);
400
401  y = G4UniformRand();
402  t = std::sqrt((std::exp(2*c*y/cte2)-1)/c);
403  u = G4UniformRand();
404
405  // point acceptance algorithm
406  fk = std::pow(k,-b);
407  ft = t/(1+c*t*t);
408  ds = Calculatedsdkdt(k,t,Eel);
409
410  // violation point
411  if(ds > (A*fk*ft)) G4cout << "WARNING IN G4Generator2BN !!!" << Ek << " " <<  (ds-A*fk*ft)/ds << G4endl;
412
413  }while(u*A*fk*ft > ds);
414
415  return t;
416
417}
418
419void G4Generator2BN::PrintGeneratorInformation() const
420{
421  G4cout << "\n" << G4endl;
422  G4cout << "Bremsstrahlung Angular Generator is 2BN Generator from 2BN Koch & Motz distribution (Rev Mod Phys 31(4), 920 (1959))" << G4endl;
423  G4cout << "\n" << G4endl;
424} 
425
Note: See TracBrowser for help on using the repository browser.