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