Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4DNAIRT.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/*
27 * G4DNAIRT.cc
28 *
29 * Created on: Jul 23, 2019
30 * Author: W. G. Shin
31 * J. Ramos-Mendez and B. Faddegon
32*/
33
34
35#include "G4DNAIRT.hh"
36#include "G4ErrorFunction.hh"
37#include "G4SystemOfUnits.hh"
39#include "Randomize.hh"
42#include "G4Molecule.hh"
43#include "G4ITReactionChange.hh"
44#include "G4ITTrackHolder.hh"
45#include "G4ITReaction.hh"
46#include "G4Scheduler.hh"
47
48using namespace std;
49
52fMolReactionTable(reference_cast<const G4DNAMolecularReactionTable*>(fpReactionTable)),
53fpReactionModel(nullptr),
54fTrackHolder(G4ITTrackHolder::Instance()),
55fReactionSet(nullptr)
56{
58 timeMax = G4Scheduler::Instance()->GetEndTime();
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}
80
81
83 : G4DNAIRT()
84{
85 fpReactionModel = pReactionModel;
86}
87
89{
90 delete erfc;
91}
92
94
95 fTrackHolder = G4ITTrackHolder::Instance();
96
97 fReactionSet = G4ITReactionSet::Instance();
98 fReactionSet->CleanAllReaction();
99 fReactionSet->SortByTime();
100
101 spaceBinned.clear();
102
103 timeMin = G4Scheduler::Instance()->GetStartTime();
104 timeMax = G4Scheduler::Instance()->GetEndTime();
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 //hoang : if the first IRTSampling won't give any reactions, end the simu.
129 if(fReactionSet->Empty())
130 {
131 for (auto pTrack : *fTrackHolder->GetMainList())
132 {
133 pTrack->SetGlobalTime(G4Scheduler::Instance()->GetEndTime());
134 }
135 }
136}
137
139 auto it_begin = fTrackHolder->GetMainList()->begin();
140 while(it_begin != fTrackHolder->GetMainList()->end()){
141
142 G4ThreeVector position = it_begin->GetPosition();
143
144 if ( fXMin > position.x() ) fXMin = position.x();
145 if ( fYMin > position.y() ) fYMin = position.y();
146 if ( fZMin > position.z() ) fZMin = position.z();
147
148 if ( fXMax < position.x() ) fXMax = position.x();
149 if ( fYMax < position.y() ) fYMax = position.y();
150 if ( fZMax < position.z() ) fZMax = position.z();
151
152 ++it_begin;
153 }
154
155 fNx = G4int((fXMax-fXMin)/fRCutOff) == 0 ? 1 : G4int((fXMax-fXMin)/fRCutOff);
156 fNy = G4int((fYMax-fYMin)/fRCutOff) == 0 ? 1 : G4int((fYMax-fYMin)/fRCutOff);
157 fNz = G4int((fZMax-fZMin)/fRCutOff) == 0 ? 1 : G4int((fZMax-fZMin)/fRCutOff);
158
159}
160
162
163 auto it_begin = fTrackHolder->GetMainList()->begin();
164 while(it_begin != fTrackHolder->GetMainList()->end()){
165 G4int I = FindBin(fNx, fXMin, fXMax, it_begin->GetPosition().x());
166 G4int J = FindBin(fNy, fYMin, fYMax, it_begin->GetPosition().y());
167 G4int K = FindBin(fNz, fZMin, fZMax, it_begin->GetPosition().z());
168
169 spaceBinned[I][J][K].push_back(*it_begin);
170
171 Sampling(*it_begin);
172 ++it_begin;
173 }
174}
175
177 G4Molecule* molA = G4Molecule::GetMolecule(track);
178 const G4MolecularConfiguration* molConfA = molA->GetMolecularConfiguration();
179 if(molConfA->GetDiffusionCoefficient() == 0) return;
180
181 const vector<const G4MolecularConfiguration*>* reactivesVector =
183
184 if(reactivesVector == nullptr) return;
185
187 G4double minTime = timeMax;
188
189 xiniIndex = FindBin(fNx, fXMin, fXMax, track->GetPosition().x()-fRCutOff);
190 xendIndex = FindBin(fNx, fXMin, fXMax, track->GetPosition().x()+fRCutOff);
191 yiniIndex = FindBin(fNy, fYMin, fYMax, track->GetPosition().y()-fRCutOff);
192 yendIndex = FindBin(fNy, fYMin, fYMax, track->GetPosition().y()+fRCutOff);
193 ziniIndex = FindBin(fNz, fZMin, fZMax, track->GetPosition().z()-fRCutOff);
194 zendIndex = FindBin(fNz, fZMin, fZMax, track->GetPosition().z()+fRCutOff);
195
196 for ( int ii = xiniIndex; ii <= xendIndex; ii++ ) {
197 for ( int jj = yiniIndex; jj <= yendIndex; jj++ ) {
198 for ( int kk = ziniIndex; kk <= zendIndex; kk++ ) {
199
200 std::vector<G4Track*> spaceBin = spaceBinned[ii][jj][kk];
201 for ( int n = 0; n < (int)spaceBinned[ii][jj][kk].size(); n++ ) {
202 if(!spaceBin[n] || track == spaceBin[n]) continue;
203 if(spaceBin[n]->GetTrackStatus() == fStopButAlive) continue;
204
205 G4Molecule* molB = G4Molecule::GetMolecule(spaceBin[n]);
206 if(!molB) continue;
207
208 const G4MolecularConfiguration* molConfB = molB->GetMolecularConfiguration();
209 if(molConfB->GetDiffusionCoefficient() == 0) continue;
210
211 auto it = std::find(reactivesVector->begin(), reactivesVector->end(), molConfB);
212 if(it == reactivesVector->end()) continue;
213
214 G4ThreeVector orgPosB = spaceBin[n]->GetPosition();
215 G4double dt = track->GetGlobalTime() - spaceBin[n]->GetGlobalTime();
216 G4ThreeVector newPosB = orgPosB;
217
218 if(dt > 0){
219 G4double sigma, x, y, z;
220 G4double diffusionCoefficient = G4Molecule::GetMolecule(spaceBin[n])->GetDiffusionCoefficient();
221
222 sigma = std::sqrt(2.0 * diffusionCoefficient * dt);
223
224 x = G4RandGauss::shoot(0., 1.0)*sigma;
225 y = G4RandGauss::shoot(0., 1.0)*sigma;
226 z = G4RandGauss::shoot(0., 1.0)*sigma;
227
228 newPosB = orgPosB + G4ThreeVector(x,y,z);
229 }else if(dt < 0) continue;
230
231 G4double r0 = (newPosB - track->GetPosition()).mag();
233 molConfB,
234 r0);
235 if(irt>=0 && irt<timeMax - globalTime)
236 {
237 irt += globalTime;
238 if(irt < minTime) minTime = irt;
239#ifdef DEBUG
240 G4cout<<irt<<'\t'<<molConfA->GetName()<<" "<<track->GetTrackID()<<'\t'<<molConfB->GetName()<<" "<<spaceBin[n]->GetTrackID()<<'\n';
241#endif
242 fReactionSet->AddReaction(irt,track,spaceBin[n]);
243 }
244 }
245 spaceBin.clear();
246 }
247 }
248 }
249
250// Scavenging & first order reactions
251
252 auto fReactionDatas = fMolReactionTable->GetReactionData(molConfA);
253 G4double index = -1;
254 //change the scavenging filter of the IRT beyond 1 us proposed by Naoki and Jose
255 if(timeMax > 1*us)
256 {
257 minTime = timeMax;
258 }
259 //
260
261 for(size_t u=0; u<fReactionDatas->size();u++){
262 if((*fReactionDatas)[u]->GetReactant2()->GetDiffusionCoefficient() == 0){
263 G4double kObs = (*fReactionDatas)[u]->GetObservedReactionRateConstant();
264 if(kObs == 0) continue;
265 G4double time = -(std::log(1.0 - G4UniformRand())/kObs) + globalTime;
266 if( time < minTime && time >= globalTime && time < timeMax){
267 minTime = time;
268 index = (G4int)u;
269 }
270 }
271 }
272
273 if(index != -1){
274#ifdef DEBUG
275 G4cout<<"scavenged: "<<minTime<<'\t'<<molConfA->GetName()<<it_begin->GetTrackID()<<'\n';
276#endif
277 G4Molecule* fakeMol = new G4Molecule((*fReactionDatas)[index]->GetReactant2());
278 G4Track* fakeTrack = fakeMol->BuildTrack(globalTime,track->GetPosition());
279 fTrackHolder->Push(fakeTrack);
280 fReactionSet->AddReaction(minTime, track, fakeTrack);
281 }
282}
283
284
286 const auto pMoleculeA = molA;
287 const auto pMoleculeB = molB;
288 auto fReactionData = fMolReactionTable->GetReactionData(pMoleculeA, pMoleculeB);
289 G4int reactionType = fReactionData->GetReactionType();
290 G4double r0 = distance;
291 if(r0 == 0) r0 += 1e-3*nm;
292 G4double irt = -1 * ps;
295 if(D == 0) D += 1e-20*(m2/s);
296 G4double rc = fReactionData->GetOnsagerRadius();
297
298 if ( reactionType == 0){
299 G4double sigma = fReactionData->GetEffectiveReactionRadius();
300
301 if(sigma > r0) return 0; // contact reaction
302 if( rc != 0) r0 = -rc / (1-std::exp(rc/r0));
303
304 G4double Winf = sigma/r0;
306
307 if ( W > 0 && W < Winf ) irt = (0.25/D) * std::pow( (r0-sigma)/erfc->erfcInv(r0*W/sigma), 2 );
308
309 return irt;
310 }
311 else if ( reactionType == 1 ){
312 G4double sigma = fReactionData->GetReactionRadius();
313 G4double kact = fReactionData->GetActivationRateConstant();
314 G4double kdif = fReactionData->GetDiffusionRateConstant();
315 G4double kobs = fReactionData->GetObservedReactionRateConstant();
316
317 G4double a, b, Winf;
318
319 if ( rc == 0 ) {
320 a = 1/sigma * kact / kobs;
321 b = (r0 - sigma) / 2;
322 } else {
323 G4double v = kact/Avogadro/(4*CLHEP::pi*pow(sigma,2) * exp(-rc / sigma));
324 G4double alpha = v+rc*D/(pow(sigma,2)*(1-exp(-rc/sigma)));
325 a = 4*pow(sigma,2)*alpha/(D*pow(rc,2))*pow(sinh(rc/(2*sigma)),2);
326 b = rc/4*(cosh(rc/(2*r0))/sinh(rc/(2*r0))-cosh(rc/(2*sigma))/sinh(rc/(2*sigma)));
327 r0 = -rc/(1-std::exp(rc/r0));
328 sigma = fReactionData->GetEffectiveReactionRadius();
329 }
330
331 if(sigma > r0){
332 if(fReactionData->GetProbability() > G4UniformRand()) return 0;
333 else return irt;
334 }
335 Winf = sigma / r0 * kobs / kdif;
336
337 if(Winf > G4UniformRand()) irt = SamplePDC(a,b)/D;
338 return irt;
339 }
340
341 return -1 * ps;
342}
343
345
346 G4int bin = -1;
347 if ( value <= xmin )
348 bin = 0; //1;
349 else if ( value >= xmax) //!(xmax < value) ) //value >= xmax )
350 bin = n-1; //n;
351 else
352 bin = G4int( n * ( value - xmin )/( xmax - xmin ) ); //bin = 1 + G4int( n * ( value - xmin )/( xmax - xmin ) );
353
354 if ( bin < 0 ) bin = 0;
355 if ( bin >= n ) bin = n-1;
356
357 return bin;
358}
359
361
362 G4double p = 2.0 * std::sqrt(2.0*b/a);
363 G4double q = 2.0 / std::sqrt(2.0*b/a);
364 G4double M = max(1.0/(a*a),3.0*b/a);
365
366 G4double X, U, lambdax;
367
368 G4int ntrials = 0;
369 while(1) {
370
371 // Generate X
372 U = G4UniformRand();
373 if ( U < p/(p + q * M) ) X = pow(U * (p + q * M) / 2, 2);
374 else X = pow(2/((1-U)*(p+q*M)/M),2);
375
376 U = G4UniformRand();
377
378 lambdax = std::exp(-b*b/X) * ( 1.0 - a * std::sqrt(CLHEP::pi * X) * erfc->erfcx(b/std::sqrt(X) + a*std::sqrt(X)));
379
380 if ((X <= 2.0*b/a && U <= lambdax) ||
381 (X >= 2.0*b/a && U*M/X <= lambdax)) break;
382
383 ntrials++;
384
385 if ( ntrials > 10000 ){
386 G4cout<<"Totally rejected"<<'\n';
387 return -1.0;
388 }
389 }
390 return X;
391}
392
393std::unique_ptr<G4ITReactionChange> G4DNAIRT::MakeReaction(const G4Track& trackA,
394 const G4Track& trackB)
395{
396
397 std::unique_ptr<G4ITReactionChange> pChanges(new G4ITReactionChange());
398 pChanges->Initialize(trackA, trackB);
399
400 const auto pMoleculeA = GetMolecule(trackA)->GetMolecularConfiguration();
401 const auto pMoleculeB = GetMolecule(trackB)->GetMolecularConfiguration();
402 const auto pReactionData = fMolReactionTable->GetReactionData(pMoleculeA, pMoleculeB);
403
405 G4double effectiveReactionRadius = pReactionData->GetEffectiveReactionRadius();
406
407 const G4double D1 = pMoleculeA->GetDiffusionCoefficient();
408 const G4double D2 = pMoleculeB->GetDiffusionCoefficient();
409
410 G4ThreeVector r1 = trackA.GetPosition();
411 G4ThreeVector r2 = trackB.GetPosition();
412
413 if(r1 == r2) r2 += G4ThreeVector(0,0,1e-3*nm);
414
415 G4ThreeVector S1 = r1 - r2;
416
417 G4double r0 = S1.mag();
418
419 S1.setMag(effectiveReactionRadius);
420
421 G4double dt = globalTime - trackA.GetGlobalTime();
422
423 if(dt != 0 && (D1 + D2) != 0 && r0 != 0){
424 G4double s12 = 2.0 * D1 * dt;
425 G4double s22 = 2.0 * D2 * dt;
426 if(s12 == 0) r2 = r1;
427 else if(s22 == 0) r1 = r2;
428 else{
429 G4double alpha = effectiveReactionRadius * r0 / (2*(D1 + D2)*dt);
430 G4ThreeVector S2 = (r1 + (s12 / s22)*r2) + G4ThreeVector(G4RandGauss::shoot(0, s12 + s22 * s22 / s12),
431 G4RandGauss::shoot(0, s12 + s22 * s22 / s12),
432 G4RandGauss::shoot(0, s12 + s22 * s22 / s12));
433
434 if(alpha == 0){
435 return pChanges;
436 }
437 S1.setPhi(rad * G4UniformRand() * 2.0 * CLHEP::pi);
438 S1.setTheta(rad * std::acos(1.0 + 1./alpha * std::log(1.0 - G4UniformRand() * (1 - std::exp(-2.0 * alpha)))));
439
440 r1 = (D1 * S1 + D2 * S2) / (D1 + D2);
441 r2 = D2 * (S2 - S1) / (D1 + D2);
442 }
443 }
444
445 auto pTrackA = const_cast<G4Track*>(pChanges->GetTrackA());
446 auto pTrackB = const_cast<G4Track*>(pChanges->GetTrackB());
447
448 pTrackA->SetPosition(r1);
449 pTrackB->SetPosition(r2);
450
451 pTrackA->SetGlobalTime(globalTime);
452 pTrackB->SetGlobalTime(globalTime);
453
454 pTrackA->SetTrackStatus(fStopButAlive);
455 pTrackB->SetTrackStatus(fStopButAlive);
456
457 const G4int nbProducts = pReactionData->GetNbProducts();
458
459 if(nbProducts){
460
461 const G4double sqrD1 = D1 == 0. ? 0. : std::sqrt(D1);
462 const G4double sqrD2 = D2 == 0. ? 0. : std::sqrt(D2);
463 if((sqrD1 + sqrD2) == 0){
464 return pChanges;
465 }
466 const G4double inv_numerator = 1./(sqrD1 + sqrD2);
467 const G4ThreeVector reactionSite = sqrD2 * inv_numerator * trackA.GetPosition()
468 + sqrD1 * inv_numerator * trackB.GetPosition();
469
470 std::vector<G4ThreeVector> position;
471
472 if(nbProducts == 1){
473 position.push_back(reactionSite);
474 }else if(nbProducts == 2){
475 position.push_back(trackA.GetPosition());
476 position.push_back(trackB.GetPosition());
477 }else if (nbProducts == 3){
478 position.push_back(reactionSite);
479 position.push_back(trackA.GetPosition());
480 position.push_back(trackB.GetPosition());
481 }
482
483 for(G4int u = 0; u < nbProducts; u++){
484
485 auto product = new G4Molecule(pReactionData->GetProduct(u));
486 auto productTrack = product->BuildTrack(globalTime,
487 position[u]);
488
489 productTrack->SetTrackStatus(fAlive);
490 fTrackHolder->Push(productTrack);
491
492 pChanges->AddSecondary(productTrack);
493
494 G4int I = FindBin(fNx, fXMin, fXMax, position[u].x());
495 G4int J = FindBin(fNy, fYMin, fYMax, position[u].y());
496 G4int K = FindBin(fNz, fZMin, fZMax, position[u].z());
497
498 spaceBinned[I][J][K].push_back(productTrack);
499
500 Sampling(productTrack);
501 }
502 }
503
504 fTrackHolder->MergeSecondariesWithMainList();
505 pChanges->KillParents(true);
506 return pChanges;
507}
508
509
510std::vector<std::unique_ptr<G4ITReactionChange>> G4DNAIRT::FindReaction(
511 G4ITReactionSet* pReactionSet,
512 const G4double /*currentStepTime*/,
513 const G4double fGlobalTime,
514 const G4bool /*reachedUserStepTimeLimit*/)
515{
516 std::vector<std::unique_ptr<G4ITReactionChange>> fReactionInfo;
517 fReactionInfo.clear();
518
519 if (pReactionSet == nullptr)
520 {
521 return fReactionInfo;
522 }
523
524 auto fReactionsetInTime = pReactionSet->GetReactionsPerTime();
525 assert(fReactionsetInTime.begin() != fReactionsetInTime.end());
526
527 auto it_begin = fReactionsetInTime.begin();
528 while(it_begin != fReactionsetInTime.end())
529 {
530 G4double irt = it_begin->get()->GetTime();
531
532 if(fGlobalTime < irt) break;
533
534 pReactionSet->SelectThisReaction(*it_begin);
535
536 G4Track* pTrackA = it_begin->get()->GetReactants().first;
537 G4Track* pTrackB = it_begin->get()->GetReactants().second;
538 auto pReactionChange = MakeReaction(*pTrackA, *pTrackB);
539
540 if(pReactionChange){
541 fReactionInfo.push_back(std::move(pReactionChange));
542 }
543
544 fReactionsetInTime = pReactionSet->GetReactionsPerTime();
545 it_begin = fReactionsetInTime.begin();
546 }
547
548 return fReactionInfo;
549}
550
552 const G4Track& /*trackB*/,
553 G4double /*currentStepTime*/,
554 G4bool /*userStepTimeLimit*/) /*const*/
555{
556 return true;
557}
558
560{
561 fpReactionModel = model;
562}
G4double D(G4double temp)
G4Molecule * GetMolecule(const G4Track &track)
Definition: G4Molecule.cc:74
#define M(row, col)
ReturnType & reference_cast(OriginalType &source)
CLHEP::Hep3Vector G4ThreeVector
@ fAlive
@ fStopButAlive
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
double z() const
double x() const
double y() const
void setTheta(double)
double mag() const
void setMag(double)
Definition: ThreeVector.cc:20
void setPhi(double)
void IRTSampling()
Definition: G4DNAIRT.cc:161
void SetReactionModel(G4VDNAReactionModel *)
Definition: G4DNAIRT.cc:559
G4bool TestReactibility(const G4Track &, const G4Track &, G4double, G4bool) override
Definition: G4DNAIRT.cc:551
G4double SamplePDC(G4double, G4double)
Definition: G4DNAIRT.cc:360
const G4DNAMolecularReactionTable *& fMolReactionTable
Definition: G4DNAIRT.hh:93
void Initialize() override
Definition: G4DNAIRT.cc:93
G4int FindBin(G4int, G4double, G4double, G4double)
Definition: G4DNAIRT.cc:344
G4double GetIndependentReactionTime(const G4MolecularConfiguration *, const G4MolecularConfiguration *, G4double)
Definition: G4DNAIRT.cc:285
G4DNAIRT()
Definition: G4DNAIRT.cc:50
std::vector< std::unique_ptr< G4ITReactionChange > > FindReaction(G4ITReactionSet *, const G4double, const G4double, const G4bool) override
Definition: G4DNAIRT.cc:510
void SpaceBinning()
Definition: G4DNAIRT.cc:138
std::unique_ptr< G4ITReactionChange > MakeReaction(const G4Track &, const G4Track &) override
Definition: G4DNAIRT.cc:393
~G4DNAIRT() override
Definition: G4DNAIRT.cc:88
G4VDNAReactionModel * fpReactionModel
Definition: G4DNAIRT.hh:94
void Sampling(G4Track *)
Definition: G4DNAIRT.cc:176
Data * GetReactionData(Reactant *, Reactant *) const
const ReactantList * CanReactWith(Reactant *) const
static G4double erfcx(G4double x)
static G4double erfcInv(G4double x)
iterator begin()
iterator end()
void AddReaction(G4double time, G4Track *trackA, G4Track *trackB)
static G4ITReactionSet * Instance()
void SelectThisReaction(G4ITReactionPtr reaction)
void CleanAllReaction()
G4ITReactionPerTime & GetReactionsPerTime()
G4TrackList * GetMainList(Key)
virtual void Push(G4Track *)
void MergeSecondariesWithMainList()
static G4ITTrackHolder * Instance()
const G4String & GetName() const
static G4Molecule * GetMolecule(const G4Track *)
Definition: G4Molecule.cc:88
const G4MolecularConfiguration * GetMolecularConfiguration() const
Definition: G4Molecule.cc:530
G4Track * BuildTrack(G4double globalTime, const G4ThreeVector &Position)
Definition: G4Molecule.cc:371
G4double GetDiffusionCoefficient() const
Definition: G4Molecule.cc:514
static G4Scheduler * Instance()
Definition: G4Scheduler.cc:101
G4double GetEndTime() const
Definition: G4Scheduler.hh:349
G4double GetGlobalTime() const
Definition: G4Scheduler.hh:364
G4double GetStartTime() const
Definition: G4Scheduler.hh:344
void SetPosition(const G4ThreeVector &aValue)
G4int GetTrackID() const
const G4ThreeVector & GetPosition() const
G4double GetGlobalTime() const
#define W
Definition: crc32.c:84