148{
149
150
151
152
153
154
155
156
157
158
159
160 if (verboseLevel > 3)
161 G4cout <<
"Calling SampleSecondaries() of G4LivermoreGammaConversionModelRC" <<
G4endl;
162
165
167 G4double epsilon0Local = electron_mass_c2 / photonEnergy ;
170
171
172
173 if (photonEnergy < smallEnergy )
174 {
175 epsilon = epsilon0Local + (0.5 - epsilon0Local) *
G4UniformRand();
176
178 {
179 electronTotEnergy = (1. - epsilon) * photonEnergy;
180 positronTotEnergy = epsilon * photonEnergy;
181 }
182 else
183 {
184 positronTotEnergy = (1. - epsilon) * photonEnergy;
185 electronTotEnergy = epsilon * photonEnergy;
186 }
187 }
188 else
189 {
190
191
194 G4cout <<
"G4LivermoreGammaConversionModelRC::SampleSecondaries" <<
G4endl;
195
196 if (element == 0)
197 {
198 G4cout <<
"G4LivermoreGammaConversionModelRC::SampleSecondaries - element = 0"
200 return;
201 }
203 if (ionisation == 0)
204 {
205 G4cout <<
"G4LivermoreGammaConversionModelRC::SampleSecondaries - ionisation = 0"
207 return;
208 }
209
210
212 if (photonEnergy > 50. * MeV) fZ += 8. * (element->
GetfCoulomb());
213
214
216 G4double screenMax = std::exp ((42.24 - fZ)/8.368) - 0.952 ;
217 G4double screenMin = std::min(4.*screenFactor,screenMax) ;
218
219
220 G4double epsilon1 = 0.5 - 0.5 * std::sqrt(1. - screenMin / screenMax) ;
221 G4double epsilonMin = std::max(epsilon0Local,epsilon1);
222 G4double epsilonRange = 0.5 - epsilonMin ;
223
224
227
228 G4double f10 = ScreenFunction1(screenMin) - fZ;
229 G4double f20 = ScreenFunction2(screenMin) - fZ;
230 G4double normF1 = std::max(f10 * epsilonRange * epsilonRange,0.);
231 G4double normF2 = std::max(1.5 * f20,0.);
232 G4double a=393.3750918, b=115.3070201, c=810.6428451, d=19.96497475, e=1016.874592, f=1.936685510,
233 gLocal=751.2140962, h=0.099751048, i=299.9466339, j=0.002057250, k=49.81034926;
234 G4double aa=-18.6371131, bb=-1729.95248, cc=9450.971186, dd=106336.0145, ee=55143.09287, ff=-117602.840,
235 gg=-721455.467, hh=693957.8635, ii=156266.1085, jj=533209.9347;
237 G4double logepsMin = log(epsilonMin);
238 G4double NormaRC = a + b*logepsMin + c/logepsMin + d*pow(logepsMin,2.) + e/pow(logepsMin,2.) + f*pow(logepsMin,3.) +
239 gLocal/pow(logepsMin,3.) + h*pow(logepsMin,4.) + i/pow(logepsMin,4.) + j*pow(logepsMin,5.) +
240 k/pow(logepsMin,5.);
241
242 do {
243 do {
245 {
246 epsilon = 0.5 - epsilonRange * std::pow(
G4UniformRand(), 0.3333) ;
247 screen = screenFactor / (epsilon * (1. - epsilon));
248 gReject = (ScreenFunction1(screen) - fZ) / f10 ;
249 }
250 else
251 {
253 screen = screenFactor / (epsilon * (1 - epsilon));
254 gReject = (ScreenFunction2(screen) - fZ) / f20 ;
255 }
257
259
261 G4double deltaP_R1 = 1. + (a + b*logepsilon + c/logepsilon + d*pow(logepsilon,2.) + e/pow(logepsilon,2.) +
262 f*pow(logepsilon,3.) + gLocal/pow(logepsilon,3.) + h*pow(logepsilon,4.) + i/pow(logepsilon,4.) +
263 j*pow(logepsilon,5.) + k/pow(logepsilon,5.))/100.;
264 G4double deltaP_R2 = 1.+((aa + cc*logepsilon + ee*pow(logepsilon,2.) + gg*pow(logepsilon,3.) + ii*pow(logepsilon,4.))
265 / (1. + bb*logepsilon + dd*pow(logepsilon,2.) + ff*pow(logepsilon,3.) + hh*pow(logepsilon,4.)
266 + jj*pow(logepsilon,5.) ))/100.;
267
268 if (epsilon <= 0.5)
269 {
270 Rechazo = deltaP_R1/NormaRC;
271 }
272 else
273 {
274 Rechazo = deltaP_R2/NormaRC;
275 }
276 G4cout << Rechazo <<
" " << NormaRC <<
" " << epsilon <<
G4endl;
278
279 electronTotEnergy = (1. - epsilon) * photonEnergy;
280 positronTotEnergy = epsilon * photonEnergy;
281
282 }
283
284
285
286
287
288
289
293
294
295
297 {
299 }
300 else
301 {
303 }
304
305 G4double thetaEle = u*electron_mass_c2/electronTotEnergy;
306 G4double thetaPos = u*electron_mass_c2/positronTotEnergy;
308
309 G4double dxEle= std::sin(thetaEle)*std::cos(phi),dyEle= std::sin(thetaEle)*std::sin(phi),dzEle=std::cos(thetaEle);
310 G4double dxPos=-std::sin(thetaPos)*std::cos(phi),dyPos=-std::sin(thetaPos)*std::sin(phi),dzPos=std::cos(thetaPos);
311
312
313
314
315
316
317 G4double electronKineEnergy = std::max(0.,electronTotEnergy - electron_mass_c2) ;
318
319
320
322 electronDirection.rotateUz(photonDirection);
323
325 electronDirection,
326 electronKineEnergy);
327
328
329 G4double positronKineEnergy = std::max(0.,positronTotEnergy - electron_mass_c2) ;
330
331
332
334 positronDirection.rotateUz(photonDirection);
335
336
338 positronDirection, positronKineEnergy);
339
340
341 fvect->push_back(particle1);
342 fvect->push_back(particle2);
343
344
347
348}
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
G4double GetfCoulomb() const
G4IonisParamElm * GetIonisation() const
G4double GetlogZ3() const
void SetProposedKineticEnergy(G4double proposedKinEnergy)
static G4Positron * Positron()
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void ProposeTrackStatus(G4TrackStatus status)