source: trunk/source/processes/electromagnetic/standard/src/G4IonCoulombCrossSection.cc @ 1350

Last change on this file since 1350 was 1350, checked in by garnier, 13 years ago

update to last version 4.9.4

File size: 8.2 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//      G4IonCoulombCrossSection.cc
27//-------------------------------------------------------------------
28//
29// GEANT4 Class header file
30//
31// File name:    G4IonCoulombCrossSection
32//
33// Author:      Cristina Consolandi
34//
35// Creation date: 05.10.2010 from G4eCoulombScatteringModel
36//                                 
37// Class Description:
38//      Computation of Screen-Coulomb Cross Section
39//      for protons, alpha and heavy Ions
40//
41//
42// Reference:
43//      M.J. Boschini et al. "Nuclear and Non-Ionizing Energy-Loss
44//      for Coulomb Scattered Particles from Low Energy up to Relativistic
45//      Regime in Space Radiation Environment"
46//      Accepted for publication in the Proceedings of  the  ICATPP Conference
47//      on Cosmic Rays for Particle and Astroparticle Physics, Villa  Olmo, 7-8
48//      October,  2010, to be published by World Scientific (Singapore).
49//
50//      Available for downloading at:
51//      http://arxiv.org/abs/1011.4822
52//
53// -------------------------------------------------------------------
54//
55//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
56#include "G4IonCoulombCrossSection.hh"
57#include "Randomize.hh"
58#include "G4Proton.hh"
59#include "G4LossTableManager.hh"
60
61//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
62
63
64using namespace std;
65
66G4IonCoulombCrossSection::G4IonCoulombCrossSection():
67   cosThetaMin(1.0),
68   cosThetaMax(-1.0),
69   alpha2(fine_structure_const*fine_structure_const)
70{
71        fNistManager = G4NistManager::Instance();
72        theProton   = G4Proton::Proton();
73        particle=0;
74
75        G4double p0 = electron_mass_c2*classic_electr_radius;
76        coeff  = twopi*p0*p0;
77
78        cosTetMinNuc=0;
79        cosTetMaxNuc=0;
80        nucXSection =0;
81
82
83        chargeSquare = spin = mass =0;
84        tkinLab = momLab2 = invbetaLab2=0;
85        tkin = mom2 = invbeta2=0;
86
87        targetZ = targetMass = screenZ =0;
88        ScreenRSquare=0.;
89
90        etag = ecut = 0.0;
91
92}
93//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
94
95G4IonCoulombCrossSection::~G4IonCoulombCrossSection()
96{}
97//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
98
99void G4IonCoulombCrossSection::Initialise(const G4ParticleDefinition* p,
100                                          G4double CosThetaLim)
101{
102
103        SetupParticle(p);
104        nucXSection = 0.0;
105        tkin = targetZ = mom2 = DBL_MIN;
106        ecut = etag = DBL_MAX;
107        particle = p;
108
109               
110        cosThetaMin = CosThetaLim; 
111
112}
113//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
114
115void G4IonCoulombCrossSection::SetupKinematic(G4double ekin,
116                                                     G4double cut,G4int iz )
117{
118        if(ekin != tkinLab || ecut != cut) {
119
120                // lab
121                tkinLab = ekin;
122                momLab2 = tkinLab*(tkinLab + 2.0*mass);
123                invbetaLab2 = 1.0 +  mass*mass/momLab2;
124
125                G4double etot = tkinLab + mass;
126                G4double ptot = sqrt(momLab2);
127                G4double m12  = mass*mass;
128
129                targetMass=fNistManager->GetAtomicMassAmu(iz)*amu_c2;
130                G4double m2   = targetMass;
131
132        // relativistic reduced mass from publucation
133        // A.P. Martynenko, R.N. Faustov, Teoret. mat. Fiz. 64 (1985) 179
134       
135                //incident particle & target nucleus
136                G4double Ecm=sqrt(m12 + m2*m2 + 2.0*etot*m2);
137                G4double mu_rel=mass*m2/Ecm;
138                G4double momCM= ptot*m2/Ecm;
139                // relative system
140                mom2 = momCM*momCM;
141                invbeta2 = 1.0 +  mu_rel*mu_rel/mom2;
142                tkin = momCM*sqrt(invbeta2) - mu_rel;//Ekin of mu_rel
143                //.........................................................
144
145                cosTetMinNuc = cosThetaMin;
146                cosTetMaxNuc = cosThetaMax;
147
148        }
149
150}
151//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
152
153
154void G4IonCoulombCrossSection::SetupTarget(G4double Z, G4double e, G4int heavycorr)
155{
156        if(Z != targetZ || e != etag) {
157                etag    = e;
158                targetZ = Z;
159                G4int iz= G4int(Z);
160
161                SetScreenRSquare(iz);
162                screenZ =0;
163                screenZ = ScreenRSquare/mom2;
164
165        //      G4cout<< "heavycorr "<<heavycorr<<G4endl;
166
167                if(heavycorr!=0 && particle != theProton){
168                        G4double corr=5.*twopi*Z*std::sqrt(chargeSquare*alpha2);
169                        corr=std::pow(corr,0.12);
170                        screenZ *=(1.13 + corr*3.76*Z*Z*chargeSquare*invbeta2*alpha2)/2.;
171//                      G4cout<<" heavycorr Z e corr....2As "<< heavycorr << "\t"
172//                              <<Z <<"\t"<<e/MeV <<"\t"<<screenZ<<G4endl;
173
174                }else{ screenZ *=(1.13 + 3.76*Z*Z*chargeSquare*invbeta2*alpha2)/2.;
175//                        G4cout<<"  heavycorr Z e....2As "<< heavycorr << "\t"
176//                              <<Z <<"\t"<< e/MeV <<"\t"  <<screenZ<<G4endl;
177                }
178
179                if(1 == iz && particle == theProton && cosTetMaxNuc < 0.0) {
180                        cosTetMaxNuc = 0.0;
181                }
182
183        }
184}
185
186//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
187void G4IonCoulombCrossSection::SetScreenRSquare(G4int iz){
188
189                G4double a0 = electron_mass_c2/0.88534;
190
191                //target nucleus
192                G4double Z1=std::sqrt(chargeSquare);
193                G4double Z2=targetZ;
194       
195                G4double Z1023=std::pow(Z1,0.23);
196                G4double Z2023=std::pow(Z2,0.23);
197       
198                // Universal screening length
199                G4double x=a0*(Z1023+Z2023);
200
201                //for proton Thomas-Fermi screening length     
202                if(particle == theProton){ 
203                                x = a0*fNistManager->GetZ13(iz);
204                                }               
205                ScreenRSquare  = alpha2*x*x;
206
207         
208}
209//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
210
211G4double G4IonCoulombCrossSection::NuclearCrossSection()
212{
213        // This method needs initialisation before be called
214
215        // scattering with target nucleus
216        G4double fac = coeff*targetZ*targetZ*chargeSquare*invbeta2/mom2;
217
218        nucXSection  = 0.0;
219
220        G4double x  = 1.0 - cosTetMinNuc;
221        G4double x1 = x + screenZ;
222
223        // scattering with nucleus
224        if(cosTetMaxNuc < cosTetMinNuc) {
225
226                nucXSection =fac*(cosTetMinNuc - cosTetMaxNuc)/
227                        (x1*(1.0 - cosTetMaxNuc + screenZ));
228
229                }
230
231  return nucXSection;
232}
233
234//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
235
236G4double G4IonCoulombCrossSection::SampleCosineTheta()
237{
238       
239        if(cosTetMaxNuc >= cosTetMinNuc) return 0.0;
240
241        G4double x1 = 1. - cosTetMinNuc + screenZ;
242        G4double x2 = 1. - cosTetMaxNuc + screenZ;
243        G4double dx = cosTetMinNuc - cosTetMaxNuc;
244        G4double grej, z1;
245
246                z1 = x1*x2/(x1 + G4UniformRand()*dx) - screenZ;
247                grej = 1.0/(1.0 + z1);
248 
249
250  return z1;
251}
252
253//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
254
255
256
257
Note: See TracBrowser for help on using the repository browser.