88 protonMassAMU(1.007276),
130 pname !=
"deuteron" && pname !=
"triton" &&
131 pname !=
"alpha+" && pname !=
"helium" &&
132 pname !=
"hydrogen") {
isIon =
true; }
171 if(cutEnergy < maxEnergy) {
175 G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*
mass)/energy2;
176 cross = 1.0/cutEnergy - 1.0/maxEnergy - beta2*
G4Log(maxEnergy/cutEnergy)/tmax;
196 (p,kineticEnergy,cutEnergy,maxEnergy);
211 (p,kineticEnergy,cutEnergy,maxEnergy);
229 dedx =
DEDX(material, tkin);
232 if (cutEnergy < tmax) {
240 dedx += (
G4Log(x) + (1.0 - x)*beta2) * twopi_mc2_rcl2
246 if (dedx < 0.0) { dedx = 0.0; }
266 if(xmin >= xmax) {
return; }
271 G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*
mass)/energy2;
278 deltaKinEnergy = xmin*xmax/(xmin*(1.0 - q) + xmax*q);
280 f = 1.0 - beta2*deltaKinEnergy/tmax;
283 G4cout <<
"G4BraggModel::SampleSecondary Warning! "
284 <<
"Majorant " << grej <<
" < "
285 << f <<
" for e= " << deltaKinEnergy
303 sqrt(deltaKinEnergy * (deltaKinEnergy + 2.0*electron_mass_c2));
304 G4double cost = deltaKinEnergy * (energy + electron_mass_c2) /
306 if(cost > 1.0) { cost = 1.0; }
307 G4double sint = sqrt((1.0 - cost)*(1.0 + cost));
311 deltaDirection.set(sint*cos(phi),sint*sin(phi), cost) ;
320 kineticEnergy -= deltaKinEnergy;
322 finalP = finalP.unit();
327 vdp->push_back(delta);
337 G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.) /
347 if(
"" == chFormula) {
return false; }
350 static const size_t numberOfMolecula = 11;
351 static const G4String molName[numberOfMolecula] = {
352 "Al_2O_3",
"CO_2",
"CH_4",
353 "(C_2H_4)_N-Polyethylene",
"(C_2H_4)_N-Polypropylene",
"(C_8H_8)_N",
354 "C_3H_8",
"SiO_2",
"H_2O",
355 "H_2O-Gas",
"Graphite" } ;
356 static const G4int idxPSTAR[numberOfMolecula] = {
365 if( theState ==
kStateGas &&
"H_2O" == chFormula) {
370 for (
size_t i=0; i<numberOfMolecula; ++i) {
371 if (chFormula == molName[i]) {
396 {1.187E+1, 1.343E+1, 1.069E+4, 7.723E+2, 2.153E-2},
397 {7.802E+0, 8.814E+0, 8.303E+3, 7.446E+2, 7.966E-3},
398 {7.294E+0, 8.284E+0, 5.010E+3, 4.544E+2, 8.153E-3},
399 {8.646E+0, 9.800E+0, 7.066E+3, 4.581E+2, 9.383E-3},
400 {1.286E+1, 1.462E+1, 5.625E+3, 2.621E+3, 3.512E-2},
401 {3.229E+1, 3.696E+1, 8.918E+3, 3.244E+3, 1.273E-1},
402 {1.604E+1, 1.825E+1, 6.967E+3, 2.307E+3, 3.775E-2},
403 {8.049E+0, 9.099E+0, 9.257E+3, 3.846E+2, 1.007E-2},
404 {4.015E+0, 4.542E+0, 3.955E+3, 4.847E+2, 7.904E-3},
405 {4.571E+0, 5.173E+0, 4.346E+3, 4.779E+2, 8.572E-3},
406 {2.631E+0, 2.601E+0, 1.701E+3, 1.279E+3, 1.638E-2} };
408 static const G4double atomicWeight[11] = {
409 101.96128, 44.0098, 16.0426, 28.0536, 42.0804,
410 104.1512, 44.665, 60.0843, 18.0152, 18.0152, 12.0};
415 }
else if ( T < 10000.0 ) {
419 ionloss = slow*shigh / (slow + shigh) ;
422 if ( ionloss < 0.0) ionloss = 0.0 ;
427 else if (T < 700.0) {
430 else if (T < 10000.0) {
462 {1.254E+0, 1.440E+0, 2.426E+2, 1.200E+4, 1.159E-1},
463 {1.229E+0, 1.397E+0, 4.845E+2, 5.873E+3, 5.225E-2},
464 {1.411E+0, 1.600E+0, 7.256E+2, 3.013E+3, 4.578E-2},
465 {2.248E+0, 2.590E+0, 9.660E+2, 1.538E+2, 3.475E-2},
466 {2.474E+0, 2.815E+0, 1.206E+3, 1.060E+3, 2.855E-2},
467 {2.631E+0, 2.601E+0, 1.701E+3, 1.279E+3, 1.638E-2},
468 {2.954E+0, 3.350E+0, 1.683E+3, 1.900E+3, 2.513E-2},
469 {2.652E+0, 3.000E+0, 1.920E+3, 2.000E+3, 2.230E-2},
470 {2.085E+0, 2.352E+0, 2.157E+3, 2.634E+3, 1.816E-2},
471 {1.951E+0, 2.199E+0, 2.393E+3, 2.699E+3, 1.568E-2},
473 {2.542E+0, 2.869E+0, 2.628E+3, 1.854E+3, 1.472E-2},
474 {3.791E+0, 4.293E+0, 2.862E+3, 1.009E+3, 1.397E-2},
475 {4.154E+0, 4.739E+0, 2.766E+3, 1.645E+2, 2.023E-2},
476 {4.914E+0, 5.598E+0, 3.193E+3, 2.327E+2, 1.419E-2},
477 {3.232E+0, 3.647E+0, 3.561E+3, 1.560E+3, 1.267E-2},
478 {3.447E+0, 3.891E+0, 3.792E+3, 1.219E+3, 1.211E-2},
479 {5.301E+0, 6.008E+0, 3.969E+3, 6.451E+2, 1.183E-2},
480 {5.731E+0, 6.500E+0, 4.253E+3, 5.300E+2, 1.123E-2},
481 {5.152E+0, 5.833E+0, 4.482E+3, 5.457E+2, 1.129E-2},
482 {5.521E+0, 6.252E+0, 4.710E+3, 5.533E+2, 1.112E-2},
484 {5.201E+0, 5.884E+0, 4.938E+3, 5.609E+2, 9.995E-3},
485 {4.858E+0, 5.489E+0, 5.260E+3, 6.511E+2, 8.930E-3},
486 {4.479E+0, 5.055E+0, 5.391E+3, 9.523E+2, 9.117E-3},
487 {3.983E+0, 4.489E+0, 5.616E+3, 1.336E+3, 8.413E-3},
488 {3.469E+0, 3.907E+0, 5.725E+3, 1.461E+3, 8.829E-3},
489 {3.519E+0, 3.963E+0, 6.065E+3, 1.243E+3, 7.782E-3},
490 {3.140E+0, 3.535E+0, 6.288E+3, 1.372E+3, 7.361E-3},
491 {3.553E+0, 4.004E+0, 6.205E+3, 5.551E+2, 8.763E-3},
492 {3.696E+0, 4.194E+0, 4.649E+3, 8.113E+1, 2.242E-2},
493 {4.210E+0, 4.750E+0, 6.953E+3, 2.952E+2, 6.809E-3},
495 {5.041E+0, 5.697E+0, 7.173E+3, 2.026E+2, 6.725E-3},
496 {5.554E+0, 6.300E+0, 6.496E+3, 1.100E+2, 9.689E-3},
497 {5.323E+0, 6.012E+0, 7.611E+3, 2.925E+2, 6.447E-3},
498 {5.874E+0, 6.656E+0, 7.395E+3, 1.175E+2, 7.684E-3},
499 {6.658E+0, 7.536E+0, 7.694E+3, 2.223E+2, 6.509E-3},
500 {6.413E+0, 7.240E+0, 1.185E+4, 1.537E+2, 2.880E-3},
501 {5.694E+0, 6.429E+0, 8.478E+3, 2.929E+2, 6.087E-3},
502 {6.339E+0, 7.159E+0, 8.693E+3, 3.303E+2, 6.003E-3},
503 {6.407E+0, 7.234E+0, 8.907E+3, 3.678E+2, 5.889E-3},
504 {6.734E+0, 7.603E+0, 9.120E+3, 4.052E+2, 5.765E-3},
506 {6.901E+0, 7.791E+0, 9.333E+3, 4.427E+2, 5.587E-3},
507 {6.424E+0, 7.248E+0, 9.545E+3, 4.802E+2, 5.376E-3},
508 {6.799E+0, 7.671E+0, 9.756E+3, 5.176E+2, 5.315E-3},
509 {6.109E+0, 6.887E+0, 9.966E+3, 5.551E+2, 5.151E-3},
510 {5.924E+0, 6.677E+0, 1.018E+4, 5.925E+2, 4.919E-3},
511 {5.238E+0, 5.900E+0, 1.038E+4, 6.300E+2, 4.758E-3},
513 {5.345E+0, 6.038E+0, 6.790E+3, 3.978E+2, 1.676E-2},
514 {5.814E+0, 6.554E+0, 1.080E+4, 3.555E+2, 4.626E-3},
515 {6.229E+0, 7.024E+0, 1.101E+4, 3.709E+2, 4.540E-3},
516 {6.409E+0, 7.227E+0, 1.121E+4, 3.864E+2, 4.474E-3},
518 {7.500E+0, 8.480E+0, 8.608E+3, 3.480E+2, 9.074E-3},
519 {6.979E+0, 7.871E+0, 1.162E+4, 3.924E+2, 4.402E-3},
520 {7.725E+0, 8.716E+0, 1.183E+4, 3.948E+2, 4.376E-3},
521 {8.337E+0, 9.425E+0, 1.051E+4, 2.696E+2, 6.206E-3},
522 {7.287E+0, 8.218E+0, 1.223E+4, 3.997E+2, 4.447E-3},
523 {7.899E+0, 8.911E+0, 1.243E+4, 4.021E+2, 4.511E-3},
524 {8.041E+0, 9.071E+0, 1.263E+4, 4.045E+2, 4.540E-3},
525 {7.488E+0, 8.444E+0, 1.283E+4, 4.069E+2, 4.420E-3},
526 {7.291E+0, 8.219E+0, 1.303E+4, 4.093E+2, 4.298E-3},
527 {7.098E+0, 8.000E+0, 1.323E+4, 4.118E+2, 4.182E-3},
529 {6.909E+0, 7.786E+0, 1.343E+4, 4.142E+2, 4.058E-3},
530 {6.728E+0, 7.580E+0, 1.362E+4, 4.166E+2, 3.976E-3},
531 {6.551E+0, 7.380E+0, 1.382E+4, 4.190E+2, 3.877E-3},
532 {6.739E+0, 7.592E+0, 1.402E+4, 4.214E+2, 3.863E-3},
533 {6.212E+0, 6.996E+0, 1.421E+4, 4.239E+2, 3.725E-3},
534 {5.517E+0, 6.210E+0, 1.440E+4, 4.263E+2, 3.632E-3},
535 {5.220E+0, 5.874E+0, 1.460E+4, 4.287E+2, 3.498E-3},
536 {5.071E+0, 5.706E+0, 1.479E+4, 4.330E+2, 3.405E-3},
537 {4.926E+0, 5.542E+0, 1.498E+4, 4.335E+2, 3.342E-3},
538 {4.788E+0, 5.386E+0, 1.517E+4, 4.359E+2, 3.292E-3},
540 {4.893E+0, 5.505E+0, 1.536E+4, 4.384E+2, 3.243E-3},
541 {5.028E+0, 5.657E+0, 1.555E+4, 4.408E+2, 3.195E-3},
542 {4.738E+0, 5.329E+0, 1.574E+4, 4.432E+2, 3.186E-3},
543 {4.587E+0, 5.160E+0, 1.541E+4, 4.153E+2, 3.406E-3},
544 {5.201E+0, 5.851E+0, 1.612E+4, 4.416E+2, 3.122E-3},
545 {5.071E+0, 5.704E+0, 1.630E+4, 4.409E+2, 3.082E-3},
546 {4.946E+0, 5.563E+0, 1.649E+4, 4.401E+2, 2.965E-3},
547 {4.477E+0, 5.034E+0, 1.667E+4, 4.393E+2, 2.871E-3},
549 {4.844E+0, 5.458E+0, 7.852E+3, 9.758E+2, 2.077E-2},
550 {4.307E+0, 4.843E+0, 1.704E+4, 4.878E+2, 2.882E-3},
552 {4.723E+0, 5.311E+0, 1.722E+4, 5.370E+2, 2.913E-3},
553 {5.319E+0, 5.982E+0, 1.740E+4, 5.863E+2, 2.871E-3},
554 {5.956E+0, 6.700E+0, 1.780E+4, 6.770E+2, 2.660E-3},
555 {6.158E+0, 6.928E+0, 1.777E+4, 5.863E+2, 2.812E-3},
556 {6.203E+0, 6.979E+0, 1.795E+4, 5.863E+2, 2.776E-3},
557 {6.181E+0, 6.954E+0, 1.812E+4, 5.863E+2, 2.748E-3},
558 {6.949E+0, 7.820E+0, 1.830E+4, 5.863E+2, 2.737E-3},
559 {7.506E+0, 8.448E+0, 1.848E+4, 5.863E+2, 2.727E-3},
560 {7.648E+0, 8.609E+0, 1.866E+4, 5.863E+2, 2.697E-3},
561 {7.711E+0, 8.679E+0, 1.883E+4, 5.863E+2, 2.641E-3},
563 {7.407E+0, 8.336E+0, 1.901E+4, 5.863E+2, 2.603E-3},
564 {7.290E+0, 8.204E+0, 1.918E+4, 5.863E+2, 2.673E-3}
570 if ( T < 40.0 && 5 == i) {
575 }
else if ( T < 10.0 ) {
582 G4double shigh =
G4Log( 1.0 + a[i][3]/T + a[i][4]*T ) * a[i][2]/T ;
583 ionloss = slow*shigh*fac / (slow + shigh) ;
585 if ( ionloss < 0.0) { ionloss = 0.0; }
609 const G4double* theAtomicNumDensityVector =
621 }
else if(1 == numberOfElements) {
637 for (
G4int i=0; i<numberOfElements; i++) {
638 const G4Element* element = (*theElementVector)[i] ;
641 * theAtomicNumDensityVector[i] ;
643 * theAtomicNumDensityVector[i] ;
655 for (
G4int i=0; i<numberOfElements; i++)
657 const G4Element* element = (*theElementVector)[i] ;
659 * theAtomicNumDensityVector[i];
675 if (myFormula == chFormula ) {
return false; }
685 if( theState ==
kStateGas && myFormula == chFormula)
return false ;
689 static const G4double HeEff = 2.8735 ;
691 static const size_t numberOfMolecula = 53;
692 static const G4String nameOfMol[53] = {
693 "H_2O",
"C_2H_4O",
"C_3H_6O",
"C_2H_2",
"C_H_3OH",
694 "C_2H_5OH",
"C_3H_7OH",
"C_3H_4",
"NH_3",
"C_14H_10",
695 "C_6H_6",
"C_4H_10",
"C_4H_6",
"C_4H_8O",
"CCl_4",
696 "CF_4",
"C_6H_8",
"C_6H_12",
"C_6H_10O",
"C_6H_10",
697 "C_8H_16",
"C_5H_10",
"C_5H_8",
"C_3H_6-Cyclopropane",
"C_2H_4F_2",
698 "C_2H_2F_2",
"C_4H_8O_2",
"C_2H_6",
"C_2F_6",
"C_2H_6O",
699 "C_3H_6O",
"C_4H_10O",
"C_2H_4",
"C_2H_4O",
"C_2H_4S",
700 "SH_2",
"CH_4",
"CCLF_3",
"CCl_2F_2",
"CHCl_2F",
701 "(CH_3)_2S",
"N_2O",
"C_5H_10O",
"C_8H_6",
"(CH_2)_N",
702 "(C_3H_6)_N",
"(C_8H_8)_N",
"C_3H_8",
"C_3H_6-Propylene",
"C_3H_6O",
703 "C_3H_6S",
"C_4H_4S",
"C_7H_8"
706 static const G4double expStopping[numberOfMolecula] = {
707 66.1, 190.4, 258.7, 42.2, 141.5,
708 210.9, 279.6, 198.8, 31.0, 267.5,
709 122.8, 311.4, 260.3, 328.9, 391.3,
710 206.6, 374.0, 422.0, 432.0, 398.0,
711 554.0, 353.0, 326.0, 74.6, 220.5,
712 197.4, 362.0, 170.0, 330.5, 211.3,
713 262.3, 349.6, 51.3, 187.0, 236.9,
714 121.9, 35.8, 247.0, 292.6, 268.0,
715 262.3, 49.0, 398.9, 444.0, 22.91,
716 68.0, 155.0, 84.0, 74.2, 254.7,
720 static const G4double expCharge[53] = {
721 HeEff, HeEff, HeEff, 1.0, HeEff,
722 HeEff, HeEff, HeEff, 1.0, 1.0,
723 1.0, HeEff, HeEff, HeEff, HeEff,
724 HeEff, HeEff, HeEff, HeEff, HeEff,
725 HeEff, HeEff, HeEff, 1.0, HeEff,
726 HeEff, HeEff, HeEff, HeEff, HeEff,
727 HeEff, HeEff, 1.0, HeEff, HeEff,
728 HeEff, 1.0, HeEff, HeEff, HeEff,
729 HeEff, 1.0, HeEff, HeEff, 1.0,
730 1.0, 1.0, 1.0, 1.0, HeEff,
734 static const G4double numberOfAtomsPerMolecula[53] = {
735 3.0, 7.0, 10.0, 4.0, 6.0,
736 9.0, 12.0, 7.0, 4.0, 24.0,
737 12.0, 14.0, 10.0, 13.0, 5.0,
738 5.0, 14.0, 18.0, 17.0, 17.0,
739 24.0, 15.0, 13.0, 9.0, 8.0,
740 6.0, 14.0, 8.0, 8.0, 9.0,
741 10.0, 15.0, 6.0, 7.0, 7.0,
742 3.0, 5.0, 5.0, 5.0, 5.0,
743 9.0, 3.0, 16.0, 14.0, 3.0,
744 9.0, 16.0, 11.0, 9.0, 10.0,
749 for (
size_t i=0; i<numberOfMolecula; i++)
751 if(chFormula == nameOfMol[i]) {
754 (expCharge[i] * numberOfAtomsPerMolecula[i]) ;
772 G4double gamma = 1.0 + kineticEnergy/proton_mass_c2 ;
773 G4double gamma25 = 1.0 + 25.0*
keV /proton_mass_c2 ;
774 G4double gamma125 = 1.0 + 125.0*
keV/proton_mass_c2 ;
775 G4double beta = sqrt(1.0 - 1.0/(gamma*gamma)) ;
776 G4double beta25 = sqrt(1.0 - 1.0/(gamma25*gamma25)) ;
777 G4double beta125 = sqrt(1.0 - 1.0/(gamma125*gamma125)) ;
780 (1.0 +
G4Exp( 1.48 * ( beta125/beta25 - 7.0 ) ) ) /
781 (1.0 +
G4Exp( 1.48 * ( beta/beta25 - 7.0 ) ) ) ;
G4double MaxSecondaryKinEnergy(const G4DynamicParticle *dynParticle)
static G4LossTableManager * Instance()
G4ParticleChangeForLoss * GetParticleChangeForLoss()
std::vector< G4Element * > G4ElementVector
G4bool HasMaterial(const G4Material *material)
static const G4double fac
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
G4BraggModel(const G4ParticleDefinition *p=0, const G4String &nam="Bragg")
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy)
void SetExpStopPower125(G4double value)
const G4String & GetChemicalFormula() const
G4double EffectiveChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4VEmAngularDistribution * GetAngularDistribution()
G4double GetDensity() const
G4double GetParticleCharge(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4double EffectiveChargeCorrection(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
G4VEmFluctuationModel * GetModelOfFluctuations()
G4double GetChargeSquareRatio() const
const G4ElementVector * GetElementVector() const
const G4String & GetParticleName() const
G4ParticleChangeForLoss * fParticleChange
void SetHighEnergyLimit(G4double)
G4double GetTotalMomentum() const
G4int GetIndex(const G4Material *)
G4GLOB_DLL std::ostream G4cout
G4ParticleDefinition * theElectron
virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition *, G4double kinEnergy)
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
virtual G4double GetParticleCharge(const G4ParticleDefinition *p, const G4Material *mat, G4double kineticEnergy)
void SetProposedKineticEnergy(G4double proposedKinEnergy)
const G4String & GetParticleType() const
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kineticEnergy, G4double Z, G4double A, G4double cutEnergy, G4double maxEnergy)
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
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
G4double energy(const ThreeVector &p, const G4double m)
static const G4double invLog10
G4double GetElectronicDEDX(G4int idx, G4double energy)
void SetAngularDistribution(G4VEmAngularDistribution *)
void SetParticle(const G4ParticleDefinition *p)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
virtual G4double ComputeCrossSectionPerElectron(const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy)
G4double ChemicalFactor(G4double kineticEnergy, G4double eloss125) const
static G4Electron * Electron()
size_t GetNumberOfElements() const
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
G4double theZieglerFactor
void SetDeexcitationFlag(G4bool val)
virtual void SetParticleAndCharge(const G4ParticleDefinition *, G4double q2)
G4bool MolecIsInZiegler1988(const G4Material *material)
G4double DEDX(const G4Material *material, G4double kineticEnergy)
G4ThreeVector GetMomentum() const
virtual G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy)
const G4Material * GetMaterial() const
G4int SelectRandomAtomNumber(const G4Material *)
G4double ElectronicStoppingPower(G4double z, G4double kineticEnergy) const