86 protonMassAMU(1.007276)
187 if(cutEnergy < maxEnergy) {
191 const G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*
mass)/energy2;
192 cross = (maxEnergy - cutEnergy)/(cutEnergy*maxEnergy)
193 - beta2*
G4Log(maxEnergy/cutEnergy)/tmax;
195 if( 0.0 <
spin ) { cross += 0.5*(maxEnergy - cutEnergy)/energy2; }
225 return material->GetElectronDensity()
246 if (cutEnergy < tmax) {
250 dedx += (
G4Log(x)*(tau + 1.)*(tau + 1.)/(tau * (tau + 2.0)) + 1.0 - x) *
272 if(xmin >= xmax) {
return; }
277 const G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*
mass)/energy2;
287 deltaKinEnergy = xmin*xmax/(xmin*(1.0 - rndm[0]) + xmax*rndm[0]);
289 f = 1.0 - beta2*deltaKinEnergy/tmax;
292 G4cout <<
"G4BraggModel::SampleSecondary Warning! "
293 <<
"Majorant " << grej <<
" < "
294 << f <<
" for e= " << deltaKinEnergy
299 }
while( grej*rndm[1] >= f );
316 if(cost > 1.0) { cost = 1.0; }
317 G4double sint = std::sqrt((1.0 - cost)*(1.0 + cost));
321 deltaDirection.
set(sint*std::cos(phi),sint*std::sin(phi), cost) ;
330 kineticEnergy -= deltaKinEnergy;
332 finalP = finalP.
unit();
337 vdp->push_back(delta);
357 if(chFormula.empty()) {
return; }
362 "Al_2O_3",
"CO_2",
"CH_4",
363 "(C_2H_4)_N-Polyethylene",
"(C_2H_4)_N-Polypropylene",
"(C_8H_8)_N",
364 "C_3H_8",
"SiO_2",
"H_2O",
365 "H_2O-Gas",
"Graphite" } ;
369 if (chFormula == molName[i]) {
392 static const G4float a[11][5] = {
393 {1.187E+1f, 1.343E+1f, 1.069E+4f, 7.723E+2f, 2.153E-2f},
394 {7.802E+0f, 8.814E+0f, 8.303E+3f, 7.446E+2f, 7.966E-3f},
395 {7.294E+0f, 8.284E+0f, 5.010E+3f, 4.544E+2f, 8.153E-3f},
396 {8.646E+0f, 9.800E+0f, 7.066E+3f, 4.581E+2f, 9.383E-3f},
397 {1.286E+1f, 1.462E+1f, 5.625E+3f, 2.621E+3f, 3.512E-2f},
398 {3.229E+1f, 3.696E+1f, 8.918E+3f, 3.244E+3f, 1.273E-1f},
399 {1.604E+1f, 1.825E+1f, 6.967E+3f, 2.307E+3f, 3.775E-2f},
400 {8.049E+0f, 9.099E+0f, 9.257E+3f, 3.846E+2f, 1.007E-2f},
401 {4.015E+0f, 4.542E+0f, 3.955E+3f, 4.847E+2f, 7.904E-3f},
402 {4.571E+0f, 5.173E+0f, 4.346E+3f, 4.779E+2f, 8.572E-3f},
403 {2.631E+0f, 2.601E+0f, 1.701E+3f, 1.279E+3f, 1.638E-2f} };
405 static const G4float atomicWeight[11] = {
406 101.96128f, 44.0098f, 16.0426f, 28.0536f, 42.0804f,
407 104.1512f, 44.665f, 60.0843f, 18.0152f, 18.0152f, 12.0f};
412 }
else if ( T < 10000.0 ) {
419 ionloss = slow*shigh / (slow + shigh) ;
427 ionloss *= (1.0+0.023+0.0066*
G4Log(T)*invLog10);
429 else if (T < 700.0) {
430 ionloss *=(1.0+0.089-0.0248*
G4Log(T-99.)*invLog10);
432 else if (T < 10000.0) {
433 ionloss *=(1.0+0.089-0.0248*
G4Log(700.-99.)*invLog10);
439 }
else if(1 == (
material->GetNumberOfElements())) {
461 static const G4float a[92][5] = {
462 {1.254E+0f, 1.440E+0f, 2.426E+2f, 1.200E+4f, 1.159E-1f},
463 {1.229E+0f, 1.397E+0f, 4.845E+2f, 5.873E+3f, 5.225E-2f},
464 {1.411E+0f, 1.600E+0f, 7.256E+2f, 3.013E+3f, 4.578E-2f},
465 {2.248E+0f, 2.590E+0f, 9.660E+2f, 1.538E+2f, 3.475E-2f},
466 {2.474E+0f, 2.815E+0f, 1.206E+3f, 1.060E+3f, 2.855E-2f},
467 {2.631E+0f, 2.601E+0f, 1.701E+3f, 1.279E+3f, 1.638E-2f},
468 {2.954E+0f, 3.350E+0f, 1.683E+3f, 1.900E+3f, 2.513E-2f},
469 {2.652E+0f, 3.000E+0f, 1.920E+3f, 2.000E+3f, 2.230E-2f},
470 {2.085E+0f, 2.352E+0f, 2.157E+3f, 2.634E+3f, 1.816E-2f},
471 {1.951E+0f, 2.199E+0f, 2.393E+3f, 2.699E+3f, 1.568E-2f},
473 {2.542E+0f, 2.869E+0f, 2.628E+3f, 1.854E+3f, 1.472E-2f},
474 {3.791E+0f, 4.293E+0f, 2.862E+3f, 1.009E+3f, 1.397E-2f},
475 {4.154E+0f, 4.739E+0f, 2.766E+3f, 1.645E+2f, 2.023E-2f},
476 {4.914E+0f, 5.598E+0f, 3.193E+3f, 2.327E+2f, 1.419E-2f},
477 {3.232E+0f, 3.647E+0f, 3.561E+3f, 1.560E+3f, 1.267E-2f},
478 {3.447E+0f, 3.891E+0f, 3.792E+3f, 1.219E+3f, 1.211E-2f},
479 {5.301E+0f, 6.008E+0f, 3.969E+3f, 6.451E+2f, 1.183E-2f},
480 {5.731E+0f, 6.500E+0f, 4.253E+3f, 5.300E+2f, 1.123E-2f},
481 {5.152E+0f, 5.833E+0f, 4.482E+3f, 5.457E+2f, 1.129E-2f},
482 {5.521E+0f, 6.252E+0f, 4.710E+3f, 5.533E+2f, 1.112E-2f},
484 {5.201E+0f, 5.884E+0f, 4.938E+3f, 5.609E+2f, 9.995E-3f},
485 {4.858E+0f, 5.489E+0f, 5.260E+3f, 6.511E+2f, 8.930E-3f},
486 {4.479E+0f, 5.055E+0f, 5.391E+3f, 9.523E+2f, 9.117E-3f},
487 {3.983E+0f, 4.489E+0f, 5.616E+3f, 1.336E+3f, 8.413E-3f},
488 {3.469E+0f, 3.907E+0f, 5.725E+3f, 1.461E+3f, 8.829E-3f},
489 {3.519E+0f, 3.963E+0f, 6.065E+3f, 1.243E+3f, 7.782E-3f},
490 {3.140E+0f, 3.535E+0f, 6.288E+3f, 1.372E+3f, 7.361E-3f},
491 {3.553E+0f, 4.004E+0f, 6.205E+3f, 5.551E+2f, 8.763E-3f},
492 {3.696E+0f, 4.194E+0f, 4.649E+3f, 8.113E+1f, 2.242E-2f},
493 {4.210E+0f, 4.750E+0f, 6.953E+3f, 2.952E+2f, 6.809E-3f},
495 {5.041E+0f, 5.697E+0f, 7.173E+3f, 2.026E+2f, 6.725E-3f},
496 {5.554E+0f, 6.300E+0f, 6.496E+3f, 1.100E+2f, 9.689E-3f},
497 {5.323E+0f, 6.012E+0f, 7.611E+3f, 2.925E+2f, 6.447E-3f},
498 {5.874E+0f, 6.656E+0f, 7.395E+3f, 1.175E+2f, 7.684E-3f},
499 {6.658E+0f, 7.536E+0f, 7.694E+3f, 2.223E+2f, 6.509E-3f},
500 {6.413E+0f, 7.240E+0f, 1.185E+4f, 1.537E+2f, 2.880E-3f},
501 {5.694E+0f, 6.429E+0f, 8.478E+3f, 2.929E+2f, 6.087E-3f},
502 {6.339E+0f, 7.159E+0f, 8.693E+3f, 3.303E+2f, 6.003E-3f},
503 {6.407E+0f, 7.234E+0f, 8.907E+3f, 3.678E+2f, 5.889E-3f},
504 {6.734E+0f, 7.603E+0f, 9.120E+3f, 4.052E+2f, 5.765E-3f},
506 {6.901E+0f, 7.791E+0f, 9.333E+3f, 4.427E+2f, 5.587E-3f},
507 {6.424E+0f, 7.248E+0f, 9.545E+3f, 4.802E+2f, 5.376E-3f},
508 {6.799E+0f, 7.671E+0f, 9.756E+3f, 5.176E+2f, 5.315E-3f},
509 {6.109E+0f, 6.887E+0f, 9.966E+3f, 5.551E+2f, 5.151E-3f},
510 {5.924E+0f, 6.677E+0f, 1.018E+4f, 5.925E+2f, 4.919E-3f},
511 {5.238E+0f, 5.900E+0f, 1.038E+4f, 6.300E+2f, 4.758E-3f},
513 {5.345E+0f, 6.038E+0f, 6.790E+3f, 3.978E+2f, 1.676E-2f},
514 {5.814E+0f, 6.554E+0f, 1.080E+4f, 3.555E+2f, 4.626E-3f},
515 {6.229E+0f, 7.024E+0f, 1.101E+4f, 3.709E+2f, 4.540E-3f},
516 {6.409E+0f, 7.227E+0f, 1.121E+4f, 3.864E+2f, 4.474E-3f},
518 {7.500E+0f, 8.480E+0f, 8.608E+3f, 3.480E+2f, 9.074E-3f},
519 {6.979E+0f, 7.871E+0f, 1.162E+4f, 3.924E+2f, 4.402E-3f},
520 {7.725E+0f, 8.716E+0f, 1.183E+4f, 3.948E+2f, 4.376E-3f},
521 {8.337E+0f, 9.425E+0f, 1.051E+4f, 2.696E+2f, 6.206E-3f},
522 {7.287E+0f, 8.218E+0f, 1.223E+4f, 3.997E+2f, 4.447E-3f},
523 {7.899E+0f, 8.911E+0f, 1.243E+4f, 4.021E+2f, 4.511E-3f},
524 {8.041E+0f, 9.071E+0f, 1.263E+4f, 4.045E+2f, 4.540E-3f},
525 {7.488E+0f, 8.444E+0f, 1.283E+4f, 4.069E+2f, 4.420E-3f},
526 {7.291E+0f, 8.219E+0f, 1.303E+4f, 4.093E+2f, 4.298E-3f},
527 {7.098E+0f, 8.000E+0f, 1.323E+4f, 4.118E+2f, 4.182E-3f},
529 {6.909E+0f, 7.786E+0f, 1.343E+4f, 4.142E+2f, 4.058E-3f},
530 {6.728E+0f, 7.580E+0f, 1.362E+4f, 4.166E+2f, 3.976E-3f},
531 {6.551E+0f, 7.380E+0f, 1.382E+4f, 4.190E+2f, 3.877E-3f},
532 {6.739E+0f, 7.592E+0f, 1.402E+4f, 4.214E+2f, 3.863E-3f},
533 {6.212E+0f, 6.996E+0f, 1.421E+4f, 4.239E+2f, 3.725E-3f},
534 {5.517E+0f, 6.210E+0f, 1.440E+4f, 4.263E+2f, 3.632E-3f},
535 {5.220E+0f, 5.874E+0f, 1.460E+4f, 4.287E+2f, 3.498E-3f},
536 {5.071E+0f, 5.706E+0f, 1.479E+4f, 4.330E+2f, 3.405E-3f},
537 {4.926E+0f, 5.542E+0f, 1.498E+4f, 4.335E+2f, 3.342E-3f},
538 {4.788E+0f, 5.386E+0f, 1.517E+4f, 4.359E+2f, 3.292E-3f},
540 {4.893E+0f, 5.505E+0f, 1.536E+4f, 4.384E+2f, 3.243E-3f},
541 {5.028E+0f, 5.657E+0f, 1.555E+4f, 4.408E+2f, 3.195E-3f},
542 {4.738E+0f, 5.329E+0f, 1.574E+4f, 4.432E+2f, 3.186E-3f},
543 {4.587E+0f, 5.160E+0f, 1.541E+4f, 4.153E+2f, 3.406E-3f},
544 {5.201E+0f, 5.851E+0f, 1.612E+4f, 4.416E+2f, 3.122E-3f},
545 {5.071E+0f, 5.704E+0f, 1.630E+4f, 4.409E+2f, 3.082E-3f},
546 {4.946E+0f, 5.563E+0f, 1.649E+4f, 4.401E+2f, 2.965E-3f},
547 {4.477E+0f, 5.034E+0f, 1.667E+4f, 4.393E+2f, 2.871E-3f},
549 {4.844E+0f, 5.458E+0f, 7.852E+3f, 9.758E+2f, 2.077E-2f},
550 {4.307E+0f, 4.843E+0f, 1.704E+4f, 4.878E+2f, 2.882E-3f},
552 {4.723E+0f, 5.311E+0f, 1.722E+4f, 5.370E+2f, 2.913E-3f},
553 {5.319E+0f, 5.982E+0f, 1.740E+4f, 5.863E+2f, 2.871E-3f},
554 {5.956E+0f, 6.700E+0f, 1.780E+4f, 6.770E+2f, 2.660E-3f},
555 {6.158E+0f, 6.928E+0f, 1.777E+4f, 5.863E+2f, 2.812E-3f},
556 {6.203E+0f, 6.979E+0f, 1.795E+4f, 5.863E+2f, 2.776E-3f},
557 {6.181E+0f, 6.954E+0f, 1.812E+4f, 5.863E+2f, 2.748E-3f},
558 {6.949E+0f, 7.820E+0f, 1.830E+4f, 5.863E+2f, 2.737E-3f},
559 {7.506E+0f, 8.448E+0f, 1.848E+4f, 5.863E+2f, 2.727E-3f},
560 {7.648E+0f, 8.609E+0f, 1.866E+4f, 5.863E+2f, 2.697E-3f},
561 {7.711E+0f, 8.679E+0f, 1.883E+4f, 5.863E+2f, 2.641E-3f},
563 {7.407E+0f, 8.336E+0f, 1.901E+4f, 5.863E+2f, 2.603E-3f},
564 {7.290E+0f, 8.204E+0f, 1.918E+4f, 5.863E+2f, 2.673E-3f}
570 if ( T < 40.0 && 5 == i) {
571 fac = std::sqrt(T*0.025);
575 }
else if ( T < 10.0 ) {
576 fac = std::sqrt(T*0.1) ;
587 ionloss = slow*shigh*
fac / (slow + shigh);
629 const G4int numberOfElements =
material->GetNumberOfElements();
630 const G4double* theAtomicNumDensityVector =
631 material->GetAtomicNumDensityVector();
639 }
else if(1 == numberOfElements) {
643 * (
material->GetTotNbOfAtomsPerVolume());
655 for (
G4int i=0; i<numberOfElements; ++i) {
656 const G4Element* element = (*theElementVector)[i] ;
659 * theAtomicNumDensityVector[i] ;
661 * theAtomicNumDensityVector[i] ;
673 for (
G4int i=0; i<numberOfElements; ++i)
675 const G4Element* element = (*theElementVector)[i] ;
677 * theAtomicNumDensityVector[i];
693 if (myFormula == chFormula ) {
return false; }
703 if( theState ==
kStateGas && myFormula == chFormula)
return false ;
707 static const G4float HeEff = 2.8735f;
711 "H_2O",
"C_2H_4O",
"C_3H_6O",
"C_2H_2",
"C_H_3OH",
712 "C_2H_5OH",
"C_3H_7OH",
"C_3H_4",
"NH_3",
"C_14H_10",
713 "C_6H_6",
"C_4H_10",
"C_4H_6",
"C_4H_8O",
"CCl_4",
714 "CF_4",
"C_6H_8",
"C_6H_12",
"C_6H_10O",
"C_6H_10",
715 "C_8H_16",
"C_5H_10",
"C_5H_8",
"C_3H_6-Cyclopropane",
"C_2H_4F_2",
716 "C_2H_2F_2",
"C_4H_8O_2",
"C_2H_6",
"C_2F_6",
"C_2H_6O",
717 "C_3H_6O",
"C_4H_10O",
"C_2H_4",
"C_2H_4O",
"C_2H_4S",
718 "SH_2",
"CH_4",
"CCLF_3",
"CCl_2F_2",
"CHCl_2F",
719 "(CH_3)_2S",
"N_2O",
"C_5H_10O",
"C_8H_6",
"(CH_2)_N",
720 "(C_3H_6)_N",
"(C_8H_8)_N",
"C_3H_8",
"C_3H_6-Propylene",
"C_3H_6O",
721 "C_3H_6S",
"C_4H_4S",
"C_7H_8"
725 66.1f, 190.4f, 258.7f, 42.2f, 141.5f,
726 210.9f, 279.6f, 198.8f, 31.0f, 267.5f,
727 122.8f, 311.4f, 260.3f, 328.9f, 391.3f,
728 206.6f, 374.0f, 422.0f, 432.0f, 398.0f,
729 554.0f, 353.0f, 326.0f, 74.6f, 220.5f,
730 197.4f, 362.0f, 170.0f, 330.5f, 211.3f,
731 262.3f, 349.6f, 51.3f, 187.0f, 236.9f,
732 121.9f, 35.8f, 247.0f, 292.6f, 268.0f,
733 262.3f, 49.0f, 398.9f, 444.0f, 22.91f,
734 68.0f, 155.0f, 84.0f, 74.2f, 254.7f,
735 306.8f, 324.4f, 420.0f
738 static const G4float expCharge[53] = {
739 HeEff, HeEff, HeEff, 1.0f, HeEff,
740 HeEff, HeEff, HeEff, 1.0f, 1.0f,
741 1.0f, HeEff, HeEff, HeEff, HeEff,
742 HeEff, HeEff, HeEff, HeEff, HeEff,
743 HeEff, HeEff, HeEff, 1.0f, HeEff,
744 HeEff, HeEff, HeEff, HeEff, HeEff,
745 HeEff, HeEff, 1.0f, HeEff, HeEff,
746 HeEff, 1.0f, HeEff, HeEff, HeEff,
747 HeEff, 1.0f, HeEff, HeEff, 1.0f,
748 1.0f, 1.0f, 1.0f, 1.0f, HeEff,
752 static const G4int numberOfAtomsPerMolecula[53] = {
767 if(chFormula == nameOfMol[i]) {
769 * (
material->GetTotNbOfAtomsPerVolume()) /
770 ((
G4double)(expCharge[i] * numberOfAtomsPerMolecula[i]));
788 static const G4double beta25 = std::sqrt(1.0 - 1.0/(gamma25*gamma25));
789 static const G4double beta125 = std::sqrt(1.0 - 1.0/(gamma125*gamma125));
790 static const G4double f12525 = 1.0 +
G4Exp( 1.48*(beta125/beta25 - 7.0) );
796 (1.0 +
G4Exp( 1.48 * (
beta/beta25 - 7.0 ) ) );
std::vector< const G4Element * > G4ElementVector
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
static const G4double fac
static const G4int numberOfMolecula
static constexpr double twopi
static constexpr double keV
G4GLOB_DLL std::ostream G4cout
void set(double x, double y, double z)
Hep3Vector & rotateUz(const Hep3Vector &)
virtual void flatArray(const int size, double *vect)=0
G4ParticleChangeForLoss * fParticleChange
G4double ElectronicStoppingPower(G4double z, G4double kineticEnergy) const
G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy) override
const G4Material * baseMaterial
G4BraggModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="Bragg")
G4bool MolecIsInZiegler1988(const G4Material *material)
G4double theZieglerFactor
G4double StoppingPower(const G4Material *material, G4double kineticEnergy)
void SetParticle(const G4ParticleDefinition *p)
G4double MaxSecondaryEnergy(const G4ParticleDefinition *, G4double kinEnergy) final
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
G4double GetParticleCharge(const G4ParticleDefinition *p, const G4Material *mat, G4double kineticEnergy) override
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kineticEnergy, G4double Z, G4double A, G4double cutEnergy, G4double maxEnergy) override
G4ParticleDefinition * theElectron
G4ICRU90StoppingData * fICRU90
G4double DEDX(const G4Material *material, G4double kineticEnergy)
G4double MinEnergyCut(const G4ParticleDefinition *, const G4MaterialCutsCouple *couple) override
const G4ParticleDefinition * particle
G4double GetChargeSquareRatio() const
G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy) override
const G4Material * currentMaterial
G4double ComputeCrossSectionPerElectron(const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy)
G4double ChemicalFactor(G4double kineticEnergy, G4double eloss125) const
static G4PSTARStopping * fPSTAR
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
void HasMaterial(const G4Material *material)
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const
G4double GetTotalMomentum() const
static G4Electron * Electron()
G4double EffectiveChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double GetParticleCharge(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double EffectiveChargeCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
static G4EmParameters * Instance()
G4double GetElectronicDEDXforProton(const G4Material *, G4double kinEnergy) const
G4int GetIndex(const G4Material *) const
G4double GetMeanExcitationEnergy() const
static G4LossTableManager * Instance()
G4EmCorrections * EmCorrections()
const G4Material * GetMaterial() const
const G4String & GetChemicalFormula() const
G4IonisParamMat * GetIonisation() const
G4ICRU90StoppingData * GetICRU90StoppingData()
static G4NistManager * Instance()
G4int GetIndex(const G4Material *) const
G4double GetElectronicDEDX(G4int idx, G4double energy) const
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedMomentumDirection(const G4ThreeVector &dir)
const G4String & GetParticleType() const
G4double GetPDGMass() const
const G4String & GetParticleName() const
virtual G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, const G4Material *)=0
virtual void SetParticleAndCharge(const G4ParticleDefinition *, G4double q2)
void SetHighEnergyLimit(G4double)
G4VEmFluctuationModel * GetModelOfFluctuations()
G4VEmAngularDistribution * GetAngularDistribution()
G4int SelectRandomAtomNumber(const G4Material *)
void SetDeexcitationFlag(G4bool val)
void SetAngularDistribution(G4VEmAngularDistribution *)
G4bool UseAngularGeneratorFlag() const
G4double MaxSecondaryKinEnergy(const G4DynamicParticle *dynParticle)
G4ParticleChangeForLoss * GetParticleChangeForLoss()
static constexpr double GeV
static constexpr double keV
static constexpr double MeV
static constexpr double cm2
static constexpr double twopi_mc2_rcl2
static constexpr double eV
G4double energy(const ThreeVector &p, const G4double m)
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments