Geant4-11
Public Member Functions | Protected Attributes | Private Attributes
G4DNAIRT Class Reference

#include <G4DNAIRT.hh>

Inheritance diagram for G4DNAIRT:
G4VITReactionProcess

Public Member Functions

G4int FindBin (G4int, G4double, G4double, G4double)
 
std::vector< std::unique_ptr< G4ITReactionChange > > FindReaction (G4ITReactionSet *, const G4double, const G4double, const G4bool) override
 
 G4DNAIRT ()
 
 G4DNAIRT (const G4DNAIRT &other)=delete
 
 G4DNAIRT (G4VDNAReactionModel *)
 
G4double GetIndependentReactionTime (const G4MolecularConfiguration *, const G4MolecularConfiguration *, G4double)
 
void Initialize () override
 
void IRTSampling ()
 
virtual G4bool IsApplicable (const G4ITType &, const G4ITType &) const
 
std::unique_ptr< G4ITReactionChangeMakeReaction (const G4Track &, const G4Track &) override
 
G4DNAIRToperator= (const G4DNAIRT &other)=delete
 
G4double SamplePDC (G4double, G4double)
 
void Sampling (G4Track *)
 
void SetReactionModel (G4VDNAReactionModel *)
 
virtual void SetReactionTable (const G4ITReactionTable *)
 
void SpaceBinning ()
 
G4bool TestReactibility (const G4Track &, const G4Track &, G4double, G4bool) override
 
 ~G4DNAIRT () override
 

Protected Attributes

const G4DNAMolecularReactionTable *& fMolReactionTable
 
G4String fName
 
G4VDNAReactionModelfpReactionModel
 
const G4ITReactionTablefpReactionTable = nullptr
 

Private Attributes

G4ErrorFunctionerfc
 
G4int fNx
 
G4int fNy
 
G4int fNz
 
G4double fRCutOff
 
G4ITReactionSetfReactionSet
 
G4ITTrackHolderfTrackHolder
 
G4double fXMax
 
G4double fXMin
 
G4double fYMax
 
G4double fYMin
 
G4double fZMax
 
G4double fZMin
 
std::map< G4int, std::map< G4int, std::map< G4int, std::vector< G4Track * > > > > spaceBinned
 
G4double timeMax
 
G4double timeMin
 
G4int xendIndex
 
G4int xiniIndex
 
G4int yendIndex
 
G4int yiniIndex
 
G4int zendIndex
 
G4int ziniIndex
 

Detailed Description

Definition at line 64 of file G4DNAIRT.hh.

Constructor & Destructor Documentation

◆ G4DNAIRT() [1/3]

G4DNAIRT::G4DNAIRT ( )

Definition at line 50 of file G4DNAIRT.cc.

50 :
52fMolReactionTable(reference_cast<const G4DNAMolecularReactionTable*>(fpReactionTable)),
53fpReactionModel(nullptr),
55fReactionSet(nullptr)
56{
59
60 fXMin = 1e9*nm;
61 fYMin = 1e9*nm;
62 fZMin = 1e9*nm;
63
64 fXMax = 0e0*nm;
65 fYMax = 0e0*nm;
66 fZMax = 0e0*nm;
67
68 fNx = 0;
69 fNy = 0;
70 fNz = 0;
71
72 xiniIndex = 0, yiniIndex = 0, ziniIndex = 0;
73 xendIndex = 0, yendIndex = 0, zendIndex = 0;
74
75 fRCutOff =
76 1.45 * nm + 2 * std::sqrt(8*9.46e9*nm*nm/s * timeMax); // 95% confidence level
77
78 erfc = new G4ErrorFunction();
79}
static constexpr double nm
Definition: G4SIunits.hh:92
static constexpr double s
Definition: G4SIunits.hh:154
G4double fZMin
Definition: G4DNAIRT.hh:107
G4ITTrackHolder * fTrackHolder
Definition: G4DNAIRT.hh:97
G4double fYMin
Definition: G4DNAIRT.hh:107
G4ITReactionSet * fReactionSet
Definition: G4DNAIRT.hh:98
G4double fXMin
Definition: G4DNAIRT.hh:107
G4int yendIndex
Definition: G4DNAIRT.hh:111
G4int fNx
Definition: G4DNAIRT.hh:109
G4double timeMax
Definition: G4DNAIRT.hh:105
const G4DNAMolecularReactionTable *& fMolReactionTable
Definition: G4DNAIRT.hh:93
G4int fNz
Definition: G4DNAIRT.hh:109
G4double fXMax
Definition: G4DNAIRT.hh:108
G4int xendIndex
Definition: G4DNAIRT.hh:111
G4int zendIndex
Definition: G4DNAIRT.hh:111
G4double timeMin
Definition: G4DNAIRT.hh:104
G4int xiniIndex
Definition: G4DNAIRT.hh:110
G4int fNy
Definition: G4DNAIRT.hh:109
G4double fRCutOff
Definition: G4DNAIRT.hh:103
G4ErrorFunction * erfc
Definition: G4DNAIRT.hh:99
G4double fYMax
Definition: G4DNAIRT.hh:108
G4int yiniIndex
Definition: G4DNAIRT.hh:110
G4VDNAReactionModel * fpReactionModel
Definition: G4DNAIRT.hh:94
G4double fZMax
Definition: G4DNAIRT.hh:108
G4int ziniIndex
Definition: G4DNAIRT.hh:110
static G4ITTrackHolder * Instance()
static G4Scheduler * Instance()
Definition: G4Scheduler.cc:101
G4double GetEndTime() const
Definition: G4Scheduler.hh:349
G4double GetStartTime() const
Definition: G4Scheduler.hh:344
const G4ITReactionTable * fpReactionTable
G4VITReactionProcess()=default

References erfc, fNx, fNy, fNz, fRCutOff, fXMax, fXMin, fYMax, fYMin, fZMax, fZMin, G4Scheduler::GetEndTime(), G4Scheduler::GetStartTime(), G4Scheduler::Instance(), nm, s, timeMax, timeMin, xendIndex, xiniIndex, yendIndex, yiniIndex, zendIndex, and ziniIndex.

◆ G4DNAIRT() [2/3]

G4DNAIRT::G4DNAIRT ( G4VDNAReactionModel pReactionModel)
explicit

Definition at line 82 of file G4DNAIRT.cc.

83 : G4DNAIRT()
84{
85 fpReactionModel = pReactionModel;
86}
G4DNAIRT()
Definition: G4DNAIRT.cc:50

References fpReactionModel.

◆ ~G4DNAIRT()

G4DNAIRT::~G4DNAIRT ( )
override

Definition at line 88 of file G4DNAIRT.cc.

89{
90 delete erfc;
91}

References erfc.

◆ G4DNAIRT() [3/3]

G4DNAIRT::G4DNAIRT ( const G4DNAIRT other)
delete

Member Function Documentation

◆ FindBin()

G4int G4DNAIRT::FindBin ( G4int  n,
G4double  xmin,
G4double  xmax,
G4double  value 
)

(xmax < value) ) //value >= xmax )

Definition at line 330 of file G4DNAIRT.cc.

330 {
331
332 G4int bin = -1;
333 if ( value <= xmin )
334 bin = 0; //1;
335 else if ( value >= xmax)
336 bin = n-1; //n;
337 else
338 bin = G4int( n * ( value - xmin )/( xmax - xmin ) ); //bin = 1 + G4int( n * ( value - xmin )/( xmax - xmin ) );
339
340 if ( bin < 0 ) bin = 0;
341 if ( bin >= n ) bin = n-1;
342
343 return bin;
344}
int G4int
Definition: G4Types.hh:85

References CLHEP::detail::n.

Referenced by IRTSampling(), MakeReaction(), and Sampling().

◆ FindReaction()

std::vector< std::unique_ptr< G4ITReactionChange > > G4DNAIRT::FindReaction ( G4ITReactionSet pReactionSet,
const  G4double,
const G4double  fGlobalTime,
const  G4bool 
)
overridevirtual

Implements G4VITReactionProcess.

Definition at line 496 of file G4DNAIRT.cc.

501{
502 std::vector<std::unique_ptr<G4ITReactionChange>> fReactionInfo;
503 fReactionInfo.clear();
504
505 if (pReactionSet == nullptr)
506 {
507 return fReactionInfo;
508 }
509
510 auto fReactionsetInTime = pReactionSet->GetReactionsPerTime();
511 assert(fReactionsetInTime.begin() != fReactionsetInTime.end());
512
513 auto it_begin = fReactionsetInTime.begin();
514 while(it_begin != fReactionsetInTime.end())
515 {
516 G4double irt = it_begin->get()->GetTime();
517
518 if(fGlobalTime < irt) break;
519
520 pReactionSet->SelectThisReaction(*it_begin);
521
522 G4Track* pTrackA = it_begin->get()->GetReactants().first;
523 G4Track* pTrackB = it_begin->get()->GetReactants().second;
524 auto pReactionChange = MakeReaction(*pTrackA, *pTrackB);
525
526 if(pReactionChange){
527 fReactionInfo.push_back(std::move(pReactionChange));
528 }
529
530 fReactionsetInTime = pReactionSet->GetReactionsPerTime();
531 it_begin = fReactionsetInTime.begin();
532 }
533
534 return fReactionInfo;
535}
double G4double
Definition: G4Types.hh:83
std::unique_ptr< G4ITReactionChange > MakeReaction(const G4Track &, const G4Track &) override
Definition: G4DNAIRT.cc:379
void SelectThisReaction(G4ITReactionPtr reaction)
G4ITReactionPerTime & GetReactionsPerTime()

References G4ITReactionSet::GetReactionsPerTime(), MakeReaction(), and G4ITReactionSet::SelectThisReaction().

◆ GetIndependentReactionTime()

G4double G4DNAIRT::GetIndependentReactionTime ( const G4MolecularConfiguration molA,
const G4MolecularConfiguration molB,
G4double  distance 
)

Definition at line 271 of file G4DNAIRT.cc.

271 {
272 const auto pMoleculeA = molA;
273 const auto pMoleculeB = molB;
274 auto fReactionData = fMolReactionTable->GetReactionData(pMoleculeA, pMoleculeB);
275 G4int reactionType = fReactionData->GetReactionType();
276 G4double r0 = distance;
277 if(r0 == 0) r0 += 1e-3*nm;
278 G4double irt = -1 * ps;
281 if(D == 0) D += 1e-20*(m2/s);
282 G4double rc = fReactionData->GetOnsagerRadius();
283
284 if ( reactionType == 0){
285 G4double sigma = fReactionData->GetEffectiveReactionRadius();
286
287 if(sigma > r0) return 0; // contact reaction
288 if( rc != 0) r0 = -rc / (1-std::exp(rc/r0));
289
290 G4double Winf = sigma/r0;
292
293 if ( W > 0 && W < Winf ) irt = (0.25/D) * std::pow( (r0-sigma)/erfc->erfcInv(r0*W/sigma), 2 );
294
295 return irt;
296 }
297 else if ( reactionType == 1 ){
298 G4double sigma = fReactionData->GetReactionRadius();
299 G4double kact = fReactionData->GetActivationRateConstant();
300 G4double kdif = fReactionData->GetDiffusionRateConstant();
301 G4double kobs = fReactionData->GetObservedReactionRateConstant();
302
303 G4double a, b, Winf;
304
305 if ( rc == 0 ) {
306 a = 1/sigma * kact / kobs;
307 b = (r0 - sigma) / 2;
308 } else {
309 G4double v = kact/Avogadro/(4*CLHEP::pi*pow(sigma,2) * exp(-rc / sigma));
310 G4double alpha = v+rc*D/(pow(sigma,2)*(1-exp(-rc/sigma)));
311 a = 4*pow(sigma,2)*alpha/(D*pow(rc,2))*pow(sinh(rc/(2*sigma)),2);
312 b = rc/4*(cosh(rc/(2*r0))/sinh(rc/(2*r0))-cosh(rc/(2*sigma))/sinh(rc/(2*sigma)));
313 r0 = -rc/(1-std::exp(rc/r0));
314 sigma = fReactionData->GetEffectiveReactionRadius();
315 }
316
317 if(sigma > r0){
318 if(fReactionData->GetProbability() > G4UniformRand()) return 0;
319 else return irt;
320 }
321 Winf = sigma / r0 * kobs / kdif;
322
323 if(Winf > G4UniformRand()) irt = SamplePDC(a,b)/D;
324 return irt;
325 }
326
327 return -1 * ps;
328}
G4double D(G4double temp)
static const G4double alpha
static constexpr double ps
Definition: G4SIunits.hh:157
static constexpr double m2
Definition: G4SIunits.hh:110
#define G4UniformRand()
Definition: Randomize.hh:52
G4double SamplePDC(G4double, G4double)
Definition: G4DNAIRT.cc:346
Data * GetReactionData(Reactant *, Reactant *) const
static G4double erfcInv(G4double x)
static constexpr double pi
Definition: SystemOfUnits.h:55
float Avogadro
Definition: hepunit.py:252

References alpha, source.hepunit::Avogadro, D(), erfc, G4ErrorFunction::erfcInv(), fMolReactionTable, G4UniformRand, G4MolecularConfiguration::GetDiffusionCoefficient(), G4DNAMolecularReactionTable::GetReactionData(), G4DNAMolecularReactionData::GetReactionType(), m2, nm, CLHEP::pi, ps, s, and SamplePDC().

Referenced by Sampling().

◆ Initialize()

void G4DNAIRT::Initialize ( )
overridevirtual

First initialization (done once for all at the begin of the run) eg. check if the reaction table is given ...

Reimplemented from G4VITReactionProcess.

Definition at line 93 of file G4DNAIRT.cc.

93 {
94
96
100
101 spaceBinned.clear();
102
105
106 xiniIndex = 0;
107 yiniIndex = 0;
108 ziniIndex = 0;
109 xendIndex = 0;
110 yendIndex = 0;
111 zendIndex = 0;
112
113 fXMin = 1e9*nm;
114 fYMin = 1e9*nm;
115 fZMin = 1e9*nm;
116
117 fXMax = 0e0*nm;
118 fYMax = 0e0*nm;
119 fZMax = 0e0*nm;
120
121 fNx = 0;
122 fNy = 0;
123 fNz = 0;
124
125 SpaceBinning(); // 1. binning the space
126 IRTSampling(); // 2. Sampling of the IRT
127
128}
void IRTSampling()
Definition: G4DNAIRT.cc:153
std::map< G4int, std::map< G4int, std::map< G4int, std::vector< G4Track * > > > > spaceBinned
Definition: G4DNAIRT.hh:101
void SpaceBinning()
Definition: G4DNAIRT.cc:130
static G4ITReactionSet * Instance()
void CleanAllReaction()

References G4ITReactionSet::CleanAllReaction(), fNx, fNy, fNz, fReactionSet, fTrackHolder, fXMax, fXMin, fYMax, fYMin, fZMax, fZMin, G4Scheduler::GetEndTime(), G4Scheduler::GetStartTime(), G4ITReactionSet::Instance(), G4ITTrackHolder::Instance(), G4Scheduler::Instance(), IRTSampling(), nm, G4ITReactionSet::SortByTime(), spaceBinned, SpaceBinning(), timeMax, timeMin, xendIndex, xiniIndex, yendIndex, yiniIndex, zendIndex, and ziniIndex.

◆ IRTSampling()

void G4DNAIRT::IRTSampling ( )

Definition at line 153 of file G4DNAIRT.cc.

153 {
154
155 auto it_begin = fTrackHolder->GetMainList()->begin();
156 while(it_begin != fTrackHolder->GetMainList()->end()){
157 G4int I = FindBin(fNx, fXMin, fXMax, it_begin->GetPosition().x());
158 G4int J = FindBin(fNy, fYMin, fYMax, it_begin->GetPosition().y());
159 G4int K = FindBin(fNz, fZMin, fZMax, it_begin->GetPosition().z());
160
161 spaceBinned[I][J][K].push_back(*it_begin);
162
163 Sampling(*it_begin);
164 ++it_begin;
165 }
166}
G4int FindBin(G4int, G4double, G4double, G4double)
Definition: G4DNAIRT.cc:330
void Sampling(G4Track *)
Definition: G4DNAIRT.cc:168
iterator begin()
iterator end()
G4TrackList * GetMainList(Key)

References G4FastList< OBJECT >::begin(), G4FastList< OBJECT >::end(), FindBin(), fNx, fNy, fNz, fTrackHolder, fXMax, fXMin, fYMax, fYMin, fZMax, fZMin, G4ITTrackHolder::GetMainList(), Sampling(), and spaceBinned.

Referenced by Initialize().

◆ IsApplicable()

G4bool G4VITReactionProcess::IsApplicable ( const G4ITType ,
const G4ITType  
) const
virtualinherited

Definition at line 43 of file G4VITReactionProcess.cc.

44{
45 return true;
46}

◆ MakeReaction()

std::unique_ptr< G4ITReactionChange > G4DNAIRT::MakeReaction ( const G4Track trackA,
const G4Track trackB 
)
overridevirtual

Implements G4VITReactionProcess.

Definition at line 379 of file G4DNAIRT.cc.

381{
382
383 std::unique_ptr<G4ITReactionChange> pChanges(new G4ITReactionChange());
384 pChanges->Initialize(trackA, trackB);
385
386 const auto pMoleculeA = GetMolecule(trackA)->GetMolecularConfiguration();
387 const auto pMoleculeB = GetMolecule(trackB)->GetMolecularConfiguration();
388 const auto pReactionData = fMolReactionTable->GetReactionData(pMoleculeA, pMoleculeB);
389
391 G4double effectiveReactionRadius = pReactionData->GetEffectiveReactionRadius();
392
393 const G4double D1 = pMoleculeA->GetDiffusionCoefficient();
394 const G4double D2 = pMoleculeB->GetDiffusionCoefficient();
395
396 G4ThreeVector r1 = trackA.GetPosition();
397 G4ThreeVector r2 = trackB.GetPosition();
398
399 if(r1 == r2) r2 += G4ThreeVector(0,0,1e-3*nm);
400
401 G4ThreeVector S1 = r1 - r2;
402
403 G4double r0 = S1.mag();
404
405 S1.setMag(effectiveReactionRadius);
406
407 G4double dt = globalTime - trackA.GetGlobalTime();
408
409 if(dt != 0 && (D1 + D2) != 0 && r0 != 0){
410 G4double s12 = 2.0 * D1 * dt;
411 G4double s22 = 2.0 * D2 * dt;
412 if(s12 == 0) r2 = r1;
413 else if(s22 == 0) r1 = r2;
414 else{
415 G4double alpha = effectiveReactionRadius * r0 / (2*(D1 + D2)*dt);
416 G4ThreeVector S2 = (r1 + (s12 / s22)*r2) + G4ThreeVector(G4RandGauss::shoot(0, s12 + s22 * s22 / s12),
417 G4RandGauss::shoot(0, s12 + s22 * s22 / s12),
418 G4RandGauss::shoot(0, s12 + s22 * s22 / s12));
419
420 if(alpha == 0){
421 return pChanges;
422 }
423 S1.setPhi(rad * G4UniformRand() * 2.0 * CLHEP::pi);
424 S1.setTheta(rad * std::acos(1.0 + 1./alpha * std::log(1.0 - G4UniformRand() * (1 - std::exp(-2.0 * alpha)))));
425
426 r1 = (D1 * S1 + D2 * S2) / (D1 + D2);
427 r2 = D2 * (S2 - S1) / (D1 + D2);
428 }
429 }
430
431 auto pTrackA = const_cast<G4Track*>(pChanges->GetTrackA());
432 auto pTrackB = const_cast<G4Track*>(pChanges->GetTrackB());
433
434 pTrackA->SetPosition(r1);
435 pTrackB->SetPosition(r2);
436
437 pTrackA->SetGlobalTime(globalTime);
438 pTrackB->SetGlobalTime(globalTime);
439
440 pTrackA->SetTrackStatus(fStopButAlive);
441 pTrackB->SetTrackStatus(fStopButAlive);
442
443 const G4int nbProducts = pReactionData->GetNbProducts();
444
445 if(nbProducts){
446
447 const G4double sqrD1 = D1 == 0. ? 0. : std::sqrt(D1);
448 const G4double sqrD2 = D2 == 0. ? 0. : std::sqrt(D2);
449 if((sqrD1 + sqrD2) == 0){
450 return pChanges;
451 }
452 const G4double inv_numerator = 1./(sqrD1 + sqrD2);
453 const G4ThreeVector reactionSite = sqrD2 * inv_numerator * trackA.GetPosition()
454 + sqrD1 * inv_numerator * trackB.GetPosition();
455
456 std::vector<G4ThreeVector> position;
457
458 if(nbProducts == 1){
459 position.push_back(reactionSite);
460 }else if(nbProducts == 2){
461 position.push_back(trackA.GetPosition());
462 position.push_back(trackB.GetPosition());
463 }else if (nbProducts == 3){
464 position.push_back(reactionSite);
465 position.push_back(trackA.GetPosition());
466 position.push_back(trackB.GetPosition());
467 }
468
469 for(G4int u = 0; u < nbProducts; u++){
470
471 auto product = new G4Molecule(pReactionData->GetProduct(u));
472 auto productTrack = product->BuildTrack(globalTime,
473 position[u]);
474
475 productTrack->SetTrackStatus(fAlive);
476 fTrackHolder->Push(productTrack);
477
478 pChanges->AddSecondary(productTrack);
479
480 G4int I = FindBin(fNx, fXMin, fXMax, position[u].x());
481 G4int J = FindBin(fNy, fYMin, fYMax, position[u].y());
482 G4int K = FindBin(fNz, fZMin, fZMax, position[u].z());
483
484 spaceBinned[I][J][K].push_back(productTrack);
485
486 Sampling(productTrack);
487 }
488 }
489
491 pChanges->KillParents(true);
492 return pChanges;
493}
G4Molecule * GetMolecule(const G4Track &track)
Definition: G4Molecule.cc:76
static constexpr double rad
Definition: G4SIunits.hh:129
CLHEP::Hep3Vector G4ThreeVector
@ fAlive
@ fStopButAlive
void setTheta(double)
double mag() const
void setMag(double)
Definition: ThreeVector.cc:20
void setPhi(double)
virtual void Push(G4Track *)
void MergeSecondariesWithMainList()
const G4MolecularConfiguration * GetMolecularConfiguration() const
Definition: G4Molecule.cc:532
G4double GetGlobalTime() const
Definition: G4Scheduler.hh:364
void SetPosition(const G4ThreeVector &aValue)
const G4ThreeVector & GetPosition() const
G4double GetGlobalTime() const
ThreeVector shoot(const G4int Ap, const G4int Af)
#define position
Definition: xmlparse.cc:622

References alpha, fAlive, FindBin(), fMolReactionTable, fNx, fNy, fNz, fStopButAlive, fTrackHolder, fXMax, fXMin, fYMax, fYMin, fZMax, fZMin, G4UniformRand, G4Scheduler::GetGlobalTime(), G4Track::GetGlobalTime(), G4Molecule::GetMolecularConfiguration(), GetMolecule(), G4Track::GetPosition(), G4DNAMolecularReactionTable::GetReactionData(), G4Scheduler::Instance(), CLHEP::Hep3Vector::mag(), G4ITTrackHolder::MergeSecondariesWithMainList(), nm, CLHEP::pi, position, G4ITTrackHolder::Push(), rad, Sampling(), CLHEP::Hep3Vector::setMag(), CLHEP::Hep3Vector::setPhi(), G4Track::SetPosition(), CLHEP::Hep3Vector::setTheta(), G4INCL::DeJongSpin::shoot(), and spaceBinned.

Referenced by FindReaction().

◆ operator=()

G4DNAIRT & G4DNAIRT::operator= ( const G4DNAIRT other)
delete

◆ SamplePDC()

G4double G4DNAIRT::SamplePDC ( G4double  a,
G4double  b 
)

Definition at line 346 of file G4DNAIRT.cc.

346 {
347
348 G4double p = 2.0 * std::sqrt(2.0*b/a);
349 G4double q = 2.0 / std::sqrt(2.0*b/a);
350 G4double M = max(1.0/(a*a),3.0*b/a);
351
352 G4double X, U, lambdax;
353
354 G4int ntrials = 0;
355 while(1) {
356
357 // Generate X
358 U = G4UniformRand();
359 if ( U < p/(p + q * M) ) X = pow(U * (p + q * M) / 2, 2);
360 else X = pow(2/((1-U)*(p+q*M)/M),2);
361
362 U = G4UniformRand();
363
364 lambdax = std::exp(-b*b/X) * ( 1.0 - a * std::sqrt(CLHEP::pi * X) * erfc->erfcx(b/std::sqrt(X) + a*std::sqrt(X)));
365
366 if ((X <= 2.0*b/a && U <= lambdax) ||
367 (X >= 2.0*b/a && U*M/X <= lambdax)) break;
368
369 ntrials++;
370
371 if ( ntrials > 10000 ){
372 G4cout<<"Totally rejected"<<'\n';
373 return -1.0;
374 }
375 }
376 return X;
377}
#define M(row, col)
G4GLOB_DLL std::ostream G4cout
static G4double erfcx(G4double x)
T max(const T t1, const T t2)
brief Return the largest of the two arguments

References erfc, G4ErrorFunction::erfcx(), G4cout, G4UniformRand, M, G4INCL::Math::max(), and CLHEP::pi.

Referenced by GetIndependentReactionTime().

◆ Sampling()

void G4DNAIRT::Sampling ( G4Track track)

Definition at line 168 of file G4DNAIRT.cc.

168 {
169 G4Molecule* molA = G4Molecule::GetMolecule(track);
170 const G4MolecularConfiguration* molConfA = molA->GetMolecularConfiguration();
171 if(molConfA->GetDiffusionCoefficient() == 0) return;
172
173 const vector<const G4MolecularConfiguration*>* reactivesVector =
175
176 if(reactivesVector == nullptr) return;
177
179 G4double minTime = timeMax;
180
187
188 for ( int ii = xiniIndex; ii <= xendIndex; ii++ ) {
189 for ( int jj = yiniIndex; jj <= yendIndex; jj++ ) {
190 for ( int kk = ziniIndex; kk <= zendIndex; kk++ ) {
191
192 std::vector<G4Track*> spaceBin = spaceBinned[ii][jj][kk];
193 for ( int n = 0; n < (int)spaceBinned[ii][jj][kk].size(); n++ ) {
194 if(!spaceBin[n] || track == spaceBin[n]) continue;
195 if(spaceBin[n]->GetTrackStatus() == fStopButAlive) continue;
196
197 G4Molecule* molB = G4Molecule::GetMolecule(spaceBin[n]);
198 if(!molB) continue;
199
200 const G4MolecularConfiguration* molConfB = molB->GetMolecularConfiguration();
201 if(molConfB->GetDiffusionCoefficient() == 0) continue;
202
203 auto it = std::find(reactivesVector->begin(), reactivesVector->end(), molConfB);
204 if(it == reactivesVector->end()) continue;
205
206 G4ThreeVector orgPosB = spaceBin[n]->GetPosition();
207 G4double dt = track->GetGlobalTime() - spaceBin[n]->GetGlobalTime();
208 G4ThreeVector newPosB = orgPosB;
209
210 if(dt > 0){
211 G4double sigma, x, y, z;
212 G4double diffusionCoefficient = G4Molecule::GetMolecule(spaceBin[n])->GetDiffusionCoefficient();
213
214 sigma = std::sqrt(2.0 * diffusionCoefficient * dt);
215
216 x = G4RandGauss::shoot(0., 1.0)*sigma;
217 y = G4RandGauss::shoot(0., 1.0)*sigma;
218 z = G4RandGauss::shoot(0., 1.0)*sigma;
219
220 newPosB = orgPosB + G4ThreeVector(x,y,z);
221 }else if(dt < 0) continue;
222
223 G4double r0 = (newPosB - track->GetPosition()).mag();
225 molConfB,
226 r0);
227 if(irt>=0 && irt<timeMax - globalTime)
228 {
229 irt += globalTime;
230 if(irt < minTime) minTime = irt;
231#ifdef DEBUG
232 G4cout<<irt<<'\t'<<molConfA->GetName()<<" "<<track->GetTrackID()<<'\t'<<molConfB->GetName()<<" "<<spaceBin[n]->GetTrackID()<<'\n';
233#endif
234 fReactionSet->AddReaction(irt,track,spaceBin[n]);
235 }
236 }
237 spaceBin.clear();
238 }
239 }
240 }
241
242// Scavenging & first order reactions
243
244 auto fReactionDatas = fMolReactionTable->GetReactionData(molConfA);
245 G4double index = -1;
246
247 for(size_t u=0; u<fReactionDatas->size();u++){
248 if((*fReactionDatas)[u]->GetReactant2()->GetDiffusionCoefficient() == 0){
249 G4double kObs = (*fReactionDatas)[u]->GetObservedReactionRateConstant();
250 if(kObs == 0) continue;
251 G4double time = -(std::log(1.0 - G4UniformRand())/kObs) + globalTime;
252 if( time < minTime && time >= globalTime && time < timeMax){
253 minTime = time;
254 index = (G4int)u;
255 }
256 }
257 }
258
259 if(index != -1){
260#ifdef DEBUG
261 G4cout<<"scavenged: "<<minTime<<'\t'<<molConfA->GetName()<<it_begin->GetTrackID()<<'\n';
262#endif
263 G4Molecule* fakeMol = new G4Molecule((*fReactionDatas)[index]->GetReactant2());
264 G4Track* fakeTrack = fakeMol->BuildTrack(globalTime,track->GetPosition());
265 fTrackHolder->Push(fakeTrack);
266 fReactionSet->AddReaction(minTime, track, fakeTrack);
267 }
268}
double z() const
double x() const
double y() const
G4double GetIndependentReactionTime(const G4MolecularConfiguration *, const G4MolecularConfiguration *, G4double)
Definition: G4DNAIRT.cc:271
const ReactantList * CanReactWith(Reactant *) const
void AddReaction(G4double time, G4Track *trackA, G4Track *trackB)
const G4String & GetName() const
static G4Molecule * GetMolecule(const G4Track *)
Definition: G4Molecule.cc:90
G4Track * BuildTrack(G4double globalTime, const G4ThreeVector &Position)
Definition: G4Molecule.cc:373
G4double GetDiffusionCoefficient() const
Definition: G4Molecule.cc:516
G4int GetTrackID() const

References G4ITReactionSet::AddReaction(), G4Molecule::BuildTrack(), G4DNAMolecularReactionTable::CanReactWith(), FindBin(), fMolReactionTable, fNx, fNy, fNz, fRCutOff, fReactionSet, fStopButAlive, fTrackHolder, fXMax, fXMin, fYMax, fYMin, fZMax, fZMin, G4cout, G4UniformRand, G4MolecularConfiguration::GetDiffusionCoefficient(), G4Molecule::GetDiffusionCoefficient(), G4Scheduler::GetGlobalTime(), G4Track::GetGlobalTime(), GetIndependentReactionTime(), G4Molecule::GetMolecularConfiguration(), G4Molecule::GetMolecule(), G4MolecularConfiguration::GetName(), G4DNAMolecularReactionData::GetObservedReactionRateConstant(), G4Track::GetPosition(), G4DNAMolecularReactionTable::GetReactionData(), G4Track::GetTrackID(), G4Scheduler::Instance(), CLHEP::detail::n, G4ITTrackHolder::Push(), G4INCL::DeJongSpin::shoot(), spaceBinned, timeMax, CLHEP::Hep3Vector::x(), xendIndex, xiniIndex, CLHEP::Hep3Vector::y(), yendIndex, yiniIndex, CLHEP::Hep3Vector::z(), zendIndex, and ziniIndex.

Referenced by IRTSampling(), and MakeReaction().

◆ SetReactionModel()

void G4DNAIRT::SetReactionModel ( G4VDNAReactionModel model)

Definition at line 545 of file G4DNAIRT.cc.

546{
547 fpReactionModel = model;
548}

References fpReactionModel.

◆ SetReactionTable()

void G4VITReactionProcess::SetReactionTable ( const G4ITReactionTable pReactionTable)
virtualinherited

Definition at line 38 of file G4VITReactionProcess.cc.

39{
40 fpReactionTable = pReactionTable;
41}

References G4VITReactionProcess::fpReactionTable.

◆ SpaceBinning()

void G4DNAIRT::SpaceBinning ( )

Definition at line 130 of file G4DNAIRT.cc.

130 {
131 auto it_begin = fTrackHolder->GetMainList()->begin();
132 while(it_begin != fTrackHolder->GetMainList()->end()){
133
134 G4ThreeVector position = it_begin->GetPosition();
135
136 if ( fXMin > position.x() ) fXMin = position.x();
137 if ( fYMin > position.y() ) fYMin = position.y();
138 if ( fZMin > position.z() ) fZMin = position.z();
139
140 if ( fXMax < position.x() ) fXMax = position.x();
141 if ( fYMax < position.y() ) fYMax = position.y();
142 if ( fZMax < position.z() ) fZMax = position.z();
143
144 ++it_begin;
145 }
146
147 fNx = G4int((fXMax-fXMin)/fRCutOff) == 0 ? 1 : G4int((fXMax-fXMin)/fRCutOff);
148 fNy = G4int((fYMax-fYMin)/fRCutOff) == 0 ? 1 : G4int((fYMax-fYMin)/fRCutOff);
149 fNz = G4int((fZMax-fZMin)/fRCutOff) == 0 ? 1 : G4int((fZMax-fZMin)/fRCutOff);
150
151}

References G4FastList< OBJECT >::begin(), G4FastList< OBJECT >::end(), fNx, fNy, fNz, fRCutOff, fTrackHolder, fXMax, fXMin, fYMax, fYMin, fZMax, fZMin, and G4ITTrackHolder::GetMainList().

Referenced by Initialize().

◆ TestReactibility()

G4bool G4DNAIRT::TestReactibility ( const G4Track ,
const G4Track ,
G4double  ,
G4bool   
)
overridevirtual

Implements G4VITReactionProcess.

Definition at line 537 of file G4DNAIRT.cc.

541{
542 return true;
543}

Field Documentation

◆ erfc

G4ErrorFunction* G4DNAIRT::erfc
private

Definition at line 99 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), GetIndependentReactionTime(), SamplePDC(), and ~G4DNAIRT().

◆ fMolReactionTable

const G4DNAMolecularReactionTable*& G4DNAIRT::fMolReactionTable
protected

Definition at line 93 of file G4DNAIRT.hh.

Referenced by GetIndependentReactionTime(), MakeReaction(), and Sampling().

◆ fName

G4String G4VITReactionProcess::fName
protectedinherited

Definition at line 91 of file G4VITReactionProcess.hh.

◆ fNx

G4int G4DNAIRT::fNx
private

Definition at line 109 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ fNy

G4int G4DNAIRT::fNy
private

Definition at line 109 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ fNz

G4int G4DNAIRT::fNz
private

Definition at line 109 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ fpReactionModel

G4VDNAReactionModel* G4DNAIRT::fpReactionModel
protected

Definition at line 94 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), and SetReactionModel().

◆ fpReactionTable

const G4ITReactionTable* G4VITReactionProcess::fpReactionTable = nullptr
protectedinherited

Definition at line 90 of file G4VITReactionProcess.hh.

Referenced by G4VITReactionProcess::SetReactionTable().

◆ fRCutOff

G4double G4DNAIRT::fRCutOff
private

Definition at line 103 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Sampling(), and SpaceBinning().

◆ fReactionSet

G4ITReactionSet* G4DNAIRT::fReactionSet
private

Definition at line 98 of file G4DNAIRT.hh.

Referenced by Initialize(), and Sampling().

◆ fTrackHolder

G4ITTrackHolder* G4DNAIRT::fTrackHolder
private

Definition at line 97 of file G4DNAIRT.hh.

Referenced by Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ fXMax

G4double G4DNAIRT::fXMax
private

Definition at line 108 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ fXMin

G4double G4DNAIRT::fXMin
private

Definition at line 107 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ fYMax

G4double G4DNAIRT::fYMax
private

Definition at line 108 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ fYMin

G4double G4DNAIRT::fYMin
private

Definition at line 107 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ fZMax

G4double G4DNAIRT::fZMax
private

Definition at line 108 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ fZMin

G4double G4DNAIRT::fZMin
private

Definition at line 107 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), IRTSampling(), MakeReaction(), Sampling(), and SpaceBinning().

◆ spaceBinned

std::map<G4int,std::map<G4int,std::map<G4int,std::vector<G4Track*> > > > G4DNAIRT::spaceBinned
private

Definition at line 101 of file G4DNAIRT.hh.

Referenced by Initialize(), IRTSampling(), MakeReaction(), and Sampling().

◆ timeMax

G4double G4DNAIRT::timeMax
private

Definition at line 105 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), and Sampling().

◆ timeMin

G4double G4DNAIRT::timeMin
private

Definition at line 104 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), and Initialize().

◆ xendIndex

G4int G4DNAIRT::xendIndex
private

Definition at line 111 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), and Sampling().

◆ xiniIndex

G4int G4DNAIRT::xiniIndex
private

Definition at line 110 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), and Sampling().

◆ yendIndex

G4int G4DNAIRT::yendIndex
private

Definition at line 111 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), and Sampling().

◆ yiniIndex

G4int G4DNAIRT::yiniIndex
private

Definition at line 110 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), and Sampling().

◆ zendIndex

G4int G4DNAIRT::zendIndex
private

Definition at line 111 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), and Sampling().

◆ ziniIndex

G4int G4DNAIRT::ziniIndex
private

Definition at line 110 of file G4DNAIRT.hh.

Referenced by G4DNAIRT(), Initialize(), and Sampling().


The documentation for this class was generated from the following files: