18#include "G4Version.hh"
19#if G4VERSION_NUMBER > 1009
21#include "BDSBOptrChangeCrossSection.hh"
22#include "BDSBOptrMultiParticleChangeCrossSection.hh"
24#include "BDSException.hh"
25#include "G4BiasingProcessInterface.hh"
28#include "G4GenericIon.hh"
29#include "G4IonTable.hh"
30#include "G4ParticleDefinition.hh"
31#include "G4ParticleTable.hh"
35BDSBOptrMultiParticleChangeCrossSection::BDSBOptrMultiParticleChangeCrossSection():
36 G4VBiasingOperator(
"BDSIM General Biasing"),
37 fCurrentOperator(nullptr),
47BDSBOptrMultiParticleChangeCrossSection::~BDSBOptrMultiParticleChangeCrossSection()
50void BDSBOptrMultiParticleChangeCrossSection::AddParticle(
const G4String& particleName)
52 const G4ParticleDefinition* particle = G4ParticleTable::GetParticleTable()->FindParticle(particleName);
55 {
throw BDSException(__METHOD_NAME__,
"Particle \"" + particleName +
"\" not found");}
58 fParticlesToBias.push_back(particle);
59 fBOptrForParticle[particle] = optr;
63void BDSBOptrMultiParticleChangeCrossSection::SetBias(
const G4String& biasObjectName,
64 const G4String& particleName,
65 const G4String& process,
69 G4String flagString =
"";
73 {flagString =
"all";
break;}
75 {flagString =
"primaries";
break;}
77 {flagString =
"primaries & secondaries";
break;}
80 throw BDSException(
"Error in biasing object \"" + biasObjectName +
81 "\": invalid particle flag \"" + std::to_string(iPrimary) +
82 "\" for biasing process \"" + process +
"\" for particle \"" +
83 particleName +
"\": can only be 1,2 or 3)");
87 G4cout <<
"Bias> Biasing process \"" << process <<
"\" for particle \"" << particleName <<
"\" by factor " << dBias;
88 G4cout <<
", for " << flagString <<
" particles" << G4endl;
90 const G4ParticleDefinition* particle = G4ParticleTable::GetParticleTable()->FindParticle(particleName);
92 {
throw BDSException(__METHOD_NAME__,
"Particle \"" + particleName +
"\" not found");}
95 {fBOptrForParticle[particle]->SetBias(process,dBias,iPrimary);}
98 e.AppendToMessage(
"in bias definition \"" + biasObjectName +
"\"");
103G4VBiasingOperation* BDSBOptrMultiParticleChangeCrossSection::ProposeOccurenceBiasingOperation(
const G4Track* track,
104 const G4BiasingProcessInterface* callingProcess)
114 if (fCurrentOperator)
115 {
return fCurrentOperator->GetProposedOccurenceBiasingOperation(track, callingProcess);}
120void BDSBOptrMultiParticleChangeCrossSection::StartTracking(
const G4Track* track)
123 const G4ParticleDefinition* definition = track->GetParticleDefinition();
124 std::map <const G4ParticleDefinition*,BDSBOptrChangeCrossSection*>::iterator it = fBOptrForParticle.find(definition);
125 fCurrentOperator = 0;
126 if (it != fBOptrForParticle.end())
127 {fCurrentOperator = (*it).second;}
131 if (G4IonTable::IsIon(definition) && definition != G4Proton::Definition())
133 auto search = fBOptrForParticle.find(G4GenericIon::Definition());
134 if (search != fBOptrForParticle.end())
135 {fCurrentOperator = search->second;}
141void BDSBOptrMultiParticleChangeCrossSection::
142OperationApplied(
const G4BiasingProcessInterface* callingProcess,
143 G4BiasingAppliedCase biasingCase,
144 G4VBiasingOperation* occurenceOperationApplied,
145 G4double weightForOccurenceInteraction,
146 G4VBiasingOperation* finalStateOperationApplied,
147 const G4VParticleChange* particleChangeProduced)
153 if (fCurrentOperator)
155 fCurrentOperator->ReportOperationApplied(callingProcess,
157 occurenceOperationApplied,
158 weightForOccurenceInteraction,
159 finalStateOperationApplied,
160 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.