00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <complex>
00029
00030 #include "G4XTRTransparentRegRadModel.hh"
00031 #include "G4PhysicalConstants.hh"
00032 #include "Randomize.hh"
00033 #include "G4Integrator.hh"
00034 #include "G4Gamma.hh"
00035
00037
00038
00039
00040 G4XTRTransparentRegRadModel::G4XTRTransparentRegRadModel(G4LogicalVolume *anEnvelope,
00041 G4Material* foilMat,G4Material* gasMat,
00042 G4double a, G4double b, G4int n,
00043 const G4String& processName) :
00044 G4VXTRenergyLoss(anEnvelope,foilMat,gasMat,a,b,n,processName)
00045 {
00046 G4cout<<"Regular transparent X-ray TR radiator EM process is called"<<G4endl;
00047
00048
00049
00050 fExitFlux = true;
00051 fAlphaPlate = 10000;
00052 fAlphaGas = 1000;
00053
00054
00055 }
00056
00058
00059 G4XTRTransparentRegRadModel::~G4XTRTransparentRegRadModel()
00060 {
00061 ;
00062 }
00063
00065
00066
00067
00068 G4double G4XTRTransparentRegRadModel::SpectralXTRdEdx(G4double energy)
00069 {
00070 G4double result, sum = 0., tmp, cof1, cof2, cofMin, cofPHC,aMa, bMb, sigma;
00071 G4int k, kMax, kMin;
00072
00073 aMa = GetPlateLinearPhotoAbs(energy);
00074 bMb = GetGasLinearPhotoAbs(energy);
00075
00076 if(fCompton)
00077 {
00078 aMa += GetPlateCompton(energy);
00079 bMb += GetGasCompton(energy);
00080 }
00081 aMa *= fPlateThick;
00082 bMb *= fGasThick;
00083
00084 sigma = aMa + bMb;
00085
00086 cofPHC = 4*pi*hbarc;
00087 tmp = (fSigma1 - fSigma2)/cofPHC/energy;
00088 cof1 = fPlateThick*tmp;
00089 cof2 = fGasThick*tmp;
00090
00091 cofMin = energy*(fPlateThick + fGasThick)/fGamma/fGamma;
00092 cofMin += (fPlateThick*fSigma1 + fGasThick*fSigma2)/energy;
00093 cofMin /= cofPHC;
00094
00095
00096
00097
00098
00099 kMin = G4int(cofMin);
00100 if (cofMin > kMin) kMin++;
00101
00102
00103
00104
00105
00106
00107
00108
00109 kMax = kMin + 19;
00110
00111
00112
00113
00114
00115 for( k = kMin; k <= kMax; k++ )
00116 {
00117 tmp = pi*fPlateThick*(k + cof2)/(fPlateThick + fGasThick);
00118 result = (k - cof1)*(k - cof1)*(k + cof2)*(k + cof2);
00119
00120 if( k == kMin && kMin == G4int(cofMin) )
00121 {
00122 sum += 0.5*std::sin(tmp)*std::sin(tmp)*std::abs(k-cofMin)/result;
00123 }
00124 else
00125 {
00126 sum += std::sin(tmp)*std::sin(tmp)*std::abs(k-cofMin)/result;
00127 }
00128
00129 }
00130 result = 4.*( cof1 + cof2 )*( cof1 + cof2 )*sum/energy;
00131 result *= ( 1. - std::exp(-fPlateNumber*sigma) )/( 1. - std::exp(-sigma) );
00132 return result;
00133 }
00134
00135
00137
00138
00139
00140
00141
00142
00143
00144 G4double
00145 G4XTRTransparentRegRadModel::GetStackFactor( G4double energy,
00146 G4double gamma, G4double varAngle )
00147 {
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175 G4double result, Qa, Qb, Q, aZa, bZb, aMa, bMb, D, sigma;
00176
00177 aZa = fPlateThick/GetPlateFormationZone(energy,gamma,varAngle);
00178 bZb = fGasThick/GetGasFormationZone(energy,gamma,varAngle);
00179 aMa = fPlateThick*GetPlateLinearPhotoAbs(energy);
00180 bMb = fGasThick*GetGasLinearPhotoAbs(energy);
00181 sigma = aMa*fPlateThick + bMb*fGasThick;
00182 Qa = std::exp(-0.5*aMa);
00183 Qb = std::exp(-0.5*bMb);
00184 Q = Qa*Qb;
00185
00186 G4complex Ha( Qa*std::cos(aZa), -Qa*std::sin(aZa) );
00187 G4complex Hb( Qb*std::cos(bZb), -Qb*std::sin(bZb) );
00188 G4complex H = Ha*Hb;
00189 G4complex Hs = conj(H);
00190 D = 1.0 /( (1 - Q)*(1 - Q) +
00191 4*Q*std::sin(0.5*(aZa + bZb))*std::sin(0.5*(aZa + bZb)) );
00192 G4complex F1 = (1.0 - Ha)*(1.0 - Hb)*(1.0 - Hs)
00193 * G4double(fPlateNumber)*D;
00194 G4complex F2 = (1.0 - Ha)*(1.0 - Ha)*Hb*(1.0 - Hs)*(1.0 - Hs)
00195
00196 * (1.0 - std::exp(-0.5*fPlateNumber*sigma)) * D*D;
00197 G4complex R = (F1 + F2)*OneInterfaceXTRdEdx(energy,gamma,varAngle);
00198 result = 2.0*std::real(R);
00199 return result;
00200
00201 }
00202
00203
00204
00205
00207
00208
00209
00210
00211
00212
00213
00214