86 minKinEnergy = 0.1*CLHEP::keV;
87 maxKinEnergy = 100.0*CLHEP::TeV;
90 invLambdaFactor = 1.0/lambdaFactor;
103 lManager->Register(
this);
120 lManager->DeRegister(
this);
128 if(
nullptr == ptr) {
return; }
130 modelManager->AddEmModel(order, ptr, fm, region);
138 if(
nullptr == ptr) {
return; }
139 if(!emModels.empty()) {
140 for(
auto & em : emModels) {
if(em == ptr) {
return; } }
142 emModels.push_back(ptr);
155 if(pname !=
"deuteron" && pname !=
"triton" &&
156 pname !=
"He3" && pname !=
"alpha" && pname !=
"alpha+" &&
157 pname !=
"helium" && pname !=
"hydrogen") {
163 if(particle != &part) {
return; }
165 lManager->PreparePhysicsTable(&part,
this);
182 if(!actMinKinEnergy) { minKinEnergy = theParameters->MinKinEnergy(); }
183 if(!actMaxKinEnergy) { maxKinEnergy = theParameters->MaxKinEnergy(); }
185 applyCuts = theParameters->ApplyCuts();
186 lambdaFactor = theParameters->LambdaFactor();
187 invLambdaFactor = 1.0/lambdaFactor;
188 theParameters->DefineRegParamForEM(
this);
197 if(buildLambdaTable) {
198 theLambdaTable = theData->MakeTable(0);
202 if(minKinEnergyPrim < maxKinEnergy) {
203 theLambdaTablePrim = theData->MakeTable(1);
209 numberOfModels = modelManager->NumberOfModels();
210 currentModel = modelManager->GetModel(0);
211 if(
nullptr != lManager->AtomDeexcitation()) {
212 modelManager->SetFluoFlag(
true);
222 modelManager, maxKinEnergy,
231 if(
nullptr == masterProc) {
235 G4int nModels = modelManager->NumberOfModels();
236 G4bool isLocked = theParameters->IsPrintLocked();
237 G4bool toBuild = (buildLambdaTable || minKinEnergyPrim < maxKinEnergy);
248 G4double scale = theParameters->MaxKinEnergy()/theParameters->MinKinEnergy();
250 theParameters->NumberOfBinsPerDecade()*
G4lrint(std::log10(scale));
251 if(actBinning) { nbin = std::max(nbin, nLambdaBins); }
252 scale = nbin/
G4Log(scale);
256 bld, theLambdaTable, theLambdaTablePrim,
257 minKinEnergy, minKinEnergyPrim,
259 startFromNull, splineFlag);
268 out << std::setprecision(6);
273 if(fXSType !=
fEmNoIntegral) { out <<
" XStype:" << fXSType; }
274 if(applyCuts) { out <<
" applyCuts:1 "; }
276 out <<
" SubType=" << subtype;
278 G4int mod = theParameters->PositronAtRestModelType();
279 const G4String namp[2] = {
"Simple",
"Allison"};
280 out <<
" AtRestModel:" << namp[mod];
282 if(biasFactor != 1.0) { out <<
" BiasingFactor=" << biasFactor; }
283 out <<
" BuildTable=" << buildLambdaTable <<
G4endl;
284 if(buildLambdaTable) {
285 if(particle == &part) {
286 for(
auto & v : *theLambdaTable) {
288 out <<
" Lambda table from ";
292 if(emin > minKinEnergy) { out <<
"threshold "; }
296 <<
", " <<
G4lrint(nbin/std::log10(emax/emin))
297 <<
" bins/decade, spline: "
303 out <<
" Used Lambda table of "
304 << particle->GetParticleName() <<
G4endl;
307 if(minKinEnergyPrim < maxKinEnergy) {
308 if(particle == &part) {
309 for(
auto & v : *theLambdaTablePrim) {
311 out <<
" LambdaPrime table from "
315 <<
" in " << v->GetVectorLength()-1
321 out <<
" Used LambdaPrime table of "
322 << particle->GetParticleName() <<
G4endl;
329 out <<
" LambdaTable address= " << theLambdaTable <<
G4endl;
330 if(theLambdaTable && particle == &part) {
331 out << (*theLambdaTable) <<
G4endl;
346 if(isIon) { massRatio = proton_mass_c2/currentParticle->GetPDGMass(); }
376 if(!currentModel->IsActive(scaledEnergy)) {
429void G4VEmProcess::ComputeIntegralLambda(
G4double e,
const G4Track& track)
455 const G4double e1 = std::max(epeak, e*lambdaFactor);
489 const G4double scaledEnergy = finalT*massRatio;
497 const G4double lx = std::max(GetCurrentLambda(finalT, logFinalT), 0.0);
500 G4cout <<
"WARNING: for " << currentParticle->GetParticleName()
503 <<
" < " << lx <<
" (postLambda) " <<
G4endl;
516 weight /= biasFactor;
522 G4cout <<
"G4VEmProcess::PostStepDoIt: Sample secondary; E= "
524 <<
" MeV; model= (" << currentModel->LowEnergyLimit()
525 <<
", " << currentModel->HighEnergyLimit() <<
")"
564 currentModel->FillNumberOfSecondaries(n1, n2);
567 for (
G4int i=0; i<num; ++i) {
577 }
else if (p == theElectron) {
580 }
else if (p == thePositron) {
584 e += 2.0*electron_mass_c2;
637 if(particle->GetProcessManager()->GetAtRestProcessVector()->size() > 0)
651 if(!
isTheMaster || part != particle) {
return true; }
656 directory,
"LambdaPrim",
669 if(!
isTheMaster || part != particle) {
return true; }
671 if(buildLambdaTable) {
676 if(yes && minKinEnergyPrim < maxKinEnergy) {
690 return GetCurrentLambda(kinEnergy,
G4Log(kinEnergy));
710 return (currentModel) ?
711 currentModel->ComputeCrossSectionPerAtom(currentParticle, kinEnergy,
722 nLambdaBins, splineFlag);
730 return (
nullptr != currentModel) ?
738 return (
nullptr != currentModel) ?
746 return (
nullptr != currentModel) ?
758 G4cout <<
"### SetCrossSectionBiasingFactor: for "
759 << particle->GetParticleName()
761 <<
" biasFactor= " << f <<
" weightFlag= " << flag
775 G4cout <<
"### ActivateForcedInteraction: for "
776 << particle->GetParticleName()
778 <<
" length(mm)= " << length/mm
779 <<
" in G4Region <" << r
780 <<
"> weightFlag= " << flag
801 biasManager->ActivateSecondaryBiasing(region, factor, energyLimit);
803 G4cout <<
"### ActivateSecondaryBiasing: for "
805 <<
" factor= " << factor
806 <<
" in G4Region <" << region
807 <<
"> energyLimit(MeV)= " << energyLimit/MeV
817 if(5 < n && n < 10000000) {
822 PrintWarning(
"SetLambdaBinning", e);
830 if(1.e-3*eV < e && e < maxKinEnergy) {
832 /
G4Log(maxKinEnergy/minKinEnergy));
834 actMinKinEnergy =
true;
835 }
else { PrintWarning(
"SetMinKinEnergy", e); }
842 if(minKinEnergy < e && e < 1.e+6*TeV) {
844 /
G4Log(maxKinEnergy/minKinEnergy));
846 actMaxKinEnergy =
true;
847 }
else { PrintWarning(
"SetMaxKinEnergy", e); }
854 if(theParameters->MinKinEnergy() <= e &&
855 e <= theParameters->
MaxKinEnergy()) { minKinEnergyPrim = e; }
856 else { PrintWarning(
"SetMinKinEnergyPrim", e); }
870 return theParameters->MscThetaLimit();
877 G4String ss =
"G4VEmProcess::" + tit;
879 ed <<
"Parameter is out of range: " << val
880 <<
" it will have no effect!\n" <<
" Process "
891 if(
nullptr != particle) {
G4double condition(const G4ErrorSymMatrix &m)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4double G4Log(G4double x)
G4GLOB_DLL std::ostream G4cout
G4double GetLogKineticEnergy() const
const G4ParticleDefinition * GetParticleDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
static G4EmParameters * Instance()
G4int NumberOfBins() const
G4double MinKinEnergy() const
G4double MaxKinEnergy() const
static void BuildEmProcess(G4VEmProcess *proc, const G4VEmProcess *masterProc, const G4ParticleDefinition *firstPart, const G4ParticleDefinition *part, const G4int nModels, const G4int verb, const G4bool master, const G4bool isLocked, const G4bool toBuild, G4bool &baseMat)
static G4bool RetrieveTable(G4VProcess *ptr, const G4ParticleDefinition *part, G4PhysicsTable *aTable, const G4String &dir, const G4String &tname, const G4int verb, const G4bool ascii, const G4bool spline)
static const G4DataVector * PrepareEmProcess(G4VEmProcess *proc, const G4ParticleDefinition *part, const G4ParticleDefinition *secPart, G4EmModelManager *modelManager, const G4double &maxKinEnergy, G4int &secID, G4int &tripletID, G4int &mainSec, const G4int &verb, const G4bool &master)
static G4bool StoreTable(G4VProcess *, const G4ParticleDefinition *, G4PhysicsTable *, const G4String &dir, const G4String &tname, G4int verb, G4bool ascii)
static void BuildLambdaTable(G4VEmProcess *proc, const G4ParticleDefinition *part, G4EmModelManager *modelManager, G4LossTableBuilder *bld, G4PhysicsTable *theLambdaTable, G4PhysicsTable *theLambdaTablePrim, const G4double minKinEnergy, const G4double minKinEnergyPrim, const G4double maxKinEnergy, const G4double scale, const G4int verbose, const G4bool startFromNull, const G4bool splineFlag)
static G4GenericIon * GenericIon()
static G4bool GetBaseMaterialFlag()
static const std::vector< G4double > * GetDensityFactors()
void InitialiseBaseMaterials(const G4PhysicsTable *table=nullptr)
static const std::vector< G4int > * GetCoupleIndexes()
static G4LossTableManager * Instance()
const G4String & GetParticleType() const
const G4String & GetParticleName() const
const G4String & GetParticleSubType() const
static G4Positron * Positron()
const std::vector< G4double > * GetEnergyCutsVector(std::size_t pcIdx) const
static G4ProductionCutsTable * GetProductionCutsTable()
G4double GetSafety() const
G4StepPoint * GetPostStepPoint() const
G4TrackStatus GetTrackStatus() const
const G4ParticleDefinition * GetParticleDefinition() const
void SetWeight(G4double aValue)
const G4ThreeVector & GetPosition() const
void SetTouchableHandle(const G4TouchableHandle &apValue)
G4double GetGlobalTime() const
const G4DynamicParticle * GetDynamicParticle() const
const G4TouchableHandle & GetTouchableHandle() const
G4double GetKineticEnergy() const
void SetCreatorModelID(const G4int id)
G4int GetParentID() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
G4VDiscreteProcess(const G4String &aName, G4ProcessType aType=fNotDefined)
void SetParticleChange(G4VParticleChange *, G4VEmFluctuationModel *f=nullptr)
void DefineMaterial(const G4MaterialCutsCouple *couple)
G4double MeanFreePath(const G4Track &track)
G4PhysicsVector * LambdaPhysicsVector(const G4MaterialCutsCouple *)
void CurrentSetup(const G4MaterialCutsCouple *, G4double energy)
virtual void StreamProcessInfo(std::ostream &) const
G4VEmProcess(const G4String &name, G4ProcessType type=fElectromagnetic)
G4EmBiasingManager * biasManager
void BuildPhysicsTable(const G4ParticleDefinition &) override
G4double ComputeCrossSectionPerAtom(G4double kineticEnergy, G4double Z, G4double A=0., G4double cut=0.0)
std::vector< G4double > * theEnergyOfCrossSectionMax
void SetMinKinEnergy(G4double e)
G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &) override
void StartTracking(G4Track *) override
G4double GetCrossSection(const G4double kinEnergy, const G4MaterialCutsCouple *couple) override
void AddEmModel(G4int, G4VEmModel *, const G4Region *region=nullptr)
void SetEmModel(G4VEmModel *, G4int index=0)
void SetCrossSectionBiasingFactor(G4double f, G4bool flag=true)
virtual void InitialiseProcess(const G4ParticleDefinition *)=0
void StreamInfo(std::ostream &outFile, const G4ParticleDefinition &, G4bool rst=false) const
void SetLambdaBinning(G4int nbins)
G4bool RetrievePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii) override
std::size_t currentCoupleIndex
void ProcessDescription(std::ostream &outFile) const override
G4double PostStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition) override
const G4Element * GetTargetElement() const
virtual G4VEmProcess * GetEmProcess(const G4String &name)
G4double MaxKinEnergy() const
const G4Isotope * GetTargetIsotope() const
std::vector< G4DynamicParticle * > secParticles
void ActivateForcedInteraction(G4double length=0.0, const G4String &r="", G4bool flag=true)
const G4MaterialCutsCouple * currentCouple
G4bool StorePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii=false) override
void ActivateSecondaryBiasing(const G4String ®ion, G4double factor, G4double energyLimit)
G4double preStepKinEnergy
G4double PolarAngleLimit() const
G4ParticleChangeForGamma fParticleChange
G4VEmModel * SelectModel(G4double kinEnergy, std::size_t)
void SetParticle(const G4ParticleDefinition *p)
void SetMinKinEnergyPrim(G4double e)
void PreparePhysicsTable(const G4ParticleDefinition &) override
void SetMaxKinEnergy(G4double e)
const G4Material * currentMaterial
const G4Element * GetCurrentElement() const
G4double GetMeanFreePath(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition) override
G4double currentInteractionLength
G4double theInitialNumberOfInteractionLength
void SetVerboseLevel(G4int value)
const G4VProcess * GetMasterProcess() const
G4double theNumberOfInteractionLengthLeft
G4VParticleChange * pParticleChange
G4int GetProcessSubType() const
const G4String & GetProcessName() const