Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4QMuonNuclearCrossSection.hh
Go to the documentation of this file.
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$
28//
29//
30// GEANT4 physics class: G4QMuonNuclearCrossSection -- header file
31// M.V. Kossov, CERN-ITEP(Moscow), 4-FEB-2004
32// The last update: M.V. Kossov, CERN/ITEP (Moscow) 4-Feb-04
33//
34// Short description: this G4 singletone class calculates muonNuclear cross section for
35// the particular isotope (GetCrossSection member function)
36// ****************************************************************************************
37// ********* This HEADER is temporary moved from the photolepton_hadron directory *********
38// ******* DO NOT MAKE ANY CHANGE! With time it'll move back to photolepton...(M.K.) ******
39// ****************************************************************************************
40// Short description: reaction cross-sections for muon-nuclear reactions, which
41// are integrals over virtual equivalent photons photons. The muon-nuclear GHAD
42// model (not CHIPS) gives 2-3 times smaller scattering angle and deposited energy.
43// --------------------------------------------------------------------------------
44
45#ifndef G4QMuonNuclearCrossSection_h
46#define G4QMuonNuclearCrossSection_h 1
47
48#include "G4ParticleTable.hh"
49#include "G4NucleiProperties.hh"
50#include <vector>
51#include "Randomize.hh"
52#include "G4MuonPlus.hh"
53#include "G4MuonMinus.hh"
54#include "G4VQCrossSection.hh"
55
57{
58protected:
59
61
62public:
63
65
66 static G4VQCrossSection* GetPointer(); // Gives a pointer to this singletone
67
69
70 // At present momentum (pMom) must be in GeV (@@ Units)
71 virtual G4double GetCrossSection(G4bool fCS, G4double pMom, G4int tgZ, G4int tgN,
72 G4int pPDG=0);
73
75 G4double Momentum);
76
78
80
82
84
85private:
86 G4int GetFunctions(G4double a, G4double* x, G4double* y, G4double* z);
87 G4double HighEnergyJ1(G4double lE);
88 G4double HighEnergyJ2(G4double lE);
89 G4double HighEnergyJ3(G4double lE);
90 G4double SolveTheEquation(G4double f);
91 G4double Fun(G4double x);
92 G4double DFun(G4double x);
93
94// Body
95private:
96 static G4bool onlyCS; // flag to calculate only CS
97 static G4double lastSig; // Last calculated cross section
98 static G4int lastL; // Last used in the cross section TheLastBin
99 static G4double lastE; // Last used in the cross section Energy
100 static G4int lastF; // Last used in the cross section TheFirstBin
101 static G4double lastG; // Last value of gamma=lnE-ln(m)
102 static G4double lastH; // Last value of the High energy A-dependence
103 static G4double* lastJ1; // Pointer to the last array of the J1 function
104 static G4double* lastJ2; // Pointer to the last array of the J2 function
105 static G4double* lastJ3; // Pointer to the last array of the J3 function
106 static G4int lastPDG; // The last projectile PDG
107 static G4int lastN; // The last N of calculated nucleus
108 static G4int lastZ; // The last Z of calculated nucleus
109 static G4double lastP; // Last used in the cross section Momentum
110 static G4double lastTH; // Last value of the Momentum Threshold
111 static G4double lastCS; // Last value of the Cross Section
112 static G4int lastI; // The last position in the DAMDB
113 static std::vector <G4double*>* J1; // Vector of pointers to the J1 tabulated functions
114 static std::vector <G4double*>* J2; // Vector of pointers to the J2 tabulated functions
115 static std::vector <G4double*>* J3; // Vector of pointers to the J3 tabulated functions
116};
117
118inline G4double G4QMuonNuclearCrossSection::DFun(G4double x)// Parametrization of PhotNucCS
119{
120 static const G4double shd=1.0734; // HE PomShadowing(D)
121 static const G4double poc=0.0375; // HE Pomeron coefficient
122 static const G4double pos=16.5; // HE Pomeron shift
123 static const G4double reg=.11; // HE Reggeon slope
124 static const G4double mmu=105.65839; // Mass of a muon in MeV
125 static const G4double lmmu=std::log(mmu); // Log of a muon mass
126 G4double y=std::exp(x-lastG-lmmu); // y for the x
127 G4double flux=lastG*(2.-y*(2.-y))-1.; // flux factor
128 return (poc*(x-pos)+shd*std::exp(-reg*x))*flux;
129}
130
131inline G4double G4QMuonNuclearCrossSection::Fun(G4double x) // Integrated PhoNucCS
132{
133 G4double dlg1=lastG+lastG-1.;
134 G4double lgoe=lastG/lastE;
135 G4double HE2=HighEnergyJ2(x);
136 return dlg1*HighEnergyJ1(x)-lgoe*(HE2+HE2-HighEnergyJ3(x)/lastE);
137}
138
139inline G4double G4QMuonNuclearCrossSection::HighEnergyJ1(G4double lEn)
140{
141 static const G4double le=std::log(50000.); // log(E0)
142 static const G4double le2=le*le; // log(E0)^2
143 static const G4double a=.0375; // a
144 static const G4double ha=a*.5; // a/2
145 static const G4double ab=a*16.5; // a*b
146 static const G4double d=0.11; // d
147 static const G4double cd=1.0734/d; // c/d
148 static const G4double ele=std::exp(-d*le); // E0^(-d)
149 return ha*(lEn*lEn-le2)-ab*(lEn-le)-cd*(std::exp(-d*lEn)-ele);
150}
151
152inline G4double G4QMuonNuclearCrossSection::HighEnergyJ2(G4double lEn)
153{
154 static const G4double e=50000.; // E0
155 static const G4double le=std::log(e); // log(E0)
156 static const G4double le1=(le-1.)*e; // (log(E0)-1)*E0
157 static const G4double a=.0375; // a
158 static const G4double ab=a*16.5; // a*b
159 static const G4double d=1.-0.11; // 1-d
160 static const G4double cd=1.0734/d; // c/(1-d)
161 static const G4double ele=std::exp(d*le); // E0^(1-d)
162 G4double En=std::exp(lEn);
163 return a*((lEn-1.)*En-le1)-ab*(En-e)+cd*(std::exp(d*lEn)-ele);
164}
165
166inline G4double G4QMuonNuclearCrossSection::HighEnergyJ3(G4double lEn)
167{
168 static const G4double e=50000.; // E0
169 static const G4double le=std::log(e); // log(E0)
170 static const G4double e2=e*e; // E0^2
171 static const G4double leh=(le-.5)*e2; // (log(E0)-.5)*E0^2
172 static const G4double ha=.0375*.5; // a/2
173 static const G4double hab=ha*16.5; // a*b/2
174 static const G4double d=2.-.11; // 2-d
175 static const G4double cd=1.0734/d; // c/(2-d)
176 static const G4double ele=std::exp(d*le); // E0^(2-d)
177 G4double lastE2=std::exp(lEn+lEn);
178 return ha*((lEn-.5)*lastE2-leh)-hab*(lastE2-e2)+cd*(std::exp(d*lEn)-ele);
179}
180
181#endif
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4double CalculateCrossSection(G4bool CS, G4int F, G4int I, G4int PDG, G4int Z, G4int N, G4double Momentum)
virtual G4double GetCrossSection(G4bool fCS, G4double pMom, G4int tgZ, G4int tgN, G4int pPDG=0)
static G4VQCrossSection * GetPointer()
G4double ThresholdEnergy(G4int Z, G4int N, G4int PDG=13)
G4double GetVirtualFactor(G4double nu, G4double Q2)