Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // >> 23 // >> 24 // $Id: G4RegularXTRadiator.cc,v 1.2 2002/01/18 17:26:21 grichine Exp $ >> 25 // GEANT4 tag $Name: geant4-05-00 $ >> 26 // >> 27 >> 28 #include "g4std/complex" 26 29 27 #include "G4RegularXTRadiator.hh" 30 #include "G4RegularXTRadiator.hh" >> 31 #include "Randomize.hh" 28 32 29 #include "G4Gamma.hh" 33 #include "G4Gamma.hh" 30 #include "G4PhysicalConstants.hh" << 31 34 32 ////////////////////////////////////////////// 35 //////////////////////////////////////////////////////////////////////////// >> 36 // 33 // Constructor, destructor 37 // Constructor, destructor 34 G4RegularXTRadiator::G4RegularXTRadiator(G4Log << 38 35 G4Mat << 39 G4RegularXTRadiator::G4RegularXTRadiator(G4LogicalVolume *anEnvelope, 36 G4Mat << 40 G4Material* foilMat,G4Material* gasMat, 37 G4dou << 41 G4double a, G4double b, G4int n, 38 const << 42 const G4String& processName) : 39 : G4VXTRenergyLoss(anEnvelope, foilMat, gasM << 43 G4VXTRenergyLoss(anEnvelope,foilMat,gasMat,a,b,n,processName) 40 { 44 { 41 G4cout << "Regular X-ray TR radiator EM proc << 45 G4cout<<"Regular X-ray TR radiator EM process is called"<<G4endl ; 42 46 43 // Build energy and angular integral spectra 47 // Build energy and angular integral spectra of X-ray TR photons from 44 // a radiator 48 // a radiator 45 49 46 fAlphaPlate = 10000; << 50 BuildTable() ; 47 fAlphaGas = 1000; << 48 G4cout << "fAlphaPlate = " << fAlphaPlate << << 49 << G4endl; << 50 } 51 } 51 52 52 ////////////////////////////////////////////// 53 /////////////////////////////////////////////////////////////////////////// 53 G4RegularXTRadiator::~G4RegularXTRadiator() = << 54 54 55 void G4RegularXTRadiator::ProcessDescription(s << 55 G4RegularXTRadiator::~G4RegularXTRadiator() 56 { 56 { 57 out << "Simulation of X-ray transition radia << 57 ; 58 "relativistic charged particles cross << 59 "two materials. Thicknesses of plates << 60 } 58 } 61 59 62 ////////////////////////////////////////////// << 63 G4double G4RegularXTRadiator::SpectralXTRdEdx( << 64 { << 65 G4double result, sum = 0., tmp, cof1, cof2, << 66 G4double aMa, bMb, sigma, dump; << 67 G4int k, kMax, kMin; << 68 << 69 aMa = fPlateThick * GetPlateLinearPhotoAbs << 70 bMb = fGasThick * GetGasLinearPhotoAbs(ene << 71 sigma = 0.5 * (aMa + bMb); << 72 dump = std::exp(-fPlateNumber * sigma); << 73 if(verboseLevel > 2) << 74 G4cout << " dump = " << dump << G4endl; << 75 cofPHC = 4 * pi * hbarc; << 76 tmp = (fSigma1 - fSigma2) / cofPHC / ener << 77 cof1 = fPlateThick * tmp; << 78 cof2 = fGasThick * tmp; << 79 << 80 cofMin = energy * (fPlateThick + fGasThick) << 81 cofMin += (fPlateThick * fSigma1 + fGasThick << 82 cofMin /= cofPHC; << 83 << 84 theta2 = cofPHC / (energy * (fPlateThick + f << 85 << 86 kMin = G4int(cofMin); << 87 if(cofMin > kMin) << 88 kMin++; << 89 << 90 kMax = kMin + 49; << 91 << 92 if(verboseLevel > 2) << 93 { << 94 G4cout << cof1 << " " << cof2 << " << 95 G4cout << "kMin = " << kMin << "; kMax << 96 } << 97 for(k = kMin; k <= kMax; ++k) << 98 { << 99 tmp = pi * fPlateThick * (k + cof2) / ( << 100 result = (k - cof1) * (k - cof1) * (k + co << 101 if(k == kMin && kMin == G4int(cofMin)) << 102 { << 103 sum += << 104 0.5 * std::sin(tmp) * std::sin(tmp) * << 105 } << 106 else << 107 { << 108 sum += std::sin(tmp) * std::sin(tmp) * s << 109 } << 110 theta2k = std::sqrt(theta2 * std::abs(k - << 111 << 112 if(verboseLevel > 2) << 113 { << 114 G4cout << k << " " << theta2k << " << 115 << std::sin(tmp) * std::sin(tmp) << 116 << " " << sum << G4endl; << 117 } << 118 } << 119 result = 2 * (cof1 + cof2) * (cof1 + cof2) * << 120 result *= (1 - dump + 2 * dump * fPlateNumbe << 121 60 122 return result; << 123 } << 124 61 125 ////////////////////////////////////////////// 62 /////////////////////////////////////////////////////////////////////////// >> 63 // 126 // Approximation for radiator interference fac 64 // Approximation for radiator interference factor for the case of 127 // fully Regular radiator. The plate and gas g << 65 // fully Regular radiator. The plate and gas gap thicknesses are fixed . 128 // The mean values of the plate and gas gap th << 66 // The mean values of the plate and gas gap thicknesses 129 // are supposed to be about XTR formation zone << 67 // are supposed to be about XTR formation zones but much less than 130 // mean absorption length of XTR photons in co << 68 // mean absorption length of XTR photons in coresponding material. 131 << 69 132 G4double G4RegularXTRadiator::GetStackFactor(G << 70 G4double 133 G << 71 G4RegularXTRadiator::GetStackFactor( G4double energy, >> 72 G4double gamma, G4double varAngle ) 134 { 73 { 135 // some gamma (10000/1000) like algorithm << 74 G4double result, Qa, Qb, Q, aZa, bZb, aMa, bMb, D ; >> 75 >> 76 aZa = fPlateThick/GetPlateFormationZone(energy,gamma,varAngle) ; >> 77 bZb = fGasThick/GetGasFormationZone(energy,gamma,varAngle) ; 136 78 137 G4double result, Za, Zb, Ma, Mb; << 79 aMa = fPlateThick*GetPlateLinearPhotoAbs(energy) ; >> 80 bMb = fGasThick*GetGasLinearPhotoAbs(energy) ; 138 81 139 Za = GetPlateFormationZone(energy, gamma, va << 82 Qa = exp(-aMa) ; 140 Zb = GetGasFormationZone(energy, gamma, varA << 83 Qb = exp(-bMb) ; >> 84 Q = Qa*Qb ; 141 85 142 Ma = GetPlateLinearPhotoAbs(energy); << 86 G4complex Ha( exp(-0.5*aMa)*cos(aZa), 143 Mb = GetGasLinearPhotoAbs(energy); << 87 -exp(-0.5*aMa)*sin(aZa) ) ; >> 88 >> 89 G4complex Hb( exp(-0.5*bMb)*cos(bZb), >> 90 -exp(-0.5*bMb)*sin(bZb) ) ; 144 91 145 G4complex Ca(1.0 + 0.5 * fPlateThick * Ma / << 92 G4complex H = Ha*Hb ; 146 fPlateThick / Za / fAlphaPlate) << 147 G4complex Cb(1.0 + 0.5 * fGasThick * Mb / fA << 148 fGasThick / Zb / fAlphaGas); << 149 93 150 G4complex Ha = std::pow(Ca, -fAlphaPlate); << 94 G4complex Hs = G4std::conj(H) ; 151 G4complex Hb = std::pow(Cb, -fAlphaGas); << 152 G4complex H = Ha * Hb; << 153 95 154 G4complex F1 = (1.0 - Ha) * (1.0 - Hb) / (1. << 96 D = 1.0 /( (1 - sqrt(Q))*(1 - sqrt(Q)) + >> 97 4*sqrt(Q)*sin(0.5*(aZa+bZb))*sin(0.5*(aZa+bZb)) ) ; 155 98 156 G4complex F2 = (1.0 - Ha) * (1.0 - Ha) * Hb << 99 G4complex F1 = (1.0 - Ha)*(1.0 - Hb)*(1.0 - Hs) 157 (1.0 - std::pow(H, fPlateNumb << 100 * G4double(fPlateNumber)*D ; 158 101 159 G4complex R = (F1 + F2) * OneInterfaceXTRdEd << 102 G4complex F2 = (1.0-Ha)*(1.0-Ha)*Hb*(1.0-Hs)*(1.0-Hs) >> 103 * (1.0 - G4std::pow(H,fPlateNumber)) * D*D ; 160 104 161 result = 2.0 * std::real(R); << 105 G4complex R = (F1 + F2)*OneInterfaceXTRdEdx(energy,gamma,varAngle) ; 162 106 163 return result; << 107 result = 2.0*G4std::real(R) ; >> 108 >> 109 return result ; 164 } 110 } >> 111 >> 112 >> 113 // >> 114 // >> 115 //////////////////////////////////////////////////////////////////////////// >> 116 >> 117 >> 118 >> 119 >> 120 >> 121 >> 122 >> 123 165 124