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
G4CrossSectionHandler.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// $Id$
28//
29// Author: Maria Grazia Pia (Maria.Grazia.Pia@cern.ch)
30//
31// History:
32// -----------
33// 1 Aug 2001 MGP Created
34// 19 Jul 2002 VI Create composite data set for material
35// 24 Apr 2003 VI Cut per region mfpt
36//
37// 15 Jul 2009 Nicolas A. Karakatsanis
38//
39// - BuildCrossSectionForMaterials method was revised in order to calculate the
40// logarithmic values of the loaded data.
41// It retrieves the data values from the G4EMLOW data files but, then, calculates the
42// respective log values and loads them to seperate data structures.
43// The EM data sets, initialized this way, contain both non-log and log values.
44// These initialized data sets can enhance the computing performance of data interpolation
45// operations
46//
47// -------------------------------------------------------------------
48
51#include "G4VEMDataSet.hh"
52#include "G4EMDataSet.hh"
54#include "G4ShellEMDataSet.hh"
56#include "G4Material.hh"
57#include "G4Element.hh"
58#include "Randomize.hh"
59#include <map>
60#include <vector>
61
63
65{ }
66
68{ }
69
70std::vector<G4VEMDataSet*>*
72 const G4DataVector*)
73{
74 G4DataVector* energies;
75 G4DataVector* data;
76
77 G4DataVector* log_energies;
78 G4DataVector* log_data;
79
80 std::vector<G4VEMDataSet*>* matCrossSections = new std::vector<G4VEMDataSet*>;
81
82 const G4ProductionCutsTable* theCoupleTable=
84 size_t numOfCouples = theCoupleTable->GetTableSize();
85
86 size_t nOfBins = energyVector.size();
87 const G4VDataSetAlgorithm* interpolationAlgo = CreateInterpolation();
88
89 for (size_t mLocal=0; mLocal<numOfCouples; mLocal++)
90 {
91 const G4MaterialCutsCouple* couple = theCoupleTable->GetMaterialCutsCouple(mLocal);
92 const G4Material* material= couple->GetMaterial();
93 G4int nElements = material->GetNumberOfElements();
94 const G4ElementVector* elementVector = material->GetElementVector();
95 const G4double* nAtomsPerVolume = material->GetAtomicNumDensityVector();
96
97 G4VDataSetAlgorithm* algo = interpolationAlgo->Clone();
98
99 G4VEMDataSet* setForMat = new G4CompositeEMDataSet(algo,1.,1.);
100
101 for (G4int i=0; i<nElements; i++) {
102
103 G4int Z = (G4int) (*elementVector)[i]->GetZ();
104 G4double density = nAtomsPerVolume[i];
105
106 energies = new G4DataVector;
107 data = new G4DataVector;
108
109 log_energies = new G4DataVector;
110 log_data = new G4DataVector;
111
112
113 for (size_t bin=0; bin<nOfBins; bin++)
114 {
115 G4double e = energyVector[bin];
116 energies->push_back(e);
117 if (e==0.) e=1e-300;
118 log_energies->push_back(std::log10(e));
119 G4double cross = density*FindValue(Z,e);
120 data->push_back(cross);
121 if (cross==0.) cross=1e-300;
122 log_data->push_back(std::log10(cross));
123 }
124
125 G4VDataSetAlgorithm* algo1 = interpolationAlgo->Clone();
126
127// G4VEMDataSet* elSet = new G4EMDataSet(i,energies,data,algo1,1.,1.);
128
129 G4VEMDataSet* elSet = new G4EMDataSet(i,energies,data,log_energies,log_data,algo1,1.,1.);
130
131 setForMat->AddComponent(elSet);
132 }
133
134 matCrossSections->push_back(setForMat);
135 }
136 delete interpolationAlgo;
137 return matCrossSections;
138}
139
std::vector< G4Element * > G4ElementVector
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
virtual std::vector< G4VEMDataSet * > * BuildCrossSectionsForMaterials(const G4DataVector &energyVector, const G4DataVector *energyCuts=0)
const G4Material * GetMaterial() const
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:189
size_t GetNumberOfElements() const
Definition: G4Material.hh:185
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:215
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
static G4ProductionCutsTable * GetProductionCutsTable()
G4double FindValue(G4int Z, G4double e) const
virtual G4VDataSetAlgorithm * CreateInterpolation()
virtual G4VDataSetAlgorithm * Clone() const =0
virtual void AddComponent(G4VEMDataSet *dataSet)=0