Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // 27 // 27 // 28 // 28 // 29 // History: 29 // History: 30 // ----------- 30 // ----------- 31 // 21 Apr 2009 ALF 1st implementation 31 // 21 Apr 2009 ALF 1st implementation 32 // 29 Apr 2009 ALF Updated Desing for Integ 32 // 29 Apr 2009 ALF Updated Desing for Integration 33 // 15 Mar 2011 ALF introduced the usage of 33 // 15 Mar 2011 ALF introduced the usage of G4AtomicShellEnumerator 34 // 20 Oct 2011 ALF updated to take into acc 34 // 20 Oct 2011 ALF updated to take into account ECPSSR Form Factor 35 // 09 Mar 2012 LP update methods 35 // 09 Mar 2012 LP update methods 36 // 09 Mar 2012 ALF update for M-shells Sim 36 // 09 Mar 2012 ALF update for M-shells Simulation 37 // 10 Nov 2021 S. Guatelli & S. Bakr Added 37 // 10 Nov 2021 S. Guatelli & S. Bakr Added ECPSSR form factor documented 38 // in Bakr et al, NIM B, vol. 4 38 // in Bakr et al, NIM B, vol. 436, pp:285-291, 2018 and 39 // called here ECPSSR_ANSTO 39 // called here ECPSSR_ANSTO 40 40 41 #include "globals.hh" 41 #include "globals.hh" 42 #include "G4teoCrossSection.hh" 42 #include "G4teoCrossSection.hh" 43 #include "G4Proton.hh" 43 #include "G4Proton.hh" 44 #include "G4ecpssrBaseKxsModel.hh" 44 #include "G4ecpssrBaseKxsModel.hh" 45 #include "G4ecpssrBaseLixsModel.hh" 45 #include "G4ecpssrBaseLixsModel.hh" 46 #include "G4ecpssrFormFactorKxsModel.hh" 46 #include "G4ecpssrFormFactorKxsModel.hh" 47 #include "G4ecpssrFormFactorLixsModel.hh" 47 #include "G4ecpssrFormFactorLixsModel.hh" 48 #include "G4ecpssrFormFactorMixsModel.hh" 48 #include "G4ecpssrFormFactorMixsModel.hh" 49 #include "G4ANSTOecpssrKxsModel.hh" 49 #include "G4ANSTOecpssrKxsModel.hh" 50 #include "G4ANSTOecpssrLixsModel.hh" 50 #include "G4ANSTOecpssrLixsModel.hh" 51 #include "G4ANSTOecpssrMixsModel.hh" 51 #include "G4ANSTOecpssrMixsModel.hh" 52 52 53 //....oooOO0OOooo........oooOO0OOooo........oo 53 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 54 G4teoCrossSection::G4teoCrossSection(const G4S 54 G4teoCrossSection::G4teoCrossSection(const G4String& nam) 55 :G4VhShellCrossSection(nam),totalCS(0.0) 55 :G4VhShellCrossSection(nam),totalCS(0.0) 56 { 56 { 57 ecpssrShellMi = nullptr; 57 ecpssrShellMi = nullptr; 58 if (nam == "ECPSSR_Analytical") 58 if (nam == "ECPSSR_Analytical") 59 { 59 { 60 ecpssrShellK = new G4ecpssrBaseKxsModel 60 ecpssrShellK = new G4ecpssrBaseKxsModel(); 61 ecpssrShellLi = new G4ecpssrBaseLixsMode 61 ecpssrShellLi = new G4ecpssrBaseLixsModel(); 62 } 62 } 63 else if (nam == "ECPSSR_FormFactor") 63 else if (nam == "ECPSSR_FormFactor") 64 { 64 { 65 ecpssrShellK = new G4ecpssrFormFactorKx 65 ecpssrShellK = new G4ecpssrFormFactorKxsModel(); 66 ecpssrShellLi = new G4ecpssrFormFactorLi 66 ecpssrShellLi = new G4ecpssrFormFactorLixsModel(); 67 ecpssrShellMi = new G4ecpssrFormFactorMi 67 ecpssrShellMi = new G4ecpssrFormFactorMixsModel(); 68 } 68 } 69 else if (nam == "ECPSSR_ANSTO") 69 else if (nam == "ECPSSR_ANSTO") 70 { 70 { 71 ecpssrShellK = new G4ANSTOecpssrKxsMode 71 ecpssrShellK = new G4ANSTOecpssrKxsModel(); 72 ecpssrShellLi = new G4ANSTOecpssrLixsMod 72 ecpssrShellLi = new G4ANSTOecpssrLixsModel(); 73 ecpssrShellMi = new G4ANSTOecpssrMixsMod 73 ecpssrShellMi = new G4ANSTOecpssrMixsModel(); 74 } 74 } 75 else 75 else 76 { 76 { 77 G4cout << "G4teoCrossSection::G4teoCross 77 G4cout << "G4teoCrossSection::G4teoCrossSection: ERROR " 78 << " in cross section name ECPSSR_Analy 78 << " in cross section name ECPSSR_Analytical is used" 79 << G4endl; 79 << G4endl; 80 ecpssrShellK = new G4ecpssrBaseKxsModel 80 ecpssrShellK = new G4ecpssrBaseKxsModel(); 81 ecpssrShellLi = new G4ecpssrBaseLixsMode 81 ecpssrShellLi = new G4ecpssrBaseLixsModel(); 82 } 82 } 83 } 83 } 84 84 85 //....oooOO0OOooo........oooOO0OOooo........oo 85 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 86 86 87 G4teoCrossSection::~G4teoCrossSection() 87 G4teoCrossSection::~G4teoCrossSection() 88 { 88 { 89 delete ecpssrShellK; 89 delete ecpssrShellK; 90 delete ecpssrShellLi; 90 delete ecpssrShellLi; 91 delete ecpssrShellMi; 91 delete ecpssrShellMi; 92 } 92 } 93 93 94 //....oooOO0OOooo........oooOO0OOooo........oo 94 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 95 95 96 std::vector<G4double> G4teoCrossSection::GetCr 96 std::vector<G4double> G4teoCrossSection::GetCrossSection(G4int Z, 97 G4double incidentEnergy, 97 G4double incidentEnergy, 98 G4double mass, 98 G4double mass, 99 G4double, 99 G4double, 100 const G4Material*) 100 const G4Material*) 101 { 101 { 102 std::vector<G4double> crossSections; 102 std::vector<G4double> crossSections; 103 103 104 crossSections.push_back( ecpssrShellK->Calcu 104 crossSections.push_back( ecpssrShellK->CalculateCrossSection(Z, mass, incidentEnergy) ); 105 105 106 crossSections.push_back( ecpssrShellLi->Calc 106 crossSections.push_back( ecpssrShellLi->CalculateL1CrossSection(Z, mass, incidentEnergy) ); 107 crossSections.push_back( ecpssrShellLi->Calc 107 crossSections.push_back( ecpssrShellLi->CalculateL2CrossSection(Z, mass, incidentEnergy) ); 108 crossSections.push_back( ecpssrShellLi->Calc 108 crossSections.push_back( ecpssrShellLi->CalculateL3CrossSection(Z, mass, incidentEnergy) ); 109 109 110 if (ecpssrShellMi) { 110 if (ecpssrShellMi) { 111 crossSections.push_back( ecpssrShellMi->Ca 111 crossSections.push_back( ecpssrShellMi->CalculateM1CrossSection(Z, mass, incidentEnergy) ); 112 crossSections.push_back( ecpssrShellMi->Ca 112 crossSections.push_back( ecpssrShellMi->CalculateM2CrossSection(Z, mass, incidentEnergy) ); 113 crossSections.push_back( ecpssrShellMi->Ca 113 crossSections.push_back( ecpssrShellMi->CalculateM3CrossSection(Z, mass, incidentEnergy) ); 114 crossSections.push_back( ecpssrShellMi->Ca 114 crossSections.push_back( ecpssrShellMi->CalculateM4CrossSection(Z, mass, incidentEnergy) ); 115 crossSections.push_back( ecpssrShellMi->Ca 115 crossSections.push_back( ecpssrShellMi->CalculateM5CrossSection(Z, mass, incidentEnergy) ); 116 } 116 } 117 return crossSections; 117 return crossSections; 118 } 118 } 119 119 120 //....oooOO0OOooo........oooOO0OOooo........oo 120 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 121 121 122 G4double G4teoCrossSection::CrossSection(G4int 122 G4double G4teoCrossSection::CrossSection(G4int Z, G4AtomicShellEnumerator shell, 123 G4double incidentEnergy, 123 G4double incidentEnergy, 124 G4double mass, 124 G4double mass, 125 const G4Material*) 125 const G4Material*) 126 { 126 { 127 G4double res = 0.0; 127 G4double res = 0.0; 128 if(shell > 3 && !ecpssrShellMi) { 128 if(shell > 3 && !ecpssrShellMi) { 129 return res; 129 return res; 130 } 130 } 131 else if(shell > 8) { 131 else if(shell > 8) { 132 return res; 132 return res; 133 } 133 } 134 else if(fKShell == shell) 134 else if(fKShell == shell) 135 { 135 { 136 res = ecpssrShellK->CalculateCrossSectio 136 res = ecpssrShellK->CalculateCrossSection(Z, mass, incidentEnergy); 137 } 137 } 138 else if(fL1Shell == shell) 138 else if(fL1Shell == shell) 139 { 139 { 140 res = ecpssrShellLi->CalculateL1CrossSec 140 res = ecpssrShellLi->CalculateL1CrossSection(Z, mass, incidentEnergy); 141 } 141 } 142 else if(fL2Shell == shell) 142 else if(fL2Shell == shell) 143 { 143 { 144 res = ecpssrShellLi->CalculateL2CrossSec 144 res = ecpssrShellLi->CalculateL2CrossSection(Z, mass, incidentEnergy); 145 } 145 } 146 else if(fL3Shell == shell) 146 else if(fL3Shell == shell) 147 { 147 { 148 res = ecpssrShellLi->CalculateL3CrossSec 148 res = ecpssrShellLi->CalculateL3CrossSection(Z, mass, incidentEnergy); 149 } 149 } 150 else if(fM1Shell == shell) 150 else if(fM1Shell == shell) 151 { 151 { 152 res = ecpssrShellMi->CalculateM1CrossSec 152 res = ecpssrShellMi->CalculateM1CrossSection(Z, mass, incidentEnergy); 153 } 153 } 154 else if(fM2Shell == shell) 154 else if(fM2Shell == shell) 155 { 155 { 156 res = ecpssrShellMi->CalculateM2CrossSec 156 res = ecpssrShellMi->CalculateM2CrossSection(Z, mass, incidentEnergy); 157 } 157 } 158 else if(fM3Shell == shell) 158 else if(fM3Shell == shell) 159 { 159 { 160 res = ecpssrShellMi->CalculateM3CrossSec 160 res = ecpssrShellMi->CalculateM3CrossSection(Z, mass, incidentEnergy); 161 } 161 } 162 else if(fM4Shell == shell) 162 else if(fM4Shell == shell) 163 { 163 { 164 res = ecpssrShellMi->CalculateM4CrossSec 164 res = ecpssrShellMi->CalculateM4CrossSection(Z, mass, incidentEnergy); 165 } 165 } 166 else if(fM5Shell == shell) 166 else if(fM5Shell == shell) 167 { 167 { 168 res = ecpssrShellMi->CalculateM5CrossSec 168 res = ecpssrShellMi->CalculateM5CrossSection(Z, mass, incidentEnergy); 169 } 169 } 170 return res; 170 return res; 171 } 171 } 172 172 173 //....oooOO0OOooo........oooOO0OOooo........oo 173 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 174 174 175 std::vector<G4double> G4teoCrossSection::Proba 175 std::vector<G4double> G4teoCrossSection::Probabilities(G4int Z, 176 G4double incidentEnergy, 176 G4double incidentEnergy, 177 G4double mass, 177 G4double mass, 178 G4double deltaEnergy, 178 G4double deltaEnergy, 179 const G4Material*) 179 const G4Material*) 180 { 180 { 181 std::vector<G4double> crossSections = 181 std::vector<G4double> crossSections = 182 GetCrossSection(Z, incidentEnergy, mass, d 182 GetCrossSection(Z, incidentEnergy, mass, deltaEnergy); 183 183 184 for (size_t i=0; i<crossSections.size(); ++i 184 for (size_t i=0; i<crossSections.size(); ++i ) { 185 if (totalCS) { 185 if (totalCS) { 186 crossSections[i] = crossSections[i]/tota 186 crossSections[i] = crossSections[i]/totalCS; 187 } 187 } 188 } 188 } 189 return crossSections; 189 return crossSections; 190 } 190 } 191 191 192 //....oooOO0OOooo........oooOO0OOooo........oo 192 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 193 193 194 void G4teoCrossSection::SetTotalCS(G4double va 194 void G4teoCrossSection::SetTotalCS(G4double val){ 195 totalCS = val; 195 totalCS = val; 196 } 196 } 197 197 198 198 199 199 200 200