ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4hNuclearStoppingModel.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4hNuclearStoppingModel.cc
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 // -------------------------------------------------------------------
28 //
29 // GEANT4 Class file
30 //
31 //
32 // File name: G4hNuclearStoppingModel
33 //
34 // Author: V.Ivanchenko (Vladimir.Ivanchenko@cern.ch)
35 //
36 // Creation date: 20 July 2000
37 //
38 // Modifications:
39 // 20/07/2000 V.Ivanchenko First implementation
40 // 22/08/2000 V.Ivanchenko Bug fixed in call of a model
41 // 03/10/2000 V.Ivanchenko CodeWizard clean up
42 //
43 // Class Description:
44 //
45 // Low energy protons/ions nuclear stopping parametrisation
46 //
47 // Class Description: End
48 //
49 // -------------------------------------------------------------------
50 //
51 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
53 
55 
56 #include "globals.hh"
57 #include "G4PhysicalConstants.hh"
58 #include "G4SystemOfUnits.hh"
59 #include "G4UnitsTable.hh"
60 #include "G4hZiegler1985Nuclear.hh"
61 #include "G4hICRU49Nuclear.hh"
62 #include "G4DynamicParticle.hh"
63 #include "G4ParticleDefinition.hh"
64 #include "G4ElementVector.hh"
65 #include "G4Material.hh"
66 
67 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
68 
70  :G4VLowEnergyModel(name), modelName(name)
71 {
72  InitializeMe() ;
73 }
74 
75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
76 
78 {
79  // Constants
80  highEnergyLimit = 100.*MeV ;
81  lowEnergyLimit = 1.*eV ;
82  factorPDG2AMU = 1.007276/proton_mass_c2 ;
83  theZieglerFactor= eV*cm2*1.0e-15 ;
84 
85  // Registration of parametrisation models of nuclear energy losses
86  G4String blank = G4String(" ") ;
87  G4String ir49 = G4String("ICRU_R49") ;
88  G4String zi85 = G4String("Ziegler1985") ;
89  if(ir49 == modelName || blank == modelName) {
91 
92  } else if(zi85 == modelName) {
94 
95  } else {
96  G4cout <<
97  "G4hLowEnergyIonisation warning: There is no table with the modelName <"
98  << modelName << ">"
99  << " for nuclear stopping, <ICRU_R49> is applied "
100  << G4endl;
102  }
103 
104  // Default is nuclear stopping fluctuations On
105  // nStopingPowerTable->SetNuclearStoppingFluctuationsOn();
107 }
108 
109 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
110 
112 {
113  delete nStopingPowerTable;
114 }
115 
116 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
117 
120  const G4Material* material)
121 {
122  // Projectile nucleus
123  G4double energy = particle->GetKineticEnergy() ;
124  G4double z1 = std::abs((particle->GetCharge())/eplus) ;
125  G4double m1 = (particle->GetMass())*factorPDG2AMU ;
126 
127  G4double nloss = StoppingPower(material, energy, z1, m1) * theZieglerFactor;
128 
129  return nloss;
130 }
131 
132 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
133 
135  const G4ParticleDefinition* aParticle,
136  const G4Material* material,
137  G4double kineticEnergy)
138 {
139  // Projectile nucleus
140  G4double z1 = std::abs((aParticle->GetPDGCharge())/eplus) ;
141  G4double m1 = (aParticle->GetPDGMass())*factorPDG2AMU ;
142 
143  G4double nloss = StoppingPower(material, kineticEnergy, z1, m1)
144  * theZieglerFactor;
145 
146  return nloss;
147 }
148 
149 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
150 
152  const G4Material* material,
153  G4double kineticEnergy,
154  G4double z1, G4double m1) const
155 {
156  // Target nucleus
157  G4int NumberOfElements = material->GetNumberOfElements() ;
158  if(0 == NumberOfElements) return 0.0 ;
159 
160  const G4ElementVector* theElementVector =
161  material->GetElementVector() ;
162  const G4double* theAtomicNumDensityVector =
163  material->GetAtomicNumDensityVector() ;
164 
165  // loop for the elements in the material
166 
167  G4double nloss = 0.0;
168 
169  for (G4int iel=0; iel<NumberOfElements; iel++) {
170  const G4Element* element = (*theElementVector)[iel] ;
171  G4double z2 = element->GetZ();
172  G4double m2Local = element->GetA()*mole/g ;
173  nloss += (nStopingPowerTable->
174  NuclearStoppingPower(kineticEnergy, z1, z2, m1, m2Local))
175  * theAtomicNumDensityVector[iel] ;
176  }
177 
178  return nloss;
179 }
180 
181 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
182 
183 
184 
185 
186 
187 
188 
189