56 return 1. / (1. + 0.0012 / (density *
density));
59 double A(
double temperature)
61 double temp_inverse = 1 / temperature;
63 + 642.0 * temp_inverse
64 - 1.167e5 * temp_inverse * temp_inverse
65 + 9.190e6 * temp_inverse * temp_inverse * temp_inverse;
68 double B(
double temperature)
70 double temp_inverse = 1 / temperature;
72 + 275.4 * temp_inverse
73 + 0.3245e5 * temp_inverse * temp_inverse;
78 double temp_inverse = 1 / temp;
81 - 11.41 * temp_inverse
82 - 35260.0 * temp_inverse * temp_inverse;
87 return A(temp) -
B(temp) - 3;
97 return 1 + std::exp(std::log(10.)*
99 (
C(temperature) + (
S(temperature) - 1)*std::log(density)/std::log(10.))
100 +
D(temperature) + std::log(density)/std::log(10.)));
106 G4VITRestDiscreteProcess(
"G4DNAElectronHoleRecombination",
fElectromagnetic)
123 enableAtRestDoIt =
true;
124 enableAlongStepDoIt =
false;
125 enablePostStepDoIt =
true;
127 SetProcessSubType(60);
134 fProposesTimeStep =
true;
147 ClearInteractionTimeLeft();
148 ClearNumberOfInteractionLengthLeft();
169 std::vector<ReactionProfile>& reactants = state->
fReactants;
171 G4Track* selected_reactant = 0;
173 for(
size_t i = 0; i < reactants.size(); ++i)
175 if(reactants[i].fElectron->GetTrackStatus() != fAlive)
continue;
176 if(reactants[i].fProbability > random)
178 selected_reactant = reactants[i].fElectron;
186 if(selected_reactant)
193 RemoveAMoleculeAtTime(
GetMolecule(track)->GetMolecularConfiguration(),
194 track.GetGlobalTime());
199 AddAMoleculeAtTime(
GetMolecule(track)->GetMolecularConfiguration(),
200 track.GetGlobalTime());
205 selected_reactant->SetTrackStatus(fStopAndKill);
226 const std::vector<double>* densityTable =
229 double temperature = track.GetMaterial()->GetTemperature();
230 double density = (*densityTable)[track.GetMaterial()->GetIndex()] /
245 10. * onsager_radius);
250 if(results == 0 || results->GetSize() == 0)
259 std::vector<ReactionProfile>& reactants = state->
fReactants;
262 reactants.resize(results->GetSize());
264 for(
size_t i = 0; results->End() ==
false; results->Next(), ++i)
266 reactants[i].fElectron = results->GetItem<
G4IT>()->GetTrack();
267 reactants[i].fDistance = std::sqrt(results->GetDistanceSqr());
269 if(reactants[i].fDistance != 0)
271 reactants[i].fProbability = 1.
272 - std::exp(-onsager_radius / reactants[i].fDistance);
276 reactants[i].fProbability = 1.;
283 if(results->GetSize() != 0 && reactants.empty())
289 if(reactants.empty())
return false;
297 if(reactants[0].fProbability > state->
fSampleProba)
return true;
326 double probaRemaining = 1.;
344 probaRemaining -= proba;
346 B1A1_DissociationDecay);
364 probaRemaining -= proba;
366 A1B1_DissociationDecay);
static double onsager_constant
static G4Electron_aq * Definition()
const std::vector< double > * fpMoleculeDensity
G4MoleculeDefinition * GetMoleculeDefinition(const G4String &, bool mustExist=true)
virtual ~G4DNAElectronHoleRecombination()
static G4H2O * Definition()
void SetProbability(G4double)
void AddDecayChannel(const G4MolecularConfiguration *molConf, const G4MolecularDissociationChannel *channel)
void StartTracking(G4Track *)
G4bool FindReactant(const G4Track &track)
std::vector< ReactionProfile > fReactants
static G4ITFinder * Instance()
static const G4double eps
double B(double temperature)
G4KDTreeResultHandle FindNearestInRange(const T *point, int key, G4double)
virtual G4bool IsApplicable(const G4ParticleDefinition &)
void SetInstantiateProcessState(G4bool flag)
void ChangeConfigurationToLabel(const G4String &label)
G4MolecularConfiguration * NewConfiguration(const G4String &excitedStateLabel)
virtual void StartTracking(G4Track *)
G4int GetMoleculeID() const
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
void AddProduct(const G4Molecule *, G4double=0)
static G4MoleculeCounter * Instance()
virtual G4VParticleChange * AtRestDoIt(const G4Track &, const G4Step &)
static G4MoleculeTable * Instance()
const std::vector< double > * GetDensityTableFor(const G4Material *) const
virtual void StartTracking(G4Track *)
G4shared_ptr< G4ProcessState > fpState
G4Molecule * GetMolecule(const G4Track &track)
virtual G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *condition)
static G4DNAMolecularMaterial * Instance()
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
virtual G4double GetMeanLifeTime(const G4Track &aTrack, G4ForceCondition *condition)
void MakeReaction(const G4Track &track)
G4ParticleChange fParticleChange
void SetDisplacementType(DisplacementType)
double epsilon(double density, double temperature)
G4DNAElectronHoleRecombination()
G4MolecularConfiguration * GetConfiguration(const G4String &, bool mustExist=true)