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
G4EmDNAChemistry.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#include "G4EmDNAChemistry.hh"
27
29#include "G4SystemOfUnits.hh"
30
34#include "G4ProcessManager.hh"
35
37
38// *** Processes and models for Geant4-DNA
39
41
42#include "G4DNAAttachment.hh"
43#include "G4DNAVibExcitation.hh"
45
46#include "G4DNAElastic.hh"
50
57
59
60// particles
61
62#include "G4Electron.hh"
63#include "G4Proton.hh"
64#include "G4GenericIon.hh"
65
66#include "G4MoleculeTable.hh"
67#include "G4H2O.hh"
68#include "G4H2.hh"
69#include "G4Hydrogen.hh"
70#include "G4OH.hh"
71#include "G4H3O.hh"
72#include "G4Electron_aq.hh"
73#include "G4H2O2.hh"
74
76#include "G4BuilderType.hh"
77
78/****/
80#include "G4ProcessVector.hh"
81#include "G4ProcessTable.hh"
84/****/
85
86// factory
88
90
91#include "G4Threading.hh"
92
95{
97}
98
99//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
100
102{
103}
104
105//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
106
108{
109 //-----------------------------------
110 G4Electron::Definition(); // safety
111
112 //-----------------------------------
113 // Create the definition
120 G4H2::Definition();
121
122 //____________________________________________________________________________
123
126 CreateConfiguration("OHm", // just a tag to store and retrieve from
127 // G4MoleculeTable
129 -1, // charge
130 5.0e-9 * (m2 / s));
131 OHm->SetMass(17.0079 * g / Avogadro * c_squared);
137 G4MoleculeTable::Instance()->CreateConfiguration("H2", G4H2::Definition());
139}
140
141//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
142
144{
145 //-----------------------------------
146 //Get the molecular configuration
159
160 //-------------------------------------
161 //Define the decay channels
165
168
169 //////////////////////////////////////////////////////////
170 // EXCITATIONS //
171 //////////////////////////////////////////////////////////
172 G4DNAWaterExcitationStructure waterExcitation;
173 //--------------------------------------------------------
174 //---------------Excitation on the fifth layer------------
175
176 decCh1 = new G4MolecularDissociationChannel("A^1B_1_Relaxation");
177 decCh2 = new G4MolecularDissociationChannel("A^1B_1_DissociativeDecay");
178 //Decay 1 : OH + H
179 decCh1->SetEnergy(waterExcitation.ExcitationEnergy(0));
180 decCh1->SetProbability(0.35);
181 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::NoDisplacement);
182
183 decCh2->AddProduct(OH);
184 decCh2->AddProduct(H);
185 decCh2->SetProbability(0.65);
186 decCh2->SetDisplacementType(
187 G4DNAWaterDissociationDisplacer::A1B1_DissociationDecay);
188
189// water->AddExcitedState("A^1B_1");
190 occ->RemoveElectron(4, 1); // this is the transition form ground state to
191 occ->AddElectron(5, 1); // the first unoccupied orbital: A^1B_1
192
193 water->NewConfigurationWithElectronOccupancy("A^1B_1", *occ);
194 water->AddDecayChannel("A^1B_1", decCh1);
195 water->AddDecayChannel("A^1B_1", decCh2);
196
197 //--------------------------------------------------------
198 //---------------Excitation on the fourth layer-----------
199 decCh1 = new G4MolecularDissociationChannel("B^1A_1_Relaxation_Channel");
200 decCh2 = new G4MolecularDissociationChannel("B^1A_1_DissociativeDecay");
202 "B^1A_1_AutoIonisation_Channel");
203
204 //Decay 1 : energy
205 decCh1->SetEnergy(waterExcitation.ExcitationEnergy(1));
206 decCh1->SetProbability(0.3);
207
208 //Decay 2 : 2OH + H_2
209 decCh2->AddProduct(H2);
210 decCh2->AddProduct(OH);
211 decCh2->AddProduct(OH);
212 decCh2->SetProbability(0.15);
213 decCh2->SetDisplacementType(
214 G4DNAWaterDissociationDisplacer::B1A1_DissociationDecay);
215
216 //Decay 3 : OH + H_3Op + e_aq
217 decCh3->AddProduct(OH);
218 decCh3->AddProduct(H3O);
219 decCh3->AddProduct(e_aq);
220 decCh3->SetProbability(0.55);
221 decCh3->SetDisplacementType(G4DNAWaterDissociationDisplacer::AutoIonisation);
222
223 *occ = *(water->GetGroundStateElectronOccupancy());
224 occ->RemoveElectron(3); // this is the transition form ground state to
225 occ->AddElectron(5, 1); // the first unoccupied orbital: B^1A_1
226
227 water->NewConfigurationWithElectronOccupancy("B^1A_1", *occ);
228 water->AddDecayChannel("B^1A_1", decCh1);
229 water->AddDecayChannel("B^1A_1", decCh2);
230 water->AddDecayChannel("B^1A_1", decCh3);
231
232 //-------------------------------------------------------
233 //-------------------Excitation of 3rd layer-----------------
235 "Excitation3rdLayer_AutoIonisation_Channel");
237 "Excitation3rdLayer_Relaxation_Channel");
238
239 //Decay channel 1 : : OH + H_3Op + e_aq
240 decCh1->AddProduct(OH);
241 decCh1->AddProduct(H3O);
242 decCh1->AddProduct(e_aq);
243
244 decCh1->SetProbability(0.5);
245 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::AutoIonisation);
246
247 //Decay channel 2 : energy
248 decCh2->SetEnergy(waterExcitation.ExcitationEnergy(2));
249 decCh2->SetProbability(0.5);
250
251 //Electronic configuration of this decay
252 *occ = *(water->GetGroundStateElectronOccupancy());
253 occ->RemoveElectron(2, 1);
254 occ->AddElectron(5, 1);
255
256 //Configure the water molecule
257 water->NewConfigurationWithElectronOccupancy("Excitation3rdLayer", *occ);
258 water->AddDecayChannel("Excitation3rdLayer", decCh1);
259 water->AddDecayChannel("Excitation3rdLayer", decCh2);
260
261 //-------------------------------------------------------
262 //-------------------Excitation of 2nd layer-----------------
264 "Excitation2ndLayer_AutoIonisation_Channel");
266 "Excitation2ndLayer_Relaxation_Channel");
267
268 //Decay Channel 1 : : OH + H_3Op + e_aq
269 decCh1->AddProduct(OH);
270 decCh1->AddProduct(H3O);
271 decCh1->AddProduct(e_aq);
272
273 decCh1->SetProbability(0.5);
274 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::AutoIonisation);
275
276 //Decay channel 2 : energy
277 decCh2->SetEnergy(waterExcitation.ExcitationEnergy(3));
278 decCh2->SetProbability(0.5);
279
280 *occ = *(water->GetGroundStateElectronOccupancy());
281 occ->RemoveElectron(1, 1);
282 occ->AddElectron(5, 1);
283
284 water->NewConfigurationWithElectronOccupancy("Excitation2ndLayer", *occ);
285 water->AddDecayChannel("Excitation2ndLayer", decCh1);
286 water->AddDecayChannel("Excitation2ndLayer", decCh2);
287
288 //-------------------------------------------------------
289 //-------------------Excitation of 1st layer-----------------
291 "Excitation1stLayer_AutoIonisation_Channel");
293 "Excitation1stLayer_Relaxation_Channel");
294
295 *occ = *(water->GetGroundStateElectronOccupancy());
296 occ->RemoveElectron(0, 1);
297 occ->AddElectron(5, 1);
298
299 //Decay Channel 1 : : OH + H_3Op + e_aq
300 decCh1->AddProduct(OH);
301 decCh1->AddProduct(H3O);
302 decCh1->AddProduct(e_aq);
303 decCh1->SetProbability(0.5);
304 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::AutoIonisation);
305
306 //Decay channel 2 : energy
307 decCh2->SetEnergy(waterExcitation.ExcitationEnergy(4));
308 decCh2->SetProbability(0.5);
309
310 water->NewConfigurationWithElectronOccupancy("Excitation1stLayer", *occ);
311 water->AddDecayChannel("Excitation1stLayer", decCh1);
312 water->AddDecayChannel("Excitation1stLayer", decCh2);
313
314 /////////////////////////////////////////////////////////
315 // IONISATION //
316 /////////////////////////////////////////////////////////
317 //--------------------------------------------------------
318 //------------------- Ionisation -------------------------
319
320 decCh1 = new G4MolecularDissociationChannel("Ionisation_Channel");
321
322 //Decay Channel 1 : : OH + H_3Op
323 decCh1->AddProduct(H3O);
324 decCh1->AddProduct(OH);
325 decCh1->SetProbability(1);
326 decCh1->SetDisplacementType(
327 G4DNAWaterDissociationDisplacer::Ionisation_DissociationDecay);
328
329 *occ = *(water->GetGroundStateElectronOccupancy());
330 occ->RemoveElectron(4, 1);
331 // this is a ionized h2O with a hole in its last orbital
332 water->NewConfigurationWithElectronOccupancy("Ionisation5", *occ);
333 water->AddDecayChannel("Ionisation5",
334 decCh1);
335
336 *occ = *(water->GetGroundStateElectronOccupancy());
337 occ->RemoveElectron(3, 1);
338 water->NewConfigurationWithElectronOccupancy("Ionisation4", *occ);
339 water->AddDecayChannel("Ionisation4",
340 new G4MolecularDissociationChannel(*decCh1));
341
342 *occ = *(water->GetGroundStateElectronOccupancy());
343 occ->RemoveElectron(2, 1);
344 water->NewConfigurationWithElectronOccupancy("Ionisation3", *occ);
345 water->AddDecayChannel("Ionisation3",
346 new G4MolecularDissociationChannel(*decCh1));
347
348 *occ = *(water->GetGroundStateElectronOccupancy());
349 occ->RemoveElectron(1, 1);
350 water->NewConfigurationWithElectronOccupancy("Ionisation2", *occ);
351 water->AddDecayChannel("Ionisation2",
352 new G4MolecularDissociationChannel(*decCh1));
353
354 *occ = *(water->GetGroundStateElectronOccupancy());
355 occ->RemoveElectron(0, 1);
356 water->NewConfigurationWithElectronOccupancy("Ionisation1", *occ);
357 water->AddDecayChannel("Ionisation1",
358 new G4MolecularDissociationChannel(*decCh1));
359
360 //////////////////////////////////////////////////////////
361 // Dissociative Attachment //
362 //////////////////////////////////////////////////////////
363 decCh1 = new G4MolecularDissociationChannel("DissociativeAttachment");
364
365 //Decay 1 : 2OH + H_2
366 decCh1->AddProduct(H2);
367 decCh1->AddProduct(OHm);
368 decCh1->AddProduct(OH);
369 decCh1->SetProbability(1);
371 DissociativeAttachment);
372
373 *occ = *(water->GetGroundStateElectronOccupancy());
374 occ->AddElectron(5, 1); // H_2O^-
375 water->NewConfigurationWithElectronOccupancy("DissociativeAttachment", *occ);
376 water->AddDecayChannel("DissociativeAttachment", decCh1);
377
378 //////////////////////////////////////////////////////////
379 // Electron-hole recombination //
380 //////////////////////////////////////////////////////////
381 decCh1 = new G4MolecularDissociationChannel("H2Ovib_DissociationDecay1");
382 decCh2 = new G4MolecularDissociationChannel("H2Ovib_DissociationDecay2");
383 decCh3 = new G4MolecularDissociationChannel("H2Ovib_DissociationDecay3");
384
385 //Decay 1 : 2OH + H_2
386 decCh1->AddProduct(H2);
387 decCh1->AddProduct(OH);
388 decCh1->AddProduct(OH);
389 decCh1->SetProbability(0.15);
391 B1A1_DissociationDecay);
392
393 //Decay 2 : OH + H
394 decCh2->AddProduct(OH);
395 decCh2->AddProduct(H);
396 decCh2->SetProbability(0.55);
398 A1B1_DissociationDecay);
399
400 //Decay 3 : relaxation
401 decCh3->SetProbability(0.30);
402
403 const auto pH2Ovib = G4H2O::Definition()->NewConfiguration("H2Ovib");
404 assert(pH2Ovib != nullptr);
405
406 water->AddDecayChannel(pH2Ovib, decCh1);
407 water->AddDecayChannel(pH2Ovib, decCh2);
408 water->AddDecayChannel(pH2Ovib, decCh3);
409
410 delete occ;
411}
412
413//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
414
416 theReactionTable)
417{
418 //-----------------------------------
419 //Get the molecular configuration
434
435 //------------------------------------------------------------------
436 // e_aq + e_aq + 2H2O -> H2 + 2OH-
437 G4DNAMolecularReactionData* reactionData =
438 new G4DNAMolecularReactionData(0.5e10 * (1e-3 * m3 / (mole * s)), e_aq, e_aq);
439 reactionData->AddProduct(OHm);
440 reactionData->AddProduct(OHm);
441 reactionData->AddProduct(H2);
442 theReactionTable->SetReaction(reactionData);
443 //------------------------------------------------------------------
444 // e_aq + *OH -> OH-
445 reactionData = new G4DNAMolecularReactionData(
446 2.95e10 * (1e-3 * m3 / (mole * s)), e_aq, OH);
447 reactionData->AddProduct(OHm);
448 theReactionTable->SetReaction(reactionData);
449 //------------------------------------------------------------------
450 // e_aq + H* + H2O -> H2 + OH-
451 reactionData = new G4DNAMolecularReactionData(
452 2.65e10 * (1e-3 * m3 / (mole * s)), e_aq, H);
453 reactionData->AddProduct(OHm);
454 reactionData->AddProduct(H2);
455 theReactionTable->SetReaction(reactionData);
456 //------------------------------------------------------------------
457 // e_aq + H3O+ -> H* + H2O
458 reactionData = new G4DNAMolecularReactionData(
459 2.11e10 * (1e-3 * m3 / (mole * s)), e_aq, H3Op);
460 reactionData->AddProduct(H);
461 theReactionTable->SetReaction(reactionData);
462 //------------------------------------------------------------------
463 // e_aq + H2O2 -> OH- + *OH
464 reactionData = new G4DNAMolecularReactionData(
465 1.41e10 * (1e-3 * m3 / (mole * s)), e_aq, H2O2);
466 reactionData->AddProduct(OHm);
467 reactionData->AddProduct(OH);
468 theReactionTable->SetReaction(reactionData);
469 //------------------------------------------------------------------
470 // *OH + *OH -> H2O2
471 reactionData = new G4DNAMolecularReactionData(
472 0.44e10 * (1e-3 * m3 / (mole * s)), OH, OH);
473 reactionData->AddProduct(H2O2);
474 theReactionTable->SetReaction(reactionData);
475 //------------------------------------------------------------------
476 // *OH + *H -> H2O
477 theReactionTable->SetReaction(1.44e10 * (1e-3 * m3 / (mole * s)), OH, H);
478 //------------------------------------------------------------------
479 // *H + *H -> H2
480 reactionData = new G4DNAMolecularReactionData(
481 1.20e10 * (1e-3 * m3 / (mole * s)), H, H);
482 reactionData->AddProduct(H2);
483 theReactionTable->SetReaction(reactionData);
484 //------------------------------------------------------------------
485 // H3O+ + OH- -> 2H2O
486 theReactionTable->SetReaction(1.43e11 * (1e-3 * m3 / (mole * s)), H3Op, OHm);
487 //------------------------------------------------------------------
488}
489
490//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
491
493{
494 auto pPhysicsListHelper = G4PhysicsListHelper::GetPhysicsListHelper();
495
496 //===============================================================
497 // Extend vibrational to low energy
498 // Anyway, solvation of electrons is taken into account from 7.4 eV
499 // So below this threshold, for now, no accurate modeling is done
500 //
502 FindProcess("e-_G4DNAVibExcitation", "e-");
503
504 if (pProcess != nullptr)
505 {
506 G4DNAVibExcitation* pVibExcitation = (G4DNAVibExcitation*) pProcess;
507 G4VEmModel* pModel = pVibExcitation->EmModel();
508 G4DNASancheExcitationModel* pSancheExcitationMod =
509 dynamic_cast<G4DNASancheExcitationModel*>(pModel);
510 if(pSancheExcitationMod != nullptr)
511 {
512 pSancheExcitationMod->ExtendLowEnergyLimit(0.025 * eV);
513 }
514 }
515
516 //===============================================================
517 // Electron Solvatation
518 //
519 pProcess = G4ProcessTable::GetProcessTable()->FindProcess("e-_G4DNAElectronSolvation", "e-");
520
521 if (pProcess == nullptr)
522 {
523 pPhysicsListHelper->RegisterProcess(new G4DNAElectronSolvation("e-_G4DNAElectronSolvation"),
525 }
526
527 //===============================================================
528 // Define processes for molecules
529 //
530 G4MoleculeTable* pMoleculeTable = G4MoleculeTable::Instance();
531 G4MoleculeDefinitionIterator iterator = pMoleculeTable->GetDefintionIterator();
532 iterator.reset();
533 while (iterator())
534 {
535 G4MoleculeDefinition* pMoleculeDef = iterator.value();
536
537 if (pMoleculeDef != G4H2O::Definition())
538 {
540 pPhysicsListHelper->RegisterProcess(pBrownianTransport, pMoleculeDef);
541 }
542 else
543 {
545 G4DNAMolecularDissociation* pDissociationProcess = new G4DNAMolecularDissociation("H2O_DNAMolecularDecay");
546 pDissociationProcess->SetDisplacer(pMoleculeDef, new G4DNAWaterDissociationDisplacer);
547 pDissociationProcess->SetVerboseLevel(1);
548
549 pMoleculeDef->GetProcessManager()->AddRestProcess(pDissociationProcess, 1);
550 }
551 }
552
554}
555
556//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
557
559 reactionTable)
560{
561 G4VDNAReactionModel* reactionRadiusComputer = new G4DNASmoluchowskiReactionModel();
562 reactionTable->PrintTable(reactionRadiusComputer);
563
565 stepByStep->SetReactionModel(reactionRadiusComputer);
566// ((G4DNAMoleculeEncounterStepper*) stepByStep->GetTimeStepper())->
567// SetVerbose(5);
568
569 RegisterTimeStepModel(stepByStep, 0);
570}
#define G4_DECLARE_PHYSCONSTR_FACTORY(physics_constructor)
static G4DNAChemistryManager * Instance()
void SetChemistryList(G4VUserChemistryList &)
void SetDisplacer(Species *, Displacer *)
void PrintTable(G4VDNAReactionModel *=0)
void SetReaction(G4double observedReactionRate, Reactant *reactive1, Reactant *reactive2)
void SetReactionModel(G4VDNAReactionModel *)
G4int AddElectron(G4int orbit, G4int number=1)
G4int RemoveElectron(G4int orbit, G4int number=1)
static G4Electron_aq * Definition()
static G4Electron * Definition()
Definition: G4Electron.cc:48
virtual ~G4EmDNAChemistry()
virtual void ConstructMolecule()
virtual void ConstructProcess()
virtual void ConstructTimeStepModel(G4DNAMolecularReactionTable *reactionTable)
virtual void ConstructReactionTable(G4DNAMolecularReactionTable *reactionTable)
virtual void ConstructDissociationChannels()
static G4H2O2 * Definition()
Definition: G4H2O2.cc:45
static G4H2O * Definition()
Definition: G4H2O.cc:42
static G4H3O * Definition()
Definition: G4H3O.cc:46
static G4Hydrogen * Definition()
Definition: G4Hydrogen.cc:45
void AddProduct(Product *, G4double displacement=0.)
const G4ElectronOccupancy * GetGroundStateElectronOccupancy() const
void AddDecayChannel(const G4MolecularConfiguration *molConf, const G4MolecularDissociationChannel *channel)
G4MolecularConfiguration * NewConfiguration(const G4String &excitedStateLabel)
G4MolecularConfiguration * NewConfigurationWithElectronOccupancy(const G4String &excitedStateLabel, const G4ElectronOccupancy &, double decayTime=0.)
G4MolecularConfiguration * GetConfiguration(const G4String &, bool mustExist=true)
G4MolecularConfiguration * CreateConfiguration(const G4String &userIdentifier, const G4MoleculeDefinition *molDef, const G4String &configurationLabel, const G4ElectronOccupancy &eOcc)
G4MoleculeDefinitionIterator GetDefintionIterator()
static G4MoleculeTable * Instance()
static G4OH * Definition()
Definition: G4OH.cc:45
G4ProcessManager * GetProcessManager() const
static G4PhysicsListHelper * GetPhysicsListHelper()
G4int AddRestProcess(G4VProcess *aProcess, G4int ord=ordDefault)
static G4ProcessTable * GetProcessTable()
G4VProcess * FindProcess(const G4String &processName, const G4String &particleName) const
G4VEmModel * EmModel(size_t index=0) const
void SetVerboseLevel(G4int value)
Definition: G4VProcess.hh:416
void RegisterTimeStepModel(G4VITStepModel *timeStepModel, G4double startingTime=0)