51static G4double onsager_constant = e_squared / (4. * pi * epsilon0 * k_Boltzmann);
59 return 1. / (1. + 0.0012 / (density * density));
64 G4double temp_inverse = 1 / temperature;
66 + 642.0 * temp_inverse
67 - 1.167e5 * temp_inverse * temp_inverse
68 + 9.190e6 * temp_inverse * temp_inverse * temp_inverse;
73 G4double temp_inverse = 1 / temperature;
75 + 275.4 * temp_inverse
76 + 0.3245e5 * temp_inverse * temp_inverse;
84 - 11.41 * temp_inverse
85 - 35260.0 * temp_inverse * temp_inverse;
90 return A(temp) -
B(temp) - 3;
100 return 1 +
G4Exp(std::log(10.) *
102 (
C(temperature) + (
S(temperature) - 1) * std::log(density) / std::log(10.))
103 +
D(temperature) + std::log(density) / std::log(10.)));
130 fIsInitialized =
false;
132 fpMoleculeDensity =
nullptr;
147 return &fParticleChange;
161void G4DNAElectronHoleRecombination::MakeReaction(
const G4Track& track)
165 G4double random = pState->fSampleProba;
166 std::vector<ReactantInfo>& reactants = pState->fReactants;
168 G4Track* pSelectedReactant =
nullptr;
170 for (
const auto& reactantInfo : reactants)
172 if (reactantInfo.fElectron->GetTrackStatus() !=
fAlive)
176 if (reactantInfo.fProbability > random)
178 pSelectedReactant = reactantInfo.fElectron;
183 if (pSelectedReactant !=
nullptr)
188 RemoveAMoleculeAtTime(
GetMolecule(track)->GetMolecularConfiguration(),
197 AddAMoleculeAtTime(
GetMolecule(track)->GetMolecularConfiguration(),
217G4bool G4DNAElectronHoleRecombination::FindReactant(
const G4Track& track)
224 const auto pDensityTable =
231 G4double onsagerRadius = onsager_constant * 1. / (temperature * eps);
236 std::vector<ReactantInfo>& reactants = pState->fReactants;
248 resultIndices.clear();
252 e_aq.GetMoleculeID(),
257 if(resultIndices.empty())
261 reactants.resize(resultIndices.size());
263 for(
auto& it : resultIndices)
265 reactants[i].fElectron = *(std::get<0>(it));
266 reactants[i].fDistance = (reactants[i].fElectron->GetPosition() -
268 if (reactants[i].fDistance != 0)
270 reactants[i].fProbability = 1. -
G4Exp(-onsagerRadius /
271 reactants[i].fDistance);
275 reactants[i].fProbability = 1.;
284 e_aq.GetMoleculeID(),
285 10. * onsagerRadius);
287 if (
static_cast<int>(results) == 0 || results->GetSize() == 0)
293 reactants.resize(results->GetSize());
295 for (
size_t i = 0; !results->End(); results->Next(), ++i)
297 reactants[i].fElectron = results->GetItem<
G4IT>()->GetTrack();
298 reactants[i].fDistance = std::sqrt(results->GetDistanceSqr());
300 if (reactants[i].fDistance != 0)
302 reactants[i].fProbability = 1. -
G4Exp(-onsagerRadius / reactants[i].fDistance);
306 reactants[i].fProbability = 1.;
310 return reactants.empty() ? false : reactants[0].fProbability > pState->fSampleProba;
328 if (FindReactant(track))
341 if (FindReactant(track))
#define BuildChemicalMoleculeFinder()
G4double epsilon(G4double density, G4double temperature)
G4double C(G4double temp)
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
~G4DNAElectronHoleRecombination() 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
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
std::size_t GetIndex() 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
void SetInstantiateProcessState(G4bool flag)
G4shared_ptr< G4ProcessState > fpState
virtual void ClearInteractionTimeLeft()
void StartTracking(G4Track *) override
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