Geant4 Cross Reference |
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