source: trunk/source/processes/electromagnetic/lowenergy/src/G4CrossSectionExcitationMillerGreenPartial.cc @ 836

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

import all except CVS

  • Property svn:executable set to *
File size: 10.9 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer                                           *
4// *                                                                  *
5// * The  Geant4 software  is  copyright of the Copyright Holders  of *
6// * the Geant4 Collaboration.  It is provided  under  the terms  and *
7// * conditions of the Geant4 Software License,  included in the file *
8// * LICENSE and available at  http://cern.ch/geant4/license .  These *
9// * include a list of copyright holders.                             *
10// *                                                                  *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work  make  any representation or  warranty, express or implied, *
14// * regarding  this  software system or assume any liability for its *
15// * use.  Please see the license in the file  LICENSE  and URL above *
16// * for the full disclaimer and the limitation of liability.         *
17// *                                                                  *
18// * This  code  implementation is the result of  the  scientific and *
19// * technical work of the GEANT4 collaboration.                      *
20// * By using,  copying,  modifying or  distributing the software (or *
21// * any work based  on the software)  you  agree  to acknowledge its *
22// * use  in  resulting  scientific  publications,  and indicate your *
23// * acceptance of all terms of the Geant4 Software license.          *
24// ********************************************************************
25//
26//
27// $Id: G4CrossSectionExcitationMillerGreenPartial.cc,v 1.1 2007/11/08 19:57:23 pia Exp $
28// GEANT4 tag $Name:  $
29//
30// Contact Author: Maria Grazia Pia (Maria.Grazia.Pia@cern.ch)
31//
32// Reference: TNS Geant4-DNA paper
33// Reference for implementation model: NIM. 155, pp. 145-156, 1978
34
35// History:
36// -----------
37// Date         Name              Modification
38// 28 Apr 2007  M.G. Pia          Created in compliance with design described in TNS paper
39//
40// -------------------------------------------------------------------
41
42// Class description:
43// Geant4-DNA Cross total cross section for electron elastic scattering in water
44// Reference: TNS Geant4-DNA paper
45// S. Chauvie et al., Geant4 physics processes for microdosimetry simulation:
46// design foundation and implementation of the first set of models,
47// IEEE Trans. Nucl. Sci., vol. 54, no. 6, Dec. 2007.
48// Further documentation available from http://www.ge.infn.it/geant4/dna
49
50// -------------------------------------------------------------------
51
52
53#include "G4CrossSectionExcitationMillerGreenPartial.hh"
54#include "G4Track.hh"
55#include "G4DynamicParticle.hh"
56#include "G4ParticleDefinition.hh"
57#include "G4Proton.hh"
58#include "G4DNAGenericIonsManager.hh"
59#include "G4CrossSectionExcitationEmfietzoglouPartial.hh"
60#include "Randomize.hh"
61#include <deque>
62
63
64G4CrossSectionExcitationMillerGreenPartial::G4CrossSectionExcitationMillerGreenPartial()
65{
66
67  nLevels = waterExcitation.NumberOfLevels();
68  //G4cout << "Water excitation energy: number of levels = " << nLevels << G4endl;
69 
70  //PROTON
71  kineticEnergyCorrection[0] = 1.;
72  slaterEffectiveCharge[0][0] = 0.;
73  slaterEffectiveCharge[1][0] = 0.;
74  slaterEffectiveCharge[2][0] = 0.;
75  sCoefficient[0][0] = 0.;
76  sCoefficient[1][0] = 0.;
77  sCoefficient[2][0] = 0.;
78
79  //ALPHA++
80  kineticEnergyCorrection[1] = 0.9382723/3.727417;
81  slaterEffectiveCharge[0][1]=0.;
82  slaterEffectiveCharge[1][1]=0.;
83  slaterEffectiveCharge[2][1]=0.;
84  sCoefficient[0][1]=0.;
85  sCoefficient[1][1]=0.;
86  sCoefficient[2][1]=0.;
87
88  // ALPHA+
89  kineticEnergyCorrection[2] = 0.9382723/3.727417;
90  slaterEffectiveCharge[0][2]=2.0;
91  slaterEffectiveCharge[1][2]=1.15;
92  slaterEffectiveCharge[2][2]=1.15;
93  sCoefficient[0][2]=0.7;
94  sCoefficient[1][2]=0.15;
95  sCoefficient[2][2]=0.15;
96
97  // HELIUM
98  kineticEnergyCorrection[3] = 0.9382723/3.727417;
99  slaterEffectiveCharge[0][3]=1.7;
100  slaterEffectiveCharge[1][3]=1.15;
101  slaterEffectiveCharge[2][3]=1.15;
102  sCoefficient[0][3]=0.5;
103  sCoefficient[1][3]=0.25;
104  sCoefficient[2][3]=0.25; 
105 
106}
107
108G4CrossSectionExcitationMillerGreenPartial::~G4CrossSectionExcitationMillerGreenPartial()
109{ }
110 
111G4double G4CrossSectionExcitationMillerGreenPartial::CrossSection(G4double k, G4int excitationLevel, 
112                                                                  const G4ParticleDefinition* particleDefinition)
113{
114  //                               ( ( z * aj ) ^ omegaj ) * ( t - ej ) ^ nu
115  // sigma(t) = zEff^2 * sigma0 * --------------------------------------------
116  //                               jj ^ ( omegaj + nu ) + t ^ ( omegaj + nu )
117  //
118  // where t is the kinetic energy corrected by Helium mass over proton mass for Helium ions
119  //
120  // zEff is:
121  //  1 for protons
122  //  2 for alpha++
123  //  and  2 - c1 S_1s - c2 S_2s - c3 S_2p for alpha+ and He
124  //
125  // Dingfelder et al., RPC 59, 255-275, 2000 from Miller and Green (1973)
126  // Formula (34) and Table 2
127 
128  const G4double sigma0(1.E+8 * barn);
129  const G4double nu(1.);
130  const G4double aj[]={876.*eV, 2084.* eV, 1373.*eV, 692.*eV, 900.*eV};
131  const G4double jj[]={19820.*eV, 23490.*eV, 27770.*eV, 30830.*eV, 33080.*eV};
132  const G4double omegaj[]={0.85, 0.88, 0.88, 0.78, 0.78};
133 
134  G4int particleTypeIndex = 0;
135  G4DNAGenericIonsManager* instance;
136  instance = G4DNAGenericIonsManager::Instance();
137
138  if (particleDefinition == G4Proton::ProtonDefinition()) particleTypeIndex=0;
139  if (particleDefinition == instance->GetIon("alpha++")) particleTypeIndex=1;
140  if (particleDefinition == instance->GetIon("alpha+")) particleTypeIndex=2;
141  if (particleDefinition == instance->GetIon("helium")) particleTypeIndex=3;
142 
143  G4double tCorrected;
144  tCorrected = k * kineticEnergyCorrection[particleTypeIndex];
145
146  // Assume that the material is water; proper algorithm to calculate correctly for any material to be inserted here
147  G4int z = 10;
148
149  G4double numerator;
150  numerator = std::pow(z * aj[excitationLevel], omegaj[excitationLevel]) * 
151    std::pow(tCorrected - waterExcitation.ExcitationEnergy(excitationLevel), nu);
152
153  G4double power;
154  power = omegaj[excitationLevel] + nu;
155
156  G4double denominator;
157  denominator = std::pow(jj[excitationLevel], power) + std::pow(tCorrected, power);
158
159  G4double zEff = particleDefinition->GetPDGCharge() / eplus + particleDefinition->GetLeptonNumber();
160
161  zEff -= ( sCoefficient[0][particleTypeIndex] * S_1s(k, waterExcitation.ExcitationEnergy(excitationLevel), slaterEffectiveCharge[0][particleTypeIndex], 1.) +
162            sCoefficient[1][particleTypeIndex] * S_2s(k, waterExcitation.ExcitationEnergy(excitationLevel), slaterEffectiveCharge[1][particleTypeIndex], 2.) +
163            sCoefficient[2][particleTypeIndex] * S_2p(k, waterExcitation.ExcitationEnergy(excitationLevel), slaterEffectiveCharge[2][particleTypeIndex], 2.) );
164
165  G4double cross = sigma0 * zEff * zEff * numerator / denominator;
166
167  return cross;
168}
169
170G4int G4CrossSectionExcitationMillerGreenPartial::RandomSelect(G4double k, 
171                                                               const G4ParticleDefinition* particle)
172{
173  G4int i = nLevels;
174  G4double value = 0.;
175  std::deque<double> values;
176 
177  // ---- MGP ---- The following algorithm is wrong: it works is the cross section
178  // is a monotone increasing function.
179  // The algorithm should be corrected by building the cumulative function
180  // of the cross section and comparing a random number in the range 0-1 against
181  // the cumulative value at each bin
182
183  G4DNAGenericIonsManager *instance;
184  instance = G4DNAGenericIonsManager::Instance();
185
186  // ELECTRON CORRECTION
187 
188  if ( particle == instance->GetIon("alpha++"))
189    {  while (i > 0)
190      {
191        i--;
192        G4double partial = CrossSection(k,i,particle);
193        values.push_front(partial);
194        value += partial;
195      }
196
197    value *= G4UniformRand();
198   
199    i = nLevels;
200
201    while (i > 0)
202      {
203        i--;
204        if (values[i] > value) return i;
205        value -= values[i];
206      }
207    } 
208
209  //
210  // add ONE or TWO electron-water excitation for alpha+ and helium
211   
212  if ( particle == instance->GetIon("alpha+") 
213       ||
214       particle == instance->GetIon("helium")
215       ) 
216    {
217
218      while (i>0)
219        {
220          i--;
221         
222          G4CrossSectionExcitationEmfietzoglouPartial* excitationXS = 
223            new G4CrossSectionExcitationEmfietzoglouPartial();
224         
225          G4double sigmaExcitation=0;
226          if (k*0.511/3728 > 7.4*eV && k*0.511/3728 < 10*keV) sigmaExcitation = excitationXS->CrossSection(k*0.511/3728,i);
227 
228          G4double partial = CrossSection(k,i,particle);
229          if (particle == instance->GetIon("alpha+")) partial = CrossSection(k,i,particle) + sigmaExcitation;
230          if (particle == instance->GetIon("helium")) partial = CrossSection(k,i,particle) + 2*sigmaExcitation;
231          values.push_front(partial);
232          value += partial;
233          delete excitationXS;
234        }
235 
236      value*=G4UniformRand();
237 
238      i=5;
239      while (i>0)
240        {
241          i--;
242   
243          if (values[i]>value) return i;
244 
245          value-=values[i];
246        }
247    }   
248  //   
249  return 0;
250}
251
252G4double G4CrossSectionExcitationMillerGreenPartial::Sum(G4double k, const G4ParticleDefinition* particle)
253{
254  G4double totalCrossSection = 0.;
255
256  for (G4int i=0; i<nLevels; i++)
257    {
258      totalCrossSection += CrossSection(k,i,particle);
259    }
260  return totalCrossSection;
261}
262
263
264G4double G4CrossSectionExcitationMillerGreenPartial::S_1s(G4double t,
265                                                          G4double energyTransferred,
266                                                          G4double slaterEffectiveCharge,
267                                                          G4double shellNumber)
268{
269  // 1 - e^(-2r) * ( 1 + 2 r + 2 r^2)
270  // Dingfelder, in Chattanooga 2005 proceedings, formula (7)
271 
272  G4double r = R(t, energyTransferred, slaterEffectiveCharge, shellNumber);
273  G4double value = 1. - std::exp(-2 * r) * ( ( 2. * r + 2. ) * r + 1. );
274 
275  return value;
276}
277
278
279G4double G4CrossSectionExcitationMillerGreenPartial::S_2s(G4double t,
280                                                          G4double energyTransferred,
281                                                          G4double slaterEffectiveCharge,
282                                                          G4double shellNumber)
283{
284  // 1 - e^(-2 r) * ( 1 + 2 r + 2 r^2 + 2 r^4)
285  // Dingfelder, in Chattanooga 2005 proceedings, formula (8)
286
287  G4double r = R(t, energyTransferred, slaterEffectiveCharge, shellNumber);
288  G4double value =  1. - std::exp(-2 * r) * (((2. * r * r + 2.) * r + 2.) * r + 1.);
289
290  return value;
291 
292}
293
294
295G4double G4CrossSectionExcitationMillerGreenPartial::S_2p(G4double t,
296                                                          G4double energyTransferred,
297                                                          G4double slaterEffectiveCharge,
298                                                          G4double shellNumber)
299{
300  // 1 - e^(-2 r) * ( 1 + 2 r + 2 r^2 + 4/3 r^3 + 2/3 r^4)
301  // Dingfelder, in Chattanooga 2005 proceedings, formula (9)
302
303  G4double r = R(t, energyTransferred, slaterEffectiveCharge, shellNumber);
304  G4double value =  1. - std::exp(-2 * r) * (((( 2./3. * r + 4./3.) * r + 2.) * r + 2.) * r  + 1.);
305
306  return value;
307}
308
309
310G4double G4CrossSectionExcitationMillerGreenPartial::R(G4double t,
311                                                       G4double energyTransferred,
312                                                       G4double slaterEffectiveCharge,
313                                                       G4double shellNumber) 
314{
315  // tElectron = m_electron / m_alpha * t
316  // Hardcoded in Riccardo's implementation; to be corrected
317  // Dingfelder, in Chattanooga 2005 proceedings, p 4
318
319  G4double tElectron = 0.511/3728. * t;
320  G4double value = 2. * tElectron * slaterEffectiveCharge / (energyTransferred * shellNumber);
321 
322  return value;
323}
324
Note: See TracBrowser for help on using the repository browser.