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