Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-05 07:50:31

0001 //
0002 // ********************************************************************
0003 // * License and Disclaimer                                           *
0004 // *                                                                  *
0005 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
0006 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
0007 // * conditions of the Geant4 Software License,  included in the file *
0008 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
0009 // * include a list of copyright holders.                             *
0010 // *                                                                  *
0011 // * Neither the authors of this software system, nor their employing *
0012 // * institutes,nor the agencies providing financial support for this *
0013 // * work  make  any representation or  warranty, express or implied, *
0014 // * regarding  this  software system or assume any liability for its *
0015 // * use.  Please see the license in the file  LICENSE  and URL above *
0016 // * for the full disclaimer and the limitation of liability.         *
0017 // *                                                                  *
0018 // * This  code  implementation is the result of  the  scientific and *
0019 // * technical work of the GEANT4 collaboration.                      *
0020 // * By using,  copying,  modifying or  distributing the software (or *
0021 // * any work based  on the software)  you  agree  to acknowledge its *
0022 // * use  in  resulting  scientific  publications,  and indicate your *
0023 // * acceptance of all terms of the Geant4 Software license.          *
0024 // ********************************************************************
0025 //
0026 /// \file EmDNAChemistry.cc
0027 /// \brief Implementation of the EmDNAChemistry class
0028 
0029 #include "EmDNAChemistry.hh"
0030 
0031 #include "DetectorConstruction.hh"
0032 
0033 #include "G4DNAChemistryManager.hh"
0034 #include "G4DNAWaterDissociationDisplacer.hh"
0035 #include "G4ProcessManager.hh"
0036 #include "G4RunManager.hh"
0037 #include "G4SystemOfUnits.hh"
0038 
0039 // *** Processes and models for Geant4-DNA
0040 
0041 #include "BoundedBrownianAction.hh"
0042 
0043 #include "G4ChemReboundTransportation.hh"
0044 #include "G4DNAElectronHoleRecombination.hh"
0045 #include "G4DNAElectronSolvation.hh"
0046 #include "G4DNAMolecularDissociation.hh"
0047 #include "G4DNAMolecularReactionTable.hh"
0048 #include "G4DNAMolecularStepByStepModel.hh"
0049 #include "G4DNASancheExcitationModel.hh"
0050 #include "G4DNASmoluchowskiReactionModel.hh"
0051 #include "G4DNAVibExcitation.hh"
0052 // particles
0053 
0054 #include "G4Electron.hh"
0055 #include "G4Electron_aq.hh"
0056 #include "G4H2O.hh"
0057 #include "G4H2O2.hh"
0058 #include "G4H3O.hh"
0059 #include "G4HO2.hh"
0060 #include "G4Hydrogen.hh"
0061 #include "G4MoleculeTable.hh"
0062 #include "G4O2.hh"
0063 #include "G4O3.hh"
0064 #include "G4OH.hh"
0065 #include "G4Oxygen.hh"
0066 #include "G4PhysicsListHelper.hh"
0067 /****/
0068 #include "G4DNAMoleculeEncounterStepper.hh"
0069 #include "G4DNAScavengerProcess.hh"
0070 #include "G4MolecularConfiguration.hh"
0071 #include "G4ProcessTable.hh"
0072 #include "G4VChemistryWorld.hh"
0073 /****/
0074 #include "G4ChemicalMoleculeFinder.hh"
0075 // factory
0076 #include "ChemNO2_NO3ScavengerBuilder.hh"
0077 #include "ChemOxygenWaterBuilder.hh"
0078 #include "ChemPureWaterBuilder.hh"
0079 
0080 #include "G4ChemDissociationChannels_option1.hh"
0081 #include "G4DNAIndependentReactionTimeModel.hh"
0082 #include "G4GenericMessenger.hh"
0083 #include "G4PhysicsConstructorFactory.hh"
0084 G4_DECLARE_PHYSCONSTR_FACTORY(EmDNAChemistry);
0085 
0086 EmDNAChemistry::EmDNAChemistry() : G4VUserChemistryList(true)
0087 {
0088   G4DNAChemistryManager::Instance()->SetChemistryList(this);
0089   //  DefineCommands(); // Le Tuan Anh: create cmds
0090 }
0091 
0092 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0093 
0094 EmDNAChemistry::~EmDNAChemistry() = default;
0095 
0096 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0097 
0098 void EmDNAChemistry::ConstructMolecule()
0099 {
0100   G4ChemDissociationChannels_option1::ConstructMolecule();
0101   auto table = G4MoleculeTable::Instance();
0102 
0103   auto H3OpB = table->GetConfiguration("H3Op(B)");
0104   H3OpB->SetDiffusionCoefficient(9.46e-9 * (m2 / s));
0105 
0106   auto OHm = table->GetConfiguration("OHm(B)");
0107   OHm->SetDiffusionCoefficient(5.3e-9 * (m2 / s));
0108   table->CreateConfiguration("H2O", G4H2O::Definition());
0109 
0110   auto G4NO2 = new G4MoleculeDefinition("NO_2", /*mass*/ 30,
0111                                   /*D*/ 5.3e-9 * (m * m / s),
0112                                   /*charge*/ 0,
0113                                   /*electronL*/ 0,
0114                                   /*radius*/ 0.17 * nm);  // should be corrected
0115 
0116   auto G4NO3 = new G4MoleculeDefinition("NO_3", /*mass*/ 38,
0117                                   /*D*/ 0 * (m * m / s),
0118                                   /*charge*/ 0,
0119                                   /*electronL*/ 0,
0120                                   /*radius*/ 0.17 * nm);  // should be corrected
0121 
0122   table->CreateConfiguration("NO2", G4NO2);
0123   table->CreateConfiguration("NO2m", G4NO2,
0124                              -1,  // charge
0125                              1.9e-9 * (m2 / s));
0126   table->CreateConfiguration("NO2mm", G4NO2,
0127                              -2,  // charge
0128                              1.9e-9 * (m2 / s));
0129 
0130   table->CreateConfiguration("NO3m", G4NO3,
0131                              -1,  // charge
0132                              1.9e-9 * (m2 / s));
0133 
0134   table->CreateConfiguration("NO3mm", G4NO3,
0135                              -2,  // charge
0136                              1.9e-9 * (m2 / s));
0137 
0138   // FrickeDosimeter
0139   auto G4Fe = new G4MoleculeDefinition("Fe",
0140                                  /*mass*/ 55.84 * g / Avogadro * c_squared,
0141                                  /*D*/ 0 * (m * m / s),
0142                                  /*charge*/ 0,
0143                                  /*electronL*/ 0,
0144                                  /*radius*/ 0.35 * nm);  // can be adjusted
0145 
0146   table->CreateConfiguration("Fe0", G4Fe);
0147 
0148   table->CreateConfiguration("Feppp", G4Fe,
0149                              3,  // charge
0150                              4.86e-10 * (m2 / s));  // Michael Spiro* and Andrew M. Creeth
0151 
0152   table->CreateConfiguration("Fepp", G4Fe,
0153                              2,  // charge
0154                              5.78e-10 * (m2 / s));
0155   // HSO4-
0156   auto G4HSO4 = new G4MoleculeDefinition("HSO4",
0157                                    /*mass*/ 55.84 * g / Avogadro * c_squared,
0158                                    /*D*/ 0 * (m * m / s),
0159                                    /*charge*/ 0,
0160                                    /*electronL*/ 0,
0161                                    /*radius*/ 0.35 * nm);  // can be adjusted
0162   table->CreateConfiguration("HSO4m", G4HSO4,
0163                              -1,  // charge
0164                              0 * (m2 / s));
0165 
0166   // SO4-
0167   auto G4SO4 = new G4MoleculeDefinition("SO4",
0168                                   /*mass*/ 55.84 * g / Avogadro * c_squared,
0169                                   /*D*/ 0 * (m * m / s),
0170                                   /*charge*/ 0,
0171                                   /*electronL*/ 0,
0172                                   /*radius*/ 0.35 * nm);  // can be adjusted
0173   table->CreateConfiguration("SO4m", G4SO4,
0174                              -1,  // charge
0175                              0 * (m2 / s));
0176 
0177   // CO2
0178   auto G4CO2 = new G4MoleculeDefinition("CO_2",
0179                                   /*mass*/ 44.01 * g / Avogadro * c_squared,
0180                                   /*D*/ 1.88e-9 * (m * m / s),
0181                                   /*charge*/ 0,
0182                                   /*electronL*/ 0,
0183                                   /*radius*/ 0.35 * nm);  // can be adjusted
0184   table->CreateConfiguration("CO2", G4CO2,
0185                              0,  // charge
0186                              1.88e-9 * (m2 / s));
0187 
0188   table->CreateConfiguration("CO2m", G4CO2,
0189                              -1,  // charge
0190                              1.88e-9 * (m2 / s));
0191 
0192   // HCO3-
0193   auto G4HCO3 = new G4MoleculeDefinition("HCO_3",
0194                                    /*mass*/ 61.01 * g / Avogadro * c_squared,
0195                                    /*D*/ 1.88e-9 * (m * m / s),
0196                                    /*charge*/ 0,
0197                                    /*electronL*/ 0,
0198                                    /*radius*/ 0.35 * nm);  // can be adjusted
0199 
0200   table->CreateConfiguration("HCO3", G4HCO3,
0201                              0,  // charge
0202                              1.88e-9 * (m2 / s));
0203   table->CreateConfiguration("HCO3m", G4HCO3,
0204                              -1,  // charge
0205                              1.88e-9 * (m2 / s));
0206 
0207   // CO3-
0208   auto G4CO3 = new G4MoleculeDefinition("CO_3",
0209                                   /*mass*/ 61.01 * g / Avogadro * c_squared,
0210                                   /*D*/ 0.8e-9 * (m * m / s),
0211                                   /*charge*/ 0,
0212                                   /*electronL*/ 0,
0213                                   /*radius*/ 0.35 * nm);  // can be adjusted
0214   table->CreateConfiguration("CO3m", G4CO3,
0215                              -1,  // charge
0216                              0.8e-9 * (m2 / s));
0217 
0218   table->CreateConfiguration("CO3mm", G4CO3,
0219                              -2,  // charge
0220                              0.8e-9 * (m2 / s));
0221 
0222   // G4N2O
0223   auto G4N2O = new G4MoleculeDefinition("N_2O",
0224                                   /*mass*/ 61.01 * g / Avogadro * c_squared,
0225                                   /*D*/ 0.8e-9 * (m * m / s),  // not corrected
0226                                   /*charge*/ 0,
0227                                   /*electronL*/ 0,
0228                                   /*radius*/ 0.35 * nm);  // can be adjusted
0229   table->CreateConfiguration("N2O", G4N2O,
0230                              0,  // charge
0231                              0.8e-9 * (m2 / s));  // not corrected
0232 
0233   // MeOH
0234   auto G4MeOH = new G4MoleculeDefinition("MeOH",
0235                                    /*mass*/ 61.01 * g / Avogadro * c_squared,
0236                                    /*D*/ 1e-10 * (m * m / s),  // not corrected
0237                                    /*charge*/ 0,
0238                                    /*electronL*/ 0,
0239                                    /*radius*/ 0.35 * nm);  // can be adjusted
0240   table->CreateConfiguration("CH3OH", G4MeOH,
0241                              0,  // charge
0242                              1e-10 * (m2 / s));  // n
0243   table->CreateConfiguration("CH2OH", G4MeOH,
0244                              0,  // charge
0245                              1e-10 * (m2 / s));  // n
0246   // CH2OH
0247 }
0248 
0249 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0250 
0251 void EmDNAChemistry::ConstructDissociationChannels()
0252 {
0253   G4ChemDissociationChannels_option1::ConstructDissociationChannels();
0254 }
0255 
0256 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0257 
0258 void EmDNAChemistry::
0259 ConstructReactionTable(G4DNAMolecularReactionTable* pReactionTable)
0260 {
0261   ChemOxygenWaterBuilder::OxygenScavengerReaction(pReactionTable);
0262   ChemOxygenWaterBuilder::CO2ScavengerReaction(pReactionTable);
0263   ChemOxygenWaterBuilder::SecondOrderReactionExtended(pReactionTable);
0264   ChemPureWaterBuilder::WaterScavengerReaction(pReactionTable);
0265   ChemNO2_NO3ScavengerBuilder::NO2_NO3ScavengerReaction(pReactionTable);
0266 }
0267 
0268 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0269 
0270 void EmDNAChemistry::ConstructProcess()
0271 {
0272   auto table = G4MoleculeTable::Instance();
0273   auto O2 = table->GetConfiguration("O2");
0274   auto O2m = table->GetConfiguration("O2m");
0275   auto HO2 = table->GetConfiguration("HO2°");
0276 
0277   auto e_aq = table->GetConfiguration("e_aq");
0278   auto OH = table->GetConfiguration("°OH");
0279   auto OHm = table->GetConfiguration("OHm");
0280 
0281   auto NO2 = table->GetConfiguration("NO2");
0282   auto NO2m = table->GetConfiguration("NO2m");
0283   auto NO2mm = table->GetConfiguration("NO2mm");
0284   auto NO3m = table->GetConfiguration("NO3m");
0285   auto NO3mm = table->GetConfiguration("NO3mm");
0286 
0287   auto HCO3m = table->GetConfiguration("HCO3m");
0288   auto* CO2 = table->GetConfiguration("CO2");
0289   auto* CO2m = table->GetConfiguration("CO2m");
0290   auto H2O2 = table->GetConfiguration("H2O2");
0291   auto H = table->GetConfiguration("H");
0292   auto* HCO3 = table->GetConfiguration("HCO3");
0293   auto* H3OpB = table->GetConfiguration("H3Op(B)");
0294   auto* OHmB = table->GetConfiguration("OHm(B)");
0295   auto* HO2m = table->GetConfiguration("HO2m");
0296   auto* Om = table->GetConfiguration("Om");
0297   auto* O3m = table->GetConfiguration("O3m");
0298   auto* H3Op = table->GetConfiguration("H3Op");
0299   auto H2O = table->GetConfiguration("H2O");
0300   auto* N2O = table->GetConfiguration("N2O");
0301   auto* MeOH = table->GetConfiguration("CH3OH");
0302   auto* CH2OH = table->GetConfiguration("CH2OH");
0303   //auto* CO3m = table->GetConfiguration("CO3m");
0304 
0305   const auto* fpDetector = dynamic_cast<const DetectorConstruction*>(
0306     G4RunManager::GetRunManager()->GetUserDetectorConstruction());
0307   auto fpChemistryWorld = fpDetector->GetChemistryWorld();
0308   fpChemistryWorld->ConstructChemistryComponents();
0309   auto confinedBox = fpChemistryWorld->GetChemistryBoundary();
0310 
0311   auto* ph = G4PhysicsListHelper::GetPhysicsListHelper();
0312 
0313   //===============================================================
0314   // Extend vibrational to low energy
0315   // Anyway, solvation of electrons is taken into account from 7.4 eV
0316   // So below this threshold, for now, no accurate modeling is done
0317   //
0318   G4VProcess* process =
0319     G4ProcessTable::GetProcessTable()->FindProcess("e-_G4DNAVibExcitation", "e-");
0320 
0321   if (process) {
0322     auto vibExcitation = (G4DNAVibExcitation*)process;
0323     G4VEmModel* model = vibExcitation->EmModel();
0324     auto sancheExcitationMod = dynamic_cast<G4DNASancheExcitationModel*>(model);
0325     if (sancheExcitationMod) {
0326       sancheExcitationMod->ExtendLowEnergyLimit(0.025 * eV);
0327     }
0328   }
0329 
0330   //===============================================================
0331   // *** Electron Solvatation ***
0332   //
0333   process = G4ProcessTable::GetProcessTable()
0334             ->FindProcess("e-_G4DNAElectronSolvation", "e-");
0335 
0336   if (process == nullptr) {
0337     ph->RegisterProcess(new G4DNAElectronSolvation("e-_G4DNAElectronSolvation"),
0338                         G4Electron::Definition());
0339   }
0340 
0341   //===============================================================
0342   // Define processes for molecules
0343   //
0344   auto* theMoleculeTable = G4MoleculeTable::Instance();
0345   auto iterator = theMoleculeTable->GetDefintionIterator();
0346   iterator.reset();
0347 
0348   while (iterator()) {
0349     auto* moleculeDef = iterator.value();
0350 
0351     if (moleculeDef != G4H2O::Definition()) {
0352       auto brown = new G4ChemReboundTransportation("ReboundTransport");
0353       brown->SetBoundary(confinedBox);
0354       ph->RegisterProcess(brown, moleculeDef);
0355     }
0356     else {
0357       moleculeDef->GetProcessManager()
0358                  ->AddRestProcess(new G4DNAElectronHoleRecombination(), 2);
0359       auto brownTransport = new BoundedBrownianAction();
0360       brownTransport->SetBoundary(*confinedBox);
0361       auto dissociationProcess =
0362         new G4DNAMolecularDissociation("H2O_DNAMolecularDecay", fDecay);
0363       dissociationProcess->SetUserBrownianAction(brownTransport);
0364       dissociationProcess->SetDisplacer(moleculeDef,
0365                                         new G4DNAWaterDissociationDisplacer);
0366       // dissociationProcess->SetVerbose(1);
0367       moleculeDef->GetProcessManager()->AddRestProcess(dissociationProcess, 1);
0368     }
0369 
0370     if (moleculeDef == G4Hydrogen::Definition()) {
0371       // O2
0372       auto scanvergerProcess =
0373         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0374       //------------------------------------------------------------------
0375       // H + O2(B) -> HO2
0376       auto reactionData =
0377         new G4DNAMolecularReactionData(2.1e10 * (1e-3 * m3 / (mole * s)), H, O2);
0378       reactionData->AddProduct(HO2);
0379       scanvergerProcess->SetReaction(H, reactionData);
0380       //------------------------------------------------------------------
0381       // H + OH-(B) -> H2O + eaq- 2.49e3 / s
0382       reactionData =
0383         new G4DNAMolecularReactionData(2.49e7 * (1e-3 * m3 / (mole * s)), H,
0384                                        OHmB);  // 2.51e7 (H + OH-)* 1e-7 (pH) = 2.48e0
0385       reactionData->AddProduct(e_aq);
0386       scanvergerProcess->SetReaction(H, reactionData);
0387       //------------------------------------------------------------------
0388       // H + H2O -> eaq- + H3O+ 5.94 / s pkA = 9.5515  //2
0389       reactionData =
0390         new G4DNAMolecularReactionData(6.32 / s, H, H2O);  // 6.32e0 *
0391       reactionData->AddProduct(e_aq);
0392       reactionData->AddProduct(H3OpB);
0393       scanvergerProcess->SetReaction(H, reactionData);
0394       // H2O2
0395       //------------------------------------------------------------------
0396       // H + H202 -> OH + H20
0397       reactionData =
0398         new G4DNAMolecularReactionData(9.0e7 * (1e-3 * m3 / (mole * s)), H, H2O2);
0399       reactionData->AddProduct(OH);
0400       scanvergerProcess->SetReaction(H, reactionData);
0401 
0402       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0403     }
0404     if (moleculeDef == G4Electron_aq::Definition()) {
0405       auto scanvergerProcess =
0406         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0407       G4DNAMolecularReactionData* reactionData = nullptr;
0408       //------------------------------------------------------------------
0409       // e_aq + O2(B) -> O2-
0410       reactionData =
0411         new G4DNAMolecularReactionData(1.74e10 * (1e-3 * m3 / (mole * s)), e_aq, O2);
0412       reactionData->AddProduct(O2m);
0413       scanvergerProcess->SetReaction(e_aq, reactionData);
0414       //------------------------------------------------------------------
0415       // eaq- + H3O+(B) -> H + H2O 2.09e3 / s  //2
0416       reactionData =
0417         new G4DNAMolecularReactionData(2.11e10 * (1e-3 * m3 / (mole * s)), e_aq,
0418                       H3OpB);  // 2.11e10 (e_aq + H3O+) * 1.0e-7 (Ph=7) = 2.09e3
0419       reactionData->AddProduct(H);
0420       scanvergerProcess->SetReaction(e_aq, reactionData);
0421       //------------------------------------------------------------------
0422       // e_aq + NO2- -> NO2--
0423       reactionData =
0424         new G4DNAMolecularReactionData(3.5e9 * (1e-3 * m3 / (mole * s)), e_aq, NO2m);
0425       reactionData->AddProduct(NO2mm);
0426       scanvergerProcess->SetReaction(e_aq, reactionData);
0427       //------------------------------------------------------------------
0428       // e_aq + NO3- -> NO3--
0429       reactionData =
0430         new G4DNAMolecularReactionData(9.7e9 * (1e-3 * m3 / (mole * s)), e_aq, NO3m);
0431       reactionData->AddProduct(NO3mm);
0432       scanvergerProcess->SetReaction(e_aq, reactionData);
0433       //------------------------------------------------------------------
0434       // eaq- + H2O -> H + OH- 15.7 / M * s pKa = ???  //3
0435       reactionData =
0436         new G4DNAMolecularReactionData(1.57e1 * 55.3 / s, e_aq, H2O);
0437       reactionData->AddProduct(H);
0438       reactionData->AddProduct(OHmB);
0439       scanvergerProcess->SetReaction(e_aq, reactionData);
0440 
0441       //------------------------------------------------------------------
0442       // Oxygen concentration
0443       // e_aq + CO2(B) -> CO2- k = 0.77 × 1010
0444       reactionData =
0445         new G4DNAMolecularReactionData(0.77e10 * (1e-3 * m3 / (mole * s)), e_aq, CO2);
0446       reactionData->AddProduct(CO2m);
0447       scanvergerProcess->SetReaction(e_aq, reactionData);
0448       // scanvergerProcess->SetVerboseLevel(1);
0449 
0450       //------------------------------------------------------------------
0451       reactionData =
0452         new G4DNAMolecularReactionData(0.9e10 * (1e-3 * m3 / (mole * s)), e_aq, N2O);
0453       reactionData->AddProduct(Om);
0454       scanvergerProcess->SetReaction(e_aq, reactionData);
0455 
0456       //------------------------------------------------------------------
0457       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0458     }
0459     if (moleculeDef == G4O2::Definition()) {
0460       auto scanvergerProcess =
0461         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0462       G4DNAMolecularReactionData* reactionData = nullptr;
0463       //------------------------------------------------------------------
0464       // O2- + H3O+(B) -> HO2 + H2O 4.73e3 / s  //1
0465       reactionData =
0466         new G4DNAMolecularReactionData(4.78e10 * (1e-3 * m3 / (mole * s)), O2m,
0467                            H3OpB);  // 4.78e10(O2- + H3O+) * 1e-7(pH7) = 4.73e3
0468       reactionData->AddProduct(HO2);
0469       reactionData->AddProduct(H2O);
0470       reactionData->SetReactionType(6);  // Equilibrium 6
0471       scanvergerProcess->SetReaction(O2m, reactionData);
0472       //------------------------------------------------------------------
0473       // O2- + H2O -> HO2 + OH- 0.15 / s  //4
0474       reactionData = new G4DNAMolecularReactionData(0.15 * 55.3 / s, O2m, H2O);
0475       reactionData->AddProduct(HO2);
0476       reactionData->AddProduct(OHmB);
0477       scanvergerProcess->SetReaction(O2m, reactionData);
0478 
0479       //------------------------------------------------------------------
0480       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0481     }
0482     if (moleculeDef == G4OH::Definition()) {
0483       auto scanvergerProcess =
0484         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0485       // scanvergerProcess->SetVerboseLevel(1);
0486       G4DNAMolecularReactionData* reactionData = nullptr;
0487       //------------------------------------------------------------------
0488       // OH + OH-(B) -> O- + H2O 6.24e2 / s  //6
0489       reactionData =
0490         new G4DNAMolecularReactionData(1.27e10 * (1e-3 * m3 / (mole * s)), OH,
0491                              OHmB);  // 6.30e9 (OH + OH-) * 1e-7 (pH) = 6.24e2
0492       reactionData->AddProduct(Om);
0493       reactionData->AddProduct(H2O);
0494       reactionData->SetReactionType(8);  // Equilibrium 8
0495       scanvergerProcess->SetReaction(OH, reactionData);
0496       //------------------------------------------------------------------
0497       // OH + NO2- -> NO2 + OH-
0498       reactionData =
0499         new G4DNAMolecularReactionData(8e9 * (1e-3 * m3 / (mole * s)), OH, NO2m);
0500       reactionData->AddProduct(NO2);
0501       reactionData->AddProduct(OHm);
0502       scanvergerProcess->SetReaction(OH, reactionData);
0503       //------------------------------------------------------------------
0504       // OH + HCO3m -> NO2 + OH-
0505       reactionData =
0506         new G4DNAMolecularReactionData(8.5e6 * (1e-3 * m3 / (mole * s)), OH, HCO3m);
0507       scanvergerProcess->SetReaction(OH, reactionData);
0508       // scanvergerProcess->SetVerboseLevel(1);
0509       //------------------------------------------------------------------
0510       //  OH -> O- + H3O+(B)  //8
0511       reactionData =
0512         new G4DNAMolecularReactionData(0.060176635 / s, OH, H2O);
0513       reactionData->AddProduct(Om);
0514       reactionData->AddProduct(H3OpB);
0515       scanvergerProcess->SetReaction(OH, reactionData);
0516       //------------------------------------------------------------------
0517       // OH + CO2(B) -> HCO3
0518       reactionData =
0519         new G4DNAMolecularReactionData(1.e7 * (1e-3 * m3 / (mole * s)), OH, CO2);
0520       reactionData->AddProduct(HCO3);
0521       scanvergerProcess->SetReaction(OH, reactionData);
0522       // scanvergerProcess->SetVerboseLevel(1);
0523       //------------------------------------------------------------------
0524       //  OH + CH3OH -> CH2OH + H2O
0525       reactionData =
0526         new G4DNAMolecularReactionData(9.7e8 * (1e-3 * m3 / (mole * s)), OH, MeOH);
0527       reactionData->AddProduct(CH2OH);
0528       scanvergerProcess->SetReaction(OH, reactionData);
0529       // scanvergerProcess->SetVerboseLevel(1);
0530       //------------------------------------------------------------------
0531       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0532     }
0533     if (moleculeDef == G4MoleculeTable::Instance()->GetMoleculeDefinition("OH"))
0534     {
0535       auto scanvergerProcess =
0536         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0537       G4DNAMolecularReactionData* reactionData = nullptr;
0538       //------------------------------------------------------------------
0539       // OH- + H3O+(B) -> 2H2O 1.11e4 / s
0540       reactionData =
0541         new G4DNAMolecularReactionData(1.13e11 * (1e-3 * m3 / (mole * s)), OHm,
0542                          H3OpB);  // 1.13e11 (H3O+ + OH-) * 1e-7 (pH=7) =1.12e4
0543       scanvergerProcess->SetReaction(OHm, reactionData);
0544       //------------------------------------------------------------------
0545       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0546     }
0547     if (moleculeDef == G4HO2::Definition()) {
0548       auto scanvergerProcess =
0549         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0550       // scanvergerProcess->SetVerboseLevel(1);
0551       G4DNAMolecularReactionData* reactionData = nullptr;
0552       //------------------------------------------------------------------
0553       // HO2 + OH-(B) -> O2- + H2O 6.24e2 / s //4
0554       reactionData =
0555         new G4DNAMolecularReactionData(1.27e10 * (1e-3 * m3 / (mole * s)), HO2,
0556                                 OHmB);  // 6.30e9(HO2 + OH-)*1e-7 (pH) = 6.24e2
0557       reactionData->AddProduct(O2m);
0558       scanvergerProcess->SetReaction(HO2, reactionData);
0559       //------------------------------------------------------------------
0560       // HO2 + H2O -> H3O+ + O2- //1
0561       reactionData = new G4DNAMolecularReactionData(7.58e5 / s, HO2, H2O);
0562       reactionData->AddProduct(H3OpB);
0563       reactionData->AddProduct(O2m);
0564       reactionData->SetReactionType(6);  // Equilibrium 6
0565       scanvergerProcess->SetReaction(HO2, reactionData);
0566       //------------------------------------------------------------------
0567       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0568     }
0569 
0570     if (moleculeDef == G4MoleculeTable::Instance()
0571                      ->GetMoleculeDefinition("HO_2")) /*HO2-*/ {
0572       auto scanvergerProcess =
0573         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0574       // scanvergerProcess->SetVerboseLevel(1);
0575       G4DNAMolecularReactionData* reactionData = nullptr;
0576       //------------------------------------------------------------------
0577       // HO2- + H3O+(B) -> H2O2 + H2O 4.98e3 / s  //7
0578       reactionData =
0579         new G4DNAMolecularReactionData(4.78e10 * (1e-3 * m3 / (mole * s)), HO2m,
0580                           H3OpB);  // 5.00e10 (H3O+ + HO2-) * 1e-7(pH) = 4.95e3
0581       reactionData->AddProduct(H2O2);
0582       scanvergerProcess->SetReaction(HO2m, reactionData);
0583       //------------------------------------------------------------------
0584       // HO2- + H2O -> H2O2 + OH- 1.36e6 / M * s pka = 11.784  //5
0585       reactionData =
0586         new G4DNAMolecularReactionData(1.36e6 * 55.3 / s, HO2m, H2O);  //
0587       reactionData->AddProduct(H2O2);
0588       reactionData->AddProduct(OHmB);
0589       reactionData->SetReactionType(7);  // Equilibrium 7
0590       scanvergerProcess->SetReaction(HO2m, reactionData);
0591       //------------------------------------------------------------------
0592       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0593     }
0594 
0595     if (moleculeDef == G4Oxygen::Definition()) {
0596       auto scanvergerProcess =
0597         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0598       G4DNAMolecularReactionData* reactionData = nullptr;
0599       //------------------------------------------------------------------
0600       // O- + H3O+(B) -> OH + H2O 4.73e3 / s //8
0601       reactionData =
0602         new G4DNAMolecularReactionData(9.56e10 * (1e-3 * m3 / (mole * s)), Om,
0603                           H3OpB);  // 4.78e10 (H3O+ + O2-) * 1e-7(pH) = 4.73e3
0604       reactionData->AddProduct(OH);
0605       scanvergerProcess->SetReaction(Om, reactionData);
0606       //------------------------------------------------------------------
0607       // O- + H2O -> OH + OH- 1.8e6 / s pka = 11.9  //6
0608       reactionData =
0609         new G4DNAMolecularReactionData(1.8e6 * 55.3 / s, Om, H2O);
0610       reactionData->AddProduct(OH);
0611       reactionData->AddProduct(OHmB);
0612       reactionData->SetReactionType(8);  // Equilibrium 8
0613       scanvergerProcess->SetReaction(Om, reactionData);
0614       //------------------------------------------------------------------
0615       // O- + O2(B) -> O3-
0616       reactionData =
0617         new G4DNAMolecularReactionData(3.7e9 * (1e-3 * m3 / (mole * s)), Om, O2);
0618       reactionData->AddProduct(O3m);
0619       scanvergerProcess->SetReaction(Om, reactionData);
0620       //------------------------------------------------------------------
0621       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0622     }
0623     if (moleculeDef == G4O3::Definition()) {
0624       auto scanvergerProcess =
0625         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0626       G4DNAMolecularReactionData* reactionData = nullptr;
0627       //------------------------------------------------------------------
0628       // O3- + H3O+(B) -> OH + O2 + H2O 8.91e3 / s
0629       reactionData =
0630         new G4DNAMolecularReactionData(9.0e10 * (1e-3 * m3 / (mole * s)), O3m,
0631                           H3OpB);  // 9.0e10 (O3- + H3O+) * 1e-7(pH) = 8.91e3
0632       reactionData->AddProduct(OH);
0633       reactionData->AddProduct(O2);
0634       scanvergerProcess->SetReaction(O3m, reactionData);
0635       //------------------------------------------------------------------
0636       // O3- + H2OB -> O- + O2
0637       reactionData = new G4DNAMolecularReactionData(2.66e3 / s, O3m, H2O);
0638       reactionData->AddProduct(Om);
0639       reactionData->AddProduct(O2);
0640       scanvergerProcess->SetReaction(O3m, reactionData);
0641       //------------------------------------------------------------------
0642       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0643     }
0644     if (moleculeDef == G4H3O::Definition()) {
0645       auto scanvergerProcess =
0646         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0647       G4DNAMolecularReactionData* reactionData = nullptr;
0648       //------------------------------------------------------------------
0649       // H3O+ + OH-(B) -> 2H2O 1.11e4 / s
0650       reactionData =
0651         new G4DNAMolecularReactionData(1.13e11 * (1e-3 * m3 / (mole * s)), H3Op,
0652                           OHmB);  // 1.13e11 (H3O+ + OH-) * 1e-7 (pH=7) = 1.12e4
0653       scanvergerProcess->SetReaction(H3Op, reactionData);
0654       //------------------------------------------------------------------
0655       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0656     }
0657     if (moleculeDef == G4H2O2::Definition()) {
0658       auto scanvergerProcess =
0659         new G4DNAScavengerProcess("G4DNAScavengerProcess", *confinedBox);
0660       // scanvergerProcess->SetVerboseLevel(1);
0661       G4DNAMolecularReactionData* reactionData = nullptr;
0662       //------------------------------------------------------------------
0663       // H2O2 + OH-(B) -> HO2- + H2O 4.66e2 / s //5
0664       reactionData =
0665         new G4DNAMolecularReactionData(1.27e10 * (1e-3 * m3 / (mole * s)), H2O2,
0666                             OHmB);  // 4.71e8 (H2O2 + OH-) * 1e-7 (pH) = 4.66e1
0667       reactionData->AddProduct(HO2m);
0668       reactionData->SetReactionType(7);  // Equilibrium 7
0669       scanvergerProcess->SetReaction(H2O2, reactionData);
0670       //------------------------------------------------------------------
0671       // H2O2 + H2O -> H+ + HO2- First order pka = 11.784  //7
0672       reactionData = new G4DNAMolecularReactionData(7.86e-2 / s, H2O2, H2O);
0673       reactionData->AddProduct(HO2m);
0674       reactionData->AddProduct(H3OpB);
0675       scanvergerProcess->SetReaction(H2O2, reactionData);
0676       //------------------------------------------------------------------
0677 
0678       ph->RegisterProcess(scanvergerProcess, moleculeDef);
0679     }
0680   }
0681   G4DNAChemistryManager::Instance()->Initialize();
0682 }
0683 
0684 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
0685 
0686 void EmDNAChemistry::
0687 ConstructTimeStepModel(G4DNAMolecularReactionTable* reactionTable)
0688 {
0689   // Le Tuan Anh: swtich between time-step-models
0690   G4EmParameters* param = G4EmParameters::Instance();
0691   auto model = param->GetTimeStepModel();
0692   if (model == G4ChemTimeStepModel::SBS) {
0693     auto reactionRadiusComputer = new G4DNASmoluchowskiReactionModel();
0694     reactionTable->PrintTable(reactionRadiusComputer);
0695     auto stepByStep = new G4DNAMolecularStepByStepModel();
0696     stepByStep->SetReactionModel(reactionRadiusComputer);
0697     RegisterTimeStepModel(stepByStep, 0);
0698   }
0699   else if (model == G4ChemTimeStepModel::IRT_syn) {
0700     RegisterTimeStepModel(new G4DNAIndependentReactionTimeModel(), 0);
0701   }
0702 }
0703 
0704 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....