77{
78 auto & tA = const_cast<G4Track&>(trackA);
79 auto & tB = const_cast<G4Track&>(trackB);
81
82 std::unique_ptr<G4ITReactionChange> pChanges(new G4ITReactionChange());
83 pChanges->Initialize(trackA, trackB);
84
87
88 const auto pReactionData =
fMolReactionTable->GetReactionData(pMoleculeA, pMoleculeB);
89 const G4int nbProducts = pReactionData->GetNbProducts();
90
92
93
96 }
97 if (nbProducts != 0)
98 {
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();
106
108 auto randP = (1-u) * tA.GetPosition() + u * tB.GetPosition();
109
110 for (
G4int j = 0; j < nbProducts; ++j)
111 {
112 auto product = pReactionData->GetProduct(j);
113
116 if (isScavenger) {
119 continue;
120 }
121 }
122
123 auto pProduct = new G4Molecule(product);
124 auto pProductTrack = pProduct->BuildTrack(trackA.
GetGlobalTime(), (reactionSite + randP)/2);
125 pProductTrack->SetTrackStatus(
fAlive);
127 pChanges->AddSecondary(pProductTrack);
128 }
129 }
130 pChanges->KillParents(true);
131 return pChanges;
132}
G4Molecule * GetMolecule(const G4Track &track)
CLHEP::Hep3Vector G4ThreeVector
void UpdatePositionForReaction(G4Track &, G4Track &)
void Push(G4Track *) override
static G4ITTrackHolder * Instance()
void RecordReaction(const G4DNAMolecularReactionData *, G4double, G4int=1)
static G4MoleculeCounterManager * Instance()
const G4MolecularConfiguration * GetMolecularConfiguration() const
G4double GetGlobalTime() const