62 fPhysBiasAllCharged(false), fNonPhysBiasAllCharged(false),
63 fPhysBiasAllChargedISL(false), fNonPhysBiasAllChargedISL(false),
64 fPhysBiasAllNeutral(false), fNonPhysBiasAllNeutral(false),
65 fPhysBiasAllNeutralISL(false), fNonPhysBiasAllNeutralISL(false),
79 fBiasedParticles.push_back(particleName);
80 fBiasedProcesses.emplace_back();
81 fBiasAllProcesses.push_back(
true);
88 fBiasedParticles.push_back(particleName);
89 fBiasedProcesses.push_back(processNames);
90 fBiasAllProcesses.push_back(
false);
97 fNonPhysBiasedParticles.push_back(particleName);
119 if ( PDGlow > PDGhigh )
G4cout <<
" G4GenericBiasingPhysics::PhysicsBiasAddPDGRange(...) : PDGlow > PDGhigh, call ignored." <<
G4endl;
120 fPhysBiasByPDGRangeLow .push_back( PDGlow );
121 fPhysBiasByPDGRangeHigh.push_back( PDGhigh );
122 if ( includeAntiParticle )
124 fPhysBiasByPDGRangeLow .push_back( -PDGhigh );
125 fPhysBiasByPDGRangeHigh.push_back( -PDGlow );
132 if ( PDGlow > PDGhigh ) {
133 G4cout <<
" G4GenericBiasingPhysics::NonPhysicsBiasAddPDGRange(...) : PDGlow > PDGhigh, call ignored." <<
G4endl;
136 fNonPhysBiasByPDGRangeLow .push_back( PDGlow );
137 fNonPhysBiasByPDGRangeHigh.push_back( PDGhigh );
138 if ( includeAntiParticle )
140 fNonPhysBiasByPDGRangeLow .push_back( -PDGhigh );
141 fNonPhysBiasByPDGRangeHigh.push_back( -PDGlow );
149 if ( PDGlow > PDGhigh ) {
150 G4cout <<
" G4GenericBiasingPhysics::BiasAddPDGRange(...) : PDGlow > PDGhigh, call ignored." <<
G4endl;
159 fPhysBiasAllCharged =
true;
160 fPhysBiasAllChargedISL = includeShortLived;
164 fNonPhysBiasAllCharged =
true;
165 fNonPhysBiasAllChargedISL = includeShortLived;
169 fPhysBiasAllCharged =
true;
170 fNonPhysBiasAllCharged =
true;
171 fPhysBiasAllChargedISL = includeShortLived;
172 fNonPhysBiasAllChargedISL = includeShortLived;
176 fPhysBiasAllNeutral =
true;
177 fPhysBiasAllNeutralISL = includeShortLived;
181 fNonPhysBiasAllNeutral =
true;
182 fNonPhysBiasAllNeutralISL = includeShortLived;
186 fPhysBiasAllNeutral =
true;
187 fNonPhysBiasAllNeutral =
true;
188 fPhysBiasAllNeutralISL = includeShortLived;
189 fNonPhysBiasAllNeutralISL = includeShortLived;
197 for (
G4String knownParticle : fParticlesWithParallelGeometries )
199 if ( knownParticle == particleName )
207 if ( !isKnown ) fParticlesWithParallelGeometries.push_back( particleName );
208 std::vector< G4String >& geometries = fParallelGeometriesForParticle[particleName];
211 for (
G4String knownGeometry : geometries )
213 if ( knownGeometry == parallelGeometryName )
219 if ( !isKnown ) geometries.push_back( parallelGeometryName );
230 if ( PDGlow > PDGhigh )
232 G4cout <<
"G4GenericBiasingPhysics::AddParallelGeometry( G4int PDGlow, G4int PDGhigh, const G4String& parallelGeometryName , G4bool includeAntiParticle = true ), PDGlow > PDGhigh : call ignored" <<
G4endl;
236 fPDGlowParallelGeometries .push_back( PDGlow );
237 fPDGhighParallelGeometries.push_back( PDGhigh );
238 G4int rangeIndex =
G4int(fPDGlowParallelGeometries.size() - 1);
239 fPDGrangeParallelGeometries[rangeIndex].push_back( parallelGeometryName );
241 if ( includeAntiParticle )
243 fPDGlowParallelGeometries .push_back( -PDGhigh );
244 fPDGhighParallelGeometries.push_back( -PDGlow );
245 rangeIndex =
G4int(fPDGlowParallelGeometries.size() - 1);
246 fPDGrangeParallelGeometries[rangeIndex].push_back( parallelGeometryName );
253 if ( PDGlow > PDGhigh )
255 G4cout <<
"G4GenericBiasingPhysics::AddParallelGeometry( G4int PDGlow, G4int PDGhigh, const std::vector< G4String >& parallelGeometryNames, G4bool includeAntiParticle = true ), PDGlow > PDGhigh : call ignored" <<
G4endl;
265 for (
G4String geometry : fParallelGeometriesForCharged )
267 if ( geometry == parallelGeometryName )
275 fParallelGeometriesForCharged .push_back( parallelGeometryName );
276 fAllChargedParallelGeometriesISL.push_back( includeShortLived );
288 for (
G4String geometry : fParallelGeometriesForNeutral )
290 if ( geometry == parallelGeometryName )
298 fParallelGeometriesForNeutral .push_back( parallelGeometryName );
299 fAllNeutralParallelGeometriesISL.push_back( includeShortLived );
331 if ( std::find(fNonPhysBiasedParticles.begin(),
332 fNonPhysBiasedParticles.end(),
333 particleName ) != fNonPhysBiasedParticles.end() )
339 std::vector< G4String >::const_iterator particleIt =
340 std::find(fBiasedParticles.begin(),
341 fBiasedParticles.end(),
343 if ( particleIt == fBiasedParticles.end() )
continue;
345 std::vector < G4String >& biasedProcesses = fBiasedProcesses [ particleIt - fBiasedParticles.begin() ];
346 G4bool biasAll = fBiasAllProcesses[ particleIt - fBiasedParticles.begin() ];
359 while ( restartLoop )
361 for (std::size_t ip = 0 ; ip < biasedProcesses.size() ; ++ip)
365 if ( restartLoop )
break;
382 if ( std::find( fNonPhysBiasedParticles.begin(),
383 fNonPhysBiasedParticles.end(),
384 particleName ) != fNonPhysBiasedParticles.end() )
continue;
386 if ( std::find( fBiasedParticles.begin(),
387 fBiasedParticles.end(),
388 particleName ) != fBiasedParticles.end() )
continue;
391 G4bool physBias(
false), nonPhysBias(
false);
396 for ( std::size_t i = 0 ; i < fPhysBiasByPDGRangeLow.size() ; i++ )
397 if ( ( PDG >= fPhysBiasByPDGRangeLow[i] ) && ( PDG <= fPhysBiasByPDGRangeHigh[i] ) )
402 for ( std::size_t i = 0 ; i < fNonPhysBiasByPDGRangeLow.size() ; i++ )
403 if ( ( PDG >= fNonPhysBiasByPDGRangeLow[i] ) && ( PDG <= fNonPhysBiasByPDGRangeHigh[i] ) )
410 if ( ( physBias ==
false ) && ( nonPhysBias ==
false ) )
414 if ( fPhysBiasAllCharged )
if ( fPhysBiasAllChargedISL || !particle->
IsShortLived() ) physBias =
true;
415 if ( fNonPhysBiasAllCharged )
if ( fNonPhysBiasAllChargedISL || !particle->
IsShortLived() ) nonPhysBias =
true;
419 if ( fPhysBiasAllNeutral )
if ( fPhysBiasAllNeutralISL || !particle->
IsShortLived() ) physBias =
true;
420 if ( fNonPhysBiasAllNeutral )
if ( fNonPhysBiasAllNeutralISL || !particle->
IsShortLived() ) nonPhysBias =
true;
429 std::vector < G4String > biasedProcesses;
438 while ( restartLoop )
440 for (std::size_t ip = 0 ; ip < biasedProcesses.size() ; ++ip)
444 if ( restartLoop )
break;
454 AssociateParallelGeometries();
488 processNames +=
"\n ";
499 G4cout << std::setw(14) << particleName <<
" **** : " << processNames <<
G4endl;
501 G4cout << std::setw(18) << particleName <<
" : " << processNames <<
G4endl;
509void G4GenericBiasingPhysics::AssociateParallelGeometries()
522 if ( std::find(fParticlesWithParallelGeometries.begin(),
523 fParticlesWithParallelGeometries.end(),
524 particleName) != fParticlesWithParallelGeometries.end() )
530 std::vector< G4String >& parallelWorlds = fParallelGeometriesForParticle[ particleName ];
539 for (
G4int PDGlow : fPDGlowParallelGeometries )
541 G4int PDGhigh = fPDGhighParallelGeometries[i];
542 auto & geometries = fPDGrangeParallelGeometries[i];
552 if ( ( particlePDG >= PDGlow ) && ( particlePDG <= PDGhigh ) )
569 G4bool islAllNeutral =
false;
570 for(
auto isln : fAllNeutralParallelGeometriesISL)
571 { islAllNeutral |= isln; }
572 G4bool islAllCharged =
false;
573 for(
auto islc : fAllChargedParallelGeometriesISL)
574 { islAllCharged |= islc; }
582 if ( !fParallelGeometriesForNeutral.empty() ) {
584 if(particle->
IsShortLived() && !islAllNeutral)
continue;
587 for(G4String& wNameN : fParallelGeometriesForNeutral)
589 if(!(particle->
IsShortLived()) || fAllNeutralParallelGeometriesISL[j])
597 if ( !fParallelGeometriesForCharged.empty() ) {
599 if(particle->
IsShortLived() && !islAllCharged)
continue;
602 for(G4String& wNameC : fParallelGeometriesForCharged)
604 if(!(particle->
IsShortLived()) || fAllChargedParallelGeometriesISL[j])
std::vector< G4InuclElementaryParticle >::iterator particleIterator
#define G4_DECLARE_PHYSCONSTR_FACTORY(physics_constructor)
G4GLOB_DLL std::ostream G4cout
static G4bool ActivatePhysicsBiasing(G4ProcessManager *pmanager, const G4String &physicsProcessToBias, const G4String &wrappedName="")
static void ActivateNonPhysicsBiasing(G4ProcessManager *pmanager, const G4String &nonPhysicsProcessName="")
static G4ParallelGeometriesLimiterProcess * AddLimiterProcess(G4ProcessManager *pmanager, const G4String &processName="biasLimiter")
void BiasAllNeutral(G4bool includeShortLived=false)
void NonPhysicsBiasAllNeutral(G4bool includeShortLived=false)
virtual void ConstructProcess()
G4GenericBiasingPhysics(const G4String &name="BiasingP")
void BiasAddPDGRange(G4int PDGlow, G4int PDGhigh, G4bool includeAntiParticle=true)
void AddParallelGeometry(const G4String &particleName, const G4String ¶llelGeometryName)
void NonPhysicsBiasAddPDGRange(G4int PDGlow, G4int PDGhigh, G4bool includeAntiParticle=true)
void PhysicsBias(const G4String &particleName)
void PhysicsBiasAddPDGRange(G4int PDGlow, G4int PDGhigh, G4bool includeAntiParticle=true)
void AddParallelGeometryAllNeutral(const G4String ¶llelGeometryName, G4bool includeShortLived=false)
void NonPhysicsBias(const G4String &particleName)
void AddParallelGeometryAllCharged(const G4String ¶llelGeometryName, G4bool includeShortLived=false)
virtual void ConstructParticle()
void PhysicsBiasAllCharged(G4bool includeShortLived=false)
void Bias(const G4String &particleName)
void BiasAllCharged(G4bool includeShortLived=false)
virtual ~G4GenericBiasingPhysics()
void PhysicsBiasAllNeutral(G4bool includeShortLived=false)
void NonPhysicsBiasAllCharged(G4bool includeShortLived=false)
void AddParallelWorld(const G4String ¶llelWorldName)
G4ProcessManager * GetProcessManager() const
G4bool IsShortLived() const
G4int GetPDGEncoding() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const
G4ProcessVector * GetProcessList() const
G4VPhysicsConstructor(const G4String &="")
G4ParticleTable::G4PTblDicIterator * GetParticleIterator() const
const G4String & GetProcessName() const