74std::unique_ptr<G4ITReactionChange>
78 auto & tA =
const_cast<G4Track&
>(trackA);
79 auto & tB =
const_cast<G4Track&
>(trackB);
83 pChanges->Initialize(trackA, trackB);
88 const auto pReactionData =
fMolReactionTable->GetReactionData(pMoleculeA, pMoleculeB);
89 const G4int nbProducts = pReactionData->GetNbProducts();
99 const G4double D1 = pMoleculeA->GetDiffusionCoefficient();
100 const G4double D2 = pMoleculeB->GetDiffusionCoefficient();
101 const G4double sqrD1 = D1 == 0. ? 0. : std::sqrt(D1);
102 const G4double sqrD2 = D2 == 0. ? 0. : std::sqrt(D2);
103 const G4double inv_numerator = 1./(sqrD1 + sqrD2);
104 const G4ThreeVector reactionSite = sqrD2 * inv_numerator * tA.GetPosition()
105 + sqrD1 * inv_numerator * tB.GetPosition();
108 auto randP = (1-u) * tA.GetPosition() + u * tB.GetPosition();
110 for (
G4int j = 0; j < nbProducts; ++j)
112 auto product = pReactionData->GetProduct(j);
124 auto pProductTrack = pProduct->BuildTrack(trackA.
GetGlobalTime(), (reactionSite + randP)/2);
125 pProductTrack->SetTrackStatus(
fAlive);
127 pChanges->AddSecondary(pProductTrack);
130 pChanges->KillParents(
true);
144 G4double D1 = pMoleculeA->GetDiffusionCoefficient();
145 G4double D2 = pMoleculeB->GetDiffusionCoefficient();
168 exceptionDescription <<
"Two particles are overlap: "
172 G4Exception(
"G4DNAMakeReaction::PrepareForReaction()",
173 "G4DNAMakeReaction003",
176 S1.
setMag(reactionRadius);
184 G4double sigma = s12 + ( s12 * s12 ) / s22;
185 G4double alpha = reactionRadius * distance / (2 * (D1 + D2) * dt );
189 G4RandGauss::shoot(0.0, sigma),
190 G4RandGauss::shoot(0.0, sigma));
194 S1.
setTheta(rad * std::acos( 1.0 + (1. / alpha) *
196 (1.-std::exp(-2.0 * alpha)))));
207std::vector<std::unique_ptr<G4ITReactionChange>>
213 std::vector<std::unique_ptr<G4ITReactionChange>> ReactionInfo;
215 if (stepper ==
nullptr) {
220 auto pReactionChange = stepper->FindReaction(pReactionSet, StepTime, globalTime);
221 if (pReactionChange !=
nullptr) {
224 ReactionInfo.push_back(std::move(pReactionChange));
229 }
while(StepTime == currentStepTime);
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4Molecule * GetMolecule(const G4Track &track)
ReturnType & reference_cast(OriginalType &source)
CLHEP::Hep3Vector G4ThreeVector
std::unique_ptr< G4ITReactionChange > MakeReaction(const G4Track &, const G4Track &) override
G4VITTimeStepComputer * fpTimeStepper
std::vector< std::unique_ptr< G4ITReactionChange > > FindReaction(G4ITReactionSet *, const G4double, const G4double, const G4bool) override
G4DNAScavengerMaterial * fpScavengerMaterial
G4VDNAReactionModel * fpReactionModel
void SetReactionModel(G4VDNAReactionModel *)
void SetTimeStepComputer(G4VITTimeStepComputer *)
void UpdatePositionForReaction(G4Track &, G4Track &)
G4bool TestReactibility(const G4Track &, const G4Track &, G4double currentStepTime, G4bool userStepTimeLimit) override
const G4DNAMolecularReactionTable *& fMolReactionTable
void Push(G4Track *) override
static G4ITTrackHolder * Instance()
void RecordReaction(const G4DNAMolecularReactionData *, G4double, G4int=1)
static G4MoleculeCounterManager * Instance()
const G4MolecularConfiguration * GetMolecularConfiguration() const
const G4String & GetName() const override
static G4Scheduler * Instance()
G4VScavengerMaterial * GetScavengerMaterial() const
void SetPosition(const G4ThreeVector &aValue)
const G4ThreeVector & GetPosition() const
G4double GetGlobalTime() const
const G4ITReactionTable * fpReactionTable