File indexing completed on 2025-02-23 09:22:11
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include "EmDNAChemistry.hh"
0027
0028 #include "G4DNAChemistryManager.hh"
0029 #include "G4DNAWaterDissociationDisplacer.hh"
0030 #include "G4ProcessManager.hh"
0031 #include "G4SystemOfUnits.hh"
0032
0033
0034
0035 #include "BoundedBrownianAction.hh"
0036
0037 #include "G4DNABrownianTransportation.hh"
0038 #include "G4DNAElectronHoleRecombination.hh"
0039 #include "G4DNAElectronSolvation.hh"
0040 #include "G4DNAMolecularDissociation.hh"
0041 #include "G4DNAMolecularReactionTable.hh"
0042 #include "G4DNAMolecularStepByStepModel.hh"
0043 #include "G4DNASancheExcitationModel.hh"
0044 #include "G4DNASmoluchowskiReactionModel.hh"
0045 #include "G4DNAVibExcitation.hh"
0046
0047
0048 #include "G4Electron.hh"
0049 #include "G4Electron_aq.hh"
0050 #include "G4H2O.hh"
0051 #include "G4H2O2.hh"
0052 #include "G4H3O.hh"
0053 #include "G4HO2.hh"
0054 #include "G4Hydrogen.hh"
0055 #include "G4MoleculeTable.hh"
0056 #include "G4O2.hh"
0057 #include "G4O3.hh"
0058 #include "G4OH.hh"
0059 #include "G4Oxygen.hh"
0060 #include "G4PhysicsListHelper.hh"
0061
0062 #include "G4DNAMoleculeEncounterStepper.hh"
0063 #include "G4DNAScavengerProcess.hh"
0064 #include "G4MolecularConfiguration.hh"
0065 #include "G4ProcessTable.hh"
0066 #include "G4VChemistryWorld.hh"
0067
0068 #include "G4ChemicalMoleculeFinder.hh"
0069
0070 #include "ChemOxygenWaterBuilder.hh"
0071 #include "ChemPureWaterBuilder.hh"
0072
0073 #include "G4ChemDissociationChannels_option1.hh"
0074 #include "G4PhysicsConstructorFactory.hh"
0075
0076 G4_DECLARE_PHYSCONSTR_FACTORY(EmDNAChemistry);
0077
0078 EmDNAChemistry::EmDNAChemistry() : G4VUserChemistryList(true)
0079 {
0080 G4DNAChemistryManager::Instance()->SetChemistryList(this);
0081 }
0082
0083
0084
0085 EmDNAChemistry::~EmDNAChemistry() = default;
0086
0087
0088
0089 void EmDNAChemistry::ConstructMolecule()
0090 {
0091 G4ChemDissociationChannels_option1::ConstructMolecule();
0092 auto table = G4MoleculeTable::Instance();
0093
0094 auto H3OpB = table->GetConfiguration("H3Op(B)");
0095 H3OpB->SetDiffusionCoefficient(9.46e-9 * (m2 / s));
0096
0097 auto OHm = table->GetConfiguration("OHm(B)");
0098 OHm->SetDiffusionCoefficient(5.3e-9 * (m2 / s));
0099 table->CreateConfiguration("H2O", G4H2O::Definition());
0100
0101 auto G4NO2 = new G4MoleculeDefinition("NO_2", 30,
0102 0 * (m * m / s),
0103 0,
0104 0,
0105 0.17 * nm);
0106
0107 auto G4NO3 = new G4MoleculeDefinition("NO_3", 38,
0108 0 * (m * m / s),
0109 0,
0110 0,
0111 0.17 * nm);
0112
0113 table->CreateConfiguration("NO2", G4NO2);
0114 table->CreateConfiguration("NO2m", G4NO2,
0115 -1,
0116 0 * (m2 / s));
0117 table->CreateConfiguration("NO2mm", G4NO2,
0118 -2,
0119 0 * (m2 / s));
0120
0121 table->CreateConfiguration("NO3m", G4NO3,
0122 -1,
0123 0 * (m2 / s));
0124
0125 table->CreateConfiguration("NO3mm", G4NO3,
0126 -2,
0127 0 * (m2 / s));
0128
0129
0130 auto G4Fe = new G4MoleculeDefinition("Fe",
0131 55.84 * g / Avogadro * c_squared,
0132 0 * (m * m / s),
0133 0,
0134 0,
0135 0.35 * nm);
0136
0137 table->CreateConfiguration("Fe0", G4Fe);
0138
0139 table->CreateConfiguration("Feppp", G4Fe,
0140 3,
0141 4.86e-10 * (m2 / s));
0142
0143 table->CreateConfiguration("Fepp", G4Fe,
0144 2,
0145 5.78e-10 * (m2 / s));
0146
0147 auto G4HSO4 = new G4MoleculeDefinition("HSO4",
0148 55.84 * g / Avogadro * c_squared,
0149 0 * (m * m / s),
0150 0,
0151 0,
0152 0.35 * nm);
0153 table->CreateConfiguration("HSO4m", G4HSO4,
0154 -1,
0155 0 * (m2 / s));
0156
0157
0158 auto G4SO4 = new G4MoleculeDefinition("SO4",
0159 55.84 * g / Avogadro * c_squared,
0160 0 * (m * m / s),
0161 0,
0162 0,
0163 0.35 * nm);
0164 table->CreateConfiguration("SO4m", G4SO4,
0165 -1,
0166 0 * (m2 / s));
0167 }
0168
0169
0170
0171 void EmDNAChemistry::ConstructDissociationChannels()
0172 {
0173 G4ChemDissociationChannels_option1::ConstructDissociationChannels();
0174 }
0175
0176
0177
0178 void EmDNAChemistry::ConstructReactionTable(G4DNAMolecularReactionTable* pReactionTable)
0179 {
0180 ChemOxygenWaterBuilder::OxygenScavengerReaction(pReactionTable);
0181 ChemOxygenWaterBuilder::SecondOrderReactionExtended(pReactionTable);
0182 ChemPureWaterBuilder::WaterScavengerReaction(pReactionTable);
0183 }
0184
0185
0186
0187 void EmDNAChemistry::ConstructProcess()
0188 {
0189 auto table = G4MoleculeTable::Instance();
0190 auto O2 = table->GetConfiguration("O2");
0191 auto O2m = table->GetConfiguration("O2m");
0192 auto HO2 = table->GetConfiguration("HO2");
0193
0194 auto e_aq = table->GetConfiguration("e_aq");
0195 auto OH = table->GetConfiguration("OH");
0196 auto OHm = table->GetConfiguration("OHm");
0197
0198 auto NO2 = table->GetConfiguration("NO2");
0199 auto NO2m = table->GetConfiguration("NO2m");
0200 auto NO2mm = table->GetConfiguration("NO2mm");
0201 auto NO3m = table->GetConfiguration("NO3m");
0202 auto NO3mm = table->GetConfiguration("NO3mm");
0203
0204 auto H2O2 = table->GetConfiguration("H2O2");
0205 auto H = table->GetConfiguration("H");
0206
0207 auto* H3OpB = table->GetConfiguration("H3Op(B)");
0208 auto* OHmB = table->GetConfiguration("OHm(B)");
0209 auto* HO2m = table->GetConfiguration("HO2m");
0210 auto* Om = table->GetConfiguration("Om");
0211 auto* O3m = table->GetConfiguration("O3m");
0212 auto* H3Op = table->GetConfiguration("H3Op");
0213
0214 fpChemistryWorld->ConstructChemistryComponents();
0215 auto confinedBox = fpChemistryWorld->GetChemistryBoundary();
0216
0217 auto* ph = G4PhysicsListHelper::GetPhysicsListHelper();
0218
0219
0220
0221
0222
0223
0224 G4VProcess* process =
0225 G4ProcessTable::GetProcessTable()->FindProcess("e-_G4DNAVibExcitation", "e-");
0226
0227 if (process) {
0228 auto vibExcitation = (G4DNAVibExcitation*)process;
0229 G4VEmModel* model = vibExcitation->EmModel();
0230 auto sancheExcitationMod = dynamic_cast<G4DNASancheExcitationModel*>(model);
0231 if (sancheExcitationMod) {
0232 sancheExcitationMod->ExtendLowEnergyLimit(0.025 * eV);
0233 }
0234 }
0235
0236
0237
0238
0239 process = G4ProcessTable::GetProcessTable()->FindProcess("e-_G4DNAElectronSolvation", "e-");
0240
0241 if (process == nullptr) {
0242 ph->RegisterProcess(new G4DNAElectronSolvation("e-_G4DNAElectronSolvation"),
0243 G4Electron::Definition());
0244 }
0245
0246
0247
0248
0249 auto* theMoleculeTable = G4MoleculeTable::Instance();
0250 auto iterator = theMoleculeTable->GetDefintionIterator();
0251 iterator.reset();
0252
0253 while (iterator()) {
0254 auto* moleculeDef = iterator.value();
0255
0256 if (moleculeDef != G4H2O::Definition()) {
0257 auto brown = new G4DNABrownianTransportation("BrowianTransportation");
0258
0259 auto brownTransport = new BoundedBrownianAction();
0260 brownTransport->SetBoundary(*confinedBox);
0261 brown->SetUserBrownianAction(brownTransport);
0262
0263
0264 ph->RegisterProcess(brown, moleculeDef);
0265 }
0266 else {
0267 moleculeDef->GetProcessManager()->AddRestProcess(new G4DNAElectronHoleRecombination(), 2);
0268 auto brownTransport = new BoundedBrownianAction();
0269 brownTransport->SetBoundary(*confinedBox);
0270 auto dissociationProcess = new G4DNAMolecularDissociation("H2O_DNAMolecularDecay", fDecay);
0271 dissociationProcess->SetUserBrownianAction(brownTransport);
0272 dissociationProcess->SetDisplacer(moleculeDef, new G4DNAWaterDissociationDisplacer);
0273 moleculeDef->GetProcessManager()->AddRestProcess(dissociationProcess, 1);
0274 }
0275
0276 if (moleculeDef == G4Hydrogen::Definition()) {
0277
0278 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0279
0280
0281 auto reactionData = new G4DNAMolecularReactionData(1.3e10 * (1e-3 * m3 / (mole * s)), H, O2);
0282 reactionData->AddProduct(HO2);
0283 scanvergerProcess->SetReaction(H, reactionData);
0284
0285
0286 reactionData = new G4DNAMolecularReactionData(2.49e7 * (1e-3 * m3 / (mole * s)), H,
0287 OHmB);
0288 reactionData->AddProduct(e_aq);
0289 scanvergerProcess->SetReaction(H, reactionData);
0290
0291
0292
0293
0294
0295
0296
0297
0298 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0299 }
0300 if (moleculeDef == G4Electron_aq::Definition()) {
0301 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0302 G4DNAMolecularReactionData* reactionData = nullptr;
0303
0304
0305 reactionData = new G4DNAMolecularReactionData(2.3e10 * (1e-3 * m3 / (mole * s)), e_aq, O2);
0306 reactionData->AddProduct(O2m);
0307 scanvergerProcess->SetReaction(e_aq, reactionData);
0308
0309
0310 reactionData =
0311 new G4DNAMolecularReactionData(2.25e10 * (1e-3 * m3 / (mole * s)), e_aq,
0312 H3OpB);
0313 reactionData->AddProduct(H);
0314 scanvergerProcess->SetReaction(e_aq, reactionData);
0315
0316
0317 reactionData = new G4DNAMolecularReactionData(3.5e9 * (1e-3 * m3 / (mole * s)), e_aq, NO2m);
0318 reactionData->AddProduct(NO2mm);
0319 scanvergerProcess->SetReaction(e_aq, reactionData);
0320
0321
0322 reactionData = new G4DNAMolecularReactionData(9.7e9 * (1e-3 * m3 / (mole * s)), e_aq, NO3m);
0323 reactionData->AddProduct(NO3mm);
0324 scanvergerProcess->SetReaction(e_aq, reactionData);
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0335 }
0336 if (moleculeDef == G4O2::Definition()) {
0337 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0338 G4DNAMolecularReactionData* reactionData = nullptr;
0339
0340
0341 reactionData =
0342 new G4DNAMolecularReactionData(4.78e10 * (1e-3 * m3 / (mole * s)), O2m,
0343 H3OpB);
0344 reactionData->AddProduct(HO2);
0345 scanvergerProcess->SetReaction(O2m, reactionData);
0346 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0347 }
0348 if (moleculeDef == G4ParticleTable::GetParticleTable()->FindParticle("OHm")) {
0349 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0350 G4DNAMolecularReactionData* reactionData = nullptr;
0351
0352
0353 reactionData =
0354 new G4DNAMolecularReactionData(1.13e11 * (1e-3 * m3 / (mole * s)), OHm,
0355 H3OpB);
0356 scanvergerProcess->SetReaction(OHm, reactionData);
0357 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0358 }
0359 if (moleculeDef == G4OH::Definition()) {
0360 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0361 G4DNAMolecularReactionData* reactionData = nullptr;
0362
0363
0364
0365 reactionData =
0366 new G4DNAMolecularReactionData(1.27e10 * (1e-3 * m3 / (mole * s)), OH,
0367 OHmB);
0368 reactionData->AddProduct(Om);
0369 scanvergerProcess->SetReaction(OH, reactionData);
0370
0371
0372
0373 reactionData = new G4DNAMolecularReactionData(8e9 * (1e-3 * m3 / (mole * s)), OH, NO2m);
0374 reactionData->AddProduct(NO2);
0375 reactionData->AddProduct(OHm);
0376 scanvergerProcess->SetReaction(OH, reactionData);
0377 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0378 }
0379 if (moleculeDef == G4ParticleTable::GetParticleTable()->FindParticle("HO_2m")) {
0380 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0381 G4DNAMolecularReactionData* reactionData = nullptr;
0382
0383
0384 reactionData =
0385 new G4DNAMolecularReactionData(4.78e10 * (1e-3 * m3 / (mole * s)), HO2m,
0386 H3OpB);
0387 reactionData->AddProduct(H2O2);
0388 scanvergerProcess->SetReaction(HO2m, reactionData);
0389 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0390 }
0391
0392 if (moleculeDef == G4HO2::Definition()) {
0393 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0394 G4DNAMolecularReactionData* reactionData = nullptr;
0395
0396
0397 reactionData = new G4DNAMolecularReactionData(1.27e10 * (1e-3 * m3 / (mole * s)), HO2,
0398 OHmB);
0399 reactionData->AddProduct(O2m);
0400 scanvergerProcess->SetReaction(HO2, reactionData);
0401
0402 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0403 }
0404 if (moleculeDef == G4Oxygen::Definition()) {
0405 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0406 G4DNAMolecularReactionData* reactionData = nullptr;
0407
0408
0409 reactionData =
0410 new G4DNAMolecularReactionData(4.78e10 * (1e-3 * m3 / (mole * s)), Om,
0411 H3OpB);
0412 reactionData->AddProduct(OH);
0413 scanvergerProcess->SetReaction(Om, reactionData);
0414 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0415 }
0416 if (moleculeDef == G4O3::Definition()) {
0417 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0418 G4DNAMolecularReactionData* reactionData = nullptr;
0419
0420
0421 reactionData =
0422 new G4DNAMolecularReactionData(9.0e10 * (1e-3 * m3 / (mole * s)), O3m,
0423 H3OpB);
0424 reactionData->AddProduct(OH);
0425 reactionData->AddProduct(O2);
0426
0427 scanvergerProcess->SetReaction(O3m, reactionData);
0428 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0429 }
0430 if (moleculeDef == G4H3O::Definition()) {
0431 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0432 G4DNAMolecularReactionData* reactionData = nullptr;
0433
0434
0435 reactionData =
0436 new G4DNAMolecularReactionData(1.13e11 * (1e-3 * m3 / (mole * s)), H3Op,
0437 OHmB);
0438 scanvergerProcess->SetReaction(H3Op, reactionData);
0439 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0440 }
0441 if (moleculeDef == G4H2O2::Definition()) {
0442 auto scanvergerProcess = new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0443 G4DNAMolecularReactionData* reactionData = nullptr;
0444
0445
0446 reactionData =
0447 new G4DNAMolecularReactionData(1.27e10 * (1e-3 * m3 / (mole * s)), H2O2,
0448 OHmB);
0449 reactionData->AddProduct(HO2m);
0450 scanvergerProcess->SetReaction(H2O2, reactionData);
0451 ph->RegisterProcess(scanvergerProcess, moleculeDef);
0452 }
0453 }
0454 G4DNAChemistryManager::Instance()->Initialize();
0455 }
0456
0457
0458
0459 void EmDNAChemistry::ConstructTimeStepModel(G4DNAMolecularReactionTable* reactionTable)
0460 {
0461 auto reactionRadiusComputer = new G4DNASmoluchowskiReactionModel();
0462 reactionTable->PrintTable(reactionRadiusComputer);
0463 auto stepByStep = new G4DNAMolecularStepByStepModel();
0464 stepByStep->SetReactionModel(reactionRadiusComputer);
0465 RegisterTimeStepModel(stepByStep, 0);
0466 }
0467
0468