65 double currentStepTime,
66 bool userStepTimeLimit)
75 if (currentStepTime == 0.)
77 userStepTimeLimit =
false;
81 separationDistance, userStepTimeLimit);
89 pChanges->Initialize(trackA, trackB);
94 const auto pReactionData =
fMolReactionTable->GetReactionData(pMoleculeA, pMoleculeB);
99 const G4int nbProducts = pReactionData->GetNbProducts();
103 const G4double D1 = pMoleculeA->GetDiffusionCoefficient();
104 const G4double D2 = pMoleculeB->GetDiffusionCoefficient();
105 const G4double sqrD1 = D1 == 0. ? 0. : std::sqrt(D1);
106 const G4double sqrD2 = D2 == 0. ? 0. : std::sqrt(D2);
107 const G4double inv_numerator = 1./(sqrD1 + sqrD2);
111 for (
G4int j = 0; j < nbProducts; ++j)
113 auto pProduct =
new G4Molecule(pReactionData->GetProduct(j));
114 auto pProductTrack = pProduct->BuildTrack(trackA.
GetGlobalTime(), reactionSite);
116 pProductTrack->SetTrackStatus(
fAlive);
120 pChanges->AddSecondary(pProductTrack);
125 pChanges->KillParents(
true);
136 const double currentStepTime,
138 const bool reachedUserStepTimeLimit)
140 std::vector<std::unique_ptr<G4ITReactionChange>> fReactionInfo;
141 fReactionInfo.clear();
143 if (pReactionSet ==
nullptr)
145 return fReactionInfo;
149 for (
auto tracks_i = reactionPerTrackMap.cbegin();
150 tracks_i != reactionPerTrackMap.cend();
151 tracks_i = reactionPerTrackMap.cbegin())
153 G4Track* pTrackA = tracks_i->first;
162 assert(reactionList.cbegin() != reactionList.cend());
164 for (
auto it = reactionList.cbegin(); it != reactionList.cend(); it = reactionList.cbegin())
167 G4Track* pTrackB = reaction->GetReactant(pTrackA);
173 if (pTrackB == pTrackA)
177 <<
"The IT reaction process sent back a reaction between trackA and trackB. ";
178 exceptionDescription <<
"The problem is trackA == trackB";
180 "ITModelProcessor005",
182 exceptionDescription);
187 if (
TestReactibility(*pTrackA, *pTrackB, currentStepTime, reachedUserStepTimeLimit))
189 auto pReactionChange =
MakeReaction(*pTrackA, *pTrackB);
193 fReactionInfo.push_back(std::move(pReactionChange));
201 return fReactionInfo;
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
std::map< G4Track *, G4ITReactionPerTrackPtr, compTrackPerID > G4ITReactionPerTrackMap
G4shared_ptr< G4ITReaction > G4ITReactionPtr
std::list< G4ITReactionPtr > G4ITReactionList
G4shared_ptr< G4ITReactionPerTrack > G4ITReactionPerTrackPtr
G4Molecule * GetMolecule(const G4Track &track)
ReturnType & reference_cast(OriginalType &source)
CLHEP::Hep3Vector G4ThreeVector
void SetReactionModel(G4VDNAReactionModel *)
const G4DNAMolecularReactionTable *& fMolReactionTable
std::unique_ptr< G4ITReactionChange > MakeReaction(const G4Track &, const G4Track &) override
std::vector< std::unique_ptr< G4ITReactionChange > > FindReaction(G4ITReactionSet *, const double, const double, const bool) override
G4VDNAReactionModel * fpReactionModel
G4bool TestReactibility(const G4Track &, const G4Track &, double currentStepTime, bool userStepTimeLimit) override
void Push(G4Track *track) override
static G4ITFinder * Instance()
void SelectThisReaction(G4ITReactionPtr reaction)
G4ITReactionPerTrackMap & GetReactionMap()
void Push(G4Track *) override
static G4ITTrackHolder * Instance()
void RecordReaction(const G4DNAMolecularReactionData *, G4double, G4int=1)
static G4MoleculeCounterManager * Instance()
const G4MolecularConfiguration * GetMolecularConfiguration() const
G4TrackStatus GetTrackStatus() const
const G4ThreeVector & GetPosition() const
G4double GetGlobalTime() const
const G4ITReactionTable * fpReactionTable