source: trunk/source/processes/electromagnetic/lowenergy/include/G4IonParametrisedLossTable.hh @ 1196

Last change on this file since 1196 was 966, checked in by garnier, 15 years ago

fichier ajoutes

File size: 11.0 KB
Line 
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// ===========================================================================
29// GEANT4 class header file
30//
31// Class:                G4IonParametrisedLossTable
32// Helper classes:       G4IonLossTableHandle
33//                       G4DummyScalingAlgorithm
34//
35// Author:               Anton Lechner (Anton.Lechner@cern.ch)
36//
37// First implementation: 10. 11. 2008
38//
39// Modifications:
40//
41//
42// Class descriptions:
43//    G4IonParametrisedLossTable: Wrapper class for classes of the material
44//    category, which maintain stopping power vectors for ions. This wrapper
45//    class includes a cache for faster access of stopping powers and builds
46//    stopping power vectors for compounds using Bragg's additivity rule.
47//    G4IonLossTableHandle: A handle class for G4IonParametrisedLossTable
48//    G4DummyScalingAlgorithm: A dummy algorithm to scale energies and
49//    stopping powers (may be replaced with an algorithm, which relies on
50//    dynamic information of the particle: This may be required if stopping
51//    power data is scaled using an effective charge approximation).
52//
53// Comments:
54//
55// ===========================================================================
56
57
58#ifndef G4IONPARAMETRISEDLOSSTABLE_HH
59#define G4IONPARAMETRISEDLOSSTABLE_HH
60
61#include "globals.hh"
62#include "G4hIonEffChargeSquare.hh"
63#include "G4ParticleDefinition.hh"
64#include "G4Material.hh"
65#include "G4LPhysicsFreeVector.hh"
66#include <vector>
67#include <iomanip>
68#include <map>
69#include <list>
70#include <utility>
71
72
73// #########################################################################
74// # Type definitions for a local cache
75// #
76// #########################################################################
77
78   typedef std::pair<const G4ParticleDefinition*, const G4Material*> G4CacheKey;
79
80   typedef struct CacheValue{
81      G4double energyScaling;         // Scaling factor for kinetic energy
82      G4PhysicsVector* dedx;          // dEdx vector for current projectile-
83                                      // material combination
84      G4int dEdxIndex;                // dE/dx vector index
85   } G4CacheValue;
86
87
88// #########################################################################
89// # Class G4IonLossTableHandle: Handle for table wrappers (to enable
90// # vectors of table wrappers)   
91// #########################################################################
92
93class G4IonLossTableHandle {
94 
95 public:
96   G4IonLossTableHandle() { }
97   virtual ~G4IonLossTableHandle() { }
98
99   virtual G4double GetLowerEnergyEdge(
100              const G4ParticleDefinition*,  // Projectile (ion)
101              const G4Material*             // Target material
102             ) = 0;
103   virtual G4double GetUpperEnergyEdge(
104              const G4ParticleDefinition*,  // Projectile (ion) 
105              const G4Material*             // Target material
106             ) = 0; 
107   virtual G4bool IsApplicable(
108              const G4ParticleDefinition*,  // Projectile (ion) 
109              const G4Material*             // Target material
110             ) = 0; 
111   virtual G4bool IsApplicable(
112              const G4ParticleDefinition*,  // Projectile (ion) 
113              const G4Material*,            // Target material
114              G4double                      // Kinetic energy of projectile
115             ) = 0; 
116   virtual G4double GetDEDX(
117              const G4ParticleDefinition*,  // Projectile (ion) 
118              const G4Material*,            // Target material
119              G4double                      // Kinetic energy of projectile
120             ) = 0; 
121   virtual void ClearCache() { }
122};
123
124
125// #########################################################################
126// # Class G4DummyScalingAlgorithm:
127// #########################################################################
128
129class G4DummyScalingAlgorithm {
130
131 public:
132  // No scaling for kinetic energy
133  inline G4double ScalingFactorEnergy(
134            const G4ParticleDefinition*)    // Projectile (ion)
135                { return 1.0; }
136
137  // No scaling for dE/dx
138  inline G4double ScalingFactorDEDX(
139            const G4ParticleDefinition*,    // Projectile (ion)
140            const G4Material*,              // Target material
141            G4double)                       // Kinetic energy of projectile
142                { return 1.0; }
143};
144
145
146// #########################################################################
147// # Class G4IonParametrisedLossTable: Wrapper for classes of the material
148// # category, which maintain ion stopping power vectors
149// #########################################################################
150
151template <
152    class LossTabulation,
153    class ScalingAlgorithm = G4DummyScalingAlgorithm
154>
155class G4IonParametrisedLossTable : public G4IonLossTableHandle,
156                                   public LossTabulation, 
157                                   public ScalingAlgorithm {
158
159 public:
160   G4IonParametrisedLossTable(G4int maxSizeCache = 5,
161                              G4bool splines = true);
162   ~G4IonParametrisedLossTable();
163
164   // Function checking the availability of stopping power values for a
165   // given ion-target combination and a given kinetic energy
166   G4bool IsApplicable(
167              const G4ParticleDefinition*,  // Projectile (ion) 
168              const G4Material*,            // Target material
169              G4double);                    // Kinetic energy of projectile
170
171   // Function checking the availability of stopping power values for a
172   // given ion-target combination (kinetic energy not considered)
173   G4bool IsApplicable(
174              const G4ParticleDefinition*,  // Projectile (ion) 
175              const G4Material*);           // Target material             
176
177   // Function returning the stopping power of a given material for a
178   // projectile of specified energy
179   G4double GetDEDX(
180              const G4ParticleDefinition*,  // Projectile (ion) 
181              const G4Material*,            // Target material
182              G4double);                    // Kinetic energy of projectile
183
184   // Function printing stopping powers for a given ion-material combination
185   // within a specified energy range
186   void PrintDEDXTable(
187              const G4ParticleDefinition*,  // Projectile (ion) 
188              const G4Material* ,           // Target material
189              G4double,                     // Minimum energy per nucleon
190              G4double,                     // Maximum energy per nucleon
191              G4int,                        // Number of bins
192              G4bool logScaleEnergy = true);// Logarithmic scaling of energy
193
194   // Function returning the lower energy edge of stopping power tables
195   G4double GetLowerEnergyEdge(
196              const G4ParticleDefinition*,  // Projectile (ion) 
197              const G4Material*);           // Target material
198
199   // Function returning the upper energy edge of stopping power tables
200   G4double GetUpperEnergyEdge(
201              const G4ParticleDefinition*,  // Projectile (ion) 
202              const G4Material*);           // Target material
203 
204 private: 
205
206   // Function for building stopping power vectors according to Bragg's
207   // additivity rule
208   G4PhysicsVector* BuildStoppingPowerVector(
209              const G4ParticleDefinition*,  // Projectile (ion)
210              const G4Material*);           // Target material
211
212   // The assignment operator and the copy constructor are hidden
213   G4IonParametrisedLossTable& operator=(const 
214                                           G4IonParametrisedLossTable &right);
215   G4IonParametrisedLossTable(const G4IonParametrisedLossTable&);
216
217   // ######################################################################
218   // # "Most-recently-used" cache, to provide a faster access to physics
219   // # vectors
220   // ######################################################################
221
222   // A type definition of cache entry containing a key-value pair
223   typedef struct CacheEntry {
224      G4CacheKey key;
225      G4CacheValue value;
226   } G4CacheEntry;
227
228   // A cache entry list, and a map of pointers to list iterators (for faster
229   // searching)
230   typedef std::list<G4CacheEntry> CacheEntryList;
231   CacheEntryList cacheEntries;
232
233   typedef std::map<G4CacheKey, void*> CacheIterPointerMap;
234   CacheIterPointerMap cacheKeyPointers; 
235
236   // Maximum number of cache entries
237   G4int maxCacheEntries;
238
239   // Function for updating the cache
240   G4CacheValue UpdateCacheValue(
241                const G4ParticleDefinition*,  // Projectile (ion) 
242                const G4Material*);           // Target material
243
244   // Function for retrieving cache values
245   G4CacheValue GetCacheValue(
246                const G4ParticleDefinition*,  // Projectile (ion) 
247                const G4Material*);           // Target material
248
249   // Function for clearing the cache
250   void ClearCache();
251
252   // ######################################################################
253   // # Map of stopping power vectors computed according Bragg rule
254   // #
255   // ######################################################################
256
257   typedef std::map<G4CacheKey, G4LPhysicsFreeVector*> StoppingPowerTable; 
258   StoppingPowerTable s;
259
260   // Flag indicating the usage of splines
261   G4bool useSplines;
262
263   // ######################################################################
264   // # Energy boundaries of physics tables
265   // ######################################################################
266
267   G4double lowerEnergyEdge;
268   G4double upperEnergyEdge;
269};
270
271#include "G4IonParametrisedLossTable.icc"
272
273#endif  // G4IONPARAMETRISEDLOSSTABLE_HH
Note: See TracBrowser for help on using the repository browser.