Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/pii/include/G4hImpactIonisation.hh

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 // G4hImpactIonisation
 29 //
 30 //
 31 // Author: Maria Grazia Pia (MariaGrazia.Pia@ge.infn.it)
 32 //
 33 // 08 Sep 2008 - MGP - Created (initially based on G4hLowEnergyIonisation) 
 34 //                     Added PIXE capabilities
 35 //                     Partial clean-up of the implementation (more needed)
 36 //                     Calculation of MicroscopicCrossSection delegated to specialised class 
 37 //
 38 // ------------------------------------------------------------
 39  
 40 // Class Description:
 41 // Impact Ionisation process of charged hadrons and ions
 42 // Initially based on G4hLowEnergyIonisation, to be subject to redesign
 43 // and further evolution of physics capabilities
 44 //
 45 // The physics model of G4hLowEnergyIonisation is described in 
 46 // CERN-OPEN-99-121 and CERN-OPEN-99-300. 
 47 //
 48 // Documentation available in:
 49 // M.G. Pia et al., PIXE Simulation With Geant4,
 50 // IEEE Trans. Nucl. Sci., vol. 56, no. 6, pp. 3614-3649, Dec. 2009.
 51 
 52 // ------------------------------------------------------------
 53 
 54 #ifndef G4HIMPACTIONISATION
 55 #define G4HIMPACTIONISATION 1
 56 
 57 #include <map>
 58 #include <CLHEP/Units/PhysicalConstants.h>
 59 
 60 #include "globals.hh"
 61 #include "G4hRDEnergyLoss.hh"
 62 #include "G4DataVector.hh"
 63 #include "G4AtomicDeexcitation.hh"
 64 #include "G4PixeCrossSectionHandler.hh"
 65 
 66 class G4VLowEnergyModel;
 67 class G4VParticleChange;
 68 class G4ParticleDefinition;
 69 class G4PhysicsTable;
 70 class G4MaterialCutsCouple;
 71 class G4Track;
 72 class G4Step;
 73 
 74 class G4hImpactIonisation : public G4hRDEnergyLoss
 75 {
 76 public: // With description
 77   
 78   G4hImpactIonisation(const G4String& processName = "hImpactIoni"); 
 79   // The ionisation process for hadrons/ions to be include in the
 80   // UserPhysicsList
 81 
 82   ~G4hImpactIonisation();
 83   // Destructor
 84   
 85   G4bool IsApplicable(const G4ParticleDefinition&);
 86   // True for all charged hadrons/ions
 87     
 88   void BuildPhysicsTable(const G4ParticleDefinition& aParticleType) ;
 89   // Build physics table during initialisation
 90 
 91   G4double GetMeanFreePath(const G4Track& track,
 92          G4double previousStepSize,
 93          enum G4ForceCondition* condition );
 94   // Return MeanFreePath until delta-electron production
 95   
 96   void PrintInfoDefinition() const;
 97   // Print out of the class parameters
 98 
 99   void SetHighEnergyForProtonParametrisation(G4double energy) {protonHighEnergy = energy;} ;
100   // Definition of the boundary proton energy. For higher energies
101   // Bethe-Bloch formula is used, for lower energies a parametrisation
102   // of the energy losses is performed. Default is 2 MeV.
103 
104   void SetLowEnergyForProtonParametrisation(G4double energy) {protonLowEnergy = energy;} ;
105   // Set of the boundary proton energy. For lower energies
106   // the Free Electron Gas model is used for the energy losses.
107   // Default is 1 keV.
108 
109   void SetHighEnergyForAntiProtonParametrisation(G4double energy) {antiprotonHighEnergy = energy;} ;
110   // Set of the boundary antiproton energy. For higher energies
111   // Bethe-Bloch formula is used, for lower energies parametrisation
112   // of the energy losses is performed. Default is 2 MeV.
113 
114   void SetLowEnergyForAntiProtonParametrisation(G4double energy) {antiprotonLowEnergy = energy;} ;
115   // Set of the boundary antiproton energy. For lower energies
116   // the Free Electron Gas model is used for the energy losses. 
117   // Default is 1 keV.
118 
119   G4double GetContinuousStepLimit(const G4Track& track,
120           G4double previousStepSize,
121           G4double currentMinimumStep,
122           G4double& currentSafety); 
123   // Calculation of the step limit due to ionisation losses
124 
125   void SetElectronicStoppingPowerModel(const G4ParticleDefinition* aParticle,
126                                        const G4String& dedxTable);
127   // This method defines the electron ionisation parametrisation method 
128   // via the name of the table. Default is "ICRU_49p".
129 
130   void SetNuclearStoppingPowerModel(const G4String& dedxTable)
131   {theNuclearTable = dedxTable; SetNuclearStoppingOn();};
132   // This method defines the nuclear ionisation parametrisation method 
133   // via the name of the table. Default is "ICRU_49".
134 
135   // ---- MGP ---- The following design of On/Off is nonsense; to be modified
136   // in a following design iteration
137 
138   void SetNuclearStoppingOn() {nStopping = true;};
139   // This method switch on calculation of the nuclear stopping power.
140   
141   void SetNuclearStoppingOff() {nStopping = false;};
142   // This method switch off calculation of the nuclear stopping power.
143 
144   void SetBarkasOn() {theBarkas = true;};
145   // This method switch on calculation of the Barkas and Bloch effects.
146 
147   void SetBarkasOff() {theBarkas = false;};
148   // This method switch off calculation of the Barkas and Bloch effects.
149 
150   void SetPixe(const G4bool /* val */ ) {pixeIsActive = true;};
151   // This method switches atomic relaxation on/off; currently always on
152 
153   G4VParticleChange* AlongStepDoIt(const G4Track& trackData ,
154                                    const G4Step& stepData ) ;
155   // Function to determine total energy deposition on the step
156 
157   G4VParticleChange* PostStepDoIt(const G4Track& track,
158           const G4Step& Step  ) ;
159   // Simulation of delta-ray production.
160 
161   G4double ComputeDEDX(const G4ParticleDefinition* aParticle,
162                        const G4MaterialCutsCouple* couple,
163            G4double kineticEnergy);
164   // This method returns electronic dE/dx for protons or antiproton
165 
166   void SetCutForSecondaryPhotons(G4double cut);
167   // Set threshold energy for fluorescence
168 
169   void SetCutForAugerElectrons(G4double cut);
170   // Set threshold energy for Auger electron production
171 
172   void ActivateAugerElectronProduction(G4bool val);
173   // Set Auger electron production flag on/off
174 
175   // Accessors to configure PIXE
176   void SetPixeCrossSectionK(const G4String& name) { modelK = name; }
177   void SetPixeCrossSectionL(const G4String& name) { modelL = name; }
178   void SetPixeCrossSectionM(const G4String& name) { modelM = name; }
179   void SetPixeProjectileMinEnergy(G4double energy) { eMinPixe = energy; }
180   void SetPixeProjectileMaxEnergy(G4double energy) { eMaxPixe = energy; }
181 
182 protected:
183 
184 private:
185 
186   void InitializeMe();
187   void InitializeParametrisation();
188   void BuildLossTable(const G4ParticleDefinition& aParticleType);
189   // void BuildDataForFluorescence(const G4ParticleDefinition& aParticleType);
190   void BuildLambdaTable(const G4ParticleDefinition& aParticleType);
191   void SetProtonElectronicStoppingPowerModel(const G4String& dedxTable)
192   {protonTable = dedxTable ;};
193   // This method defines the ionisation parametrisation method via its name
194 
195   void SetAntiProtonElectronicStoppingPowerModel(const G4String& dedxTable)
196   {antiprotonTable = dedxTable;};
197 
198   G4double MicroscopicCrossSection(const G4ParticleDefinition& aParticleType,
199            G4double kineticEnergy,
200            G4double atomicNumber,
201            G4double deltaCutInEnergy) const;
202 
203   G4double GetConstraints(const G4DynamicParticle* particle,
204                           const G4MaterialCutsCouple* couple);
205   // Function to determine StepLimit
206 
207   G4double ProtonParametrisedDEDX(const G4MaterialCutsCouple* couple,
208           G4double kineticEnergy) const;
209 
210   G4double AntiProtonParametrisedDEDX(const G4MaterialCutsCouple* couple,
211               G4double kineticEnergy) const;
212 
213   G4double DeltaRaysEnergy(const G4MaterialCutsCouple* couple,
214          G4double kineticEnergy,
215          G4double particleMass) const;
216   // This method returns average energy loss due to delta-rays emission with
217   // energy higher than the cut energy for given material.
218 
219   G4double BarkasTerm(const G4Material* material,
220           G4double kineticEnergy) const;
221   // Function to compute the Barkas term for protons
222 
223   G4double BlochTerm(const G4Material* material,
224          G4double kineticEnergy,
225          G4double cSquare) const;
226   // Function to compute the Bloch term for protons
227 
228   G4double ElectronicLossFluctuation(const G4DynamicParticle* particle,
229                                      const G4MaterialCutsCouple* material,
230              G4double meanLoss,
231              G4double step) const;
232   // Function to sample electronic losses
233 
234   // hide assignment operator
235   G4hImpactIonisation & operator=(const G4hImpactIonisation &right);
236   G4hImpactIonisation(const G4hImpactIonisation&);
237 
238 private:
239   //  private data members ...............................
240   G4VLowEnergyModel* betheBlochModel;
241   G4VLowEnergyModel* protonModel;
242   G4VLowEnergyModel* antiprotonModel;
243   G4VLowEnergyModel* theIonEffChargeModel;
244   G4VLowEnergyModel* theNuclearStoppingModel;
245   G4VLowEnergyModel* theIonChuFluctuationModel;
246   G4VLowEnergyModel* theIonYangFluctuationModel;
247 
248   // std::map<G4int,G4double,std::less<G4int> > totalCrossSectionMap;
249 
250   // name of parametrisation table of electron stopping power
251   G4String protonTable;
252   G4String antiprotonTable;
253   G4String theNuclearTable;
254 
255   // interval of parametrisation of electron stopping power
256   G4double protonLowEnergy;
257   G4double protonHighEnergy;
258   G4double antiprotonLowEnergy;
259   G4double antiprotonHighEnergy;
260 
261   // flag of parametrisation of nucleus stopping power
262   G4bool nStopping;
263   G4bool theBarkas;
264 
265   G4DataVector cutForDelta;
266   G4DataVector cutForGamma;
267   G4double minGammaEnergy;
268   G4double minElectronEnergy;
269   G4PhysicsTable* theMeanFreePathTable;
270 
271   const G4double paramStepLimit; // parameter limits the step at low energy
272 
273   G4double fdEdx;        // computed in GetContraints
274   G4double fRangeNow ;   //
275   G4double charge;       //
276   G4double chargeSquare; //
277   G4double initialMass;  // mass to calculate Lambda tables
278   G4double fBarkas;
279 
280   G4PixeCrossSectionHandler* pixeCrossSectionHandler;
281   G4AtomicDeexcitation atomicDeexcitation;
282   G4String modelK;
283   G4String modelL;
284   G4String modelM;
285   G4double eMinPixe;
286   G4double eMaxPixe;
287  
288   G4bool pixeIsActive;
289 
290 };
291 
292 
293 inline G4double G4hImpactIonisation::GetContinuousStepLimit(const G4Track& track,
294                   G4double,
295                   G4double currentMinimumStep,
296                   G4double&)
297 {
298   G4double step = GetConstraints(track.GetDynamicParticle(),track.GetMaterialCutsCouple()) ;
299 
300   // ---- MGP ---- The following line, taken as is from G4hLowEnergyIonisation,
301   // is meaningless: currentMinimumStep is passed by value,
302   // therefore any local modification to it has no effect
303 
304   if ((step > 0.) && (step < currentMinimumStep)) currentMinimumStep = step ;
305 
306   return step ;
307 }
308 
309 
310 inline G4bool G4hImpactIonisation::IsApplicable(const G4ParticleDefinition& particle)
311 {
312   // ---- MGP ---- Better criterion for applicability to be defined;
313   // now hard-coded particle mass > 0.1 * proton_mass
314 
315   return (particle.GetPDGCharge() != 0.0 && particle.GetPDGMass() > CLHEP::proton_mass_c2*0.1);
316 }
317 
318 #endif
319 
320 
321 
322 
323 
324 
325 
326 
327