19#include "G4Version.hh"
22#include "BDSException.hh"
23#include "BDSGlobalConstants.hh"
24#include "BDSModularPhysicsList.hh"
25#include "BDSIonDefinition.hh"
26#include "BDSParticleDefinition.hh"
27#if G4VERSION_NUMBER > 1039
28#include "BDSPhysicsChannelling.hh"
30#include "BDSPhysicsCutsAndLimits.hh"
31#include "BDSPhysicsEMDissociation.hh"
32#include "BDSPhysicsMuonSplitting.hh"
33#include "BDSPhysicsUtilities.hh"
34#include "BDSUtilities.hh"
35#include "BDSWarning.hh"
36#include "BDSEmStandardPhysicsOp4Channelling.hh"
38#include "FTFP_BERT.hh"
40#include "BDSParticleMilli.hh"
41#include "G4AntiNeutrinoE.hh"
42#include "G4AntiNeutrinoMu.hh"
43#include "G4AntiNeutrinoTau.hh"
44#include "G4AntiNeutron.hh"
45#include "G4AntiProton.hh"
46#include "G4Electron.hh"
47#include "G4EmParameters.hh"
48#include "G4EmStandardPhysics_option4.hh"
49#include "G4EmStandardPhysicsSS.hh"
50#include "G4DynamicParticle.hh"
52#include "G4GenericBiasingPhysics.hh"
53#include "G4GenericIon.hh"
54#include "G4IonElasticPhysics.hh"
55#include "G4IonTable.hh"
56#include "G4KaonMinus.hh"
57#include "G4KaonPlus.hh"
58#include "G4KaonZero.hh"
59#include "G4KaonZeroLong.hh"
60#include "G4KaonZeroShort.hh"
61#include "G4LeptonConstructor.hh"
62#include "G4MuonMinus.hh"
63#include "G4MuonPlus.hh"
64#include "G4NeutrinoE.hh"
65#include "G4NeutrinoMu.hh"
66#include "G4NeutrinoTau.hh"
67#include "G4Neutron.hh"
68#include "G4ParticleTable.hh"
69#include "G4ParticleTableIterator.hh"
70#include "G4PionMinus.hh"
71#include "G4PionPlus.hh"
72#include "G4PionZero.hh"
73#include "G4Positron.hh"
74#include "G4ProductionCutsTable.hh"
76#include "G4PhysListFactory.hh"
77#include "G4ProcessManager.hh"
78#include "G4ProcessVector.hh"
81#include "G4UImanager.hh"
82#if G4VERSION_NUMBER > 1049
83#include "G4ParticleDefinition.hh"
84#include "G4CoupledTransportation.hh"
85#include "G4Transportation.hh"
89#if G4VERSION_NUMBER > 1069
90#include "G4HadronicParameters.hh"
93#include "parser/beam.h"
94#include "parser/fastlist.h"
95#include "parser/physicsbiasing.h"
106 return G4IonTable::IsIon(particle) && particle!=G4Proton::Definition();
111 return BDS::IsIon(particle->GetDefinition()) || particle->GetTotalOccupancy()>0;
120 G4VModularPhysicsList* result =
nullptr;
127 G4bool completePhysics =
BDS::StrContains(physicsListNameLower,
"complete");
128 if (useGeant4Physics)
131 G4String geant4PhysicsList = physicsList.substr(2);
132 G4PhysListFactory factory;
133 if (!factory.IsReferencePhysList(geant4PhysicsList))
135 G4cerr <<
"Unknown Geant4 physics list \"" << geant4PhysicsList <<
"\"" << G4endl;
136 G4cout <<
"Available Geant4 hadronic physics lists:" << G4endl;
137 for (
const auto &name : factory.AvailablePhysLists())
138 {G4cout <<
"\"" << name <<
"\"" << G4endl;}
139 G4cout <<
"Available Geant4 EM physics lists:" << G4endl;
140 for (
const auto &name : factory.AvailablePhysListsEM())
141 {G4cout <<
"\"" << name <<
"\"" << G4endl;}
142 throw BDSException(__METHOD_NAME__,
"Unknown Geant4 physics list \"" + geant4PhysicsList +
"\"");
146 result = factory.GetReferencePhysList(geant4PhysicsList);
147 if (g->G4PhysicsUseBDSIMRangeCuts())
149 if (g->MinimumKineticEnergy() > 0 || g->G4PhysicsUseBDSIMCutsAndLimits())
151 G4cout <<
"\nAdding cuts and limits physics process to Geant4 reference physics list" << G4endl;
152 G4cout <<
"This is to enforce BDSIM range cuts and the minimumKinetic energy option.\n";
153 G4cout <<
"This is done by default for the functionality of BDSIM tracking and should not affect the physics greatly.\n";
154 G4cout <<
"See the BDSIM manual about Geant4 reference physics lists for details." << G4endl;
157 else if (!g->G4PhysicsUseBDSIMCutsAndLimits() && g->Circular())
159 G4String message =
"g4PhysicsUseBDSIMCutsAndLimits turned off but using a circular machine - circular mechanics will be broken";
160 BDS::Warning(__METHOD_NAME__, message);
164 else if (completePhysics)
168 G4cout <<
"Constructing \"" << physicsListNameLower <<
"\" complete physics list" << G4endl;
169#if G4VERSION_NUMBER > 1039
177 r->SetVerboseLevel(verbosity);
180 throw BDSException(__METHOD_NAME__,
"Channel physics is not supported with Geant4 versions less than 10.4");
184 {
throw BDSException(__METHOD_NAME__,
"Unknown 'complete' physics list \"" + physicsList +
"\"");}
194 result->ConstructParticle();
195 result->SetVerboseLevel(verbosity);
198 G4UImanager* UIManager = G4UImanager::GetUIpointer();
200 if (!physicsMacro.empty())
203 G4String physicsMacroFull =
BDS::GetFullPath(physicsMacro,
false, setInExecOptions);
204 G4cout <<
"Applying geant4 physics macro file: " << physicsMacroFull << G4endl;
205 UIManager->ApplyCommand(
"/control/execute " + physicsMacroFull);
208 G4VUserPhysicsList* resultAsUserPhysicsList =
dynamic_cast<G4VUserPhysicsList*
>(result);
209 if (resultAsUserPhysicsList)
211 resultAsUserPhysicsList->DumpCutValuesTable(verbosity);
212 resultAsUserPhysicsList->SetVerboseLevel(verbosity);
218 const std::set<std::string>& keys)
221 for (
const auto& k : keys)
222 {nSet += beamDefinition.
HasBeenSet(k) ? 1 : 0;}
227 const std::set<std::string>& keys,
229 G4bool warnZeroParamsSet,
230 const G4String& unitString)
234 G4cerr <<
"Beam> More than one parameter set - there should only be one" << G4endl;
235 for (
const auto& k : keys)
236 {G4cerr << std::setw(14) << std::left << k <<
": " << std::setw(7) << std::right << beamDefinition.
get_value(k) <<
" " << unitString << G4endl;}
237 throw BDSException(__METHOD_NAME__,
"conflicting parameters set");
239 else if (nSet == 0 && warnZeroParamsSet)
241 G4cerr <<
"Beam> One of the following required to be set" << G4endl;
242 for (
const auto &k : keys)
243 {G4cerr << std::setw(14) << std::left << k <<
": " << std::setw(7) << std::right << beamDefinition.
get_value(k) <<
" " << unitString << G4endl;}
244 throw BDSException(__METHOD_NAME__,
"insufficient parameters set");
252 G4bool& beamDifferentFromDesignParticle)
254 if (beamDefinition.
particle.empty())
255 {
throw BDSException(
"Beam> no \"particle\" specified (required).");}
258 std::set<std::string> keysDesign = {
"energy",
"momentum",
"kineticEnergy"};
261 std::set<std::string> keysParticle = {
"E0",
"P0",
"Ek0"};
272 beamDifferentFromDesignParticle = nSetParticle > 0 || beamParticleName != beamDefinition.
particle;
273 if (nSetParticle > 0)
277 beamDefinition.
E0 * CLHEP::GeV,
278 beamDefinition.
Ek0 * CLHEP::GeV,
279 beamDefinition.
P0 * CLHEP::GeV,
297 G4double totalEnergyIn,
298 G4double kineticEnergyIn,
305 std::map<G4String, G4String> commonSubstitutions = { {
"photon",
"gamma"},
311 {
"antiproton",
"anti_proton"},
312 {
"anti-proton",
"anti_proton"} };
314 G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();
315 std::regex ionParticle(
"(ion\\s).*");
316 if (std::regex_match(particleName, ionParticle))
318 G4GenericIon::GenericIonDefinition();
321 G4IonTable* ionTable = particleTable->GetIonTable();
323 G4int ionPDGID = G4IonTable::GetNucleusEncoding(ionDef->Z(), ionDef->A());
324 G4double mass = ionTable->GetIonMass(ionDef->Z(), ionDef->A());
325 mass += ionDef->NElectrons()*G4Electron::Definition()->GetPDGMass();
326 G4double charge = ionDef->Charge();
328 totalEnergyIn, kineticEnergyIn, momentumIn, ffact, ionDef, ionPDGID);
334 auto searchName = commonSubstitutions.find(particleName);
335 if (searchName != commonSubstitutions.end())
337 G4cout <<
"Substituting particle name \"" << particleName <<
"\" for the Geant4 name: \"" << searchName->second <<
"\"" << G4endl;
338 particleName = searchName->second;
342 G4ParticleDefinition* particleDef =
nullptr;
348 int particleID = std::stoi(particleName);
352 G4ParticleTable::G4PTblEncodingDictionary* encoding = G4ParticleTable::fEncodingDictionary;
353 auto search = encoding->find(particleID);
354 if (search != encoding->end())
355 {particleDef = search->second;}
357 {
throw BDSException(__METHOD_NAME__,
"PDG ID \"" + particleName +
"not found in particle table");}
359 catch (
const std::logic_error&)
361 particleDef = particleTable->FindParticle(particleName);
363 {particleDef = particleTable->FindParticle(particleNameIn);}
368 throw BDSException(__METHOD_NAME__,
"Particle \"" + particleName +
"\" not found.");
370 particleDefB =
new BDSParticleDefinition(particleDef, totalEnergyIn, kineticEnergyIn, momentumIn, ffact);
379 if (name ==
"proton")
380 {G4Proton::ProtonDefinition();}
381 else if (name ==
"anti_proton")
382 {G4AntiProton::AntiProtonDefinition();}
383 else if (name ==
"e-")
384 {G4Electron::ElectronDefinition();}
385 else if (name ==
"e+")
386 {G4Positron::PositronDefinition();}
387 else if (name ==
"pi-")
388 {G4PionMinus::PionMinusDefinition();}
389 else if (name ==
"pi+")
390 {G4PionPlus::PionPlusDefinition();}
391 else if (name ==
"pi0")
392 {G4PionZero::PionZeroDefinition();}
393 else if (name ==
"neutron")
394 {G4Neutron::NeutronDefinition();}
395 else if (name ==
"photon" || name ==
"gamma")
397 else if (name ==
"mu-")
398 {G4MuonMinus::MuonMinusDefinition();}
399 else if (name ==
"mu+")
400 {G4MuonPlus::MuonPlusDefinition();}
401 else if (name ==
"kaon-")
402 {G4KaonMinus::KaonMinusDefinition();}
403 else if (name ==
"kaon+")
404 {G4KaonPlus::KaonPlusDefinition();}
405 else if (name ==
"kaon0")
406 {G4KaonZero::KaonZeroDefinition();}
407 else if (name ==
"kaon0l")
408 {G4KaonZeroLong::KaonZeroLongDefinition();}
409 else if (name ==
"kaon0s")
410 {G4KaonZeroShort::KaonZeroShortDefinition();}
411 else if (name ==
"nu_e")
412 {G4NeutrinoE::NeutrinoEDefinition();}
413 else if (name ==
"anti_nu_e")
414 {G4AntiNeutrinoE::AntiNeutrinoEDefinition();}
415 else if (name ==
"nu_mu")
416 {G4NeutrinoMu::NeutrinoMuDefinition();}
417 else if (name ==
"anti_nu_mu")
418 {G4AntiNeutrinoMu::AntiNeutrinoMuDefinition();}
419 else if (name ==
"nu_tau")
420 {G4NeutrinoTau::NeutrinoTauDefinition();}
421 else if (name ==
"anti_nu_tau")
422 {G4AntiNeutrinoTau::AntiNeutrinoTauDefinition();}
424 {ParticleMilli::MillichargeDefinition();}
427 G4String msg =
"Unknown common beam particle type \"" + name;
428 msg +=
"\" - if it doesn't work, include all \"all_particles\" in the physicsList option.";
429 BDS::Warning(__METHOD_NAME__, msg);
436 G4Electron::ElectronDefinition();
437 G4Positron::PositronDefinition();
438 G4NeutrinoE::NeutrinoEDefinition();
439 G4AntiNeutrinoE::AntiNeutrinoEDefinition();
442 G4Proton::ProtonDefinition();
443 G4AntiProton::AntiProtonDefinition();
444 G4Neutron::NeutronDefinition();
445 G4AntiNeutron::AntiNeutronDefinition();
453 G4LeptonConstructor::ConstructParticle();
454 G4PionPlus::PionPlusDefinition();
455 G4PionMinus::PionMinusDefinition();
456 G4KaonPlus::KaonPlusDefinition();
457 G4KaonMinus::KaonMinusDefinition();
458 G4GenericIon::GenericIonDefinition();
463 G4cout <<
"Register physics processes by name for the primary particle \""
464 << primaryParticleName <<
"\":" << G4endl;
466 auto particle = G4ParticleTable::GetParticleTable()->FindParticle(primaryParticleName);
470 G4cout << __METHOD_NAME__ <<
"primary particle not defined yet - could be ion" << G4endl;
474 auto pl = particle->GetProcessManager()->GetProcessList();
475 for (G4int i = 0; i < (G4int)pl->length(); i++)
476 {G4cout <<
"\"" << (*pl)[i]->GetProcessName() <<
"\"" << G4endl;}
482 std::set<const G4ParticleDefinition*> particlesToBias;
483 for (
const auto& b : biases)
485 const G4ParticleDefinition* particle =
nullptr;
486 G4String particleName = G4String(b.particle);
488 particle = G4ParticleTable::GetParticleTable()->FindParticle(particleName);
491 {particlesToBias.insert(particle);}
493 {
throw BDSException(__METHOD_NAME__,
"Unknown particle type for biasing: \"" + particleName +
"\"");}
496 if (particlesToBias.empty())
499 G4GenericBiasingPhysics* physBias =
new G4GenericBiasingPhysics();
500 for (
auto part : particlesToBias)
502 const G4String& particleName = part->GetParticleName();
503 G4cout << __METHOD_NAME__ <<
"wrapping \"" << particleName <<
"\" for biasing" << G4endl;
504 physBias->Bias(particleName);
512 G4int muonSplittingFactor = globals->MuonSplittingFactor();
513 if (muonSplittingFactor > 1)
515 G4int muonSplittingFactor2 = globals->MuonSplittingFactor2();
516 G4double muonSplittingThresholdParentEk = globals->MuonSplittingThresholdParentEk();
517 G4double muonSplittingThresholdParentEk2 = globals->MuonSplittingThresholdParentEk2();
518 G4cout <<
"BDSPhysicsMuonSplitting -> using muon splitting wrapper -> factor of: " << muonSplittingFactor << G4endl;
519 if (muonSplittingThresholdParentEk > 0)
520 {G4cout <<
"BDSPhysicsMuonSplitting -> minimum parent kinetic energy: " << muonSplittingThresholdParentEk / CLHEP::GeV <<
" GeV" << G4endl;}
521 if (muonSplittingFactor2 > 1)
523 G4cout <<
"BDSPhysicsMuonSplitting -> factor #2: " << muonSplittingFactor2 <<
" for muons above "
524 << muonSplittingThresholdParentEk / CLHEP::GeV <<
" GeV" << G4endl;
526 G4bool excludeW1P = globals->MuonSplittingExcludeWeight1Particles();
528 muonSplittingFactor2, muonSplittingThresholdParentEk2,
529 excludeW1P, globals->MuonSplittingExclusionWeight()));
535 G4cout << __METHOD_NAME__ <<
"Defined particles: " << G4endl;
536 auto it = G4ParticleTable::GetParticleTable()->GetIterator();
539 {G4cout << it->value()->GetParticleName() <<
" ";}
543#if G4VERSION_NUMBER > 1039
549 G4VModularPhysicsList* physlist =
new FTFP_BERT();
550 physlist->RegisterPhysics(
new G4IonElasticPhysics());
551 G4GenericBiasingPhysics* biasingPhysics =
new G4GenericBiasingPhysics();
560 physlist->ReplacePhysics(
new G4EmStandardPhysics_option4());
564 physlist->ReplacePhysics(
new G4EmStandardPhysicsSS());
570 G4cout <<
"Adding EM Dissocation to crystal channelling physics list" << G4endl;
574 biasingPhysics->PhysicsBiasAllCharged();
575 physlist->RegisterPhysics(biasingPhysics);
579 G4cout <<
"\nWARNING - adding cuts and limits physics process to \"COMPLETE\" physics list" << G4endl;
580 G4cout <<
"This is to enforce BDSIM range cuts and the minimumKinetic energy option.\n";
581 G4cout <<
"This can be turned off by setting option, g4PhysicsUseBDSIMCutsAndLimits=0;\n" << G4endl;
593 if (globals->DefaultRangeCutsSet())
595 G4cout << __METHOD_NAME__ <<
"Default production range cut " << physicsList->GetDefaultCutValue() <<
" mm" << G4endl;
596 physicsList->SetDefaultCutValue(globals->DefaultRangeCut());
598 if (globals->ProdCutPhotonsSet())
600 G4cout << __METHOD_NAME__ <<
"Photon production range cut " << physicsList->GetCutValue(
"gamma") <<
" mm" << G4endl;
601 physicsList->SetCutValue(globals->ProdCutPhotons(),
"gamma");
603 if (globals->ProdCutElectronsSet())
605 G4cout << __METHOD_NAME__ <<
"Electron production range cut " << physicsList->GetCutValue(
"e-") <<
" mm" << G4endl;
606 physicsList->SetCutValue(globals->ProdCutElectrons(),
"e-");
608 if (globals->ProdCutPositronsSet())
610 G4cout << __METHOD_NAME__ <<
"Positron production range cut " << physicsList->GetCutValue(
"e+") <<
" mm" << G4endl;
611 physicsList->SetCutValue(globals->ProdCutPositrons(),
"e+");
613 if (globals->ProdCutProtonsSet())
615 G4cout << __METHOD_NAME__ <<
"Proton production range cut " << physicsList->GetCutValue(
"proton") <<
" mm" << G4endl;
616 physicsList->SetCutValue(globals->ProdCutProtons(),
"proton");
620 G4cout << __METHOD_NAME__ <<
"Range cuts from inspection of the physics list" << G4endl;
621 G4cout << __METHOD_NAME__ <<
"Default production range cut " << physicsList->GetDefaultCutValue() <<
" mm" << G4endl;
624 G4cout << __METHOD_NAME__ <<
"List of all constructed particles by physics lists" << G4endl;
625 for (
auto particle : *G4ParticleTable::fDictionary)
626 {G4cout << particle.second->GetParticleName() <<
", ";}
630 physicsList->DumpCutValuesTable(verbosity);
636 G4double energyLimitLow = globals->PhysicsEnergyLimitLow();
637 G4double energyLimitHigh = globals->PhysicsEnergyLimitHigh();
641 if (setEnergyLimitLow || setEnergyLimitHigh)
643 auto table = G4ProductionCutsTable::GetProductionCutsTable();
644 G4double defaultEnergyLimitLow = table->GetLowEdgeEnergy();
645 G4double defaultEnergyLimitHigh = table->GetHighEdgeEnergy();
646 G4double elLow = setEnergyLimitLow ? energyLimitLow : defaultEnergyLimitLow;
647 G4double elHigh = setEnergyLimitHigh ? energyLimitHigh : defaultEnergyLimitHigh;
648 table->SetEnergyRange(elLow, elHigh);
649 if (setEnergyLimitLow)
651 G4cout << __METHOD_NAME__ <<
"set EM physics low energy limit: "
652 << elLow/CLHEP::MeV <<
" MeV" << G4endl;
654 if (setEnergyLimitHigh)
656 G4cout << __METHOD_NAME__ <<
"set high energy limit: "
657 << elHigh/CLHEP::TeV <<
" TeV" << G4endl;
658 if (elHigh > G4EmParameters::Instance()->MaxKinEnergy())
660 G4cout << __METHOD_NAME__ <<
"set EM physics Ek limit to " << elHigh/CLHEP::TeV <<
" TeV" << G4endl;
661 G4EmParameters::Instance()->SetMaxEnergy(elHigh);
663#if G4VERSION_NUMBER > 1069
665 if (elHigh > G4HadronicParameters::Instance()->GetMaxEnergy())
667 G4cout << __METHOD_NAME__ <<
"set hadronic physics Ek limit to " << elHigh/CLHEP::TeV <<
" TeV" << G4endl;
668 G4HadronicParameters::Instance()->SetMaxEnergy(elHigh);
675#if G4VERSION_NUMBER > 1049
690 G4double warningEnergy = 1.0 * CLHEP::kiloelectronvolt;
691 G4double importantEnergy = 10.0 * CLHEP::kiloelectronvolt;
692 G4double numberOfTrials = 1500;
694 auto transport = transportPair.first;
695 auto coupledTransport = transportPair.second;
700 transport->SetThresholdWarningEnergy(warningEnergy);
701 transport->SetThresholdImportantEnergy(importantEnergy);
702 transport->SetThresholdTrials(numberOfTrials);
704 else if(coupledTransport)
707 coupledTransport->SetThresholdWarningEnergy(warningEnergy);
708 coupledTransport->SetThresholdImportantEnergy(importantEnergy);
709 coupledTransport->SetThresholdTrials(numberOfTrials);
715 const auto* partPM = particleDef->GetProcessManager();
717 G4VProcess* partTransport = partPM->GetProcess(
"Transportation");
718 auto transport =
dynamic_cast<G4Transportation*
>(partTransport);
720 partTransport = partPM->GetProcess(
"CoupledTransportation");
721 auto coupledTransport =
dynamic_cast<G4CoupledTransportation*
>(partTransport);
723 return std::make_pair(transport, coupledTransport);
Copy of crystal channelling em physics from Geant4.
General exception with possible name of object and message.
A class that holds global options and constants.
static BDSGlobalConstants * Instance()
Access method.
Class to parse an ion particle definition.
Modular physics list based on Geant4 constructors.
Wrapper for particle definition.
G4ParticleDefinition * ParticleDefinition() const
Accessor.
Channelling physics process.
Physics processes required for user tracking limits.
Electromagnetic dissociation for high energy ions.
High energy muon processes.
std::string particle
beam parameters
double beamKineticEnergy
beam parameters
double beamEnergy
beam parameters
double Ek0
initial beam centroid
std::string beamParticleName
beam parameters
double P0
initial beam centroid
double beamMomentum
beam parameters
double E0
initial beam centroid
double get_value(std::string name) const
get method (only for doubles)
bool HasBeenSet(const std::string &name) const
Whether a parameter has been set using the set_value method or not.
List with Efficient Lookup.
void SetRangeCuts(G4VModularPhysicsList *physicsList, G4int verbosity=1)
void ConstructBeamParticleG4(const G4String &name)
void PrintDefinedParticles()
G4bool StrContains(const G4String &str, const G4String &test)
Utility function to simplify lots of syntax changes for pedantic g4 changes.
std::pair< G4Transportation *, G4CoupledTransportation * > FindTransportation(const G4ParticleDefinition *particleDef)
Taken from Geant4 field01 example. Get the two possible transportation processes.
G4String GetFullPath(G4String filename, bool excludeNameFromPath=false, bool useCWDForPrefix=false)
BDSParticleDefinition * ConstructParticleDefinition(const G4String &particleNameIn, G4double totalEnergyIn, G4double kineticEnergyIn, G4double momentumIn, G4double ffact=1)
G4String LowerCase(const G4String &str)
Utility function to simplify lots of syntax changes for pedantic g4 changes.
void ConflictingParametersSet(const GMAD::Beam &beamDefinition, const std::set< std::string > &keys, G4int nSet, G4bool warnZeroParamsSet=true, const G4String &unitString="")
Throw an exception if too few or too many parameters are set for the supplied keys.
void PrintPrimaryParticleProcesses(const G4String &primaryParticleName)
void BuildMuonBiasing(G4VModularPhysicsList *physicsList)
Build muon splitting biasing and wrap the various processes in the physics list.
void CheckAndSetEnergyValidityRange()
void FixGeant105ThreshholdsForBeamParticle(const BDSParticleDefinition *particleDefinition)
Apply FixGeant105ThreshholdsForParticle to the beam particle definition.
void FixGeant105ThreshholdsForParticle(const G4ParticleDefinition *particleDefinition)
void ConstructExtendedParticleSet()
void ConstructDesignAndBeamParticle(const GMAD::Beam &beamDefinition, G4double ffact, BDSParticleDefinition *&designParticle, BDSParticleDefinition *&beamParticle, G4bool &beamDifferentFromDesignParticle)
G4bool IsFinite(G4double value, G4double tolerance=std::numeric_limits< double >::epsilon())
G4int NBeamParametersSet(const GMAD::Beam &beamDefinition, const std::set< std::string > &keys)
Count how many out of the set of keys in a beam instance are set.
G4VModularPhysicsList * BuildPhysics(const G4String &physicsList, G4int verbosity=1)
G4bool IsIon(const G4ParticleDefinition *particle)
Whether a particle is an ion. A proton is counted NOT as an ion.
void ConstructMinimumParticleSet()
G4VModularPhysicsList * ChannellingPhysicsComplete(G4bool useEMD=false, G4bool regular=false, G4bool em4=false, G4bool emss=false)
Build the physics required for channelling to work correctly.