48static G4double onsager_constant = e_squared / (4. *
pi * epsilon0 * k_Boltzmann);
56 return 1. / (1. + 0.0012 / (density * density));
61 G4double 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;
70 G4double temp_inverse = 1 / temperature;
72 + 275.4 * temp_inverse
73 + 0.3245e5 * temp_inverse * temp_inverse;
81 - 11.41 * temp_inverse
82 - 35260.0 * temp_inverse * temp_inverse;
87 return A(temp) -
B(temp) - 3;
97 return 1 +
G4Exp(std::log(10.) *
99 (C(temperature) + (
S(temperature) - 1) * std::log(density) / std::log(10.))
100 +
D(temperature) + std::log(density) / std::log(10.)));
127 fIsInitialized =
false;
129 fpMoleculeDensity =
nullptr;
144 return &fParticleChange;
158void G4DNAElectronHoleRecombination::MakeReaction(
const G4Track& track)
162 G4double random = pState->fSampleProba;
163 std::vector<ReactantInfo>& reactants = pState->fReactants;
165 G4Track* pSelectedReactant =
nullptr;
167 for (
const auto& reactantInfo : reactants)
169 if (reactantInfo.fElectron->GetTrackStatus() !=
fAlive)
173 if (reactantInfo.fProbability > random)
175 pSelectedReactant = reactantInfo.fElectron;
180 if (pSelectedReactant)
185 RemoveAMoleculeAtTime(
GetMolecule(track)->GetMolecularConfiguration(),
194 AddAMoleculeAtTime(
GetMolecule(track)->GetMolecularConfiguration(),
214G4bool G4DNAElectronHoleRecombination::FindReactant(
const G4Track& track)
221 const auto pDensityTable =
228 G4double onsagerRadius = onsager_constant * 1. / (temperature * eps);
233 std::vector<ReactantInfo>& reactants = pState->fReactants;
245 resultIndices.clear();
249 e_aq.GetMoleculeID(),
254 if(resultIndices.empty())
258 reactants.resize(resultIndices.size());
260 for(
auto& it : resultIndices)
262 reactants[i].fElectron = *(std::get<0>(it));
263 reactants[i].fDistance = (reactants[i].fElectron->GetPosition() -
265 if (reactants[i].fDistance != 0)
267 reactants[i].fProbability = 1. -
G4Exp(-onsagerRadius /
268 reactants[i].fDistance);
272 reactants[i].fProbability = 1.;
281 e_aq.GetMoleculeID(),
282 10. * onsagerRadius);
284 if (results == 0 || results->GetSize() == 0)
290 reactants.resize(results->GetSize());
292 for (
size_t i = 0; !results->End(); results->Next(), ++i)
294 reactants[i].fElectron = results->GetItem<
G4IT>()->GetTrack();
295 reactants[i].fDistance = std::sqrt(results->GetDistanceSqr());
297 if (reactants[i].fDistance != 0)
299 reactants[i].fProbability = 1. -
G4Exp(-onsagerRadius / reactants[i].fDistance);
303 reactants[i].fProbability = 1.;
307 return reactants.empty() ? false : reactants[0].fProbability > pState->fSampleProba;
330 if (FindReactant(track))
343 if (FindReactant(track))
#define BuildChemicalMoleculeFinder()
G4double epsilon(G4double density, G4double temperature)
G4double S(G4double temp)
G4double B(G4double temperature)
G4double D(G4double temp)
G4double Y(G4double density)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
@ fLowEnergyTransportation
G4Molecule * GetMolecule(const G4Track &track)
G4double GetMeanLifeTime(const G4Track &aTrack, G4ForceCondition *condition) override
G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &) override
G4DNAElectronHoleRecombination()
G4bool IsApplicable(const G4ParticleDefinition &) override
void StartTracking(G4Track *) override
G4VParticleChange * AtRestDoIt(const G4Track &, const G4Step &) override
virtual ~G4DNAElectronHoleRecombination()
G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *condition) override
static G4DNAMolecularMaterial * Instance()
const std::vector< G4double > * GetDensityTableFor(const G4Material *) const
Retrieve a table of volumetric mass densities (mass per unit volume) in the G4 unit system for chosen...
static G4Electron_aq * Definition()
static G4H2O * DefinitionIfExists()
G4KDTreeResultHandle FindNearestInRange(const T *point, G4int key, G4double)
static G4ITFinder * Instance()
G4double GetTemperature() const
void ChangeConfigurationToLabel(const G4String &label)
static G4OctreeFinder * Instance()
void Initialize(const G4Track &) override
void SetTrackStatus(const G4TrackStatus aTrackStatus)
const G4ThreeVector & GetPosition() const
G4double GetGlobalTime() const
G4Material * GetMaterial() const
virtual void StartTracking(G4Track *)
void SetInstantiateProcessState(G4bool flag)
G4shared_ptr< G4ProcessState > fpState
virtual void ClearInteractionTimeLeft()
virtual void ClearNumberOfInteractionLengthLeft()
Identical to G4VRestDiscreteProcess with dependency from G4VITProcess.
static G4VMoleculeCounter * Instance()
void ProposeTrackStatus(G4TrackStatus status)
G4bool enableAlongStepDoIt
void SetProcessSubType(G4int)
virtual void StartTracking(G4Track *)
G4bool enablePostStepDoIt
G4VParticleChange * pParticleChange