File indexing completed on 2025-01-31 09:22:03
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
0029
0030 #include "UserChoosingDNASolvationModel.hh"
0031 #include "G4PhysicalConstants.hh"
0032 #include "G4SystemOfUnits.hh"
0033 #include "G4DNAWaterExcitationStructure.hh"
0034 #include "G4ParticleChangeForGamma.hh"
0035 #include "G4NistManager.hh"
0036 #include "G4DNAChemistryManager.hh"
0037 #include "G4DNAMolecularMaterial.hh"
0038 #include "G4TransportationManager.hh"
0039 #include "G4ITNavigator.hh"
0040 #include "G4Navigator.hh"
0041 #include "G4Electron.hh"
0042 #include "G4EmParameters.hh"
0043
0044
0045
0046 template<typename MODEL>
0047 UserTDNAOneStepThermalizationModel<MODEL>::
0048 UserTDNAOneStepThermalizationModel(const G4ParticleDefinition*,const G4String& nam) :
0049 G4TDNAOneStepThermalizationModel<MODEL>(0,nam)
0050 {
0051 G4cout << "Calling SampleSecondaries() of UserTDNAOneStepThermalizationModel for Solvation process!!! \n";
0052 }
0053
0054
0055
0056 template<typename MODEL>
0057 void UserTDNAOneStepThermalizationModel<MODEL>::
0058 SampleSecondaries(std::vector<G4DynamicParticle*>*,
0059 const G4MaterialCutsCouple*,
0060 const G4DynamicParticle* particle,
0061 G4double tmin,
0062 G4double maxEnergy)
0063 {
0064 G4TDNAOneStepThermalizationModel<MODEL>::SampleSecondaries(0,0,particle,tmin,maxEnergy);
0065
0066 if (G4DNAChemistryManager::IsActivated()) return;
0067 G4double k = particle->GetKineticEnergy();
0068 G4double highE = G4TDNAOneStepThermalizationModel<MODEL>::HighEnergyLimit();
0069 if (k <= highE){
0070 G4ThreeVector displacement(0,0,0);
0071 G4TDNAOneStepThermalizationModel<MODEL>::GetPenetration(k, displacement);
0072
0073 auto _ParticleChangeForGamma=G4TDNAOneStepThermalizationModel<MODEL>::GetParticleChangeForGamma();
0074 const G4Track * theIncomingTrack =_ParticleChangeForGamma->GetCurrentTrack();
0075
0076 G4ThreeVector finalPosition(theIncomingTrack->GetPosition()+displacement);
0077 this->fpNavigator->SetWorldVolume(theIncomingTrack->GetTouchable()->GetVolume(theIncomingTrack->GetTouchable()->GetHistoryDepth()));
0078
0079 G4double displacementMag = displacement.mag();
0080 G4double safety = DBL_MAX;
0081 G4ThreeVector direction = displacement/displacementMag;
0082
0083 G4double mag_displacement = displacement.mag();
0084 G4ThreeVector displacement_direction = displacement/mag_displacement;
0085
0086
0087 this->fpNavigator->ResetHierarchyAndLocate(theIncomingTrack->GetPosition(),
0088 direction,
0089 *((G4TouchableHistory*)
0090 theIncomingTrack->GetTouchable()));
0091 this->fpNavigator->ComputeStep(theIncomingTrack->GetPosition(),
0092 displacement/displacementMag,
0093 displacementMag,
0094 safety);
0095
0096 if(safety <= displacementMag){
0097 finalPosition = theIncomingTrack->GetPosition()+ (displacement/displacementMag)*safety*0.80;
0098 }
0099 G4DNAChemistryManager::Instance()->CreateSolvatedElectron(theIncomingTrack,&finalPosition);
0100 _ParticleChangeForGamma->SetProposedKineticEnergy(25.e-3*eV);
0101 }
0102
0103 }
0104
0105
0106
0107 G4VEmModel* UserChoosingDNASolvationModel::UserCreate(const G4String& penetrationModel)
0108 {
0109 G4String modelNamePrefix("DNAOneStepThermalizationModel_");
0110
0111 if(penetrationModel == "Terrisol1990")
0112 {
0113 return new UserTDNAOneStepThermalizationModel<DNA::Penetration::Terrisol1990>
0114 (G4Electron::Definition(), modelNamePrefix + penetrationModel);
0115 }
0116 else if(penetrationModel == "Meesungnoen2002")
0117 {
0118 return new UserTDNAOneStepThermalizationModel<DNA::Penetration::Meesungnoen2002>
0119 (G4Electron::Definition(), modelNamePrefix + penetrationModel);
0120 }
0121 else if(penetrationModel == "Meesungnoen2002_amorphous")
0122 {
0123 return new UserTDNAOneStepThermalizationModel<DNA::Penetration::Meesungnoen2002_amorphous>
0124 (G4Electron::Definition(), modelNamePrefix + penetrationModel);
0125 }
0126 else if(penetrationModel == "Kreipl2009")
0127 {
0128 return new UserTDNAOneStepThermalizationModel<DNA::Penetration::Kreipl2009>
0129 (G4Electron::Definition(), modelNamePrefix + penetrationModel);
0130 }
0131 else if(penetrationModel == "Ritchie1994")
0132 {
0133 return new UserTDNAOneStepThermalizationModel<DNA::Penetration::Ritchie1994>
0134 (G4Electron::Definition(), modelNamePrefix + penetrationModel);
0135 }
0136 else
0137 {
0138 G4ExceptionDescription description;
0139 description << penetrationModel + " is not a valid model name.";
0140 G4Exception("UserChoosingDNASolvationModel::UserCreate",
0141 "INVALID_ARGUMENT",
0142 FatalErrorInArgument,
0143 description,
0144 "Options are: Terrisol1990, Meesungnoen2002, Ritchie1994.");
0145 }
0146 return nullptr;
0147 }
0148
0149
0150
0151 G4VEmModel* UserChoosingDNASolvationModel::UserGetMacroDefinedModel()
0152 {
0153 auto dnaSubType = G4EmParameters::Instance()->DNAeSolvationSubType();
0154
0155 switch(dnaSubType)
0156 {
0157 case fRitchie1994eSolvation:
0158 return UserCreate("Ritchie1994");
0159 case fTerrisol1990eSolvation:
0160 return UserCreate("Terrisol1990");
0161 case fKreipl2009eSolvation:
0162 return UserCreate("Kreipl2009");
0163 case fMeesungnoensolid2002eSolvation:
0164 return UserCreate("Meesungnoen2002_amorphous");
0165 case fMeesungnoen2002eSolvation:
0166 case fDNAUnknownModel:
0167 return UserCreate("Meesungnoen2002");
0168 default:
0169 G4ExceptionDescription msg;
0170 msg<<"The solvation parameter stored in G4EmParameters is unknown. "
0171 <<"Supported types are: fRitchie1994eSolvation, fTerrisol1990eSolvation, "
0172 <<"fMeesungnoen2002eSolvation.";
0173 G4Exception("UserChoosingDNASolvationModel::UserGetMacroDefinedModel",
0174 "DnaSubType",
0175 FatalErrorInArgument,msg);
0176 }
0177
0178 return nullptr;
0179 }
0180
0181