86 minKinEnergy = 0.1*CLHEP::keV;
87 maxKinEnergy = 100.0*CLHEP::TeV;
90 invLambdaFactor = 1.0/lambdaFactor;
103 lManager->Register(
this);
119 lManager->DeRegister(
this);
127 if(
nullptr == ptr) {
return; }
129 modelManager->AddEmModel(order, ptr, fm, region);
137 if(
nullptr == ptr) {
return; }
138 if(!emModels.empty()) {
139 for(
auto & em : emModels) {
if(em == ptr) {
return; } }
141 emModels.push_back(ptr);
154 if(pname !=
"deuteron" && pname !=
"triton" &&
155 pname !=
"He3" && pname !=
"alpha" && pname !=
"alpha+" &&
156 pname !=
"helium" && pname !=
"hydrogen") {
162 if(particle != &part) {
return; }
164 lManager->PreparePhysicsTable(&part,
this);
181 if(!actMinKinEnergy) { minKinEnergy = theParameters->MinKinEnergy(); }
182 if(!actMaxKinEnergy) { maxKinEnergy = theParameters->MaxKinEnergy(); }
184 applyCuts = theParameters->ApplyCuts();
185 lambdaFactor = theParameters->LambdaFactor();
186 invLambdaFactor = 1.0/lambdaFactor;
187 theParameters->DefineRegParamForEM(
this);
194 if(buildLambdaTable) {
195 if (
nullptr == theData) { theData =
new G4EmDataHandler(2, particle->GetParticleName()); }
196 theLambdaTable = theData->MakeTable(theLambdaTable, 0);
200 if(minKinEnergyPrim < maxKinEnergy) {
201 if (
nullptr == theData) { theData =
new G4EmDataHandler(2, particle->GetParticleName()); }
202 theLambdaTablePrim = theData->MakeTable(theLambdaTablePrim, 1);
208 numberOfModels = modelManager->NumberOfModels();
209 currentModel = modelManager->GetModel(0);
210 if(
nullptr != lManager->AtomDeexcitation()) {
211 modelManager->SetFluoFlag(
true);
221 modelManager, maxKinEnergy,
230 if(
nullptr == masterProc) {
234 G4int nModels = modelManager->NumberOfModels();
235 G4bool isLocked = theParameters->IsPrintLocked();
236 G4bool toBuild = (buildLambdaTable || minKinEnergyPrim < maxKinEnergy);
247 G4double scale = theParameters->MaxKinEnergy()/theParameters->MinKinEnergy();
249 theParameters->NumberOfBinsPerDecade()*
G4lrint(std::log10(scale));
250 if(actBinning) { nbin = std::max(nbin, nLambdaBins); }
251 scale = nbin/
G4Log(scale);
255 bld, theLambdaTable, theLambdaTablePrim,
256 minKinEnergy, minKinEnergyPrim,
258 startFromNull, splineFlag);
267 out << std::setprecision(6);
272 if(fXSType !=
fEmNoIntegral) { out <<
" XStype:" << fXSType; }
273 if(applyCuts) { out <<
" applyCuts:1 "; }
275 out <<
" SubType=" << subtype;
277 G4int mod = theParameters->PositronAtRestModelType();
278 const G4String namp[2] = {
"Simple",
"Allison"};
279 out <<
" AtRestModel:" << namp[mod];
281 if(biasFactor != 1.0) { out <<
" BiasingFactor=" << biasFactor; }
282 out <<
" BuildTable=" << buildLambdaTable <<
G4endl;
283 if(buildLambdaTable) {
284 if(particle == &part) {
285 for(
auto & v : *theLambdaTable) {
287 out <<
" Lambda table from ";
291 if(emin > minKinEnergy) { out <<
"threshold "; }
295 <<
", " <<
G4lrint(nbin/std::log10(emax/emin))
296 <<
" bins/decade, spline: "
302 out <<
" Used Lambda table of "
303 << particle->GetParticleName() <<
G4endl;
306 if(minKinEnergyPrim < maxKinEnergy) {
307 if(particle == &part) {
308 for(
auto & v : *theLambdaTablePrim) {
310 out <<
" LambdaPrime table from "
314 <<
" in " << v->GetVectorLength()-1
320 out <<
" Used LambdaPrime table of "
321 << particle->GetParticleName() <<
G4endl;
328 out <<
" LambdaTable address= " << theLambdaTable <<
G4endl;
329 if(theLambdaTable && particle == &part) {
330 out << (*theLambdaTable) <<
G4endl;
345 if(isIon) { massRatio = proton_mass_c2/currentParticle->GetPDGMass(); }
355 for (
G4int i=0; i<numberOfModels; ++i) {
357 ptr->StartTracking(track);
377 if (isIon) { currentModel->ChargeSquareRatio(track); }
382 if(!currentModel->IsActive(scaledEnergy)) {
435void G4VEmProcess::ComputeIntegralLambda(
G4double e,
const G4Track& track)
461 const G4double e1 = std::max(epeak, e*lambdaFactor);
495 const G4double scaledEnergy = finalT*massRatio;
503 const G4double lx = std::max(GetCurrentLambda(finalT, logFinalT), 0.0);
506 G4cout <<
"WARNING: for " << currentParticle->GetParticleName()
509 <<
" < " << lx <<
" (postLambda) " <<
G4endl;
522 weight /= biasFactor;
528 G4cout <<
"G4VEmProcess::PostStepDoIt: Sample secondary; E= "
530 <<
" MeV; model= (" << currentModel->LowEnergyLimit()
531 <<
", " << currentModel->HighEnergyLimit() <<
")"
570 currentModel->FillNumberOfSecondaries(n1, n2);
573 for (
G4int i=0; i<num; ++i) {
583 }
else if (p == theElectron) {
586 }
else if (p == thePositron) {
590 e += 2.0*electron_mass_c2;
643 if(particle->GetProcessManager()->GetAtRestProcessVector()->size() > 0)
657 if(!
isTheMaster || part != particle) {
return true; }
662 directory,
"LambdaPrim",
675 if(!
isTheMaster || part != particle) {
return true; }
677 if(buildLambdaTable) {
682 if(yes && minKinEnergyPrim < maxKinEnergy) {
696 return GetCurrentLambda(kinEnergy,
G4Log(kinEnergy));
716 return (currentModel) ?
717 currentModel->ComputeCrossSectionPerAtom(currentParticle, kinEnergy,
728 nLambdaBins, splineFlag);
736 return (
nullptr != currentModel) ?
744 return (
nullptr != currentModel) ?
752 return (
nullptr != currentModel) ?
764 G4cout <<
"### SetCrossSectionBiasingFactor: for "
765 << particle->GetParticleName()
767 <<
" biasFactor= " << f <<
" weightFlag= " << flag
781 G4cout <<
"### ActivateForcedInteraction: for "
782 << particle->GetParticleName()
784 <<
" length(mm)= " << length/mm
785 <<
" in G4Region <" << r
786 <<
"> weightFlag= " << flag
807 biasManager->ActivateSecondaryBiasing(region, factor, energyLimit);
809 G4cout <<
"### ActivateSecondaryBiasing: for "
811 <<
" factor= " << factor
812 <<
" in G4Region <" << region
813 <<
"> energyLimit(MeV)= " << energyLimit/MeV
823 if(5 < n && n < 10000000) {
828 PrintWarning(
"SetLambdaBinning", e);
836 if(1.e-3*eV < e && e < maxKinEnergy) {
838 /
G4Log(maxKinEnergy/minKinEnergy));
840 actMinKinEnergy =
true;
841 }
else { PrintWarning(
"SetMinKinEnergy", e); }
848 if(minKinEnergy < e && e < 1.e+6*TeV) {
850 /
G4Log(maxKinEnergy/minKinEnergy));
852 actMaxKinEnergy =
true;
853 }
else { PrintWarning(
"SetMaxKinEnergy", e); }
860 if(theParameters->MinKinEnergy() <= e &&
861 e <= theParameters->
MaxKinEnergy()) { minKinEnergyPrim = e; }
862 else { PrintWarning(
"SetMinKinEnergyPrim", e); }
876 return theParameters->MscThetaLimit();
883 G4String ss =
"G4VEmProcess::" + tit;
885 ed <<
"Parameter is out of range: " << val
886 <<
" it will have no effect!\n" <<
" Process "
897 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()
G4Region defines a region or a group of regions in the detector geometry setup, sharing properties as...
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)
G4VEmModel * GetModelByIndex(G4int idx=0, G4bool ver=false) const
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