Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/hadronic/models/radioactive_decay/src/G4BetaDecayCorrections.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 ]

  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 #include "globals.hh"
 28 #include "G4PhysicalConstants.hh"
 29 #include "G4BetaDecayType.hh"
 30 #include "G4BetaDecayCorrections.hh"
 31 #include "G4Pow.hh"
 32 
 33 G4BetaDecayCorrections::G4BetaDecayCorrections(const G4int theZ, const G4int theA)
 34  : Z(theZ), A(theA)
 35 {
 36   // alphaZ = fine_structure_const*std::abs(Z);
 37   alphaZ = fine_structure_const*Z;
 38 
 39   // Nuclear radius in units of hbar/m_e/c
 40   G4double a13 = G4Pow::GetInstance()->Z13(A);
 41   Rnuc = 0.5*fine_structure_const*a13;
 42 
 43   // Electron screening potential in units of electron mass
 44   V0 = 1.13*fine_structure_const*fine_structure_const
 45            *std::pow(std::abs(Z), 4./3.);
 46 
 47   gamma0 = std::sqrt(1. - alphaZ*alphaZ);
 48 
 49   // Largest allowed value of im argument in ModSquared
 50 //  imMax = std::log(DBL_MAX)/pi;
 51   imMax = 200.;   // actual value = 225.931, but use 200 to be safe
 52 //  G4cout << " imMax = " << imMax << G4endl; 
 53 
 54   // Coefficients for gamma function with real argument
 55   gc[0] = -0.1010678;
 56   gc[1] =  0.4245549;
 57   gc[2] = -0.6998588;
 58   gc[3] =  0.9512363;
 59   gc[4] = -0.5748646;
 60   gc[5] = 1.0;
 61 }
 62 
 63 
 64 G4double G4BetaDecayCorrections::FermiFunction(const G4double& W)
 65 {
 66   // Calculate the relativistic Fermi function.  Argument W is the
 67   // total electron energy in units of electron mass.
 68   // Ref: E. Feenberg, G. Trigg, Reviews of Modern Physics, 22(1950)
 69 
 70   G4double Wprime;
 71   if (Z < 0) {
 72     Wprime = W + V0;
 73   } else {
 74     Wprime = W - V0;
 75 //    if (Wprime < 1.) Wprime = W;
 76     if (Wprime <= 1.00001) Wprime = 1.00001;
 77   }
 78 
 79   G4double p_e = std::sqrt(Wprime*Wprime - 1.);
 80   G4double eta = alphaZ*Wprime/p_e;
 81   G4double epieta = std::exp(pi*eta);
 82   G4double realGamma = Gamma(2.*gamma0+1);
 83   G4double mod2Gamma = ModSquared(gamma0, eta);
 84 
 85   // Fermi function
 86   G4double factor1 = 2*(1+gamma0)*mod2Gamma/realGamma/realGamma;
 87   G4double factor2 = epieta*std::pow(2*p_e*Rnuc, 2*(gamma0-1) );
 88 
 89   // Electron screening factor
 90   G4double factor3 = (Wprime/W)*std::sqrt( (Wprime*Wprime - 1.)/(W*W - 1.) );
 91 
 92   return factor1*factor2*factor3;
 93 }
 94 
 95 
 96 G4double
 97 G4BetaDecayCorrections::ModSquared(const G4double& re, G4double im)
 98 {
 99   // Calculate the squared modulus of the Gamma function 
100   // with complex argument (re, im) using approximation B 
101   // of Wilkinson, Nucl. Instr. & Meth. 82, 122 (1970).
102   // Here, choose N = 1 in Wilkinson's notation for approximation B
103 
104   im = std::max(std::min(im, imMax), -imMax);
105   G4double factor1 = std::pow( (1+re)*(1+re) + im*im, re+0.5);
106   G4double factor2 = std::exp(2*im * std::atan(im/(1+re)));
107   G4double factor3 = std::exp(2*(1+re));
108   G4double factor4 = 2.*pi;
109   G4double factor5 = std::exp( (1+re)/( (1+re)*(1+re) + im*im)/6 );
110   G4double factor6 = re*re + im*im;
111   return factor1*factor4*factor5/factor2/factor3/factor6;
112 }
113 
114 
115 G4double G4BetaDecayCorrections::Gamma(const G4double& arg)
116 {
117   // Use recursion relation to get argument < 1
118   G4double fac = 1.0;
119   G4double x = arg - 1.;
120 
121   G4int loop = 0;
122   G4ExceptionDescription ed;
123   ed << " While count exceeded " << G4endl; 
124   while (x > 1.0) { /* Loop checking, 01.09.2015, D.Wright */
125     fac *= x;
126     x -= 1.0;
127     loop++;
128     if (loop > 1000) {
129       G4Exception("G4BetaDecayCorrections::Gamma()", "HAD_RDM_100", JustWarning, ed);
130       break;
131     }
132   }
133 
134   // Calculation of Gamma function with real argument
135   // 0 < arg < 1 using polynomial from Abramowitz and Stegun
136   G4double sum = gc[0];
137   for (G4int i = 1; i < 6; i++) sum = sum*x + gc[i];
138 
139   return sum*fac;
140 }
141 
142 
143 G4double
144 G4BetaDecayCorrections::ShapeFactor(const G4BetaDecayType& bdt,
145                                     const G4double& p_e, const G4double& e_nu)
146 {
147   G4double twoPR = 2.*p_e*Rnuc;
148   G4double factor(1.);
149 
150   switch (bdt)
151   {
152     case (allowed) :
153       break;
154 
155     case (firstForbidden) :
156       {
157         // Parameters for 1st forbidden shape determined from 210Bi data
158         // Not valid for other 1st forbidden nuclei
159         G4double c1 = 0.578;
160         G4double c2 = 28.466;
161         G4double c3 = -0.658;
162 
163         G4double w = std::sqrt(1. + p_e*p_e);
164         factor = 1. + c1*w + c2/w + c3*w*w;
165       }
166       break;
167 
168     case (uniqueFirstForbidden) :
169       {
170         G4double eta = alphaZ*std::sqrt(1. + p_e*p_e)/p_e;
171         G4double gamma1 = std::sqrt(4. - alphaZ*alphaZ);
172         G4double gamterm1 = Gamma(2.*gamma0+1.)/Gamma(2.*gamma1+1.);
173         G4double term1 = e_nu*e_nu*(1. + gamma0)/6.;
174         G4double term2 = 12.*(2. + gamma1)*p_e*p_e
175                             *std::pow(twoPR, 2.*(gamma1-gamma0-1) )
176                             *gamterm1*gamterm1
177                             *ModSquared(gamma1, eta)/ModSquared(gamma0, eta);
178         factor = term1 + term2;
179       }
180       break;
181 
182     case (secondForbidden) :
183       break;
184 
185     case (uniqueSecondForbidden) :
186       {
187         G4double eta = alphaZ*std::sqrt(1. + p_e*p_e)/p_e;
188         G4double gamma1 = std::sqrt(4. - alphaZ*alphaZ);
189         G4double gamma2 = std::sqrt(9. - alphaZ*alphaZ);
190         G4double gamterm0 = Gamma(2.*gamma0+1.);
191         G4double gamterm1 = gamterm0/Gamma(2.*gamma1+1.);
192         G4double gamterm2 = gamterm0/Gamma(2.*gamma2+1.);
193         G4double term1 = e_nu*e_nu*e_nu*e_nu*(1. + gamma0)/60.;
194 
195         G4double term2 = 4.*(2. + gamma1)*e_nu*e_nu*p_e*p_e
196                            *std::pow(twoPR, 2.*(gamma1-gamma0-1.) )
197                            *gamterm1*gamterm1
198                            *ModSquared(gamma1, eta)/ModSquared(gamma0, eta);
199 
200         G4double term3 = 180.*(3.+gamma2)*p_e*p_e*p_e*p_e
201                              *std::pow(twoPR, 2.*(gamma2-gamma0-2) )
202                              *gamterm2*gamterm2
203                              *ModSquared(gamma2, eta)/ModSquared(gamma0, eta);
204 
205         factor = term1 + term2 + term3;
206       }
207       break;
208 
209     case (thirdForbidden) :
210       break;
211 
212     case (uniqueThirdForbidden) :
213       {
214         G4double eta = alphaZ*std::sqrt(1. + p_e*p_e)/p_e;
215         G4double gamma1 = std::sqrt(4. - alphaZ*alphaZ);
216         G4double gamma2 = std::sqrt(9. - alphaZ*alphaZ);
217         G4double gamma3 = std::sqrt(16. - alphaZ*alphaZ);
218         G4double gamterm0 = Gamma(2.*gamma0+1.);
219         G4double gamterm1 = gamterm0/Gamma(2.*gamma1+1.);
220         G4double gamterm2 = gamterm0/Gamma(2.*gamma2+1.);
221         G4double gamterm3 = gamterm0/Gamma(2.*gamma3+1.);
222 
223         G4double term1 = e_nu*e_nu*e_nu*e_nu*e_nu*e_nu*(1. + gamma0)/1260.;
224 
225         G4double term2 = 2.*(2. + gamma1)*e_nu*e_nu*e_nu*e_nu*p_e*p_e
226                            *std::pow(twoPR, 2.*(gamma1-gamma0-1.) )
227                            *gamterm1*gamterm1
228                            *ModSquared(gamma1, eta)/ModSquared(gamma0, eta)/5.;
229 
230         G4double term3 = 60.*(3.+gamma2)*p_e*p_e*p_e*p_e*e_nu*e_nu
231                              *std::pow(twoPR, 2.*(gamma2-gamma0-2.) )
232                              *gamterm2*gamterm2
233                              *ModSquared(gamma2, eta)/ModSquared(gamma0, eta);
234 
235         G4double term4 = 2240.*p_e*p_e*p_e*p_e*p_e*p_e*(4. + gamma3)
236                              *std::pow(twoPR, 2.*(gamma3-gamma0-3.) )
237                              *gamterm3*gamterm3
238                              *ModSquared(gamma3, eta)/ModSquared(gamma0, eta);
239 
240         factor = term1 + term2 + term3 + term4;
241       }
242       break;
243 
244     default:
245       G4Exception("G4BetaDecayCorrections::ShapeFactor()","HAD_RDM_010",
246                   JustWarning,
247                   "Transition not yet implemented - using allowed shape");
248       break;
249   }
250 
251   return factor;
252 }
253 
254  
255