181 if(cutEnergy < tmax) {
185 const G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*
mass)/energy2;
187 cross = (maxEnergy - cutEnergy)/(cutEnergy*maxEnergy)
188 - beta2*
G4Log(maxEnergy/cutEnergy)/tmax;
189 if( 0.0 <
spin ) { cross += 0.5*(maxEnergy - cutEnergy)/energy2; }
229 material->GetTotNbOfAtomsPerVolume();
249 material->GetTotNbOfAtomsPerVolume();
264 (
G4Log(x)*(tau + 1.)*(tau + 1.)/(tau * (tau + 2.0)) + 1.0 - x) *
287 if(eloss >= preKinEnergy) {
return; }
291 if(!
isIon) {
return; }
318 if(xmin >= xmax) {
return; }
323 const G4double beta2 = kineticEnergy*(kineticEnergy + 2.0*
mass)/energy2;
333 deltaKinEnergy = xmin*xmax/(xmin*(1.0 - rndm[0]) + xmax*rndm[0]);
335 f = 1.0 - beta2*deltaKinEnergy/tmax;
338 G4cout <<
"G4BraggIonModel::SampleSecondary Warning! "
339 <<
"Majorant " << grej <<
" < "
340 << f <<
" for e= " << deltaKinEnergy
345 }
while( grej*rndm[1] >= f );
362 if(cost > 1.0) { cost = 1.0; }
363 G4double sint = sqrt((1.0 - cost)*(1.0 + cost));
367 deltaDirection.
set(sint*cos(phi),sint*sin(phi), cost) ;
375 vdp->push_back(delta);
378 kineticEnergy -= deltaKinEnergy;
380 finalP = finalP.
unit();
417 if(chFormula.empty()) {
return -1; }
423 "CaF_2",
"Cellulose_Nitrate",
"LiF",
"Policarbonate",
424 "(C_2H_4)_N-Polyethylene",
"(C_2H_4)_N-Polymethly_Methacralate",
425 "Polysterene",
"SiO_2",
"NaI",
"H_2O",
430 if (chFormula == molName[i]) {
454 static const G4float a[11][5] = {
455 {9.43672f, 0.54398f, 84.341f, 1.3705f, 57.422f},
456 {67.1503f, 0.41409f, 404.512f, 148.97f, 20.99f},
457 {5.11203f, 0.453f, 36.718f, 50.6f, 28.058f},
458 {61.793f, 0.48445f, 361.537f, 57.889f, 50.674f},
459 {7.83464f, 0.49804f, 160.452f, 3.192f, 0.71922f},
460 {19.729f, 0.52153f, 162.341f, 58.35f, 25.668f},
461 {26.4648f, 0.50112f, 188.913f, 30.079f, 16.509f},
462 {7.8655f, 0.5205f, 63.96f, 51.32f, 67.775f},
463 {8.8965f, 0.5148f, 339.36f, 1.7205f, 0.70423f},
464 {2.959f, 0.53255f, 34.247f, 60.655f, 15.153f},
465 {3.80133f, 0.41590f, 12.9966f, 117.83f, 242.28f} };
467 static const G4double atomicWeight[11] = {
468 101.96128f, 44.0098f, 16.0426f, 28.0536f, 42.0804f,
469 104.1512f, 44.665f, 60.0843f, 18.0152f, 18.0152f, 12.0f};
482 G4double shigh =
G4Log( 1.0 + x3*1000.0 + x4*0.001 ) *x2*1000.0;
483 ionloss = slow*shigh / (slow + shigh) ;
484 ionloss *= sqrt(T*1000.0) ;
490 ionloss = slow*shigh / (slow + shigh) ;
505 }
else if(1 == (
material->GetNumberOfElements())) {
530 static const G4float a[92][5] = {
531 { 0.35485f, 0.6456f, 6.01525f, 20.8933f, 4.3515f
532 },{ 0.58f, 0.59f, 6.3f, 130.0f, 44.07f
533 },{ 1.42f, 0.49f, 12.25f, 32.0f, 9.161f
534 },{ 2.206f, 0.51f, 15.32f, 0.25f, 8.995f
536 },{ 3.691f, 0.4128f, 18.48f, 50.72f, 9.0f
537 },{ 3.83523f, 0.42993f,12.6125f, 227.41f, 188.97f
539 },{ 1.9259f, 0.5550f, 27.1513f, 26.0665f, 6.2768f
540 },{ 2.81015f, 0.4759f, 50.0253f, 10.556f, 1.0382f
541 },{ 1.533f, 0.531f, 40.44f, 18.41f, 2.718f
542 },{ 2.303f, 0.4861f, 37.01f, 37.96f, 5.092f
544 },{ 9.894f, 0.3081f, 23.65f, 0.384f, 92.93f
545 },{ 4.3f, 0.47f, 34.3f, 3.3f, 12.74f
546 },{ 2.5f, 0.625f, 45.7f, 0.1f, 4.359f
547 },{ 2.1f, 0.65f, 49.34f, 1.788f, 4.133f
548 },{ 1.729f, 0.6562f, 53.41f, 2.405f, 3.845f
549 },{ 1.402f, 0.6791f, 58.98f, 3.528f, 3.211f
550 },{ 1.117f, 0.7044f, 69.69f, 3.705f, 2.156f
551 },{ 2.291f, 0.6284f, 73.88f, 4.478f, 2.066f
552 },{ 8.554f, 0.3817f, 83.61f, 11.84f, 1.875f
553 },{ 6.297f, 0.4622f, 65.39f, 10.14f, 5.036f
555 },{ 5.307f, 0.4918f, 61.74f, 12.4f, 6.665f
556 },{ 4.71f, 0.5087f, 65.28f, 8.806f, 5.948f
557 },{ 6.151f, 0.4524f, 83.0f, 18.31f, 2.71f
558 },{ 6.57f, 0.4322f, 84.76f, 15.53f, 2.779f
559 },{ 5.738f, 0.4492f, 84.6f, 14.18f, 3.101f
560 },{ 5.013f, 0.4707f, 85.8f, 16.55f, 3.211f
561 },{ 4.32f, 0.4947f, 76.14f, 10.85f, 5.441f
562 },{ 4.652f, 0.4571f, 80.73f, 22.0f, 4.952f
563 },{ 3.114f, 0.5236f, 76.67f, 7.62f, 6.385f
564 },{ 3.114f, 0.5236f, 76.67f, 7.62f, 7.502f
566 },{ 3.114f, 0.5236f, 76.67f, 7.62f, 8.514f
567 },{ 5.746f, 0.4662f, 79.24f, 1.185f, 7.993f
568 },{ 2.792f, 0.6346f, 106.1f, 0.2986f, 2.331f
569 },{ 4.667f, 0.5095f, 124.3f, 2.102f, 1.667f
570 },{ 2.44f, 0.6346f, 105.0f, 0.83f, 2.851f
571 },{ 1.413f, 0.7377f, 147.9f, 1.466f, 1.016f
572 },{ 11.72f, 0.3826f, 102.8f, 9.231f, 4.371f
573 },{ 7.126f, 0.4804f, 119.3f, 5.784f, 2.454f
574 },{ 11.61f, 0.3955f, 146.7f, 7.031f, 1.423f
575 },{ 10.99f, 0.41f, 163.9f, 7.1f, 1.052f
577 },{ 9.241f, 0.4275f, 163.1f, 7.954f, 1.102f
578 },{ 9.276f, 0.418f, 157.1f, 8.038f, 1.29f
579 },{ 3.999f, 0.6152f, 97.6f, 1.297f, 5.792f
580 },{ 4.306f, 0.5658f, 97.99f, 5.514f, 5.754f
581 },{ 3.615f, 0.6197f, 86.26f, 0.333f, 8.689f
582 },{ 5.8f, 0.49f, 147.2f, 6.903f, 1.289f
583 },{ 5.6f, 0.49f, 130.0f, 10.0f, 2.844f
584 },{ 3.55f, 0.6068f, 124.7f, 1.112f, 3.119f
585 },{ 3.6f, 0.62f, 105.8f, 0.1692f, 6.026f
586 },{ 5.4f, 0.53f, 103.1f, 3.931f, 7.767f
588 },{ 3.97f, 0.6459f, 131.8f, 0.2233f, 2.723f
589 },{ 3.65f, 0.64f, 126.8f, 0.6834f, 3.411f
590 },{ 3.118f, 0.6519f, 164.9f, 1.208f, 1.51f
591 },{ 3.949f, 0.6209f, 200.5f, 1.878f, 0.9126f
592 },{ 14.4f, 0.3923f, 152.5f, 8.354f, 2.597f
593 },{ 10.99f, 0.4599f, 138.4f, 4.811f, 3.726f
594 },{ 16.6f, 0.3773f, 224.1f, 6.28f, 0.9121f
595 },{ 10.54f, 0.4533f, 159.3f, 4.832f, 2.529f
596 },{ 10.33f, 0.4502f, 162.0f, 5.132f, 2.444f
597 },{ 10.15f, 0.4471f, 165.6f, 5.378f, 2.328f
599 },{ 9.976f, 0.4439f, 168.0f, 5.721f, 2.258f
600 },{ 9.804f, 0.4408f, 176.2f, 5.675f, 1.997f
601 },{ 14.22f, 0.363f, 228.4f, 7.024f, 1.016f
602 },{ 9.952f, 0.4318f, 233.5f, 5.065f, 0.9244f
603 },{ 9.272f, 0.4345f, 210.0f, 4.911f, 1.258f
604 },{ 10.13f, 0.4146f, 225.7f, 5.525f, 1.055f
605 },{ 8.949f, 0.4304f, 213.3f, 5.071f, 1.221f
606 },{ 11.94f, 0.3783f, 247.2f, 6.655f, 0.849f
607 },{ 8.472f, 0.4405f, 195.5f, 4.051f, 1.604f
608 },{ 8.301f, 0.4399f, 203.7f, 3.667f, 1.459f
610 },{ 6.567f, 0.4858f, 193.0f, 2.65f, 1.66f
611 },{ 5.951f, 0.5016f, 196.1f, 2.662f, 1.589f
612 },{ 7.495f, 0.4523f, 251.4f, 3.433f, 0.8619f
613 },{ 6.335f, 0.4825f, 255.1f, 2.834f, 0.8228f
614 },{ 4.314f, 0.5558f, 214.8f, 2.354f, 1.263f
615 },{ 4.02f, 0.5681f, 219.9f, 2.402f, 1.191f
616 },{ 3.836f, 0.5765f, 210.2f, 2.742f, 1.305f
617 },{ 4.68f, 0.5247f, 244.7f, 2.749f, 0.8962f
618 },{ 2.892f, 0.6204f, 208.6f, 2.415f, 1.416f
620 },{ 2.892f, 0.6204f, 208.6f, 2.415f, 1.416f
622 },{ 4.728f, 0.5522f, 217.0f, 3.091f, 1.386f
623 },{ 6.18f, 0.52f, 170.0f, 4.0f, 3.224f
624 },{ 9.0f, 0.47f, 198.0f, 3.8f, 2.032f
625 },{ 2.324f, 0.6997f, 216.0f, 1.599f, 1.399f
626 },{ 1.961f, 0.7286f, 223.0f, 1.621f, 1.296f
627 },{ 1.75f, 0.7427f, 350.1f, 0.9789f, 0.5507f
628 },{ 10.31f, 0.4613f, 261.2f, 4.738f, 0.9899f
629 },{ 7.962f, 0.519f, 235.7f, 4.347f, 1.313f
630 },{ 6.227f, 0.5645f, 231.9f, 3.961f, 1.379f
631 },{ 5.246f, 0.5947f, 228.6f, 4.027f, 1.432f
633 },{ 5.408f, 0.5811f, 235.7f, 3.961f, 1.358f
634 },{ 5.218f, 0.5828f, 245.0f, 3.838f, 1.25f}
646 G4double shigh =
G4Log( 1.0 + x3*1000.0 + x4*0.001 )* x2*1000.0;
647 ionloss = slow*shigh*std::sqrt(T*1000.0) / (slow + shigh) ;
653 ionloss = slow*shigh / (slow + shigh) ;
699 if(eloss > 0.0) {
return eloss*
material->GetDensity(); }
709 if(eloss > 0.0) {
return eloss*
material->GetDensity(); }
712 const G4int numberOfElements =
material->GetNumberOfElements();
713 const G4double* theAtomicNumDensityVector =
714 material->GetAtomicNumDensityVector();
721 }
else if(1 == numberOfElements) {
725 * (
material->GetTotNbOfAtomsPerVolume());
732 for (
G4int i=0; i<numberOfElements; ++i) {
733 const G4Element* element = (*theElmVector)[i];
735 * theAtomicNumDensityVector[i];
745 const G4double kinEnergyHeInMeV)
const
752 static const G4double c[6] = {0.2865, 0.1266, -0.001429,
753 0.02402,-0.01135, 0.001475};
758 for (
G4int i=1; i<6; ++i) {
764 w = 1.0 + (0.007 + 0.00005*z) *
G4Exp( -w*w ) ;
765 w = 4.0 * (1.0 -
G4Exp(-x)) * w * w ;
std::vector< const G4Element * > G4ElementVector
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
static const G4int numberOfMolecula
static constexpr double twopi
static constexpr double cm2
static constexpr double keV
static constexpr double eV
static constexpr double GeV
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
G4int GetIndex(const G4Material *) const
G4double GetElectronicDEDX(G4int idx, G4double energy) const
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4double ComputeCrossSectionPerElectron(const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy)
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
G4double MinEnergyCut(const G4ParticleDefinition *, const G4MaterialCutsCouple *couple) override
void SetParticle(const G4ParticleDefinition *p)
G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy) override
static G4ASTARStopping * fASTAR
G4double GetChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy) override
~G4BraggIonModel() override
G4double DEDX(const G4Material *material, const G4double kinEnergy)
G4double MaxSecondaryEnergy(const G4ParticleDefinition *, G4double kinEnergy) final
const G4ParticleDefinition * theElectron
G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy) override
G4double StoppingPower(const G4Material *material, const G4double kinEnergy) const
G4double HeEffChargeSquare(const G4double z, const G4double kinEnergyInMeV) const
const G4Material * currentMaterial
G4double GetParticleCharge(const G4ParticleDefinition *p, const G4Material *mat, G4double kineticEnergy) override
G4BraggIonModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="BraggIon")
const G4ParticleDefinition * particle
G4int HasMaterial(const G4Material *material) const
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kineticEnergy, G4double Z, G4double A, G4double cutEnergy, G4double maxEnergy) override
void CorrectionsAlongStep(const G4MaterialCutsCouple *, const G4DynamicParticle *, const G4double &length, G4double &eloss) override
G4double theZieglerFactor
G4double ElectronicStoppingPower(const G4double z, const G4double kinEnergy) const
G4ICRU90StoppingData * fICRU90
G4ParticleChangeForLoss * fParticleChange
const G4Material * baseMaterial
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
G4ThreeVector GetMomentum() const
G4double GetTotalMomentum() const
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()
G4int GetIndex(const G4Material *) const
G4double GetElectronicDEDXforAlpha(const G4Material *, G4double scaledKinEnergy) 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()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedMomentumDirection(const G4ThreeVector &dir)
G4double GetPDGMass() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const
G4double GetPDGSpin() 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 eplus
static constexpr double electron_mass_c2
static constexpr double amu_c2
static constexpr double proton_mass_c2
static constexpr double MeV
static constexpr double twopi_mc2_rcl2
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