Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4DNAMolecularReaction.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// $Id: G4DNAMolecularReaction.cc 64057 2012-10-30 15:04:49Z gcosmo $
27//
28// Author: Mathieu Karamitros ([email protected])
29//
30// WARNING : This class is released as a prototype.
31// It might strongly evolve or even disapear in the next releases.
32//
33// History:
34// -----------
35// 10 Oct 2011 M.Karamitros created
36//
37// -------------------------------------------------------------------
38
42#include "G4ITManager.hh"
43#include "G4UnitsTable.hh"
44
45using namespace std;
46
48 fMolReactionTable(reference_cast<const G4DNAMolecularReactionTable*>(fpReactionTable))
49{
50 //ctor
51 fVerbose = 0;
53 fReactionRadius = -1;
54 fDistance = -1;
55}
56
58{
59 //dtor
60 if(fpChanges) delete fpChanges;
61}
62
64 fMolReactionTable(reference_cast<const G4DNAMolecularReactionTable*>(fpReactionTable))
65{
66 //copy ctor
67 fVerbose = other.fVerbose ;
70 fReactionRadius = -1;
71 fDistance = -1;
72}
73
75{
76 if (this == &rhs) return *this; // handle self assignment
77
78 fVerbose = rhs.fVerbose ;
80 fReactionRadius = -1;
81 fDistance = -1;
82
83 //assignment operator
84 return *this;
85}
86
88 const G4Track& trackB,
89 const double currentStepTime,
90 const double /*previousStepTime*/,
91 bool userStepTimeLimit) /*const*/
92{
93 G4Molecule* moleculeA = GetMolecule(trackA);
94 G4Molecule* moleculeB = GetMolecule(trackB);
95
97 {
98 G4ExceptionDescription exceptionDescription ("You have to give a reaction model to the molecular reaction process");
99 G4Exception("G4DNAMolecularReaction::TestReactibility","MolecularReaction001",
100 FatalErrorInArgument,exceptionDescription);
101 return false; // makes coverity happy
102 }
103 if(fMolReactionTable==0)
104 {
105 G4ExceptionDescription exceptionDescription ("You have to give a reaction table to the molecular reaction process");
106 G4Exception("G4DNAMolecularReaction::TestReactibility","MolecularReaction002",
107 FatalErrorInArgument,exceptionDescription);
108 return false; // makes coverity happy
109 }
110
111 // Retrieve reaction range
112 fReactionRadius = -1 ; // reaction Range
113 fReactionRadius = fReactionModel -> GetReactionRadius(moleculeA, moleculeB);
114
115 fDistance = -1 ; // separation distance
116
117 if(currentStepTime == 0.)
118 {
119 userStepTimeLimit = false;
120 }
121
122 G4bool output = fReactionModel->FindReaction(trackA, trackB, fReactionRadius,fDistance, userStepTimeLimit);
123
124#ifdef G4VERBOSE
125 // DEBUG
126 if(fVerbose > 1)
127 {
128 G4cout << "\033[1;39;36m" << "G4MolecularReaction "<< G4endl;
129 G4cout << "FindReaction returned : " << G4BestUnit(output,"Length") << G4endl;
130 G4cout << " reaction radius : " << G4BestUnit(fReactionRadius,"Length")
131 << " real distance : " << G4BestUnit((trackA.GetPosition() - trackB.GetPosition()).mag(), "Length")
132 << " calculated distance by model (= -1 if real distance > reaction radius and the user limitation step is not reached) : "
133 << G4BestUnit(fDistance,"Length")
134 << G4endl;
135
136 G4cout << "TrackID A : " << trackA.GetTrackID()
137 << ", TrackID B : " << trackB.GetTrackID()
138 << " | MolA " << moleculeA->GetName()
139 << ", MolB " << moleculeB->GetName()
140 <<"\033[0m\n"
141 << G4endl;
142 G4cout << "--------------------------------------------" << G4endl;
143 }
144#endif
145 return output ;
146}
147
148
150{
152 fpChanges->Initialize(trackA, trackB);
153
154 G4Molecule* moleculeA = GetMolecule(trackA);
155 G4Molecule* moleculeB = GetMolecule(trackB);
156
157#ifdef G4VERBOSE
158 // DEBUG
159 if(fVerbose)
160 {
161 G4cout << "G4DNAMolecularReaction::MakeReaction" << G4endl;
162 G4cout<<"TrackA n°" << trackA.GetTrackID()
163 <<"\t | Track B n°" << trackB.GetTrackID() << G4endl;
164
165 G4cout<<"Track A : Position : " << G4BestUnit(trackA.GetPosition(),"Length")
166 <<"\t Global Time : " << G4BestUnit(trackA.GetGlobalTime(), "Time")<< G4endl;
167
168 G4cout<<"Track B : Position : " << G4BestUnit(trackB.GetPosition() ,"Length")
169 <<"\t Global Time : " << G4BestUnit(trackB.GetGlobalTime(), "Time")<< G4endl;
170
171 G4cout<<"Reaction range : " << G4BestUnit(fReactionRadius,"Length")
172 << " \t Separation distance : " << G4BestUnit(fDistance,"Length")<< G4endl;
173 G4cout << "--------------------------------------------" << G4endl;
174 }
175#endif
176
177 const G4DNAMolecularReactionData* reactionData = fMolReactionTable->GetReactionData(moleculeA, moleculeB);
178
179 G4int nbProducts = reactionData->GetNbProducts();
180
181 if (nbProducts)
182 {
183 G4double D1 = moleculeA->GetDiffusionCoefficient();
184 G4double D2 = moleculeB->GetDiffusionCoefficient();
185 G4double sqrD1 = sqrt(D1);
186 G4double sqrD2 = sqrt(D2);
187 G4double numerator = sqrD1 + sqrD2;
188 G4ThreeVector reactionSite = sqrD1/numerator * trackA.GetPosition()
189 + sqrD2/numerator * trackB.GetPosition() ;
190
191 for (G4int j=0 ; j < nbProducts; j++)
192 {
193 G4Molecule* product = new G4Molecule(*reactionData->GetProduct(j));
194 G4Track* productTrack = product->BuildTrack(trackA.GetGlobalTime(),
195 reactionSite);
196
197 productTrack->SetTrackStatus(fAlive);
198
199 fpChanges->AddSecondary(productTrack);
200 G4ITManager<G4Molecule>::Instance()->Push(productTrack);
201 }
202 }
203
204 fpChanges->KillParents(true);
205
206 return fpChanges;
207}
@ FatalErrorInArgument
G4Molecule * GetMolecule(const G4Track &track)
Definition: G4Molecule.cc:67
ReturnType & reference_cast(OriginalType &source)
@ fAlive
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
const G4Molecule * GetProduct(G4int i) const
const G4DNAMolecularReactionData * GetReactionData(const G4Molecule *, const G4Molecule *) const
const G4DNAMolecularReactionTable *& fMolReactionTable
G4DNAMolecularReaction & operator=(const G4DNAMolecularReaction &other)
virtual G4bool TestReactibility(const G4Track &, const G4Track &, const double currentStepTime, const double previousStepTime, bool userStepTimeLimit)
G4VDNAReactionModel * fReactionModel
virtual G4ITReactionChange * MakeReaction(const G4Track &, const G4Track &)
static G4ITManager< T > * Instance()
void AddSecondary(G4Track *aSecondary)
void Initialize(const G4Track &, const G4Track &, G4VParticleChange *particleChangeA=0, G4VParticleChange *particleChangeB=0)
const G4String & GetName() const
Definition: G4Molecule.cc:259
G4Track * BuildTrack(G4double globalTime, const G4ThreeVector &Position)
Definition: G4Molecule.cc:279
G4double GetDiffusionCoefficient() const
Definition: G4Molecule.cc:405
void SetTrackStatus(const G4TrackStatus aTrackStatus)
G4int GetTrackID() const
const G4ThreeVector & GetPosition() const
G4double GetGlobalTime() const
virtual G4bool FindReaction(const G4Track &, const G4Track &, const G4double, G4double &, const G4bool)=0
G4ITReactionChange * fpChanges
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76
#define const
Definition: zconf.h:118