89 {
"DEDX",
"Ionisation",
"DEDXnr",
"CSDARange",
"Lambda",
"Range",
"InverseRange"};
104 minKinEnergy = 0.1*CLHEP::keV;
105 maxKinEnergy = 100.0*CLHEP::TeV;
106 maxKinEnergyCSDA = 1.0*CLHEP::GeV;
110 invLambdaFactor = 1.0/lambdaFactor;
113 finalRange = 1.*CLHEP::mm;
132 scTracks.reserve(10);
133 secParticles.reserve(12);
134 emModels =
new std::vector<G4VEmModel*>;
142 if(
nullptr == baseParticle) {
delete theData; }
143 delete theEnergyOfCrossSectionMax;
144 if(
nullptr != fXSpeaks) {
145 for(
auto const & v : *fXSpeaks) {
delete v; }
171 if(
nullptr == ptr) {
return; }
173 modelManager->
AddEmModel(order, ptr, afluc, region);
181 if(
nullptr == ptr) {
return; }
182 if(!emModels->empty()) {
183 for(
auto & em : *emModels) {
if(em == ptr) {
return; } }
185 emModels->push_back(ptr);
193 massRatio = massratio;
194 logMassRatio =
G4Log(massRatio);
195 fFactor = charge2ratio*biasFactor;
197 chargeSqRatio = charge2ratio;
198 reduceFactor = 1.0/(fFactor*massRatio);
209 if( particle != &part ) {
212 G4cout <<
"### G4VEnergyLossProcess::PreparePhysicsTable()"
213 <<
" interrupted for "
219 tablesAreBuilt =
false;
228 if(!actLossFluc) { lossFluctuationFlag = theParameters->
LossFluctuation(); }
230 if(!actMinKinEnergy) { minKinEnergy = theParameters->
MinKinEnergy(); }
231 if(!actMaxKinEnergy) { maxKinEnergy = theParameters->
MaxKinEnergy(); }
232 if(!actBinning) { nBins = theParameters->
NumberOfBins(); }
235 *
G4lrint(std::log10(maxKinEnergyCSDA/minKinEnergy));
236 if(!actLinLossLimit) { linLossLimit = theParameters->
LinearLossLimit(); }
238 invLambdaFactor = 1.0/lambdaFactor;
254 if (
nullptr != baseParticle) {
255 massRatio = (baseParticle->
GetPDGMass())/initialMass;
256 logMassRatio =
G4Log(massRatio);
259 if(chargeSqRatio > 0.0) { reduceFactor = 1.0/(chargeSqRatio*massRatio); }
261 lowestKinEnergy = (initialMass < CLHEP::MeV)
266 if (isMaster &&
nullptr == baseParticle) {
269 if(
nullptr != theDEDXTable && isIonisation) {
270 if(
nullptr != theIonisationTable && theDEDXTable != theIonisationTable) {
272 theDEDXTable = theIonisationTable;
273 theIonisationTable =
nullptr;
277 theDEDXTable = theData->
MakeTable(theDEDXTable, 0);
282 theDEDXunRestrictedTable = theData->
MakeTable(2);
283 if(isIonisation) { theCSDARangeTable = theData->
MakeTable(3); }
288 theRangeTableForLoss = theData->
MakeTable(5);
289 theInverseRangeTable = theData->
MakeTable(6);
294 if(
nullptr != biasManager) {
300 currentModel = modelManager->
GetModel(0);
302 numberOfModels, secID, biasID,
303 mainSecondaries, baseMat, isMaster,
305 theCuts = modelManager->
Initialise(particle, secondaryParticle,
311 if(1 == nSCoffRegions) {
312 if((*scoffRegions)[0]->GetName() ==
"DefaultRegionForTheWorld") {
314 scoffRegions =
nullptr;
320 G4cout <<
"G4VEnergyLossProcess::PrepearPhysicsTable() is done "
322 <<
" isIon= " << isIon;
326 G4cout <<
" chargeSqRatio= " << chargeSqRatio
327 <<
" massRatio= " << massRatio
328 <<
" reduceFactor= " << reduceFactor <<
G4endl;
329 if (nSCoffRegions > 0) {
330 G4cout <<
" SubCut secondary production is ON for regions: " <<
G4endl;
331 for (
G4int i=0; i<nSCoffRegions; ++i) {
332 const G4Region* r = (*scoffRegions)[i];
335 }
else if(
nullptr != subcutProducer) {
336 G4cout <<
" SubCut secondary production is ON for all regions" <<
G4endl;
346 G4cout <<
"### G4VEnergyLossProcess::BuildPhysicsTable() for "
353 G4cout <<
" TablesAreBuilt= " << tablesAreBuilt
354 <<
" isIon= " << isIon <<
" " <<
this <<
G4endl;
357 if(&part == particle) {
363 const auto masterProcess =
368 particle, numberOfModels);
369 tablesAreBuilt =
true;
370 baseMat = masterProcess->UseBaseMaterial();
381 if(
nullptr != atomDeexcitation) {
382 if(atomDeexcitation->
IsPIXEActive()) { useDeexcitation =
true; }
393 num ==
"e+" || num ==
"mu+" ||
394 num ==
"mu-" || num ==
"proton"||
395 num ==
"pi+" || num ==
"pi-" ||
396 num ==
"kaon+" || num ==
"kaon-" ||
397 num ==
"alpha" || num ==
"anti_proton" ||
398 num ==
"GenericIon"|| num ==
"alpha+" ))) {
402 G4cout <<
"### G4VEnergyLossProcess::BuildPhysicsTable() done for "
405 if(isIonisation) {
G4cout <<
" isIonisation flag=1"; }
419 emax = maxKinEnergyCSDA;
421 table = theDEDXunRestrictedTable;
423 table = theDEDXTable;
425 G4cout <<
"G4VEnergyLossProcess::BuildDEDXTable WARNING: wrong type "
429 G4cout <<
"G4VEnergyLossProcess::BuildDEDXTable() of type " << tType
433 if(
nullptr == table) {
return table; }
437 table, minKinEnergy, emax, bin,
446 if(
nullptr == theLambdaTable) {
return theLambdaTable; }
451 scale = nbin/
G4Log(scale);
455 bld, theLambdaTable, theCuts,
456 minKinEnergy, maxKinEnergy, scale,
458 return theLambdaTable;
463void G4VEnergyLossProcess::StreamInfo(std::ostream& out,
467 out << std::setprecision(6);
470 out <<
" XStype:" << fXSType
472 <<
" dE/dx and range tables from "
474 <<
" to " <<
G4BestUnit(maxKinEnergy,
"Energy")
475 <<
" in " << nBins <<
" bins" <<
G4endl
476 <<
" Lambda tables from threshold to "
479 <<
" bins/decade, spline: " << spline
481 if(
nullptr != theRangeTableForLoss && isIonisation) {
482 out <<
" StepFunction=(" << dRoverRange <<
", "
483 << finalRange/mm <<
" mm)"
484 <<
", integ: " << fXSType
485 <<
", fluct: " << lossFluctuationFlag
486 <<
", linLossLim= " << linLossLimit
491 if(
nullptr != theCSDARangeTable && isIonisation) {
492 out <<
" CSDA range table up"
493 <<
" to " <<
G4BestUnit(maxKinEnergyCSDA,
"Energy")
494 <<
" in " << nBinsCSDA <<
" bins" <<
G4endl;
496 if(nSCoffRegions>0 && isIonisation) {
497 out <<
" Subcutoff sampling in " << nSCoffRegions
501 for(std::size_t i=0; i<7; ++i) {
502 auto ta = theData->
Table(i);
503 out <<
" " << tnames[i] <<
" address: " << ta <<
G4endl;
504 if(
nullptr != ta) { out << *ta <<
G4endl; }
513 if(
nullptr == scoffRegions) {
514 scoffRegions =
new std::vector<const G4Region*>;
517 if(!scoffRegions->empty()) {
518 for (
auto & reg : *scoffRegions) {
519 if (reg == r) {
return; }
523 scoffRegions->push_back(r);
529G4bool G4VEnergyLossProcess::IsRegionForCubcutProcessor(
const G4Track& aTrack)
531 if(0 == nSCoffRegions) {
return true; }
533 for(
auto & reg : *scoffRegions) {
534 if(r == reg) {
return true; }
551 if(
nullptr != baseParticle) {
552 massRatio = baseParticle->
GetPDGMass()/newmass;
553 logMassRatio =
G4Log(massRatio);
555 massRatio = CLHEP::proton_mass_c2/newmass;
556 logMassRatio =
G4Log(massRatio);
563 if(
nullptr != biasManager) {
578 *selection = aGPILSelection;
581 const G4double finR = (rndmStepFlag) ? std::min(finalRange,
583 x = (fRange > finR) ?
584 fRange*dRoverRange + finR*(1.0-dRoverRange)*(2.0-finR/fRange) : fRange;
620 if(q2 != chargeSqRatio) {
621 fFactor *= q2/chargeSqRatio;
622 reduceFactor = 1.0/(fFactor*massRatio);
625 if (lossFluctuationFlag) {
671 G4cout <<
"G4VEnergyLossProcess::PostStepGetPhysicalInteractionLength ";
679 <<
"InteractionLength= " << x/cm <<
"[cm] " <<
G4endl;
688G4VEnergyLossProcess::ComputeLambdaForScaledEnergy(
G4double e,
G4double loge)
699 const G4double epeak = (*theEnergyOfCrossSectionMax)[basedCoupleIndex];
706 const G4double e1 = std::max(epeak, e*lambdaFactor);
728 const G4double e1 = std::max(e1peak, e*lambdaFactor);
747 const G4double e1 = std::max(e2peak, e*lambdaFactor);
764 const G4double e1 = std::max(e3peak, e*lambdaFactor);
807 weight /= biasFactor;
814 if (useDeexcitation) {
817 if(scTracks.size() > 0) { FillSecondariesAlongStep(weight); }
818 eloss = std::max(eloss, 0.0);
832 G4double x = (fRange - length)/reduceFactor;
865 eloss = std::max(eloss, 0.0);
872 }
else if (lossFluctuationFlag) {
874 const G4double tcut = std::min(cut, tmax);
877 tcut, tmax, length, eloss);
888 if (useDeexcitation) {
898 if(eloss >= esecfluo) {
906 if(
nullptr != subcutProducer && IsRegionForCubcutProcessor(track)) {
910 if(!scTracks.empty()) { FillSecondariesAlongStep(weight); }
914 if (finalT <= lowestKinEnergy) {
922 eloss = std::max(eloss, 0.0);
943void G4VEnergyLossProcess::FillSecondariesAlongStep(
G4double wt)
945 const std::size_t n0 = scTracks.size();
956 const std::size_t
n = scTracks.size();
959 for(std::size_t i=0; i<
n; ++i) {
982 const G4double postStepScaledEnergy = finalT*massRatio;
985 if(!currentModel->
IsActive(postStepScaledEnergy)) {
1004 G4double lx = GetLambdaForScaledEnergy(postStepScaledEnergy,
1005 logFinalT + logMassRatio);
1006 lx = std::max(lx, 0.0);
1017 weight /= biasFactor;
1024 secParticles.clear();
1027 const G4int num0 = (
G4int)secParticles.size();
1035 track, currentModel,
1047 const G4int num = (
G4int)secParticles.size();
1054 if(num0 > mainSecondaries) {
1058 for (
G4int i=0; i<num; ++i) {
1059 if(
nullptr != secParticles[i]) {
1069 }
else if(i < num0 + n1) {
1110 if (!isMaster ||
nullptr != baseParticle || part != particle )
return true;
1111 for(std::size_t i=0; i<7; ++i) {
1112 if(
nullptr != theData->
Table(i)) {
1114 G4cout <<
"G4VEnergyLossProcess::StorePhysicsTable i=" << i
1117 <<
" " << tnames[i] <<
" " << theData->
Table(i) <<
G4endl;
1134 if (!isMaster ||
nullptr != baseParticle || part != particle )
return true;
1135 for(std::size_t i=0; i<7; ++i) {
1151 DefineMaterial(couple);
1170 DefineMaterial(couple);
1172 if (
nullptr != theLambdaTable) {
1173 cross = GetLambdaForScaledEnergy(kineticEnergy * massRatio,
1174 logKineticEnergy + logMassRatio);
1177 cross = (!baseMat) ? biasFactor : biasFactor*(*theDensityFactor)[
currentCoupleIndex];
1181 return std::max(cross, 0.0);
1191 const G4double cs = GetLambdaForScaledEnergy(kinEnergy * massRatio,
1192 logKinEnergy + logMassRatio);
1193 return (0.0 < cs) ? 1.0/cs :
DBL_MAX;
1232 DefineMaterial(couple);
1243 G4cout <<
"### Set DEDX table " << p <<
" " << theDEDXTable
1244 <<
" " << theDEDXunRestrictedTable <<
" " << theIonisationTable
1247 <<
" type=" << tType <<
" isIonisation:" << isIonisation <<
G4endl;
1250 theDEDXunRestrictedTable = p;
1253 if(isMaster &&
nullptr == baseParticle) {
1257 theIonisationTable = p;
1258 if(isMaster &&
nullptr == baseParticle) {
1268 theCSDARangeTable = p;
1275 theRangeTableForLoss = p;
1282 theInverseRangeTable = p;
1290 G4cout <<
"### Set Lambda table " << p <<
" " << theLambdaTable
1295 tablesAreBuilt =
true;
1297 if(isMaster &&
nullptr != p) {
1298 delete theEnergyOfCrossSectionMax;
1299 theEnergyOfCrossSectionMax =
nullptr;
1301 if(
nullptr != fXSpeaks) {
1302 for(
auto & ptr : *fXSpeaks) {
delete ptr; }
1307 if(
nullptr == fXSpeaks) { fXSType =
fEmOnePeak; }
1311 if(
nullptr == theEnergyOfCrossSectionMax) { fXSType =
fEmIncreasing; }
1320 theEnergyOfCrossSectionMax = p;
1334 return (
nullptr != currentModel)
1347 G4cout <<
"### SetCrossSectionBiasingFactor: for "
1349 <<
" biasFactor= " << f <<
" weightFlag= " << flag
1363 G4cout <<
"### ActivateForcedInteraction: for "
1365 <<
" length(mm)= " << length/mm
1366 <<
" in G4Region <" << region
1367 <<
"> weightFlag= " << flag
1381 if (0.0 <= factor) {
1389 G4cout <<
"### ActivateSecondaryBiasing: for "
1391 <<
" factor= " << factor
1392 <<
" in G4Region <" << region
1393 <<
"> energyLimit(MeV)= " << energyLimit/MeV
1411 if(0.0 < val && val < 1.0) {
1413 actLinLossLimit =
true;
1414 }
else { PrintWarning(
"SetLinearLossLimit", val); }
1421 if(0.0 < v1 && 0.0 < v2) {
1422 dRoverRange = std::min(1.0, v1);
1423 finalRange = std::min(v2, 1.e+50);
1425 PrintWarning(
"SetStepFunctionV1", v1);
1426 PrintWarning(
"SetStepFunctionV2", v2);
1434 if(1.e-18 < val && val < 1.e+50) { lowestKinEnergy = val; }
1435 else { PrintWarning(
"SetLowestEnergyLimit", val); }
1442 if(2 < n && n < 1000000000) {
1447 PrintWarning(
"SetDEDXBinning", e);
1455 if(1.e-18 < e && e < maxKinEnergy) {
1457 actMinKinEnergy =
true;
1458 }
else { PrintWarning(
"SetMinKinEnergy", e); }
1465 if(minKinEnergy < e && e < 1.e+50) {
1467 actMaxKinEnergy =
true;
1468 if(e < maxKinEnergyCSDA) { maxKinEnergyCSDA = e; }
1469 }
else { PrintWarning(
"SetMaxKinEnergy", e); }
1474void G4VEnergyLossProcess::PrintWarning(
const G4String& tit,
G4double val)
const
1476 G4String ss =
"G4VEnergyLossProcess::" + tit;
1478 ed <<
"Parameter is out of range: " << val
1479 <<
" it will have no effect!\n" <<
" Process "
1481 <<
" Emin(keV)= " << minKinEnergy/keV
1482 <<
" Emax(GeV)= " << maxKinEnergy/GeV;
1490 if(
nullptr != particle) { StreamInfo(out, *particle,
true); }
G4double condition(const G4ErrorSymMatrix &m)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
@ NotCandidateForSelection
G4double G4Log(G4double x)
G4GLOB_DLL std::ostream G4cout
G4double GetLogKineticEnergy() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
G4bool ForcedInteractionRegion(G4int coupleIdx)
G4double ApplySecondaryBiasing(std::vector< G4DynamicParticle * > &, const G4Track &track, G4VEmModel *currentModel, G4ParticleChangeForGamma *pParticleChange, G4double &eloss, G4int coupleIdx, G4double tcut, G4double safety=0.0)
void ActivateSecondaryBiasing(const G4String ®ion, G4double factor, G4double energyLimit)
void ResetForcedInteraction()
void Initialise(const G4ParticleDefinition &part, const G4String &procName, G4int verbose)
G4double GetWeight(G4int i)
void ActivateForcedInteraction(G4double length=0.0, const G4String &r="")
G4bool SecondaryBiasingRegion(G4int coupleIdx)
G4double GetStepLimit(G4int coupleIdx, G4double previousStep)
void CleanTable(size_t idx)
G4PhysicsTable * MakeTable(size_t idx)
void UpdateTable(G4PhysicsTable *, size_t idx)
G4PhysicsTable * Table(size_t idx) const
void AddEmModel(G4int, G4VEmModel *, G4VEmFluctuationModel *fm, const G4Region *r)
const G4DataVector * Initialise(const G4ParticleDefinition *part, const G4ParticleDefinition *secPart, G4int verb)
void DumpModelList(std::ostream &out, G4int verb)
G4int NumberOfModels() const
G4VEmModel * GetModel(G4int idx, G4bool ver=false) const
G4bool IsPrintLocked() const
void DefineRegParamForLoss(G4VEnergyLossProcess *) const
void FillStepFunction(const G4ParticleDefinition *, G4VEnergyLossProcess *) const
static G4EmParameters * Instance()
G4int NumberOfBins() const
G4double MinKinEnergy() const
G4int NumberOfBinsPerDecade() const
G4bool BuildCSDARange() const
G4bool LossFluctuation() const
G4bool UseCutAsFinalRange() const
G4int WorkerVerbose() const
G4double MaxKinEnergy() const
G4double MaxEnergyForCSDARange() const
G4bool UseAngularGeneratorForIonisation() const
G4double LinearLossLimit() const
G4double LowestMuHadEnergy() const
G4double LambdaFactor() const
G4double LowestElectronEnergy() const
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 void UpdateModels(G4VEnergyLossProcess *proc, G4EmModelManager *modelManager, const G4double maxKinEnergy, const G4int nModels, G4int &secID, G4int &biasID, G4int &mainSecondaries, const G4bool baseMat, const G4bool isMaster, const G4bool useAGen)
static void BuildLocalElossProcess(G4VEnergyLossProcess *proc, const G4VEnergyLossProcess *masterProc, const G4ParticleDefinition *part, const G4int nModels)
static G4bool StoreTable(G4VProcess *, const G4ParticleDefinition *, G4PhysicsTable *, const G4String &dir, const G4String &tname, G4int verb, G4bool ascii)
static void BuildDEDXTable(G4VEnergyLossProcess *proc, const G4ParticleDefinition *part, G4EmModelManager *modelManager, G4LossTableBuilder *bld, G4PhysicsTable *table, const G4double minKinEnergy, const G4double maxKinEnergy, const G4int nbins, const G4int verbose, const G4EmTableType tType, const G4bool splineFlag)
static const G4ParticleDefinition * CheckIon(G4VEnergyLossProcess *proc, const G4ParticleDefinition *part, const G4ParticleDefinition *particle, const G4int verboseLevel, G4bool &isIon)
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 std::vector< G4TwoPeaksXS * > * FillPeaksStructure(G4PhysicsTable *, G4LossTableBuilder *)
static std::vector< G4double > * FindCrossSectionMax(G4PhysicsTable *)
G4Region * GetRegion() const
G4bool GetBaseMaterialFlag()
const std::vector< G4double > * GetDensityFactors() const
const std::vector< G4int > * GetCoupleIndexes() const
void InitialiseBaseMaterials(const G4PhysicsTable *table=nullptr)
static G4LossTableManager * Instance()
void LocalPhysicsTables(const G4ParticleDefinition *aParticle, G4VEnergyLossProcess *p)
G4LossTableBuilder * GetTableBuilder()
void PreparePhysicsTable(const G4ParticleDefinition *aParticle, G4VEnergyLossProcess *p, G4bool theMaster)
void BuildPhysicsTable(const G4ParticleDefinition *aParticle)
G4VSubCutProducer * SubCutProducer()
void DeRegister(G4VEnergyLossProcess *p)
void Register(G4VEnergyLossProcess *p)
G4VAtomDeexcitation * AtomDeexcitation()
void RegisterExtraParticle(const G4ParticleDefinition *aParticle, G4VEnergyLossProcess *p)
G4ProductionCuts * GetProductionCuts() const
const G4String & GetName() const
void InitializeForPostStep(const G4Track &)
void InitializeForAlongStep(const G4Track &)
G4double GetProposedKineticEnergy() const
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedCharge(G4double theCharge)
G4ProcessManager * GetProcessManager() const
G4double GetPDGMass() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const
G4ProcessVector * GetAtRestProcessVector(G4ProcessVectorTypeIndex typ=typeGPIL) const
G4double GetProductionCut(G4int index) const
const G4String & GetName() const
G4double GetSafety() const
G4double GetStepLength() const
G4StepPoint * GetPostStepPoint() const
const G4ParticleDefinition * GetParticleDefinition() const
G4VPhysicalVolume * GetVolume() const
void SetWeight(G4double aValue)
const G4ThreeVector & GetPosition() const
void SetTouchableHandle(const G4TouchableHandle &apValue)
G4double GetGlobalTime() const
G4Material * GetMaterial() const
G4ParticleDefinition * GetDefinition() const
const G4DynamicParticle * GetDynamicParticle() const
const G4TouchableHandle & GetTouchableHandle() const
G4double GetKineticEnergy() const
void SetCreatorModelID(const G4int id)
G4int GetParentID() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
static G4TransportationManager * GetTransportationManager()
G4SafetyHelper * GetSafetyHelper() const
void AlongStepDeexcitation(std::vector< G4Track * > &tracks, const G4Step &step, G4double &eLoss, G4int coupleIndex)
G4bool IsPIXEActive() const
virtual G4double Dispersion(const G4Material *, const G4DynamicParticle *, const G4double tcut, const G4double tmax, const G4double length)=0
virtual void SetParticleAndCharge(const G4ParticleDefinition *, G4double q2)
virtual G4double SampleFluctuations(const G4MaterialCutsCouple *, const G4DynamicParticle *, const G4double tcut, const G4double tmax, const G4double length, const G4double meanLoss)=0
virtual void FillNumberOfSecondaries(G4int &numberOfTriplets, G4int &numberOfRecoil)
G4VEmFluctuationModel * GetModelOfFluctuations()
virtual G4double GetParticleCharge(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
virtual G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void SetParticleChange(G4VParticleChange *, G4VEmFluctuationModel *f=nullptr)
G4bool IsActive(G4double kinEnergy) const
virtual void CorrectionsAlongStep(const G4MaterialCutsCouple *, const G4DynamicParticle *, const G4double &length, G4double &eloss)
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin=0.0, G4double tmax=DBL_MAX)=0
const G4Element * GetCurrentElement(const G4Material *mat=nullptr) const
G4double MaxSecondaryKinEnergy(const G4DynamicParticle *dynParticle)
virtual G4double ChargeSquareRatio(const G4Track &)
void AddEmModel(G4int, G4VEmModel *, G4VEmFluctuationModel *fluc=nullptr, const G4Region *region=nullptr)
G4double GetContinuousStepLimit(const G4Track &track, G4double previousStepSize, G4double currentMinimumStep, G4double ¤tSafety) override
void SetMaxKinEnergy(G4double e)
G4ParticleChangeForLoss fParticleChange
void PreparePhysicsTable(const G4ParticleDefinition &) override
G4double MeanFreePath(const G4Track &track)
G4double preStepLogScaledEnergy
virtual void InitialiseEnergyLossProcess(const G4ParticleDefinition *, const G4ParticleDefinition *)=0
void SelectModel(G4double kinEnergy)
void SetRangeTableForLoss(G4PhysicsTable *p)
G4PhysicsVector * LambdaPhysicsVector(const G4MaterialCutsCouple *, G4double cut)
void ProcessDescription(std::ostream &outFile) const override
G4PhysicsTable * BuildDEDXTable(G4EmTableType tType=fRestricted)
void SetTwoPeaksXS(std::vector< G4TwoPeaksXS * > *)
const G4MaterialCutsCouple * currentCouple
virtual G4double MinPrimaryEnergy(const G4ParticleDefinition *, const G4Material *, G4double cut)
G4double preStepScaledEnergy
void ActivateSecondaryBiasing(const G4String ®ion, G4double factor, G4double energyLimit)
G4double PostStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition) override
const G4Element * GetCurrentElement() const
void SetDEDXBinning(G4int nbins)
void SetStepFunction(G4double v1, G4double v2)
void SetEmModel(G4VEmModel *, G4int index=0)
void SetCrossSectionBiasingFactor(G4double f, G4bool flag=true)
const G4Material * currentMaterial
G4double GetMeanFreePath(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition) override
G4double ContinuousStepLimit(const G4Track &track, G4double previousStepSize, G4double currentMinimumStep, G4double ¤tSafety)
void SetInverseRangeTable(G4PhysicsTable *p)
G4bool RetrievePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii) override
void ActivateForcedInteraction(G4double length, const G4String ®ion, G4bool flag=true)
void SetDynamicMassCharge(G4double massratio, G4double charge2ratio)
void SetEnergyOfCrossSectionMax(std::vector< G4double > *)
G4double CrossSectionPerVolume(G4double kineticEnergy, const G4MaterialCutsCouple *couple)
void SetDEDXTable(G4PhysicsTable *p, G4EmTableType tType)
G4PhysicsTable * BuildLambdaTable(G4EmTableType tType=fRestricted)
G4bool StorePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii=false) override
~G4VEnergyLossProcess() override
void SetIonisation(G4bool val)
G4double AlongStepGetPhysicalInteractionLength(const G4Track &, G4double previousStepSize, G4double currentMinimumStep, G4double ¤tSafety, G4GPILSelection *selection) override
void SetLinearLossLimit(G4double val)
void SetLowestEnergyLimit(G4double)
void SetLambdaTable(G4PhysicsTable *p)
void BuildPhysicsTable(const G4ParticleDefinition &) override
G4VEnergyLossProcess(const G4String &name="EnergyLoss", G4ProcessType type=fElectromagnetic)
G4double preStepKinEnergy
G4VParticleChange * AlongStepDoIt(const G4Track &, const G4Step &) override
G4double GetDEDXDispersion(const G4MaterialCutsCouple *couple, const G4DynamicParticle *dp, G4double length)
void ActivateSubCutoff(const G4Region *region)
void SetCSDARangeTable(G4PhysicsTable *pRange)
G4double preStepLogKinEnergy
std::size_t currentCoupleIndex
virtual void StreamProcessInfo(std::ostream &) const
G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &) override
void StartTracking(G4Track *) override
void SetMinKinEnergy(G4double e)
G4double GetParentWeight() const
void ProposeTrackStatus(G4TrackStatus status)
void SetSecondaryWeightByProcess(G4bool)
void ProposeWeight(G4double finalWeight)
G4double GetLocalEnergyDeposit() const
void AddSecondary(G4Track *aSecondary)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
void SetNumberOfSecondaries(G4int totSecondaries)
G4TrackStatus GetTrackStatus() const
G4LogicalVolume * GetLogicalVolume() const
G4double currentInteractionLength
G4double theInitialNumberOfInteractionLength
void SetVerboseLevel(G4int value)
const G4VProcess * GetMasterProcess() const
G4double theNumberOfInteractionLengthLeft
G4VParticleChange * pParticleChange
G4int GetProcessSubType() const
const G4String & GetProcessName() const
virtual void SampleSecondaries(const G4Step &step, std::vector< G4Track * > &tracks, G4double &eloss, G4double cut) const =0