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 10.0.p1)


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