Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ElementSelector.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// File: G4ElementSelector
28//
29// Author: V.Ivanchenko (Vladimir.Ivanchenko@cern.ch)
30//
31// Creation date: 2 April 2000
32//
33// Modifications:
34// 18/08/2000 V.Ivanchenko Update description
35// 17/05/2006 V.Ivanchenko Cleanup
36// 02/10/2007 V.Ivanchenko Fixed typo in computation of Lambda-factor
37// proposed by Victor Pec
38//
39//---------------------------------------------------------------------
40
41#include "G4ElementSelector.hh"
42#include "Randomize.hh"
43#include "G4Material.hh"
44#include "G4Nucleus.hh"
45
46//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
47
49{}
50
51//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
52
54{}
55
56//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
57
58const G4Element*
60{
61 // Fermi-Teller Z-low of mu- capture and exceptions
62 // for halogens and oxigen.
63 // N.C.Mukhopadhyay Phys. Rep. 30 (1977) 1.
64
65 std::size_t i = 0;
66 const G4Material* mat = track.GetMaterial();
67 std::size_t numberOfElements = mat->GetNumberOfElements();
68 const G4ElementVector* theElementVector = mat->GetElementVector();
69
70 if(1 < numberOfElements) {
71 if(numberOfElements > prob.size()) { prob.resize(numberOfElements, 0.0); }
72
73 const G4double* theAtomNumDensity = mat->GetAtomicNumDensityVector();
74
75 G4double sum = 0.0;
76 for (i=0; i < numberOfElements; ++i) {
77
78 G4int Z = (*theElementVector)[i]->GetZasInt();
79
80 // Halogens
81 if( (9 == Z) || (17 == Z) || (35 == Z) || (53 == Z) || (85 == Z) ) {
82 sum += 0.66 * Z * theAtomNumDensity[i];
83
84 // Oxigen
85 } else if( 8 == Z ) {
86 sum += 0.56 * Z * theAtomNumDensity[i];
87
88 // Others
89 } else {
90 sum += Z * theAtomNumDensity[i];
91 }
92 prob[i] = sum;
93 }
94
95 sum *= G4UniformRand();
96 for (i=0; i < numberOfElements; ++i) {
97 if(sum <= prob[i]) { break; }
98 }
99 }
100
101 const G4Element* elm = (*theElementVector)[i];
102 G4int Z = elm->GetZasInt();
103
104 // select isotope
105 const G4IsotopeVector* isv = elm->GetIsotopeVector();
106 std::size_t ni = isv->size();
107 i = 0;
108
109 if(1 < ni) {
110
111 const G4double* ab = elm->GetRelativeAbundanceVector();
113 for(i=0; i<ni; ++i) {
114 y -= ab[i];
115 if(y <= 0.0) { break; }
116 }
117 }
118
119 G4int A = elm->GetIsotope((G4int)i)->GetN();
120 target->SetParameters(A, Z);
121
122 return elm;
123}
std::vector< const G4Element * > G4ElementVector
std::vector< G4Isotope * > G4IsotopeVector
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
#define G4UniformRand()
Definition: Randomize.hh:52
virtual ~G4ElementSelector()
virtual const G4Element * SelectZandA(const G4Track &track, G4Nucleus *)
G4double * GetRelativeAbundanceVector() const
Definition: G4Element.hh:167
const G4Isotope * GetIsotope(G4int iso) const
Definition: G4Element.hh:170
G4int GetZasInt() const
Definition: G4Element.hh:132
G4IsotopeVector * GetIsotopeVector() const
Definition: G4Element.hh:163
G4int GetN() const
Definition: G4Isotope.hh:93
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:185
size_t GetNumberOfElements() const
Definition: G4Material.hh:181
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:211
void SetParameters(const G4double A, const G4double Z, const G4int numberOfLambdas=0)
Definition: G4Nucleus.cc:307
G4Material * GetMaterial() const