Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/utils/include/G4VEnergyLossProcess.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/G4VEnergyLossProcess.hh (Version 11.3.0) and /processes/electromagnetic/utils/include/G4VEnergyLossProcess.hh (Version 9.6.p4)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
                                                   >>  26 // $Id$
                                                   >>  27 // GEANT4 tag $Name:
 26 //                                                 28 //
 27 // -------------------------------------------     29 // -------------------------------------------------------------------
 28 //                                                 30 //
 29 // GEANT4 Class header file                        31 // GEANT4 Class header file
 30 //                                                 32 //
 31 //                                                 33 //
 32 // File name:     G4VEnergyLossProcess             34 // File name:     G4VEnergyLossProcess
 33 //                                                 35 //
 34 // Author:        Vladimir Ivanchenko on base      36 // Author:        Vladimir Ivanchenko on base of Laszlo Urban code
 35 //                                                 37 //
 36 // Creation date: 03.01.2002                       38 // Creation date: 03.01.2002
 37 //                                                 39 //
 38 // Modifications: Vladimir Ivanchenko          <<  40 // Modifications:
                                                   >>  41 //
                                                   >>  42 // 26-12-02 Secondary production moved to derived classes (V.Ivanchenko)
                                                   >>  43 // 20-01-03 Migrade to cut per region (V.Ivanchenko)
                                                   >>  44 // 24-01-03 Make models region aware (V.Ivanchenko)
                                                   >>  45 // 05-02-03 Fix compilation warnings (V.Ivanchenko)
                                                   >>  46 // 13-02-03 SubCutoffProcessors defined for regions (V.Ivanchenko)
                                                   >>  47 // 17-02-03 Fix problem of store/restore tables (V.Ivanchenko)
                                                   >>  48 // 26-02-03 Region dependent step limit (V.Ivanchenko)
                                                   >>  49 // 26-03-03 Add GetDEDXDispersion (V.Ivanchenko)
                                                   >>  50 // 09-04-03 Fix problem of negative range limit for non integral (V.Ivanchenko)
                                                   >>  51 // 13-05-03 Add calculation of precise range (V.Ivanchenko)
                                                   >>  52 // 21-07-03 Add UpdateEmModel method (V.Ivanchenko)
                                                   >>  53 // 12-11-03 G4EnergyLossSTD -> G4EnergyLossProcess (V.Ivanchenko)
                                                   >>  54 // 14-01-04 Activate precise range calculation (V.Ivanchenko)
                                                   >>  55 // 10-03-04 Fix problem of step limit calculation (V.Ivanchenko)
                                                   >>  56 // 30-06-04 make destructor virtual (V.Ivanchenko)
                                                   >>  57 // 05-07-04 fix problem of GenericIons seen at small cuts (V.Ivanchenko)
                                                   >>  58 // 03-08-04 Add DEDX table to all processes for control on integral range(VI)
                                                   >>  59 // 06-08-04 Clear up names of member functions (V.Ivanchenko)
                                                   >>  60 // 27-08-04 Add NeedBuildTables method (V.Ivanchneko)
                                                   >>  61 // 09-09-04 Bug fix for the integral mode with 2 peaks (V.Ivanchneko)
                                                   >>  62 // 08-11-04 Migration to new interface of Store/Retrieve tables (V.Ivanchenko)
                                                   >>  63 // 08-04-05 Major optimisation of internal interfaces (V.Ivanchenko)
                                                   >>  64 // 11-04-05 Use MaxSecondaryEnergy from a model (V.Ivanchenko)
                                                   >>  65 // 10-01-05 Remove SetStepLimits (V.Ivanchenko)
                                                   >>  66 // 10-01-06 PreciseRange -> CSDARange (V.Ivantchenko)
                                                   >>  67 // 13-01-06 Remove AddSubCutSecondaries and cleanup (V.Ivantchenko)
                                                   >>  68 // 20-01-06 Introduce G4EmTableType and reducing number of methods (VI)
                                                   >>  69 // 26-01-06 Add public method GetCSDARange (V.Ivanchenko)
                                                   >>  70 // 22-03-06 Add SetDynamicMassCharge (V.Ivanchenko)
                                                   >>  71 // 23-03-06 Use isIonisation flag (V.Ivanchenko)
                                                   >>  72 // 13-05-06 Add method to access model by index (V.Ivanchenko)
                                                   >>  73 // 14-01-07 add SetEmModel(index) and SetFluctModel() (mma)
                                                   >>  74 // 15-01-07 Add separate ionisation tables and reorganise get/set methods for
                                                   >>  75 //          dedx tables (V.Ivanchenko)
                                                   >>  76 // 13-03-07 use SafetyHelper instead of navigator (V.Ivanchenko)
                                                   >>  77 // 27-07-07 use stl vector for emModels instead of C-array (V.Ivanchenko)
                                                   >>  78 // 25-09-07 More accurate handling zero xsect in 
                                                   >>  79 //          PostStepGetPhysicalInteractionLength (V.Ivanchenko)
                                                   >>  80 // 27-10-07 Virtual functions moved to source (V.Ivanchenko)
                                                   >>  81 // 15-07-08 Reorder class members for further multi-thread development (VI)
 39 //                                                 82 //
 40 // Class Description:                              83 // Class Description:
 41 //                                                 84 //
 42 // It is the unified energy loss process it ca     85 // It is the unified energy loss process it calculates the continuous
 43 // energy loss for charged particles using a s     86 // energy loss for charged particles using a set of Energy Loss
 44 // models valid for different energy regions.      87 // models valid for different energy regions. There are a possibility
 45 // to create and access to dE/dx and range tab     88 // to create and access to dE/dx and range tables, or to calculate
 46 // that information on fly.                        89 // that information on fly.
 47                                                    90 
 48 // -------------------------------------------     91 // -------------------------------------------------------------------
 49 //                                                 92 //
 50                                                    93 
 51 #ifndef G4VEnergyLossProcess_h                     94 #ifndef G4VEnergyLossProcess_h
 52 #define G4VEnergyLossProcess_h 1                   95 #define G4VEnergyLossProcess_h 1
 53                                                    96 
 54 #include "G4VContinuousDiscreteProcess.hh"         97 #include "G4VContinuousDiscreteProcess.hh"
 55 #include "globals.hh"                              98 #include "globals.hh"
 56 #include "G4Material.hh"                           99 #include "G4Material.hh"
 57 #include "G4MaterialCutsCouple.hh"                100 #include "G4MaterialCutsCouple.hh"
 58 #include "G4Track.hh"                             101 #include "G4Track.hh"
 59 #include "G4EmModelManager.hh"                    102 #include "G4EmModelManager.hh"
                                                   >> 103 #include "G4UnitsTable.hh"
 60 #include "G4ParticleChangeForLoss.hh"             104 #include "G4ParticleChangeForLoss.hh"
 61 #include "G4EmTableType.hh"                       105 #include "G4EmTableType.hh"
 62 #include "G4EmSecondaryParticleType.hh"        << 
 63 #include "G4PhysicsTable.hh"                      106 #include "G4PhysicsTable.hh"
 64 #include "G4PhysicsVector.hh"                     107 #include "G4PhysicsVector.hh"
 65                                                   108 
 66 class G4Step;                                     109 class G4Step;
 67 class G4ParticleDefinition;                       110 class G4ParticleDefinition;
 68 class G4EmParameters;                          << 
 69 class G4VEmModel;                                 111 class G4VEmModel;
 70 class G4VEmFluctuationModel;                      112 class G4VEmFluctuationModel;
 71 class G4DataVector;                               113 class G4DataVector;
 72 class G4Region;                                   114 class G4Region;
 73 class G4SafetyHelper;                             115 class G4SafetyHelper;
 74 class G4VAtomDeexcitation;                        116 class G4VAtomDeexcitation;
 75 class G4VSubCutProducer;                       << 
 76 class G4EmBiasingManager;                         117 class G4EmBiasingManager;
 77 class G4LossTableManager;                      << 
 78 class G4EmDataHandler;                         << 
 79                                                   118 
 80 //....oooOO0OOooo........oooOO0OOooo........oo    119 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 81                                                   120 
 82 class G4VEnergyLossProcess : public G4VContinu    121 class G4VEnergyLossProcess : public G4VContinuousDiscreteProcess
 83 {                                                 122 {
 84 public:                                           123 public:
 85                                                   124 
 86   G4VEnergyLossProcess(const G4String& name =     125   G4VEnergyLossProcess(const G4String& name = "EnergyLoss",
 87                        G4ProcessType type = fE << 126            G4ProcessType type = fElectromagnetic);
                                                   >> 127 
                                                   >> 128   virtual ~G4VEnergyLossProcess();
 88                                                   129 
 89   ~G4VEnergyLossProcess() override;            << 130 private:
                                                   >> 131   // clean vectors and arrays
                                                   >> 132   void Clean();
 90                                                   133 
 91   //------------------------------------------    134   //------------------------------------------------------------------------
 92   // Virtual methods to be implemented in conc    135   // Virtual methods to be implemented in concrete processes
 93   //------------------------------------------    136   //------------------------------------------------------------------------
 94                                                   137 
 95 protected:                                     << 138 public:
                                                   >> 139   virtual G4bool IsApplicable(const G4ParticleDefinition& p) = 0;
                                                   >> 140   
                                                   >> 141   virtual void PrintInfo() = 0;
 96                                                   142 
 97   // description of specific process parameter << 143 protected:
 98   virtual void StreamProcessInfo(std::ostream& << 
 99                                                   144 
100   virtual void InitialiseEnergyLossProcess(con    145   virtual void InitialiseEnergyLossProcess(const G4ParticleDefinition*,
101                                            con    146                                            const G4ParticleDefinition*) = 0;
102                                                   147 
103 public:                                        << 148   //------------------------------------------------------------------------
                                                   >> 149   // Methods with standard implementation; may be overwritten if needed 
                                                   >> 150   //------------------------------------------------------------------------
104                                                   151 
105   // used as low energy limit LambdaTable      << 
106   virtual G4double MinPrimaryEnergy(const G4Pa    152   virtual G4double MinPrimaryEnergy(const G4ParticleDefinition*,
107                                     const G4Ma << 153             const G4Material*, G4double cut);
                                                   >> 154 
                                                   >> 155   //------------------------------------------------------------------------
                                                   >> 156   // Virtual methods implementation common to all EM ContinuousDiscrete 
                                                   >> 157   // processes. Further inheritance is not assumed 
                                                   >> 158   //------------------------------------------------------------------------
108                                                   159 
109   // print documentation in html format        << 160 public:
110   void ProcessDescription(std::ostream& outFil << 
111                                                   161 
112   // prepare all tables                           162   // prepare all tables
113   void PreparePhysicsTable(const G4ParticleDef << 163   void PreparePhysicsTable(const G4ParticleDefinition&);
114                                                   164 
115   // build all tables                             165   // build all tables
116   void BuildPhysicsTable(const G4ParticleDefin << 166   void BuildPhysicsTable(const G4ParticleDefinition&);
117                                                   167 
118   // build a table                                168   // build a table
119   G4PhysicsTable* BuildDEDXTable(G4EmTableType    169   G4PhysicsTable* BuildDEDXTable(G4EmTableType tType = fRestricted);
120                                                   170 
121   // build a table                                171   // build a table
122   G4PhysicsTable* BuildLambdaTable(G4EmTableTy    172   G4PhysicsTable* BuildLambdaTable(G4EmTableType tType = fRestricted);
123                                                   173 
                                                   >> 174   // summary printout after initialisation
                                                   >> 175   void PrintInfoDefinition();
                                                   >> 176 
124   // Called before tracking of each new G4Trac    177   // Called before tracking of each new G4Track
125   void StartTracking(G4Track*) override;       << 178   void StartTracking(G4Track*);
126                                                   179 
127   // Step limit from AlongStep                    180   // Step limit from AlongStep 
128   G4double AlongStepGetPhysicalInteractionLeng << 181   G4double AlongStepGetPhysicalInteractionLength(const G4Track&,
129                                   const G4Trac << 182              G4double  previousStepSize,
130                                   G4double  pr << 183              G4double  currentMinimumStep,
131                                   G4double  cu << 184              G4double& currentSafety,
132                                   G4double& cu << 185              G4GPILSelection* selection);
133                                   G4GPILSelect << 
134                                                   186 
135   // Step limit from cross section                187   // Step limit from cross section
136   G4double PostStepGetPhysicalInteractionLengt << 188   G4double PostStepGetPhysicalInteractionLength(const G4Track& track,
137                                   const G4Trac << 189             G4double   previousStepSize,
138                                   G4double pre << 190             G4ForceCondition* condition);
139                                   G4ForceCondi << 
140                                                   191 
141   // AlongStep computations                       192   // AlongStep computations
142   G4VParticleChange* AlongStepDoIt(const G4Tra << 193   G4VParticleChange* AlongStepDoIt(const G4Track&, const G4Step&);
                                                   >> 194 
                                                   >> 195   // Sampling of secondaries in vicinity of geometrical boundary
                                                   >> 196   // Return sum of secodaries energy 
                                                   >> 197   G4double SampleSubCutSecondaries(std::vector<G4Track*>&, const G4Step&, 
                                                   >> 198            G4VEmModel* model, G4int matIdx); 
143                                                   199 
144   // PostStep sampling of secondaries             200   // PostStep sampling of secondaries
145   G4VParticleChange* PostStepDoIt(const G4Trac << 201   G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&);
146                                                   202 
147   // Store all PhysicsTable in files.             203   // Store all PhysicsTable in files.
148   // Return false in case of any fatal failure    204   // Return false in case of any fatal failure at I/O  
149   G4bool StorePhysicsTable(const G4ParticleDef    205   G4bool StorePhysicsTable(const G4ParticleDefinition*,
150                            const G4String& dir    206                            const G4String& directory,
151                            G4bool ascii = fals << 207          G4bool ascii = false);
152                                                   208 
153   // Retrieve all Physics from a files.           209   // Retrieve all Physics from a files.
154   // Return true if all the Physics Table are     210   // Return true if all the Physics Table are built.
155   // Return false if any fatal failure.           211   // Return false if any fatal failure. 
156   G4bool RetrievePhysicsTable(const G4Particle    212   G4bool RetrievePhysicsTable(const G4ParticleDefinition*,
157                               const G4String&     213                               const G4String& directory,
158                               G4bool ascii) ov << 214             G4bool ascii);
159                                                   215 
160 private:                                          216 private:
161                                                << 217   // store a table
162   // summary printout after initialisation     << 218   G4bool StoreTable(const G4ParticleDefinition* p, 
163   void StreamInfo(std::ostream& out, const G4P << 219         G4PhysicsTable*, G4bool ascii,
164                   G4bool rst=false) const;     << 220         const G4String& directory, 
                                                   >> 221         const G4String& tname);
                                                   >> 222 
                                                   >> 223   // retrieve a table
                                                   >> 224   G4bool RetrieveTable(const G4ParticleDefinition* p, 
                                                   >> 225            G4PhysicsTable*, G4bool ascii,
                                                   >> 226            const G4String& directory, 
                                                   >> 227            const G4String& tname, 
                                                   >> 228            G4bool mandatory);
165                                                   229 
166   //------------------------------------------    230   //------------------------------------------------------------------------
167   // Public interface to cross section, mfp an    231   // Public interface to cross section, mfp and sampling of fluctuations
168   // These methods are not used in run time       232   // These methods are not used in run time
169   //------------------------------------------    233   //------------------------------------------------------------------------
170                                                   234 
171 public:                                           235 public:
172                                                << 
173   // access to dispersion of restricted energy    236   // access to dispersion of restricted energy loss
174   G4double GetDEDXDispersion(const G4MaterialC    237   G4double GetDEDXDispersion(const G4MaterialCutsCouple *couple,
175                              const G4DynamicPa << 238            const G4DynamicParticle* dp,
176                              G4double length); << 239            G4double length);
177                                                   240 
178   // Access to cross section table                241   // Access to cross section table
179   G4double CrossSectionPerVolume(G4double kine    242   G4double CrossSectionPerVolume(G4double kineticEnergy,
180                                  const G4Mater << 243          const G4MaterialCutsCouple* couple);
181   G4double CrossSectionPerVolume(G4double kine << 
182                                  const G4Mater << 
183                                  G4double logK << 
184                                                   244 
185   // access to cross section                      245   // access to cross section
186   G4double MeanFreePath(const G4Track& track);    246   G4double MeanFreePath(const G4Track& track);
187                                                   247 
188   // access to step limit                         248   // access to step limit
189   G4double ContinuousStepLimit(const G4Track&     249   G4double ContinuousStepLimit(const G4Track& track,
190                                G4double previo << 250              G4double previousStepSize,
191                                G4double curren << 251              G4double currentMinimumStep,
192                                G4double& curre << 252              G4double& currentSafety);
193                                                   253 
194 protected:                                        254 protected:
195                                                   255 
196   // implementation of the pure virtual method    256   // implementation of the pure virtual method
197   G4double GetMeanFreePath(const G4Track& trac    257   G4double GetMeanFreePath(const G4Track& track,
198                            G4double previousSt << 258          G4double previousStepSize,
199                            G4ForceCondition* c << 259          G4ForceCondition* condition);
200                                                   260 
201   // implementation of the pure virtual method    261   // implementation of the pure virtual method
202   G4double GetContinuousStepLimit(const G4Trac    262   G4double GetContinuousStepLimit(const G4Track& track,
203                                   G4double pre << 263           G4double previousStepSize,
204                                   G4double cur << 264           G4double currentMinimumStep,
205                                   G4double& cu << 265           G4double& currentSafety);
                                                   >> 266 
                                                   >> 267   //------------------------------------------------------------------------
                                                   >> 268   // Run time method which may be also used by derived processes
                                                   >> 269   //------------------------------------------------------------------------
206                                                   270 
207   // creation of an empty vector for cross sec << 271   // creeation of an empty vector for cross section
208   G4PhysicsVector* LambdaPhysicsVector(const G    272   G4PhysicsVector* LambdaPhysicsVector(const G4MaterialCutsCouple*, 
209                                        G4doubl << 273                G4double cut);
210                                                   274 
211   inline std::size_t CurrentMaterialCutsCouple << 275   inline size_t CurrentMaterialCutsCoupleIndex() const;
                                                   >> 276 
                                                   >> 277   inline G4double GetCurrentRange() const;
212                                                   278 
213   //------------------------------------------    279   //------------------------------------------------------------------------
214   // Specific methods to set, access, modify m    280   // Specific methods to set, access, modify models
215   //------------------------------------------    281   //------------------------------------------------------------------------
216                                                   282 
217   // Select model in run time                     283   // Select model in run time
218   inline void SelectModel(G4double kinEnergy);    284   inline void SelectModel(G4double kinEnergy);
219                                                   285 
220 public:                                           286 public:
221   // Select model by energy and couple index   << 287   // Select model by energy and region index
222   // Not for run time processing               << 
223   inline G4VEmModel* SelectModelForMaterial(G4    288   inline G4VEmModel* SelectModelForMaterial(G4double kinEnergy, 
224                                             st << 289               size_t& idx) const;
225                                                   290 
226   // Add EM model coupled with fluctuation mod    291   // Add EM model coupled with fluctuation model for region, smaller value 
227   // of order defines which pair of models wil    292   // of order defines which pair of models will be selected for a given 
228   // energy interval                              293   // energy interval  
229   void AddEmModel(G4int, G4VEmModel*,             294   void AddEmModel(G4int, G4VEmModel*, 
230                   G4VEmFluctuationModel* fluc  << 295       G4VEmFluctuationModel* fluc = 0,
231                   const G4Region* region = nul << 296       const G4Region* region = 0);
232                                                   297 
233   // Assign a model to a process local list, t << 298   // Define new energy range for the model identified by the name
234   // the derived process should execute AddEmM << 299   void UpdateEmModel(const G4String&, G4double, G4double);
235   void SetEmModel(G4VEmModel*, G4int index=0); << 
236                                                   300 
237   // Access to models                          << 301   // Assign a model to a process
238   inline std::size_t NumberOfModels() const;   << 302   void SetEmModel(G4VEmModel*, G4int index=1);
239                                                   303   
240   // Return a model from the local list        << 304   // return the assigned model
241   inline G4VEmModel* EmModel(std::size_t index << 305   G4VEmModel* EmModel(G4int index=1);
242                                                   306   
243   // Access to models from G4EmModelManager li << 307   // Access to models
244   inline G4VEmModel* GetModelByIndex(std::size << 308   G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false);
                                                   >> 309 
                                                   >> 310   G4int NumberOfModels();
245                                                   311 
246   // Assign a fluctuation model to a process      312   // Assign a fluctuation model to a process
247   inline void SetFluctModel(G4VEmFluctuationMo << 313   void SetFluctModel(G4VEmFluctuationModel*);
248                                                   314   
249   // Return the assigned fluctuation model     << 315   // return the assigned fluctuation model
250   inline G4VEmFluctuationModel* FluctModel() c << 316   inline G4VEmFluctuationModel* FluctModel();
251                                                   317     
252   //------------------------------------------    318   //------------------------------------------------------------------------
253   // Define and access particle type              319   // Define and access particle type 
254   //------------------------------------------    320   //------------------------------------------------------------------------
255                                                   321 
256 protected:                                        322 protected:
257   inline void SetParticle(const G4ParticleDefi    323   inline void SetParticle(const G4ParticleDefinition* p);
258   inline void SetSecondaryParticle(const G4Par    324   inline void SetSecondaryParticle(const G4ParticleDefinition* p);
259                                                   325 
260 public:                                           326 public:
261   inline void SetBaseParticle(const G4Particle    327   inline void SetBaseParticle(const G4ParticleDefinition* p);
262   inline const G4ParticleDefinition* Particle(    328   inline const G4ParticleDefinition* Particle() const;
263   inline const G4ParticleDefinition* BaseParti    329   inline const G4ParticleDefinition* BaseParticle() const;
264   inline const G4ParticleDefinition* Secondary    330   inline const G4ParticleDefinition* SecondaryParticle() const;
265                                                   331 
266   // hide  assignment operator                 << 
267   G4VEnergyLossProcess(G4VEnergyLossProcess &) << 
268   G4VEnergyLossProcess & operator=(const G4VEn << 
269                                                << 
270   //------------------------------------------    332   //------------------------------------------------------------------------
271   // Get/set parameters to configure the proce    333   // Get/set parameters to configure the process at initialisation time
272   //------------------------------------------    334   //------------------------------------------------------------------------
273                                                   335 
274   // Add subcut processor for the region       << 336   // Add subcutoff option for the region
275   void ActivateSubCutoff(const G4Region* regio << 337   void ActivateSubCutoff(G4bool val, const G4Region* region = 0);
276                                                   338 
277   // Activate biasing                             339   // Activate biasing
278   void SetCrossSectionBiasingFactor(G4double f    340   void SetCrossSectionBiasingFactor(G4double f, G4bool flag = true);
279                                                   341 
280   void ActivateForcedInteraction(G4double leng << 342   void ActivateForcedInteraction(G4double length = 0.0, 
281                                  const G4Strin << 343          const G4String& region = "",
282                                  G4bool flag = << 344          G4bool flag = true);
283                                                   345 
284   void ActivateSecondaryBiasing(const G4String    346   void ActivateSecondaryBiasing(const G4String& region, G4double factor,
285                                 G4double energ << 347         G4double energyLimit);
                                                   >> 348 
                                                   >> 349   // Add subcutoff process (bremsstrahlung) to sample secondary 
                                                   >> 350   // particle production in vicinity of the geometry boundary
                                                   >> 351   void AddCollaborativeProcess(G4VEnergyLossProcess*);
286                                                   352 
287   inline void SetLossFluctuations(G4bool val);    353   inline void SetLossFluctuations(G4bool val);
                                                   >> 354   inline void SetRandomStep(G4bool val);
288                                                   355 
289   inline void SetSpline(G4bool val);           << 356   inline void SetIntegral(G4bool val);
290   inline void SetCrossSectionType(G4CrossSecti << 357   inline G4bool IsIntegral() const;
291   inline G4CrossSectionType CrossSectionType() << 
292                                                   358 
293   // Set/Get flag "isIonisation"                  359   // Set/Get flag "isIonisation"
294   void SetIonisation(G4bool val);              << 360   inline void SetIonisation(G4bool val);
295   inline G4bool IsIonisationProcess() const;      361   inline G4bool IsIonisationProcess() const;
296                                                   362 
297   // Redefine parameteters for stepping contro    363   // Redefine parameteters for stepping control
298   void SetLinearLossLimit(G4double val);       << 364   inline void SetLinearLossLimit(G4double val);
299   void SetStepFunction(G4double v1, G4double v << 365   inline void SetMinSubRange(G4double val);
300   void SetLowestEnergyLimit(G4double);         << 366   inline void SetLambdaFactor(G4double val);
                                                   >> 367   inline void SetStepFunction(G4double v1, G4double v2);
                                                   >> 368   inline void SetLowestEnergyLimit(G4double);
301                                                   369 
302   inline G4int NumberOfSubCutoffRegions() cons    370   inline G4int NumberOfSubCutoffRegions() const;
303                                                   371 
304   //------------------------------------------    372   //------------------------------------------------------------------------
305   // Specific methods to path Physics Tables t    373   // Specific methods to path Physics Tables to the process
306   //------------------------------------------    374   //------------------------------------------------------------------------
307                                                   375 
308   void SetDEDXTable(G4PhysicsTable* p, G4EmTab    376   void SetDEDXTable(G4PhysicsTable* p, G4EmTableType tType);
309   void SetCSDARangeTable(G4PhysicsTable* pRang    377   void SetCSDARangeTable(G4PhysicsTable* pRange);
310   void SetRangeTableForLoss(G4PhysicsTable* p)    378   void SetRangeTableForLoss(G4PhysicsTable* p);
                                                   >> 379   void SetSecondaryRangeTable(G4PhysicsTable* p);
311   void SetInverseRangeTable(G4PhysicsTable* p)    380   void SetInverseRangeTable(G4PhysicsTable* p);
312   void SetLambdaTable(G4PhysicsTable* p);      << 
313                                                   381 
314   void SetTwoPeaksXS(std::vector<G4TwoPeaksXS* << 382   void SetLambdaTable(G4PhysicsTable* p);
315   void SetEnergyOfCrossSectionMax(std::vector< << 383   void SetSubLambdaTable(G4PhysicsTable* p);
316                                                   384 
317   //------------------------------------------ << 385   // Binning for dEdx, range, inverse range and labda tables
318   // Specific methods to define custom Physics << 386   inline void SetDEDXBinning(G4int nbins);
319   //------------------------------------------ << 387   inline void SetLambdaBinning(G4int nbins);
320                                                   388 
321   // Binning for dEdx, range, inverse range an << 389   // Binning for dEdx, range, and inverse range tables
322   void SetDEDXBinning(G4int nbins);            << 390   inline void SetDEDXBinningForCSDARange(G4int nbins);
323                                                   391 
324   // Min kinetic energy for tables                392   // Min kinetic energy for tables
325   void SetMinKinEnergy(G4double e);            << 393   inline void SetMinKinEnergy(G4double e);
326   inline G4double MinKinEnergy() const;           394   inline G4double MinKinEnergy() const;
327                                                   395 
328   // Max kinetic energy for tables                396   // Max kinetic energy for tables
329   void SetMaxKinEnergy(G4double e);            << 397   inline void SetMaxKinEnergy(G4double e);
330   inline G4double MaxKinEnergy() const;           398   inline G4double MaxKinEnergy() const;
331                                                   399 
                                                   >> 400   // Max kinetic energy for tables
                                                   >> 401   inline void SetMaxKinEnergyForCSDARange(G4double e);
                                                   >> 402 
332   // Biasing parameters                           403   // Biasing parameters
333   inline G4double CrossSectionBiasingFactor()     404   inline G4double CrossSectionBiasingFactor() const;
334                                                   405 
335   // Return values for given G4MaterialCutsCou    406   // Return values for given G4MaterialCutsCouple
336   inline G4double GetDEDX(G4double kineticEner << 407   inline G4double GetDEDX(G4double& kineticEnergy, const G4MaterialCutsCouple*);
337   inline G4double GetCSDADEDX(G4double kinetic << 408   inline G4double GetDEDXForSubsec(G4double& kineticEnergy, 
338                               const G4Material << 409            const G4MaterialCutsCouple*);
339   inline G4double GetDEDX(G4double kineticEner << 410   inline G4double GetRange(G4double& kineticEnergy, const G4MaterialCutsCouple*);
340                           G4double logKineticE << 411   inline G4double GetCSDARange(G4double& kineticEnergy, const G4MaterialCutsCouple*);
341   inline G4double GetRange(G4double kineticEne << 412   inline G4double GetRangeForLoss(G4double& kineticEnergy, const G4MaterialCutsCouple*);
342   inline G4double GetRange(G4double kineticEne << 413   inline G4double GetKineticEnergy(G4double& range, const G4MaterialCutsCouple*);
343                            G4double logKinetic << 414   inline G4double GetLambda(G4double& kineticEnergy, const G4MaterialCutsCouple*);
344   inline G4double GetCSDARange(G4double kineti << 
345                                const G4Materia << 
346   inline G4double GetKineticEnergy(G4double ra << 
347                                    const G4Mat << 
348   inline G4double GetLambda(G4double kineticEn << 
349   inline G4double GetLambda(G4double kineticEn << 
350                             G4double logKineti << 
351                                                   415 
352   inline G4bool TablesAreBuilt() const;           416   inline G4bool TablesAreBuilt() const;
353                                                   417 
354   // Access to specific tables                    418   // Access to specific tables
355   inline G4PhysicsTable* DEDXTable() const;       419   inline G4PhysicsTable* DEDXTable() const;
                                                   >> 420   inline G4PhysicsTable* DEDXTableForSubsec() const;
356   inline G4PhysicsTable* DEDXunRestrictedTable    421   inline G4PhysicsTable* DEDXunRestrictedTable() const;
357   inline G4PhysicsTable* IonisationTable() con    422   inline G4PhysicsTable* IonisationTable() const;
                                                   >> 423   inline G4PhysicsTable* IonisationTableForSubsec() const;
358   inline G4PhysicsTable* CSDARangeTable() cons    424   inline G4PhysicsTable* CSDARangeTable() const;
359   inline G4PhysicsTable* RangeTableForLoss() c    425   inline G4PhysicsTable* RangeTableForLoss() const;
360   inline G4PhysicsTable* InverseRangeTable() c    426   inline G4PhysicsTable* InverseRangeTable() const;
361   inline G4PhysicsTable* LambdaTable() const;  << 427   inline G4PhysicsTable* LambdaTable();
362   inline std::vector<G4TwoPeaksXS*>* TwoPeaksX << 428   inline G4PhysicsTable* SubLambdaTable();
363   inline std::vector<G4double>* EnergyOfCrossS << 
364                                                << 
365   inline G4bool UseBaseMaterial() const;       << 
366                                                   429 
367   //------------------------------------------    430   //------------------------------------------------------------------------
368   // Run time method for simulation of ionisat    431   // Run time method for simulation of ionisation
369   //------------------------------------------    432   //------------------------------------------------------------------------
370                                                   433 
371   // access atom on which interaction happens     434   // access atom on which interaction happens
372   const G4Element* GetCurrentElement() const;     435   const G4Element* GetCurrentElement() const;
373                                                   436 
                                                   >> 437   // sample range at the end of a step
                                                   >> 438   //  inline G4double SampleRange();
                                                   >> 439 
374   // Set scaling parameters for ions is needed    440   // Set scaling parameters for ions is needed to G4EmCalculator
375   void SetDynamicMassCharge(G4double massratio << 441   inline void SetDynamicMassCharge(G4double massratio, G4double charge2ratio);
376                                                   442 
377 private:                                          443 private:
378                                                   444 
379   void FillSecondariesAlongStep(G4double weigh << 445   void FillSecondariesAlongStep(G4double& eloss, G4double& weight);
380                                                << 
381   void PrintWarning(const G4String&, G4double  << 
382                                                   446 
383   // define material and indexes                  447   // define material and indexes
384   inline void DefineMaterial(const G4MaterialC    448   inline void DefineMaterial(const G4MaterialCutsCouple* couple);
385                                                   449 
386   //------------------------------------------    450   //------------------------------------------------------------------------
387   // Compute values using scaling relation, ma    451   // Compute values using scaling relation, mass and charge of based particle
388   //------------------------------------------    452   //------------------------------------------------------------------------
389   inline G4double GetDEDXForScaledEnergy(G4dou << 
390   inline G4double GetDEDXForScaledEnergy(G4dou << 
391                                          G4dou << 
392   inline G4double GetIonisationForScaledEnergy << 
393   inline G4double GetScaledRangeForScaledEnerg << 
394   inline G4double GetScaledRangeForScaledEnerg << 
395                                                << 
396                                                << 
397   inline G4double GetLimitScaledRangeForScaled << 
398   inline G4double GetLimitScaledRangeForScaled << 
399                                                << 
400                                                   453 
                                                   >> 454   inline G4double GetDEDXForScaledEnergy(G4double scaledKinEnergy);
                                                   >> 455   inline G4double GetSubDEDXForScaledEnergy(G4double scaledKinEnergy);
                                                   >> 456   inline G4double GetIonisationForScaledEnergy(G4double scaledKinEnergy);
                                                   >> 457   inline G4double GetSubIonisationForScaledEnergy(G4double scaledKinEnergy);
                                                   >> 458   inline G4double GetScaledRangeForScaledEnergy(G4double scaledKinEnergy);
                                                   >> 459   inline G4double GetLimitScaledRangeForScaledEnergy(G4double scaledKinEnergy);
401   inline G4double ScaledKinEnergyForLoss(G4dou    460   inline G4double ScaledKinEnergyForLoss(G4double range);
402   inline G4double GetLambdaForScaledEnergy(G4d << 461   inline G4double GetLambdaForScaledEnergy(G4double scaledKinEnergy);
403   inline G4double GetLambdaForScaledEnergy(G4d << 462   inline void ComputeLambdaForScaledEnergy(G4double scaledKinEnergy);
404                                            G4d << 
405                                                   463 
406   inline G4double LogScaledEkin(const G4Track& << 464   // hide  assignment operator
407                                                << 465   G4VEnergyLossProcess(G4VEnergyLossProcess &);
408   void ComputeLambdaForScaledEnergy(G4double s << 466   G4VEnergyLossProcess & operator=(const G4VEnergyLossProcess &right);
409                                     const G4Tr << 
410                                                   467 
411   G4bool IsRegionForCubcutProcessor(const G4Tr << 468   // ======== Parameters of the class fixed at construction =========
412                                                   469 
413 protected:                                     << 470   G4EmModelManager*           modelManager;
                                                   >> 471   G4EmBiasingManager*         biasManager;
                                                   >> 472   G4SafetyHelper*             safetyHelper;
414                                                   473 
415   G4ParticleChangeForLoss     fParticleChange; << 474   const G4ParticleDefinition* secondaryParticle;
416   const G4Material*           currentMaterial  << 475   const G4ParticleDefinition* theElectron;
417   const G4MaterialCutsCouple* currentCouple =  << 476   const G4ParticleDefinition* thePositron;
                                                   >> 477   const G4ParticleDefinition* theGamma;
                                                   >> 478   const G4ParticleDefinition* theGenericIon;
                                                   >> 479 
                                                   >> 480   //  G4PhysicsVector*            vstrag;
                                                   >> 481 
                                                   >> 482   // ======== Parameters of the class fixed at initialisation =======
                                                   >> 483 
                                                   >> 484   std::vector<G4VEmModel*>              emModels;
                                                   >> 485   G4VEmFluctuationModel*                fluctModel;
                                                   >> 486   G4VAtomDeexcitation*                  atomDeexcitation;
                                                   >> 487   std::vector<const G4Region*>          scoffRegions;
                                                   >> 488   G4int                                 nSCoffRegions;
                                                   >> 489   G4bool*                               idxSCoffRegions;
                                                   >> 490 
                                                   >> 491   std::vector<G4VEnergyLossProcess*>    scProcesses;
                                                   >> 492   G4int                                 nProcesses;
                                                   >> 493 
                                                   >> 494   // tables and vectors
                                                   >> 495   G4PhysicsTable*             theDEDXTable;
                                                   >> 496   G4PhysicsTable*             theDEDXSubTable;
                                                   >> 497   G4PhysicsTable*             theDEDXunRestrictedTable;
                                                   >> 498   G4PhysicsTable*             theIonisationTable;
                                                   >> 499   G4PhysicsTable*             theIonisationSubTable;
                                                   >> 500   G4PhysicsTable*             theRangeTableForLoss;
                                                   >> 501   G4PhysicsTable*             theCSDARangeTable;
                                                   >> 502   G4PhysicsTable*             theSecondaryRangeTable;
                                                   >> 503   G4PhysicsTable*             theInverseRangeTable;
                                                   >> 504   G4PhysicsTable*             theLambdaTable;
                                                   >> 505   G4PhysicsTable*             theSubLambdaTable;
                                                   >> 506 
                                                   >> 507   std::vector<G4double>       theDEDXAtMaxEnergy;
                                                   >> 508   std::vector<G4double>       theRangeAtMaxEnergy;
                                                   >> 509   std::vector<G4double>       theEnergyOfCrossSectionMax;
                                                   >> 510   std::vector<G4double>       theCrossSectionMax;
                                                   >> 511 
                                                   >> 512   const std::vector<G4double>* theDensityFactor;
                                                   >> 513   const std::vector<G4int>*    theDensityIdx;
418                                                   514 
419 private:                                       << 515   const G4DataVector*         theCuts;
                                                   >> 516   const G4DataVector*         theSubCuts;
420                                                   517 
421   G4LossTableManager*         lManager;        << 518   const G4ParticleDefinition* baseParticle;
422   G4EmModelManager*           modelManager;    << 
423   G4VEmModel*                 currentModel = n << 
424   G4EmBiasingManager*         biasManager = nu << 
425   G4SafetyHelper*             safetyHelper;    << 
426   G4EmParameters*             theParameters;   << 
427   G4VEmFluctuationModel*      fluctModel = nul << 
428   G4VAtomDeexcitation*        atomDeexcitation << 
429   G4VSubCutProducer*          subcutProducer = << 
430                                                << 
431   const G4ParticleDefinition* particle = nullp << 
432   const G4ParticleDefinition* baseParticle = n << 
433   const G4ParticleDefinition* secondaryParticl << 
434   G4EmDataHandler* theData = nullptr;          << 
435                                                << 
436   G4PhysicsTable* theDEDXTable = nullptr;      << 
437   G4PhysicsTable* theDEDXunRestrictedTable = n << 
438   G4PhysicsTable* theIonisationTable = nullptr << 
439   G4PhysicsTable* theRangeTableForLoss = nullp << 
440   G4PhysicsTable* theCSDARangeTable = nullptr; << 
441   G4PhysicsTable* theInverseRangeTable = nullp << 
442   G4PhysicsTable* theLambdaTable = nullptr;    << 
443                                                << 
444   std::vector<const G4Region*>* scoffRegions = << 
445   std::vector<G4VEmModel*>*     emModels = nul << 
446   const std::vector<G4int>*     theDensityIdx  << 
447   const std::vector<G4double>*  theDensityFact << 
448   const G4DataVector*           theCuts = null << 
449                                                   519 
450   std::vector<G4double>* theEnergyOfCrossSecti << 520   G4int    nBins;
451   std::vector<G4TwoPeaksXS*>* fXSpeaks = nullp << 521   G4int    nBinsCSDA;
452                                                   522 
453   G4double lowestKinEnergy;                       523   G4double lowestKinEnergy;
454   G4double minKinEnergy;                          524   G4double minKinEnergy;
455   G4double maxKinEnergy;                          525   G4double maxKinEnergy;
456   G4double maxKinEnergyCSDA;                      526   G4double maxKinEnergyCSDA;
457                                                   527 
458   G4double linLossLimit = 0.01;                << 528   G4double linLossLimit;
459   G4double dRoverRange = 0.2;                  << 529   G4double minSubRange;
                                                   >> 530   G4double dRoverRange;
460   G4double finalRange;                            531   G4double finalRange;
461   G4double lambdaFactor = 0.8;                 << 532   G4double lambdaFactor;
462   G4double invLambdaFactor;                    << 533   G4double biasFactor;
463   G4double biasFactor = 1.0;                   << 534 
464                                                << 535   G4bool   lossFluctuationFlag;
465   G4double massRatio = 1.0;                    << 536   G4bool   rndmStepFlag;
466   G4double logMassRatio = 0.0;                 << 537   G4bool   tablesAreBuilt;
467   G4double fFactor = 1.0;                      << 538   G4bool   integral;
468   G4double reduceFactor = 1.0;                 << 539   G4bool   isIon;
469   G4double chargeSqRatio = 1.0;                << 540   G4bool   isIonisation;
470   G4double fRange = 0.0;                       << 541   G4bool   useSubCutoff;
471   G4double fRangeEnergy = 0.0;                 << 542   G4bool   useDeexcitation;
                                                   >> 543   G4bool   biasFlag;
                                                   >> 544   G4bool   weightFlag;
472                                                   545 
473 protected:                                        546 protected:
474                                                   547 
475   G4double preStepLambda = 0.0;                << 548   G4ParticleChangeForLoss          fParticleChange;
476   G4double preStepKinEnergy = 0.0;             << 
477   G4double preStepScaledEnergy = 0.0;          << 
478   G4double mfpKinEnergy = 0.0;                 << 
479                                                   549 
480   std::size_t currentCoupleIndex = 0;          << 550   // ======== Cashed values - may be state dependent ================
481                                                   551 
482 private:                                          552 private:
483                                                   553 
484   G4int nBins;                                 << 554   std::vector<G4DynamicParticle*>  secParticles;
485   G4int nBinsCSDA;                             << 555   std::vector<G4Track*>            scTracks;
486   G4int numberOfModels = 0;                    << 556 
487   G4int nSCoffRegions = 0;                     << 557   const G4ParticleDefinition* particle;
488   G4int secID = _DeltaElectron;                << 558 
489   G4int tripletID = _TripletElectron;          << 559   G4VEmModel*                 currentModel;
490   G4int biasID = _DeltaEBelowCut;              << 560   const G4Material*           currentMaterial;
491   G4int epixeID = _ePIXE;                      << 561   const G4MaterialCutsCouple* currentCouple;
492   G4int gpixeID = _GammaPIXE;                  << 562   size_t                      currentCoupleIndex;
493   G4int mainSecondaries = 1;                   << 563   size_t                      basedCoupleIndex;
494                                                << 564 
495   std::size_t basedCoupleIndex = 0;            << 565   G4int    nWarnings;
496   std::size_t coupleIdxRange = 0;              << 566 
497   std::size_t idxDEDX = 0;                     << 567   G4double massRatio;
498   std::size_t idxDEDXunRestricted = 0;         << 568   G4double fFactor;
499   std::size_t idxIonisation = 0;               << 569   G4double reduceFactor;
500   std::size_t idxRange = 0;                    << 570   G4double chargeSqRatio;
501   std::size_t idxCSDA = 0;                     << 571 
502   std::size_t idxSecRange = 0;                 << 572   G4double preStepLambda;
503   std::size_t idxInverseRange = 0;             << 573   G4double fRange;
504   std::size_t idxLambda = 0;                   << 574   G4double preStepKinEnergy;
505                                                << 575   G4double preStepScaledEnergy;
506   G4GPILSelection aGPILSelection;              << 576   G4double mfpKinEnergy;
507   G4CrossSectionType fXSType = fEmOnePeak;     << 577 
508                                                << 578   G4GPILSelection  aGPILSelection;
509   G4bool lossFluctuationFlag = true;           << 
510   G4bool useCutAsFinalRange = false;           << 
511   G4bool tablesAreBuilt = false;               << 
512   G4bool spline = true;                        << 
513   G4bool isIon = false;                        << 
514   G4bool isIonisation = false;                 << 
515   G4bool useDeexcitation = false;              << 
516   G4bool biasFlag = false;                     << 
517   G4bool weightFlag = false;                   << 
518   G4bool isMaster = false;                     << 
519   G4bool baseMat = false;                      << 
520   G4bool actLinLossLimit = false;              << 
521   G4bool actLossFluc = false;                  << 
522   G4bool actBinning = false;                   << 
523   G4bool actMinKinEnergy = false;              << 
524   G4bool actMaxKinEnergy = false;              << 
525                                                   579 
526   std::vector<G4DynamicParticle*> secParticles << 
527   std::vector<G4Track*> scTracks;              << 
528 };                                                580 };
529                                                   581 
530 // ======== Run time inline methods ==========    582 // ======== Run time inline methods ================
531                                                   583 
532 inline std::size_t G4VEnergyLossProcess::Curre << 584 inline size_t G4VEnergyLossProcess::CurrentMaterialCutsCoupleIndex() const 
533 {                                                 585 {
534   return currentCoupleIndex;                      586   return currentCoupleIndex;
535 }                                                 587 }
536                                                   588 
537 //....oooOO0OOooo........oooOO0OOooo........oo    589 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 590   
                                                   >> 591 inline G4double G4VEnergyLossProcess::GetCurrentRange() const
                                                   >> 592 {
                                                   >> 593   return fRange;
                                                   >> 594 }
                                                   >> 595 
                                                   >> 596 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
538                                                   597 
539 inline void G4VEnergyLossProcess::SelectModel(    598 inline void G4VEnergyLossProcess::SelectModel(G4double kinEnergy)
540 {                                                 599 {
541   currentModel = modelManager->SelectModel(kin    600   currentModel = modelManager->SelectModel(kinEnergy, currentCoupleIndex);
542   currentModel->SetCurrentCouple(currentCouple    601   currentModel->SetCurrentCouple(currentCouple);
543 }                                                 602 }
544                                                   603 
545 //....oooOO0OOooo........oooOO0OOooo........oo    604 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
546                                                   605 
547 inline G4VEmModel* G4VEnergyLossProcess::Selec    606 inline G4VEmModel* G4VEnergyLossProcess::SelectModelForMaterial(
548                    G4double kinEnergy, std::si << 607                    G4double kinEnergy, size_t& idx) const
549 {                                                 608 {
550   return modelManager->SelectModel(kinEnergy,     609   return modelManager->SelectModel(kinEnergy, idx);
551 }                                                 610 }
552                                                   611 
553 //....oooOO0OOooo........oooOO0OOooo........oo    612 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
554                                                   613 
555 inline void                                       614 inline void 
556 G4VEnergyLossProcess::DefineMaterial(const G4M    615 G4VEnergyLossProcess::DefineMaterial(const G4MaterialCutsCouple* couple)
557 {                                                 616 {
558   if(couple != currentCouple) {                   617   if(couple != currentCouple) {
559     currentCouple = couple;                    << 618     currentCouple   = couple;
560     currentMaterial = couple->GetMaterial();      619     currentMaterial = couple->GetMaterial();
561     basedCoupleIndex = currentCoupleIndex = co << 620     currentCoupleIndex = couple->GetIndex();
562     fFactor = chargeSqRatio*biasFactor;        << 621     basedCoupleIndex   = (*theDensityIdx)[currentCoupleIndex];
563     mfpKinEnergy = DBL_MAX;                    << 622     fFactor = chargeSqRatio*biasFactor*(*theDensityFactor)[currentCoupleIndex];
564     idxLambda = 0;                             << 
565     if(baseMat) {                              << 
566       basedCoupleIndex = (*theDensityIdx)[curr << 
567       fFactor *= (*theDensityFactor)[currentCo << 
568     }                                          << 
569     reduceFactor = 1.0/(fFactor*massRatio);       623     reduceFactor = 1.0/(fFactor*massRatio);
                                                   >> 624     mfpKinEnergy = DBL_MAX;
570   }                                               625   }
571 }                                                 626 }
572                                                   627 
573 //....oooOO0OOooo........oooOO0OOooo........oo    628 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
574                                                   629 
                                                   >> 630 inline void G4VEnergyLossProcess::SetDynamicMassCharge(G4double massratio,
                                                   >> 631                                                        G4double charge2ratio)
                                                   >> 632 {
                                                   >> 633   massRatio     = massratio;
                                                   >> 634   fFactor      *= charge2ratio/chargeSqRatio;
                                                   >> 635   chargeSqRatio = charge2ratio;
                                                   >> 636   reduceFactor  = 1.0/(fFactor*massRatio);
                                                   >> 637 }
                                                   >> 638 
                                                   >> 639 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 640 
575 inline G4double G4VEnergyLossProcess::GetDEDXF    641 inline G4double G4VEnergyLossProcess::GetDEDXForScaledEnergy(G4double e)
576 {                                                 642 {
577   /*                                           << 643   //G4cout << "G4VEnergyLossProcess::GetDEDX: Idx= " 
578   G4cout << "G4VEnergyLossProcess::GetDEDX: Id << 644   //   << basedCoupleIndex << " E(MeV)= " << e << G4endl; 
579            << basedCoupleIndex << " E(MeV)= "  << 645   G4double x = fFactor*(*theDEDXTable)[basedCoupleIndex]->Value(e);
580          << " Emin= " << minKinEnergy << "  Fa << 
581          << "  " << theDEDXTable << G4endl; */ << 
582   G4double x = fFactor*(*theDEDXTable)[basedCo << 
583   if(e < minKinEnergy) { x *= std::sqrt(e/minK    646   if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); }
584   return x;                                       647   return x;
585 }                                                 648 }
586                                                   649 
587 //....oooOO0OOooo........oooOO0OOooo........oo    650 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
588                                                   651 
589 inline                                         << 652 inline G4double G4VEnergyLossProcess::GetSubDEDXForScaledEnergy(G4double e)
590 G4double G4VEnergyLossProcess::GetDEDXForScale << 
591 {                                                 653 {
592   /*                                           << 654   G4double x = fFactor*(*theDEDXSubTable)[basedCoupleIndex]->Value(e);
593   G4cout << "G4VEnergyLossProcess::GetDEDX: Id << 
594            << basedCoupleIndex << " E(MeV)= "  << 
595          << " Emin= " << minKinEnergy << "  Fa << 
596          << "  " << theDEDXTable << G4endl; */ << 
597   G4double x = fFactor*(*theDEDXTable)[basedCo << 
598   if(e < minKinEnergy) { x *= std::sqrt(e/minK    655   if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); }
599   return x;                                       656   return x;
600 }                                                 657 }
601                                                   658 
602 //....oooOO0OOooo........oooOO0OOooo........oo    659 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
603                                                   660 
604 inline G4double G4VEnergyLossProcess::GetIonis    661 inline G4double G4VEnergyLossProcess::GetIonisationForScaledEnergy(G4double e)
605 {                                                 662 {
606   G4double x =                                 << 663   G4double x = fFactor*(*theIonisationTable)[basedCoupleIndex]->Value(e);
607     fFactor*(*theIonisationTable)[basedCoupleI << 
608   if(e < minKinEnergy) { x *= std::sqrt(e/minK    664   if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); }
609   return x;                                       665   return x;
610 }                                                 666 }
611                                                   667 
612 //....oooOO0OOooo........oooOO0OOooo........oo    668 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
613                                                   669 
614 inline G4double G4VEnergyLossProcess::GetScale << 670 inline 
615 {                                              << 671 G4double G4VEnergyLossProcess::GetSubIonisationForScaledEnergy(G4double e)
616   //G4cout << "G4VEnergyLossProcess::GetScaled << 
617   //         << basedCoupleIndex << " E(MeV)=  << 
618   //         << " lastIdx= " << lastIdx << "   << 
619   if(currentCoupleIndex != coupleIdxRange || f << 
620     coupleIdxRange = currentCoupleIndex;       << 
621     fRangeEnergy = e;                          << 
622     fRange = reduceFactor*((*theRangeTableForL << 
623     if (fRange < 0.0) { fRange = 0.0; }        << 
624     else if (e < minKinEnergy) { fRange *= std << 
625   }                                            << 
626   //G4cout << "G4VEnergyLossProcess::GetScaled << 
627   //         << basedCoupleIndex << " E(MeV)=  << 
628   //         << " R=  " << computedRange << "  << 
629   return fRange;                               << 
630 }                                              << 
631                                                << 
632 inline G4double                                << 
633 G4VEnergyLossProcess::GetScaledRangeForScaledE << 
634 {                                                 672 {
635   //G4cout << "G4VEnergyLossProcess::GetScaled << 673   G4double x = fFactor*(*theIonisationSubTable)[basedCoupleIndex]->Value(e);
636   //         << basedCoupleIndex << " E(MeV)=  << 674   if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); }
637   //         << " lastIdx= " << lastIdx << "   << 675   return x;
638   if(currentCoupleIndex != coupleIdxRange || f << 
639     coupleIdxRange = currentCoupleIndex;       << 
640     fRangeEnergy = e;                          << 
641     fRange = reduceFactor*((*theRangeTableForL << 
642     if (fRange < 0.0) { fRange = 0.0; }        << 
643     else if (e < minKinEnergy) { fRange *= std << 
644   }                                            << 
645   //G4cout << "G4VEnergyLossProcess::GetScaled << 
646   //         << basedCoupleIndex << " E(MeV)=  << 
647   //         << " R=  " << fRange << "  " << t << 
648   return fRange;                               << 
649 }                                                 676 }
650                                                   677 
651 //....oooOO0OOooo........oooOO0OOooo........oo    678 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
652                                                   679 
653 inline G4double                                << 680 inline G4double G4VEnergyLossProcess::GetScaledRangeForScaledEnergy(G4double e)
654 G4VEnergyLossProcess::GetLimitScaledRangeForSc << 
655 {                                                 681 {
656   G4double x = ((*theCSDARangeTable)[basedCoup << 682   //G4cout << "G4VEnergyLossProcess::GetRange: Idx= " 
657   if (x < 0.0) { x = 0.0; }                    << 683   //   << basedCoupleIndex << " E(MeV)= " << e << G4endl; 
658   else if (e < minKinEnergy) { x *= std::sqrt( << 684   G4double x = ((*theRangeTableForLoss)[basedCoupleIndex])->Value(e);
                                                   >> 685   if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); }
659   return x;                                       686   return x;
660 }                                                 687 }
661                                                   688 
662 //....oooOO0OOooo........oooOO0OOooo........oo    689 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
663                                                   690 
664 inline G4double                                   691 inline G4double 
665 G4VEnergyLossProcess::GetLimitScaledRangeForSc << 692 G4VEnergyLossProcess::GetLimitScaledRangeForScaledEnergy(G4double e)
666                                                << 
667 {                                                 693 {
668   G4double x = ((*theCSDARangeTable)[basedCoup << 694   G4double x;
669   if (x < 0.0) { x = 0.0; }                    << 695   if (e < maxKinEnergyCSDA) {
670   else if (e < minKinEnergy) { x *= std::sqrt( << 696     x = ((*theCSDARangeTable)[basedCoupleIndex])->Value(e);
                                                   >> 697     if(e < minKinEnergy) { x *= std::sqrt(e/minKinEnergy); }
                                                   >> 698   } else {
                                                   >> 699     x = theRangeAtMaxEnergy[basedCoupleIndex] +
                                                   >> 700       (e - maxKinEnergyCSDA)/theDEDXAtMaxEnergy[basedCoupleIndex];
                                                   >> 701   }
671   return x;                                       702   return x;
672 }                                                 703 }
673                                                   704 
674 //....oooOO0OOooo........oooOO0OOooo........oo    705 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
675                                                   706 
676 inline G4double G4VEnergyLossProcess::ScaledKi    707 inline G4double G4VEnergyLossProcess::ScaledKinEnergyForLoss(G4double r)
677 {                                                 708 {
678   //G4cout << "G4VEnergyLossProcess::GetEnergy    709   //G4cout << "G4VEnergyLossProcess::GetEnergy: Idx= " 
679   //         << basedCoupleIndex << " R(mm)= " << 710   //   << basedCoupleIndex << " R(mm)= " << r << G4endl; 
680   //         << theInverseRangeTable << G4endl << 
681   G4PhysicsVector* v = (*theInverseRangeTable)    711   G4PhysicsVector* v = (*theInverseRangeTable)[basedCoupleIndex];
682   G4double rmin = v->Energy(0);                   712   G4double rmin = v->Energy(0);
683   G4double e = 0.0;                               713   G4double e = 0.0; 
684   if(r >= rmin) { e = v->Value(r, idxInverseRa << 714   if(r >= rmin) { e = v->Value(r); }
685   else if(r > 0.0) {                              715   else if(r > 0.0) {
686     G4double x = r/rmin;                          716     G4double x = r/rmin;
687     e = minKinEnergy*x*x;                         717     e = minKinEnergy*x*x;
688   }                                               718   }
689   return e;                                       719   return e;
690 }                                                 720 }
691                                                   721 
692 //....oooOO0OOooo........oooOO0OOooo........oo    722 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
693                                                   723 
694 inline G4double G4VEnergyLossProcess::GetLambd    724 inline G4double G4VEnergyLossProcess::GetLambdaForScaledEnergy(G4double e)
695 {                                                 725 {
696   return fFactor*((*theLambdaTable)[basedCoupl << 726   return fFactor*((*theLambdaTable)[basedCoupleIndex])->Value(e);
697 }                                              << 
698                                                << 
699 //....oooOO0OOooo........oooOO0OOooo........oo << 
700                                                << 
701 inline G4double                                << 
702 G4VEnergyLossProcess::GetLambdaForScaledEnergy << 
703 {                                              << 
704   return fFactor*((*theLambdaTable)[basedCoupl << 
705 }                                              << 
706                                                << 
707 //....oooOO0OOooo........oooOO0OOooo........oo << 
708                                                << 
709 inline G4double G4VEnergyLossProcess::LogScale << 
710 {                                              << 
711   return track.GetDynamicParticle()->GetLogKin << 
712 }                                                 727 }
713                                                   728 
714 //....oooOO0OOooo........oooOO0OOooo........oo    729 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
715                                                   730 
716 inline G4double                                   731 inline G4double 
717 G4VEnergyLossProcess::GetDEDX(G4double kinEner << 732 G4VEnergyLossProcess::GetDEDX(G4double& kineticEnergy,
718                               const G4Material << 733             const G4MaterialCutsCouple* couple)
719 {                                                 734 {
720   DefineMaterial(couple);                         735   DefineMaterial(couple);
721   return GetDEDXForScaledEnergy(kinEnergy*mass << 736   return GetDEDXForScaledEnergy(kineticEnergy*massRatio);
722 }                                                 737 }
723                                                   738 
724 //....oooOO0OOooo........oooOO0OOooo........oo    739 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
725                                                   740 
726 inline G4double                                   741 inline G4double 
727 G4VEnergyLossProcess::GetDEDX(G4double kinEner << 742 G4VEnergyLossProcess::GetDEDXForSubsec(G4double& kineticEnergy,
728                               const G4Material << 743                const G4MaterialCutsCouple* couple)
729                               G4double logKinE << 
730 {                                                 744 {
731   DefineMaterial(couple);                         745   DefineMaterial(couple);
732   return GetDEDXForScaledEnergy(kinEnergy*mass << 746   return GetSubDEDXForScaledEnergy(kineticEnergy*massRatio);
733 }                                                 747 }
734                                                   748 
735 //....oooOO0OOooo........oooOO0OOooo........oo    749 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
736                                                   750 
737 inline G4double                                   751 inline G4double 
738 G4VEnergyLossProcess::GetRange(G4double kinEne << 752 G4VEnergyLossProcess::GetRange(G4double& kineticEnergy,
739                                const G4Materia << 753              const G4MaterialCutsCouple* couple)
740 {                                                 754 {
741   DefineMaterial(couple);                      << 755   G4double x = fRange;
742   return GetScaledRangeForScaledEnergy(kinEner << 756   if(couple != currentCouple || kineticEnergy != preStepKinEnergy) { 
                                                   >> 757     DefineMaterial(couple);
                                                   >> 758     if(theCSDARangeTable) {
                                                   >> 759       x = GetLimitScaledRangeForScaledEnergy(kineticEnergy*massRatio)
                                                   >> 760   * reduceFactor;
                                                   >> 761     } else if(theRangeTableForLoss) {
                                                   >> 762       x = GetScaledRangeForScaledEnergy(kineticEnergy*massRatio)*reduceFactor;
                                                   >> 763     }
                                                   >> 764   }
                                                   >> 765   return x;
743 }                                                 766 }
744                                                   767 
745 //....oooOO0OOooo........oooOO0OOooo........oo    768 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
746                                                   769 
747 inline G4double                                   770 inline G4double 
748 G4VEnergyLossProcess::GetRange(G4double kinEne << 771 G4VEnergyLossProcess::GetCSDARange(G4double& kineticEnergy, 
749                                const G4Materia << 772            const G4MaterialCutsCouple* couple)
750                                G4double logKin << 
751 {                                                 773 {
752   DefineMaterial(couple);                         774   DefineMaterial(couple);
753   return GetScaledRangeForScaledEnergy(kinEner << 775   G4double x = DBL_MAX;
                                                   >> 776   if(theCSDARangeTable) {
                                                   >> 777     x = GetLimitScaledRangeForScaledEnergy(kineticEnergy*massRatio)*reduceFactor;
                                                   >> 778   }
                                                   >> 779   return x;
754 }                                                 780 }
755                                                   781 
756 //....oooOO0OOooo........oooOO0OOooo........oo    782 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
757                                                   783 
758 inline G4double                                   784 inline G4double 
759 G4VEnergyLossProcess::GetCSDARange(G4double ki << 785 G4VEnergyLossProcess::GetRangeForLoss(G4double& kineticEnergy,
760                                    const G4Mat << 786               const G4MaterialCutsCouple* couple)
761 {                                                 787 {
762   DefineMaterial(couple);                      << 788   G4double x = fRange;
763   return (nullptr == theCSDARangeTable) ? DBL_ << 789   if(couple != currentCouple || kineticEnergy != preStepKinEnergy) {
764     GetLimitScaledRangeForScaledEnergy(kinetic << 790     DefineMaterial(couple);
                                                   >> 791     x = GetScaledRangeForScaledEnergy(kineticEnergy*massRatio)*reduceFactor;
                                                   >> 792   }
                                                   >> 793   //  G4cout << "Range from " << GetProcessName() 
                                                   >> 794   //         << "  e= " << kineticEnergy << " r= " << x << G4endl;
                                                   >> 795   return x;
765 }                                                 796 }
766                                                   797 
767 //....oooOO0OOooo........oooOO0OOooo........oo    798 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
768                                                   799 
769 inline G4double                                   800 inline G4double 
770 G4VEnergyLossProcess::GetKineticEnergy(G4doubl << 801 G4VEnergyLossProcess::GetKineticEnergy(G4double& range,
771                                        const G << 802                const G4MaterialCutsCouple* couple)
772 {                                                 803 {
773   DefineMaterial(couple);                         804   DefineMaterial(couple);
774   return ScaledKinEnergyForLoss(range/reduceFa    805   return ScaledKinEnergyForLoss(range/reduceFactor)/massRatio;
775 }                                                 806 }
776                                                   807 
777 //....oooOO0OOooo........oooOO0OOooo........oo    808 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
778                                                   809 
779 inline G4double                                   810 inline G4double 
780 G4VEnergyLossProcess::GetLambda(G4double kinEn << 811 G4VEnergyLossProcess::GetLambda(G4double& kineticEnergy,
781                                 const G4Materi << 812         const G4MaterialCutsCouple* couple)
782 {                                                 813 {
783   DefineMaterial(couple);                         814   DefineMaterial(couple);
784   return (nullptr != theLambdaTable) ?         << 815   G4double x = 0.0;
785     GetLambdaForScaledEnergy(kinEnergy*massRat << 816   if(theLambdaTable) { x = GetLambdaForScaledEnergy(kineticEnergy*massRatio); }
                                                   >> 817   return x;
786 }                                                 818 }
787                                                   819 
788 //....oooOO0OOooo........oooOO0OOooo........oo    820 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
789                                                   821 
790 inline G4double                                << 822 inline void G4VEnergyLossProcess::ComputeLambdaForScaledEnergy(G4double e)
791 G4VEnergyLossProcess::GetLambda(G4double kinEn << 
792                                 const G4Materi << 
793                                 G4double logKi << 
794 {                                                 823 {
795   DefineMaterial(couple);                      << 824   mfpKinEnergy  = theEnergyOfCrossSectionMax[currentCoupleIndex];
796   return (nullptr != theLambdaTable) ?         << 825   if (e <= mfpKinEnergy) {
797     GetLambdaForScaledEnergy(kinEnergy*massRat << 826     preStepLambda = GetLambdaForScaledEnergy(e);
798     :  0.0;                                    << 827 
                                                   >> 828   } else {
                                                   >> 829     G4double e1 = e*lambdaFactor;
                                                   >> 830     if(e1 > mfpKinEnergy) {
                                                   >> 831       preStepLambda  = GetLambdaForScaledEnergy(e);
                                                   >> 832       G4double preStepLambda1 = GetLambdaForScaledEnergy(e1);
                                                   >> 833       if(preStepLambda1 > preStepLambda) {
                                                   >> 834         mfpKinEnergy = e1;
                                                   >> 835         preStepLambda = preStepLambda1;
                                                   >> 836       }
                                                   >> 837     } else {
                                                   >> 838       preStepLambda = fFactor*theCrossSectionMax[currentCoupleIndex];
                                                   >> 839     }
                                                   >> 840   }
799 }                                                 841 }
800                                                   842 
801 // ======== Get/Set inline methods used at ini    843 // ======== Get/Set inline methods used at initialisation ================
802                                                   844 
803 inline void G4VEnergyLossProcess::SetFluctMode    845 inline void G4VEnergyLossProcess::SetFluctModel(G4VEmFluctuationModel* p)
804 {                                                 846 {
805   fluctModel = p;                                 847   fluctModel = p;
806 }                                                 848 }
807                                                   849 
808 //....oooOO0OOooo........oooOO0OOooo........oo    850 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
809                                                   851 
810 inline G4VEmFluctuationModel* G4VEnergyLossPro << 852 inline G4VEmFluctuationModel* G4VEnergyLossProcess::FluctModel()
811 {                                                 853 {
812   return fluctModel;                              854   return fluctModel;
813 }                                                 855 }
814                                                   856 
815 //....oooOO0OOooo........oooOO0OOooo........oo    857 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
816                                                   858 
817 inline void G4VEnergyLossProcess::SetParticle(    859 inline void G4VEnergyLossProcess::SetParticle(const G4ParticleDefinition* p)
818 {                                                 860 {
819   particle = p;                                   861   particle = p;
820 }                                                 862 }
821                                                   863 
822 //....oooOO0OOooo........oooOO0OOooo........oo    864 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
823                                                   865 
824 inline void                                    << 866 inline void G4VEnergyLossProcess::SetSecondaryParticle(const G4ParticleDefinition* p)
825 G4VEnergyLossProcess::SetSecondaryParticle(con << 
826 {                                                 867 {
827   secondaryParticle = p;                          868   secondaryParticle = p;
828 }                                                 869 }
829                                                   870 
830 //....oooOO0OOooo........oooOO0OOooo........oo    871 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
831                                                   872 
832 inline void                                    << 873 inline void G4VEnergyLossProcess::SetBaseParticle(const G4ParticleDefinition* p)
833 G4VEnergyLossProcess::SetBaseParticle(const G4 << 
834 {                                                 874 {
835   baseParticle = p;                               875   baseParticle = p;
836 }                                                 876 }
837                                                   877 
838 //....oooOO0OOooo........oooOO0OOooo........oo    878 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
839                                                   879 
840 inline const G4ParticleDefinition* G4VEnergyLo    880 inline const G4ParticleDefinition* G4VEnergyLossProcess::Particle() const
841 {                                                 881 {
842   return particle;                                882   return particle;
843 }                                                 883 }
844                                                   884 
845 //....oooOO0OOooo........oooOO0OOooo........oo    885 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
846                                                   886 
847 inline const G4ParticleDefinition* G4VEnergyLo    887 inline const G4ParticleDefinition* G4VEnergyLossProcess::BaseParticle() const
848 {                                                 888 {
849   return baseParticle;                            889   return baseParticle;
850 }                                                 890 }
851                                                   891 
852 //....oooOO0OOooo........oooOO0OOooo........oo    892 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
853                                                   893 
854 inline const G4ParticleDefinition*             << 894 inline const G4ParticleDefinition* G4VEnergyLossProcess::SecondaryParticle() const
855 G4VEnergyLossProcess::SecondaryParticle() cons << 
856 {                                                 895 {
857   return secondaryParticle;                       896   return secondaryParticle;
858 }                                                 897 }
859                                                   898 
860 //....oooOO0OOooo........oooOO0OOooo........oo    899 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
861                                                   900 
862 inline void G4VEnergyLossProcess::SetLossFluct    901 inline void G4VEnergyLossProcess::SetLossFluctuations(G4bool val)
863 {                                                 902 {
864   lossFluctuationFlag = val;                      903   lossFluctuationFlag = val;
865   actLossFluc = true;                          << 
866 }                                                 904 }
867                                                   905 
868 //....oooOO0OOooo........oooOO0OOooo........oo    906 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
869                                                   907 
870 inline void G4VEnergyLossProcess::SetSpline(G4 << 908 inline void G4VEnergyLossProcess::SetRandomStep(G4bool val)
871 {                                                 909 {
872   spline = val;                                << 910   rndmStepFlag = val;
873 }                                                 911 }
874                                                   912 
875 //....oooOO0OOooo........oooOO0OOooo........oo    913 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
876                                                   914 
877 inline void G4VEnergyLossProcess::SetCrossSect << 915 inline void G4VEnergyLossProcess::SetIntegral(G4bool val)
878 {                                                 916 {
879   fXSType = val;                               << 917   integral = val;
880 }                                                 918 }
881                                                   919 
882 //....oooOO0OOooo........oooOO0OOooo........oo    920 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
883                                                   921   
884 inline G4CrossSectionType G4VEnergyLossProcess << 922 inline G4bool G4VEnergyLossProcess::IsIntegral() const 
885 {                                                 923 {
886   return fXSType;                              << 924   return integral;
                                                   >> 925 }
                                                   >> 926 
                                                   >> 927 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 928 
                                                   >> 929 inline void G4VEnergyLossProcess::SetIonisation(G4bool val)
                                                   >> 930 {
                                                   >> 931   isIonisation = val;
                                                   >> 932   if(val) { aGPILSelection = CandidateForSelection; }
                                                   >> 933   else    { aGPILSelection = NotCandidateForSelection; }
887 }                                                 934 }
888                                                   935 
889 //....oooOO0OOooo........oooOO0OOooo........oo    936 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
890                                                   937 
891 inline G4bool G4VEnergyLossProcess::IsIonisati    938 inline G4bool G4VEnergyLossProcess::IsIonisationProcess() const
892 {                                                 939 {
893   return isIonisation;                            940   return isIonisation;
894 }                                                 941 }
895                                                   942 
896 //....oooOO0OOooo........oooOO0OOooo........oo    943 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
897                                                   944 
                                                   >> 945 inline void G4VEnergyLossProcess::SetLinearLossLimit(G4double val)
                                                   >> 946 {
                                                   >> 947   linLossLimit = val;
                                                   >> 948 }
                                                   >> 949 
                                                   >> 950 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 951 
                                                   >> 952 inline void G4VEnergyLossProcess::SetMinSubRange(G4double val)
                                                   >> 953 {
                                                   >> 954   minSubRange = val;
                                                   >> 955 }
                                                   >> 956 
                                                   >> 957 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 958 
                                                   >> 959 inline void G4VEnergyLossProcess::SetLambdaFactor(G4double val)
                                                   >> 960 {
                                                   >> 961   if(val > 0.0 && val <= 1.0) { lambdaFactor = val; }
                                                   >> 962 }
                                                   >> 963 
                                                   >> 964 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 965 
                                                   >> 966 void G4VEnergyLossProcess::SetStepFunction(G4double v1, G4double v2)
                                                   >> 967 {
                                                   >> 968   dRoverRange = v1;
                                                   >> 969   finalRange = v2;
                                                   >> 970   if (dRoverRange > 0.999) { dRoverRange = 1.0; }
                                                   >> 971   currentCouple = 0;
                                                   >> 972   mfpKinEnergy  = DBL_MAX;
                                                   >> 973 }
                                                   >> 974 
                                                   >> 975 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 976 
                                                   >> 977 inline void G4VEnergyLossProcess::SetLowestEnergyLimit(G4double val)
                                                   >> 978 {
                                                   >> 979   lowestKinEnergy = val;
                                                   >> 980 }
                                                   >> 981 
                                                   >> 982 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 983 
898 inline G4int G4VEnergyLossProcess::NumberOfSub    984 inline G4int G4VEnergyLossProcess::NumberOfSubCutoffRegions() const
899 {                                                 985 {
900   return nSCoffRegions;                           986   return nSCoffRegions;
901 }                                                 987 }
902                                                   988 
903 //....oooOO0OOooo........oooOO0OOooo........oo    989 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
904                                                   990 
905 inline G4double G4VEnergyLossProcess::MinKinEn << 991 inline void G4VEnergyLossProcess::SetDEDXBinning(G4int nbins)
906 {                                                 992 {
907   return minKinEnergy;                         << 993   nBins = nbins;
908 }                                                 994 }
909                                                   995 
910 //....oooOO0OOooo........oooOO0OOooo........oo    996 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
911                                                   997 
912 inline G4double G4VEnergyLossProcess::MaxKinEn << 998 inline void G4VEnergyLossProcess::SetLambdaBinning(G4int nbins)
913 {                                                 999 {
914   return maxKinEnergy;                         << 1000   nBins = nbins;
915 }                                                 1001 }
916                                                   1002 
917 //....oooOO0OOooo........oooOO0OOooo........oo    1003 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
918                                                   1004 
919 inline G4double G4VEnergyLossProcess::CrossSec << 1005 inline void G4VEnergyLossProcess::SetDEDXBinningForCSDARange(G4int nbins)
920 {                                                 1006 {
921   return biasFactor;                           << 1007   nBinsCSDA = nbins;
922 }                                                 1008 }
923                                                   1009 
924 //....oooOO0OOooo........oooOO0OOooo........oo    1010 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
925                                                   1011 
926 inline G4bool G4VEnergyLossProcess::TablesAreB << 1012 inline void G4VEnergyLossProcess::SetMinKinEnergy(G4double e)
927 {                                                 1013 {
928   return tablesAreBuilt;                       << 1014   minKinEnergy = e;
929 }                                                 1015 }
930                                                   1016 
931 //....oooOO0OOooo........oooOO0OOooo........oo    1017 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
932                                                   1018 
933 inline G4PhysicsTable* G4VEnergyLossProcess::D << 1019 inline G4double G4VEnergyLossProcess::MinKinEnergy() const
934 {                                                 1020 {
935   return theDEDXTable;                         << 1021   return minKinEnergy;
936 }                                                 1022 }
937                                                   1023 
938 //....oooOO0OOooo........oooOO0OOooo........oo    1024 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
939                                                   1025 
940 inline G4PhysicsTable* G4VEnergyLossProcess::D << 1026 inline void G4VEnergyLossProcess::SetMaxKinEnergy(G4double e)
941 {                                                 1027 {
942   return theDEDXunRestrictedTable;             << 1028   maxKinEnergy = e;
                                                   >> 1029   if(e < maxKinEnergyCSDA) { maxKinEnergyCSDA = e; }
943 }                                                 1030 }
944                                                   1031 
945 //....oooOO0OOooo........oooOO0OOooo........oo    1032 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
946                                                   1033 
947 inline G4PhysicsTable* G4VEnergyLossProcess::I << 1034 inline G4double G4VEnergyLossProcess::MaxKinEnergy() const
948 {                                                 1035 {
949   return theIonisationTable;                   << 1036   return maxKinEnergy;
950 }                                                 1037 }
951                                                   1038 
952 //....oooOO0OOooo........oooOO0OOooo........oo    1039 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
953                                                   1040 
954 inline G4PhysicsTable* G4VEnergyLossProcess::C << 1041 inline void G4VEnergyLossProcess::SetMaxKinEnergyForCSDARange(G4double e)
955 {                                                 1042 {
956   return theCSDARangeTable;                    << 1043   maxKinEnergyCSDA = e;
957 }                                                 1044 }
958                                                   1045 
959 //....oooOO0OOooo........oooOO0OOooo........oo    1046 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
960                                                   1047 
961 inline G4PhysicsTable* G4VEnergyLossProcess::R << 1048 inline G4double G4VEnergyLossProcess::CrossSectionBiasingFactor() const
962 {                                                 1049 {
963   return theRangeTableForLoss;                 << 1050   return biasFactor;
964 }                                                 1051 }
965                                                   1052 
966 //....oooOO0OOooo........oooOO0OOooo........oo    1053 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
967                                                   1054 
968 inline G4PhysicsTable* G4VEnergyLossProcess::I << 1055 inline G4bool G4VEnergyLossProcess::TablesAreBuilt() const
969 {                                                 1056 {
970   return theInverseRangeTable;                 << 1057   return  tablesAreBuilt;
971 }                                                 1058 }
972                                                   1059 
973 //....oooOO0OOooo........oooOO0OOooo........oo    1060 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
974                                                   1061 
975 inline G4PhysicsTable* G4VEnergyLossProcess::L << 1062 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTable() const
976 {                                                 1063 {
977   return theLambdaTable;                       << 1064   return theDEDXTable;
978 }                                                 1065 }
979                                                   1066 
980 //....oooOO0OOooo........oooOO0OOooo........oo    1067 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
981                                                   1068 
982 inline G4bool G4VEnergyLossProcess::UseBaseMat << 1069 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXTableForSubsec() const
983 {                                                 1070 {
984   return baseMat;                              << 1071   return theDEDXSubTable;
985 }                                                 1072 }
986                                                   1073 
987 //....oooOO0OOooo........oooOO0OOooo........oo    1074 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
988                                                   1075 
989 inline std::vector<G4double>*                  << 1076 inline G4PhysicsTable* G4VEnergyLossProcess::DEDXunRestrictedTable() const
990 G4VEnergyLossProcess::EnergyOfCrossSectionMax( << 
991 {                                                 1077 {
992   return theEnergyOfCrossSectionMax;           << 1078   return theDEDXunRestrictedTable;
993 }                                                 1079 }
994                                                   1080 
995 //....oooOO0OOooo........oooOO0OOooo........oo    1081 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
996                                                   1082 
997 inline std::vector<G4TwoPeaksXS*>* G4VEnergyLo << 1083 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTable() const
                                                   >> 1084 {
                                                   >> 1085   G4PhysicsTable* t = theDEDXTable;
                                                   >> 1086   if(theIonisationTable) { t = theIonisationTable; } 
                                                   >> 1087   return t;
                                                   >> 1088 }
                                                   >> 1089 
                                                   >> 1090 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 1091 
                                                   >> 1092 inline G4PhysicsTable* G4VEnergyLossProcess::IonisationTableForSubsec() const
998 {                                                 1093 {
999   return fXSpeaks;                             << 1094   G4PhysicsTable* t = theDEDXSubTable;
                                                   >> 1095   if(theIonisationSubTable) { t = theIonisationSubTable; } 
                                                   >> 1096   return t;
1000 }                                                1097 }
1001                                                  1098 
1002 //....oooOO0OOooo........oooOO0OOooo........o    1099 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1003                                                  1100 
1004 inline std::size_t G4VEnergyLossProcess::Numb << 1101 inline G4PhysicsTable* G4VEnergyLossProcess::CSDARangeTable() const
1005 {                                                1102 {
1006   return numberOfModels;                      << 1103   return theCSDARangeTable;
1007 }                                                1104 }
1008                                                  1105 
1009 //....oooOO0OOooo........oooOO0OOooo........o    1106 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1010                                                  1107 
1011 inline G4VEmModel* G4VEnergyLossProcess::EmMo << 1108 inline G4PhysicsTable* G4VEnergyLossProcess::RangeTableForLoss() const
1012 {                                                1109 {
1013   return (index < emModels->size()) ? (*emMod << 1110   return theRangeTableForLoss;
                                                   >> 1111 }
                                                   >> 1112 
                                                   >> 1113 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 1114 
                                                   >> 1115 inline G4PhysicsTable* G4VEnergyLossProcess::InverseRangeTable() const
                                                   >> 1116 {
                                                   >> 1117   return theInverseRangeTable;
                                                   >> 1118 }
                                                   >> 1119 
                                                   >> 1120 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
                                                   >> 1121 
                                                   >> 1122 inline G4PhysicsTable* G4VEnergyLossProcess::LambdaTable()
                                                   >> 1123 {
                                                   >> 1124   return theLambdaTable;
1014 }                                                1125 }
1015                                                  1126 
1016 //....oooOO0OOooo........oooOO0OOooo........o    1127 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1017                                                  1128 
1018 inline G4VEmModel*                            << 1129 inline G4PhysicsTable* G4VEnergyLossProcess::SubLambdaTable()
1019 G4VEnergyLossProcess::GetModelByIndex(std::si << 
1020 {                                                1130 {
1021   return modelManager->GetModel((G4int)idx, v << 1131   return theSubLambdaTable;
1022 }                                                1132 }
1023                                                  1133 
1024 //....oooOO0OOooo........oooOO0OOooo........o    1134 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
1025                                                  1135 
1026 #endif                                           1136 #endif
1027                                                  1137