Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/dna/models/src/G4DNAMeltonAttachmentModel.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 //
  2 // ********************************************************************
  3 // * License and Disclaimer                                           *
  4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.                             *
 10 // *                                                                  *
 11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                                                  *
 18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // ********************************************************************
 25 //
 26 //
 27 
 28 // Created by Z. Francis
 29 
 30 #include "G4DNAMeltonAttachmentModel.hh"
 31 #include "G4SystemOfUnits.hh"
 32 #include "G4DNAChemistryManager.hh"
 33 #include "G4DNAMolecularMaterial.hh"
 34 
 35 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 36 
 37 using namespace std;
 38 
 39 //#define MELTON_VERBOSE // prevent checking conditions at run time
 40 
 41 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 42 
 43 G4DNAMeltonAttachmentModel::G4DNAMeltonAttachmentModel(const G4ParticleDefinition*,
 44                                                        const G4String& nam) :
 45 G4VEmModel(nam) 
 46 {
 47   fpWaterDensity = nullptr;
 48 
 49   SetLowEnergyLimit(4.*eV);
 50   SetHighEnergyLimit(13.*eV);
 51 
 52   verboseLevel = 0;
 53   // Verbosity scale:
 54   // 0 = nothing
 55   // 1 = warning for energy non-conservation
 56   // 2 = details of energy budget
 57   // 3 = calculation of cross sections, file openings, sampling of atoms
 58   // 4 = entering in methods
 59 
 60 #ifdef MELTON_VERBOSE
 61   if (verboseLevel > 0)
 62   {
 63     G4cout << "Melton Attachment model is constructed "
 64            << G4endl
 65            << "Energy range: "
 66            << LowEnergyLimit() / eV << " eV - "
 67            << HighEnergyLimit() / eV << " eV"
 68            << G4endl;
 69   }
 70 #endif
 71   
 72   fParticleChangeForGamma = nullptr;
 73   fDissociationFlag = true;
 74   fData = nullptr;
 75 
 76   // Selection of stationary mode
 77 
 78   statCode = false;
 79 }
 80 
 81 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 82 
 83 G4DNAMeltonAttachmentModel::~G4DNAMeltonAttachmentModel()
 84 {
 85   delete fData;
 86 }
 87 
 88 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 89 
 90 void G4DNAMeltonAttachmentModel::Initialise(const G4ParticleDefinition* particle,
 91                                             const G4DataVector& /*cuts*/)
 92 {
 93 #ifdef MELTON_VERBOSE
 94   if (verboseLevel > 3)
 95     G4cout
 96       << "Calling G4DNAMeltonAttachmentModel::Initialise()" << G4endl;
 97 #endif
 98 
 99   // Only electron
100   
101   if(particle->GetParticleName() != "e-")
102   {
103     G4Exception("G4DNAMeltonAttachmentModel::Initialise",
104                 "em0002",
105                 FatalException,
106                 "Model not applicable to particle type.");
107   }
108   
109   // Energy limits
110 
111   if (LowEnergyLimit() < 4.*eV)
112   {
113     G4ExceptionDescription errMsg;
114     errMsg << "G4DNAMeltonAttachmentModel: low energy limit increased from " <<
115     LowEnergyLimit()/eV << " eV to " << 4.  << " eV" << G4endl;
116     
117     G4Exception("G4DNAMeltonAttachmentModel::Initialise",
118                 "Melton_LowerEBoundary",
119                 JustWarning,
120                 errMsg);
121     
122     SetLowEnergyLimit(4*eV);
123   }
124 
125   if (HighEnergyLimit() > 13.*eV)
126   {
127     G4ExceptionDescription errMsg;
128     errMsg << "G4DNAMeltonAttachmentModel: high energy limit decreased from " <<
129     HighEnergyLimit()/eV << " eV to " << 13. << " eV" << G4endl;
130     
131     G4Exception("G4DNAMeltonAttachmentModel::Initialise",
132                 "Melton_HigherEBoundary",
133                 JustWarning,
134                 errMsg);
135     
136     SetHighEnergyLimit(13.*eV);
137   }
138 
139   // Reading of data files
140 
141   G4double scaleFactor = 1e-18*cm2;
142 
143   // For total cross section
144   G4String fileElectron("dna/sigma_attachment_e_melton");
145 
146   fData = new G4DNACrossSectionDataSet(new G4LogLogInterpolation(),
147                                         eV, scaleFactor);
148   fData->LoadData(fileElectron);
149 
150 
151 #ifdef MELTON_VERBOSE
152   if( verboseLevel >0)
153   {
154     if (verboseLevel > 2)
155     {
156       G4cout << "Loaded cross section data for Melton Attachment model" << G4endl;
157     }
158     
159     G4cout << "Melton Attachment model is initialized " << G4endl
160     << "Energy range: "
161     << LowEnergyLimit() / eV << " eV - "
162     << HighEnergyLimit() / eV << " eV"
163     << G4endl;
164   }
165 #endif 
166   
167   // Initialize water density pointer
168   fpWaterDensity = G4DNAMolecularMaterial::Instance()->
169       GetNumMolPerVolTableFor(G4Material::GetMaterial("G4_WATER"));
170 
171   if (isInitialised) return;
172 
173   fParticleChangeForGamma = GetParticleChangeForGamma();
174   isInitialised = true;
175 }
176 
177 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
178 
179 G4double
180 G4DNAMeltonAttachmentModel::CrossSectionPerVolume(const G4Material* material,
181                                                 const G4ParticleDefinition*,
182                                                 G4double ekin,
183                                                 G4double,
184                                                 G4double)
185 {
186 #ifdef MELTON_VERBOSE
187   if (verboseLevel > 3)
188     G4cout
189       << "Calling CrossSectionPerVolume() of G4DNAMeltonAttachmentModel"
190       << G4endl;
191 #endif
192 
193   // Calculate total cross section for model
194 
195   G4double sigma = 0.;
196 
197   G4double waterDensity = (*fpWaterDensity)[material->GetIndex()];
198 
199   if (ekin >= LowEnergyLimit() && ekin <= HighEnergyLimit())
200     sigma = fData->FindValue(ekin);
201     
202 #ifdef MELTON_VERBOSE
203   if (verboseLevel > 2)
204   {
205     G4cout << "__________________________________" << G4endl;
206     G4cout << "=== G4DNAMeltonAttachmentModel - XS INFO START" << G4endl;
207     G4cout << "--- Kinetic energy(eV)=" << ekin/eV
208            << " particle : " << particleDefinition->GetParticleName()
209            << G4endl;
210     G4cout << "--- Cross section per water molecule (cm^2)="
211            << sigma/cm/cm << G4endl;
212     G4cout << "--- Cross section per water molecule (cm^-1)="
213            << sigma*waterDensity/(1./cm) << G4endl;
214     G4cout << "--- G4DNAMeltonAttachmentModel - XS INFO END" << G4endl;
215   }
216 #endif
217 
218   return sigma*waterDensity;
219 }
220 
221 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
222 
223 void
224 G4DNAMeltonAttachmentModel::
225 SampleSecondaries(std::vector<G4DynamicParticle*>* /*fvect*/,
226                   const G4MaterialCutsCouple* /*couple*/,
227                   const G4DynamicParticle* aDynamicElectron,
228                   G4double,
229                   G4double)
230 {
231   
232 #ifdef MELTON_VERBOSE
233   if (verboseLevel > 3)
234     G4cout
235     << "Calling SampleSecondaries() of G4DNAMeltonAttachmentModel" << G4endl;
236 #endif
237   
238   // Electron is killed
239   
240   G4double electronEnergy0 = aDynamicElectron->GetKineticEnergy();
241 
242   if (!statCode)     
243   {     
244       fParticleChangeForGamma->SetProposedKineticEnergy(0.);
245       fParticleChangeForGamma->ProposeTrackStatus(fStopAndKill);
246       fParticleChangeForGamma->ProposeLocalEnergyDeposit(electronEnergy0);
247   }
248 
249   else 
250   {
251       fParticleChangeForGamma->SetProposedKineticEnergy(electronEnergy0);
252       fParticleChangeForGamma->ProposeLocalEnergyDeposit(electronEnergy0);
253   }
254   
255   if(fDissociationFlag)
256   {
257     G4DNAChemistryManager::Instance()->
258       CreateWaterMolecule(eDissociativeAttachment,
259                           -1,
260                           fParticleChangeForGamma->GetCurrentTrack());
261   }
262   return;
263 }
264