Geant4  10.00.p02
G4empCrossSection.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 // $Id: G4empCrossSection.cc 66241 2012-12-13 18:34:42Z gunter $
27 //
28 //
29 //
30 // History:
31 // -----------
32 // 29 Apr 2009 ALF 1st implementation
33 // 15 Mar 2011 ALF introduced the usage of G4AtomicShellEnumerator
34 // 09 Mar 2012 LP updated methods
35 //
36 
37 
38 #include "globals.hh"
39 #include "G4empCrossSection.hh"
40 #include "G4Proton.hh"
41 
42 
44  :G4VhShellCrossSection(nam),totalCS(0.0)
45 {
46 
47  paulShellK = new G4PaulKxsModel();
49 
50 }
51 
53 {
54 
55  delete paulShellK;
56  delete orlicShellLi;
57 
58 }
59 
60 std::vector<G4double> G4empCrossSection::GetCrossSection(G4int Z,
61  G4double incidentEnergy,
62  G4double mass,
63  G4double,
64  const G4Material*)
65 {
66  std::vector<G4double> crossSections;
68 
69  crossSections.push_back( paulShellK->CalculateKCrossSection(Z, mass, incidentEnergy) );
70 
71  // this check should be done in the Orlic class, that can handle only protons;
72  // however this would lead up tp three checks of the mass, while here we have only one
73  // moreover, at the present time,this class handles explicitly Paul and Orlic models,
74  // so it can hadle the responsibility of this check too
75 
76  if (mass == aProton->GetPDGMass()) {
77  crossSections.push_back( orlicShellLi->CalculateL1CrossSection(Z, incidentEnergy) );
78  crossSections.push_back( orlicShellLi->CalculateL2CrossSection(Z, incidentEnergy) );
79  crossSections.push_back( orlicShellLi->CalculateL3CrossSection(Z, incidentEnergy) );
80  }
81 
82  else {
83  crossSections.push_back( 0. );
84  crossSections.push_back( 0. );
85  crossSections.push_back( 0. );
86  }
87  return crossSections;
88 
89 }
90 
92  G4double incidentEnergy,
93  G4double mass,
94  const G4Material*)
95 {
96 
97  //let's reproduce
98 
99  G4double res = 0.0;
101  if(fKShell == shell) {
102  res = paulShellK->CalculateKCrossSection(Z, mass, incidentEnergy);
103  }
104  // this check should be done in the Orlic class, that can handle only protons;
105  // however this would lead up tp three checks of the mass, while here we have only one
106  // moreover, at the present time,this class handles explicitly Paul and Orlic models,
107  // so it can hadle the responsibility of this check too
108 
109 
110  else if (mass == aProton->GetPDGMass()) {
111 
112  if(fL1Shell == shell) {
113  res = orlicShellLi->CalculateL1CrossSection(Z, incidentEnergy);
114  }
115  else if(fL2Shell == shell) {
116  res = orlicShellLi->CalculateL2CrossSection(Z, incidentEnergy);
117  }
118  else if(fL3Shell == shell) {
119  res = orlicShellLi->CalculateL3CrossSection(Z, incidentEnergy);
120  }
121  }
122  return res;
123 }
124 
125 std::vector<G4double> G4empCrossSection::Probabilities(G4int Z,
126  G4double incidentEnergy,
127  G4double mass,
128  G4double deltaEnergy,
129  const G4Material* mat)
130 {
131 
132  std::vector<G4double> crossSections = GetCrossSection(Z, incidentEnergy, mass, deltaEnergy,mat);
133 
134  for (size_t i=0; i<crossSections.size(); i++ ) {
135 
136  if (totalCS) {
137  crossSections[i] = crossSections[i]/totalCS;
138  }
139 
140  }
141 
142  return crossSections;
143 
144 }
145 
146 
148 
149  totalCS = val;
150 
151 }
152 
153 
154 
std::vector< G4double > GetCrossSection(G4int Z, G4double incidentEnergy, G4double mass, G4double deltaEnergy, const G4Material *mat)
G4double CalculateKCrossSection(G4int zTarget, G4double massIncident, G4double energyIncident)
G4OrlicLiXsModel * orlicShellLi
virtual ~G4empCrossSection()
int G4int
Definition: G4Types.hh:78
G4empCrossSection(const G4String &nam="")
static G4Proton * Proton()
Definition: G4Proton.cc:93
G4double CalculateL3CrossSection(G4int zTarget, G4double energyIncident)
G4double GetPDGMass() const
void SetTotalCS(G4double)
G4double CrossSection(G4int Z, G4AtomicShellEnumerator shell, G4double incidentEnergy, G4double mass, const G4Material *mat)
std::vector< G4double > Probabilities(G4int Z, G4double incidentEnergy, G4double mass, G4double deltaEnergy, const G4Material *mat)
G4PaulKxsModel * paulShellK
double G4double
Definition: G4Types.hh:76
G4double CalculateL2CrossSection(G4int zTarget, G4double energyIncident)
G4double CalculateL1CrossSection(G4int zTarget, G4double energyIncident)
G4AtomicShellEnumerator