Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/utils/include/G4VEmModel.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 // GEANT4 Class header file
 29 //
 30 //
 31 // File name:     G4VEmModel
 32 //
 33 // Author:        Vladimir Ivanchenko
 34 //
 35 // Creation date: 03.01.2002
 36 //
 37 // Modifications:
 38 //
 39 // 23-12-02 V.Ivanchenko change interface before move to cut per region
 40 // 24-01-03 Cut per region (V.Ivanchenko)
 41 // 13-02-03 Add name (V.Ivanchenko)
 42 // 25-02-03 Add sample theta and displacement (V.Ivanchenko)
 43 // 23-07-03 Replace G4Material by G4MaterialCutCouple in dE/dx and CrossSection
 44 //          calculation (V.Ivanchenko)
 45 // 01-03-04 L.Urban signature changed in SampleCosineTheta 
 46 // 23-04-04 L.urban signature of SampleCosineTheta changed back 
 47 // 17-11-04 Add method CrossSectionPerAtom (V.Ivanchenko)
 48 // 14-03-05 Reduce number of pure virtual methods and make inline part 
 49 //          separate (V.Ivanchenko)
 50 // 24-03-05 Remove IsInCharge and add G4VParticleChange in the constructor (VI)
 51 // 08-04-05 Major optimisation of internal interfaces (V.Ivantchenko)
 52 // 15-04-05 optimize internal interface for msc (V.Ivanchenko)
 53 // 08-05-05 A -> N (V.Ivanchenko)
 54 // 25-07-05 Move constructor and destructor to the body (V.Ivanchenko)
 55 // 02-02-06 ComputeCrossSectionPerAtom: default value A=0. (mma)
 56 // 06-02-06 add method ComputeMeanFreePath() (mma)
 57 // 07-03-06 Optimize msc methods (V.Ivanchenko)
 58 // 29-06-06 Add member currentElement and Get/Set methods (V.Ivanchenko)
 59 // 29-10-07 Added SampleScattering (V.Ivanchenko)
 60 // 15-07-08 Reorder class members and improve comments (VI)
 61 // 21-07-08 Added vector of G4ElementSelector and methods to use it (VI)
 62 // 12-09-08 Added methods GetParticleCharge, GetChargeSquareRatio, 
 63 //          CorrectionsAlongStep, ActivateNuclearStopping (VI)
 64 // 16-02-09 Moved implementations of virtual methods to source (VI)
 65 // 07-04-09 Moved msc methods from G4VEmModel to G4VMscModel (VI)
 66 // 13-10-10 Added G4VEmAngularDistribution (VI)
 67 //
 68 // Class Description:
 69 //
 70 // Abstract interface to energy loss models
 71 
 72 // -------------------------------------------------------------------
 73 //
 74 
 75 #ifndef G4VEmModel_h
 76 #define G4VEmModel_h 1
 77 
 78 #include "globals.hh"
 79 #include "G4DynamicParticle.hh"
 80 #include "G4ParticleDefinition.hh"
 81 #include "G4MaterialCutsCouple.hh"
 82 #include "G4Material.hh"
 83 #include "G4Element.hh"
 84 #include "G4ElementVector.hh"
 85 #include "G4Isotope.hh"
 86 #include "G4DataVector.hh"
 87 #include "G4VEmFluctuationModel.hh"
 88 #include "G4VEmAngularDistribution.hh"
 89 #include "G4EmElementSelector.hh"
 90 #include <CLHEP/Random/RandomEngine.h>
 91 #include <vector>
 92 
 93 class G4ElementData;
 94 class G4PhysicsTable;
 95 class G4Region;
 96 class G4VParticleChange;
 97 class G4ParticleChangeForLoss;
 98 class G4ParticleChangeForGamma;
 99 class G4Track;
100 class G4LossTableManager;
101 
102 class G4VEmModel
103 {
104 
105 public:
106 
107   explicit G4VEmModel(const G4String& nam);
108 
109   virtual ~G4VEmModel();
110 
111   //------------------------------------------------------------------------
112   // Virtual methods to be implemented for any concrete model
113   //------------------------------------------------------------------------
114 
115   virtual void Initialise(const G4ParticleDefinition*, const G4DataVector&) = 0;
116 
117   virtual void SampleSecondaries(std::vector<G4DynamicParticle*>*,
118                                  const G4MaterialCutsCouple*,
119                                  const G4DynamicParticle*,
120                                  G4double tmin = 0.0,
121                                  G4double tmax = DBL_MAX) = 0;
122 
123   //------------------------------------------------------------------------
124   // Methods for initialisation of MT; may be overwritten if needed
125   //------------------------------------------------------------------------
126 
127   // initialisation in local thread
128   virtual void InitialiseLocal(const G4ParticleDefinition*,
129                                G4VEmModel* masterModel);
130 
131   // initialisation of a new material at run time
132   virtual void InitialiseForMaterial(const G4ParticleDefinition*,
133                                      const G4Material*);
134 
135   // initialisation of a new element at run time
136   virtual void InitialiseForElement(const G4ParticleDefinition*,
137                                     G4int Z);
138 
139   //------------------------------------------------------------------------
140   // Methods with standard implementation; may be overwritten if needed 
141   //------------------------------------------------------------------------
142 
143   // main method to compute dEdx
144   virtual G4double ComputeDEDXPerVolume(const G4Material*,
145                                         const G4ParticleDefinition*,
146                                         G4double kineticEnergy,
147                                         G4double cutEnergy = DBL_MAX);
148 
149   // main method to compute cross section per Volume
150   virtual G4double CrossSectionPerVolume(const G4Material*,
151                                          const G4ParticleDefinition*,
152                                          G4double kineticEnergy,
153                                          G4double cutEnergy = 0.0,
154                                          G4double maxEnergy = DBL_MAX);
155 
156   // method to get partial cross section
157   virtual G4double GetPartialCrossSection(const G4Material*,
158                                           G4int level,
159                                           const G4ParticleDefinition*,
160                                           G4double kineticEnergy);
161 
162   // main method to compute cross section per atom
163   virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
164                                               G4double kinEnergy,
165                                               G4double Z,
166                                               G4double A = 0., /* amu */
167                                               G4double cutEnergy = 0.0,
168                                               G4double maxEnergy = DBL_MAX);
169 
170   // main method to compute cross section per atomic shell
171   virtual G4double ComputeCrossSectionPerShell(const G4ParticleDefinition*,
172                                                G4int Z, G4int shellIdx,
173                                                G4double kinEnergy,
174                                                G4double cutEnergy = 0.0,
175                                                G4double maxEnergy = DBL_MAX);
176 
177   // Compute effective ion charge square
178   virtual G4double ChargeSquareRatio(const G4Track&);
179 
180   // Compute effective ion charge square
181   virtual G4double GetChargeSquareRatio(const G4ParticleDefinition*,
182                                         const G4Material*,
183                                         G4double kineticEnergy);
184 
185   // Compute ion charge 
186   virtual G4double GetParticleCharge(const G4ParticleDefinition*,
187                                      const G4Material*,
188                                      G4double kineticEnergy);
189 
190   // Initialisation for a new track
191   virtual void StartTracking(G4Track*);
192 
193   // add correction to energy loss and compute non-ionizing energy loss
194   virtual void CorrectionsAlongStep(const G4MaterialCutsCouple*,
195                                     const G4DynamicParticle*,
196                                     const G4double& length,
197                                     G4double& eloss);
198 
199   // value which may be tabulated (by default cross section)
200   virtual G4double Value(const G4MaterialCutsCouple*,
201                          const G4ParticleDefinition*,
202                          G4double kineticEnergy);
203 
204   // threshold for zero value 
205   virtual G4double MinPrimaryEnergy(const G4Material*,
206                                     const G4ParticleDefinition*,
207                                     G4double cut = 0.0);
208 
209   // model can define low-energy limit for the cut
210   virtual G4double MinEnergyCut(const G4ParticleDefinition*,
211                                 const G4MaterialCutsCouple*);
212 
213   // initialisation at run time for a given material
214   virtual void SetupForMaterial(const G4ParticleDefinition*,
215                                 const G4Material*,
216                                 G4double kineticEnergy);
217 
218   // add a region for the model
219   virtual void DefineForRegion(const G4Region*);
220 
221   // fill number of different type of secondaries after SampleSecondaries(...)
222   virtual void FillNumberOfSecondaries(G4int& numberOfTriplets,
223                                        G4int& numberOfRecoil);
224 
225   // for automatic documentation
226   virtual void ModelDescription(std::ostream& outFile) const;
227 
228 protected:
229 
230   // initialisation of the ParticleChange for the model
231   G4ParticleChangeForLoss* GetParticleChangeForLoss();
232 
233   // initialisation of the ParticleChange for the model
234   G4ParticleChangeForGamma* GetParticleChangeForGamma();
235 
236   // kinematically allowed max kinetic energy of a secondary
237   virtual G4double MaxSecondaryEnergy(const G4ParticleDefinition*,
238                                       G4double kineticEnergy);
239 
240 public:
241 
242   //------------------------------------------------------------------------
243   // Generic methods common to all models
244   //------------------------------------------------------------------------
245 
246   // should be called at initialisation to build element selectors
247   void InitialiseElementSelectors(const G4ParticleDefinition*,
248                                   const G4DataVector&);
249 
250   // should be called at initialisation to access element selectors
251   inline std::vector<G4EmElementSelector*>* GetElementSelectors();
252 
253   // should be called at initialisation to set element selectors
254   inline void SetElementSelectors(std::vector<G4EmElementSelector*>*);
255 
256   // dEdx per unit length, base material approach may be used
257   inline G4double ComputeDEDX( const G4MaterialCutsCouple*,
258                                const G4ParticleDefinition*,
259                                G4double kineticEnergy,
260                                G4double cutEnergy = DBL_MAX);
261 
262   // cross section per volume, base material approach may be used
263   inline G4double CrossSection(const G4MaterialCutsCouple*,
264                                const G4ParticleDefinition*,
265                                G4double kineticEnergy,
266                                G4double cutEnergy = 0.0,
267                                G4double maxEnergy = DBL_MAX);
268 
269   // compute mean free path via cross section per volume
270   inline G4double ComputeMeanFreePath(const G4ParticleDefinition*,
271                                       G4double kineticEnergy,
272                                       const G4Material*,
273                                       G4double cutEnergy = 0.0,
274                                       G4double maxEnergy = DBL_MAX);
275 
276   // generic cross section per element
277   inline G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition*,
278                                              const G4Element*,
279                                              G4double kinEnergy,
280                                              G4double cutEnergy = 0.0,
281                                              G4double maxEnergy = DBL_MAX);
282 
283   // atom can be selected effitiantly if element selectors are initialised 
284   inline const G4Element* SelectRandomAtom(const G4MaterialCutsCouple*,
285                                            const G4ParticleDefinition*,
286                                            G4double kineticEnergy,
287                                            G4double cutEnergy = 0.0,
288                                            G4double maxEnergy = DBL_MAX);
289   // same as SelectRandomAtom above but more efficient since log-ekin is known
290   inline const G4Element* SelectTargetAtom(const G4MaterialCutsCouple*,
291                                            const G4ParticleDefinition*,
292                                            G4double kineticEnergy,
293                                            G4double logKineticEnergy,
294                                            G4double cutEnergy = 0.0,
295                                            G4double maxEnergy = DBL_MAX);
296 
297   // to select atom cross section per volume is recomputed for each element 
298   const G4Element* SelectRandomAtom(const G4Material*,
299                                     const G4ParticleDefinition*,
300                                     G4double kineticEnergy,
301                                     G4double cutEnergy = 0.0,
302                                     G4double maxEnergy = DBL_MAX);
303 
304   // to select atom if cross section is proportional number of electrons 
305   const G4Element* GetCurrentElement(const G4Material* mat = nullptr) const;
306   G4int SelectRandomAtomNumber(const G4Material*) const;
307 
308   // select isotope in order to have precise mass of the nucleus
309   const G4Isotope* GetCurrentIsotope(const G4Element* elm = nullptr) const;
310   G4int SelectIsotopeNumber(const G4Element*) const;
311 
312   //------------------------------------------------------------------------
313   // Get/Set methods
314   //------------------------------------------------------------------------
315 
316   void SetParticleChange(G4VParticleChange*, G4VEmFluctuationModel* f=nullptr);
317 
318   void SetCrossSectionTable(G4PhysicsTable*, G4bool isLocal);
319 
320   inline G4ElementData* GetElementData();
321 
322   inline G4PhysicsTable* GetCrossSectionTable();
323 
324   inline G4VEmFluctuationModel* GetModelOfFluctuations();
325 
326   inline G4VEmAngularDistribution* GetAngularDistribution();
327 
328   inline G4VEmModel* GetTripletModel();
329 
330   inline void SetTripletModel(G4VEmModel*);
331 
332   inline void SetAngularDistribution(G4VEmAngularDistribution*);
333 
334   inline G4double HighEnergyLimit() const;
335 
336   inline G4double LowEnergyLimit() const;
337 
338   inline G4double HighEnergyActivationLimit() const;
339 
340   inline G4double LowEnergyActivationLimit() const;
341 
342   inline G4double PolarAngleLimit() const;
343 
344   inline G4double SecondaryThreshold() const;
345 
346   inline G4bool DeexcitationFlag() const;
347 
348   inline G4bool ForceBuildTableFlag() const;
349 
350   inline G4bool UseAngularGeneratorFlag() const;
351 
352   inline void SetAngularGeneratorFlag(G4bool);
353 
354   inline void SetHighEnergyLimit(G4double);
355 
356   inline void SetLowEnergyLimit(G4double);
357 
358   inline void SetActivationHighEnergyLimit(G4double);
359 
360   inline void SetActivationLowEnergyLimit(G4double);
361 
362   inline G4bool IsActive(G4double kinEnergy) const;
363 
364   inline void SetPolarAngleLimit(G4double);
365 
366   inline void SetSecondaryThreshold(G4double);
367 
368   inline void SetDeexcitationFlag(G4bool val);
369 
370   inline void SetForceBuildTable(G4bool val);
371 
372   inline void SetFluctuationFlag(G4bool val);
373 
374   inline G4bool IsMaster() const;
375 
376   inline void SetUseBaseMaterials(G4bool val);
377 
378   inline G4bool UseBaseMaterials() const;
379 
380   inline G4double MaxSecondaryKinEnergy(const G4DynamicParticle* dynParticle);
381 
382   inline const G4String& GetName() const;
383 
384   inline void SetCurrentCouple(const G4MaterialCutsCouple*);
385 
386   inline G4bool IsLocked() const;
387 
388   inline void SetLocked(G4bool);
389 
390   // obsolete methods
391   [[deprecated("Use G4EmParameters::Instance()->SetLPM instead")]]
392   void SetLPMFlag(G4bool);
393 
394   void SetMasterThread(G4bool);
395 
396   //  hide assignment operator
397   G4VEmModel & operator=(const  G4VEmModel &right) = delete;
398   G4VEmModel(const  G4VEmModel&) = delete;
399 
400 protected:
401 
402   inline const G4MaterialCutsCouple* CurrentCouple() const;
403 
404   inline void SetCurrentElement(const G4Element*);
405 
406 private:
407 
408   // ======== Parameters of the class fixed at construction =========
409  
410   G4VEmFluctuationModel*      flucModel = nullptr;
411   G4VEmAngularDistribution*   anglModel = nullptr;
412   G4VEmModel*                 fTripletModel = nullptr;
413   const G4MaterialCutsCouple* fCurrentCouple = nullptr;
414   const G4Element*            fCurrentElement = nullptr;
415   std::vector<G4EmElementSelector*>* elmSelectors = nullptr;
416   G4LossTableManager*         fEmManager;
417 
418 protected:
419 
420   G4ElementData*               fElementData = nullptr;
421   G4VParticleChange*           pParticleChange = nullptr;
422   G4PhysicsTable*              xSectionTable = nullptr;
423   const G4Material*            pBaseMaterial = nullptr;
424   const std::vector<G4double>* theDensityFactor = nullptr;
425   const std::vector<G4int>*    theDensityIdx = nullptr;
426 
427   G4double inveplus;
428   G4double pFactor = 1.0;
429 
430 private:
431 
432   G4double lowLimit;
433   G4double highLimit;
434   G4double eMinActive = 0.0;
435   G4double eMaxActive = DBL_MAX;
436   G4double secondaryThreshold = DBL_MAX;
437   G4double polarAngleLimit;
438 
439   G4int nSelectors = 0;
440   G4int nsec = 5;
441 
442 protected:
443 
444   std::size_t currentCoupleIndex = 0;
445   std::size_t basedCoupleIndex = 0;
446   G4bool lossFlucFlag = true;
447 
448 private:
449 
450   G4bool flagDeexcitation = false;
451   G4bool flagForceBuildTable = false;
452   G4bool isMaster = true;
453 
454   G4bool localTable = true;
455   G4bool localElmSelectors = true;
456   G4bool useAngularGenerator = false;
457   G4bool useBaseMaterials = false;
458   G4bool isLocked = false;
459 
460   const G4String  name;
461   std::vector<G4double>  xsec;
462 
463 };
464 
465 // ======== Run time inline methods ================
466 
467 inline void G4VEmModel::SetCurrentCouple(const G4MaterialCutsCouple* ptr)
468 {
469   if(fCurrentCouple != ptr) {
470     fCurrentCouple = ptr;
471     basedCoupleIndex = currentCoupleIndex = ptr->GetIndex();
472     pBaseMaterial = ptr->GetMaterial();
473     pFactor = 1.0;
474     if(useBaseMaterials) {
475       basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex];
476       if(nullptr != pBaseMaterial->GetBaseMaterial()) 
477   pBaseMaterial = pBaseMaterial->GetBaseMaterial();
478       pFactor = (*theDensityFactor)[currentCoupleIndex];
479     }
480   }
481 }
482 
483 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
484 
485 inline const G4MaterialCutsCouple* G4VEmModel::CurrentCouple() const
486 {
487   return fCurrentCouple;
488 }
489 
490 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
491 
492 inline void G4VEmModel::SetCurrentElement(const G4Element* elm)
493 {
494   fCurrentElement = elm;
495 }
496 
497 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
498 
499 inline 
500 G4double G4VEmModel::MaxSecondaryKinEnergy(const G4DynamicParticle* dynPart)
501 {
502   return MaxSecondaryEnergy(dynPart->GetParticleDefinition(),
503                             dynPart->GetKineticEnergy());
504 }
505 
506 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
507 
508 inline G4double G4VEmModel::ComputeDEDX(const G4MaterialCutsCouple* couple,
509                                         const G4ParticleDefinition* part,
510                                         G4double kinEnergy,
511                                         G4double cutEnergy)
512 {
513   SetCurrentCouple(couple);
514   return pFactor*ComputeDEDXPerVolume(pBaseMaterial,part,kinEnergy,cutEnergy);
515 }
516 
517 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
518 
519 inline G4double G4VEmModel::CrossSection(const G4MaterialCutsCouple* couple,
520                                          const G4ParticleDefinition* part,
521                                          G4double kinEnergy,
522                                          G4double cutEnergy,
523                                          G4double maxEnergy)
524 {
525   SetCurrentCouple(couple);
526   return pFactor*CrossSectionPerVolume(pBaseMaterial,part,kinEnergy,
527                                        cutEnergy,maxEnergy);
528 }
529 
530 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
531 
532 inline 
533 G4double G4VEmModel::ComputeMeanFreePath(const G4ParticleDefinition* part,
534                                          G4double ekin,
535                                          const G4Material* material,
536                                          G4double emin,
537                                          G4double emax)
538 {
539   G4double cross = CrossSectionPerVolume(material,part,ekin,emin,emax);
540   return (cross > 0.0) ? 1./cross : DBL_MAX;
541 }
542 
543 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
544 
545 inline G4double
546 G4VEmModel::ComputeCrossSectionPerAtom(const G4ParticleDefinition* part,
547                                        const G4Element* elm,
548                                        G4double kinEnergy,
549                                        G4double cutEnergy,
550                                        G4double maxEnergy)
551 {
552   fCurrentElement = elm;
553   return ComputeCrossSectionPerAtom(part,kinEnergy,elm->GetZ(),elm->GetN(),
554                                     cutEnergy,maxEnergy);
555 }
556 
557 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
558 
559 inline const G4Element*
560 G4VEmModel::SelectRandomAtom(const G4MaterialCutsCouple* couple,
561                              const G4ParticleDefinition* part,
562                              G4double kinEnergy,
563                              G4double cutEnergy,
564                              G4double maxEnergy)
565 {
566   SetCurrentCouple(couple);
567   fCurrentElement = (nSelectors > 0) ?
568     ((*elmSelectors)[couple->GetIndex()])->SelectRandomAtom(kinEnergy) :
569     SelectRandomAtom(pBaseMaterial,part,kinEnergy,cutEnergy,maxEnergy);
570   return fCurrentElement;
571 }
572 
573 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
574 
575 inline const G4Element*
576 G4VEmModel::SelectTargetAtom(const G4MaterialCutsCouple* couple,
577                              const G4ParticleDefinition* part,
578                              G4double kinEnergy,
579                              G4double logKinE,
580                              G4double cutEnergy,
581                              G4double maxEnergy)
582 {
583   SetCurrentCouple(couple);
584   fCurrentElement = (nSelectors > 0)
585    ? ((*elmSelectors)[couple->GetIndex()])->SelectRandomAtom(kinEnergy,logKinE)
586    : SelectRandomAtom(pBaseMaterial,part,kinEnergy,cutEnergy,maxEnergy);
587   return fCurrentElement;
588 }
589 
590 // ======== Get/Set inline methods used at initialisation ================
591 
592 inline G4VEmFluctuationModel* G4VEmModel::GetModelOfFluctuations()
593 {
594   return flucModel;
595 }
596 
597 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
598 
599 inline G4VEmAngularDistribution* G4VEmModel::GetAngularDistribution()
600 {
601   return anglModel;
602 }
603 
604 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
605 
606 inline void G4VEmModel::SetAngularDistribution(G4VEmAngularDistribution* p)
607 {
608   if(p != anglModel) {
609     delete anglModel;
610     anglModel = p;
611   }
612 }
613 
614 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
615 
616 inline G4VEmModel* G4VEmModel::GetTripletModel()
617 {
618   return fTripletModel;
619 }
620 
621 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
622 
623 inline void G4VEmModel::SetTripletModel(G4VEmModel* p)
624 {
625   if(p != fTripletModel) {
626     delete fTripletModel;
627     fTripletModel = p;
628   }
629 }
630 
631 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
632 
633 inline G4double G4VEmModel::HighEnergyLimit() const
634 {
635   return highLimit;
636 }
637 
638 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
639 
640 inline G4double G4VEmModel::LowEnergyLimit() const
641 {
642   return lowLimit;
643 }
644 
645 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
646 
647 inline G4double G4VEmModel::HighEnergyActivationLimit() const
648 {
649   return eMaxActive;
650 }
651 
652 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
653 
654 inline G4double G4VEmModel::LowEnergyActivationLimit() const
655 {
656   return eMinActive;
657 }
658 
659 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
660 
661 inline G4double G4VEmModel::PolarAngleLimit() const
662 {
663   return polarAngleLimit;
664 }
665 
666 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
667 
668 inline G4double G4VEmModel::SecondaryThreshold() const
669 {
670   return secondaryThreshold;
671 }
672 
673 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
674 
675 inline G4bool G4VEmModel::DeexcitationFlag() const 
676 {
677   return flagDeexcitation;
678 }
679 
680 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
681 
682 inline G4bool G4VEmModel::ForceBuildTableFlag() const 
683 {
684   return flagForceBuildTable;
685 }
686 
687 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
688 
689 inline G4bool G4VEmModel::UseAngularGeneratorFlag() const
690 {
691   return useAngularGenerator;
692 }
693 
694 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
695 
696 inline void G4VEmModel::SetAngularGeneratorFlag(G4bool val)
697 {
698   useAngularGenerator = val;
699 }
700 
701 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
702 
703 inline void G4VEmModel::SetFluctuationFlag(G4bool val)
704 {
705   lossFlucFlag = val;
706 }
707 
708 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
709 
710 inline G4bool G4VEmModel::IsMaster() const
711 {
712   return isMaster;
713 }
714 
715 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
716 
717 inline void G4VEmModel::SetUseBaseMaterials(G4bool val)
718 {
719   useBaseMaterials = val;
720 }
721 
722 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
723 
724 inline G4bool G4VEmModel::UseBaseMaterials() const
725 {
726   return useBaseMaterials;
727 }
728 
729 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
730 
731 inline void G4VEmModel::SetHighEnergyLimit(G4double val)
732 {
733   highLimit = val;
734 }
735 
736 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
737 
738 inline void G4VEmModel::SetLowEnergyLimit(G4double val)
739 {
740   lowLimit = val;
741 }
742 
743 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
744 
745 inline void G4VEmModel::SetActivationHighEnergyLimit(G4double val)
746 {
747   eMaxActive = val;
748 }
749 
750 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
751 
752 inline void G4VEmModel::SetActivationLowEnergyLimit(G4double val)
753 {
754   eMinActive = val;
755 }
756 
757 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
758 
759 inline G4bool G4VEmModel::IsActive(G4double kinEnergy) const
760 {
761   return (kinEnergy >= eMinActive && kinEnergy <= eMaxActive);
762 }
763 
764 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
765 
766 inline void G4VEmModel::SetPolarAngleLimit(G4double val)
767 {
768   if(!isLocked) { polarAngleLimit = val; }
769 }
770 
771 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
772 
773 inline void G4VEmModel::SetSecondaryThreshold(G4double val) 
774 {
775   secondaryThreshold = val;
776 }
777 
778 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
779 
780 inline void G4VEmModel::SetDeexcitationFlag(G4bool val) 
781 {
782   flagDeexcitation = val;
783 }
784 
785 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
786 
787 inline void G4VEmModel::SetForceBuildTable(G4bool val)
788 {
789   flagForceBuildTable = val;
790 }
791 
792 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
793 
794 inline const G4String& G4VEmModel::GetName() const 
795 {
796   return name;
797 }
798 
799 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
800 
801 inline std::vector<G4EmElementSelector*>* G4VEmModel::GetElementSelectors()
802 {
803   return elmSelectors;
804 }
805 
806 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
807 
808 inline void 
809 G4VEmModel::SetElementSelectors(std::vector<G4EmElementSelector*>* p)
810 {
811   if(p != elmSelectors) {
812     elmSelectors = p;
813     nSelectors = (nullptr != elmSelectors) ? G4int(elmSelectors->size()) : 0;
814     localElmSelectors = false;
815   }
816 }
817 
818 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
819 
820 inline G4ElementData* G4VEmModel::GetElementData()
821 {
822   return fElementData;
823 }
824 
825 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
826 
827 inline G4PhysicsTable* G4VEmModel::GetCrossSectionTable()
828 {
829   return xSectionTable;
830 }
831 
832 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
833 
834 inline G4bool G4VEmModel::IsLocked() const
835 {
836   return isLocked;
837 }
838 
839 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
840 
841 inline void G4VEmModel::SetLocked(G4bool val)
842 {
843   isLocked = val;
844 }
845 
846 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
847 
848 #endif
849