Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4WentzelVIRelModel.cc
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// -------------------------------------------------------------------
28//
29// GEANT4 Class file
30//
31//
32// File name: G4WentzelVIRelModel
33//
34// Author: V.Ivanchenko
35//
36// Creation date: 08.06.2012 from G4WentzelVIRelModel
37//
38// Modifications:
39//
40// Class Description:
41//
42// Implementation of the model of multiple scattering based on
43// G.Wentzel, Z. Phys. 40 (1927) 590.
44// H.W.Lewis, Phys Rev 78 (1950) 526.
45// J.M. Fernandez-Varea et al., NIM B73 (1993) 447.
46// L.Urban, CERN-OPEN-2006-077.
47
48// -------------------------------------------------------------------
49//
50
51//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
52//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
53
58#include "G4SystemOfUnits.hh"
59#include "G4Material.hh"
60#include "G4ElementVector.hh"
62#include "G4NistManager.hh"
63#include "G4EmParameters.hh"
64#include "G4AutoLock.hh"
65
66//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
67
68std::vector<G4double> G4WentzelVIRelModel::effMass;
69
70namespace
71{
72 G4Mutex theWVIRelMutex = G4MUTEX_INITIALIZER;
73}
74
76 G4WentzelVIModel(true, "WentzelVIRel")
77{
78 fNistManager = G4NistManager::Instance();
79 auto ptr = new G4WentzelVIRelXSection();
81}
82
83//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
84
86
87//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
88
90 const G4DataVector& cuts)
91{
92 // Access to materials
93 const G4ProductionCutsTable* theCoupleTable =
95 if(theCoupleTable->GetTableSize() != effMass.size()) {
96 ComputeEffectiveMass();
97 }
98
100}
101
102//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
103
114
115//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
116
118 const G4ParticleDefinition* p,
119 G4double kinEnergy,
121 G4double cutEnergy, G4double)
122{
123 G4double cross = 0.0;
124 if(p != particle) { SetupParticle(p); }
125 if(kinEnergy < lowEnergyLimit) { return cross; }
126 if(nullptr == CurrentCouple()) {
127 G4Exception("G4WentzelVIRelModel::ComputeCrossSectionPerAtom", "em0011",
128 FatalException, " G4MaterialCutsCouple is not defined");
129 return cross;
130 }
132 G4int iz = G4lrint(Z);
133 G4double tmass = (1 == iz) ? CLHEP::proton_mass_c2
134 : fNistManager->GetAtomicMassAmu(iz)*amu_c2;
135 wokvi->SetTargetMass(tmass);
137 if(cosTetMaxNuc < 1.0) {
138 G4double cost = wokvi->SetupTarget(iz, cutEnergy);
140 /*
141 //if(p->GetParticleName() == "e-")
142 G4cout << "G4WentzelVIRelModel::CS: Z= " << G4int(Z)
143 << " e(MeV)= " << kinEnergy
144 << " 1-cosN= " << 1 - cosTetMaxNuc << " cross(bn)= " << cross/barn
145 << " " << particle->GetParticleName() << G4endl;
146 */
147 }
148 return cross;
149}
150
151//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
152
153void G4WentzelVIRelModel::ComputeEffectiveMass()
154{
155 const G4ProductionCutsTable* theCoupleTable =
157 std::size_t ncouples = (G4int)theCoupleTable->GetTableSize();
158 if(ncouples == effMass.size()) { return; }
159
160 G4AutoLock l(&theWVIRelMutex);
161 if(ncouples != effMass.size()) {
162 effMass.resize(ncouples, 0.0);
163 for(std::size_t i=0; i<ncouples; ++i) {
164 const G4Material* mat =
165 theCoupleTable->GetMaterialCutsCouple((G4int)i)->GetMaterial();
166 const G4ElementVector* elmVector = mat->GetElementVector();
167 std::size_t nelm = mat->GetNumberOfElements();
168 G4double sum = 0.0;
169 G4double norm= 0.0;
170 for(std::size_t j=0; j<nelm; ++j) {
171 G4int Z = (*elmVector)[j]->GetZasInt();
172 G4double mass = fNistManager->GetAtomicMassAmu(Z)*CLHEP::amu_c2;
173 G4int Z2 = Z*Z;
174 sum += mass*Z2;
175 norm += Z2;
176 }
177 effMass[i] = sum/norm;
178 }
179 }
180 l.unlock();
181}
182
183//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
std::vector< const G4Element * > G4ElementVector
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
#define G4MUTEX_INITIALIZER
std::mutex G4Mutex
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
const G4Material * GetMaterial() const
const G4ElementVector * GetElementVector() const
std::size_t GetNumberOfElements() const
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
static G4ProductionCutsTable * GetProductionCutsTable()
void SetCurrentCouple(const G4MaterialCutsCouple *)
const G4MaterialCutsCouple * CurrentCouple() const
G4double SetupTarget(G4int Z, G4double cut)
G4double ComputeTransportCrossSectionPerAtom(G4double CosThetaMax)
virtual G4double SetupKinematic(G4double kinEnergy, const G4Material *mat)
const G4MaterialCutsCouple * currentCouple
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
void SetWVICrossSection(G4WentzelOKandVIxSection *)
G4WentzelOKandVIxSection * GetWVICrossSection()
const G4ParticleDefinition * particle
const G4Material * currentMaterial
void SetupParticle(const G4ParticleDefinition *)
G4WentzelOKandVIxSection * wokvi
~G4WentzelVIRelModel() override
void DefineMaterial(const G4MaterialCutsCouple *cup)
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double KineticEnergy, G4double AtomicNumber, G4double AtomicWeight=0., G4double cut=DBL_MAX, G4double emax=DBL_MAX) override
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
int G4lrint(double ad)
Definition templates.hh:134