Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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)