Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/lowenergy/src/G4Generator2BN.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /processes/electromagnetic/lowenergy/src/G4Generator2BN.cc (Version 11.3.0) and /processes/electromagnetic/lowenergy/src/G4Generator2BN.cc (Version 6.2.p2)


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