19#include "G4Version.hh"
20#if G4VERSION_NUMBER > 1009
22#include "BDSBOptrChangeCrossSection.hh"
23#include "BDSBOptrMultiParticleChangeCrossSection.hh"
25#include "BDSException.hh"
26#include "G4BiasingProcessInterface.hh"
29#include "G4GenericIon.hh"
30#include "G4IonTable.hh"
31#include "G4ParticleDefinition.hh"
32#include "G4ParticleTable.hh"
36BDSBOptrMultiParticleChangeCrossSection::BDSBOptrMultiParticleChangeCrossSection():
37 G4VBiasingOperator(
"BDSIM General Biasing"),
38 fCurrentOperator(nullptr),
48BDSBOptrMultiParticleChangeCrossSection::~BDSBOptrMultiParticleChangeCrossSection()
51void BDSBOptrMultiParticleChangeCrossSection::AddParticle(
const G4String& particleName)
53 const G4ParticleDefinition* particle = G4ParticleTable::GetParticleTable()->FindParticle(particleName);
56 {
throw BDSException(__METHOD_NAME__,
"Particle \"" + particleName +
"\" not found");}
59 fParticlesToBias.push_back(particle);
60 fBOptrForParticle[particle] = optr;
64void BDSBOptrMultiParticleChangeCrossSection::SetBias(
const G4String& biasObjectName,
65 const G4String& particleName,
66 const G4String& process,
70 G4String flagString =
"";
74 {flagString =
"all";
break;}
76 {flagString =
"primaries";
break;}
78 {flagString =
"primaries & secondaries";
break;}
81 throw BDSException(
"Error in biasing object \"" + biasObjectName +
82 "\": invalid particle flag \"" + std::to_string(iPrimary) +
83 "\" for biasing process \"" + process +
"\" for particle \"" +
84 particleName +
"\": can only be 1,2 or 3)");
88 G4cout <<
"Bias> Biasing process \"" << process <<
"\" for particle \"" << particleName <<
"\" by factor " << dBias;
89 G4cout <<
", for " << flagString <<
" particles" << G4endl;
91 const G4ParticleDefinition* particle = G4ParticleTable::GetParticleTable()->FindParticle(particleName);
93 {
throw BDSException(__METHOD_NAME__,
"Particle \"" + particleName +
"\" not found");}
96 {fBOptrForParticle[particle]->SetBias(process,dBias,iPrimary);}
99 e.AppendToMessage(
"in bias definition \"" + biasObjectName +
"\"");
104G4VBiasingOperation* BDSBOptrMultiParticleChangeCrossSection::ProposeOccurenceBiasingOperation(
const G4Track* track,
105 const G4BiasingProcessInterface* callingProcess)
115 if (fCurrentOperator)
116 {
return fCurrentOperator->GetProposedOccurenceBiasingOperation(track, callingProcess);}
121void BDSBOptrMultiParticleChangeCrossSection::StartTracking(
const G4Track* track)
124 const G4ParticleDefinition* definition = track->GetParticleDefinition();
125 std::map <const G4ParticleDefinition*,BDSBOptrChangeCrossSection*>::iterator it = fBOptrForParticle.find(definition);
126 fCurrentOperator = 0;
127 if (it != fBOptrForParticle.end())
128 {fCurrentOperator = (*it).second;}
132 if (G4IonTable::IsIon(definition) && definition != G4Proton::Definition())
134 auto search = fBOptrForParticle.find(G4GenericIon::Definition());
135 if (search != fBOptrForParticle.end())
136 {fCurrentOperator = search->second;}
142void BDSBOptrMultiParticleChangeCrossSection::
143OperationApplied(
const G4BiasingProcessInterface* callingProcess,
144 G4BiasingAppliedCase biasingCase,
145 G4VBiasingOperation* occurenceOperationApplied,
146 G4double weightForOccurenceInteraction,
147 G4VBiasingOperation* finalStateOperationApplied,
148 const G4VParticleChange* particleChangeProduced)
154 if (fCurrentOperator)
156 fCurrentOperator->ReportOperationApplied(callingProcess,
158 occurenceOperationApplied,
159 weightForOccurenceInteraction,
160 finalStateOperationApplied,
161 particleChangeProduced);
Operator that changes cross section of a process for a particle.
G4int fnInteractions
Count number of biased interations for current track.
General exception with possible name of object and message.