89 protonMassAMU(1.007276),
133 pname !=
"deuteron" && pname !=
"triton" &&
134 pname !=
"alpha+" && pname !=
"helium" &&
135 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.5 ==
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
254 if (dedx < 0.0) { dedx = 0.0; }
274 if(xmin >= xmax) {
return; }
279 G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*
mass)/energy2;
286 deltaKinEnergy = xmin*xmax/(xmin*(1.0 - q) + xmax*q);
288 f = 1.0 - beta2*deltaKinEnergy/tmax;
291 G4cout <<
"G4BraggModel::SampleSecondary Warning! "
292 <<
"Majorant " << grej <<
" < "
293 << f <<
" for e= " << deltaKinEnergy
311 sqrt(deltaKinEnergy * (deltaKinEnergy + 2.0*electron_mass_c2));
312 G4double cost = deltaKinEnergy * (energy + electron_mass_c2) /
314 if(cost > 1.0) { cost = 1.0; }
315 G4double sint = sqrt((1.0 - cost)*(1.0 + cost));
319 deltaDirection.set(sint*cos(phi),sint*sin(phi), cost) ;
328 kineticEnergy -= deltaKinEnergy;
330 finalP = finalP.unit();
335 vdp->push_back(delta);
345 G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.) /
394 {1.187E+1, 1.343E+1, 1.069E+4, 7.723E+2, 2.153E-2},
395 {7.802E+0, 8.814E+0, 8.303E+3, 7.446E+2, 7.966E-3},
396 {7.294E+0, 8.284E+0, 5.010E+3, 4.544E+2, 8.153E-3},
397 {8.646E+0, 9.800E+0, 7.066E+3, 4.581E+2, 9.383E-3},
398 {1.286E+1, 1.462E+1, 5.625E+3, 2.621E+3, 3.512E-2},
399 {3.229E+1, 3.696E+1, 8.918E+3, 3.244E+3, 1.273E-1},
400 {1.604E+1, 1.825E+1, 6.967E+3, 2.307E+3, 3.775E-2},
401 {8.049E+0, 9.099E+0, 9.257E+3, 3.846E+2, 1.007E-2},
402 {4.015E+0, 4.542E+0, 3.955E+3, 4.847E+2, 7.904E-3},
403 {4.571E+0, 5.173E+0, 4.346E+3, 4.779E+2, 8.572E-3},
404 {2.631E+0, 2.601E+0, 1.701E+3, 1.279E+3, 1.638E-2} };
406 static const G4double atomicWeight[11] = {
407 101.96128, 44.0098, 16.0426, 28.0536, 42.0804,
408 104.1512, 44.665, 60.0843, 18.0152, 18.0152, 12.0};
413 }
else if ( T < 10000.0 ) {
417 ionloss = slow*shigh / (slow + shigh) ;
420 if ( ionloss < 0.0) ionloss = 0.0 ;
425 else if (T < 700.0) {
428 else if (T < 10000.0) {
460 {1.254E+0, 1.440E+0, 2.426E+2, 1.200E+4, 1.159E-1},
461 {1.229E+0, 1.397E+0, 4.845E+2, 5.873E+3, 5.225E-2},
462 {1.411E+0, 1.600E+0, 7.256E+2, 3.013E+3, 4.578E-2},
463 {2.248E+0, 2.590E+0, 9.660E+2, 1.538E+2, 3.475E-2},
464 {2.474E+0, 2.815E+0, 1.206E+3, 1.060E+3, 2.855E-2},
465 {2.631E+0, 2.601E+0, 1.701E+3, 1.279E+3, 1.638E-2},
466 {2.954E+0, 3.350E+0, 1.683E+3, 1.900E+3, 2.513E-2},
467 {2.652E+0, 3.000E+0, 1.920E+3, 2.000E+3, 2.230E-2},
468 {2.085E+0, 2.352E+0, 2.157E+3, 2.634E+3, 1.816E-2},
469 {1.951E+0, 2.199E+0, 2.393E+3, 2.699E+3, 1.568E-2},
471 {2.542E+0, 2.869E+0, 2.628E+3, 1.854E+3, 1.472E-2},
472 {3.791E+0, 4.293E+0, 2.862E+3, 1.009E+3, 1.397E-2},
473 {4.154E+0, 4.739E+0, 2.766E+3, 1.645E+2, 2.023E-2},
474 {4.914E+0, 5.598E+0, 3.193E+3, 2.327E+2, 1.419E-2},
475 {3.232E+0, 3.647E+0, 3.561E+3, 1.560E+3, 1.267E-2},
476 {3.447E+0, 3.891E+0, 3.792E+3, 1.219E+3, 1.211E-2},
477 {5.301E+0, 6.008E+0, 3.969E+3, 6.451E+2, 1.183E-2},
478 {5.731E+0, 6.500E+0, 4.253E+3, 5.300E+2, 1.123E-2},
479 {5.152E+0, 5.833E+0, 4.482E+3, 5.457E+2, 1.129E-2},
480 {5.521E+0, 6.252E+0, 4.710E+3, 5.533E+2, 1.112E-2},
482 {5.201E+0, 5.884E+0, 4.938E+3, 5.609E+2, 9.995E-3},
483 {4.858E+0, 5.489E+0, 5.260E+3, 6.511E+2, 8.930E-3},
484 {4.479E+0, 5.055E+0, 5.391E+3, 9.523E+2, 9.117E-3},
485 {3.983E+0, 4.489E+0, 5.616E+3, 1.336E+3, 8.413E-3},
486 {3.469E+0, 3.907E+0, 5.725E+3, 1.461E+3, 8.829E-3},
487 {3.519E+0, 3.963E+0, 6.065E+3, 1.243E+3, 7.782E-3},
488 {3.140E+0, 3.535E+0, 6.288E+3, 1.372E+3, 7.361E-3},
489 {3.553E+0, 4.004E+0, 6.205E+3, 5.551E+2, 8.763E-3},
490 {3.696E+0, 4.194E+0, 4.649E+3, 8.113E+1, 2.242E-2},
491 {4.210E+0, 4.750E+0, 6.953E+3, 2.952E+2, 6.809E-3},
493 {5.041E+0, 5.697E+0, 7.173E+3, 2.026E+2, 6.725E-3},
494 {5.554E+0, 6.300E+0, 6.496E+3, 1.100E+2, 9.689E-3},
495 {5.323E+0, 6.012E+0, 7.611E+3, 2.925E+2, 6.447E-3},
496 {5.874E+0, 6.656E+0, 7.395E+3, 1.175E+2, 7.684E-3},
497 {6.658E+0, 7.536E+0, 7.694E+3, 2.223E+2, 6.509E-3},
498 {6.413E+0, 7.240E+0, 1.185E+4, 1.537E+2, 2.880E-3},
499 {5.694E+0, 6.429E+0, 8.478E+3, 2.929E+2, 6.087E-3},
500 {6.339E+0, 7.159E+0, 8.693E+3, 3.303E+2, 6.003E-3},
501 {6.407E+0, 7.234E+0, 8.907E+3, 3.678E+2, 5.889E-3},
502 {6.734E+0, 7.603E+0, 9.120E+3, 4.052E+2, 5.765E-3},
504 {6.901E+0, 7.791E+0, 9.333E+3, 4.427E+2, 5.587E-3},
505 {6.424E+0, 7.248E+0, 9.545E+3, 4.802E+2, 5.376E-3},
506 {6.799E+0, 7.671E+0, 9.756E+3, 5.176E+2, 5.315E-3},
507 {6.109E+0, 6.887E+0, 9.966E+3, 5.551E+2, 5.151E-3},
508 {5.924E+0, 6.677E+0, 1.018E+4, 5.925E+2, 4.919E-3},
509 {5.238E+0, 5.900E+0, 1.038E+4, 6.300E+2, 4.758E-3},
511 {5.345E+0, 6.038E+0, 6.790E+3, 3.978E+2, 1.676E-2},
512 {5.814E+0, 6.554E+0, 1.080E+4, 3.555E+2, 4.626E-3},
513 {6.229E+0, 7.024E+0, 1.101E+4, 3.709E+2, 4.540E-3},
514 {6.409E+0, 7.227E+0, 1.121E+4, 3.864E+2, 4.474E-3},
516 {7.500E+0, 8.480E+0, 8.608E+3, 3.480E+2, 9.074E-3},
517 {6.979E+0, 7.871E+0, 1.162E+4, 3.924E+2, 4.402E-3},
518 {7.725E+0, 8.716E+0, 1.183E+4, 3.948E+2, 4.376E-3},
519 {8.337E+0, 9.425E+0, 1.051E+4, 2.696E+2, 6.206E-3},
520 {7.287E+0, 8.218E+0, 1.223E+4, 3.997E+2, 4.447E-3},
521 {7.899E+0, 8.911E+0, 1.243E+4, 4.021E+2, 4.511E-3},
522 {8.041E+0, 9.071E+0, 1.263E+4, 4.045E+2, 4.540E-3},
523 {7.488E+0, 8.444E+0, 1.283E+4, 4.069E+2, 4.420E-3},
524 {7.291E+0, 8.219E+0, 1.303E+4, 4.093E+2, 4.298E-3},
525 {7.098E+0, 8.000E+0, 1.323E+4, 4.118E+2, 4.182E-3},
527 {6.909E+0, 7.786E+0, 1.343E+4, 4.142E+2, 4.058E-3},
528 {6.728E+0, 7.580E+0, 1.362E+4, 4.166E+2, 3.976E-3},
529 {6.551E+0, 7.380E+0, 1.382E+4, 4.190E+2, 3.877E-3},
530 {6.739E+0, 7.592E+0, 1.402E+4, 4.214E+2, 3.863E-3},
531 {6.212E+0, 6.996E+0, 1.421E+4, 4.239E+2, 3.725E-3},
532 {5.517E+0, 6.210E+0, 1.440E+4, 4.263E+2, 3.632E-3},
533 {5.220E+0, 5.874E+0, 1.460E+4, 4.287E+2, 3.498E-3},
534 {5.071E+0, 5.706E+0, 1.479E+4, 4.330E+2, 3.405E-3},
535 {4.926E+0, 5.542E+0, 1.498E+4, 4.335E+2, 3.342E-3},
536 {4.788E+0, 5.386E+0, 1.517E+4, 4.359E+2, 3.292E-3},
538 {4.893E+0, 5.505E+0, 1.536E+4, 4.384E+2, 3.243E-3},
539 {5.028E+0, 5.657E+0, 1.555E+4, 4.408E+2, 3.195E-3},
540 {4.738E+0, 5.329E+0, 1.574E+4, 4.432E+2, 3.186E-3},
541 {4.587E+0, 5.160E+0, 1.541E+4, 4.153E+2, 3.406E-3},
542 {5.201E+0, 5.851E+0, 1.612E+4, 4.416E+2, 3.122E-3},
543 {5.071E+0, 5.704E+0, 1.630E+4, 4.409E+2, 3.082E-3},
544 {4.946E+0, 5.563E+0, 1.649E+4, 4.401E+2, 2.965E-3},
545 {4.477E+0, 5.034E+0, 1.667E+4, 4.393E+2, 2.871E-3},
547 {4.844E+0, 5.458E+0, 7.852E+3, 9.758E+2, 2.077E-2},
548 {4.307E+0, 4.843E+0, 1.704E+4, 4.878E+2, 2.882E-3},
550 {4.723E+0, 5.311E+0, 1.722E+4, 5.370E+2, 2.913E-3},
551 {5.319E+0, 5.982E+0, 1.740E+4, 5.863E+2, 2.871E-3},
552 {5.956E+0, 6.700E+0, 1.780E+4, 6.770E+2, 2.660E-3},
553 {6.158E+0, 6.928E+0, 1.777E+4, 5.863E+2, 2.812E-3},
554 {6.203E+0, 6.979E+0, 1.795E+4, 5.863E+2, 2.776E-3},
555 {6.181E+0, 6.954E+0, 1.812E+4, 5.863E+2, 2.748E-3},
556 {6.949E+0, 7.820E+0, 1.830E+4, 5.863E+2, 2.737E-3},
557 {7.506E+0, 8.448E+0, 1.848E+4, 5.863E+2, 2.727E-3},
558 {7.648E+0, 8.609E+0, 1.866E+4, 5.863E+2, 2.697E-3},
559 {7.711E+0, 8.679E+0, 1.883E+4, 5.863E+2, 2.641E-3},
561 {7.407E+0, 8.336E+0, 1.901E+4, 5.863E+2, 2.603E-3},
562 {7.290E+0, 8.204E+0, 1.918E+4, 5.863E+2, 2.673E-3}
568 if ( T < 40.0 && 5 == i) {
573 }
else if ( T < 10.0 ) {
580 G4double shigh =
G4Log( 1.0 + a[i][3]/T + a[i][4]*T ) * a[i][2]/T ;
581 ionloss = slow*shigh*fac / (slow + shigh) ;
583 if ( ionloss < 0.0) { ionloss = 0.0; }
607 const G4double* theAtomicNumDensityVector =
620 }
else if(1 == numberOfElements) {
636 for (
G4int i=0; i<numberOfElements; i++) {
637 const G4Element* element = (*theElementVector)[i] ;
640 * theAtomicNumDensityVector[i] ;
642 * theAtomicNumDensityVector[i] ;
654 for (
G4int i=0; i<numberOfElements; i++)
656 const G4Element* element = (*theElementVector)[i] ;
658 * theAtomicNumDensityVector[i];
674 if (myFormula == chFormula ) {
return false; }
684 if( theState ==
kStateGas && myFormula == chFormula)
return false ;
688 static const G4double HeEff = 2.8735 ;
691 static const G4String nameOfMol[53] = {
692 "H_2O",
"C_2H_4O",
"C_3H_6O",
"C_2H_2",
"C_H_3OH",
693 "C_2H_5OH",
"C_3H_7OH",
"C_3H_4",
"NH_3",
"C_14H_10",
694 "C_6H_6",
"C_4H_10",
"C_4H_6",
"C_4H_8O",
"CCl_4",
695 "CF_4",
"C_6H_8",
"C_6H_12",
"C_6H_10O",
"C_6H_10",
696 "C_8H_16",
"C_5H_10",
"C_5H_8",
"C_3H_6-Cyclopropane",
"C_2H_4F_2",
697 "C_2H_2F_2",
"C_4H_8O_2",
"C_2H_6",
"C_2F_6",
"C_2H_6O",
698 "C_3H_6O",
"C_4H_10O",
"C_2H_4",
"C_2H_4O",
"C_2H_4S",
699 "SH_2",
"CH_4",
"CCLF_3",
"CCl_2F_2",
"CHCl_2F",
700 "(CH_3)_2S",
"N_2O",
"C_5H_10O",
"C_8H_6",
"(CH_2)_N",
701 "(C_3H_6)_N",
"(C_8H_8)_N",
"C_3H_8",
"C_3H_6-Propylene",
"C_3H_6O",
702 "C_3H_6S",
"C_4H_4S",
"C_7H_8"
706 66.1, 190.4, 258.7, 42.2, 141.5,
707 210.9, 279.6, 198.8, 31.0, 267.5,
708 122.8, 311.4, 260.3, 328.9, 391.3,
709 206.6, 374.0, 422.0, 432.0, 398.0,
710 554.0, 353.0, 326.0, 74.6, 220.5,
711 197.4, 362.0, 170.0, 330.5, 211.3,
712 262.3, 349.6, 51.3, 187.0, 236.9,
713 121.9, 35.8, 247.0, 292.6, 268.0,
714 262.3, 49.0, 398.9, 444.0, 22.91,
715 68.0, 155.0, 84.0, 74.2, 254.7,
719 static const G4double expCharge[53] = {
720 HeEff, HeEff, HeEff, 1.0, HeEff,
721 HeEff, HeEff, HeEff, 1.0, 1.0,
722 1.0, HeEff, HeEff, HeEff, HeEff,
723 HeEff, HeEff, HeEff, HeEff, HeEff,
724 HeEff, HeEff, HeEff, 1.0, HeEff,
725 HeEff, HeEff, HeEff, HeEff, HeEff,
726 HeEff, HeEff, 1.0, HeEff, HeEff,
727 HeEff, 1.0, HeEff, HeEff, HeEff,
728 HeEff, 1.0, HeEff, HeEff, 1.0,
729 1.0, 1.0, 1.0, 1.0, HeEff,
733 static const G4double numberOfAtomsPerMolecula[53] = {
734 3.0, 7.0, 10.0, 4.0, 6.0,
735 9.0, 12.0, 7.0, 4.0, 24.0,
736 12.0, 14.0, 10.0, 13.0, 5.0,
737 5.0, 14.0, 18.0, 17.0, 17.0,
738 24.0, 15.0, 13.0, 9.0, 8.0,
739 6.0, 14.0, 8.0, 8.0, 9.0,
740 10.0, 15.0, 6.0, 7.0, 7.0,
741 3.0, 5.0, 5.0, 5.0, 5.0,
742 9.0, 3.0, 16.0, 14.0, 3.0,
743 9.0, 16.0, 11.0, 9.0, 10.0,
750 if(chFormula == nameOfMol[i]) {
753 (expCharge[i] * numberOfAtomsPerMolecula[i]) ;
771 G4double gamma = 1.0 + kineticEnergy/proton_mass_c2 ;
772 G4double gamma25 = 1.0 + 25.0*
keV /proton_mass_c2 ;
773 G4double gamma125 = 1.0 + 125.0*
keV/proton_mass_c2 ;
774 G4double beta = sqrt(1.0 - 1.0/(gamma*gamma)) ;
775 G4double beta25 = sqrt(1.0 - 1.0/(gamma25*gamma25)) ;
776 G4double beta125 = sqrt(1.0 - 1.0/(gamma125*gamma125)) ;
779 (1.0 +
G4Exp( 1.48 * ( beta125/beta25 - 7.0 ) ) ) /
780 (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)
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)
static const G4int numberOfMolecula
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)
G4double GetElectronicDEDX(G4int idx, G4double energy) const
G4VEmFluctuationModel * GetModelOfFluctuations()
G4double GetChargeSquareRatio() const
const G4ElementVector * GetElementVector() const
const G4String & GetParticleName() const
static G4PSTARStopping * fPSTAR
G4ParticleChangeForLoss * fParticleChange
void SetHighEnergyLimit(G4double)
G4double GetTotalMomentum() const
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
static const G4double factor
G4double GetPDGMass() const
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
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()
static const G4double fac
G4int GetIndex(const G4Material *) const
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