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 #include <iostream> 28 #include <iostream> 29 29 30 #include "G4SystemOfUnits.hh" 30 #include "G4SystemOfUnits.hh" 31 #include "G4PhysicalConstants.hh" 31 #include "G4PhysicalConstants.hh" 32 #include "G4HadTmpUtil.hh" 32 #include "G4HadTmpUtil.hh" 33 #include "G4ElNucleusSFcs.hh" 33 #include "G4ElNucleusSFcs.hh" 34 #include "G4ElectroNuclearCrossSection.hh" 34 #include "G4ElectroNuclearCrossSection.hh" 35 35 36 // factory 36 // factory 37 #include "G4CrossSectionFactory.hh" 37 #include "G4CrossSectionFactory.hh" 38 // 38 // 39 G4_DECLARE_XS_FACTORY(G4ElNucleusSFcs); 39 G4_DECLARE_XS_FACTORY(G4ElNucleusSFcs); 40 40 41 41 42 G4ElNucleusSFcs::G4ElNucleusSFcs():G4VCrossSec 42 G4ElNucleusSFcs::G4ElNucleusSFcs():G4VCrossSectionDataSet(Default_Name()) 43 { 43 { 44 fCHIPScs = new G4ElectroNuclearCrossSection( 44 fCHIPScs = new G4ElectroNuclearCrossSection(); 45 } 45 } 46 46 47 G4ElNucleusSFcs::~G4ElNucleusSFcs() 47 G4ElNucleusSFcs::~G4ElNucleusSFcs() 48 { 48 { 49 if( fCHIPScs != nullptr ) delete fCHIPScs; 49 if( fCHIPScs != nullptr ) delete fCHIPScs; 50 } 50 } 51 51 52 void 52 void 53 G4ElNucleusSFcs::CrossSectionDescription( std: 53 G4ElNucleusSFcs::CrossSectionDescription( std::ostream& outFile) const 54 { 54 { 55 outFile << "G4ElNucleusSFcs provides the i 55 outFile << "G4ElNucleusSFcs provides the inelastic\n" 56 << "cross section for e- and e+ interactio 56 << "cross section for e- and e+ interactions with nuclei according to the structure function approach." 57 << "all energies.\n"; 57 << "all energies.\n"; 58 } 58 } 59 59 60 G4bool G4ElNucleusSFcs::IsElementApplicable( c 60 G4bool G4ElNucleusSFcs::IsElementApplicable( const G4DynamicParticle* aPart, G4int Z, const G4Material*) 61 { 61 { 62 62 63 G4double eKin = aPart->GetKineticEnergy(); 63 G4double eKin = aPart->GetKineticEnergy(); 64 G4double thTkin = ThresholdEnergy(); 64 G4double thTkin = ThresholdEnergy(); 65 65 66 return ( Z > 0 && Z < 120 && eKin > thTkin ) 66 return ( Z > 0 && Z < 120 && eKin > thTkin ); 67 } 67 } 68 68 69 69 70 G4double G4ElNucleusSFcs::GetIsoCrossSection( 70 G4double G4ElNucleusSFcs::GetIsoCrossSection( const G4DynamicParticle* aPart, G4int ZZ, G4int AA, const G4Isotope* , 71 const G4Element* 71 const G4Element* , const G4Material* ) 72 { 72 { 73 G4double xsc(0.), ratio(1.); 73 G4double xsc(0.), ratio(1.); 74 74 75 xsc = fCHIPScs->GetElementCrossSection( aPar 75 xsc = fCHIPScs->GetElementCrossSection( aPart, ZZ, nullptr ); //, const G4Material*); 76 76 77 ratio = GetRatio(ZZ,AA); 77 ratio = GetRatio(ZZ,AA); 78 78 79 if( ratio > 0. ) xsc /= ratio; 79 if( ratio > 0. ) xsc /= ratio; 80 80 81 return xsc; 81 return xsc; 82 } 82 } 83 83 84 ////////////////////////////////////////////// 84 ///////////////////////////////////////////////////////////////////////// 85 // 85 // 86 // Calculate ratio CHIPS-CS/SF-CS, averaged be 86 // Calculate ratio CHIPS-CS/SF-CS, averaged between 200 MeV and 100 GeV 87 87 88 G4double G4ElNucleusSFcs::GetRatio( G4int Z, G 88 G4double G4ElNucleusSFcs::GetRatio( G4int Z, G4int A ) 89 { 89 { 90 G4double ratio(1.); 90 G4double ratio(1.); 91 91 92 if ( Z == 1 && A == 1 ) return 1.51 92 if ( Z == 1 && A == 1 ) return 1.51; 93 else if ( Z == 1 && A == 2 ) return 0.33 93 else if ( Z == 1 && A == 2 ) return 0.33; 94 else if ( Z == 1 && A == 3 ) return 0.27 94 else if ( Z == 1 && A == 3 ) return 0.27; 95 else if ( Z == 2 && A == 4 ) return 1.81 95 else if ( Z == 2 && A == 4 ) return 1.81; 96 else if ( Z == 6 && A == 12 ) return 2.26 96 else if ( Z == 6 && A == 12 ) return 2.26; 97 else if ( Z == 7 && A == 14 ) return 2.47 97 else if ( Z == 7 && A == 14 ) return 2.47; 98 else if ( Z == 8 && A == 16 ) return 2.61 98 else if ( Z == 8 && A == 16 ) return 2.61; 99 else if ( Z == 13 && A == 27 ) return 2.57 99 else if ( Z == 13 && A == 27 ) return 2.57; 100 else if ( Z == 14 && A == 28 ) return 2.49 100 else if ( Z == 14 && A == 28 ) return 2.49; 101 else if ( Z == 18 && A == 40 ) return 2.72 101 else if ( Z == 18 && A == 40 ) return 2.72; 102 else if ( Z == 22 && A == 48 ) return 2.71 102 else if ( Z == 22 && A == 48 ) return 2.71; 103 else if ( Z == 26 && A == 56 ) return 2.79 103 else if ( Z == 26 && A == 56 ) return 2.79; 104 else if ( Z == 29 && A == 64 ) return 2.78 104 else if ( Z == 29 && A == 64 ) return 2.78; 105 else if ( Z == 32 && A == 73 ) return 2.87 105 else if ( Z == 32 && A == 73 ) return 2.87; 106 else if ( Z == 42 && A == 96 ) return 3.02 106 else if ( Z == 42 && A == 96 ) return 3.02; 107 else if ( Z == 46 && A == 106 ) return 3.02 107 else if ( Z == 46 && A == 106 ) return 3.02; 108 else if ( Z == 47 && A == 108 ) return 2.99 108 else if ( Z == 47 && A == 108 ) return 2.99; 109 else if ( Z == 48 && A == 112 ) return 3.00 109 else if ( Z == 48 && A == 112 ) return 3.00; 110 else if ( Z == 74 && A == 184 ) return 3.44 110 else if ( Z == 74 && A == 184 ) return 3.44; 111 else if ( Z == 79 && A == 200 ) return 3.49 111 else if ( Z == 79 && A == 200 ) return 3.49; 112 else if ( Z == 82 && A == 207 ) return 3.48 112 else if ( Z == 82 && A == 207 ) return 3.48; 113 else if ( Z == 92 && A == 238 ) return 3.88 113 else if ( Z == 92 && A == 238 ) return 3.88; 114 else 114 else 115 { 115 { 116 G4int it(0), iMax(19); 116 G4int it(0), iMax(19); 117 G4double zz = G4double(Z); 117 G4double zz = G4double(Z); 118 118 119 for ( it = 0; it < iMax; ++it ) if ( zz <= 119 for ( it = 0; it < iMax; ++it ) if ( zz <= fZZ[it] ) break; 120 120 121 if ( it == 0 ) return fRR[0]; 121 if ( it == 0 ) return fRR[0]; 122 else if( it == iMax ) return fRR[iMax-1]; 122 else if( it == iMax ) return fRR[iMax-1]; 123 else 123 else 124 { 124 { 125 G4double x1 = fZZ[it-1]; 125 G4double x1 = fZZ[it-1]; 126 G4double x2 = fZZ[it]; 126 G4double x2 = fZZ[it]; 127 G4double y1 = fRR[it-1]; 127 G4double y1 = fRR[it-1]; 128 G4double y2 = fRR[it]; 128 G4double y2 = fRR[it]; 129 129 130 if( x1 >= x2 ) return fRR[it]; 130 if( x1 >= x2 ) return fRR[it]; 131 else 131 else 132 { 132 { 133 G4double angle = (y2-y1)/(x2-x1); 133 G4double angle = (y2-y1)/(x2-x1); 134 ratio = y1 + ( zz - x1 )*angle; 134 ratio = y1 + ( zz - x1 )*angle; 135 } 135 } 136 } 136 } 137 } 137 } 138 return ratio; 138 return ratio; 139 } 139 } 140 140 141 ///////////////////////////////////////// 141 ///////////////////////////////////////// 142 142 143 G4double G4ElNucleusSFcs::ThresholdEnergy() 143 G4double G4ElNucleusSFcs::ThresholdEnergy() 144 { 144 { 145 G4double thTkin = 134.9766*CLHEP::MeV; // Pi 145 G4double thTkin = 134.9766*CLHEP::MeV; // Pi0 threshold for the nucleon 146 146 147 thTkin *= 1.3; // nucleon motion 147 thTkin *= 1.3; // nucleon motion 148 148 149 return thTkin; 149 return thTkin; 150 } 150 } 151 151 152 ///////////////////////////////////////// 152 ///////////////////////////////////////// 153 153 154 const G4double G4ElNucleusSFcs::fZZ[19] = 154 const G4double G4ElNucleusSFcs::fZZ[19] = 155 { 155 { 156 2., 6., 7., 8., 13., 14., 18., 22., 26., 2 156 2., 6., 7., 8., 13., 14., 18., 22., 26., 29., 157 32., 42., 46., 47., 48., 74., 79., 82., 92 157 32., 42., 46., 47., 48., 74., 79., 82., 92. 158 }; 158 }; 159 159 160 ///////////////////////////////////////// 160 ///////////////////////////////////////// 161 161 162 const G4double G4ElNucleusSFcs::fRR[19] = 162 const G4double G4ElNucleusSFcs::fRR[19] = 163 { 163 { 164 1.81, 2.26, 2.47, 2.61, 2.57, 2.49, 2.72, 164 1.81, 2.26, 2.47, 2.61, 2.57, 2.49, 2.72, 2.71, 2.79, 2.78, 165 2.87, 3.02, 3.02, 2.99, 3., 3.44, 3.49, 3. 165 2.87, 3.02, 3.02, 2.99, 3., 3.44, 3.49, 3.48, 2.88 166 }; 166 }; 167 167