199{
200
201
202
204
206
210
212 {
214 }
215 else
216 {
218 {
220 }
221 else
222 {
223 G4cout <<
"*** WARNING in G4ecpssrBaseKxsModel::CalculateCrossSection : we can treat only Proton or Alpha incident particles " <<
G4endl;
224 return 0;
225 }
226 }
227
228 if (verboseLevel>0)
G4cout <<
" massIncident=" << massIncident<<
G4endl;
229
231
232 if (verboseLevel>0)
G4cout <<
" kBindingEnergy=" << kBindingEnergy/eV<<
G4endl;
233
235
236 if (verboseLevel>0)
G4cout <<
" massTarget=" << massTarget<<
G4endl;
237
238 G4double systemMass =((massIncident*massTarget)/(massIncident+massTarget))/electron_mass_c2;
239
240 if (verboseLevel>0)
G4cout <<
" systemMass=" << systemMass<<
G4endl;
241
243
244
245 G4double screenedzTarget = zTarget-zkshell;
246
247
248 const G4double rydbergMeV= 13.6056923e-6;
249
250 G4double tetaK = kBindingEnergy/((screenedzTarget*screenedzTarget)*rydbergMeV);
251
252
253 if (verboseLevel>0)
G4cout <<
" tetaK=" << tetaK<<
G4endl;
254
255 G4double velocity =(2./(tetaK*screenedzTarget))*std::pow(((energyIncident*electron_mass_c2)/(massIncident*rydbergMeV)),0.5);
256
257
258
259
260 if (verboseLevel>0)
G4cout <<
" velocity=" << velocity<<
G4endl;
261
262 const G4double bohrPow2Barn=(Bohr_radius*Bohr_radius)/barn ;
263
264 if (verboseLevel>0)
G4cout <<
" bohrPow2Barn=" << bohrPow2Barn<<
G4endl;
265
266 G4double sigma0 = 8.*
pi*(zIncident*zIncident)*bohrPow2Barn*std::pow(screenedzTarget,-4.);
267
268
269
270 if (verboseLevel>0)
G4cout <<
" sigma0=" << sigma0<<
G4endl;
271
272 const G4double kAnalyticalApproximation= 1.5;
273 G4double x = kAnalyticalApproximation/velocity;
274
275
276
278
280
281
282
283
284 if ((0.< x) && (x <= 0.035))
285 {
286 electrIonizationEnergy= 0.75*
pi*(std::log(1./(x*x))-1.);
287 }
288 else
289 {
290 if ( (0.035 < x) && (x <=3.))
291 {
292 electrIonizationEnergy =
G4Exp(-2.*x)/(0.031+(0.213*std::pow(x,0.5))+(0.005*x)-(0.069*std::pow(x,3./2.))+(0.324*x*x));
293 }
294
295 else
296 {
297 if ( (3.< x) && (x<=11.))
298 {
299 electrIonizationEnergy =2.*
G4Exp(-2.*x)/std::pow(x,1.6);
300 }
301
302 else electrIonizationEnergy =0.;
303 }
304 }
305
306 if (verboseLevel>0)
G4cout <<
" electrIonizationEnergy=" << electrIonizationEnergy<<
G4endl;
307
308 G4double hFunction =(electrIonizationEnergy*2.)/(tetaK*std::pow(velocity,3));
309
310
311 if (verboseLevel>0)
G4cout <<
" hFunction=" << hFunction<<
G4endl;
312
313 G4double gFunction = (1.+(9.*velocity)+(31.*velocity*velocity)+(98.*std::pow(velocity,3.))+(12.*std::pow(velocity,4.))+(25.*std::pow(velocity,5.))
314 +(4.2*std::pow(velocity,6.))+(0.515*std::pow(velocity,7.)))/std::pow(1.+velocity,9.);
315
316
317 if (verboseLevel>0)
G4cout <<
" gFunction=" << gFunction<<
G4endl;
318
319
320
321 G4double sigmaPSS = 1.+(((2.*zIncident)/(screenedzTarget*tetaK))*(gFunction-hFunction));
322
323
324
325
326 if (verboseLevel>0)
G4cout <<
" sigmaPSS=" << sigmaPSS<<
G4endl;
327
328 if (verboseLevel>0)
G4cout <<
" sigmaPSS*tetaK=" << sigmaPSS*tetaK<<
G4endl;
329
330
331
332 const G4double cNaturalUnit= 1/fine_structure_const;
333
334 if (verboseLevel>0)
G4cout <<
" cNaturalUnit=" << cNaturalUnit<<
G4endl;
335
336 G4double ykFormula=0.4*(screenedzTarget/cNaturalUnit)*(screenedzTarget/cNaturalUnit)/(velocity/sigmaPSS);
337
338
339
340
341 if (verboseLevel>0)
G4cout <<
" ykFormula=" << ykFormula<<
G4endl;
342
343 G4double relativityCorrection = std::pow((1.+(1.1*ykFormula*ykFormula)),0.5)+ykFormula;
344
345
346
347 if (verboseLevel>0)
G4cout <<
" relativityCorrection=" << relativityCorrection<<
G4endl;
348
349 G4double reducedVelocity = velocity*std::pow(relativityCorrection,0.5);
350
351
352
353
354 if (verboseLevel>0)
G4cout <<
" reducedVelocity=" << reducedVelocity<<
G4endl;
355
356 G4double etaOverTheta2 = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget)
357 /(sigmaPSS*tetaK)/(sigmaPSS*tetaK);
358
359
360
361 if (verboseLevel>0)
G4cout <<
" etaOverTheta2=" << etaOverTheta2<<
G4endl;
362
364
365
366
367 if ( velocity < 1. )
368
369
370
371
372
373 {
374 if (verboseLevel>0)
G4cout <<
" Notice : FK is computed from low velocity formula" <<
G4endl;
375
376 universalFunction = (std::pow(2.,9.)/45.)*std::pow(reducedVelocity/sigmaPSS,8.)*std::pow((1.+(1.72*(reducedVelocity/sigmaPSS)*(reducedVelocity/sigmaPSS))),-4.);
377
378
379 if (verboseLevel>0)
G4cout <<
" universalFunction by Brandt 1981 =" << universalFunction<<
G4endl;
380
381 }
382
383 else
384
385 {
386
387 if ( etaOverTheta2 > 86.6 && (sigmaPSS*tetaK) > 0.4 && (sigmaPSS*tetaK) < 2.9996 )
388 {
389
390
391 if (verboseLevel>0)
G4cout <<
" Notice : FK is computed from high velocity formula" <<
G4endl;
392
393 if (verboseLevel>0)
G4cout <<
" sigmaPSS*tetaK=" << sigmaPSS*tetaK <<
G4endl;
394
398
402
403 G4double etaK = (energyIncident*electron_mass_c2)/(massIncident*rydbergMeV*screenedzTarget*screenedzTarget);
404
405
406 if (verboseLevel>0)
G4cout <<
" etaK=" << etaK <<
G4endl;
407
408 G4double etaT = (sigmaPSS*tetaK)*(sigmaPSS*tetaK)*(86.6);
409
410
411 if (verboseLevel>0)
G4cout <<
" etaT=" << etaT <<
G4endl;
412
413 G4double fKT = FunctionFK((sigmaPSS*tetaK),86.6)*(etaT/(sigmaPSS*tetaK));
414
415
416 if (FunctionFK((sigmaPSS*tetaK),86.6)<=0.)
417 {
419 "*** WARNING in G4ecpssrBaseKxsModel::CalculateCrossSection : unable to interpolate FK function in high velocity region ! ***" <<
G4endl;
420 return 0;
421 }
422
423 if (verboseLevel>0)
G4cout <<
" FunctionFK=" << FunctionFK((sigmaPSS*tetaK),86.6) <<
G4endl;
424
426
428
430
432
434
436
438
440
442
443 G4double universalFunction3= fKK/(etaK/tetaK);
444
445
446 if (verboseLevel>0)
G4cout <<
" universalFunction3=" << universalFunction3 <<
G4endl;
447
448 universalFunction=universalFunction3;
449
450 }
451
452 else if ( etaOverTheta2 >= 1.e-3 && etaOverTheta2 <= 86.6 && (sigmaPSS*tetaK) >= 0.4 && (sigmaPSS*tetaK) <= 2.9996 )
453
454 {
455
456
457 if (verboseLevel>0)
G4cout <<
" Notice : FK is computed from INTERPOLATED data" <<
G4endl;
458
459 G4double universalFunction2 = FunctionFK((sigmaPSS*tetaK),etaOverTheta2);
460
461 if (universalFunction2<=0)
462 {
464 "*** WARNING : G4ecpssrBaseKxsModel::CalculateCrossSection is unable to interpolate FK function in medium velocity region ! ***" <<
G4endl;
465 return 0;
466 }
467
468 if (verboseLevel>0)
G4cout <<
" universalFunction2=" << universalFunction2 <<
" for theta=" << sigmaPSS*tetaK <<
" and etaOverTheta2=" << etaOverTheta2 <<
G4endl;
469
470 universalFunction=universalFunction2;
471 }
472
473 }
474
475
476
477 G4double sigmaPSSR = (sigma0/(sigmaPSS*tetaK))*universalFunction;
478
479
480 if (verboseLevel>0)
G4cout <<
" sigmaPSSR=" << sigmaPSSR<<
G4endl;
481
482
483
484 G4double pssDeltaK = (4./(systemMass*sigmaPSS*tetaK))*(sigmaPSS/velocity)*(sigmaPSS/velocity);
485
486
487
488 if (verboseLevel>0)
G4cout <<
" pssDeltaK=" << pssDeltaK<<
G4endl;
489
490 if (pssDeltaK>1) return 0.;
491
492 G4double energyLoss = std::pow(1-pssDeltaK,0.5);
493
494
495
496 if (verboseLevel>0)
G4cout <<
" energyLoss=" << energyLoss<<
G4endl;
497
498 G4double energyLossFunction = (std::pow(2.,-9)/8.)*((((9.*energyLoss)-1.)*std::pow(1.+energyLoss,9.))+(((9.*energyLoss)+1.)*std::pow(1.-energyLoss,9.)));
499
500
501
502 if (verboseLevel>0)
G4cout <<
" energyLossFunction=" << energyLossFunction<<
G4endl;
503
504
505
506 G4double coulombDeflection = (4.*
pi*zIncident/systemMass)*std::pow(tetaK*sigmaPSS,-2.)*std::pow(velocity/sigmaPSS,-3.)*(zTarget/screenedzTarget);
507
508
509 if (verboseLevel>0)
G4cout <<
" cParameter-short=" << coulombDeflection<<
G4endl;
510
511 G4double cParameter = 2.*coulombDeflection/(energyLoss*(energyLoss+1.));
512
513
514 if (verboseLevel>0)
G4cout <<
" cParameter-full=" << cParameter<<
G4endl;
515
517
518
520
521 if (verboseLevel>0)
G4cout <<
" coulombDeflectionFunction =" << coulombDeflectionFunction <<
G4endl;
522
523
524
526
527 crossSection = energyLossFunction* coulombDeflectionFunction*sigmaPSSR;
528
529
530
531
532
533 if (crossSection >= 0) {
534 return crossSection * barn;
535 }
536 else {return 0;}
537
538}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4GLOB_DLL std::ostream G4cout
G4double BindingEnergy() const
G4AtomicShell * Shell(G4int Z, size_t shellIndex) const
static G4AtomicTransitionManager * Instance()
virtual G4double FindValue(G4double e, G4int componentId=0) const
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
G4double GetPDGMass() const
G4double GetPDGCharge() const
static G4Proton * Proton()
G4double ExpIntFunction(G4int n, G4double x)