File indexing completed on 2025-10-17 08:07:01
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
0027
0028 #include "EmDNAChemistry.hh"
0029
0030 #include "G4DNAChemistryManager.hh"
0031 #include "G4DNAElectronHoleRecombination.hh"
0032 #include "G4DNAElectronSolvation.hh"
0033 #include "G4DNAIRT.hh"
0034 #include "G4DNAMolecularDissociation.hh"
0035 #include "G4DNAMolecularIRTModel.hh"
0036 #include "G4DNAMolecularReactionTable.hh"
0037 #include "G4DNASancheExcitationModel.hh"
0038 #include "G4DNAVibExcitation.hh"
0039 #include "G4DNAWaterDissociationDisplacer.hh"
0040 #include "G4DNAWaterExcitationStructure.hh"
0041 #include "G4PhysicalConstants.hh"
0042 #include "G4ProcessManager.hh"
0043 #include "G4SystemOfUnits.hh"
0044 #include "G4VDNAReactionModel.hh"
0045
0046 #include "G4Electron.hh"
0047 #include "G4Electron_aq.hh"
0048 #include "G4H2O.hh"
0049 #include "G4MoleculeTable.hh"
0050 #include "G4O2.hh"
0051 #include "G4O3.hh"
0052 #include "G4OH.hh"
0053 #include "G4Oxygen.hh"
0054 #include "G4PhysicsListHelper.hh"
0055
0056 #include "G4MolecularConfiguration.hh"
0057 #include "G4ProcessTable.hh"
0058
0059
0060 #include "G4PhysicsConstructorFactory.hh"
0061 #include "G4ChemDissociationChannels_option1.hh"
0062 #include "G4ChemDissociationChannels_option1.hh"
0063 namespace scavenger
0064 {
0065
0066 G4_DECLARE_PHYSCONSTR_FACTORY(EmDNAChemistry);
0067
0068
0069
0070 EmDNAChemistry::EmDNAChemistry()
0071 : G4VUserChemistryList(true),
0072 G4UImessenger(),
0073 fpParserDir(new G4UIdirectory("/chem/reactionTable/")),
0074 fpReactionTableNameCmd(new G4UIcmdWithAString("/chem/reactionTable/name", this))
0075 {
0076 G4DNAChemistryManager::Instance()->SetChemistryList(this);
0077 fpParserDir->SetGuidance("Chemistry control");
0078 fpReactionTableNameCmd->SetGuidance("Name of the chemical reaction table");
0079 }
0080
0081
0082
0083 void EmDNAChemistry::SetNewValue(G4UIcommand* command, G4String newValue)
0084 {
0085 if (command == fpReactionTableNameCmd.get()) {
0086 fReactionTableName = newValue;
0087 }
0088 }
0089
0090
0091
0092 void EmDNAChemistry::ConstructMolecule()
0093 {
0094
0095 G4ChemDissociationChannels_option1::ConstructMolecule();
0096
0097 auto G4NO2 = new G4MoleculeDefinition("NO_2",
0098 46.0055 * g / Avogadro * c_squared,
0099 1.7e-9 * (m * m / s),
0100 0,
0101 0,
0102 0.35 * nm);
0103
0104 auto G4NO3 = new G4MoleculeDefinition("NO_3",
0105 62.0049 * g / Avogadro * c_squared,
0106 1.7e-9 * (m * m / s),
0107 0,
0108 0,
0109 0.35 * nm);
0110
0111
0112
0113 G4MoleculeTable::Instance()->CreateConfiguration("O2(B)",
0114
0115 G4O2::Definition(),
0116 0,
0117 0 * (m2 / s));
0118
0119 G4MoleculeTable::Instance()->CreateConfiguration("NO2m(B)",
0120
0121 G4NO2,
0122 -1,
0123 0 * (m2 / s));
0124
0125 G4MoleculeTable::Instance()->CreateConfiguration("NO3m(B)",
0126
0127 G4NO3,
0128 -1,
0129 0 * (m2 / s));
0130
0131 }
0132
0133
0134
0135 void EmDNAChemistry::ConstructDissociationChannels()
0136 {
0137
0138
0139 auto OH = G4MoleculeTable::Instance()->GetConfiguration("°OH");
0140 auto OHm = G4MoleculeTable::Instance()->GetConfiguration("OHm");
0141 auto e_aq = G4MoleculeTable::Instance()->GetConfiguration("e_aq");
0142 auto H2 = G4MoleculeTable::Instance()->GetConfiguration("H2");
0143 auto H3O = G4MoleculeTable::Instance()->GetConfiguration("H3Op");
0144 auto H = G4MoleculeTable::Instance()->GetConfiguration("H");
0145
0146
0147
0148 auto* water = G4H2O::Definition();
0149 G4MolecularDissociationChannel* decCh1;
0150 G4MolecularDissociationChannel* decCh2;
0151
0152 auto occ = new G4ElectronOccupancy(*(water->GetGroundStateElectronOccupancy()));
0153
0154
0155
0156
0157 G4DNAWaterExcitationStructure waterExcitation;
0158
0159
0160
0161 decCh1 = new G4MolecularDissociationChannel("A^1B_1_Relaxation");
0162 decCh2 = new G4MolecularDissociationChannel("A^1B_1_DissociativeDecay");
0163
0164 decCh1->SetEnergy(waterExcitation.ExcitationEnergy(0));
0165 decCh1->SetProbability(0.35);
0166 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::NoDisplacement);
0167
0168 decCh2->AddProduct(OH);
0169 decCh2->AddProduct(H);
0170 decCh2->SetProbability(0.65);
0171 decCh2->SetDisplacementType(G4DNAWaterDissociationDisplacer::A1B1_DissociationDecay);
0172
0173
0174 occ->RemoveElectron(4, 1);
0175 occ->AddElectron(5, 1);
0176
0177 water->NewConfigurationWithElectronOccupancy("A^1B_1", *occ);
0178 water->AddDecayChannel("A^1B_1", decCh1);
0179 water->AddDecayChannel("A^1B_1", decCh2);
0180
0181
0182
0183 decCh1 = new G4MolecularDissociationChannel("B^1A_1_Relaxation_Channel");
0184 decCh2 = new G4MolecularDissociationChannel("B^1A_1_DissociativeDecay");
0185 auto decCh3 = new G4MolecularDissociationChannel("B^1A_1_AutoIonisation_Channel");
0186
0187
0188 decCh1->SetEnergy(waterExcitation.ExcitationEnergy(1));
0189 decCh1->SetProbability(0.3);
0190
0191
0192 decCh2->AddProduct(H2);
0193 decCh2->AddProduct(OH);
0194 decCh2->AddProduct(OH);
0195 decCh2->SetProbability(0.15);
0196 decCh2->SetDisplacementType(G4DNAWaterDissociationDisplacer::B1A1_DissociationDecay);
0197
0198
0199 decCh3->AddProduct(OH);
0200 decCh3->AddProduct(H3O);
0201 decCh3->AddProduct(e_aq);
0202 decCh3->SetProbability(0.55);
0203 decCh3->SetDisplacementType(G4DNAWaterDissociationDisplacer::AutoIonisation);
0204
0205 *occ = *(water->GetGroundStateElectronOccupancy());
0206 occ->RemoveElectron(3);
0207 occ->AddElectron(5, 1);
0208
0209 water->NewConfigurationWithElectronOccupancy("B^1A_1", *occ);
0210 water->AddDecayChannel("B^1A_1", decCh1);
0211 water->AddDecayChannel("B^1A_1", decCh2);
0212 water->AddDecayChannel("B^1A_1", decCh3);
0213
0214
0215
0216 decCh1 = new G4MolecularDissociationChannel("Excitation3rdLayer_AutoIonisation_Channel");
0217 decCh2 = new G4MolecularDissociationChannel("Excitation3rdLayer_Relaxation_Channel");
0218
0219
0220 decCh1->AddProduct(OH);
0221 decCh1->AddProduct(H3O);
0222 decCh1->AddProduct(e_aq);
0223
0224 decCh1->SetProbability(0.5);
0225 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::AutoIonisation);
0226
0227
0228 decCh2->SetEnergy(waterExcitation.ExcitationEnergy(2));
0229 decCh2->SetProbability(0.5);
0230
0231
0232 *occ = *(water->GetGroundStateElectronOccupancy());
0233 occ->RemoveElectron(2, 1);
0234 occ->AddElectron(5, 1);
0235
0236
0237 water->NewConfigurationWithElectronOccupancy("Excitation3rdLayer", *occ);
0238 water->AddDecayChannel("Excitation3rdLayer", decCh1);
0239 water->AddDecayChannel("Excitation3rdLayer", decCh2);
0240
0241
0242
0243 decCh1 = new G4MolecularDissociationChannel("Excitation2ndLayer_AutoIonisation_Channel");
0244 decCh2 = new G4MolecularDissociationChannel("Excitation2ndLayer_Relaxation_Channel");
0245
0246
0247 decCh1->AddProduct(OH);
0248 decCh1->AddProduct(H3O);
0249 decCh1->AddProduct(e_aq);
0250
0251 decCh1->SetProbability(0.5);
0252 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::AutoIonisation);
0253
0254
0255 decCh2->SetEnergy(waterExcitation.ExcitationEnergy(3));
0256 decCh2->SetProbability(0.5);
0257
0258 *occ = *(water->GetGroundStateElectronOccupancy());
0259 occ->RemoveElectron(1, 1);
0260 occ->AddElectron(5, 1);
0261
0262 water->NewConfigurationWithElectronOccupancy("Excitation2ndLayer", *occ);
0263 water->AddDecayChannel("Excitation2ndLayer", decCh1);
0264 water->AddDecayChannel("Excitation2ndLayer", decCh2);
0265
0266
0267
0268 decCh1 = new G4MolecularDissociationChannel("Excitation1stLayer_AutoIonisation_Channel");
0269 decCh2 = new G4MolecularDissociationChannel("Excitation1stLayer_Relaxation_Channel");
0270
0271 *occ = *(water->GetGroundStateElectronOccupancy());
0272 occ->RemoveElectron(0, 1);
0273 occ->AddElectron(5, 1);
0274
0275
0276 decCh1->AddProduct(OH);
0277 decCh1->AddProduct(H3O);
0278 decCh1->AddProduct(e_aq);
0279 decCh1->SetProbability(0.5);
0280 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::AutoIonisation);
0281
0282
0283 decCh2->SetEnergy(waterExcitation.ExcitationEnergy(4));
0284 decCh2->SetProbability(0.5);
0285
0286 water->NewConfigurationWithElectronOccupancy("Excitation1stLayer", *occ);
0287 water->AddDecayChannel("Excitation1stLayer", decCh1);
0288 water->AddDecayChannel("Excitation1stLayer", decCh2);
0289
0290
0291
0292
0293
0294
0295
0296 decCh1 = new G4MolecularDissociationChannel("Ionisation_Channel");
0297
0298
0299 decCh1->AddProduct(H3O);
0300 decCh1->AddProduct(OH);
0301 decCh1->SetProbability(1);
0302 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::Ionisation_DissociationDecay);
0303
0304 *occ = *(water->GetGroundStateElectronOccupancy());
0305 occ->RemoveElectron(4, 1);
0306
0307 water->NewConfigurationWithElectronOccupancy("Ionisation5", *occ);
0308 water->AddDecayChannel("Ionisation5", decCh1);
0309
0310 *occ = *(water->GetGroundStateElectronOccupancy());
0311 occ->RemoveElectron(3, 1);
0312 water->NewConfigurationWithElectronOccupancy("Ionisation4", *occ);
0313 water->AddDecayChannel("Ionisation4", new G4MolecularDissociationChannel(*decCh1));
0314
0315 *occ = *(water->GetGroundStateElectronOccupancy());
0316 occ->RemoveElectron(2, 1);
0317 water->NewConfigurationWithElectronOccupancy("Ionisation3", *occ);
0318 water->AddDecayChannel("Ionisation3", new G4MolecularDissociationChannel(*decCh1));
0319
0320 *occ = *(water->GetGroundStateElectronOccupancy());
0321 occ->RemoveElectron(1, 1);
0322 water->NewConfigurationWithElectronOccupancy("Ionisation2", *occ);
0323 water->AddDecayChannel("Ionisation2", new G4MolecularDissociationChannel(*decCh1));
0324
0325 *occ = *(water->GetGroundStateElectronOccupancy());
0326 occ->RemoveElectron(0, 1);
0327 water->NewConfigurationWithElectronOccupancy("Ionisation1", *occ);
0328 water->AddDecayChannel("Ionisation1", new G4MolecularDissociationChannel(*decCh1));
0329
0330
0331
0332
0333 decCh1 = new G4MolecularDissociationChannel("DissociativeAttachment");
0334
0335
0336 decCh1->AddProduct(H2);
0337 decCh1->AddProduct(OHm);
0338 decCh1->AddProduct(OH);
0339 decCh1->SetProbability(1);
0340 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::DissociativeAttachment);
0341
0342 *occ = *(water->GetGroundStateElectronOccupancy());
0343 occ->AddElectron(5, 1);
0344 water->NewConfigurationWithElectronOccupancy("DissociativeAttachment", *occ);
0345 water->AddDecayChannel("DissociativeAttachment", decCh1);
0346
0347
0348
0349
0350 decCh1 = new G4MolecularDissociationChannel("H2Ovib_DissociationDecay1");
0351 decCh2 = new G4MolecularDissociationChannel("H2Ovib_DissociationDecay2");
0352 decCh3 = new G4MolecularDissociationChannel("H2Ovib_DissociationDecay3");
0353
0354
0355 decCh1->AddProduct(H2);
0356 decCh1->AddProduct(OH);
0357 decCh1->AddProduct(OH);
0358 decCh1->SetProbability(0.15);
0359 decCh1->SetDisplacementType(G4DNAWaterDissociationDisplacer::B1A1_DissociationDecay);
0360
0361
0362 decCh2->AddProduct(OH);
0363 decCh2->AddProduct(H);
0364 decCh2->SetProbability(0.55);
0365 decCh2->SetDisplacementType(G4DNAWaterDissociationDisplacer::A1B1_DissociationDecay);
0366
0367
0368 decCh3->SetProbability(0.30);
0369
0370 const auto pH2Ovib = G4H2O::Definition()->NewConfiguration("H2Ovib");
0371 assert(pH2Ovib != nullptr);
0372
0373 water->AddDecayChannel(pH2Ovib, decCh1);
0374 water->AddDecayChannel(pH2Ovib, decCh2);
0375 water->AddDecayChannel(pH2Ovib, decCh3);
0376
0377 delete occ;
0378 }
0379
0380
0381
0382 void EmDNAChemistry::ConstructReactionTable(G4DNAMolecularReactionTable* theReactionTable)
0383 {
0384
0385 ParserChemReaction parser;
0386 parser.ReadReactionFile(fReactionTableName);
0387
0388 auto ListReactant1 = parser.GetListReactant1();
0389 auto ListReactant2 = parser.GetListReactant2();
0390 auto ListProduct = parser.GetListProduct();
0391 auto ListRate = parser.GetListRate();
0392
0393 const G4int Ntype = 5;
0394 for (size_t i = 0; i < Ntype; i++) {
0395 for (size_t j = 0; j < ListReactant1[i].size(); j++) {
0396 G4MolecularConfiguration* Reactant1 =
0397 G4MoleculeTable::Instance()->GetConfiguration(ListReactant1[i][j]);
0398 G4MolecularConfiguration* Reactant2 =
0399 G4MoleculeTable::Instance()->GetConfiguration(ListReactant2[i][j]);
0400
0401 auto pReactionData = new G4DNAMolecularReactionData(ListRate[i][j], Reactant1, Reactant2);
0402
0403 for (size_t k = 0; k < ListProduct[i][j].size(); k++) {
0404 G4MolecularConfiguration* Product =
0405 G4MoleculeTable::Instance()->GetConfiguration(ListProduct[i][j][k]);
0406 pReactionData->AddProduct(Product);
0407 }
0408
0409 if (i == 1 || i == 3) {
0410 pReactionData->SetReactionType(1);
0411 }
0412
0413 theReactionTable->SetReaction(pReactionData);
0414 }
0415 }
0416 }
0417
0418
0419
0420 void EmDNAChemistry::ConstructProcess()
0421 {
0422 auto ph = G4PhysicsListHelper::GetPhysicsListHelper();
0423 G4VProcess* process =
0424 G4ProcessTable::GetProcessTable()->FindProcess("e-_G4DNAVibExcitation", "e-");
0425 if (process) {
0426 auto vibExcitation = (G4DNAVibExcitation*)process;
0427 G4VEmModel* model = vibExcitation->EmModel();
0428 auto sancheExcitationMod = dynamic_cast<G4DNASancheExcitationModel*>(model);
0429 if (sancheExcitationMod) {
0430 sancheExcitationMod->ExtendLowEnergyLimit(0.025 * eV);
0431 }
0432 }
0433 process = G4ProcessTable::GetProcessTable()->FindProcess("e-_G4DNAElectronSolvation", "e-");
0434
0435 if (process == nullptr) {
0436 ph->RegisterProcess(new G4DNAElectronSolvation("e-_G4DNAElectronSolvation"),
0437 G4Electron::Definition());
0438 }
0439 auto* theMoleculeTable = G4MoleculeTable::Instance();
0440 G4MoleculeDefinitionIterator iterator = theMoleculeTable->GetDefintionIterator();
0441 iterator.reset();
0442 while (iterator()) {
0443 G4MoleculeDefinition* moleculeDef = iterator.value();
0444 if (moleculeDef == G4H2O::Definition()) {
0445 moleculeDef->GetProcessManager()->AddRestProcess(new G4DNAElectronHoleRecombination(), 2);
0446
0447 auto dissociationProcess = new G4DNAMolecularDissociation("H2O_DNAMolecularDecay");
0448 dissociationProcess->SetDisplacer(moleculeDef, new G4DNAWaterDissociationDisplacer);
0449
0450 moleculeDef->GetProcessManager()->AddRestProcess(dissociationProcess, 1);
0451 }
0452 }
0453 G4DNAChemistryManager::Instance()->Initialize();
0454 }
0455
0456
0457
0458 void EmDNAChemistry::ConstructTimeStepModel(G4DNAMolecularReactionTable*
0459 )
0460 {
0461 auto irt = new G4DNAMolecularIRTModel();
0462 RegisterTimeStepModel(irt, 0);
0463 }
0464
0465
0466
0467 }