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 // >> 27 >> 28 #include <complex> 26 29 27 #include "G4XTRRegularRadModel.hh" 30 #include "G4XTRRegularRadModel.hh" >> 31 #include "Randomize.hh" 28 32 29 #include "G4PhysicalConstants.hh" << 33 #include "G4Gamma.hh" >> 34 using namespace std; 30 35 31 ////////////////////////////////////////////// 36 //////////////////////////////////////////////////////////////////////////// >> 37 // 32 // Constructor, destructor 38 // Constructor, destructor 33 G4XTRRegularRadModel::G4XTRRegularRadModel(G4L << 39 34 G4M << 40 G4XTRRegularRadModel::G4XTRRegularRadModel(G4LogicalVolume *anEnvelope, 35 G4M << 41 G4Material* foilMat,G4Material* gasMat, 36 G4d << 42 G4double a, G4double b, G4int n, 37 con << 43 const G4String& processName) : 38 : G4VXTRenergyLoss(anEnvelope, foilMat, gasM << 44 G4VXTRenergyLoss(anEnvelope,foilMat,gasMat,a,b,n,processName) 39 { 45 { 40 G4cout << " XTR Regular discrete radiator mo << 46 G4cout<<" XTR Regular discrete radiator model is called"<<G4endl ; 41 47 42 fExitFlux = true; 48 fExitFlux = true; >> 49 >> 50 // Build energy and angular integral spectra of X-ray TR photons from >> 51 // a radiator >> 52 >> 53 // BuildTable() ; 43 } 54 } 44 55 45 ////////////////////////////////////////////// 56 /////////////////////////////////////////////////////////////////////////// 46 G4XTRRegularRadModel::~G4XTRRegularRadModel() << 47 57 48 ////////////////////////////////////////////// << 58 G4XTRRegularRadModel::~G4XTRRegularRadModel() 49 void G4XTRRegularRadModel::ProcessDescription( << 50 { 59 { 51 out << "Describes X-ray transition radiation << 60 ; 52 "plates\n" << 53 "fixed.\n"; << 54 } 61 } 55 62 56 ////////////////////////////////////////////// << 57 G4double G4XTRRegularRadModel::SpectralXTRdEdx << 58 { << 59 static constexpr G4double cofPHC = 4. * pi * << 60 G4double result, sum = 0., tmp, cof1, cof2, << 61 G4double aMa, bMb, sigma, dump; << 62 G4int k, kMax, kMin; << 63 << 64 aMa = fPlateThick * GetPlateLinearPhotoAbs << 65 bMb = fGasThick * GetGasLinearPhotoAbs(ene << 66 sigma = 0.5 * (aMa + bMb); << 67 dump = std::exp(-fPlateNumber * sigma); << 68 if(verboseLevel > 2) << 69 G4cout << " dump = " << dump << G4endl; << 70 tmp = (fSigma1 - fSigma2) / cofPHC / energy << 71 cof1 = fPlateThick * tmp; << 72 cof2 = fGasThick * tmp; << 73 << 74 cofMin = energy * (fPlateThick + fGasThick) << 75 cofMin += (fPlateThick * fSigma1 + fGasThick << 76 cofMin /= cofPHC; << 77 << 78 theta2 = cofPHC / (energy * (fPlateThick + f << 79 << 80 kMin = G4int(cofMin); << 81 if(cofMin > kMin) << 82 kMin++; << 83 << 84 kMax = kMin + 49; << 85 << 86 if(verboseLevel > 2) << 87 { << 88 G4cout << cof1 << " " << cof2 << " << 89 G4cout << "kMin = " << kMin << "; kMax << 90 } << 91 for(k = kMin; k <= kMax; ++k) << 92 { << 93 tmp = pi * fPlateThick * (k + cof2) / ( << 94 result = (k - cof1) * (k - cof1) * (k + co << 95 if(k == kMin && kMin == G4int(cofMin)) << 96 { << 97 sum += << 98 0.5 * std::sin(tmp) * std::sin(tmp) * << 99 } << 100 else << 101 { << 102 sum += std::sin(tmp) * std::sin(tmp) * s << 103 } << 104 theta2k = std::sqrt(theta2 * std::abs(k - << 105 << 106 if(verboseLevel > 2) << 107 { << 108 G4cout << k << " " << theta2k << " << 109 << std::sin(tmp) * std::sin(tmp) << 110 << " " << sum << G4endl; << 111 } << 112 } << 113 result = 2 * (cof1 + cof2) * (cof1 + cof2) * << 114 result *= dump * (-1 + dump + 2 * fPlateNumb << 115 63 116 return result; << 117 } << 118 64 119 ////////////////////////////////////////////// 65 /////////////////////////////////////////////////////////////////////////// >> 66 // 120 // Approximation for radiator interference fac 67 // Approximation for radiator interference factor for the case of 121 // fully Regular radiator. The plate and gas g << 68 // fully Regular radiator. The plate and gas gap thicknesses are fixed . 122 // The mean values of the plate and gas gap th << 69 // The mean values of the plate and gas gap thicknesses 123 // are supposed to be about XTR formation zone << 70 // are supposed to be about XTR formation zones but much less than 124 // mean absorption length of XTR photons in co << 71 // mean absorption length of XTR photons in coresponding material. 125 G4double G4XTRRegularRadModel::GetStackFactor( << 72 126 << 73 G4double >> 74 G4XTRRegularRadModel::GetStackFactor( G4double energy, >> 75 G4double gamma, G4double varAngle ) 127 { 76 { 128 G4double aZa = fPlateThick / GetPlateFormati << 77 G4double result, Qa, Qb, Q, aZa, bZb, aMa, bMb, I2 ; 129 G4double bZb = fGasThick / GetGasFormationZo << 78 >> 79 aZa = fPlateThick/GetPlateFormationZone(energy,gamma,varAngle) ; >> 80 bZb = fGasThick/GetGasFormationZone(energy,gamma,varAngle) ; >> 81 >> 82 aMa = fPlateThick*GetPlateLinearPhotoAbs(energy) ; >> 83 bMb = fGasThick*GetGasLinearPhotoAbs(energy) ; >> 84 >> 85 Qa = std::exp(-aMa) ; >> 86 Qb = std::exp(-bMb) ; >> 87 Q = Qa*Qb ; >> 88 >> 89 // G4complex Ca(1.0+0.5*fPlateThick*Ma,fPlateThick/Za) ; >> 90 // G4complex Cb(1.0+0.5*fGasThick*Mb,fGasThick/Zb) ; >> 91 >> 92 G4complex Ha( std::exp(-0.5*aMa)*std::cos(aZa), >> 93 -std::exp(-0.5*aMa)*std::sin(aZa) ) ; >> 94 >> 95 G4complex Hb( std::exp(-0.5*bMb)*std::cos(bZb), >> 96 -std::exp(-0.5*bMb)*std::sin(bZb) ) ; >> 97 >> 98 G4complex H = Ha*Hb ; 130 99 131 G4double aMa = fPlateThick * GetPlateLinearP << 100 G4complex Hs = std::conj(H) ; 132 G4double bMb = fGasThick * GetGasLinearPhoto << 133 101 134 G4double Qa = std::exp(-aMa); << 102 // G4complex F1 = ( 0.5*(1+Qa)*(1+H) - Ha - Qa*Hb )/(1-H) ; 135 G4double Qb = std::exp(-bMb); << 136 G4double Q = Qa * Qb; << 137 103 138 G4complex Ha(std::exp(-0.5 * aMa) * std::cos << 104 G4complex F2 = (1.0-Ha)*(Qa-Ha)*Hb*(1.0-Hs)*(Q-Hs) ; 139 -std::exp(-0.5 * aMa) * std::si << 140 105 141 G4complex Hb(std::exp(-0.5 * bMb) * std::cos << 106 F2 *= std::pow(Q,G4double(fPlateNumber)) - std::pow(H,fPlateNumber) ; 142 -std::exp(-0.5 * bMb) * std::si << 143 107 144 G4complex H = Ha * Hb; << 108 result = ( 1 - std::pow(Q,G4double(fPlateNumber)) )/( 1 - Q ) ; 145 G4complex Hs = std::conj(H); << 146 109 147 G4complex F2 = (1.0 - Ha) * (Qa - Ha) * Hb * << 110 result *= (1 - Qa)*(1 + Qa - 2*std::sqrt(Qa)*std::cos(aZa)) ; 148 F2 *= std::pow(Q, G4double(fPlateNumber)) - << 149 111 150 G4double result = (1. - std::pow(Q, G4double << 112 result /= (1 - std::sqrt(Q))*(1 - std::sqrt(Q)) + 151 result *= (1. - Qa) * (1. + Qa - 2. * std::s << 113 4*std::sqrt(Q)*std::sin(0.5*(aZa+bZb))*std::sin(0.5*(aZa+bZb)) ; 152 result /= (1. - std::sqrt(Q)) * (1. - std::s << 153 4. * std::sqrt(Q) * std::sin(0.5 * << 154 std::sin(0.5 * (aZa + bZb)); << 155 114 156 G4double I2 = 1.; << 115 I2 = 1.; // 2.0*std::real(F2) ; 157 I2 /= (1. - std::sqrt(Q)) * (1. - std::sqrt( << 158 4. * std::sqrt(Q) * std::sin(0.5 * (aZ << 159 std::sin(0.5 * (aZa + bZb)); << 160 116 161 I2 /= Q * ((std::sqrt(Q) - std::cos(aZa + bZ << 117 I2 /= (1 - std::sqrt(Q))*(1 - std::sqrt(Q)) + 162 (std::sqrt(Q) - std::cos(aZa + << 118 4*std::sqrt(Q)*std::sin(0.5*(aZa+bZb))*std::sin(0.5*(aZa+bZb)) ; 163 std::sin(aZa + bZb) * std::sin(aZ << 164 119 165 G4complex stack = 2. * I2 * F2; << 120 I2 /= Q*( (std::sqrt(Q)-std::cos(aZa+bZb))*(std::sqrt(Q)-std::cos(aZa+bZb)) + 166 stack += result; << 121 std::sin(aZa+bZb)*std::sin(aZa+bZb) ) ; 167 stack *= OneInterfaceXTRdEdx(energy, gamma, << 168 122 169 return std::real(stack); << 123 G4complex stack = 2.*I2*F2; >> 124 stack += result; >> 125 stack *= OneInterfaceXTRdEdx(energy,gamma,varAngle); >> 126 >> 127 // result += I2 ; >> 128 result = std::real(stack); >> 129 >> 130 return result ; 170 } 131 } >> 132 >> 133 >> 134 // >> 135 // >> 136 //////////////////////////////////////////////////////////////////////////// >> 137 >> 138 >> 139 >> 140 >> 141 >> 142 >> 143 >> 144 171 145