Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/utils/src/G4EnergyLossTables.cc

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/src/G4EnergyLossTables.cc (Version 11.3.0) and /processes/electromagnetic/utils/src/G4EnergyLossTables.cc (Version 5.2.p1)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                    <<   3 // * DISCLAIMER                                                       *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th <<   5 // * The following disclaimer summarizes all the specific disclaimers *
  6 // * the Geant4 Collaboration.  It is provided <<   6 // * of contributors to this software. The specific disclaimers,which *
  7 // * conditions of the Geant4 Software License <<   7 // * govern, are listed with their locations in:                      *
  8 // * LICENSE and available at  http://cern.ch/ <<   8 // *   http://cern.ch/geant4/license                                  *
  9 // * include a list of copyright holders.      << 
 10 // *                                                9 // *                                                                  *
 11 // * Neither the authors of this software syst     10 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     11 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     12 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     13 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file  <<  14 // * use.                                                             *
 16 // * for the full disclaimer and the limitatio << 
 17 // *                                               15 // *                                                                  *
 18 // * This  code  implementation is the result  <<  16 // * This  code  implementation is the  intellectual property  of the *
 19 // * technical work of the GEANT4 collaboratio <<  17 // * GEANT4 collaboration.                                            *
 20 // * By using,  copying,  modifying or  distri <<  18 // * By copying,  distributing  or modifying the Program (or any work *
 21 // * any work based  on the software)  you  ag <<  19 // * based  on  the Program)  you indicate  your  acceptance of  this *
 22 // * use  in  resulting  scientific  publicati <<  20 // * statement, and all its terms.                                    *
 23 // * acceptance of all terms of the Geant4 Sof << 
 24 // *******************************************     21 // ********************************************************************
 25 //                                                 22 //
 26 //                                                 23 //
                                                   >>  24 // $Id: G4EnergyLossTables.cc,v 1.27 2003/04/18 17:49:26 vnivanch Exp $
                                                   >>  25 // GEANT4 tag $Name: geant4-05-02-patch-01 $
 27 //                                                 26 //
 28 // -------------------------------------------     27 // -------------------------------------------------------------------
 29 // first version created by P.Urban , 06/04/19     28 // first version created by P.Urban , 06/04/1998
 30 // modifications + "precise" functions added b     29 // modifications + "precise" functions added by L.Urban , 27/05/98
 31 // modifications , TOF functions , 26/10/98, L     30 // modifications , TOF functions , 26/10/98, L.Urban
 32 // cache mechanism in order to gain time, 11/0     31 // cache mechanism in order to gain time, 11/02/99, L.Urban
 33 // bug fixed , 12/04/99 , L.Urban                  32 // bug fixed , 12/04/99 , L.Urban
 34 // 10.11.99: moved from RWT hash dictionary to     33 // 10.11.99: moved from RWT hash dictionary to STL map, G.Barrand, M.Maire
 35 // 27.09.01 L.Urban , bug fixed (negative ener     34 // 27.09.01 L.Urban , bug fixed (negative energy deposit)
 36 // 26.10.01 all static functions moved from .i     35 // 26.10.01 all static functions moved from .icc files (mma)
 37 // 15.01.03 Add interfaces required for "cut p     36 // 15.01.03 Add interfaces required for "cut per region" (V.Ivanchenko)
 38 // 12.03.03 Add warnings to obsolete interface     37 // 12.03.03 Add warnings to obsolete interfaces (V.Ivanchenko)
 39 // 10.04.03 Add call to G4LossTableManager is      38 // 10.04.03 Add call to G4LossTableManager is particle is not registered (V.Ivanchenko)
 40 //                                                 39 //
 41 // -------------------------------------------     40 // -------------------------------------------------------------------
 42                                                    41 
 43 #include "G4EnergyLossTables.hh"                   42 #include "G4EnergyLossTables.hh"
 44 #include "G4SystemOfUnits.hh"                  << 
 45 #include "G4MaterialCutsCouple.hh"                 43 #include "G4MaterialCutsCouple.hh"
 46 #include "G4RegionStore.hh"                        44 #include "G4RegionStore.hh"
 47 #include "G4LossTableManager.hh"                   45 #include "G4LossTableManager.hh"
 48                                                    46 
 49                                                    47 
 50 //....oooOO0OOooo........oooOO0OOooo........oo     48 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 51                                                    49 
 52 G4EnergyLossTablesHelper *G4EnergyLossTables:: <<  50 G4EnergyLossTablesHelper G4EnergyLossTables::t  ;
 53 G4EnergyLossTablesHelper *G4EnergyLossTables:: <<  51 G4EnergyLossTablesHelper G4EnergyLossTables::null_loss ;
 54 G4ParticleDefinition* G4EnergyLossTables::last <<  52 const G4ParticleDefinition* G4EnergyLossTables::lastParticle = 0;
 55 G4double G4EnergyLossTables::QQPositron = 1.0; <<  53 G4double G4EnergyLossTables::QQPositron = eplus*eplus ;
 56 G4double G4EnergyLossTables::Chargesquare ;        54 G4double G4EnergyLossTables::Chargesquare ;
 57 G4int    G4EnergyLossTables::oldIndex = -1 ;       55 G4int    G4EnergyLossTables::oldIndex = -1 ;
 58 G4double G4EnergyLossTables::rmin = 0. ;           56 G4double G4EnergyLossTables::rmin = 0. ;
 59 G4double G4EnergyLossTables::rmax = 0. ;           57 G4double G4EnergyLossTables::rmax = 0. ;
 60 G4double G4EnergyLossTables::Thigh = 0. ;          58 G4double G4EnergyLossTables::Thigh = 0. ;
 61 G4int    G4EnergyLossTables::let_counter = 0;      59 G4int    G4EnergyLossTables::let_counter = 0;
 62 G4int    G4EnergyLossTables::let_max_num_warni <<  60 G4int    G4EnergyLossTables::let_max_num_warnings = 2;
 63 G4bool   G4EnergyLossTables::first_loss = true     61 G4bool   G4EnergyLossTables::first_loss = true;
 64                                                    62 
 65 G4EnergyLossTables::helper_map *G4EnergyLossTa <<  63 G4EnergyLossTables::helper_map G4EnergyLossTables::dict;
 66                                                    64 
 67 //....oooOO0OOooo........oooOO0OOooo........oo     65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 68                                                    66 
 69 G4EnergyLossTablesHelper::G4EnergyLossTablesHe     67 G4EnergyLossTablesHelper::G4EnergyLossTablesHelper(
 70   const G4PhysicsTable* aDEDXTable,                68   const G4PhysicsTable* aDEDXTable,
 71   const G4PhysicsTable* aRangeTable,               69   const G4PhysicsTable* aRangeTable,
 72   const G4PhysicsTable* anInverseRangeTable,       70   const G4PhysicsTable* anInverseRangeTable,
 73   const G4PhysicsTable* aLabTimeTable,             71   const G4PhysicsTable* aLabTimeTable,
 74   const G4PhysicsTable* aProperTimeTable,          72   const G4PhysicsTable* aProperTimeTable,
 75   G4double aLowestKineticEnergy,                   73   G4double aLowestKineticEnergy,
 76   G4double aHighestKineticEnergy,                  74   G4double aHighestKineticEnergy,
 77   G4double aMassRatio,                             75   G4double aMassRatio,
 78   G4int aNumberOfBins)                             76   G4int aNumberOfBins)
 79   :                                                77   :
 80   theDEDXTable(aDEDXTable), theRangeTable(aRan     78   theDEDXTable(aDEDXTable), theRangeTable(aRangeTable),
 81   theInverseRangeTable(anInverseRangeTable),       79   theInverseRangeTable(anInverseRangeTable),
 82   theLabTimeTable(aLabTimeTable),                  80   theLabTimeTable(aLabTimeTable),
 83   theProperTimeTable(aProperTimeTable),            81   theProperTimeTable(aProperTimeTable),
 84   theLowestKineticEnergy(aLowestKineticEnergy)     82   theLowestKineticEnergy(aLowestKineticEnergy),
 85   theHighestKineticEnergy(aHighestKineticEnerg     83   theHighestKineticEnergy(aHighestKineticEnergy),
 86   theMassRatio(aMassRatio),                        84   theMassRatio(aMassRatio),
 87   theNumberOfBins(aNumberOfBins)                   85   theNumberOfBins(aNumberOfBins)
 88 { }                                                86 { }
 89                                                    87 
 90 //....oooOO0OOooo........oooOO0OOooo........oo     88 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 91                                                    89 
 92 G4EnergyLossTablesHelper::G4EnergyLossTablesHe     90 G4EnergyLossTablesHelper::G4EnergyLossTablesHelper()
 93 {                                              <<  91 { }
 94   theLowestKineticEnergy = 0.0;                << 
 95   theHighestKineticEnergy= 0.0;                << 
 96   theMassRatio = 0.0;                          << 
 97   theNumberOfBins = 0;                         << 
 98   theDEDXTable = theRangeTable = theInverseRan << 
 99     = theProperTimeTable = nullptr;            << 
100 }                                              << 
101                                                    92 
102 //....oooOO0OOooo........oooOO0OOooo........oo     93 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
103                                                    94 
104 void G4EnergyLossTables::Register(                 95 void G4EnergyLossTables::Register(
105   const G4ParticleDefinition* p,                   96   const G4ParticleDefinition* p,
106   const G4PhysicsTable* tDEDX,                     97   const G4PhysicsTable* tDEDX,
107   const G4PhysicsTable* tRange,                    98   const G4PhysicsTable* tRange,
108   const G4PhysicsTable* tInverseRange,             99   const G4PhysicsTable* tInverseRange,
109   const G4PhysicsTable* tLabTime,                 100   const G4PhysicsTable* tLabTime,
110   const G4PhysicsTable* tProperTime,              101   const G4PhysicsTable* tProperTime,
111   G4double lowestKineticEnergy,                   102   G4double lowestKineticEnergy,
112   G4double highestKineticEnergy,                  103   G4double highestKineticEnergy,
113   G4double massRatio,                             104   G4double massRatio,
114   G4int NumberOfBins)                             105   G4int NumberOfBins)
115 {                                                 106 {
116   if (!dict) dict = new G4EnergyLossTables::he << 107   dict[p]= G4EnergyLossTablesHelper(tDEDX, tRange,tInverseRange,
117   if (!null_loss) null_loss = new G4EnergyLoss << 
118   if (!t) t = new G4EnergyLossTablesHelper;    << 
119                                                << 
120   (*dict)[p]= G4EnergyLossTablesHelper(tDEDX,  << 
121                     tLabTime,tProperTime,lowes    108                     tLabTime,tProperTime,lowestKineticEnergy,
122         highestKineticEnergy, massRatio,Number    109         highestKineticEnergy, massRatio,NumberOfBins);
123                                                   110 
124   *t = GetTables(p) ;    // important for cach << 111   t = GetTables(p) ;    // important for cache !!!!!
125   lastParticle = (G4ParticleDefinition*) p ;   << 112   lastParticle = p ;
126   Chargesquare = (p->GetPDGCharge())*(p->GetPD    113   Chargesquare = (p->GetPDGCharge())*(p->GetPDGCharge())/
127                   QQPositron ;                    114                   QQPositron ;
128   if (first_loss ) {                              115   if (first_loss ) {
129     *null_loss = G4EnergyLossTablesHelper(     << 116     null_loss = G4EnergyLossTablesHelper(0, 0, 0, 0, 0, 0.0, 0.0, 0.0, 0);
130                  nullptr, nullptr, nullptr, nu << 
131     first_loss = false;                           117     first_loss = false;
132   }                                               118   }
133 }                                                 119 }
134                                                   120 
135 //....oooOO0OOooo........oooOO0OOooo........oo    121 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
136                                                   122 
137 const G4PhysicsTable* G4EnergyLossTables::GetD    123 const G4PhysicsTable* G4EnergyLossTables::GetDEDXTable(
138   const G4ParticleDefinition* p)                  124   const G4ParticleDefinition* p)
139 {                                                 125 {
140   if (!dict) dict = new G4EnergyLossTables::he << 
141   helper_map::iterator it;                        126   helper_map::iterator it;
142   if((it=dict->find(p))==dict->end()) return n << 127   if((it=dict.find(p))==dict.end()) return 0;
143   return (*it).second.theDEDXTable;               128   return (*it).second.theDEDXTable;
144 }                                                 129 }
145                                                   130 
146 //....oooOO0OOooo........oooOO0OOooo........oo    131 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
147                                                   132 
148 const G4PhysicsTable* G4EnergyLossTables::GetR    133 const G4PhysicsTable* G4EnergyLossTables::GetRangeTable(
149   const G4ParticleDefinition* p)                  134   const G4ParticleDefinition* p)
150 {                                                 135 {
151   if (!dict) dict = new G4EnergyLossTables::he << 
152   helper_map::iterator it;                        136   helper_map::iterator it;
153   if((it=dict->find(p))==dict->end()) return n << 137   if((it=dict.find(p))==dict.end()) return 0;
154   return (*it).second.theRangeTable;              138   return (*it).second.theRangeTable;
155 }                                                 139 }
156                                                   140 
157 //....oooOO0OOooo........oooOO0OOooo........oo    141 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
158                                                   142 
159 const G4PhysicsTable* G4EnergyLossTables::GetI    143 const G4PhysicsTable* G4EnergyLossTables::GetInverseRangeTable(
160   const G4ParticleDefinition* p)                  144   const G4ParticleDefinition* p)
161 {                                                 145 {
162   if (!dict) dict = new G4EnergyLossTables::he << 
163   helper_map::iterator it;                        146   helper_map::iterator it;
164   if((it=dict->find(p))==dict->end()) return n << 147   if((it=dict.find(p))==dict.end()) return 0;
165   return (*it).second.theInverseRangeTable;       148   return (*it).second.theInverseRangeTable;
166 }                                                 149 }
167                                                   150 
168 //....oooOO0OOooo........oooOO0OOooo........oo    151 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
169                                                   152 
170 const G4PhysicsTable* G4EnergyLossTables::GetL    153 const G4PhysicsTable* G4EnergyLossTables::GetLabTimeTable(
171   const G4ParticleDefinition* p)                  154   const G4ParticleDefinition* p)
172 {                                                 155 {
173   if (!dict) dict = new G4EnergyLossTables::he << 
174   helper_map::iterator it;                        156   helper_map::iterator it;
175   if((it=dict->find(p))==dict->end()) return n << 157   if((it=dict.find(p))==dict.end()) return 0;
176   return (*it).second.theLabTimeTable;            158   return (*it).second.theLabTimeTable;
177 }                                                 159 }
178                                                   160 
179 //....oooOO0OOooo........oooOO0OOooo........oo    161 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
180                                                   162 
181 const G4PhysicsTable* G4EnergyLossTables::GetP    163 const G4PhysicsTable* G4EnergyLossTables::GetProperTimeTable(
182   const G4ParticleDefinition* p)                  164   const G4ParticleDefinition* p)
183 {                                                 165 {
184   if (!dict) dict = new G4EnergyLossTables::he << 
185   helper_map::iterator it;                        166   helper_map::iterator it;
186   if((it=dict->find(p))==dict->end()) return n << 167   if((it=dict.find(p))==dict.end()) return 0;
187   return (*it).second.theProperTimeTable;         168   return (*it).second.theProperTimeTable;
188 }                                                 169 }
189                                                   170 
190 //....oooOO0OOooo........oooOO0OOooo........oo    171 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
191                                                   172 
192 G4EnergyLossTablesHelper G4EnergyLossTables::G    173 G4EnergyLossTablesHelper G4EnergyLossTables::GetTables(
193   const G4ParticleDefinition* p)                  174   const G4ParticleDefinition* p)
194 {                                                 175 {
195   if (!dict) dict = new G4EnergyLossTables::he << 
196   if (!null_loss) null_loss = new G4EnergyLoss << 
197                                                << 
198   helper_map::iterator it;                        176   helper_map::iterator it;
199   if ((it=dict->find(p))==dict->end()) {       << 177   if ((it=dict.find(p))==dict.end()) {
200     return *null_loss;                         << 178 //    G4cout << "Table is not found out for " << p->GetParticleName() << G4endl;
                                                   >> 179 //    G4Exception("G4EnergyLossTables::GetTables: table not found!");
                                                   >> 180 //    exit(1);
                                                   >> 181     return null_loss;
201   }                                               182   }
202   return (*it).second;                            183   return (*it).second;
203 }                                                 184 }
204                                                   185 
205 //....oooOO0OOooo........oooOO0OOooo........oo    186 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
206                                                   187 
207 G4double G4EnergyLossTables::GetDEDX(             188 G4double G4EnergyLossTables::GetDEDX(
208     const G4ParticleDefinition *aParticle,        189     const G4ParticleDefinition *aParticle,
209     G4double KineticEnergy,                       190     G4double KineticEnergy,
210     const G4Material *aMaterial)                  191     const G4Material *aMaterial)
211 {                                                 192 {
212   if (!t) t = new G4EnergyLossTablesHelper;    << 
213                                                << 
214   CPRWarning();                                   193   CPRWarning();
215   if(aParticle != (const G4ParticleDefinition* << 194   if(aParticle != lastParticle)
216   {                                               195   {
217     *t= GetTables(aParticle);                  << 196     t= GetTables(aParticle);
218     lastParticle = (G4ParticleDefinition*) aPa << 197     lastParticle = aParticle ;
219     Chargesquare = (aParticle->GetPDGCharge())    198     Chargesquare = (aParticle->GetPDGCharge())*
220                    (aParticle->GetPDGCharge())    199                    (aParticle->GetPDGCharge())/
221                    QQPositron ;                   200                    QQPositron ;
222     oldIndex = -1 ;                               201     oldIndex = -1 ;
223   }                                               202   }
224   const G4PhysicsTable*  dEdxTable= t->theDEDX << 203   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
225   if (!dEdxTable) {                            << 204   if (!dEdxTable) ParticleHaveNoLoss(aParticle);
226     ParticleHaveNoLoss(aParticle,"dEdx");      << 
227     return 0.0;                                << 
228   }                                            << 
229                                                   205 
230   G4int materialIndex = (G4int)aMaterial->GetI << 206   G4int materialIndex = aMaterial->GetIndex();
231   G4double scaledKineticEnergy = KineticEnergy << 207   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
232   G4double dEdx;                                  208   G4double dEdx;
233   G4bool isOut;                                   209   G4bool isOut;
234                                                   210 
235   if (scaledKineticEnergy<t->theLowestKineticE << 211   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
236                                                   212 
237      dEdx =(*dEdxTable)(materialIndex)->GetVal    213      dEdx =(*dEdxTable)(materialIndex)->GetValue(
238               t->theLowestKineticEnergy,isOut) << 214               t.theLowestKineticEnergy,isOut)
239            *std::sqrt(scaledKineticEnergy/t->t << 215            *sqrt(scaledKineticEnergy/t.theLowestKineticEnergy);
240                                                   216 
241   } else if (scaledKineticEnergy>t->theHighest << 217   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
242                                                   218 
243      dEdx = (*dEdxTable)(materialIndex)->GetVa    219      dEdx = (*dEdxTable)(materialIndex)->GetValue(
244         t->theHighestKineticEnergy,isOut);     << 220         t.theHighestKineticEnergy,isOut);
245                                                   221 
246   } else {                                        222   } else {
247                                                   223 
248     dEdx = (*dEdxTable)(materialIndex)->GetVal    224     dEdx = (*dEdxTable)(materialIndex)->GetValue(
249          scaledKineticEnergy,isOut);              225          scaledKineticEnergy,isOut);
250                                                   226 
251   }                                               227   }
252                                                   228 
253   return dEdx*Chargesquare;                       229   return dEdx*Chargesquare;
254 }                                                 230 }
255                                                   231 
256 //....oooOO0OOooo........oooOO0OOooo........oo    232 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
257                                                   233 
258 G4double G4EnergyLossTables::GetLabTime(          234 G4double G4EnergyLossTables::GetLabTime(
259     const G4ParticleDefinition *aParticle,        235     const G4ParticleDefinition *aParticle,
260     G4double KineticEnergy,                       236     G4double KineticEnergy,
261     const G4Material *aMaterial)                  237     const G4Material *aMaterial)
262 {                                                 238 {
263   if (!t) t = new G4EnergyLossTablesHelper;    << 
264                                                << 
265   CPRWarning();                                   239   CPRWarning();
266   if(aParticle != (const G4ParticleDefinition* << 240   if(aParticle != lastParticle)
267   {                                               241   {
268     *t= GetTables(aParticle);                  << 242     t= GetTables(aParticle);
269     lastParticle = (G4ParticleDefinition*) aPa << 243     lastParticle = aParticle ;
270     oldIndex = -1 ;                               244     oldIndex = -1 ;
271   }                                               245   }
272   const G4PhysicsTable* labtimeTable= t->theLa << 246   const G4PhysicsTable* labtimeTable= t.theLabTimeTable;
273   if (!labtimeTable) {                         << 247   if (!labtimeTable) ParticleHaveNoLoss(aParticle);
274     ParticleHaveNoLoss(aParticle,"LabTime");   << 
275     return 0.0;                                << 
276   }                                            << 
277                                                   248 
278   const G4double parlowen=0.4 , ppar=0.5-parlo    249   const G4double parlowen=0.4 , ppar=0.5-parlowen ;
279   G4int materialIndex = (G4int)aMaterial->GetI << 250   G4int materialIndex = aMaterial->GetIndex();
280   G4double scaledKineticEnergy = KineticEnergy << 251   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
281   G4double time;                                  252   G4double time;
282   G4bool isOut;                                   253   G4bool isOut;
283                                                   254 
284   if (scaledKineticEnergy<t->theLowestKineticE << 255   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
285                                                   256 
286      time = std::exp(ppar*std::log(scaledKinet << 257      time = exp(ppar*log(scaledKineticEnergy/t.theLowestKineticEnergy))*
287             (*labtimeTable)(materialIndex)->Ge    258             (*labtimeTable)(materialIndex)->GetValue(
288               t->theLowestKineticEnergy,isOut) << 259               t.theLowestKineticEnergy,isOut);
289                                                   260 
290                                                   261 
291   } else if (scaledKineticEnergy>t->theHighest << 262   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
292                                                   263 
293      time = (*labtimeTable)(materialIndex)->Ge    264      time = (*labtimeTable)(materialIndex)->GetValue(
294               t->theHighestKineticEnergy,isOut << 265               t.theHighestKineticEnergy,isOut);
295                                                   266 
296   } else {                                        267   } else {
297                                                   268 
298     time = (*labtimeTable)(materialIndex)->Get    269     time = (*labtimeTable)(materialIndex)->GetValue(
299                scaledKineticEnergy,isOut);        270                scaledKineticEnergy,isOut);
300                                                   271 
301   }                                               272   }
302                                                   273 
303   return time/t->theMassRatio ;                << 274   return time/t.theMassRatio ;
304 }                                                 275 }
305                                                   276 
306 //....oooOO0OOooo........oooOO0OOooo........oo    277 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
307                                                   278 
308 G4double G4EnergyLossTables::GetDeltaLabTime(     279 G4double G4EnergyLossTables::GetDeltaLabTime(
309     const G4ParticleDefinition *aParticle,        280     const G4ParticleDefinition *aParticle,
310     G4double KineticEnergyStart,                  281     G4double KineticEnergyStart,
311     G4double KineticEnergyEnd,                    282     G4double KineticEnergyEnd,
312     const G4Material *aMaterial)                  283     const G4Material *aMaterial)
313 {                                                 284 {
314   if (!t) t = new G4EnergyLossTablesHelper;    << 
315                                                << 
316   CPRWarning();                                   285   CPRWarning();
317   if(aParticle != (const G4ParticleDefinition* << 286   if(aParticle != lastParticle)
318   {                                               287   {
319     *t= GetTables(aParticle);                  << 288     t= GetTables(aParticle);
320     lastParticle = (G4ParticleDefinition*) aPa << 289     lastParticle = aParticle ;
321     oldIndex = -1 ;                               290     oldIndex = -1 ;
322   }                                               291   }
323   const G4PhysicsTable* labtimeTable= t->theLa << 292   const G4PhysicsTable* labtimeTable= t.theLabTimeTable;
324   if (!labtimeTable) {                         << 293   if (!labtimeTable) ParticleHaveNoLoss(aParticle);
325     ParticleHaveNoLoss(aParticle,"LabTime");   << 
326     return 0.0;                                << 
327   }                                            << 
328                                                   294 
329   const G4double parlowen=0.4 , ppar=0.5-parlo    295   const G4double parlowen=0.4 , ppar=0.5-parlowen ;
330   const G4double dToverT = 0.05 , facT = 1. -d    296   const G4double dToverT = 0.05 , facT = 1. -dToverT ;
331   G4double timestart,timeend,deltatime,dTT;       297   G4double timestart,timeend,deltatime,dTT;
332   G4bool isOut;                                   298   G4bool isOut;
333                                                   299 
334   G4int materialIndex = (G4int)aMaterial->GetI << 300   G4int materialIndex = aMaterial->GetIndex();
335   G4double scaledKineticEnergy = KineticEnergy << 301   G4double scaledKineticEnergy = KineticEnergyStart*t.theMassRatio;
336                                                   302 
337   if (scaledKineticEnergy<t->theLowestKineticE << 303   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
338                                                   304 
339      timestart = std::exp(ppar*std::log(scaled << 305      timestart = exp(ppar*log(scaledKineticEnergy/t.theLowestKineticEnergy))*
340                 (*labtimeTable)(materialIndex)    306                 (*labtimeTable)(materialIndex)->GetValue(
341                 t->theLowestKineticEnergy,isOu << 307                 t.theLowestKineticEnergy,isOut);
342                                                   308 
343                                                   309 
344   } else if (scaledKineticEnergy>t->theHighest << 310   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
345                                                   311 
346      timestart = (*labtimeTable)(materialIndex    312      timestart = (*labtimeTable)(materialIndex)->GetValue(
347                 t->theHighestKineticEnergy,isO << 313                 t.theHighestKineticEnergy,isOut);
348                                                   314 
349   } else {                                        315   } else {
350                                                   316 
351     timestart = (*labtimeTable)(materialIndex)    317     timestart = (*labtimeTable)(materialIndex)->GetValue(
352                 scaledKineticEnergy,isOut);       318                 scaledKineticEnergy,isOut);
353                                                   319 
354   }                                               320   }
355                                                   321 
356   dTT = (KineticEnergyStart - KineticEnergyEnd    322   dTT = (KineticEnergyStart - KineticEnergyEnd)/KineticEnergyStart ;
357                                                   323 
358   if( dTT < dToverT )                             324   if( dTT < dToverT )
359     scaledKineticEnergy = facT*KineticEnergySt << 325     scaledKineticEnergy = facT*KineticEnergyStart*t.theMassRatio;
360   else                                            326   else
361     scaledKineticEnergy = KineticEnergyEnd*t-> << 327     scaledKineticEnergy = KineticEnergyEnd*t.theMassRatio;
362                                                   328 
363   if (scaledKineticEnergy<t->theLowestKineticE << 329   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
364                                                   330 
365      timeend = std::exp(ppar*std::log(scaledKi << 331      timeend = exp(ppar*log(scaledKineticEnergy/t.theLowestKineticEnergy))*
366                 (*labtimeTable)(materialIndex)    332                 (*labtimeTable)(materialIndex)->GetValue(
367                 t->theLowestKineticEnergy,isOu << 333                 t.theLowestKineticEnergy,isOut);
368                                                   334 
369                                                   335 
370   } else if (scaledKineticEnergy>t->theHighest << 336   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
371                                                   337 
372      timeend = (*labtimeTable)(materialIndex)-    338      timeend = (*labtimeTable)(materialIndex)->GetValue(
373                 t->theHighestKineticEnergy,isO << 339                 t.theHighestKineticEnergy,isOut);
374                                                   340 
375   } else {                                        341   } else {
376                                                   342 
377     timeend = (*labtimeTable)(materialIndex)->    343     timeend = (*labtimeTable)(materialIndex)->GetValue(
378                 scaledKineticEnergy,isOut);       344                 scaledKineticEnergy,isOut);
379                                                   345 
380   }                                               346   }
381                                                   347 
382   deltatime = timestart - timeend ;               348   deltatime = timestart - timeend ;
383                                                   349 
384   if( dTT < dToverT )                             350   if( dTT < dToverT )
385     deltatime *= dTT/dToverT;                     351     deltatime *= dTT/dToverT;
386                                                   352 
387   return deltatime/t->theMassRatio ;           << 353   return deltatime/t.theMassRatio ;
388 }                                                 354 }
389                                                   355 
390 //....oooOO0OOooo........oooOO0OOooo........oo    356 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
391                                                   357 
392 G4double G4EnergyLossTables::GetProperTime(       358 G4double G4EnergyLossTables::GetProperTime(
393     const G4ParticleDefinition *aParticle,        359     const G4ParticleDefinition *aParticle,
394     G4double KineticEnergy,                       360     G4double KineticEnergy,
395     const G4Material *aMaterial)                  361     const G4Material *aMaterial)
396 {                                                 362 {
397   if (!t) t = new G4EnergyLossTablesHelper;    << 
398                                                << 
399   CPRWarning();                                   363   CPRWarning();
400   if(aParticle != (const G4ParticleDefinition* << 364   if(aParticle != lastParticle)
401   {                                               365   {
402     *t= GetTables(aParticle);                  << 366     t= GetTables(aParticle);
403     lastParticle = (G4ParticleDefinition*) aPa << 367     lastParticle = aParticle ;
404     oldIndex = -1 ;                               368     oldIndex = -1 ;
405   }                                               369   }
406   const G4PhysicsTable* propertimeTable= t->th << 370   const G4PhysicsTable* propertimeTable= t.theProperTimeTable;
407   if (!propertimeTable) {                      << 371   if (!propertimeTable) ParticleHaveNoLoss(aParticle);
408     ParticleHaveNoLoss(aParticle,"ProperTime") << 
409     return 0.0;                                << 
410   }                                            << 
411                                                   372 
412   const G4double parlowen=0.4 , ppar=0.5-parlo    373   const G4double parlowen=0.4 , ppar=0.5-parlowen ;
413   G4int materialIndex = (G4int)aMaterial->GetI << 374   G4int materialIndex = aMaterial->GetIndex();
414   G4double scaledKineticEnergy = KineticEnergy << 375   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
415   G4double time;                                  376   G4double time;
416   G4bool isOut;                                   377   G4bool isOut;
417                                                   378 
418   if (scaledKineticEnergy<t->theLowestKineticE << 379   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
419                                                   380 
420      time = std::exp(ppar*std::log(scaledKinet << 381      time = exp(ppar*log(scaledKineticEnergy/t.theLowestKineticEnergy))*
421             (*propertimeTable)(materialIndex)-    382             (*propertimeTable)(materialIndex)->GetValue(
422               t->theLowestKineticEnergy,isOut) << 383               t.theLowestKineticEnergy,isOut);
423                                                   384 
424                                                   385 
425   } else if (scaledKineticEnergy>t->theHighest << 386   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
426                                                   387 
427      time = (*propertimeTable)(materialIndex)-    388      time = (*propertimeTable)(materialIndex)->GetValue(
428               t->theHighestKineticEnergy,isOut << 389               t.theHighestKineticEnergy,isOut);
429                                                   390 
430   } else {                                        391   } else {
431                                                << 392    
432     time = (*propertimeTable)(materialIndex)->    393     time = (*propertimeTable)(materialIndex)->GetValue(
433                scaledKineticEnergy,isOut);        394                scaledKineticEnergy,isOut);
434                                                   395 
435   }                                               396   }
436                                                   397 
437   return time/t->theMassRatio ;                << 398   return time/t.theMassRatio ;
438 }                                                 399 }
439                                                   400 
440 //....oooOO0OOooo........oooOO0OOooo........oo    401 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
441                                                   402 
442 G4double G4EnergyLossTables::GetDeltaProperTim    403 G4double G4EnergyLossTables::GetDeltaProperTime(
443     const G4ParticleDefinition *aParticle,        404     const G4ParticleDefinition *aParticle,
444     G4double KineticEnergyStart,                  405     G4double KineticEnergyStart,
445     G4double KineticEnergyEnd,                    406     G4double KineticEnergyEnd,
446     const G4Material *aMaterial)                  407     const G4Material *aMaterial)
447 {                                                 408 {
448   if (!t) t = new G4EnergyLossTablesHelper;    << 
449                                                << 
450   CPRWarning();                                   409   CPRWarning();
451   if(aParticle != (const G4ParticleDefinition* << 410   if(aParticle != lastParticle)
452   {                                               411   {
453     *t= GetTables(aParticle);                  << 412     t= GetTables(aParticle);
454     lastParticle = (G4ParticleDefinition*) aPa << 413     lastParticle = aParticle ;
455     oldIndex = -1 ;                               414     oldIndex = -1 ;
456   }                                               415   }
457   const G4PhysicsTable* propertimeTable= t->th << 416   const G4PhysicsTable* propertimeTable= t.theProperTimeTable;
458   if (!propertimeTable) {                      << 417   if (!propertimeTable) ParticleHaveNoLoss(aParticle);
459     ParticleHaveNoLoss(aParticle,"ProperTime") << 
460     return 0.0;                                << 
461   }                                            << 
462                                                   418 
463   const G4double parlowen=0.4 , ppar=0.5-parlo    419   const G4double parlowen=0.4 , ppar=0.5-parlowen ;
464   const G4double dToverT = 0.05 , facT = 1. -d    420   const G4double dToverT = 0.05 , facT = 1. -dToverT ;
465   G4double timestart,timeend,deltatime,dTT;       421   G4double timestart,timeend,deltatime,dTT;
466   G4bool isOut;                                   422   G4bool isOut;
467                                                   423 
468   G4int materialIndex = (G4int)aMaterial->GetI << 424   G4int materialIndex = aMaterial->GetIndex();
469   G4double scaledKineticEnergy = KineticEnergy << 425   G4double scaledKineticEnergy = KineticEnergyStart*t.theMassRatio;
470                                                   426 
471   if (scaledKineticEnergy<t->theLowestKineticE << 427   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
472                                                   428 
473      timestart = std::exp(ppar*std::log(scaled << 429      timestart = exp(ppar*log(scaledKineticEnergy/t.theLowestKineticEnergy))*
474                 (*propertimeTable)(materialInd    430                 (*propertimeTable)(materialIndex)->GetValue(
475                 t->theLowestKineticEnergy,isOu << 431                 t.theLowestKineticEnergy,isOut);
476                                                   432 
477                                                   433 
478   } else if (scaledKineticEnergy>t->theHighest << 434   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
479                                                   435 
480      timestart = (*propertimeTable)(materialIn    436      timestart = (*propertimeTable)(materialIndex)->GetValue(
481                 t->theHighestKineticEnergy,isO << 437                 t.theHighestKineticEnergy,isOut);
482                                                   438 
483   } else {                                        439   } else {
484                                                   440 
485     timestart = (*propertimeTable)(materialInd    441     timestart = (*propertimeTable)(materialIndex)->GetValue(
486                 scaledKineticEnergy,isOut);       442                 scaledKineticEnergy,isOut);
487                                                   443 
488   }                                               444   }
489                                                   445 
490   dTT = (KineticEnergyStart - KineticEnergyEnd    446   dTT = (KineticEnergyStart - KineticEnergyEnd)/KineticEnergyStart ;
491                                                   447 
492   if( dTT < dToverT )                             448   if( dTT < dToverT )
493     scaledKineticEnergy = facT*KineticEnergySt << 449     scaledKineticEnergy = facT*KineticEnergyStart*t.theMassRatio;
494   else                                            450   else
495     scaledKineticEnergy = KineticEnergyEnd*t-> << 451     scaledKineticEnergy = KineticEnergyEnd*t.theMassRatio;
496                                                   452 
497   if (scaledKineticEnergy<t->theLowestKineticE << 453   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
498                                                   454 
499      timeend = std::exp(ppar*std::log(scaledKi << 455      timeend = exp(ppar*log(scaledKineticEnergy/t.theLowestKineticEnergy))*
500                 (*propertimeTable)(materialInd    456                 (*propertimeTable)(materialIndex)->GetValue(
501                 t->theLowestKineticEnergy,isOu << 457                 t.theLowestKineticEnergy,isOut);
502                                                   458 
503                                                   459 
504   } else if (scaledKineticEnergy>t->theHighest << 460   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
505                                                   461 
506      timeend = (*propertimeTable)(materialInde    462      timeend = (*propertimeTable)(materialIndex)->GetValue(
507                 t->theHighestKineticEnergy,isO << 463                 t.theHighestKineticEnergy,isOut);
508                                                   464 
509   } else {                                        465   } else {
510                                                   466 
511     timeend = (*propertimeTable)(materialIndex    467     timeend = (*propertimeTable)(materialIndex)->GetValue(
512                 scaledKineticEnergy,isOut);       468                 scaledKineticEnergy,isOut);
513                                                   469 
514   }                                               470   }
515                                                   471 
516   deltatime = timestart - timeend ;               472   deltatime = timestart - timeend ;
517                                                   473 
518   if( dTT < dToverT )                             474   if( dTT < dToverT )
519     deltatime *= dTT/dToverT ;                    475     deltatime *= dTT/dToverT ;
520                                                   476 
521   return deltatime/t->theMassRatio ;           << 477   return deltatime/t.theMassRatio ;
522 }                                                 478 }
523                                                   479 
524 //....oooOO0OOooo........oooOO0OOooo........oo    480 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
525                                                   481 
526 G4double G4EnergyLossTables::GetRange(            482 G4double G4EnergyLossTables::GetRange(
527     const G4ParticleDefinition *aParticle,        483     const G4ParticleDefinition *aParticle,
528     G4double KineticEnergy,                       484     G4double KineticEnergy,
529     const G4Material *aMaterial)                  485     const G4Material *aMaterial)
530 {                                                 486 {
531   if (!t) t = new G4EnergyLossTablesHelper;    << 
532                                                << 
533   CPRWarning();                                   487   CPRWarning();
534   if(aParticle != (const G4ParticleDefinition* << 488   if(aParticle != lastParticle)
535   {                                               489   {
536     *t= GetTables(aParticle);                  << 490     t= GetTables(aParticle);
537     lastParticle = (G4ParticleDefinition*) aPa << 491     lastParticle = aParticle ;
538     Chargesquare = (aParticle->GetPDGCharge())    492     Chargesquare = (aParticle->GetPDGCharge())*
539                    (aParticle->GetPDGCharge())    493                    (aParticle->GetPDGCharge())/
540                     QQPositron ;                  494                     QQPositron ;
541     oldIndex = -1 ;                               495     oldIndex = -1 ;
542   }                                               496   }
543   const G4PhysicsTable* rangeTable= t->theRang << 497   const G4PhysicsTable* rangeTable= t.theRangeTable;
544   const G4PhysicsTable*  dEdxTable= t->theDEDX << 498   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
545   if (!rangeTable) {                           << 499   if (!dEdxTable || !rangeTable) ParticleHaveNoLoss(aParticle);
546     ParticleHaveNoLoss(aParticle,"Range");     << 
547     return 0.0;                                << 
548   }                                            << 
549                                                   500 
550   G4int materialIndex = (G4int)aMaterial->GetI << 501   G4int materialIndex = aMaterial->GetIndex();
551   G4double scaledKineticEnergy = KineticEnergy << 502   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
552   G4double Range;                                 503   G4double Range;
553   G4bool isOut;                                   504   G4bool isOut;
554                                                   505 
555   if (scaledKineticEnergy<t->theLowestKineticE << 506   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
556                                                   507 
557     Range = std::sqrt(scaledKineticEnergy/t->t << 508     Range = sqrt(scaledKineticEnergy/t.theLowestKineticEnergy)*
558             (*rangeTable)(materialIndex)->GetV    509             (*rangeTable)(materialIndex)->GetValue(
559               t->theLowestKineticEnergy,isOut) << 510               t.theLowestKineticEnergy,isOut);
560                                                   511 
561   } else if (scaledKineticEnergy>t->theHighest << 512   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
562                                                   513 
563     Range = (*rangeTable)(materialIndex)->GetV    514     Range = (*rangeTable)(materialIndex)->GetValue(
564         t->theHighestKineticEnergy,isOut)+     << 515         t.theHighestKineticEnergy,isOut)+
565             (scaledKineticEnergy-t->theHighest << 516             (scaledKineticEnergy-t.theHighestKineticEnergy)/
566             (*dEdxTable)(materialIndex)->GetVa    517             (*dEdxTable)(materialIndex)->GetValue(
567               t->theHighestKineticEnergy,isOut << 518               t.theHighestKineticEnergy,isOut);
568                                                   519 
569   } else {                                        520   } else {
570                                                   521 
571     Range = (*rangeTable)(materialIndex)->GetV    522     Range = (*rangeTable)(materialIndex)->GetValue(
572          scaledKineticEnergy,isOut);              523          scaledKineticEnergy,isOut);
573                                                   524 
574   }                                               525   }
575                                                   526 
576   return Range/(Chargesquare*t->theMassRatio); << 527   return Range/(Chargesquare*t.theMassRatio);
577 }                                                 528 }
578                                                   529 
579 //....oooOO0OOooo........oooOO0OOooo........oo    530 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
580                                                   531 
581 G4double G4EnergyLossTables::GetPreciseEnergyF    532 G4double G4EnergyLossTables::GetPreciseEnergyFromRange(
582                                      const G4P    533                                      const G4ParticleDefinition *aParticle,
583                                            G4d    534                                            G4double range,
584                                      const G4M    535                                      const G4Material *aMaterial)
585 // it returns the value of the kinetic energy     536 // it returns the value of the kinetic energy for a given range
586 {                                                 537 {
587   if (!t) t = new G4EnergyLossTablesHelper;    << 
588                                                << 
589   CPRWarning();                                   538   CPRWarning();
590   if( aParticle != (const G4ParticleDefinition << 539   if( aParticle != lastParticle)
591   {                                               540   {
592     *t= GetTables(aParticle);                  << 541     t= GetTables(aParticle);
593     lastParticle = (G4ParticleDefinition*) aPa << 542     lastParticle = aParticle;
594     Chargesquare = (aParticle->GetPDGCharge())    543     Chargesquare = (aParticle->GetPDGCharge())*
595                    (aParticle->GetPDGCharge())    544                    (aParticle->GetPDGCharge())/
596                     QQPositron ;                  545                     QQPositron ;
597     oldIndex = -1 ;                               546     oldIndex = -1 ;
598   }                                               547   }
599   const G4PhysicsTable*  dEdxTable= t->theDEDX << 548   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
600   const G4PhysicsTable*  inverseRangeTable= t- << 549   const G4PhysicsTable*  inverseRangeTable= t.theInverseRangeTable;
601   if (!inverseRangeTable) {                    << 550   if (!dEdxTable || !inverseRangeTable) ParticleHaveNoLoss(aParticle);
602     ParticleHaveNoLoss(aParticle,"InverseRange << 
603     return 0.0;                                << 
604   }                                            << 
605                                                   551 
606   G4double scaledrange,scaledKineticEnergy ;      552   G4double scaledrange,scaledKineticEnergy ;
607   G4bool isOut ;                                  553   G4bool isOut ;
608                                                   554 
609   G4int materialIndex = (G4int)aMaterial->GetI << 555   G4int materialIndex = aMaterial->GetIndex() ;
610                                                   556 
611   if(materialIndex != oldIndex)                   557   if(materialIndex != oldIndex)
612   {                                               558   {
613     oldIndex = materialIndex ;                    559     oldIndex = materialIndex ;
614     rmin = (*inverseRangeTable)(materialIndex)    560     rmin = (*inverseRangeTable)(materialIndex)->
615                               GetLowEdgeEnergy    561                               GetLowEdgeEnergy(0) ;
616     rmax = (*inverseRangeTable)(materialIndex)    562     rmax = (*inverseRangeTable)(materialIndex)->
617                    GetLowEdgeEnergy(t->theNumb << 563                    GetLowEdgeEnergy(t.theNumberOfBins-2) ;
618     Thigh = (*inverseRangeTable)(materialIndex    564     Thigh = (*inverseRangeTable)(materialIndex)->
619                               GetValue(rmax,is    565                               GetValue(rmax,isOut) ;
620   }                                               566   }
621                                                   567 
622   scaledrange = range*Chargesquare*t->theMassR << 568   scaledrange = range*Chargesquare*t.theMassRatio ;
623                                                   569 
624   if(scaledrange < rmin)                          570   if(scaledrange < rmin)
625   {                                               571   {
626     scaledKineticEnergy = t->theLowestKineticE << 572     scaledKineticEnergy = t.theLowestKineticEnergy*
627                    scaledrange*scaledrange/(rm    573                    scaledrange*scaledrange/(rmin*rmin) ;
628   }                                               574   }
629   else                                            575   else
630   {                                               576   {
631     if(scaledrange < rmax)                        577     if(scaledrange < rmax)
632     {                                             578     {
633       scaledKineticEnergy = (*inverseRangeTabl    579       scaledKineticEnergy = (*inverseRangeTable)(materialIndex)->
634                               GetValue( scaled    580                               GetValue( scaledrange,isOut) ;
635     }                                             581     }
636     else                                          582     else
637     {                                             583     {
638       scaledKineticEnergy = Thigh +               584       scaledKineticEnergy = Thigh +
639                       (scaledrange-rmax)*         585                       (scaledrange-rmax)*
640                       (*dEdxTable)(materialInd    586                       (*dEdxTable)(materialIndex)->
641                                  GetValue(Thig    587                                  GetValue(Thigh,isOut) ;
642     }                                             588     }
643   }                                               589   }
644                                                   590 
645   return scaledKineticEnergy/t->theMassRatio ; << 591   return scaledKineticEnergy/t.theMassRatio ;
646 }                                                 592 }
647                                                   593 
648 //....oooOO0OOooo........oooOO0OOooo........oo    594 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
649                                                   595 
650  G4double G4EnergyLossTables::GetPreciseDEDX(     596  G4double G4EnergyLossTables::GetPreciseDEDX(
651     const G4ParticleDefinition *aParticle,        597     const G4ParticleDefinition *aParticle,
652     G4double KineticEnergy,                       598     G4double KineticEnergy,
653     const G4Material *aMaterial)                  599     const G4Material *aMaterial)
654 {                                                 600 {
655   if (!t) t = new G4EnergyLossTablesHelper;    << 
656                                                << 
657   CPRWarning();                                   601   CPRWarning();
658   if( aParticle != (const G4ParticleDefinition << 602   if( aParticle != lastParticle)
659   {                                               603   {
660     *t= GetTables(aParticle);                  << 604     t= GetTables(aParticle);
661     lastParticle = (G4ParticleDefinition*) aPa << 605     lastParticle = aParticle;
662     Chargesquare = (aParticle->GetPDGCharge())    606     Chargesquare = (aParticle->GetPDGCharge())*
663                    (aParticle->GetPDGCharge())    607                    (aParticle->GetPDGCharge())/
664                     QQPositron ;                  608                     QQPositron ;
665     oldIndex = -1 ;                               609     oldIndex = -1 ;
666   }                                               610   }
667   const G4PhysicsTable*  dEdxTable= t->theDEDX << 611   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
668   if (!dEdxTable) {                            << 612   if (!dEdxTable) ParticleHaveNoLoss(aParticle);
669     ParticleHaveNoLoss(aParticle,"dEdx");      << 
670     return 0.0;                                << 
671   }                                            << 
672                                                   613 
673   G4int materialIndex = (G4int)aMaterial->GetI << 614   G4int materialIndex = aMaterial->GetIndex();
674   G4double scaledKineticEnergy = KineticEnergy << 615   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
675   G4double dEdx;                                  616   G4double dEdx;
676   G4bool isOut;                                   617   G4bool isOut;
677                                                   618 
678   if (scaledKineticEnergy<t->theLowestKineticE << 619   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
679                                                   620 
680      dEdx = std::sqrt(scaledKineticEnergy/t->t << 621      dEdx = sqrt(scaledKineticEnergy/t.theLowestKineticEnergy)
681             *(*dEdxTable)(materialIndex)->GetV    622             *(*dEdxTable)(materialIndex)->GetValue(
682               t->theLowestKineticEnergy,isOut) << 623               t.theLowestKineticEnergy,isOut);
683                                                   624 
684   } else if (scaledKineticEnergy>t->theHighest << 625   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
685                                                   626 
686      dEdx = (*dEdxTable)(materialIndex)->GetVa    627      dEdx = (*dEdxTable)(materialIndex)->GetValue(
687         t->theHighestKineticEnergy,isOut);     << 628         t.theHighestKineticEnergy,isOut);
688                                                   629 
689   } else {                                        630   } else {
690                                                   631 
691       dEdx = (*dEdxTable)(materialIndex)->GetV    632       dEdx = (*dEdxTable)(materialIndex)->GetValue(
692                           scaledKineticEnergy,    633                           scaledKineticEnergy,isOut) ;
693                                                   634 
694   }                                               635   }
695                                                   636 
696   return dEdx*Chargesquare;                       637   return dEdx*Chargesquare;
697 }                                                 638 }
698                                                   639 
699 //....oooOO0OOooo........oooOO0OOooo........oo    640 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
700                                                   641 
701  G4double G4EnergyLossTables::GetPreciseRangeF    642  G4double G4EnergyLossTables::GetPreciseRangeFromEnergy(
702     const G4ParticleDefinition *aParticle,        643     const G4ParticleDefinition *aParticle,
703     G4double KineticEnergy,                       644     G4double KineticEnergy,
704     const G4Material *aMaterial)                  645     const G4Material *aMaterial)
705 {                                                 646 {
706   if (!t) t = new G4EnergyLossTablesHelper;    << 
707                                                << 
708   CPRWarning();                                   647   CPRWarning();
709   if( aParticle != (const G4ParticleDefinition << 648   if( aParticle != lastParticle)
710   {                                               649   {
711     *t= GetTables(aParticle);                  << 650     t= GetTables(aParticle);
712     lastParticle = (G4ParticleDefinition*) aPa << 651     lastParticle = aParticle;
713     Chargesquare = (aParticle->GetPDGCharge())    652     Chargesquare = (aParticle->GetPDGCharge())*
714                    (aParticle->GetPDGCharge())    653                    (aParticle->GetPDGCharge())/
715                     QQPositron ;                  654                     QQPositron ;
716     oldIndex = -1 ;                               655     oldIndex = -1 ;
717   }                                               656   }
718   const G4PhysicsTable* rangeTable= t->theRang << 657   const G4PhysicsTable* rangeTable= t.theRangeTable;
719   const G4PhysicsTable*  dEdxTable= t->theDEDX << 658   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
720   if (!rangeTable) {                           << 659   if (!dEdxTable || !rangeTable) ParticleHaveNoLoss(aParticle);
721     ParticleHaveNoLoss(aParticle,"Range");     << 660 
722     return 0.0;                                << 661   G4int materialIndex = aMaterial->GetIndex();
723   }                                            << 
724   G4int materialIndex = (G4int)aMaterial->GetI << 
725                                                   662 
726   G4double Thighr = t->theHighestKineticEnergy << 663   G4double Thighr = t.theHighestKineticEnergy*t.theLowestKineticEnergy/
727                    (*rangeTable)(materialIndex    664                    (*rangeTable)(materialIndex)->
728                    GetLowEdgeEnergy(1) ;          665                    GetLowEdgeEnergy(1) ;
729                                                   666 
730   G4double scaledKineticEnergy = KineticEnergy << 667   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
731   G4double Range;                                 668   G4double Range;
732   G4bool isOut;                                   669   G4bool isOut;
733                                                   670 
734   if (scaledKineticEnergy<t->theLowestKineticE << 671   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
735                                                   672 
736     Range = std::sqrt(scaledKineticEnergy/t->t << 673     Range = sqrt(scaledKineticEnergy/t.theLowestKineticEnergy)*
737             (*rangeTable)(materialIndex)->GetV    674             (*rangeTable)(materialIndex)->GetValue(
738               t->theLowestKineticEnergy,isOut) << 675               t.theLowestKineticEnergy,isOut);
739                                                   676 
740   } else if (scaledKineticEnergy>Thighr) {        677   } else if (scaledKineticEnergy>Thighr) {
741                                                   678 
742     Range = (*rangeTable)(materialIndex)->GetV    679     Range = (*rangeTable)(materialIndex)->GetValue(
743         Thighr,isOut)+                            680         Thighr,isOut)+
744             (scaledKineticEnergy-Thighr)/         681             (scaledKineticEnergy-Thighr)/
745             (*dEdxTable)(materialIndex)->GetVa    682             (*dEdxTable)(materialIndex)->GetValue(
746               Thighr,isOut);                      683               Thighr,isOut);
747                                                   684 
748   } else {                                        685   } else {
749                                                   686 
750      Range = (*rangeTable)(materialIndex)->Get    687      Range = (*rangeTable)(materialIndex)->GetValue(
751                        scaledKineticEnergy,isO    688                        scaledKineticEnergy,isOut) ;
752                                                   689 
753   }                                               690   }
754                                                   691 
755   return Range/(Chargesquare*t->theMassRatio); << 692   return Range/(Chargesquare*t.theMassRatio);
756 }                                                 693 }
757                                                   694 
758 //....oooOO0OOooo........oooOO0OOooo........oo    695 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
759                                                   696 
760 G4double G4EnergyLossTables::GetDEDX(             697 G4double G4EnergyLossTables::GetDEDX(
761     const G4ParticleDefinition *aParticle,        698     const G4ParticleDefinition *aParticle,
762     G4double KineticEnergy,                       699     G4double KineticEnergy,
763     const G4MaterialCutsCouple *couple,        << 700     const G4MaterialCutsCouple *couple)
764     G4bool check)                              << 
765 {                                                 701 {
766   if (!t) t = new G4EnergyLossTablesHelper;    << 702   if(aParticle != lastParticle)
767                                                << 
768   if(aParticle != (const G4ParticleDefinition* << 
769   {                                               703   {
770     *t= GetTables(aParticle);                  << 704     t= GetTables(aParticle);
771     lastParticle = (G4ParticleDefinition*) aPa << 705     lastParticle = aParticle ;
772     Chargesquare = (aParticle->GetPDGCharge())    706     Chargesquare = (aParticle->GetPDGCharge())*
773                    (aParticle->GetPDGCharge())    707                    (aParticle->GetPDGCharge())/
774                    QQPositron ;                   708                    QQPositron ;
775     oldIndex = -1 ;                               709     oldIndex = -1 ;
776   }                                               710   }
777   const G4PhysicsTable*  dEdxTable= t->theDEDX << 711   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
778                                                << 712   if ( !dEdxTable )
779   if (!dEdxTable ) {                           << 713     return G4LossTableManager::Instance()->GetDEDX(aParticle,KineticEnergy,couple);
780     if (check) return G4LossTableManager::Inst << 
781     else       ParticleHaveNoLoss(aParticle, " << 
782     return 0.0;                                << 
783   }                                            << 
784                                                   714 
785   G4int materialIndex = couple->GetIndex();       715   G4int materialIndex = couple->GetIndex();
786   G4double scaledKineticEnergy = KineticEnergy << 716   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
787   G4double dEdx;                                  717   G4double dEdx;
788   G4bool isOut;                                   718   G4bool isOut;
789                                                   719 
790   if (scaledKineticEnergy<t->theLowestKineticE << 720   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
791                                                   721 
792      dEdx =(*dEdxTable)(materialIndex)->GetVal    722      dEdx =(*dEdxTable)(materialIndex)->GetValue(
793               t->theLowestKineticEnergy,isOut) << 723               t.theLowestKineticEnergy,isOut)
794            *std::sqrt(scaledKineticEnergy/t->t << 724            *sqrt(scaledKineticEnergy/t.theLowestKineticEnergy);
795                                                   725 
796   } else if (scaledKineticEnergy>t->theHighest << 726   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
797                                                   727 
798      dEdx = (*dEdxTable)(materialIndex)->GetVa    728      dEdx = (*dEdxTable)(materialIndex)->GetValue(
799         t->theHighestKineticEnergy,isOut);     << 729         t.theHighestKineticEnergy,isOut);
800                                                   730 
801   } else {                                        731   } else {
802                                                   732 
803     dEdx = (*dEdxTable)(materialIndex)->GetVal    733     dEdx = (*dEdxTable)(materialIndex)->GetValue(
804          scaledKineticEnergy,isOut);              734          scaledKineticEnergy,isOut);
805                                                   735 
806   }                                               736   }
807                                                   737 
808   return dEdx*Chargesquare;                       738   return dEdx*Chargesquare;
809 }                                                 739 }
810                                                   740 
811 //....oooOO0OOooo........oooOO0OOooo........oo    741 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
812                                                   742 
813 G4double G4EnergyLossTables::GetRange(            743 G4double G4EnergyLossTables::GetRange(
814     const G4ParticleDefinition *aParticle,        744     const G4ParticleDefinition *aParticle,
815     G4double KineticEnergy,                       745     G4double KineticEnergy,
816     const G4MaterialCutsCouple *couple,        << 746     const G4MaterialCutsCouple *couple)
817     G4bool check)                              << 
818 {                                                 747 {
819   if (!t) t = new G4EnergyLossTablesHelper;    << 748   if(aParticle != lastParticle)
820                                                << 
821   if(aParticle != (const G4ParticleDefinition* << 
822   {                                               749   {
823     *t= GetTables(aParticle);                  << 750     t= GetTables(aParticle);
824     lastParticle = (G4ParticleDefinition*) aPa << 751     lastParticle = aParticle ;
825     Chargesquare = (aParticle->GetPDGCharge())    752     Chargesquare = (aParticle->GetPDGCharge())*
826                    (aParticle->GetPDGCharge())    753                    (aParticle->GetPDGCharge())/
827                     QQPositron ;                  754                     QQPositron ;
828     oldIndex = -1 ;                               755     oldIndex = -1 ;
829   }                                               756   }
830   const G4PhysicsTable* rangeTable= t->theRang << 757   const G4PhysicsTable* rangeTable= t.theRangeTable;
831   const G4PhysicsTable*  dEdxTable= t->theDEDX << 758   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
832   if (!rangeTable) {                           << 759   if ( !rangeTable || !dEdxTable)
833     if(check) return G4LossTableManager::Insta << 760     return G4LossTableManager::Instance()->GetRange(aParticle,KineticEnergy,couple);
834     else      return DBL_MAX;                  << 761 
835       //ParticleHaveNoLoss(aParticle,"Range"); << 
836   }                                            << 
837                                                   762 
838   G4int materialIndex = couple->GetIndex();       763   G4int materialIndex = couple->GetIndex();
839   G4double scaledKineticEnergy = KineticEnergy << 764   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
840   G4double Range;                                 765   G4double Range;
841   G4bool isOut;                                   766   G4bool isOut;
842                                                   767 
843   if (scaledKineticEnergy<t->theLowestKineticE << 768   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
844                                                   769 
845     Range = std::sqrt(scaledKineticEnergy/t->t << 770     Range = sqrt(scaledKineticEnergy/t.theLowestKineticEnergy)*
846             (*rangeTable)(materialIndex)->GetV    771             (*rangeTable)(materialIndex)->GetValue(
847               t->theLowestKineticEnergy,isOut) << 772               t.theLowestKineticEnergy,isOut);
848                                                   773 
849   } else if (scaledKineticEnergy>t->theHighest << 774   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
850                                                   775 
851     Range = (*rangeTable)(materialIndex)->GetV    776     Range = (*rangeTable)(materialIndex)->GetValue(
852         t->theHighestKineticEnergy,isOut)+     << 777         t.theHighestKineticEnergy,isOut)+
853             (scaledKineticEnergy-t->theHighest << 778             (scaledKineticEnergy-t.theHighestKineticEnergy)/
854             (*dEdxTable)(materialIndex)->GetVa    779             (*dEdxTable)(materialIndex)->GetValue(
855               t->theHighestKineticEnergy,isOut << 780               t.theHighestKineticEnergy,isOut);
856                                                   781 
857   } else {                                        782   } else {
858                                                   783 
859     Range = (*rangeTable)(materialIndex)->GetV    784     Range = (*rangeTable)(materialIndex)->GetValue(
860          scaledKineticEnergy,isOut);              785          scaledKineticEnergy,isOut);
861                                                   786 
862   }                                               787   }
863                                                   788 
864   return Range/(Chargesquare*t->theMassRatio); << 789   return Range/(Chargesquare*t.theMassRatio);
865 }                                                 790 }
866                                                   791 
867 //....oooOO0OOooo........oooOO0OOooo........oo    792 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
868                                                   793 
869 G4double G4EnergyLossTables::GetPreciseEnergyF    794 G4double G4EnergyLossTables::GetPreciseEnergyFromRange(
870                                      const G4P    795                                      const G4ParticleDefinition *aParticle,
871                                            G4d    796                                            G4double range,
872                                      const G4M << 797                                      const G4MaterialCutsCouple *couple)
873                    G4bool check)               << 
874 // it returns the value of the kinetic energy     798 // it returns the value of the kinetic energy for a given range
875 {                                                 799 {
876   if (!t) t = new G4EnergyLossTablesHelper;    << 800   if( aParticle != lastParticle)
877                                                << 
878   if( aParticle != (const G4ParticleDefinition << 
879   {                                               801   {
880     *t= GetTables(aParticle);                  << 802     t= GetTables(aParticle);
881     lastParticle = (G4ParticleDefinition*) aPa << 803     lastParticle = aParticle;
882     Chargesquare = (aParticle->GetPDGCharge())    804     Chargesquare = (aParticle->GetPDGCharge())*
883                    (aParticle->GetPDGCharge())    805                    (aParticle->GetPDGCharge())/
884                     QQPositron ;                  806                     QQPositron ;
885     oldIndex = -1 ;                               807     oldIndex = -1 ;
886   }                                               808   }
887   const G4PhysicsTable*  dEdxTable= t->theDEDX << 809   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
888   const G4PhysicsTable*  inverseRangeTable= t- << 810   const G4PhysicsTable*  inverseRangeTable= t.theInverseRangeTable;
889                                                << 811   if ( !dEdxTable || !inverseRangeTable)
890   if (!inverseRangeTable) {                    << 812     return G4LossTableManager::Instance()->GetEnergy(aParticle,range,couple);
891     if(check) return G4LossTableManager::Insta << 
892     else      return DBL_MAX;                  << 
893     //    else      ParticleHaveNoLoss(aPartic << 
894   }                                            << 
895                                                   813 
896   G4double scaledrange,scaledKineticEnergy ;      814   G4double scaledrange,scaledKineticEnergy ;
897   G4bool isOut ;                                  815   G4bool isOut ;
898                                                   816 
899   G4int materialIndex = couple->GetIndex() ;      817   G4int materialIndex = couple->GetIndex() ;
900                                                   818 
901   if(materialIndex != oldIndex)                   819   if(materialIndex != oldIndex)
902   {                                               820   {
903     oldIndex = materialIndex ;                    821     oldIndex = materialIndex ;
904     rmin = (*inverseRangeTable)(materialIndex)    822     rmin = (*inverseRangeTable)(materialIndex)->
905                               GetLowEdgeEnergy    823                               GetLowEdgeEnergy(0) ;
906     rmax = (*inverseRangeTable)(materialIndex)    824     rmax = (*inverseRangeTable)(materialIndex)->
907                    GetLowEdgeEnergy(t->theNumb << 825                    GetLowEdgeEnergy(t.theNumberOfBins-2) ;
908     Thigh = (*inverseRangeTable)(materialIndex    826     Thigh = (*inverseRangeTable)(materialIndex)->
909                               GetValue(rmax,is    827                               GetValue(rmax,isOut) ;
910   }                                               828   }
911                                                   829 
912   scaledrange = range*Chargesquare*t->theMassR << 830   scaledrange = range*Chargesquare*t.theMassRatio ;
913                                                   831 
914   if(scaledrange < rmin)                          832   if(scaledrange < rmin)
915   {                                               833   {
916     scaledKineticEnergy = t->theLowestKineticE << 834     scaledKineticEnergy = t.theLowestKineticEnergy*
917                    scaledrange*scaledrange/(rm    835                    scaledrange*scaledrange/(rmin*rmin) ;
918   }                                               836   }
919   else                                            837   else
920   {                                               838   {
921     if(scaledrange < rmax)                        839     if(scaledrange < rmax)
922     {                                             840     {
923       scaledKineticEnergy = (*inverseRangeTabl    841       scaledKineticEnergy = (*inverseRangeTable)(materialIndex)->
924                               GetValue( scaled    842                               GetValue( scaledrange,isOut) ;
925     }                                             843     }
926     else                                          844     else
927     {                                             845     {
928       scaledKineticEnergy = Thigh +               846       scaledKineticEnergy = Thigh +
929                       (scaledrange-rmax)*         847                       (scaledrange-rmax)*
930                       (*dEdxTable)(materialInd    848                       (*dEdxTable)(materialIndex)->
931                                  GetValue(Thig    849                                  GetValue(Thigh,isOut) ;
932     }                                             850     }
933   }                                               851   }
934                                                   852 
935   return scaledKineticEnergy/t->theMassRatio ; << 853   return scaledKineticEnergy/t.theMassRatio ;
936 }                                                 854 }
937                                                   855 
938 //....oooOO0OOooo........oooOO0OOooo........oo    856 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
939                                                   857 
940 G4double G4EnergyLossTables::GetPreciseDEDX(      858 G4double G4EnergyLossTables::GetPreciseDEDX(
941     const G4ParticleDefinition *aParticle,        859     const G4ParticleDefinition *aParticle,
942     G4double KineticEnergy,                       860     G4double KineticEnergy,
943     const G4MaterialCutsCouple *couple)           861     const G4MaterialCutsCouple *couple)
944 {                                                 862 {
945   if (!t) t = new G4EnergyLossTablesHelper;    << 
946                                                   863 
947   if( aParticle != (const G4ParticleDefinition << 864   if( aParticle != lastParticle)
948   {                                               865   {
949     *t= GetTables(aParticle);                  << 866     t= GetTables(aParticle);
950     lastParticle = (G4ParticleDefinition*) aPa << 867     lastParticle = aParticle;
951     Chargesquare = (aParticle->GetPDGCharge())    868     Chargesquare = (aParticle->GetPDGCharge())*
952                    (aParticle->GetPDGCharge())    869                    (aParticle->GetPDGCharge())/
953                     QQPositron ;                  870                     QQPositron ;
954     oldIndex = -1 ;                               871     oldIndex = -1 ;
955   }                                               872   }
956   const G4PhysicsTable*  dEdxTable= t->theDEDX << 873   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
957   if ( !dEdxTable )                               874   if ( !dEdxTable )
958     return G4LossTableManager::Instance()->Get    875     return G4LossTableManager::Instance()->GetDEDX(aParticle,KineticEnergy,couple);
959                                                   876 
960   G4int materialIndex = couple->GetIndex();       877   G4int materialIndex = couple->GetIndex();
961   G4double scaledKineticEnergy = KineticEnergy << 878   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
962   G4double dEdx;                                  879   G4double dEdx;
963   G4bool isOut;                                   880   G4bool isOut;
964                                                   881 
965   if (scaledKineticEnergy<t->theLowestKineticE << 882   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
966                                                   883 
967      dEdx = std::sqrt(scaledKineticEnergy/t->t << 884      dEdx = sqrt(scaledKineticEnergy/t.theLowestKineticEnergy)
968             *(*dEdxTable)(materialIndex)->GetV    885             *(*dEdxTable)(materialIndex)->GetValue(
969               t->theLowestKineticEnergy,isOut) << 886               t.theLowestKineticEnergy,isOut);
970                                                   887 
971   } else if (scaledKineticEnergy>t->theHighest << 888   } else if (scaledKineticEnergy>t.theHighestKineticEnergy) {
972                                                   889 
973      dEdx = (*dEdxTable)(materialIndex)->GetVa    890      dEdx = (*dEdxTable)(materialIndex)->GetValue(
974         t->theHighestKineticEnergy,isOut);     << 891         t.theHighestKineticEnergy,isOut);
975                                                   892 
976   } else {                                        893   } else {
977                                                   894 
978       dEdx = (*dEdxTable)(materialIndex)->GetV    895       dEdx = (*dEdxTable)(materialIndex)->GetValue(
979                           scaledKineticEnergy,    896                           scaledKineticEnergy,isOut) ;
980                                                   897 
981   }                                               898   }
982                                                   899 
983   return dEdx*Chargesquare;                       900   return dEdx*Chargesquare;
984 }                                                 901 }
985                                                   902 
986 //....oooOO0OOooo........oooOO0OOooo........oo    903 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
987                                                   904 
988 G4double G4EnergyLossTables::GetPreciseRangeFr    905 G4double G4EnergyLossTables::GetPreciseRangeFromEnergy(
989     const G4ParticleDefinition *aParticle,        906     const G4ParticleDefinition *aParticle,
990     G4double KineticEnergy,                       907     G4double KineticEnergy,
991     const G4MaterialCutsCouple *couple)           908     const G4MaterialCutsCouple *couple)
992 {                                                 909 {
993   if (!t) t = new G4EnergyLossTablesHelper;    << 910   if( aParticle != lastParticle)
994                                                << 
995   if( aParticle != (const G4ParticleDefinition << 
996   {                                               911   {
997     *t= GetTables(aParticle);                  << 912     t= GetTables(aParticle);
998     lastParticle = (G4ParticleDefinition*) aPa << 913     lastParticle = aParticle;
999     Chargesquare = (aParticle->GetPDGCharge())    914     Chargesquare = (aParticle->GetPDGCharge())*
1000                    (aParticle->GetPDGCharge()    915                    (aParticle->GetPDGCharge())/
1001                     QQPositron ;                 916                     QQPositron ;
1002     oldIndex = -1 ;                              917     oldIndex = -1 ;
1003   }                                              918   }
1004   const G4PhysicsTable* rangeTable= t->theRan << 919   const G4PhysicsTable* rangeTable= t.theRangeTable;
1005   const G4PhysicsTable*  dEdxTable= t->theDED << 920   const G4PhysicsTable*  dEdxTable= t.theDEDXTable;
1006   if ( !dEdxTable || !rangeTable)                921   if ( !dEdxTable || !rangeTable)
1007     return G4LossTableManager::Instance()->Ge    922     return G4LossTableManager::Instance()->GetDEDX(aParticle,KineticEnergy,couple);
1008                                                  923 
1009   G4int materialIndex = couple->GetIndex();      924   G4int materialIndex = couple->GetIndex();
1010                                                  925 
1011   G4double Thighr = t->theHighestKineticEnerg << 926   G4double Thighr = t.theHighestKineticEnergy*t.theLowestKineticEnergy/
1012                    (*rangeTable)(materialInde    927                    (*rangeTable)(materialIndex)->
1013                    GetLowEdgeEnergy(1) ;         928                    GetLowEdgeEnergy(1) ;
1014                                                  929 
1015   G4double scaledKineticEnergy = KineticEnerg << 930   G4double scaledKineticEnergy = KineticEnergy*t.theMassRatio;
1016   G4double Range;                                931   G4double Range;
1017   G4bool isOut;                                  932   G4bool isOut;
1018                                                  933 
1019   if (scaledKineticEnergy<t->theLowestKinetic << 934   if (scaledKineticEnergy<t.theLowestKineticEnergy) {
1020                                                  935 
1021     Range = std::sqrt(scaledKineticEnergy/t-> << 936     Range = sqrt(scaledKineticEnergy/t.theLowestKineticEnergy)*
1022             (*rangeTable)(materialIndex)->Get    937             (*rangeTable)(materialIndex)->GetValue(
1023               t->theLowestKineticEnergy,isOut << 938               t.theLowestKineticEnergy,isOut);
1024                                                  939 
1025   } else if (scaledKineticEnergy>Thighr) {       940   } else if (scaledKineticEnergy>Thighr) {
1026                                                  941 
1027     Range = (*rangeTable)(materialIndex)->Get    942     Range = (*rangeTable)(materialIndex)->GetValue(
1028         Thighr,isOut)+                           943         Thighr,isOut)+
1029             (scaledKineticEnergy-Thighr)/        944             (scaledKineticEnergy-Thighr)/
1030             (*dEdxTable)(materialIndex)->GetV    945             (*dEdxTable)(materialIndex)->GetValue(
1031               Thighr,isOut);                     946               Thighr,isOut);
1032                                                  947 
1033   } else {                                       948   } else {
1034                                                  949 
1035      Range = (*rangeTable)(materialIndex)->Ge    950      Range = (*rangeTable)(materialIndex)->GetValue(
1036                        scaledKineticEnergy,is    951                        scaledKineticEnergy,isOut) ;
1037                                                  952 
1038   }                                              953   }
1039                                                  954 
1040   return Range/(Chargesquare*t->theMassRatio) << 955   return Range/(Chargesquare*t.theMassRatio);
1041 }                                                956 }
1042                                                  957 
1043 //....oooOO0OOooo........oooOO0OOooo........o    958 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1044                                                  959 
1045 void G4EnergyLossTables::CPRWarning()            960 void G4EnergyLossTables::CPRWarning()
1046 {                                                961 {
1047   if (let_counter <  let_max_num_warnings) {  << 962 //  if (let_counter <  let_max_num_warnings) {
1048                                                  963 
1049     G4cout << G4endl;                         << 964 //    G4cout << G4endl;
1050     G4cout << "##### G4EnergyLossTable WARNIN << 965 //    G4cout << "##### G4EnergyLossTable WARNING: The obsolete interface is used" << G4endl;
1051     G4cout << "##### RESULTS ARE NOT GARANTEE << 966 //    G4cout << "##### Please, substitute G4Material by G4MaterialCutsCouple" << G4endl;
1052     G4cout << "##### Please, substitute G4Mat << 967 //    G4cout << "##### Obsolete interface will be removed soon" << G4endl;
1053     G4cout << "##### Obsolete interface will  << 968 //    G4cout << G4endl;
1054     G4cout << G4endl;                         << 969 //    let_counter++;
1055     let_counter++;                            << 970   if ((G4RegionStore::GetInstance())->size() > 1) {
                                                   >> 971      G4Exception("G4EnergyLossTables:: More than 1 region - table can't be accessed with obsolete interface");
                                                   >> 972      exit(1);
                                                   >> 973   }
1056                                                  974 
1057   } else if (let_counter == let_max_num_warni << 975 //  } else if (let_counter == let_max_num_warnings) {
1058                                                  976 
1059     G4cout << "##### G4EnergyLossTable WARNIN << 977 //    G4cout << "##### G4EnergyLossTable WARNING closed" << G4endl;
1060     let_counter++;                            << 978 //    let_counter++;
1061   }                                           << 979 //  }
1062 }                                                980 }
1063                                                  981 
1064 //....oooOO0OOooo........oooOO0OOooo........o    982 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1065                                                  983 
1066 void                                          << 984 void G4EnergyLossTables::ParticleHaveNoLoss(const G4ParticleDefinition* aParticle)
1067 G4EnergyLossTables::ParticleHaveNoLoss(const  << 
1068                const G4String& /*q*/)         << 
1069 {                                                985 {
                                                   >> 986   G4String s = "G4EnergyLossTables:: dE/dx table not found for "
                                                   >> 987              + aParticle->GetParticleName() + "!";
                                                   >> 988   G4Exception(s);
                                                   >> 989   exit(1);
1070 }                                                990 }
1071                                                  991 
1072 //....oooOO0OOooo........oooOO0OOooo........o    992 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
1073                                                  993