Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/extended/medical/dna/UHDR/src/EmDNAChemistry.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /examples/extended/medical/dna/UHDR/src/EmDNAChemistry.cc (Version 11.3.0) and /examples/extended/medical/dna/UHDR/src/EmDNAChemistry.cc (Version 10.3.p3)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 #include "EmDNAChemistry.hh"                      
 27                                                   
 28 #include "G4DNAChemistryManager.hh"               
 29 #include "G4DNAWaterDissociationDisplacer.hh"     
 30 #include "G4ProcessManager.hh"                    
 31 #include "G4SystemOfUnits.hh"                     
 32                                                   
 33 // *** Processes and models for Geant4-DNA        
 34                                                   
 35 #include "BoundedBrownianAction.hh"               
 36                                                   
 37 #include "G4DNABrownianTransportation.hh"         
 38 #include "G4DNAElectronHoleRecombination.hh"      
 39 #include "G4DNAElectronSolvation.hh"              
 40 #include "G4DNAMolecularDissociation.hh"          
 41 #include "G4DNAMolecularReactionTable.hh"         
 42 #include "G4DNAMolecularStepByStepModel.hh"       
 43 #include "G4DNASancheExcitationModel.hh"          
 44 #include "G4DNASmoluchowskiReactionModel.hh"      
 45 #include "G4DNAVibExcitation.hh"                  
 46 // particles                                      
 47                                                   
 48 #include "G4Electron.hh"                          
 49 #include "G4Electron_aq.hh"                       
 50 #include "G4H2O.hh"                               
 51 #include "G4H2O2.hh"                              
 52 #include "G4H3O.hh"                               
 53 #include "G4HO2.hh"                               
 54 #include "G4Hydrogen.hh"                          
 55 #include "G4MoleculeTable.hh"                     
 56 #include "G4O2.hh"                                
 57 #include "G4O3.hh"                                
 58 #include "G4OH.hh"                                
 59 #include "G4Oxygen.hh"                            
 60 #include "G4PhysicsListHelper.hh"                 
 61 /****/                                            
 62 #include "G4DNAMoleculeEncounterStepper.hh"       
 63 #include "G4DNAScavengerProcess.hh"               
 64 #include "G4MolecularConfiguration.hh"            
 65 #include "G4ProcessTable.hh"                      
 66 #include "G4VChemistryWorld.hh"                   
 67 /****/                                            
 68 #include "G4ChemicalMoleculeFinder.hh"            
 69 // factory                                        
 70 #include "ChemOxygenWaterBuilder.hh"              
 71 #include "ChemPureWaterBuilder.hh"                
 72                                                   
 73 #include "G4ChemDissociationChannels_option1.h    
 74 #include "G4PhysicsConstructorFactory.hh"         
 75                                                   
 76 G4_DECLARE_PHYSCONSTR_FACTORY(EmDNAChemistry);    
 77                                                   
 78 EmDNAChemistry::EmDNAChemistry() : G4VUserChem    
 79 {                                                 
 80   G4DNAChemistryManager::Instance()->SetChemis    
 81 }                                                 
 82                                                   
 83 //....oooOO0OOooo........oooOO0OOooo........oo    
 84                                                   
 85 EmDNAChemistry::~EmDNAChemistry() = default;      
 86                                                   
 87 //....oooOO0OOooo........oooOO0OOooo........oo    
 88                                                   
 89 void EmDNAChemistry::ConstructMolecule()          
 90 {                                                 
 91   G4ChemDissociationChannels_option1::Construc    
 92   auto table = G4MoleculeTable::Instance();       
 93                                                   
 94   auto H3OpB = table->GetConfiguration("H3Op(B    
 95   H3OpB->SetDiffusionCoefficient(9.46e-9 * (m2    
 96                                                   
 97   auto OHm = table->GetConfiguration("OHm(B)")    
 98   OHm->SetDiffusionCoefficient(5.3e-9 * (m2 /     
 99   table->CreateConfiguration("H2O", G4H2O::Def    
100                                                   
101   auto G4NO2 = new G4MoleculeDefinition("NO_2"    
102                                         /*D*/     
103                                         /*char    
104                                         /*elec    
105                                         /*radi    
106                                                   
107   auto G4NO3 = new G4MoleculeDefinition("NO_3"    
108                                         /*D*/     
109                                         /*char    
110                                         /*elec    
111                                         /*radi    
112                                                   
113   table->CreateConfiguration("NO2", G4NO2);       
114   table->CreateConfiguration("NO2m", G4NO2,       
115                              -1,  // charge       
116                              0 * (m2 / s));       
117   table->CreateConfiguration("NO2mm", G4NO2,      
118                              -2,  // charge       
119                              0 * (m2 / s));       
120                                                   
121   table->CreateConfiguration("NO3m", G4NO3,       
122                              -1,  // charge       
123                              0 * (m2 / s));       
124                                                   
125   table->CreateConfiguration("NO3mm", G4NO3,      
126                              -2,  // charge       
127                              0 * (m2 / s));       
128                                                   
129   // FrickeDosimeter                              
130   auto G4Fe = new G4MoleculeDefinition("Fe",      
131                                        /*mass*    
132                                        /*D*/ 0    
133                                        /*charg    
134                                        /*elect    
135                                        /*radiu    
136                                                   
137   table->CreateConfiguration("Fe0", G4Fe);        
138                                                   
139   table->CreateConfiguration("Feppp", G4Fe,       
140                              3,  // charge        
141                              4.86e-10 * (m2 /     
142                                                   
143   table->CreateConfiguration("Fepp", G4Fe,        
144                              2,  // charge        
145                              5.78e-10 * (m2 /     
146   // HSO4-                                        
147   auto G4HSO4 = new G4MoleculeDefinition("HSO4    
148                                          /*mas    
149                                          /*D*/    
150                                          /*cha    
151                                          /*ele    
152                                          /*rad    
153   table->CreateConfiguration("HSO4m", G4HSO4,     
154                              -1,  // charge       
155                              0 * (m2 / s));       
156                                                   
157   // SO4-                                         
158   auto G4SO4 = new G4MoleculeDefinition("SO4",    
159                                         /*mass    
160                                         /*D*/     
161                                         /*char    
162                                         /*elec    
163                                         /*radi    
164   table->CreateConfiguration("SO4m", G4SO4,       
165                              -1,  // charge       
166                              0 * (m2 / s));       
167 }                                                 
168                                                   
169 //....oooOO0OOooo........oooOO0OOooo........oo    
170                                                   
171 void EmDNAChemistry::ConstructDissociationChan    
172 {                                                 
173   G4ChemDissociationChannels_option1::Construc    
174 }                                                 
175                                                   
176 //....oooOO0OOooo........oooOO0OOooo........oo    
177                                                   
178 void EmDNAChemistry::ConstructReactionTable(G4    
179 {                                                 
180   ChemOxygenWaterBuilder::OxygenScavengerReact    
181   ChemOxygenWaterBuilder::SecondOrderReactionE    
182   ChemPureWaterBuilder::WaterScavengerReaction    
183 }                                                 
184                                                   
185 //....oooOO0OOooo........oooOO0OOooo........oo    
186                                                   
187 void EmDNAChemistry::ConstructProcess()           
188 {                                                 
189   auto table = G4MoleculeTable::Instance();       
190   auto O2 = table->GetConfiguration("O2");        
191   auto O2m = table->GetConfiguration("O2m");      
192   auto HO2 = table->GetConfiguration("HO2°");    
193                                                   
194   auto e_aq = table->GetConfiguration("e_aq");    
195   auto OH = table->GetConfiguration("°OH");      
196   auto OHm = table->GetConfiguration("OHm");      
197                                                   
198   auto NO2 = table->GetConfiguration("NO2");      
199   auto NO2m = table->GetConfiguration("NO2m");    
200   auto NO2mm = table->GetConfiguration("NO2mm"    
201   auto NO3m = table->GetConfiguration("NO3m");    
202   auto NO3mm = table->GetConfiguration("NO3mm"    
203                                                   
204   auto H2O2 = table->GetConfiguration("H2O2");    
205   auto H = table->GetConfiguration("H");          
206                                                   
207   auto* H3OpB = table->GetConfiguration("H3Op(    
208   auto* OHmB = table->GetConfiguration("OHm(B)    
209   auto* HO2m = table->GetConfiguration("HO2m")    
210   auto* Om = table->GetConfiguration("Om");       
211   auto* O3m = table->GetConfiguration("O3m");     
212   auto* H3Op = table->GetConfiguration("H3Op")    
213                                                   
214   fpChemistryWorld->ConstructChemistryComponen    
215   auto confinedBox = fpChemistryWorld->GetChem    
216                                                   
217   auto* ph = G4PhysicsListHelper::GetPhysicsLi    
218                                                   
219   //==========================================    
220   // Extend vibrational to low energy             
221   // Anyway, solvation of electrons is taken i    
222   // So below this threshold, for now, no accu    
223   //                                              
224   G4VProcess* process =                           
225     G4ProcessTable::GetProcessTable()->FindPro    
226                                                   
227   if (process) {                                  
228     auto vibExcitation = (G4DNAVibExcitation*)    
229     G4VEmModel* model = vibExcitation->EmModel    
230     auto sancheExcitationMod = dynamic_cast<G4    
231     if (sancheExcitationMod) {                    
232       sancheExcitationMod->ExtendLowEnergyLimi    
233     }                                             
234   }                                               
235                                                   
236   //==========================================    
237   // *** Electron Solvatation ***                 
238   //                                              
239   process = G4ProcessTable::GetProcessTable()-    
240                                                   
241   if (process == nullptr) {                       
242     ph->RegisterProcess(new G4DNAElectronSolva    
243                         G4Electron::Definition    
244   }                                               
245                                                   
246   //==========================================    
247   // Define processes for molecules               
248   //                                              
249   auto* theMoleculeTable = G4MoleculeTable::In    
250   auto iterator = theMoleculeTable->GetDefinti    
251   iterator.reset();                               
252                                                   
253   while (iterator()) {                            
254     auto* moleculeDef = iterator.value();         
255                                                   
256     if (moleculeDef != G4H2O::Definition()) {     
257       auto brown = new G4DNABrownianTransporta    
258       // hoang exp                                
259       auto brownTransport = new BoundedBrownia    
260       brownTransport->SetBoundary(*confinedBox    
261       brown->SetUserBrownianAction(brownTransp    
262       // hoang exp                                
263                                                   
264       ph->RegisterProcess(brown, moleculeDef);    
265     }                                             
266     else {                                        
267       moleculeDef->GetProcessManager()->AddRes    
268       auto brownTransport = new BoundedBrownia    
269       brownTransport->SetBoundary(*confinedBox    
270       auto dissociationProcess = new G4DNAMole    
271       dissociationProcess->SetUserBrownianActi    
272       dissociationProcess->SetDisplacer(molecu    
273       moleculeDef->GetProcessManager()->AddRes    
274     }                                             
275                                                   
276     if (moleculeDef == G4Hydrogen::Definition(    
277       // O2                                       
278       auto scanvergerProcess = new G4DNAScaven    
279       //--------------------------------------    
280       // H + O2(B) -> HO2                         
281       auto reactionData = new G4DNAMolecularRe    
282       reactionData->AddProduct(HO2);              
283       scanvergerProcess->SetReaction(H, reacti    
284       //--------------------------------------    
285       // H + OH-(B) -> H2O + eaq- 2.49e3 / s      
286       reactionData = new G4DNAMolecularReactio    
287                                                   
288       reactionData->AddProduct(e_aq);             
289       scanvergerProcess->SetReaction(H, reacti    
290                                                   
291       // H2O2                                     
292       //--------------------------------------    
293       // H + H202 -> OH + H20                     
294       //            reactionData = new G4DNAMo    
295       //                    9.0e7 * (1e-3 * m3    
296       //            reactionData->AddProduct(O    
297       //            scanvergerProcess->SetReac    
298       ph->RegisterProcess(scanvergerProcess, m    
299     }                                             
300     if (moleculeDef == G4Electron_aq::Definiti    
301       auto scanvergerProcess = new G4DNAScaven    
302       G4DNAMolecularReactionData* reactionData    
303       //--------------------------------------    
304       // e_aq + O2(B) -> O2-                      
305       reactionData = new G4DNAMolecularReactio    
306       reactionData->AddProduct(O2m);              
307       scanvergerProcess->SetReaction(e_aq, rea    
308       //--------------------------------------    
309       // eaq- + H3O+(B) -> H + H2O 2.09e3 / s     
310       reactionData =                              
311         new G4DNAMolecularReactionData(2.25e10    
312                                        H3OpB);    
313       reactionData->AddProduct(H);                
314       scanvergerProcess->SetReaction(e_aq, rea    
315       //--------------------------------------    
316       // e_aq + NO2- -> NO2--                     
317       reactionData = new G4DNAMolecularReactio    
318       reactionData->AddProduct(NO2mm);            
319       scanvergerProcess->SetReaction(e_aq, rea    
320       //--------------------------------------    
321       // e_aq + NO3- -> NO3--                     
322       reactionData = new G4DNAMolecularReactio    
323       reactionData->AddProduct(NO3mm);            
324       scanvergerProcess->SetReaction(e_aq, rea    
325       //--------------------------------------    
326                                                   
327       // H2O2 + e aq → OHm + OH                 
328       //            reactionData = new G4DNAMo    
329       //                    1.1e10 * (1e-3 * m    
330       //            reactionData->AddProduct(O    
331       //            reactionData->AddProduct(O    
332       //            scanvergerProcess->SetReac    
333                                                   
334       ph->RegisterProcess(scanvergerProcess, m    
335     }                                             
336     if (moleculeDef == G4O2::Definition()) {      
337       auto scanvergerProcess = new G4DNAScaven    
338       G4DNAMolecularReactionData* reactionData    
339       //--------------------------------------    
340       // O2- + H3O+(B) -> HO2 + H2O 4.73e3 / s    
341       reactionData =                              
342         new G4DNAMolecularReactionData(4.78e10    
343                                        H3OpB);    
344       reactionData->AddProduct(HO2);              
345       scanvergerProcess->SetReaction(O2m, reac    
346       ph->RegisterProcess(scanvergerProcess, m    
347     }                                             
348     if (moleculeDef == G4ParticleTable::GetPar    
349       auto scanvergerProcess = new G4DNAScaven    
350       G4DNAMolecularReactionData* reactionData    
351       //--------------------------------------    
352       // OH- + H3O+(B) -> 2H2O 1.11e4 / s         
353       reactionData =                              
354         new G4DNAMolecularReactionData(1.13e11    
355                                        H3OpB);    
356       scanvergerProcess->SetReaction(OHm, reac    
357       ph->RegisterProcess(scanvergerProcess, m    
358     }                                             
359     if (moleculeDef == G4OH::Definition()) {      
360       auto scanvergerProcess = new G4DNAScaven    
361       G4DNAMolecularReactionData* reactionData    
362                                                   
363       //--------------------------------------    
364       // OH + OH-(B) -> O- + H2O 6.24e2 / s       
365       reactionData =                              
366         new G4DNAMolecularReactionData(1.27e10    
367                                        OHmB);     
368       reactionData->AddProduct(Om);               
369       scanvergerProcess->SetReaction(OH, react    
370                                                   
371       //--------------------------------------    
372       // OH + NO2- -> NO2 + OH-                   
373       reactionData = new G4DNAMolecularReactio    
374       reactionData->AddProduct(NO2);              
375       reactionData->AddProduct(OHm);              
376       scanvergerProcess->SetReaction(OH, react    
377       ph->RegisterProcess(scanvergerProcess, m    
378     }                                             
379     if (moleculeDef == G4ParticleTable::GetPar    
380       auto scanvergerProcess = new G4DNAScaven    
381       G4DNAMolecularReactionData* reactionData    
382       //--------------------------------------    
383       // HO2- + H3O+(B) -> H2O2 + H2O 4.98e3 /    
384       reactionData =                              
385         new G4DNAMolecularReactionData(4.78e10    
386                                        H3OpB);    
387       reactionData->AddProduct(H2O2);             
388       scanvergerProcess->SetReaction(HO2m, rea    
389       ph->RegisterProcess(scanvergerProcess, m    
390     }                                             
391                                                   
392     if (moleculeDef == G4HO2::Definition()) {     
393       auto scanvergerProcess = new G4DNAScaven    
394       G4DNAMolecularReactionData* reactionData    
395       //--------------------------------------    
396       // HO2 + OH-(B) -> O2- + H2O 6.24e2 / s     
397       reactionData = new G4DNAMolecularReactio    
398                                                   
399       reactionData->AddProduct(O2m);              
400       scanvergerProcess->SetReaction(HO2, reac    
401       //--------------------------------------    
402       ph->RegisterProcess(scanvergerProcess, m    
403     }                                             
404     if (moleculeDef == G4Oxygen::Definition())    
405       auto scanvergerProcess = new G4DNAScaven    
406       G4DNAMolecularReactionData* reactionData    
407       //--------------------------------------    
408       // O- + H3O+(B) -> OH + H2O 4.73e3 / s      
409       reactionData =                              
410         new G4DNAMolecularReactionData(4.78e10    
411                                        H3OpB);    
412       reactionData->AddProduct(OH);               
413       scanvergerProcess->SetReaction(Om, react    
414       ph->RegisterProcess(scanvergerProcess, m    
415     }                                             
416     if (moleculeDef == G4O3::Definition()) {      
417       auto scanvergerProcess = new G4DNAScaven    
418       G4DNAMolecularReactionData* reactionData    
419       //--------------------------------------    
420       // O3- + H3O+(B) -> OH + O2 + H2O 8.91e3    
421       reactionData =                              
422         new G4DNAMolecularReactionData(9.0e10     
423                                        H3OpB);    
424       reactionData->AddProduct(OH);               
425       reactionData->AddProduct(O2);               
426       //--------------------------------------    
427       scanvergerProcess->SetReaction(O3m, reac    
428       ph->RegisterProcess(scanvergerProcess, m    
429     }                                             
430     if (moleculeDef == G4H3O::Definition()) {     
431       auto scanvergerProcess = new G4DNAScaven    
432       G4DNAMolecularReactionData* reactionData    
433       //--------------------------------------    
434       // H3O+ + OH-(B) -> 2H2O 1.11e4 / s         
435       reactionData =                              
436         new G4DNAMolecularReactionData(1.13e11    
437                                        OHmB);     
438       scanvergerProcess->SetReaction(H3Op, rea    
439       ph->RegisterProcess(scanvergerProcess, m    
440     }                                             
441     if (moleculeDef == G4H2O2::Definition()) {    
442       auto scanvergerProcess = new G4DNAScaven    
443       G4DNAMolecularReactionData* reactionData    
444       //--------------------------------------    
445       // H2O2 + OH-(B) -> HO2- + H2O 4.66e2 /     
446       reactionData =                              
447         new G4DNAMolecularReactionData(1.27e10    
448                                        OHmB);     
449       reactionData->AddProduct(HO2m);             
450       scanvergerProcess->SetReaction(H2O2, rea    
451       ph->RegisterProcess(scanvergerProcess, m    
452     }                                             
453   }                                               
454   G4DNAChemistryManager::Instance()->Initializ    
455 }                                                 
456                                                   
457 //....oooOO0OOooo........oooOO0OOooo........oo    
458                                                   
459 void EmDNAChemistry::ConstructTimeStepModel(G4    
460 {                                                 
461   auto reactionRadiusComputer = new G4DNASmolu    
462   reactionTable->PrintTable(reactionRadiusComp    
463   auto stepByStep = new G4DNAMolecularStepBySt    
464   stepByStep->SetReactionModel(reactionRadiusC    
465   RegisterTimeStepModel(stepByStep, 0);           
466 }                                                 
467                                                   
468 //....oooOO0OOooo........oooOO0OOooo........oo    
469