Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/standard/src/G4BraggModel.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/standard/src/G4BraggModel.cc (Version 11.3.0) and /processes/electromagnetic/standard/src/G4BraggModel.cc (Version 11.2)


  1 //                                                  1 //
  2 // *******************************************      2 // ********************************************************************
  3 // * License and Disclaimer                         3 // * License and Disclaimer                                           *
  4 // *                                                4 // *                                                                  *
  5 // * The  Geant4 software  is  copyright of th      5 // * The  Geant4 software  is  copyright of the Copyright Holders  of *
  6 // * the Geant4 Collaboration.  It is provided      6 // * the Geant4 Collaboration.  It is provided  under  the terms  and *
  7 // * conditions of the Geant4 Software License      7 // * conditions of the Geant4 Software License,  included in the file *
  8 // * LICENSE and available at  http://cern.ch/      8 // * LICENSE and available at  http://cern.ch/geant4/license .  These *
  9 // * include a list of copyright holders.           9 // * include a list of copyright holders.                             *
 10 // *                                               10 // *                                                                  *
 11 // * Neither the authors of this software syst     11 // * Neither the authors of this software system, nor their employing *
 12 // * institutes,nor the agencies providing fin     12 // * institutes,nor the agencies providing financial support for this *
 13 // * work  make  any representation or  warran     13 // * work  make  any representation or  warranty, express or implied, *
 14 // * regarding  this  software system or assum     14 // * regarding  this  software system or assume any liability for its *
 15 // * use.  Please see the license in the file      15 // * use.  Please see the license in the file  LICENSE  and URL above *
 16 // * for the full disclaimer and the limitatio     16 // * for the full disclaimer and the limitation of liability.         *
 17 // *                                               17 // *                                                                  *
 18 // * This  code  implementation is the result      18 // * This  code  implementation is the result of  the  scientific and *
 19 // * technical work of the GEANT4 collaboratio     19 // * technical work of the GEANT4 collaboration.                      *
 20 // * By using,  copying,  modifying or  distri     20 // * By using,  copying,  modifying or  distributing the software (or *
 21 // * any work based  on the software)  you  ag     21 // * any work based  on the software)  you  agree  to acknowledge its *
 22 // * use  in  resulting  scientific  publicati     22 // * use  in  resulting  scientific  publications,  and indicate your *
 23 // * acceptance of all terms of the Geant4 Sof     23 // * acceptance of all terms of the Geant4 Software license.          *
 24 // *******************************************     24 // ********************************************************************
 25 //                                                 25 //
 26 //                                                 26 //
 27 // -------------------------------------------     27 // -------------------------------------------------------------------
 28 //                                                 28 //
 29 // GEANT4 Class file                               29 // GEANT4 Class file
 30 //                                                 30 //
 31 //                                                 31 //
 32 // File name:   G4BraggModel                       32 // File name:   G4BraggModel
 33 //                                                 33 //
 34 // Author:        Vladimir Ivanchenko              34 // Author:        Vladimir Ivanchenko
 35 //                                                 35 //
 36 // Creation date: 03.01.2002                       36 // Creation date: 03.01.2002
 37 //                                                 37 //
 38 // Modifications:                                  38 // Modifications: 
 39 //                                                 39 //
 40 // 04-12-02 Fix problem of G4DynamicParticle c     40 // 04-12-02 Fix problem of G4DynamicParticle constructor (V.Ivanchenko)
 41 // 23-12-02 Change interface in order to move      41 // 23-12-02 Change interface in order to move to cut per region (V.Ivanchenko)
 42 // 27-01-03 Make models region aware (V.Ivanch     42 // 27-01-03 Make models region aware (V.Ivanchenko)
 43 // 13-02-03 Add name (V.Ivanchenko)                43 // 13-02-03 Add name (V.Ivanchenko)
 44 // 04-06-03 Fix compilation warnings (V.Ivanch     44 // 04-06-03 Fix compilation warnings (V.Ivanchenko)
 45 // 12-09-04 Add lowestKinEnergy and change ord     45 // 12-09-04 Add lowestKinEnergy and change order of if in DEDX method (VI)
 46 // 11-04-05 Major optimisation of internal int     46 // 11-04-05 Major optimisation of internal interfaces (V.Ivantchenko)
 47 // 16-06-05 Fix problem of chemical formula (V     47 // 16-06-05 Fix problem of chemical formula (V.Ivantchenko)
 48 // 15-02-06 ComputeCrossSectionPerElectron, Co     48 // 15-02-06 ComputeCrossSectionPerElectron, ComputeCrossSectionPerAtom (mma)
 49 // 25-04-06 Add stopping data from PSTAR (V.Iv     49 // 25-04-06 Add stopping data from PSTAR (V.Ivanchenko)
 50 // 12-08-08 Added methods GetParticleCharge, G     50 // 12-08-08 Added methods GetParticleCharge, GetChargeSquareRatio, 
 51 //          CorrectionsAlongStep needed for io     51 //          CorrectionsAlongStep needed for ions(V.Ivanchenko)
 52                                                    52 
 53 // Class Description:                              53 // Class Description:
 54 //                                                 54 //
 55 // Implementation of energy loss and delta-ele     55 // Implementation of energy loss and delta-electron production by
 56 // slow charged heavy particles                    56 // slow charged heavy particles
 57                                                    57 
 58 // -------------------------------------------     58 // -------------------------------------------------------------------
 59 //                                                 59 //
 60                                                    60 
 61                                                    61 
 62 //....oooOO0OOooo........oooOO0OOooo........oo     62 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 63 //....oooOO0OOooo........oooOO0OOooo........oo     63 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 64                                                    64 
 65 #include "G4BraggModel.hh"                         65 #include "G4BraggModel.hh"
 66 #include "G4PhysicalConstants.hh"                  66 #include "G4PhysicalConstants.hh"
 67 #include "G4SystemOfUnits.hh"                      67 #include "G4SystemOfUnits.hh"
 68 #include "Randomize.hh"                            68 #include "Randomize.hh"
 69 #include "G4Electron.hh"                           69 #include "G4Electron.hh"
 70 #include "G4ParticleChangeForLoss.hh"              70 #include "G4ParticleChangeForLoss.hh"
 71 #include "G4LossTableManager.hh"                   71 #include "G4LossTableManager.hh"
 72 #include "G4EmCorrections.hh"                      72 #include "G4EmCorrections.hh"
 73 #include "G4EmParameters.hh"                       73 #include "G4EmParameters.hh"
 74 #include "G4DeltaAngle.hh"                         74 #include "G4DeltaAngle.hh"
 75 #include "G4ICRU90StoppingData.hh"                 75 #include "G4ICRU90StoppingData.hh"
 76 #include "G4NistManager.hh"                        76 #include "G4NistManager.hh"
 77 #include "G4Log.hh"                                77 #include "G4Log.hh"
 78 #include "G4Exp.hh"                                78 #include "G4Exp.hh"
 79 #include "G4AutoLock.hh"                           79 #include "G4AutoLock.hh"
 80                                                    80 
 81 //....oooOO0OOooo........oooOO0OOooo........oo     81 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 82                                                    82 
 83 G4ICRU90StoppingData* G4BraggModel::fICRU90 =      83 G4ICRU90StoppingData* G4BraggModel::fICRU90 = nullptr;
 84 G4PSTARStopping* G4BraggModel::fPSTAR = nullpt     84 G4PSTARStopping* G4BraggModel::fPSTAR = nullptr;
 85                                                    85 
 86 namespace                                          86 namespace
 87 {                                                  87 {
 88   G4Mutex ionMutex = G4MUTEX_INITIALIZER;          88   G4Mutex ionMutex = G4MUTEX_INITIALIZER;
 89 }                                                  89 }
 90                                                    90 
 91 G4BraggModel::G4BraggModel(const G4ParticleDef     91 G4BraggModel::G4BraggModel(const G4ParticleDefinition* p, const G4String& nam)
 92   : G4VEmModel(nam)                                92   : G4VEmModel(nam)
 93 {                                                  93 {
 94   SetHighEnergyLimit(2.0*CLHEP::MeV);              94   SetHighEnergyLimit(2.0*CLHEP::MeV);
 95                                                    95 
 96   lowestKinEnergy  = 0.25*CLHEP::keV;              96   lowestKinEnergy  = 0.25*CLHEP::keV;
 97   theZieglerFactor = CLHEP::eV*CLHEP::cm2*1.0e     97   theZieglerFactor = CLHEP::eV*CLHEP::cm2*1.0e-15;
 98   theElectron = G4Electron::Electron();            98   theElectron = G4Electron::Electron();
 99   expStopPower125 = 0.0;                           99   expStopPower125 = 0.0;
100                                                   100 
101   corr = G4LossTableManager::Instance()->EmCor    101   corr = G4LossTableManager::Instance()->EmCorrections();
102   if(nullptr != p) { SetParticle(p); }            102   if(nullptr != p) { SetParticle(p); }
103   else { SetParticle(theElectron); }              103   else { SetParticle(theElectron); }
104 }                                                 104 }
105                                                   105 
106 //....oooOO0OOooo........oooOO0OOooo........oo    106 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
107                                                   107 
108 G4BraggModel::~G4BraggModel()                     108 G4BraggModel::~G4BraggModel()
109 {                                                 109 {
110   if(isFirst) {                                   110   if(isFirst) { 
111     delete fPSTAR;                                111     delete fPSTAR; 
112     fPSTAR = nullptr;                             112     fPSTAR = nullptr;
113   }                                               113   }
114 }                                                 114 }
115                                                   115 
116 //....oooOO0OOooo........oooOO0OOooo........oo    116 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
117                                                   117 
118 void G4BraggModel::Initialise(const G4Particle    118 void G4BraggModel::Initialise(const G4ParticleDefinition* p,
119                               const G4DataVect    119                               const G4DataVector&)
120 {                                                 120 {
121   if(p != particle) { SetParticle(p); }           121   if(p != particle) { SetParticle(p); }
122                                                   122 
123   // always false before the run                  123   // always false before the run
124   SetDeexcitationFlag(false);                     124   SetDeexcitationFlag(false);
125                                                   125 
126   // initialise data only once                    126   // initialise data only once
127   if(nullptr == fPSTAR) {                         127   if(nullptr == fPSTAR) { 
128     G4AutoLock l(&ionMutex);                      128     G4AutoLock l(&ionMutex);
129     if(nullptr == fPSTAR) {                       129     if(nullptr == fPSTAR) { 
130       isFirst = true;                             130       isFirst = true;
131       fPSTAR = new G4PSTARStopping();             131       fPSTAR = new G4PSTARStopping();
132       if(G4EmParameters::Instance()->UseICRU90    132       if(G4EmParameters::Instance()->UseICRU90Data()) { 
133   fICRU90 = G4NistManager::Instance()->GetICRU    133   fICRU90 = G4NistManager::Instance()->GetICRU90StoppingData(); 
134       }                                           134       }
135     }                                             135     } 
136     l.unlock();                                   136     l.unlock();
137   }                                               137   }
138   if(isFirst) {                                   138   if(isFirst) {
139     if(nullptr != fICRU90) { fICRU90->Initiali    139     if(nullptr != fICRU90) { fICRU90->Initialise(); }
140     fPSTAR->Initialise();                         140     fPSTAR->Initialise();
141   }                                               141   }
142                                                   142 
143   if(nullptr == fParticleChange) {                143   if(nullptr == fParticleChange) {
144                                                   144 
145     if(UseAngularGeneratorFlag() && !GetAngula    145     if(UseAngularGeneratorFlag() && !GetAngularDistribution()) {
146       SetAngularDistribution(new G4DeltaAngle(    146       SetAngularDistribution(new G4DeltaAngle());
147     }                                             147     }
148     G4String pname = particle->GetParticleName    148     G4String pname = particle->GetParticleName();
149     if(particle->GetParticleType() == "nucleus    149     if(particle->GetParticleType() == "nucleus" && 
150        pname != "deuteron" && pname != "triton    150        pname != "deuteron" && pname != "triton" &&
151        pname != "alpha+"   && pname != "helium    151        pname != "alpha+"   && pname != "helium" &&
152        pname != "hydrogen") { isIon = true; }     152        pname != "hydrogen") { isIon = true; }
153                                                   153 
154     fParticleChange = GetParticleChangeForLoss    154     fParticleChange = GetParticleChangeForLoss();
155   }                                               155   }
156 }                                                 156 }
157                                                   157 
158 //....oooOO0OOooo........oooOO0OOooo........oo    158 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
159                                                   159 
160 void G4BraggModel::SetParticle(const G4Particl    160 void G4BraggModel::SetParticle(const G4ParticleDefinition* p)
161 {                                                 161 {
162   particle = p;                                   162   particle = p;
163   mass = particle->GetPDGMass();                  163   mass = particle->GetPDGMass();
164   spin = particle->GetPDGSpin();                  164   spin = particle->GetPDGSpin();
165   G4double q = particle->GetPDGCharge()/CLHEP:    165   G4double q = particle->GetPDGCharge()/CLHEP::eplus;
166   chargeSquare = q*q;                             166   chargeSquare = q*q;
167   massRate = mass/CLHEP::proton_mass_c2;          167   massRate = mass/CLHEP::proton_mass_c2;
168   ratio = CLHEP::electron_mass_c2/mass;           168   ratio = CLHEP::electron_mass_c2/mass;
169 }                                                 169 }
170                                                   170 
171 //....oooOO0OOooo........oooOO0OOooo........oo    171 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
172                                                   172 
173 G4double G4BraggModel::GetChargeSquareRatio(co    173 G4double G4BraggModel::GetChargeSquareRatio(const G4ParticleDefinition* p,
174                                             co    174                                             const G4Material* mat,
175                                             G4    175                                             G4double kinEnergy)
176 {                                                 176 {
177   // this method is called only for ions          177   // this method is called only for ions
178   chargeSquare = corr->EffectiveChargeSquareRa    178   chargeSquare = corr->EffectiveChargeSquareRatio(p, mat, kinEnergy);
179   return chargeSquare;                            179   return chargeSquare;
180 }                                                 180 }
181                                                   181 
182 //....oooOO0OOooo........oooOO0OOooo........oo    182 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
183                                                   183 
184 G4double G4BraggModel::MinEnergyCut(const G4Pa    184 G4double G4BraggModel::MinEnergyCut(const G4ParticleDefinition*,
185                                     const G4Ma    185                                     const G4MaterialCutsCouple* couple)
186 {                                                 186 {
187   return couple->GetMaterial()->GetIonisation(    187   return couple->GetMaterial()->GetIonisation()->GetMeanExcitationEnergy();
188 }                                                 188 }
189                                                   189 
190 //....oooOO0OOooo........oooOO0OOooo........oo    190 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
191                                                   191 
192 G4double G4BraggModel::GetParticleCharge(const    192 G4double G4BraggModel::GetParticleCharge(const G4ParticleDefinition* p,
193                                          const    193                                          const G4Material* mat,
194                                          G4dou    194                                          G4double kineticEnergy)
195 {                                                 195 {
196   // this method is called only for ions, so n    196   // this method is called only for ions, so no check if it is an ion 
197   return corr->GetParticleCharge(p,mat,kinetic    197   return corr->GetParticleCharge(p,mat,kineticEnergy);
198 }                                                 198 }
199                                                   199 
200 //....oooOO0OOooo........oooOO0OOooo........oo    200 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
201                                                   201 
202 G4double G4BraggModel::ComputeCrossSectionPerE    202 G4double G4BraggModel::ComputeCrossSectionPerElectron(
203                                            con    203                                            const G4ParticleDefinition* p,
204                                                   204                                                  G4double kineticEnergy,
205                                                   205                                                  G4double cut,
206                                                   206                                                  G4double maxKinEnergy)
207 {                                                 207 {
208   G4double cross = 0.0;                           208   G4double cross = 0.0;
209   const G4double tmax      = MaxSecondaryEnerg    209   const G4double tmax      = MaxSecondaryEnergy(p, kineticEnergy);
210   const G4double maxEnergy = std::min(tmax, ma    210   const G4double maxEnergy = std::min(tmax, maxKinEnergy);
211   const G4double cutEnergy = std::max(cut, low    211   const G4double cutEnergy = std::max(cut, lowestKinEnergy*massRate);
212   if(cutEnergy < maxEnergy) {                     212   if(cutEnergy < maxEnergy) {
213                                                   213 
214     const G4double energy  = kineticEnergy + m    214     const G4double energy  = kineticEnergy + mass;
215     const G4double energy2 = energy*energy;       215     const G4double energy2 = energy*energy;
216     const G4double beta2   = kineticEnergy*(ki    216     const G4double beta2   = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2;
217     cross = (maxEnergy - cutEnergy)/(cutEnergy    217     cross = (maxEnergy - cutEnergy)/(cutEnergy*maxEnergy) 
218       - beta2*G4Log(maxEnergy/cutEnergy)/tmax;    218       - beta2*G4Log(maxEnergy/cutEnergy)/tmax;
219                                                   219 
220     if( 0.0 < spin ) { cross += 0.5*(maxEnergy    220     if( 0.0 < spin ) { cross += 0.5*(maxEnergy - cutEnergy)/energy2; }
221                                                   221 
222     cross *= CLHEP::twopi_mc2_rcl2*chargeSquar    222     cross *= CLHEP::twopi_mc2_rcl2*chargeSquare/beta2;
223   }                                               223   }
224   //   G4cout << "BR: e= " << kineticEnergy <<    224   //   G4cout << "BR: e= " << kineticEnergy << " tmin= " << cutEnergy 
225   //          << " tmax= " << tmax << " cross=    225   //          << " tmax= " << tmax << " cross= " << cross << G4endl;
226   return cross;                                   226   return cross;
227 }                                                 227 }
228                                                   228 
229 //....oooOO0OOooo........oooOO0OOooo........oo    229 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
230                                                   230 
231 G4double                                          231 G4double 
232 G4BraggModel::ComputeCrossSectionPerAtom(const    232 G4BraggModel::ComputeCrossSectionPerAtom(const G4ParticleDefinition* p,
233                                          G4dou    233                                          G4double kineticEnergy,
234                                          G4dou    234                                          G4double Z, G4double,
235                                          G4dou    235                                          G4double cutEnergy,
236                                          G4dou    236                                          G4double maxEnergy)
237 {                                                 237 {
238   return                                          238   return 
239     Z*ComputeCrossSectionPerElectron(p,kinetic    239     Z*ComputeCrossSectionPerElectron(p,kineticEnergy,cutEnergy,maxEnergy);
240 }                                                 240 }
241                                                   241 
242 //....oooOO0OOooo........oooOO0OOooo........oo    242 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
243                                                   243 
244 G4double G4BraggModel::CrossSectionPerVolume(c    244 G4double G4BraggModel::CrossSectionPerVolume(const G4Material* material,
245                                              c    245                                              const G4ParticleDefinition* p,
246                                              G    246                                              G4double kineticEnergy,
247                                              G    247                                              G4double cutEnergy,
248                                              G    248                                              G4double maxEnergy)
249 {                                                 249 {
250   return material->GetElectronDensity()           250   return material->GetElectronDensity()
251     *ComputeCrossSectionPerElectron(p,kineticE    251     *ComputeCrossSectionPerElectron(p,kineticEnergy,cutEnergy,maxEnergy);
252 }                                                 252 }
253                                                   253 
254 //....oooOO0OOooo........oooOO0OOooo........oo    254 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
255                                                   255 
256 G4double G4BraggModel::ComputeDEDXPerVolume(co    256 G4double G4BraggModel::ComputeDEDXPerVolume(const G4Material* material,
257                                             co    257                                             const G4ParticleDefinition* p,
258                                             G4    258                                             G4double kinEnergy,
259                                             G4    259                                             G4double cut)
260 {                                                 260 {
261   const G4double tmax = MaxSecondaryEnergy(p,     261   const G4double tmax = MaxSecondaryEnergy(p, kinEnergy);
262   const G4double tkin = kinEnergy/massRate;    << 262   const G4double tlim = lowestKinEnergy*massRate;
263   const G4double cutEnergy = std::max(cut, low << 263   const G4double tmin = std::max(std::min(cut, tmax), tlim);
264   G4double dedx  = 0.0;                           264   G4double dedx  = 0.0;
265                                                   265 
266   // tkin is the scaled energy to proton       << 266   if(kinEnergy < tlim) {
267   if (tkin < lowestKinEnergy) {                << 267     dedx = DEDX(material, lowestKinEnergy)*std::sqrt(kinEnergy/tlim);
268     dedx = DEDX(material, lowestKinEnergy)*std << 
269   } else {                                        268   } else {
270     dedx = DEDX(material, tkin);               << 269     dedx = DEDX(material, kinEnergy);
271                                                   270 
272     // correction for low cut value using Beth << 271     if (tmin < tmax) {
273     if (cutEnergy < tmax) {                    << 
274       const G4double tau = kinEnergy/mass;        272       const G4double tau = kinEnergy/mass;
275       const G4double x = cutEnergy/tmax;       << 273       const G4double x   = tmin/tmax;
276                                                   274 
277       dedx += (G4Log(x)*(tau + 1.)*(tau + 1.)/    275       dedx += (G4Log(x)*(tau + 1.)*(tau + 1.)/(tau * (tau + 2.0)) + 1.0 - x) * 
278   CLHEP::twopi_mc2_rcl2 * material->GetElectro    276   CLHEP::twopi_mc2_rcl2 * material->GetElectronDensity();
279     }                                             277     }
280   }                                               278   }
281   dedx = std::max(dedx, 0.0) * chargeSquare;      279   dedx = std::max(dedx, 0.0) * chargeSquare;
282                                                   280 
283   //G4cout << "E(MeV)= " << tkin/MeV << " dedx    281   //G4cout << "E(MeV)= " << tkin/MeV << " dedx= " << dedx 
284   //         << "  " << material->GetName() <<    282   //         << "  " << material->GetName() << G4endl;
285   return dedx;                                    283   return dedx;
286 }                                                 284 }
287                                                   285 
288 //....oooOO0OOooo........oooOO0OOooo........oo    286 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
289                                                   287 
290 void G4BraggModel::SampleSecondaries(std::vect    288 void G4BraggModel::SampleSecondaries(std::vector<G4DynamicParticle*>* vdp,
291                                      const G4M    289                                      const G4MaterialCutsCouple* couple,
292                                      const G4D    290                                      const G4DynamicParticle* dp,
293                                      G4double     291                                      G4double minEnergy,
294                                      G4double     292                                      G4double maxEnergy)
295 {                                                 293 {
296   const G4double tmax = MaxSecondaryKinEnergy(    294   const G4double tmax = MaxSecondaryKinEnergy(dp);
297   const G4double xmax = std::min(tmax, maxEner    295   const G4double xmax = std::min(tmax, maxEnergy);
298   const G4double xmin = std::max(lowestKinEner    296   const G4double xmin = std::max(lowestKinEnergy*massRate, std::min(minEnergy, xmax));
299   if(xmin >= xmax) { return; }                    297   if(xmin >= xmax) { return; }
300                                                   298 
301   G4double kineticEnergy = dp->GetKineticEnerg    299   G4double kineticEnergy = dp->GetKineticEnergy();
302   const G4double energy  = kineticEnergy + mas    300   const G4double energy  = kineticEnergy + mass;
303   const G4double energy2 = energy*energy;         301   const G4double energy2 = energy*energy;
304   const G4double beta2   = kineticEnergy*(kine    302   const G4double beta2   = kineticEnergy*(kineticEnergy + 2.0*mass)/energy2;
305   const G4double grej = 1.0;                      303   const G4double grej = 1.0;
306   G4double deltaKinEnergy, f;                     304   G4double deltaKinEnergy, f;
307                                                   305 
308   CLHEP::HepRandomEngine* rndmEngineMod = G4Ra    306   CLHEP::HepRandomEngine* rndmEngineMod = G4Random::getTheEngine();
309   G4double rndm[2];                               307   G4double rndm[2];
310                                                   308 
311   // sampling follows ...                         309   // sampling follows ...
312   do {                                            310   do {
313     rndmEngineMod->flatArray(2, rndm);            311     rndmEngineMod->flatArray(2, rndm);
314     deltaKinEnergy = xmin*xmax/(xmin*(1.0 - rn    312     deltaKinEnergy = xmin*xmax/(xmin*(1.0 - rndm[0]) + xmax*rndm[0]);
315                                                   313 
316     f = 1.0 - beta2*deltaKinEnergy/tmax;          314     f = 1.0 - beta2*deltaKinEnergy/tmax;
317                                                   315 
318     if(f > grej) {                                316     if(f > grej) {
319         G4cout << "G4BraggModel::SampleSeconda    317         G4cout << "G4BraggModel::SampleSecondary Warning! "
320                << "Majorant " << grej << " < "    318                << "Majorant " << grej << " < "
321                << f << " for e= " << deltaKinE    319                << f << " for e= " << deltaKinEnergy
322                << G4endl;                         320                << G4endl;
323     }                                             321     }
324                                                   322 
325     // Loop checking, 03-Aug-2015, Vladimir Iv    323     // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
326   } while( grej*rndm[1] >= f );                   324   } while( grej*rndm[1] >= f );
327                                                   325 
328   G4ThreeVector deltaDirection;                   326   G4ThreeVector deltaDirection;
329                                                   327 
330   if(UseAngularGeneratorFlag()) {                 328   if(UseAngularGeneratorFlag()) {
331     const G4Material* mat =  couple->GetMateri    329     const G4Material* mat =  couple->GetMaterial();
332     G4int Z = SelectRandomAtomNumber(mat);        330     G4int Z = SelectRandomAtomNumber(mat);
333                                                   331 
334     deltaDirection =                              332     deltaDirection = 
335       GetAngularDistribution()->SampleDirectio    333       GetAngularDistribution()->SampleDirection(dp, deltaKinEnergy, Z, mat);
336                                                   334 
337   } else {                                        335   } else {
338                                                   336  
339     G4double deltaMomentum =                      337     G4double deltaMomentum =
340       std::sqrt(deltaKinEnergy * (deltaKinEner    338       std::sqrt(deltaKinEnergy * (deltaKinEnergy + 2.0*electron_mass_c2));
341     G4double cost = deltaKinEnergy * (energy +    339     G4double cost = deltaKinEnergy * (energy + electron_mass_c2) /
342       (deltaMomentum * dp->GetTotalMomentum())    340       (deltaMomentum * dp->GetTotalMomentum());
343     if(cost > 1.0) { cost = 1.0; }                341     if(cost > 1.0) { cost = 1.0; }
344     G4double sint = std::sqrt((1.0 - cost)*(1.    342     G4double sint = std::sqrt((1.0 - cost)*(1.0 + cost));
345                                                   343 
346     G4double phi = twopi*rndmEngineMod->flat()    344     G4double phi = twopi*rndmEngineMod->flat();
347                                                   345 
348     deltaDirection.set(sint*std::cos(phi),sint    346     deltaDirection.set(sint*std::cos(phi),sint*std::sin(phi), cost) ;
349     deltaDirection.rotateUz(dp->GetMomentumDir    347     deltaDirection.rotateUz(dp->GetMomentumDirection());
350   }                                               348   }  
351                                                   349 
352   // create G4DynamicParticle object for delta    350   // create G4DynamicParticle object for delta ray
353   auto delta = new G4DynamicParticle(theElectr    351   auto delta = new G4DynamicParticle(theElectron,deltaDirection,deltaKinEnergy);
354                                                   352 
355   // Change kinematics of primary particle        353   // Change kinematics of primary particle
356   kineticEnergy -= deltaKinEnergy;                354   kineticEnergy -= deltaKinEnergy;
357   G4ThreeVector finalP = dp->GetMomentum() - d    355   G4ThreeVector finalP = dp->GetMomentum() - delta->GetMomentum();
358   finalP = finalP.unit();                         356   finalP = finalP.unit();
359                                                   357   
360   fParticleChange->SetProposedKineticEnergy(ki    358   fParticleChange->SetProposedKineticEnergy(kineticEnergy);
361   fParticleChange->SetProposedMomentumDirectio    359   fParticleChange->SetProposedMomentumDirection(finalP);
362                                                   360 
363   vdp->push_back(delta);                          361   vdp->push_back(delta);
364 }                                                 362 }
365                                                   363 
366 //....oooOO0OOooo........oooOO0OOooo........oo    364 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
367                                                   365 
368 G4double G4BraggModel::MaxSecondaryEnergy(cons    366 G4double G4BraggModel::MaxSecondaryEnergy(const G4ParticleDefinition* pd,
369                                           G4do    367                                           G4double kinEnergy)
370 {                                                 368 {
371   if(pd != particle) { SetParticle(pd); }         369   if(pd != particle) { SetParticle(pd); }
372   G4double tau  = kinEnergy/mass;                 370   G4double tau  = kinEnergy/mass;
373   G4double tmax = 2.0*electron_mass_c2*tau*(ta    371   G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.) /
374                   (1. + 2.0*(tau + 1.)*ratio +    372                   (1. + 2.0*(tau + 1.)*ratio + ratio*ratio);
375   return tmax;                                    373   return tmax;
376 }                                                 374 }
377                                                   375 
378 //....oooOO0OOooo........oooOO0OOooo........oo    376 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
379                                                   377 
380 void G4BraggModel::HasMaterial(const G4Materia    378 void G4BraggModel::HasMaterial(const G4Material* mat)
381 {                                                 379 {
382   const G4String& chFormula = mat->GetChemical    380   const G4String& chFormula = mat->GetChemicalFormula();
383   if(chFormula.empty()) { return; }               381   if(chFormula.empty()) { return; }
384                                                   382 
385   // ICRU Report N49, 1993. Power's model for     383   // ICRU Report N49, 1993. Power's model for H
386   static const G4int numberOfMolecula = 11;       384   static const G4int numberOfMolecula = 11;
387   static const G4String molName[numberOfMolecu    385   static const G4String molName[numberOfMolecula] = {
388     "Al_2O_3",                 "CO_2",            386     "Al_2O_3",                 "CO_2",                      "CH_4",
389     "(C_2H_4)_N-Polyethylene", "(C_2H_4)_N-Pol    387     "(C_2H_4)_N-Polyethylene", "(C_2H_4)_N-Polypropylene",  "(C_8H_8)_N",
390     "C_3H_8",                  "SiO_2",           388     "C_3H_8",                  "SiO_2",                     "H_2O",
391     "H_2O-Gas",                "Graphite" } ;     389     "H_2O-Gas",                "Graphite" } ;
392                                                   390 
393   // Search for the material in the table         391   // Search for the material in the table
394   for (G4int i=0; i<numberOfMolecula; ++i) {      392   for (G4int i=0; i<numberOfMolecula; ++i) {
395     if (chFormula == molName[i]) {                393     if (chFormula == molName[i]) {
396       iMolecula = i;                              394       iMolecula = i;  
397       return;                                     395       return;
398     }                                             396     }
399   }                                               397   }
400   return;                                         398   return;
401 }                                                 399 }
402                                                   400 
403 //....oooOO0OOooo........oooOO0OOooo........oo    401 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
404                                                   402 
405 G4double G4BraggModel::StoppingPower(const G4M    403 G4double G4BraggModel::StoppingPower(const G4Material* material,
406                                      G4double     404                                      G4double kineticEnergy) 
407 {                                                 405 {
408   G4double ionloss = 0.0 ;                        406   G4double ionloss = 0.0 ;
409                                                   407 
410   if (iMolecula >= 0) {                           408   if (iMolecula >= 0) {
411                                                   409   
412     // The data and the fit from:                 410     // The data and the fit from: 
413     // ICRU Report N49, 1993. Ziegler's model     411     // ICRU Report N49, 1993. Ziegler's model for protons.
414     // Proton kinetic energy for parametrisati    412     // Proton kinetic energy for parametrisation (keV/amu)  
415                                                   413 
416     G4double T = kineticEnergy/(keV*protonMass    414     G4double T = kineticEnergy/(keV*protonMassAMU) ; 
417                                                   415 
418     static const G4float a[11][5] = {             416     static const G4float a[11][5] = {
419    {1.187E+1f, 1.343E+1f, 1.069E+4f, 7.723E+2f    417    {1.187E+1f, 1.343E+1f, 1.069E+4f, 7.723E+2f, 2.153E-2f},
420    {7.802E+0f, 8.814E+0f, 8.303E+3f, 7.446E+2f    418    {7.802E+0f, 8.814E+0f, 8.303E+3f, 7.446E+2f, 7.966E-3f}, 
421    {7.294E+0f, 8.284E+0f, 5.010E+3f, 4.544E+2f    419    {7.294E+0f, 8.284E+0f, 5.010E+3f, 4.544E+2f, 8.153E-3f}, 
422    {8.646E+0f, 9.800E+0f, 7.066E+3f, 4.581E+2f    420    {8.646E+0f, 9.800E+0f, 7.066E+3f, 4.581E+2f, 9.383E-3f}, 
423    {1.286E+1f, 1.462E+1f, 5.625E+3f, 2.621E+3f    421    {1.286E+1f, 1.462E+1f, 5.625E+3f, 2.621E+3f, 3.512E-2f}, 
424    {3.229E+1f, 3.696E+1f, 8.918E+3f, 3.244E+3f    422    {3.229E+1f, 3.696E+1f, 8.918E+3f, 3.244E+3f, 1.273E-1f}, 
425    {1.604E+1f, 1.825E+1f, 6.967E+3f, 2.307E+3f    423    {1.604E+1f, 1.825E+1f, 6.967E+3f, 2.307E+3f, 3.775E-2f}, 
426    {8.049E+0f, 9.099E+0f, 9.257E+3f, 3.846E+2f    424    {8.049E+0f, 9.099E+0f, 9.257E+3f, 3.846E+2f, 1.007E-2f},
427    {4.015E+0f, 4.542E+0f, 3.955E+3f, 4.847E+2f    425    {4.015E+0f, 4.542E+0f, 3.955E+3f, 4.847E+2f, 7.904E-3f}, 
428    {4.571E+0f, 5.173E+0f, 4.346E+3f, 4.779E+2f    426    {4.571E+0f, 5.173E+0f, 4.346E+3f, 4.779E+2f, 8.572E-3f},
429    {2.631E+0f, 2.601E+0f, 1.701E+3f, 1.279E+3f    427    {2.631E+0f, 2.601E+0f, 1.701E+3f, 1.279E+3f, 1.638E-2f} };
430                                                   428 
431     static const G4float atomicWeight[11] = {     429     static const G4float atomicWeight[11] = {
432     101.96128f, 44.0098f, 16.0426f, 28.0536f,     430     101.96128f, 44.0098f, 16.0426f, 28.0536f, 42.0804f,
433     104.1512f, 44.665f, 60.0843f, 18.0152f, 18    431     104.1512f, 44.665f, 60.0843f, 18.0152f, 18.0152f, 12.0f};       
434                                                   432 
435     if ( T < 10.0 ) {                             433     if ( T < 10.0 ) {
436       ionloss = ((G4double)(a[iMolecula][0]))     434       ionloss = ((G4double)(a[iMolecula][0])) * std::sqrt(T) ;
437                                                   435     
438     } else if ( T < 10000.0 ) {                   436     } else if ( T < 10000.0 ) {
439       G4double x1 = (G4double)(a[iMolecula][1]    437       G4double x1 = (G4double)(a[iMolecula][1]);
440       G4double x2 = (G4double)(a[iMolecula][2]    438       G4double x2 = (G4double)(a[iMolecula][2]);
441       G4double x3 = (G4double)(a[iMolecula][3]    439       G4double x3 = (G4double)(a[iMolecula][3]);
442       G4double x4 = (G4double)(a[iMolecula][4]    440       G4double x4 = (G4double)(a[iMolecula][4]);
443       G4double slow  = x1 * G4Exp(G4Log(T)* 0.    441       G4double slow  = x1 * G4Exp(G4Log(T)* 0.45);
444       G4double shigh = G4Log( 1.0 + x3/T  + x4    442       G4double shigh = G4Log( 1.0 + x3/T  + x4*T ) * x2/T;
445       ionloss = slow*shigh / (slow + shigh) ;     443       ionloss = slow*shigh / (slow + shigh) ;     
446     }                                             444     } 
447                                                   445 
448     ionloss = std::max(ionloss, 0.0);             446     ionloss = std::max(ionloss, 0.0);
449     if ( 10 == iMolecula ) {                      447     if ( 10 == iMolecula ) { 
450       static const G4double invLog10 = 1.0/G4L    448       static const G4double invLog10 = 1.0/G4Log(10.);
451                                                   449 
452       if (T < 100.0) {                            450       if (T < 100.0) {
453         ionloss *= (1.0+0.023+0.0066*G4Log(T)*    451         ionloss *= (1.0+0.023+0.0066*G4Log(T)*invLog10);  
454       }                                           452       }
455       else if (T < 700.0) {                       453       else if (T < 700.0) {   
456         ionloss *=(1.0+0.089-0.0248*G4Log(T-99    454         ionloss *=(1.0+0.089-0.0248*G4Log(T-99.)*invLog10);
457       }                                           455       } 
458       else if (T < 10000.0) {                     456       else if (T < 10000.0) {    
459         ionloss *=(1.0+0.089-0.0248*G4Log(700.    457         ionloss *=(1.0+0.089-0.0248*G4Log(700.-99.)*invLog10);
460       }                                           458       }
461     }                                             459     }
462     ionloss /= (G4double)atomicWeight[iMolecul    460     ionloss /= (G4double)atomicWeight[iMolecula];
463                                                   461 
464   // pure material (normally not the case for     462   // pure material (normally not the case for this function)
465   } else if(1 == (material->GetNumberOfElement    463   } else if(1 == (material->GetNumberOfElements())) {
466     G4double z = material->GetZ() ;               464     G4double z = material->GetZ() ;
467     ionloss = ElectronicStoppingPower( z, kine    465     ionloss = ElectronicStoppingPower( z, kineticEnergy ) ;  
468   }                                               466   }
469                                                   467   
470   return ionloss;                                 468   return ionloss;
471 }                                                 469 }
472                                                   470 
473 //....oooOO0OOooo........oooOO0OOooo........oo    471 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
474                                                   472 
475 G4double G4BraggModel::ElectronicStoppingPower    473 G4double G4BraggModel::ElectronicStoppingPower(G4double z,
476                                                   474                                                G4double kineticEnergy) const
477 {                                                 475 {
478   G4double ionloss ;                              476   G4double ionloss ;
479   G4int i = std::min(std::max(G4lrint(z)-1,0),    477   G4int i = std::min(std::max(G4lrint(z)-1,0),91);  // index of atom
480                                                   478 
481   // The data and the fit from:                   479   // The data and the fit from: 
482   // ICRU Report 49, 1993. Ziegler's type of p    480   // ICRU Report 49, 1993. Ziegler's type of parametrisations.
483   // Proton kinetic energy for parametrisation    481   // Proton kinetic energy for parametrisation (keV/amu)  
484                                                   482 
485   G4double T = kineticEnergy/(keV*protonMassAM    483   G4double T = kineticEnergy/(keV*protonMassAMU) ; 
486                                                   484   
487   static const G4float a[92][5] = {               485   static const G4float a[92][5] = {
488    {1.254E+0f, 1.440E+0f, 2.426E+2f, 1.200E+4f    486    {1.254E+0f, 1.440E+0f, 2.426E+2f, 1.200E+4f, 1.159E-1f},
489    {1.229E+0f, 1.397E+0f, 4.845E+2f, 5.873E+3f    487    {1.229E+0f, 1.397E+0f, 4.845E+2f, 5.873E+3f, 5.225E-2f},
490    {1.411E+0f, 1.600E+0f, 7.256E+2f, 3.013E+3f    488    {1.411E+0f, 1.600E+0f, 7.256E+2f, 3.013E+3f, 4.578E-2f},
491    {2.248E+0f, 2.590E+0f, 9.660E+2f, 1.538E+2f    489    {2.248E+0f, 2.590E+0f, 9.660E+2f, 1.538E+2f, 3.475E-2f},
492    {2.474E+0f, 2.815E+0f, 1.206E+3f, 1.060E+3f    490    {2.474E+0f, 2.815E+0f, 1.206E+3f, 1.060E+3f, 2.855E-2f},
493    {2.631E+0f, 2.601E+0f, 1.701E+3f, 1.279E+3f    491    {2.631E+0f, 2.601E+0f, 1.701E+3f, 1.279E+3f, 1.638E-2f},
494    {2.954E+0f, 3.350E+0f, 1.683E+3f, 1.900E+3f    492    {2.954E+0f, 3.350E+0f, 1.683E+3f, 1.900E+3f, 2.513E-2f},
495    {2.652E+0f, 3.000E+0f, 1.920E+3f, 2.000E+3f    493    {2.652E+0f, 3.000E+0f, 1.920E+3f, 2.000E+3f, 2.230E-2f},
496    {2.085E+0f, 2.352E+0f, 2.157E+3f, 2.634E+3f    494    {2.085E+0f, 2.352E+0f, 2.157E+3f, 2.634E+3f, 1.816E-2f},
497    {1.951E+0f, 2.199E+0f, 2.393E+3f, 2.699E+3f    495    {1.951E+0f, 2.199E+0f, 2.393E+3f, 2.699E+3f, 1.568E-2f},
498        // Z= 11-20                                496        // Z= 11-20
499    {2.542E+0f, 2.869E+0f, 2.628E+3f, 1.854E+3f    497    {2.542E+0f, 2.869E+0f, 2.628E+3f, 1.854E+3f, 1.472E-2f},
500    {3.791E+0f, 4.293E+0f, 2.862E+3f, 1.009E+3f    498    {3.791E+0f, 4.293E+0f, 2.862E+3f, 1.009E+3f, 1.397E-2f},
501    {4.154E+0f, 4.739E+0f, 2.766E+3f, 1.645E+2f    499    {4.154E+0f, 4.739E+0f, 2.766E+3f, 1.645E+2f, 2.023E-2f},
502    {4.914E+0f, 5.598E+0f, 3.193E+3f, 2.327E+2f    500    {4.914E+0f, 5.598E+0f, 3.193E+3f, 2.327E+2f, 1.419E-2f},
503    {3.232E+0f, 3.647E+0f, 3.561E+3f, 1.560E+3f    501    {3.232E+0f, 3.647E+0f, 3.561E+3f, 1.560E+3f, 1.267E-2f},
504    {3.447E+0f, 3.891E+0f, 3.792E+3f, 1.219E+3f    502    {3.447E+0f, 3.891E+0f, 3.792E+3f, 1.219E+3f, 1.211E-2f},
505    {5.301E+0f, 6.008E+0f, 3.969E+3f, 6.451E+2f    503    {5.301E+0f, 6.008E+0f, 3.969E+3f, 6.451E+2f, 1.183E-2f},
506    {5.731E+0f, 6.500E+0f, 4.253E+3f, 5.300E+2f    504    {5.731E+0f, 6.500E+0f, 4.253E+3f, 5.300E+2f, 1.123E-2f},
507    {5.152E+0f, 5.833E+0f, 4.482E+3f, 5.457E+2f    505    {5.152E+0f, 5.833E+0f, 4.482E+3f, 5.457E+2f, 1.129E-2f},
508    {5.521E+0f, 6.252E+0f, 4.710E+3f, 5.533E+2f    506    {5.521E+0f, 6.252E+0f, 4.710E+3f, 5.533E+2f, 1.112E-2f},
509        // Z= 21-30                                507        // Z= 21-30
510    {5.201E+0f, 5.884E+0f, 4.938E+3f, 5.609E+2f    508    {5.201E+0f, 5.884E+0f, 4.938E+3f, 5.609E+2f, 9.995E-3f},
511    {4.858E+0f, 5.489E+0f, 5.260E+3f, 6.511E+2f    509    {4.858E+0f, 5.489E+0f, 5.260E+3f, 6.511E+2f, 8.930E-3f},
512    {4.479E+0f, 5.055E+0f, 5.391E+3f, 9.523E+2f    510    {4.479E+0f, 5.055E+0f, 5.391E+3f, 9.523E+2f, 9.117E-3f},
513    {3.983E+0f, 4.489E+0f, 5.616E+3f, 1.336E+3f    511    {3.983E+0f, 4.489E+0f, 5.616E+3f, 1.336E+3f, 8.413E-3f},
514    {3.469E+0f, 3.907E+0f, 5.725E+3f, 1.461E+3f    512    {3.469E+0f, 3.907E+0f, 5.725E+3f, 1.461E+3f, 8.829E-3f},
515    {3.519E+0f, 3.963E+0f, 6.065E+3f, 1.243E+3f    513    {3.519E+0f, 3.963E+0f, 6.065E+3f, 1.243E+3f, 7.782E-3f},
516    {3.140E+0f, 3.535E+0f, 6.288E+3f, 1.372E+3f    514    {3.140E+0f, 3.535E+0f, 6.288E+3f, 1.372E+3f, 7.361E-3f},
517    {3.553E+0f, 4.004E+0f, 6.205E+3f, 5.551E+2f    515    {3.553E+0f, 4.004E+0f, 6.205E+3f, 5.551E+2f, 8.763E-3f},
518    {3.696E+0f, 4.194E+0f, 4.649E+3f, 8.113E+1f    516    {3.696E+0f, 4.194E+0f, 4.649E+3f, 8.113E+1f, 2.242E-2f},
519    {4.210E+0f, 4.750E+0f, 6.953E+3f, 2.952E+2f    517    {4.210E+0f, 4.750E+0f, 6.953E+3f, 2.952E+2f, 6.809E-3f},
520        // Z= 31-40                                518        // Z= 31-40
521    {5.041E+0f, 5.697E+0f, 7.173E+3f, 2.026E+2f    519    {5.041E+0f, 5.697E+0f, 7.173E+3f, 2.026E+2f, 6.725E-3f},
522    {5.554E+0f, 6.300E+0f, 6.496E+3f, 1.100E+2f    520    {5.554E+0f, 6.300E+0f, 6.496E+3f, 1.100E+2f, 9.689E-3f},
523    {5.323E+0f, 6.012E+0f, 7.611E+3f, 2.925E+2f    521    {5.323E+0f, 6.012E+0f, 7.611E+3f, 2.925E+2f, 6.447E-3f},
524    {5.874E+0f, 6.656E+0f, 7.395E+3f, 1.175E+2f    522    {5.874E+0f, 6.656E+0f, 7.395E+3f, 1.175E+2f, 7.684E-3f},
525    {6.658E+0f, 7.536E+0f, 7.694E+3f, 2.223E+2f    523    {6.658E+0f, 7.536E+0f, 7.694E+3f, 2.223E+2f, 6.509E-3f},
526    {6.413E+0f, 7.240E+0f, 1.185E+4f, 1.537E+2f    524    {6.413E+0f, 7.240E+0f, 1.185E+4f, 1.537E+2f, 2.880E-3f},
527    {5.694E+0f, 6.429E+0f, 8.478E+3f, 2.929E+2f    525    {5.694E+0f, 6.429E+0f, 8.478E+3f, 2.929E+2f, 6.087E-3f},
528    {6.339E+0f, 7.159E+0f, 8.693E+3f, 3.303E+2f    526    {6.339E+0f, 7.159E+0f, 8.693E+3f, 3.303E+2f, 6.003E-3f},
529    {6.407E+0f, 7.234E+0f, 8.907E+3f, 3.678E+2f    527    {6.407E+0f, 7.234E+0f, 8.907E+3f, 3.678E+2f, 5.889E-3f},
530    {6.734E+0f, 7.603E+0f, 9.120E+3f, 4.052E+2f    528    {6.734E+0f, 7.603E+0f, 9.120E+3f, 4.052E+2f, 5.765E-3f},
531        // Z= 41-50                                529        // Z= 41-50
532    {6.901E+0f, 7.791E+0f, 9.333E+3f, 4.427E+2f    530    {6.901E+0f, 7.791E+0f, 9.333E+3f, 4.427E+2f, 5.587E-3f},
533    {6.424E+0f, 7.248E+0f, 9.545E+3f, 4.802E+2f    531    {6.424E+0f, 7.248E+0f, 9.545E+3f, 4.802E+2f, 5.376E-3f},
534    {6.799E+0f, 7.671E+0f, 9.756E+3f, 5.176E+2f    532    {6.799E+0f, 7.671E+0f, 9.756E+3f, 5.176E+2f, 5.315E-3f},
535    {6.109E+0f, 6.887E+0f, 9.966E+3f, 5.551E+2f    533    {6.109E+0f, 6.887E+0f, 9.966E+3f, 5.551E+2f, 5.151E-3f},
536    {5.924E+0f, 6.677E+0f, 1.018E+4f, 5.925E+2f    534    {5.924E+0f, 6.677E+0f, 1.018E+4f, 5.925E+2f, 4.919E-3f},
537    {5.238E+0f, 5.900E+0f, 1.038E+4f, 6.300E+2f    535    {5.238E+0f, 5.900E+0f, 1.038E+4f, 6.300E+2f, 4.758E-3f},
538    // {5.623f,    6.354f,    7160.0f,   337.6f    536    // {5.623f,    6.354f,    7160.0f,   337.6f,    0.013940f}, // Ag Ziegler77
539    {5.345E+0f, 6.038E+0f, 6.790E+3f, 3.978E+2f    537    {5.345E+0f, 6.038E+0f, 6.790E+3f, 3.978E+2f, 1.676E-2f}, // Ag ICRU49
540    {5.814E+0f, 6.554E+0f, 1.080E+4f, 3.555E+2f    538    {5.814E+0f, 6.554E+0f, 1.080E+4f, 3.555E+2f, 4.626E-3f},
541    {6.229E+0f, 7.024E+0f, 1.101E+4f, 3.709E+2f    539    {6.229E+0f, 7.024E+0f, 1.101E+4f, 3.709E+2f, 4.540E-3f},
542    {6.409E+0f, 7.227E+0f, 1.121E+4f, 3.864E+2f    540    {6.409E+0f, 7.227E+0f, 1.121E+4f, 3.864E+2f, 4.474E-3f},
543        // Z= 51-60                                541        // Z= 51-60
544    {7.500E+0f, 8.480E+0f, 8.608E+3f, 3.480E+2f    542    {7.500E+0f, 8.480E+0f, 8.608E+3f, 3.480E+2f, 9.074E-3f},
545    {6.979E+0f, 7.871E+0f, 1.162E+4f, 3.924E+2f    543    {6.979E+0f, 7.871E+0f, 1.162E+4f, 3.924E+2f, 4.402E-3f},
546    {7.725E+0f, 8.716E+0f, 1.183E+4f, 3.948E+2f    544    {7.725E+0f, 8.716E+0f, 1.183E+4f, 3.948E+2f, 4.376E-3f},
547    {8.337E+0f, 9.425E+0f, 1.051E+4f, 2.696E+2f    545    {8.337E+0f, 9.425E+0f, 1.051E+4f, 2.696E+2f, 6.206E-3f},
548    {7.287E+0f, 8.218E+0f, 1.223E+4f, 3.997E+2f    546    {7.287E+0f, 8.218E+0f, 1.223E+4f, 3.997E+2f, 4.447E-3f},
549    {7.899E+0f, 8.911E+0f, 1.243E+4f, 4.021E+2f    547    {7.899E+0f, 8.911E+0f, 1.243E+4f, 4.021E+2f, 4.511E-3f},
550    {8.041E+0f, 9.071E+0f, 1.263E+4f, 4.045E+2f    548    {8.041E+0f, 9.071E+0f, 1.263E+4f, 4.045E+2f, 4.540E-3f},
551    {7.488E+0f, 8.444E+0f, 1.283E+4f, 4.069E+2f    549    {7.488E+0f, 8.444E+0f, 1.283E+4f, 4.069E+2f, 4.420E-3f},
552    {7.291E+0f, 8.219E+0f, 1.303E+4f, 4.093E+2f    550    {7.291E+0f, 8.219E+0f, 1.303E+4f, 4.093E+2f, 4.298E-3f},
553    {7.098E+0f, 8.000E+0f, 1.323E+4f, 4.118E+2f    551    {7.098E+0f, 8.000E+0f, 1.323E+4f, 4.118E+2f, 4.182E-3f},
554        // Z= 61-70                                552        // Z= 61-70
555    {6.909E+0f, 7.786E+0f, 1.343E+4f, 4.142E+2f    553    {6.909E+0f, 7.786E+0f, 1.343E+4f, 4.142E+2f, 4.058E-3f},
556    {6.728E+0f, 7.580E+0f, 1.362E+4f, 4.166E+2f    554    {6.728E+0f, 7.580E+0f, 1.362E+4f, 4.166E+2f, 3.976E-3f},
557    {6.551E+0f, 7.380E+0f, 1.382E+4f, 4.190E+2f    555    {6.551E+0f, 7.380E+0f, 1.382E+4f, 4.190E+2f, 3.877E-3f},
558    {6.739E+0f, 7.592E+0f, 1.402E+4f, 4.214E+2f    556    {6.739E+0f, 7.592E+0f, 1.402E+4f, 4.214E+2f, 3.863E-3f},
559    {6.212E+0f, 6.996E+0f, 1.421E+4f, 4.239E+2f    557    {6.212E+0f, 6.996E+0f, 1.421E+4f, 4.239E+2f, 3.725E-3f},
560    {5.517E+0f, 6.210E+0f, 1.440E+4f, 4.263E+2f    558    {5.517E+0f, 6.210E+0f, 1.440E+4f, 4.263E+2f, 3.632E-3f},
561    {5.220E+0f, 5.874E+0f, 1.460E+4f, 4.287E+2f    559    {5.220E+0f, 5.874E+0f, 1.460E+4f, 4.287E+2f, 3.498E-3f},
562    {5.071E+0f, 5.706E+0f, 1.479E+4f, 4.330E+2f    560    {5.071E+0f, 5.706E+0f, 1.479E+4f, 4.330E+2f, 3.405E-3f},
563    {4.926E+0f, 5.542E+0f, 1.498E+4f, 4.335E+2f    561    {4.926E+0f, 5.542E+0f, 1.498E+4f, 4.335E+2f, 3.342E-3f},
564    {4.788E+0f, 5.386E+0f, 1.517E+4f, 4.359E+2f    562    {4.788E+0f, 5.386E+0f, 1.517E+4f, 4.359E+2f, 3.292E-3f},
565        // Z= 71-80                                563        // Z= 71-80
566    {4.893E+0f, 5.505E+0f, 1.536E+4f, 4.384E+2f    564    {4.893E+0f, 5.505E+0f, 1.536E+4f, 4.384E+2f, 3.243E-3f},
567    {5.028E+0f, 5.657E+0f, 1.555E+4f, 4.408E+2f    565    {5.028E+0f, 5.657E+0f, 1.555E+4f, 4.408E+2f, 3.195E-3f},
568    {4.738E+0f, 5.329E+0f, 1.574E+4f, 4.432E+2f    566    {4.738E+0f, 5.329E+0f, 1.574E+4f, 4.432E+2f, 3.186E-3f},
569    {4.587E+0f, 5.160E+0f, 1.541E+4f, 4.153E+2f    567    {4.587E+0f, 5.160E+0f, 1.541E+4f, 4.153E+2f, 3.406E-3f},
570    {5.201E+0f, 5.851E+0f, 1.612E+4f, 4.416E+2f    568    {5.201E+0f, 5.851E+0f, 1.612E+4f, 4.416E+2f, 3.122E-3f},
571    {5.071E+0f, 5.704E+0f, 1.630E+4f, 4.409E+2f    569    {5.071E+0f, 5.704E+0f, 1.630E+4f, 4.409E+2f, 3.082E-3f},
572    {4.946E+0f, 5.563E+0f, 1.649E+4f, 4.401E+2f    570    {4.946E+0f, 5.563E+0f, 1.649E+4f, 4.401E+2f, 2.965E-3f},
573    {4.477E+0f, 5.034E+0f, 1.667E+4f, 4.393E+2f    571    {4.477E+0f, 5.034E+0f, 1.667E+4f, 4.393E+2f, 2.871E-3f},
574    //  {4.856f,    5.460f,    18320.0f,  438.5    572    //  {4.856f,    5.460f,    18320.0f,  438.5f,    0.002542f}, //Ziegler77
575    {4.844E+0f, 5.458E+0f, 7.852E+3f, 9.758E+2f    573    {4.844E+0f, 5.458E+0f, 7.852E+3f, 9.758E+2f, 2.077E-2f}, //ICRU49
576    {4.307E+0f, 4.843E+0f, 1.704E+4f, 4.878E+2f    574    {4.307E+0f, 4.843E+0f, 1.704E+4f, 4.878E+2f, 2.882E-3f},
577        // Z= 81-90                                575        // Z= 81-90
578    {4.723E+0f, 5.311E+0f, 1.722E+4f, 5.370E+2f    576    {4.723E+0f, 5.311E+0f, 1.722E+4f, 5.370E+2f, 2.913E-3f},
579    {5.319E+0f, 5.982E+0f, 1.740E+4f, 5.863E+2f    577    {5.319E+0f, 5.982E+0f, 1.740E+4f, 5.863E+2f, 2.871E-3f},
580    {5.956E+0f, 6.700E+0f, 1.780E+4f, 6.770E+2f    578    {5.956E+0f, 6.700E+0f, 1.780E+4f, 6.770E+2f, 2.660E-3f},
581    {6.158E+0f, 6.928E+0f, 1.777E+4f, 5.863E+2f    579    {6.158E+0f, 6.928E+0f, 1.777E+4f, 5.863E+2f, 2.812E-3f},
582    {6.203E+0f, 6.979E+0f, 1.795E+4f, 5.863E+2f    580    {6.203E+0f, 6.979E+0f, 1.795E+4f, 5.863E+2f, 2.776E-3f},
583    {6.181E+0f, 6.954E+0f, 1.812E+4f, 5.863E+2f    581    {6.181E+0f, 6.954E+0f, 1.812E+4f, 5.863E+2f, 2.748E-3f},
584    {6.949E+0f, 7.820E+0f, 1.830E+4f, 5.863E+2f    582    {6.949E+0f, 7.820E+0f, 1.830E+4f, 5.863E+2f, 2.737E-3f},
585    {7.506E+0f, 8.448E+0f, 1.848E+4f, 5.863E+2f    583    {7.506E+0f, 8.448E+0f, 1.848E+4f, 5.863E+2f, 2.727E-3f},
586    {7.648E+0f, 8.609E+0f, 1.866E+4f, 5.863E+2f    584    {7.648E+0f, 8.609E+0f, 1.866E+4f, 5.863E+2f, 2.697E-3f},
587    {7.711E+0f, 8.679E+0f, 1.883E+4f, 5.863E+2f    585    {7.711E+0f, 8.679E+0f, 1.883E+4f, 5.863E+2f, 2.641E-3f},
588        // Z= 91-92                                586        // Z= 91-92
589    {7.407E+0f, 8.336E+0f, 1.901E+4f, 5.863E+2f    587    {7.407E+0f, 8.336E+0f, 1.901E+4f, 5.863E+2f, 2.603E-3f},
590    {7.290E+0f, 8.204E+0f, 1.918E+4f, 5.863E+2f    588    {7.290E+0f, 8.204E+0f, 1.918E+4f, 5.863E+2f, 2.673E-3f}
591   };                                              589   };
592                                                   590 
593   G4double fac = 1.0 ;                            591   G4double fac = 1.0 ;
594                                                   592 
595     // Carbon specific case for E < 40 keV        593     // Carbon specific case for E < 40 keV
596   if ( T < 40.0 && 5 == i) {                      594   if ( T < 40.0 && 5 == i) {
597     fac = std::sqrt(T*0.025);                     595     fac = std::sqrt(T*0.025);
598     T = 40.0;                                     596     T = 40.0;  
599                                                   597 
600     // Free electron gas model                    598     // Free electron gas model
601   } else if ( T < 10.0 ) {                        599   } else if ( T < 10.0 ) { 
602     fac = std::sqrt(T*0.1) ;                      600     fac = std::sqrt(T*0.1) ;
603     T = 10.0;                                     601     T = 10.0;
604   }                                               602   }
605                                                   603 
606   // Main parametrisation                         604   // Main parametrisation
607   G4double x1 = (G4double)(a[i][1]);              605   G4double x1 = (G4double)(a[i][1]);
608   G4double x2 = (G4double)(a[i][2]);              606   G4double x2 = (G4double)(a[i][2]);
609   G4double x3 = (G4double)(a[i][3]);              607   G4double x3 = (G4double)(a[i][3]);
610   G4double x4 = (G4double)(a[i][4]);              608   G4double x4 = (G4double)(a[i][4]);
611   G4double slow  = x1 * G4Exp(G4Log(T) * 0.45)    609   G4double slow  = x1 * G4Exp(G4Log(T) * 0.45);
612   G4double shigh = G4Log( 1.0 + x3/T + x4*T )     610   G4double shigh = G4Log( 1.0 + x3/T + x4*T ) * x2/T;
613   ionloss = slow*shigh*fac / (slow + shigh);      611   ionloss = slow*shigh*fac / (slow + shigh);
614                                                   612   
615   ionloss = std::max(ionloss, 0.0);               613   ionloss = std::max(ionloss, 0.0);
616                                                   614   
617   return ionloss;                                 615   return ionloss;
618 }                                                 616 }
619                                                   617 
620 //....oooOO0OOooo........oooOO0OOooo........oo    618 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
621                                                   619 
622 G4double G4BraggModel::DEDX(const G4Material*     620 G4double G4BraggModel::DEDX(const G4Material* material, G4double kineticEnergy) 
623 {                                                 621 {
624   G4double eloss = 0.0;                           622   G4double eloss = 0.0;
625                                                   623 
626   // check DB                                     624   // check DB
627   if(material != currentMaterial) {               625   if(material != currentMaterial) {
628     currentMaterial = material;                   626     currentMaterial = material;
629     baseMaterial = material->GetBaseMaterial()    627     baseMaterial = material->GetBaseMaterial() 
630       ? material->GetBaseMaterial() : material    628       ? material->GetBaseMaterial() : material;
631     iPSTAR    = -1;                               629     iPSTAR    = -1;
632     iMolecula = -1;                               630     iMolecula = -1;
633     iICRU90 = fICRU90 ? fICRU90->GetIndex(base    631     iICRU90 = fICRU90 ? fICRU90->GetIndex(baseMaterial) : -1;
634                                                   632     
635     if(iICRU90 < 0) {                             633     if(iICRU90 < 0) { 
636       iPSTAR = fPSTAR->GetIndex(baseMaterial);    634       iPSTAR = fPSTAR->GetIndex(baseMaterial); 
637       if(iPSTAR < 0) { HasMaterial(baseMateria    635       if(iPSTAR < 0) { HasMaterial(baseMaterial); }
638     }                                             636     }
639     //G4cout << "%%% " <<material->GetName() <    637     //G4cout << "%%% " <<material->GetName() << "  iMolecula= " 
640     //       << iMolecula << "  iPSTAR= " << i    638     //       << iMolecula << "  iPSTAR= " << iPSTAR 
641     //       << "  iICRU90= " << iICRU90<< G4e    639     //       << "  iICRU90= " << iICRU90<< G4endl; 
642   }                                               640   }
643                                                   641 
644   // ICRU90 parameterisation                      642   // ICRU90 parameterisation
645   if(iICRU90 >= 0) {                              643   if(iICRU90 >= 0) {
646     return fICRU90->GetElectronicDEDXforProton    644     return fICRU90->GetElectronicDEDXforProton(iICRU90, kineticEnergy)
647       *material->GetDensity();                    645       *material->GetDensity();
648   }                                               646   }
649   // PSTAR parameterisation                       647   // PSTAR parameterisation
650   if( iPSTAR >= 0 ) {                             648   if( iPSTAR >= 0 ) {
651     return fPSTAR->GetElectronicDEDX(iPSTAR, k    649     return fPSTAR->GetElectronicDEDX(iPSTAR, kineticEnergy)
652       *material->GetDensity();                    650       *material->GetDensity();
653                                                   651 
654   }                                               652   } 
655   const std::size_t numberOfElements = materia    653   const std::size_t numberOfElements = material->GetNumberOfElements();
656   const G4double* theAtomicNumDensityVector =     654   const G4double* theAtomicNumDensityVector =
657                                  material->Get    655                                  material->GetAtomicNumDensityVector();
658                                                   656   
659                                                   657 
660   if(iMolecula >= 0) {                            658   if(iMolecula >= 0) {
661     eloss = StoppingPower(baseMaterial, kineti    659     eloss = StoppingPower(baseMaterial, kineticEnergy)*
662                           material->GetDensity    660                           material->GetDensity()/amu;
663                                                   661 
664     // Pure material ICRU49 paralmeterisation     662     // Pure material ICRU49 paralmeterisation
665   } else if(1 == numberOfElements) {              663   } else if(1 == numberOfElements) {
666                                                   664 
667     G4double z = material->GetZ();                665     G4double z = material->GetZ();
668     eloss = ElectronicStoppingPower(z, kinetic    666     eloss = ElectronicStoppingPower(z, kineticEnergy)
669                                * (material->Ge    667                                * (material->GetTotNbOfAtomsPerVolume());
670                                                   668 
671                                                   669 
672   // Experimental data exist only for kinetic     670   // Experimental data exist only for kinetic energy 125 keV
673   } else if( MolecIsInZiegler1988(material) )     671   } else if( MolecIsInZiegler1988(material) ) { 
674                                                   672 
675     // Loop over elements - calculation based     673     // Loop over elements - calculation based on Bragg's rule 
676     G4double eloss125 = 0.0 ;                     674     G4double eloss125 = 0.0 ;
677     const G4ElementVector* theElementVector =     675     const G4ElementVector* theElementVector =
678                            material->GetElemen    676                            material->GetElementVector();
679                                                   677   
680     //  Loop for the elements in the material     678     //  Loop for the elements in the material
681     for (std::size_t i=0; i<numberOfElements;     679     for (std::size_t i=0; i<numberOfElements; ++i) {
682       const G4Element* element = (*theElementV    680       const G4Element* element = (*theElementVector)[i] ;
683       G4double z = element->GetZ() ;              681       G4double z = element->GetZ() ;
684       eloss    += ElectronicStoppingPower(z,ki    682       eloss    += ElectronicStoppingPower(z,kineticEnergy)
685                                     * theAtomi    683                                     * theAtomicNumDensityVector[i] ;
686       eloss125 += ElectronicStoppingPower(z,12    684       eloss125 += ElectronicStoppingPower(z,125.0*keV)
687                                     * theAtomi    685                                     * theAtomicNumDensityVector[i] ;
688     }                                             686     }      
689                                                   687 
690     // Chemical factor is taken into account      688     // Chemical factor is taken into account
691     if (eloss125 > 0.0) {                      << 689     eloss *= ChemicalFactor(kineticEnergy, eloss125) ;
692       eloss *= ChemicalFactor(kineticEnergy, e << 
693     }                                          << 
694                                                   690  
695   // Brugg's rule calculation                     691   // Brugg's rule calculation
696   } else {                                        692   } else {
697     const G4ElementVector* theElementVector =     693     const G4ElementVector* theElementVector =
698                            material->GetElemen    694                            material->GetElementVector() ;
699                                                   695   
700     //  loop for the elements in the material     696     //  loop for the elements in the material
701     for (std::size_t i=0; i<numberOfElements;     697     for (std::size_t i=0; i<numberOfElements; ++i)
702     {                                             698     {
703       const G4Element* element = (*theElementV    699       const G4Element* element = (*theElementVector)[i] ;
704       eloss   += ElectronicStoppingPower(eleme    700       eloss   += ElectronicStoppingPower(element->GetZ(), kineticEnergy)
705                                    * theAtomic    701                                    * theAtomicNumDensityVector[i];
706     }                                             702     }      
707   }                                               703   }
708   return eloss*theZieglerFactor;                  704   return eloss*theZieglerFactor;
709 }                                                 705 }
710                                                   706 
711 //....oooOO0OOooo........oooOO0OOooo........oo    707 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
712                                                   708 
713 G4bool G4BraggModel::MolecIsInZiegler1988(cons    709 G4bool G4BraggModel::MolecIsInZiegler1988(const G4Material* material) 
714 {                                                 710 {
715   // The list of molecules from                   711   // The list of molecules from
716   // J.F.Ziegler and J.M.Manoyan, The stopping    712   // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
717   // Nucl. Inst. & Meth. in Phys. Res. B35 (19    713   // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
718                                                   714   
719   G4String myFormula = G4String(" ") ;            715   G4String myFormula = G4String(" ") ;
720   const G4String chFormula = material->GetChem    716   const G4String chFormula = material->GetChemicalFormula() ;
721   if (myFormula == chFormula ) { return false;    717   if (myFormula == chFormula ) { return false; }
722                                                   718   
723   //  There are no evidence for difference of     719   //  There are no evidence for difference of stopping power depended on
724   //  phase of the compound except for water.     720   //  phase of the compound except for water. The stopping power of the 
725   //  water in gas phase can be predicted usin    721   //  water in gas phase can be predicted using Bragg's rule.
726   //                                              722   //  
727   //  No chemical factor for water-gas            723   //  No chemical factor for water-gas 
728                                                   724    
729   myFormula = G4String("H_2O") ;                  725   myFormula = G4String("H_2O") ;
730   const G4State theState = material->GetState(    726   const G4State theState = material->GetState() ;
731   if( theState == kStateGas && myFormula == ch    727   if( theState == kStateGas && myFormula == chFormula) return false ;
732                                                   728     
733                                                   729 
734   // The coffecient from Table.4 of Ziegler &     730   // The coffecient from Table.4 of Ziegler & Manoyan
735   static const G4float HeEff = 2.8735f;           731   static const G4float HeEff = 2.8735f;
736                                                   732   
737   static const std::size_t numberOfMolecula =     733   static const std::size_t numberOfMolecula = 53;
738   static const G4String nameOfMol[numberOfMole    734   static const G4String nameOfMol[numberOfMolecula] = {
739     "H_2O",      "C_2H_4O",    "C_3H_6O",  "C_    735     "H_2O",      "C_2H_4O",    "C_3H_6O",  "C_2H_2",             "C_H_3OH",
740     "C_2H_5OH",  "C_3H_7OH",   "C_3H_4",   "NH    736     "C_2H_5OH",  "C_3H_7OH",   "C_3H_4",   "NH_3",               "C_14H_10",
741     "C_6H_6",    "C_4H_10",    "C_4H_6",   "C_    737     "C_6H_6",    "C_4H_10",    "C_4H_6",   "C_4H_8O",            "CCl_4",
742     "CF_4",      "C_6H_8",     "C_6H_12",  "C_    738     "CF_4",      "C_6H_8",     "C_6H_12",  "C_6H_10O",           "C_6H_10",
743     "C_8H_16",   "C_5H_10",    "C_5H_8",   "C_    739     "C_8H_16",   "C_5H_10",    "C_5H_8",   "C_3H_6-Cyclopropane","C_2H_4F_2",
744     "C_2H_2F_2", "C_4H_8O_2",  "C_2H_6",   "C_    740     "C_2H_2F_2", "C_4H_8O_2",  "C_2H_6",   "C_2F_6",             "C_2H_6O",
745     "C_3H_6O",   "C_4H_10O",   "C_2H_4",   "C_    741     "C_3H_6O",   "C_4H_10O",   "C_2H_4",   "C_2H_4O",            "C_2H_4S",
746     "SH_2",      "CH_4",       "CCLF_3",   "CC    742     "SH_2",      "CH_4",       "CCLF_3",   "CCl_2F_2",           "CHCl_2F",
747     "(CH_3)_2S", "N_2O",       "C_5H_10O", "C_    743     "(CH_3)_2S", "N_2O",       "C_5H_10O", "C_8H_6",             "(CH_2)_N",
748     "(C_3H_6)_N","(C_8H_8)_N", "C_3H_8",   "C_    744     "(C_3H_6)_N","(C_8H_8)_N", "C_3H_8",   "C_3H_6-Propylene",   "C_3H_6O",
749     "C_3H_6S",   "C_4H_4S",    "C_7H_8"           745     "C_3H_6S",   "C_4H_4S",    "C_7H_8"
750   };                                              746   };
751                                                   747 
752   static const G4float expStopping[numberOfMol    748   static const G4float expStopping[numberOfMolecula] = {
753      66.1f,  190.4f, 258.7f,  42.2f, 141.5f,      749      66.1f,  190.4f, 258.7f,  42.2f, 141.5f,
754     210.9f,  279.6f, 198.8f,  31.0f, 267.5f,      750     210.9f,  279.6f, 198.8f,  31.0f, 267.5f,
755     122.8f,  311.4f, 260.3f, 328.9f, 391.3f,      751     122.8f,  311.4f, 260.3f, 328.9f, 391.3f,
756     206.6f,  374.0f, 422.0f, 432.0f, 398.0f,      752     206.6f,  374.0f, 422.0f, 432.0f, 398.0f,
757     554.0f,  353.0f, 326.0f,  74.6f, 220.5f,      753     554.0f,  353.0f, 326.0f,  74.6f, 220.5f,
758     197.4f,  362.0f, 170.0f, 330.5f, 211.3f,      754     197.4f,  362.0f, 170.0f, 330.5f, 211.3f,
759     262.3f,  349.6f,  51.3f, 187.0f, 236.9f,      755     262.3f,  349.6f,  51.3f, 187.0f, 236.9f,
760     121.9f,   35.8f, 247.0f, 292.6f, 268.0f,      756     121.9f,   35.8f, 247.0f, 292.6f, 268.0f,
761     262.3f,   49.0f, 398.9f, 444.0f,  22.91f,     757     262.3f,   49.0f, 398.9f, 444.0f,  22.91f,
762      68.0f,  155.0f,  84.0f,  74.2f, 254.7f,      758      68.0f,  155.0f,  84.0f,  74.2f, 254.7f,
763     306.8f,  324.4f, 420.0f                       759     306.8f,  324.4f, 420.0f
764   } ;                                             760   } ;
765                                                   761 
766   static const G4float expCharge[numberOfMolec    762   static const G4float expCharge[numberOfMolecula] = {
767     HeEff, HeEff, HeEff,  1.0f, HeEff,            763     HeEff, HeEff, HeEff,  1.0f, HeEff,
768     HeEff, HeEff, HeEff,  1.0f,  1.0f,            764     HeEff, HeEff, HeEff,  1.0f,  1.0f,
769      1.0f, HeEff, HeEff, HeEff, HeEff,            765      1.0f, HeEff, HeEff, HeEff, HeEff,
770     HeEff, HeEff, HeEff, HeEff, HeEff,            766     HeEff, HeEff, HeEff, HeEff, HeEff,
771     HeEff, HeEff, HeEff,  1.0f, HeEff,            767     HeEff, HeEff, HeEff,  1.0f, HeEff,
772     HeEff, HeEff, HeEff, HeEff, HeEff,            768     HeEff, HeEff, HeEff, HeEff, HeEff,
773     HeEff, HeEff,  1.0f, HeEff, HeEff,            769     HeEff, HeEff,  1.0f, HeEff, HeEff,
774     HeEff,  1.0f, HeEff, HeEff, HeEff,            770     HeEff,  1.0f, HeEff, HeEff, HeEff,
775     HeEff,  1.0f, HeEff, HeEff,  1.0f,            771     HeEff,  1.0f, HeEff, HeEff,  1.0f,
776      1.0f,  1.0f,  1.0f,  1.0f, HeEff,            772      1.0f,  1.0f,  1.0f,  1.0f, HeEff,
777     HeEff, HeEff, HeEff                           773     HeEff, HeEff, HeEff
778   } ;                                             774   } ;
779                                                   775 
780   static const G4int numberOfAtomsPerMolecula[    776   static const G4int numberOfAtomsPerMolecula[numberOfMolecula] = {
781     3,  7, 10,  4,  6,                            777     3,  7, 10,  4,  6,
782     9, 12,  7,  4, 24,                            778     9, 12,  7,  4, 24,
783     12,14, 10, 13,  5,                            779     12,14, 10, 13,  5,
784     5, 14, 18, 17, 17,                            780     5, 14, 18, 17, 17,
785     24,15, 13,  9,  8,                            781     24,15, 13,  9,  8,
786     6, 14,  8,  8,  9,                            782     6, 14,  8,  8,  9,
787     10,15,  6,  7,  7,                            783     10,15,  6,  7,  7,
788     3,  5,  5,  5,  5,                            784     3,  5,  5,  5,  5,
789     9,  3, 16, 14,  3,                            785     9,  3, 16, 14,  3,
790     9, 16, 11,  9, 10,                            786     9, 16, 11,  9, 10,
791     10, 9,  15};                                  787     10, 9,  15};
792                                                   788 
793   // Search for the compaund in the table         789   // Search for the compaund in the table
794   for (std::size_t i=0; i<numberOfMolecula; ++    790   for (std::size_t i=0; i<numberOfMolecula; ++i) {
795     if(chFormula == nameOfMol[i]) {               791     if(chFormula == nameOfMol[i]) {
796       expStopPower125 = ((G4double)expStopping    792       expStopPower125 = ((G4double)expStopping[i])
797         * (material->GetTotNbOfAtomsPerVolume(    793         * (material->GetTotNbOfAtomsPerVolume()) /
798         ((G4double)(expCharge[i] * numberOfAto    794         ((G4double)(expCharge[i] * numberOfAtomsPerMolecula[i]));
799       return true;                                795       return true;
800     }                                             796     }
801   }                                               797   }
802   return false;                                   798   return false;
803 }                                                 799 }
804                                                   800 
805 //....oooOO0OOooo........oooOO0OOooo........oo    801 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
806                                                   802 
807 G4double G4BraggModel::ChemicalFactor(G4double    803 G4double G4BraggModel::ChemicalFactor(G4double kineticEnergy, 
808                                       G4double    804                                       G4double eloss125) const
809 {                                                 805 {
810   // Approximation of Chemical Factor accordin    806   // Approximation of Chemical Factor according to
811   // J.F.Ziegler and J.M.Manoyan, The stopping    807   // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
812   // Nucl. Inst. & Meth. in Phys. Res. B35 (19    808   // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
813                                                   809 
814   static const G4double gamma25  = 1.0 + 25.0*    810   static const G4double gamma25  = 1.0 + 25.0*keV /proton_mass_c2;
815   static const G4double gamma125 = 1.0 + 125.0    811   static const G4double gamma125 = 1.0 + 125.0*keV/proton_mass_c2;
816   static const G4double beta25   = std::sqrt(1    812   static const G4double beta25   = std::sqrt(1.0 - 1.0/(gamma25*gamma25));
817   static const G4double beta125  = std::sqrt(1    813   static const G4double beta125  = std::sqrt(1.0 - 1.0/(gamma125*gamma125));
818   static const G4double f12525   = 1.0 + G4Exp    814   static const G4double f12525   = 1.0 + G4Exp( 1.48*(beta125/beta25 - 7.0) );
819                                                   815   
820   G4double gamma = 1.0 + kineticEnergy/proton_    816   G4double gamma = 1.0 + kineticEnergy/proton_mass_c2;
821   G4double beta  = std::sqrt(1.0 - 1.0/(gamma*    817   G4double beta  = std::sqrt(1.0 - 1.0/(gamma*gamma));
822                                                   818   
823   G4double factor = 1.0 + (expStopPower125/elo    819   G4double factor = 1.0 + (expStopPower125/eloss125 - 1.0) * f12525/
824     (1.0 + G4Exp( 1.48 * ( beta/beta25    - 7.    820     (1.0 + G4Exp( 1.48 * ( beta/beta25    - 7.0 ) ) );
825                                                   821 
826   return factor ;                                 822   return factor ;
827 }                                                 823 }
828                                                   824 
829 //....oooOO0OOooo........oooOO0OOooo........oo    825 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
830                                                   826 
831                                                   827