77 fCof = fine_structure_const/hbarc/pi;
86 fNat = fMat->GetTotNbOfAtomsPerVolume();
88 fNel = fMat->GetTotNbOfElectPerVolume();
92 fParticleChange =
nullptr;
99 if(
nullptr == fParticleChange)
122 if(fBetaVector)
delete fBetaVector;
123 if(fTransferVector)
delete fTransferVector;
126 fPrEnergyTable->clearAndDestroy();
127 delete fPrEnergyTable;
131 fElEnergyTable->clearAndDestroy();
132 delete fElEnergyTable;
141 if(
nullptr == fParticleChange)
155 if(
nullptr == fParticleChange)
168 if(
nullptr == fParticleChange )
186 for( i = 0; i < nn; ++i )
190 ruth = theRuthSum[i];
192 fELFsum.push_back(elf);
193 fRuthSum.push_back(ruth);
204 else G4cout<<
" G4LowPAIH2O::BuildPhysicsTable is not applicable for "
221 if( pd == theProton ) dNdx =
GetPrdNdx( Tkin );
222 else if( pd == theElectron ) dNdx =
GetEldNdx( Tkin );
223 else G4cout<<
" G4LowPAIH2O::CrossSectionPerVolume is not applicable for "
258 G4int iBeta(0), iTransfer(0);
260 G4double tp(0.), sum(0.), tmp(0.), mp = proton_mass_c2;
265 for( iBeta = 0; iBeta < fTotBin; ++iBeta )
267 be = fBetaVector->GetLowEdgeEnergy(iBeta);
270 gg = sqrt( 1./( 1. - be2 ) );
273 if( fWmax <= fWmin ) fWmax = fWmin*1.01;
275 fPrWmaxVector.push_back(fWmax);
277 fTransferVector->PutValue(fBinTr-1,sum);
279 for( iTransfer = fBinTr-2; iTransfer >= 0; --iTransfer)
282 fTransferVector->GetLowEdgeEnergy(iTransfer),
283 fTransferVector->GetLowEdgeEnergy(iTransfer+1)
287 fTransferVector->PutValue(iTransfer,sum);
289 fPrEnergyTable->insertAt(iBeta, fTransferVector);
299 G4int iBeta(0), iTransfer(0);
300 G4double be(0.), be2(0.), gg(1.), mp = proton_mass_c2;
301 G4double rr1(0.), rr2(0.), tr1(0.), tr2(0.), transfer(0.);
305 if( be2 < 0. ) be2 = 0.;
308 for( iBeta = 0; iBeta < fTotBin; ++iBeta )
310 if( be <= fBetaVector->GetLowEdgeEnergy(iBeta) )
break;
312 if (iBeta == 0 || iBeta == fTotBin-1)
316 for( iTransfer = fBinTr-2; iTransfer >= 0; --iTransfer)
318 if( (*(*fPrEnergyTable)(iBeta))(iTransfer) >= rr1 )
break;
320 if( iTransfer == 0 || iTransfer == fBinTr-2 )
322 transfer = (*fPrEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer);
326 tr1 = (*fPrEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer-1);
327 tr2 = (*fPrEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer);
335 for( iTransfer = fBinTr-2; iTransfer >= 0; --iTransfer)
337 if( (*(*fPrEnergyTable)(iBeta-1))(iTransfer) >= rr1 )
break;
339 if( iTransfer == 0 || iTransfer == fBinTr-2 )
341 transfer = (*fPrEnergyTable)(iBeta-1)->GetLowEdgeEnergy(iTransfer);
345 tr1 = (*fPrEnergyTable)(iBeta-1)->GetLowEdgeEnergy(iTransfer-1);
346 tr2 = (*fPrEnergyTable)(iBeta-1)->GetLowEdgeEnergy(iTransfer);
351 for( iTransfer = fBinTr-2; iTransfer >= 0; --iTransfer)
353 if( (*(*fPrEnergyTable)(iBeta))(iTransfer) >= rr2 )
break;
355 if( iTransfer == 0 || iTransfer == fBinTr-2 )
357 transfer = (*fPrEnergyTable)(iBeta-1)->GetLowEdgeEnergy(iTransfer);
361 tr1 = (*fPrEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer-1);
362 tr2 = (*fPrEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer);
386 if( Tkin >= T2 ) yy = kk/pow( rat2, 0.15);
387 else if( Tkin <= T1) yy = kk/pow( rat1, 0.75);
407 if( Tkin >= T2 ) yy = kk/pow( rat2, 0.2);
408 else if( Tkin <= T1) yy = kk*pow( rat1, 0.9);
420 G4double be(0.), be2(0.), gg(1.), mp = proton_mass_c2;
421 G4double rr1(0.), rr2(0.), dndx(0.);
424 if(be2 < 0.) be2 = 0.;
426 for( iBeta = 0; iBeta < fTotBin; ++iBeta )
428 if( be <= fBetaVector->GetLowEdgeEnergy(iBeta) )
break;
432 dndx = (*(*fPrEnergyTable)(0))(0);
434 else if (iBeta >= fTotBin-1)
436 dndx = (*(*fPrEnergyTable)(fTotBin-1))(0);
440 rr1 = (*(*fPrEnergyTable)(iBeta-1))(0);
441 rr2 = (*(*fPrEnergyTable)(iBeta))(0);
453 if( dndx > 0.) mfp = 1./dndx;
464 G4double be(0.), be2(0.), gg(1.), me = electron_mass_c2;
465 G4double rr1(0.), rr2(0.), dndx(0.);
468 if(be2 < 0.) be2 = 0.;
470 for( iBeta = 0; iBeta < fTotBin; ++iBeta )
472 if( be <= fBetaVector->GetLowEdgeEnergy(iBeta) )
break;
476 dndx = (*(*fElEnergyTable)(0))(0);
478 else if (iBeta >= fTotBin-1)
480 dndx = (*(*fElEnergyTable)(fTotBin-1))(0);
484 rr1 = (*(*fElEnergyTable)(iBeta-1))(0);
485 rr2 = (*(*fElEnergyTable)(iBeta))(0);
497 if( dndx > 0.) mfp = 1./dndx;
507 G4int iBeta(0), iTransfer(0);
509 G4double tp(0.), sum(0.), tmp(0.), me = electron_mass_c2;
514 for( iBeta = 0; iBeta < fTotBin; ++iBeta )
516 be = fBetaVector->GetLowEdgeEnergy(iBeta);
519 gg = sqrt( 1./( 1. - be2 ) );
522 if( fWmax <= fWmin ) fWmax = fWmin*1.01;
526 fTransferVector->PutValue( fBinTr-1, sum );
528 for( iTransfer = fBinTr-2; iTransfer >= 0; --iTransfer)
531 fTransferVector->GetLowEdgeEnergy(iTransfer),
532 fTransferVector->GetLowEdgeEnergy(iTransfer+1)
537 fTransferVector->PutValue( iTransfer, sum );
539 fElEnergyTable->insertAt( iBeta, fTransferVector );
559 d2Ndxdw *= log( 2*me*be2/omega );
575 G4int iBeta, iTransfer;
576 G4double be(0.), be2(0.), gg(1.), me = electron_mass_c2;
577 G4double rr1(0.), rr2(0.), tr1(0.), tr2(0.), transfer(0.);
581 if( be2 < 0.) be2 = 0.;
584 for( iBeta = 0; iBeta < fTotBin; ++iBeta )
586 if( be <= fBetaVector->GetLowEdgeEnergy(iBeta) )
break;
588 if (iBeta == 0 || iBeta == fTotBin-1)
592 for( iTransfer = fBinTr-2; iTransfer >= 0; --iTransfer)
594 if( (*(*fElEnergyTable)(iBeta))(iTransfer) >= rr1 )
break;
596 if( iTransfer == 0 || iTransfer == fBinTr-2 )
598 transfer = (*fElEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer);
602 tr1 = (*fElEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer-1);
603 tr2 = (*fElEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer);
611 for( iTransfer = fBinTr-2; iTransfer >= 0; --iTransfer)
613 if( (*(*fElEnergyTable)(iBeta-1))(iTransfer) >= rr1 )
break;
615 if( iTransfer == 0 || iTransfer == fBinTr-2 )
617 transfer = (*fElEnergyTable)(iBeta-1)->GetLowEdgeEnergy(iTransfer);
621 tr1 = (*fElEnergyTable)(iBeta-1)->GetLowEdgeEnergy(iTransfer-1);
622 tr2 = (*fElEnergyTable)(iBeta-1)->GetLowEdgeEnergy(iTransfer);
627 for( iTransfer = fBinTr-2; iTransfer >= 0; --iTransfer)
629 if( (*(*fElEnergyTable)(iBeta))(iTransfer) >= rr2 )
break;
631 if( iTransfer == 0 || iTransfer == fBinTr-2 )
633 transfer = (*fElEnergyTable)(iBeta-1)->GetLowEdgeEnergy(iTransfer);
637 tr1 = (*fElEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer-1);
638 tr2 = (*fElEnergyTable)(iBeta)->GetLowEdgeEnergy(iTransfer);
644 if( transfer < 0. )
return 0.;
659 d2Ndxdw *= log( 2*me*be2/omega );
678 if( pd == theProton ) deltaTkin =
GetPrTransfer(kineticEnergy);
679 else if( pd == theElectron ) deltaTkin =
GetElTransfer(kineticEnergy);
682 G4cout<<
" G4LowPAIH2O::SampleSecondaries is not applicable for "
688 G4double totalMomentum = sqrt( kineticEnergy*( kineticEnergy + 2.*fMass ) );
690 if( !(deltaTkin <= 0.) && !(deltaTkin > 0))
692 G4cout<<
"G4LowPAIH2O::SampleSecondaries; deltaTkin = "<<deltaTkin/keV
693 <<
" keV "<<
" for Tkin(MeV)= " << kineticEnergy <<
G4endl;
698 G4cout<<deltaTkin/eV<<
"-"<<kineticEnergy/MeV<<
", ";
701 if( kineticEnergy > deltaTkin) kineticEnergy -= deltaTkin;
704 deltaTkin = kineticEnergy;
707 G4double momD = sqrt( deltaTkin*( deltaTkin + 2.*electron_mass_c2 ) );
711 direction = dir.
unit();
712 fParticleChange->SetProposedKineticEnergy(kineticEnergy);
713 fParticleChange->SetProposedMomentumDirection(direction);
715 if( deltaTkin < eV * 1.)
717 fParticleChange->ProposeLocalEnergyDeposit(deltaTkin);
722 vdp->push_back( deltaRay );
736 G4double eloss(0.), mfp(0.), sumW(0.), sumL(0.), transfer(0.);
740 if( pd != theProton && pd != theElectron)
746 if( pd == theProton )
755 if( Tkin >= transfer ) Tkin -= transfer;
762 while( sumL <= length && Tkin >= keV * 0.01 );
764 else if( pd == theElectron )
774 while( sumL <= length && Tkin >= 0. );
777 if(eloss < 0.) { eloss = 0.; }
778 fParticleChange->SetProposedKineticEnergy( Tkin );
779 fParticleChange->ProposeLocalEnergyDeposit( eloss );
796 if ( pd == theProton ) mfp =
GetPrMFP(Tkin);
797 else if( pd == theElectron ) mfp =
GetElMFP(Tkin);
805 if( pd == theProton )
807 for (
G4int nn = 0; nn < NN; ++nn )
814 for (
G4int nn = 0; nn < NN; ++nn )
819 if( sumW < Tkin ) eloss = sumW;
822 fParticleChange->ProposeLocalEnergyDeposit(eloss);
823 fParticleChange->SetProposedKineticEnergy(Tkin);
881 if( Tkin < Et ) rateMass = 1.;
884 /( 1. + 2.*gamma*rateMass + rateMass*rateMass );
G4ThreeVector G4RandomDirection()
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
static long shoot(double mean=1.0)
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy) override
G4double GetPrMFP(G4double Tkin)
void BuildPrEnergyTable()
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
G4double GetElectronTmax(G4double Tkin)
G4double GetSumELF(G4double energy)
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *masterModel) override
void BuildPhysicsTable(const G4ParticleDefinition *pd)
G4double PrPAId2Ndxdw(G4double omega)
G4double CrossSectionPerAtom(const G4ParticleDefinition *, G4double kineticEnergy, G4double Z, G4double A, G4double cutEnergy, G4double maxEnergy)
G4double GetProtonTmax(G4double Tkin)
G4double CorrectElTransfer(G4double Tkin)
G4double SampleFluctuations(const G4MaterialCutsCouple *, const G4DynamicParticle *, const G4double tcut, const G4double tmax, const G4double length, const G4double meanLoss) override
G4double GetElMFP(G4double Tkin)
G4double GetPrdNdx(G4double Tkin)
void SetBe2(G4double be2)
G4double GetElTransfer(G4double Tkin)
void BuildElEnergyTable()
G4double ElPAId2Ndxdw(G4double omega)
G4LowPAIH2O(const G4ParticleDefinition *p=nullptr, const G4String &nam="lowpaih2o")
G4double GetSumRuth(G4double energy)
G4double CorrectPrTransfer(G4double Tkin)
G4double GetPrTransfer(G4double Tkin)
void CorrectionsAlongStep(const G4Material *, const G4ParticleDefinition *, const G4double kinEnergy, const G4double cutEnergy, const G4double &length, G4double &eloss) override
G4double GetEldNdx(G4double Tkin)
virtual G4double ComputeCrossSectionPerElectron(const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy)
G4double GetElectronDensity() const
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
static G4NistManager * Instance()
G4double GetPDGMass() const
const G4String & GetParticleName() const
static G4Proton * Proton()
G4VEmFluctuationModel(const G4String &nam)
void SetElementSelectors(std::vector< G4EmElementSelector * > *)
std::vector< G4EmElementSelector * > * GetElementSelectors()
G4VEmModel(const G4String &nam)
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
G4ParticleChangeForLoss * GetParticleChangeForLoss()