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

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

import all except CVS

File size: 7.8 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: G4FinalStateElasticBrennerZaider.cc,v 1.1 2007/10/12 23:11:41 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// Reference: TNS Geant4-DNA paper
44// S. Chauvie et al., Geant4 physics processes for microdosimetry simulation:
45// design foundation and implementation of the first set of models,
46// IEEE Trans. Nucl. Sci., vol. 54, no. 6, Dec. 2007.
47// Further documentation available from http://www.ge.infn.it/geant4/dna
48
49// -------------------------------------------------------------------
50
51
52#include "G4FinalStateElasticBrennerZaider.hh"
53#include "G4Track.hh"
54#include "G4Step.hh"
55#include "G4DynamicParticle.hh"
56#include "Randomize.hh"
57
58#include "G4ParticleTypes.hh"
59#include "G4ParticleDefinition.hh"
60#include "G4Electron.hh"
61#include "G4SystemOfUnits.hh"
62#include "G4ParticleMomentum.hh"
63
64G4FinalStateElasticBrennerZaider::G4FinalStateElasticBrennerZaider()
65{
66  // These data members will be used in the next implementation iteration,
67  // when the enriched PhysicsModel policy is implemented
68  name = "FinalStateElasticBrennerZaider";
69  lowEnergyLimit = 7.4 * eV;
70  highEnergyLimit = 10 * MeV;
71
72  betaCoeff.push_back(7.51525);
73  betaCoeff.push_back(-0.41912);   
74  betaCoeff.push_back(7.2017E-3);
75  betaCoeff.push_back(-4.646E-5);   
76  betaCoeff.push_back(1.02897E-7);
77
78  deltaCoeff.push_back(2.9612); 
79  deltaCoeff.push_back(-0.26376); 
80  deltaCoeff.push_back(4.307E-3); 
81  deltaCoeff.push_back(-2.6895E-5);
82  deltaCoeff.push_back(5.83505E-8);
83
84  gamma035_10Coeff.push_back(-1.7013); 
85  gamma035_10Coeff.push_back(-1.48284); 
86  gamma035_10Coeff.push_back(0.6331); 
87  gamma035_10Coeff.push_back(-0.10911); 
88  gamma035_10Coeff.push_back(8.358E-3); 
89  gamma035_10Coeff.push_back(-2.388E-4);
90
91  gamma10_100Coeff.push_back(-3.32517); 
92  gamma10_100Coeff.push_back(0.10996); 
93  gamma10_100Coeff.push_back(-4.5255E-3); 
94  gamma10_100Coeff.push_back(5.8372E-5); 
95  gamma10_100Coeff.push_back(-2.4659E-7);
96
97  gamma100_200Coeff.push_back(2.4775E-2);
98  gamma100_200Coeff.push_back(-2.96264E-5);
99  gamma100_200Coeff.push_back(-1.20655E-7);
100}
101
102
103G4FinalStateElasticBrennerZaider::~G4FinalStateElasticBrennerZaider()
104{ 
105  // empty
106  // G4DynamicParticle objects produced are owned by client
107}
108 
109
110const G4FinalStateProduct& G4FinalStateElasticBrennerZaider::GenerateFinalState(const G4Track& track, const G4Step& /* step */)
111{
112  // Clear previous secondaries, energy deposit and particle kill status
113  product.Clear();
114
115  // Kinetic energy of primary particle
116  G4double k = track.GetDynamicParticle()->GetKineticEnergy();
117
118  // Assume material = water; H2O number of electrons
119  // ---- MGP ---- To be generalized later
120  // const G4int z = 10;
121
122  G4double cosTheta = RandomizeCosTheta(k);
123 
124  G4double phi = 2. * pi * G4UniformRand();
125
126  // G4cout << "cosTheta in GenerateFinalState = " << cosTheta << ", phi = " << phi << G4endl;
127
128  G4ThreeVector zVers = track.GetDynamicParticle()->GetMomentumDirection();
129  G4ThreeVector xVers = zVers.orthogonal();
130  G4ThreeVector yVers = zVers.cross(xVers);
131
132  G4double xDir = std::sqrt(1. - cosTheta*cosTheta);
133  G4double yDir = xDir;
134  xDir *= std::cos(phi);
135  yDir *= std::sin(phi);
136
137  // G4cout << "xDir, yDir = " << xDir <<", " << yDir << G4endl;
138
139  // G4ThreeVector zPrimeVers((xDir*xVers + yDir*yVers + cosTheta*zVers).unit());
140  G4ThreeVector zPrimeVers((xDir*xVers + yDir*yVers + cosTheta*zVers));
141
142  // G4cout << "zPrimeVers = (" << zPrimeVers.x() << ", "<< zPrimeVers.y() << ", "<< zPrimeVers.z() << ") " << G4endl;
143
144  //  product.ModifyPrimaryParticle(zPrimeVers.x(),zPrimeVers.y(),zPrimeVers.z(),k);
145  product.ModifyPrimaryParticle(zPrimeVers,k);
146
147  //  this->aParticleChange.ProposeEnergy(k);
148  //  this->aParticleChange.ProposeMomentumDirection(zPrimeVers);
149  //  this->aParticleChange.SetNumberOfSecondaries(0);
150
151  return product;
152}
153
154G4double G4FinalStateElasticBrennerZaider::RandomizeCosTheta(G4double k)
155{
156  //  d sigma_el                         1                                 beta(K)
157  // ------------ (K) ~ --------------------------------- + ---------------------------------
158  //   d Omega           (1 + 2 gamma(K) - cos(theta))^2     (1 + 2 delta(K) + cos(theta))^2
159  //
160  // Maximum is < 1/(4 gamma(K)^2) + beta(K)/(4 delta(K)^2)
161  //
162  // Phys. Med. Biol. 29 N.4 (1983) 443-447
163 
164  // gamma(K), beta(K) and delta(K) are polynomials with coefficients for energy measured in eV
165  k /= eV;
166 
167  G4double beta = std::exp(CalculatePolynomial(k,betaCoeff)); 
168  G4double delta = std::exp(CalculatePolynomial(k,deltaCoeff)); 
169 
170  G4double gamma;
171  if (k > 100.)
172    {
173      gamma = CalculatePolynomial(k, gamma100_200Coeff); // Only in this case it is not the exponent of the polynomial
174    } 
175  else 
176    {
177
178      if (k>10)
179        {
180          gamma = std::exp(CalculatePolynomial(k, gamma10_100Coeff));
181        }
182      else
183        {
184          gamma = std::exp(CalculatePolynomial(k, gamma035_10Coeff));
185        }
186    }
187 
188  // G4cout << "beta = " << beta << ", gamma = " << gamma << ", delta = " << delta << G4endl;
189
190  G4double oneOverMax = 1. / (1./(4.*gamma*gamma) + beta/(4.*delta*delta));
191 
192  G4double cosTheta = 0.;
193  G4double leftDenominator = 0.;
194  G4double rightDenominator = 0.;
195  G4double fCosTheta = 0.;
196 
197  do
198    {
199      cosTheta = 2. * G4UniformRand() - 1.;
200      leftDenominator = (1 + 2.*gamma - cosTheta);
201      rightDenominator = (1 + 2.*delta + cosTheta);
202      fCosTheta = oneOverMax * (1./(leftDenominator*leftDenominator) + beta/(rightDenominator*rightDenominator));
203    }
204  while (fCosTheta < G4UniformRand());
205
206  //  G4cout << "cosTheta = " << cosTheta << G4endl;
207 
208  return cosTheta; 
209}
210
211G4double G4FinalStateElasticBrennerZaider::CalculatePolynomial(G4double k, std::vector<G4double>& vec)
212{
213  // Sum_{i=0}^{size-1} vector_i k^i
214  //
215  // Phys. Med. Biol. 29 N.4 (1983) 443-447
216
217  G4double result = 0.;
218  size_t size = vec.size();
219
220  while (size>0)
221    {
222      size--; 
223     
224      result *= k;
225      result += vec[size];
226    }
227 
228  return result;
229}
230
Note: See TracBrowser for help on using the repository browser.