Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4DNAWaterDissociationDisplacer Class Reference

#include <G4DNAWaterDissociationDisplacer.hh>

+ Inheritance diagram for G4DNAWaterDissociationDisplacer:

Public Member Functions

 G4DNAWaterDissociationDisplacer ()
 
virtual ~G4DNAWaterDissociationDisplacer ()
 
std::vector< G4ThreeVectorGetProductsDisplacement (const G4MolecularDissociationChannel *) const override
 
G4ThreeVector GetMotherMoleculeDisplacement (const G4MolecularDissociationChannel *) const override
 
G4ThreeVector radialDistributionOfElectron () const
 
G4ThreeVector radialDistributionOfProducts (G4double r_rms) const
 
- Public Member Functions inherited from G4VMolecularDissociationDisplacer
virtual ~G4VMolecularDissociationDisplacer ()=default
 
virtual std::vector< G4ThreeVectorGetProductsDisplacement (const G4MolecularDissociationChannel *) const =0
 
virtual G4ThreeVector GetMotherMoleculeDisplacement (const G4MolecularDissociationChannel *) const =0
 
void SetVerbose (G4int verbose)
 

Static Public Member Functions

static G4double ElectronProbaDistribution (G4double r)
 

Additional Inherited Members

- Protected Member Functions inherited from G4VMolecularDissociationDisplacer
 G4VMolecularDissociationDisplacer ()=default
 
- Protected Attributes inherited from G4VMolecularDissociationDisplacer
G4int fVerbose
 

Detailed Description

Definition at line 57 of file G4DNAWaterDissociationDisplacer.hh.

Constructor & Destructor Documentation

◆ G4DNAWaterDissociationDisplacer()

A1B1_DissociationDecay B1A1_DissociationDecay2 DissociativeAttachment G4DNAWaterDissociationDisplacer::G4DNAWaterDissociationDisplacer ( )

Definition at line 125 of file G4DNAWaterDissociationDisplacer.cc.

126 :
128 ke(1.7*eV)
129/*#ifdef _WATER_DISPLACER_USE_KREIPL_
130 fFastElectronDistrib(0., 5., 0.001)
131#elif defined _WATER_DISPLACER_USE_TERRISOL_
132 fFastElectronDistrib(0., 100., 0.001)
133#endif*/
134{/*
135 fProba1DFunction =
136 std::bind((G4double(*)(G4double))
137 &G4DNAWaterDissociationDisplacer::ElectronProbaDistribution,
138 std::placeholders::_1);
139
140 size_t nBins = 500;
141 fElectronThermalization.reserve(nBins);
142 double eps = 1. / ((int) nBins);
143 double proba = eps;
144
145 fElectronThermalization.push_back(0.);
146
147 for (size_t i = 1; i < nBins; ++i)
148 {
149 double r = fFastElectronDistrib.Revert(proba, fProba1DFunction);
150 fElectronThermalization.push_back(r * nanometer);
151 proba += eps;
152// G4cout << G4BestUnit(r*nanometer, "Length") << G4endl;
153 }*/
155// SetVerbose(1);
156}
static G4EmParameters * Instance()
G4DNAModelSubType DNAeSolvationSubType() const

◆ ~G4DNAWaterDissociationDisplacer()

G4DNAWaterDissociationDisplacer::~G4DNAWaterDissociationDisplacer ( )
virtual

Definition at line 160 of file G4DNAWaterDissociationDisplacer.cc.

161{
162 ;
163}

Member Function Documentation

◆ ElectronProbaDistribution()

static G4double G4DNAWaterDissociationDisplacer::ElectronProbaDistribution ( G4double  r)
static

◆ GetMotherMoleculeDisplacement()

G4ThreeVector G4DNAWaterDissociationDisplacer::GetMotherMoleculeDisplacement ( const G4MolecularDissociationChannel theDecayChannel) const
overridevirtual

Implements G4VMolecularDissociationDisplacer.

Definition at line 168 of file G4DNAWaterDissociationDisplacer.cc.

171{
172 G4int decayType = theDecayChannel->GetDisplacementType();
173 G4double RMSMotherMoleculeDisplacement(0.);
174
175 switch (decayType)
176 {
177 case Ionisation_DissociationDecay:
178 RMSMotherMoleculeDisplacement = 2.0 * nanometer;
179 break;
180 case A1B1_DissociationDecay:
181 RMSMotherMoleculeDisplacement = 0. * nanometer;
182 break;
183 case B1A1_DissociationDecay:
184 RMSMotherMoleculeDisplacement = 0. * nanometer;
185 break;
186 case B1A1_DissociationDecay2:
187 RMSMotherMoleculeDisplacement = 0. * nanometer;
188 break;
189 case AutoIonisation:
190 RMSMotherMoleculeDisplacement = 2.0 * nanometer;
191 break;
192 case DissociativeAttachment:
193 RMSMotherMoleculeDisplacement = 0. * nanometer;
194 break;
195 }
196
197 if (RMSMotherMoleculeDisplacement == 0)
198 {
199 return G4ThreeVector(0, 0, 0);
200 }
201 auto RandDirection =
202 radialDistributionOfProducts(RMSMotherMoleculeDisplacement);
203
204 return RandDirection;
205}
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
G4ThreeVector radialDistributionOfProducts(G4double r_rms) const

◆ GetProductsDisplacement()

vector< G4ThreeVector > G4DNAWaterDissociationDisplacer::GetProductsDisplacement ( const G4MolecularDissociationChannel pDecayChannel) const
overridevirtual

Implements G4VMolecularDissociationDisplacer.

Definition at line 210 of file G4DNAWaterDissociationDisplacer.cc.

212{
213 G4int nbProducts = pDecayChannel->GetNbProducts();
214 vector<G4ThreeVector> theProductDisplacementVector(nbProducts);
215
216 typedef map<const G4MoleculeDefinition*, G4double> RMSmap;
217 RMSmap theRMSmap;
218
219 G4int decayType = pDecayChannel->GetDisplacementType();
220
221 switch (decayType)
222 {
223 case Ionisation_DissociationDecay:
224 {
225 if (fVerbose)
226 {
227 G4cout << "Ionisation_DissociationDecay" << G4endl;
228 G4cout << "Channel's name: " << pDecayChannel->GetName() << G4endl;
229 }
230 G4double RdmValue = G4UniformRand();
231
232 if (RdmValue < 0.5)
233 {
234 // H3O
235 theRMSmap[G4H3O::Definition()] = 0. * nanometer;
236 // OH
237 theRMSmap[G4OH::Definition()] = 0.8 * nanometer;
238 }
239 else
240 {
241 // H3O
242 theRMSmap[G4H3O::Definition()] = 0.8 * nanometer;
243 // OH
244 theRMSmap[G4OH::Definition()] = 0. * nanometer;
245 }
246
247 for (int i = 0; i < nbProducts; i++)
248 {
249 auto pProduct = pDecayChannel->GetProduct(i);
250 G4double theRMSDisplacement = theRMSmap[pProduct->GetDefinition()];
251
252 if (theRMSDisplacement == 0.)
253 {
254 theProductDisplacementVector[i] = G4ThreeVector();
255 }
256 else
257 {
258 auto RandDirection = radialDistributionOfProducts(theRMSDisplacement);
259 theProductDisplacementVector[i] = RandDirection;
260 }
261 }
262 break;
263 }
264 case A1B1_DissociationDecay:
265 {
266 if (fVerbose)
267 {
268 G4cout << "A1B1_DissociationDecay" << G4endl;
269 G4cout << "Channel's name: " << pDecayChannel->GetName() << G4endl;
270 }
271 G4double theRMSDisplacement = 2.4 * nanometer;
272 auto RandDirection =
273 radialDistributionOfProducts(theRMSDisplacement);
274
275 for (G4int i = 0; i < nbProducts; i++)
276 {
277 auto pProduct = pDecayChannel->GetProduct(i);
278
279 if (pProduct->GetDefinition() == G4OH::Definition())
280 {
281 theProductDisplacementVector[i] = -1. / 18. * RandDirection;
282 }
283 else if (pProduct->GetDefinition() == G4Hydrogen::Definition())
284 {
285 theProductDisplacementVector[i] = +17. / 18. * RandDirection;
286 }
287 }
288 break;
289 }
290 case B1A1_DissociationDecay:
291 {
292 if (fVerbose)
293 {
294 G4cout << "B1A1_DissociationDecay" << G4endl;
295 G4cout << "Channel's name: " << pDecayChannel->GetName() << G4endl;
296 }
297
298 G4double theRMSDisplacement = 0.8 * nanometer;
299 auto RandDirection =
300 radialDistributionOfProducts(theRMSDisplacement);
301
302 G4int NbOfOH = 0;
303 for (G4int i = 0; i < nbProducts; ++i)
304 {
305 auto pProduct = pDecayChannel->GetProduct(i);
306 if (pProduct->GetDefinition() == G4H2::Definition())
307 {
308 // In the paper of Kreipl (2009)
309 // theProductDisplacementVector[i] = -2. / 18. * RandDirection;
310
311 // Based on momentum conservation
312 theProductDisplacementVector[i] = -16. / 18. * RandDirection;
313 }
314 else if (pProduct->GetDefinition() == G4OH::Definition())
315 {
316 // In the paper of Kreipl (2009)
317 // G4ThreeVector OxygenDisplacement = +16. / 18. * RandDirection;
318
319 // Based on momentum conservation
320 G4ThreeVector OxygenDisplacement = +2. / 18. * RandDirection;
321 G4double OHRMSDisplacement = 1.1 * nanometer;
322
323 auto OHDisplacement =
324 radialDistributionOfProducts(OHRMSDisplacement);
325
326 if (NbOfOH == 0)
327 {
328 OHDisplacement = 0.5 * OHDisplacement;
329 }
330 else
331 {
332 OHDisplacement = -0.5 * OHDisplacement;
333 }
334
335 theProductDisplacementVector[i] =
336 OHDisplacement + OxygenDisplacement;
337
338 ++NbOfOH;
339 }
340 }
341 break;
342 }
343 case B1A1_DissociationDecay2:
344 {
345 if(fVerbose){
346 G4cout<<"B1A1_DissociationDecay2"<<G4endl;
347 G4cout<<"Channel's name: "<<pDecayChannel->GetName()<<G4endl;
348 }
349
350 G4int NbOfH = 0;
351 for(G4int i =0; i < nbProducts; ++i)
352 {
353 auto pProduct = pDecayChannel->GetProduct(i);
354 if(pProduct->GetDefinition() == G4Oxygen::Definition()){
355 // O(3p)
356 theProductDisplacementVector[i] = G4ThreeVector(0,0,0);
357 }
358 else if(pProduct->GetDefinition() == G4Hydrogen::Definition()){
359 // H
360 G4double HRMSDisplacement = 1.6 * nanometer;
361
362 auto HDisplacement =
363 radialDistributionOfProducts(HRMSDisplacement);
364
365 if(NbOfH==0) HDisplacement = 0.5*HDisplacement;
366 else HDisplacement = -0.5*HDisplacement;
367 theProductDisplacementVector[i] = HDisplacement;
368
369 ++NbOfH;
370 }
371 }
372 break;
373 }
374 case AutoIonisation:
375 {
376 if (fVerbose)
377 {
378 G4cout << "AutoIonisation" << G4endl;
379 G4cout << "Channel's name: " << pDecayChannel->GetName() << G4endl;
380 }
381
382 G4double RdmValue = G4UniformRand();
383
384 if (RdmValue < 0.5)
385 {
386 // H3O
387 theRMSmap[G4H3O::Definition()] = 0. * nanometer;
388 // OH
389 theRMSmap[G4OH::Definition()] = 0.8 * nanometer;
390 }
391 else
392 {
393 // H3O
394 theRMSmap[G4H3O::Definition()] = 0.8 * nanometer;
395 // OH
396 theRMSmap[G4OH::Definition()] = 0. * nanometer;
397 }
398
399 for (G4int i = 0; i < nbProducts; i++)
400 {
401 auto pProduct = pDecayChannel->GetProduct(i);
402 auto theRMSDisplacement = theRMSmap[pProduct->GetDefinition()];
403
404 if (theRMSDisplacement == 0)
405 {
406 theProductDisplacementVector[i] = G4ThreeVector();
407 }
408 else
409 {
410 auto RandDirection =
411 radialDistributionOfProducts(theRMSDisplacement);
412 theProductDisplacementVector[i] = RandDirection;
413 }
414 if (pProduct->GetDefinition() == G4Electron_aq::Definition())
415 {
416 theProductDisplacementVector[i] = radialDistributionOfElectron();
417 }
418 }
419 break;
420 }
421 case DissociativeAttachment:
422 {
423 if (fVerbose)
424 {
425 G4cout << "DissociativeAttachment" << G4endl;
426 G4cout << "Channel's name: " << pDecayChannel->GetName() << G4endl;
427 }
428 G4double theRMSDisplacement = 0.8 * nanometer;
429 auto RandDirection =
430 radialDistributionOfProducts(theRMSDisplacement);
431
432 G4int NbOfOH = 0;
433 for (G4int i = 0; i < nbProducts; ++i)
434 {
435 auto pProduct = pDecayChannel->GetProduct(i);
436 if (pProduct->GetDefinition() == G4H2::Definition())
437 {
438 // In the paper of Kreipl (2009)
439 // theProductDisplacementVector[i] = -2. / 18. * RandDirection;
440
441 // Based on momentum conservation
442 theProductDisplacementVector[i] = -16. / 18. * RandDirection;
443 }
444 else if (pProduct->GetDefinition() == G4OH::Definition())
445 {
446 // In the paper of Kreipl (2009)
447 // G4ThreeVector OxygenDisplacement = +16. / 18. * RandDirection;
448
449 // Based on momentum conservation
450 G4ThreeVector OxygenDisplacement = +2. / 18. * RandDirection;
451 G4double OHRMSDisplacement = 1.1 * nanometer;
452
453 auto OHDisplacement =
454 radialDistributionOfProducts(OHRMSDisplacement);
455
456 if (NbOfOH == 0)
457 {
458 OHDisplacement = 0.5 * OHDisplacement;
459 }
460 else
461 {
462 OHDisplacement = -0.5 * OHDisplacement;
463 }
464 theProductDisplacementVector[i] = OHDisplacement +
465 OxygenDisplacement;
466 ++NbOfOH;
467 }
468 }
469 break;
470 }
471 }
472 return theProductDisplacementVector;
473}
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition: Randomize.hh:52
static G4Electron_aq * Definition()
static G4H3O * Definition()
Definition: G4H3O.cc:46
static G4Hydrogen * Definition()
Definition: G4Hydrogen.cc:45
static G4OH * Definition()
Definition: G4OH.cc:45
static G4Oxygen * Definition()
Definition: G4Oxygen.cc:44

◆ radialDistributionOfElectron()

G4ThreeVector G4DNAWaterDissociationDisplacer::radialDistributionOfElectron ( ) const

Definition at line 492 of file G4DNAWaterDissociationDisplacer.cc.

493{/*
494 G4double rand_value = G4UniformRand();
495 size_t nBins = fElectronThermalization.size();
496 size_t bin = size_t(floor(rand_value * nBins));
497 size_t bin_p1 = min(bin + 1, nBins - 1);
498
499 return (fElectronThermalization[bin] * (1. - rand_value)
500 + fElectronThermalization[bin_p1] * rand_value) *
501 G4RandomDirection();*/
502
503 G4ThreeVector pdf = G4ThreeVector(0,0,0);
504
510
511 return pdf;
512}
@ fKreipl2009eSolvation
@ fMeesungnoensolid2002eSolvation
@ fRitchie1994eSolvation
@ fTerrisol1990eSolvation
static void GetPenetration(G4double energy, G4ThreeVector &displacement)
static void GetPenetration(G4double energy, G4ThreeVector &displacement)
static void GetPenetration(G4double energy, G4ThreeVector &displacement)
static void GetPenetration(G4double energy, G4ThreeVector &displacement)
static void GetPenetration(G4double energy, G4ThreeVector &displacement)

Referenced by GetProductsDisplacement().

◆ radialDistributionOfProducts()

G4ThreeVector G4DNAWaterDissociationDisplacer::radialDistributionOfProducts ( G4double  r_rms) const

Definition at line 478 of file G4DNAWaterDissociationDisplacer.cc.

480{
481 static const double inverse_sqrt_3 = 1. / sqrt(3.);
482 double sigma = Rrms * inverse_sqrt_3;
483 double x = G4RandGauss::shoot(0., sigma);
484 double y = G4RandGauss::shoot(0., sigma);
485 double z = G4RandGauss::shoot(0., sigma);
486 return G4ThreeVector(x, y, z);
487}

Referenced by GetMotherMoleculeDisplacement(), and GetProductsDisplacement().


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