Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/utils/include/G4EmCalculator.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 ]

Diff markup

Differences between /processes/electromagnetic/utils/include/G4EmCalculator.hh (Version 11.3.0) and /processes/electromagnetic/utils/include/G4EmCalculator.hh (Version 4.0.p2)


  1 //                                                  1 
  2 // *******************************************    
  3 // * License and Disclaimer                       
  4 // *                                              
  5 // * The  Geant4 software  is  copyright of th    
  6 // * the Geant4 Collaboration.  It is provided    
  7 // * conditions of the Geant4 Software License    
  8 // * LICENSE and available at  http://cern.ch/    
  9 // * include a list of copyright holders.         
 10 // *                                              
 11 // * Neither the authors of this software syst    
 12 // * institutes,nor the agencies providing fin    
 13 // * work  make  any representation or  warran    
 14 // * regarding  this  software system or assum    
 15 // * use.  Please see the license in the file     
 16 // * for the full disclaimer and the limitatio    
 17 // *                                              
 18 // * This  code  implementation is the result     
 19 // * technical work of the GEANT4 collaboratio    
 20 // * By using,  copying,  modifying or  distri    
 21 // * any work based  on the software)  you  ag    
 22 // * use  in  resulting  scientific  publicati    
 23 // * acceptance of all terms of the Geant4 Sof    
 24 // *******************************************    
 25 //                                                
 26 //                                                
 27 // -------------------------------------------    
 28 //                                                
 29 // GEANT4 Class header file                       
 30 //                                                
 31 //                                                
 32 // File name:     G4EmCalculator                  
 33 //                                                
 34 // Author:        Vladimir Ivanchenko             
 35 //                                                
 36 // Creation date: 27.06.2004                      
 37 //                                                
 38 // Modifications:                                 
 39 // 17.11.2004 Change signature of methods, add    
 40 // 11.01.2006 Add GetCSDARange (V.Ivanchenko)     
 41 // 26.01.2006 Rename GetRange -> GetRangeFromR    
 42 // 22.03.2006 Add ComputeElectronicDEDX and Co    
 43 // 29.09.2006 Add member loweModel (V.Ivanchen    
 44 // 15.03.2007 Add ComputeEnergyCutFromRangeCut    
 45 // 02.02.2018 Add parameter to FindLambdaTable    
 46 //                                                
 47 // Class Description:                             
 48 //                                                
 49 // Provide access to dE/dx and cross sections     
 50                                                   
 51 // -------------------------------------------    
 52 //                                                
 53                                                   
 54 #ifndef G4EmCalculator_h                          
 55 #define G4EmCalculator_h 1                        
 56                                                   
 57 #include <vector>                                 
 58 #include "globals.hh"                             
 59 #include "G4VAtomDeexcitation.hh"                 
 60                                                   
 61 class G4LossTableManager;                         
 62 class G4NistManager;                              
 63 class G4Material;                                 
 64 class G4MaterialCutsCouple;                       
 65 class G4ParticleDefinition;                       
 66 class G4PhysicsTable;                             
 67 class G4VEmModel;                                 
 68 class G4VEnergyLossProcess;                       
 69 class G4VEmProcess;                               
 70 class G4VMultipleScattering;                      
 71 class G4VProcess;                                 
 72 class G4ionEffectiveCharge;                       
 73 class G4Region;                                   
 74 class G4Element;                                  
 75 class G4EmCorrections;                            
 76 class G4EmParameters;                             
 77 class G4IonTable;                                 
 78                                                   
 79 class G4EmCalculator                              
 80 {                                                 
 81                                                   
 82 public:                                           
 83                                                   
 84   G4EmCalculator();                               
 85                                                   
 86   ~G4EmCalculator();                              
 87                                                   
 88   //==========================================    
 89   // Methods to access precalculated dE/dx and    
 90   // Materials should exist in the list of the    
 91   //==========================================    
 92                                                   
 93   G4double GetDEDX(G4double kinEnergy, const G    
 94        const G4Material*,                         
 95                    const G4Region* r = nullptr    
 96   inline G4double GetDEDX(G4double kinEnergy,     
 97        const G4String& mat,                       
 98                    const G4String& regname = "    
 99                                                   
100   G4double GetRangeFromRestricteDEDX(G4double     
101              const G4ParticleDefinition*,         
102              const G4Material*,                   
103              const G4Region* r = nullptr);        
104   inline G4double GetRangeFromRestricteDEDX(G4    
105               const G4String& part,               
106               const G4String& mat,                
107               const G4String& regname = "world    
108                                                   
109   G4double GetCSDARange(G4double kinEnergy, co    
110       const G4Material*,                          
111       const G4Region* r = nullptr);               
112   inline G4double GetCSDARange(G4double kinEne    
113       const G4String& mat,                        
114       const G4String& regname = "world");         
115                                                   
116   G4double GetRange(G4double kinEnergy, const     
117       const G4Material*,                          
118       const G4Region* r = nullptr);               
119   inline G4double GetRange(G4double kinEnergy,    
120       const G4String& mat,                        
121       const G4String& regname = "world");         
122                                                   
123   G4double GetKinEnergy(G4double range, const     
124       const G4Material*,                          
125       const G4Region* r = nullptr);               
126   inline G4double GetKinEnergy(G4double range,    
127       const G4String& mat,                        
128       const G4String& regname = "world");         
129                                                   
130   G4double GetCrossSectionPerVolume(              
131                    G4double kinEnergy, const G    
132                    const G4String& processName    
133        const G4Region* r = nullptr);              
134   inline G4double GetCrossSectionPerVolume(       
135                    G4double kinEnergy, const G    
136                    const G4String& mat, const     
137                                                   
138   G4double GetShellIonisationCrossSectionPerAt    
139                    const G4String& part, G4int    
140        G4AtomicShellEnumerator shell,             
141                    G4double kinEnergy);           
142                                                   
143   G4double GetMeanFreePath(G4double kinEnergy,    
144          const G4String& processName,  const G    
145          const G4Region* r = nullptr);            
146   inline G4double GetMeanFreePath(G4double kin    
147           const G4String& proc, const G4String    
148           const G4String& regname = "world");     
149                                                   
150   void PrintDEDXTable(const G4ParticleDefiniti    
151                                                   
152   void PrintRangeTable(const G4ParticleDefinit    
153                                                   
154   void PrintInverseRangeTable(const G4Particle    
155                                                   
156   //==========================================    
157   // Methods to calculate dE/dx and cross sect    
158   // Existing tables and G4MaterialCutsCouples    
159   //==========================================    
160                                                   
161   G4double ComputeDEDX(G4double kinEnergy, con    
162                        const G4String& process    
163            G4double cut = DBL_MAX);               
164   inline G4double ComputeDEDX(G4double kinEner    
165            const G4String& proc,                  
166                        const G4String& mat, G4    
167                                                   
168   G4double ComputeElectronicDEDX(G4double kinE    
169          const G4ParticleDefinition*,             
170          const G4Material* mat, G4double cut =    
171   inline G4double ComputeElectronicDEDX(G4doub    
172          const G4String& mat, G4double cut = D    
173                                                   
174   G4double ComputeDEDXForCutInRange(G4double k    
175             const G4ParticleDefinition*,          
176             const G4Material* mat, G4double ra    
177   inline G4double ComputeDEDXForCutInRange(G4d    
178              const G4String& mat,                 
179              G4double rangecut = DBL_MAX);        
180                                                   
181   G4double ComputeNuclearDEDX(G4double kinEner    
182             const G4Material*);                   
183   inline G4double ComputeNuclearDEDX(G4double     
184             const G4String& mat);                 
185                                                   
186   G4double ComputeTotalDEDX(G4double kinEnergy    
187           const G4Material*, G4double cut = DB    
188   inline G4double ComputeTotalDEDX(G4double ki    
189           const G4String& mat, G4double cut =     
190                                                   
191   G4double ComputeCrossSectionPerVolume(          
192                        G4double kinEnergy, con    
193                        const G4String& process    
194            G4double cut = 0.0);                   
195   inline G4double ComputeCrossSectionPerVolume    
196                        G4double kinEnergy, con    
197            const G4String& proc,                  
198                        const G4String& mat, G4    
199                                                   
200   G4double ComputeCrossSectionPerAtom(            
201                        G4double kinEnergy, con    
202                        const G4String& process    
203            G4double cut = 0.0);                   
204   inline G4double ComputeCrossSectionPerAtom(     
205                        G4double kinEnergy, con    
206                        const G4String& process    
207            G4double cut = 0.0);                   
208                                                   
209   G4double ComputeCrossSectionPerShell(           
210                        G4double kinEnergy, con    
211                        const G4String& process    
212            G4double cut = 0.0);                   
213   inline G4double ComputeCrossSectionPerShell(    
214                        G4double kinEnergy, con    
215                        const G4String& process    
216                        G4int shellIdx,            
217            G4double cut = 0.0);                   
218                                                   
219   G4double ComputeGammaAttenuationLength(G4dou    
220            const G4Material*);                    
221                                                   
222   G4double ComputeShellIonisationCrossSectionP    
223                    const G4String& part, G4int    
224        G4AtomicShellEnumerator shell,             
225                    G4double kinEnergy,            
226                    const G4Material* mat = nul    
227                                                   
228   G4double ComputeMeanFreePath(                   
229                        G4double kinEnergy, con    
230                        const G4String& process    
231            G4double cut = 0.0);                   
232   inline G4double ComputeMeanFreePath(            
233                        G4double kinEnergy, con    
234                        const G4String& process    
235                                                   
236   G4double ComputeEnergyCutFromRangeCut(          
237                        G4double range, const G    
238            const G4Material*);                    
239   inline G4double ComputeEnergyCutFromRangeCut    
240                        G4double range, const G    
241            const G4String&);                      
242                                                   
243   //==========================================    
244   // Methods to access particles, materials, r    
245   //==========================================    
246                                                   
247   const G4ParticleDefinition* FindParticle(con    
248                                                   
249   const G4ParticleDefinition* FindIon(G4int Z,    
250                                                   
251   const G4Material* FindMaterial(const G4Strin    
252                                                   
253   const G4Region* FindRegion(const G4String&);    
254                                                   
255   const G4MaterialCutsCouple* FindCouple(const    
256            const G4Region* r = nullptr);          
257                                                   
258   G4VProcess* FindProcess(const G4ParticleDefi    
259         const G4String& processName);             
260                                                   
261   void SetupMaterial(const G4Material*);          
262                                                   
263   void SetupMaterial(const G4String&);            
264                                                   
265   void SetVerbose(G4int val);                     
266                                                   
267   inline void SetApplySmoothing(G4int val);       
268                                                   
269   // hide copy and assign                         
270   G4EmCalculator & operator=(const  G4EmCalcul    
271   G4EmCalculator(const  G4EmCalculator&) = del    
272                                                   
273 private:                                          
274                                                   
275   G4bool UpdateParticle(const G4ParticleDefini    
276                                                   
277   G4bool UpdateCouple(const G4Material*, G4dou    
278                                                   
279   void FindLambdaTable(const G4ParticleDefinit    
280                        const G4String& process    
281                        G4double kinEnergy, G4i    
282                                                   
283   G4bool FindEmModel(const G4ParticleDefinitio    
284                      const G4String& processNa    
285                            G4double kinEnergy)    
286                                                   
287   G4VEnergyLossProcess* FindEnLossProcess(cons    
288             const G4String& processName);         
289                                                   
290   G4VEmProcess* FindDiscreteProcess(const G4Pa    
291             const G4String& processName);         
292                                                   
293   G4VMultipleScattering* FindMscProcess(const     
294           const G4String& processName);           
295                                                   
296   G4bool ActiveForParticle(const G4ParticleDef    
297          G4VProcess* proc);                       
298                                                   
299   void CheckMaterial(G4int Z);                    
300                                                   
301   G4EmParameters*              theParameters;     
302   G4LossTableManager*          manager;           
303   G4NistManager*               nist;              
304   G4IonTable*                  ionTable;          
305   G4EmCorrections*             corr;              
306                                                   
307   // cache                                        
308   const G4MaterialCutsCouple*  currentCouple =    
309   const G4Material*            currentMaterial    
310   const G4Material*            cutMaterial = n    
311   const G4ParticleDefinition*  currentParticle    
312   const G4ParticleDefinition*  lambdaParticle     
313   const G4ParticleDefinition*  baseParticle =     
314   const G4PhysicsTable*        currentLambda =    
315                                                   
316   G4VEmModel*                  currentModel =     
317   G4VEmModel*                  loweModel = nul    
318   G4VEnergyLossProcess*        currentProcess     
319   G4VProcess*                  curProcess = nu    
320   G4DynamicParticle*           dynParticle = n    
321                                                   
322   const G4ParticleDefinition*  theGenericIon;     
323   G4ionEffectiveCharge*        ionEffCharge;      
324                                                   
325   G4double                     currentCut = DB    
326   G4double                     chargeSquare =     
327   G4double                     massRatio = 1.0    
328   G4double                     mass = 0;          
329   G4double                     cutenergy[3];      
330                                                   
331   G4int                        currentCoupleIn    
332   G4int                        nLocalMaterials    
333   G4int                        verbose = 0;       
334                                                   
335   G4bool                       isIon = false;     
336   G4bool                       isApplicable =     
337   G4bool                       applySmoothing     
338                                                   
339   std::vector<const G4Material*>            lo    
340   std::vector<const G4MaterialCutsCouple*>  lo    
341   std::vector<G4double>                     lo    
342                                                   
343   G4String                     currentName = "    
344   G4String                     lambdaName = ""    
345   G4String                     currentParticle    
346   G4String                     currentMaterial    
347   G4String                     currentProcessN    
348 };                                                
349                                                   
350 //....oooOO0OOooo.......oooOO0OOooo........ooo    
351 //....oooOO0OOooo........oooOO0OOooo........oo    
352                                                   
353 inline                                            
354 G4double G4EmCalculator::GetDEDX(G4double kinE    
355                                  const G4Strin    
356 {                                                 
357   return GetDEDX(kinEnergy,FindParticle(partic    
358      FindMaterial(material),FindRegion(reg));     
359 }                                                 
360                                                   
361 //....oooOO0OOooo........oooOO0OOooo........oo    
362                                                   
363 inline                                            
364 G4double G4EmCalculator::GetRangeFromRestricte    
365                const G4String& particle,          
366                const G4String& material,          
367                const G4String& reg)               
368 {                                                 
369   return GetRangeFromRestricteDEDX(kinEnergy,F    
370            FindMaterial(material),FindRegion(r    
371 }                                                 
372                                                   
373 //....oooOO0OOooo........oooOO0OOooo........oo    
374                                                   
375 inline                                            
376 G4double G4EmCalculator::GetCSDARange(G4double    
377               const G4String& particle,           
378               const G4String& material,           
379               const G4String& reg)                
380 {                                                 
381   return GetCSDARange(kinEnergy,FindParticle(p    
382       FindMaterial(material),FindRegion(reg));    
383 }                                                 
384                                                   
385 //....oooOO0OOooo........oooOO0OOooo........oo    
386                                                   
387 inline                                            
388 G4double G4EmCalculator::GetRange(G4double kin    
389           const G4String& particle,               
390           const G4String& material,               
391           const G4String& reg)                    
392 {                                                 
393   return GetRange(kinEnergy,FindParticle(parti    
394       FindMaterial(material),FindRegion(reg));    
395 }                                                 
396                                                   
397 //....oooOO0OOooo........oooOO0OOooo........oo    
398                                                   
399 inline                                            
400 G4double G4EmCalculator::GetKinEnergy(G4double    
401                                       const G4    
402 {                                                 
403   return GetKinEnergy(range,FindParticle(parti    
404           FindMaterial(material),FindRegion(re    
405 }                                                 
406                                                   
407 //....oooOO0OOooo........oooOO0OOooo........oo    
408                                                   
409 inline                                            
410 G4double G4EmCalculator::GetCrossSectionPerVol    
411                                             co    
412               const G4String& processName,        
413                                             co    
414               const G4String& reg)                
415 {                                                 
416   return GetCrossSectionPerVolume(kinEnergy,Fi    
417                                   FindMaterial    
418 }                                                 
419                                                   
420 //....oooOO0OOooo........oooOO0OOooo........oo    
421                                                   
422 inline                                            
423 G4double G4EmCalculator::GetMeanFreePath(G4dou    
424                                          const    
425            const G4String& processName,           
426                                          const    
427            const G4String& reg)                   
428 {                                                 
429   return GetMeanFreePath(kinEnergy,FindParticl    
430                          FindMaterial(material    
431 }                                                 
432                                                   
433 //....oooOO0OOooo........oooOO0OOooo........oo    
434                                                   
435 inline G4double                                   
436 G4EmCalculator::ComputeElectronicDEDX(G4double    
437               const G4String& mat, G4double cu    
438 {                                                 
439   return                                          
440     ComputeElectronicDEDX(kinEnergy,FindPartic    
441 }                                                 
442                                                   
443 //....oooOO0OOooo........oooOO0OOooo........oo    
444                                                   
445 inline G4double                                   
446 G4EmCalculator::ComputeDEDXForCutInRange(G4dou    
447            const G4String& part,                  
448            const G4String& mat,                   
449            G4double rangecut)                     
450 {                                                 
451   return ComputeDEDXForCutInRange(kinEnergy,Fi    
452           FindMaterial(mat), rangecut);           
453 }                                                 
454                                                   
455 //....oooOO0OOooo........oooOO0OOooo........oo    
456                                                   
457 inline                                            
458 G4double G4EmCalculator::ComputeTotalDEDX(G4do    
459             const G4String& part,                 
460             const G4String& mat,                  
461             G4double cut)                         
462 {                                                 
463   return ComputeTotalDEDX(kinEnergy,FindPartic    
464 }                                                 
465                                                   
466 //....oooOO0OOooo........oooOO0OOooo........oo    
467                                                   
468 inline                                            
469 G4double G4EmCalculator::ComputeDEDX(G4double     
470                                      const G4S    
471              const G4String& processName,         
472                                      const G4S    
473                                            G4d    
474 {                                                 
475   return ComputeDEDX(kinEnergy,FindParticle(pa    
476                      FindMaterial(material),cu    
477 }                                                 
478                                                   
479 //....oooOO0OOooo........oooOO0OOooo........oo    
480                                                   
481 inline                                            
482 G4double G4EmCalculator::ComputeNuclearDEDX(G4    
483                                       const G4    
484               const G4String& material)           
485 {                                                 
486   return ComputeNuclearDEDX(kinEnergy,FindPart    
487           FindMaterial(material));                
488 }                                                 
489                                                   
490 //....oooOO0OOooo........oooOO0OOooo........oo    
491                                                   
492 inline                                            
493 G4double G4EmCalculator::ComputeCrossSectionPe    
494                                                   
495                                              c    
496                const G4String& processName,       
497                                              c    
498                                                   
499 {                                                 
500   return ComputeCrossSectionPerVolume(kinEnerg    
501               processName,                        
502                                       FindMate    
503 }                                                 
504                                                   
505 //....oooOO0OOooo........oooOO0OOooo........oo    
506                                                   
507 inline                                            
508 G4double G4EmCalculator::ComputeCrossSectionPe    
509                                                   
510                                                   
511                 const G4Element* elm,             
512                                         G4doub    
513 {                                                 
514   return ComputeCrossSectionPerAtom(kinEnergy,    
515             processName,                          
516                                     elm->GetZ(    
517 }                                                 
518                                                   
519 //....oooOO0OOooo........oooOO0OOooo........oo    
520                                                   
521 inline G4double G4EmCalculator::ComputeCrossSe    
522                        G4double kinEnergy, con    
523                        const G4String& process    
524                        G4int shellIdx, G4doubl    
525 {                                                 
526   return ComputeCrossSectionPerShell(kinEnergy    
527              processName, elm->GetZasInt(),       
528              shellIdx, cut);                      
529 }                                                 
530                                                   
531 //....oooOO0OOooo........oooOO0OOooo........oo    
532                                                   
533 inline                                            
534 G4double G4EmCalculator::ComputeEnergyCutFromR    
535                          G4double range,          
536        const G4String& particle,                  
537        const G4String& material)                  
538 {                                                 
539   return ComputeEnergyCutFromRangeCut(range,Fi    
540               FindMaterial(material));            
541 }                                                 
542                                                   
543 //....oooOO0OOooo........oooOO0OOooo........oo    
544                                                   
545 inline                                            
546 G4double G4EmCalculator::ComputeMeanFreePath(G    
547                                              c    
548                                              c    
549                                              c    
550                                                   
551 {                                                 
552   return ComputeMeanFreePath(kinEnergy,FindPar    
553                              FindMaterial(mate    
554 }                                                 
555                                                   
556 //....oooOO0OOooo........oooOO0OOooo........oo    
557                                                   
558 inline void G4EmCalculator::SetApplySmoothing(    
559 {                                                 
560   applySmoothing = val;                           
561 }                                                 
562                                                   
563 //....oooOO0OOooo........oooOO0OOooo........oo    
564                                                   
565 #endif                                            
566