Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/lowenergy/src/G4hParametrisedLossModel.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/lowenergy/src/G4hParametrisedLossModel.cc (Version 11.3.0) and /processes/electromagnetic/lowenergy/src/G4hParametrisedLossModel.cc (Version 9.3)


  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:     G4hParametrisedLossModel         32 // File name:     G4hParametrisedLossModel
 33 //                                                 33 //
 34 // Author:        V.Ivanchenko (Vladimir.Ivanc     34 // Author:        V.Ivanchenko (Vladimir.Ivanchenko@cern.ch)
 35 //                                             <<  35 // 
 36 // Creation date: 20 July 2000                     36 // Creation date: 20 July 2000
 37 //                                                 37 //
 38 // Modifications:                              <<  38 // Modifications: 
 39 // 20/07/2000  V.Ivanchenko First implementati     39 // 20/07/2000  V.Ivanchenko First implementation
 40 // 18/08/2000  V.Ivanchenko TRIM85 model is ad     40 // 18/08/2000  V.Ivanchenko TRIM85 model is added
 41 // 03/10/2000  V.Ivanchenko CodeWizard clean u     41 // 03/10/2000  V.Ivanchenko CodeWizard clean up
 42 // 10/05/2001  V.Ivanchenko Clean up againist      42 // 10/05/2001  V.Ivanchenko Clean up againist Linux compilation with -Wall
 43 // 30/12/2003  V.Ivanchenko SRIM2003 model is      43 // 30/12/2003  V.Ivanchenko SRIM2003 model is added
 44 // 07/05/2004  V.Ivanchenko Fix Graphite probl     44 // 07/05/2004  V.Ivanchenko Fix Graphite problem, add QAO model
 45 //                                                 45 //
 46 // Class Description:                              46 // Class Description:
 47 //                                                 47 //
 48 // Low energy protons/ions electronic stopping     48 // Low energy protons/ions electronic stopping power parametrisation
 49 //                                                 49 //
 50 // Class Description: End                          50 // Class Description: End
 51 //                                                 51 //
 52 // -------------------------------------------     52 // -------------------------------------------------------------------
 53 //                                                 53 //
 54 //....oooOO0OOooo........oooOO0OOooo........oo     54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 55 //....oooOO0OOooo........oooOO0OOooo........oo     55 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 56                                                    56 
 57 #include "G4hParametrisedLossModel.hh"             57 #include "G4hParametrisedLossModel.hh"
 58                                                << 
 59 #include "globals.hh"                          << 
 60 #include "G4PhysicalConstants.hh"              << 
 61 #include "G4SystemOfUnits.hh"                  << 
 62 #include "G4UnitsTable.hh"                         58 #include "G4UnitsTable.hh"
                                                   >>  59 #include "globals.hh"
                                                   >>  60 #include "G4hZiegler1977p.hh"
                                                   >>  61 #include "G4hZiegler1977He.hh"
 63 #include "G4hZiegler1985p.hh"                      62 #include "G4hZiegler1985p.hh"
                                                   >>  63 #include "G4hSRIM2000p.hh"
                                                   >>  64 //#include "G4hQAOModel.hh"
 64 #include "G4hICRU49p.hh"                           65 #include "G4hICRU49p.hh"
 65 #include "G4hICRU49He.hh"                          66 #include "G4hICRU49He.hh"
 66 #include "G4DynamicParticle.hh"                    67 #include "G4DynamicParticle.hh"
 67 #include "G4ParticleDefinition.hh"                 68 #include "G4ParticleDefinition.hh"
 68 #include "G4ElementVector.hh"                      69 #include "G4ElementVector.hh"
 69 #include "G4Material.hh"                           70 #include "G4Material.hh"
 70 #include "G4Exp.hh"                            << 
 71                                                    71 
 72 //....oooOO0OOooo........oooOO0OOooo........oo     72 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 73                                                    73 
 74 G4hParametrisedLossModel::G4hParametrisedLossM     74 G4hParametrisedLossModel::G4hParametrisedLossModel(const G4String& name)
 75   :G4VLowEnergyModel(name), modelName(name)        75   :G4VLowEnergyModel(name), modelName(name)
 76 {                                                  76 {
 77   InitializeMe();                                  77   InitializeMe();
 78 }                                                  78 }
 79                                                    79 
 80 //....oooOO0OOooo........oooOO0OOooo........oo     80 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 81                                                    81 
 82 void G4hParametrisedLossModel::InitializeMe()      82 void G4hParametrisedLossModel::InitializeMe()
 83 {                                                  83 {
 84   expStopPower125 = 0.;                        << 
 85                                                << 
 86   theZieglerFactor = eV*cm2*1.0e-15 ;              84   theZieglerFactor = eV*cm2*1.0e-15 ;
 87                                                    85 
 88   // Registration of parametrisation models        86   // Registration of parametrisation models
 89   const G4String& blank(" ");                  <<  87   G4String blank  = G4String(" ") ;
 90   const G4String& ir49p("ICRU_R49p");          <<  88   G4String zi77p  = G4String("Ziegler1977p") ;
 91   const G4String& ir49He("ICRU_R49He");        <<  89   G4String zi77He = G4String("Ziegler1977He") ;
 92   const G4String& zi85p("Ziegler1985p");       <<  90   G4String ir49p  = G4String("ICRU_R49p") ;
 93   if(zi85p == modelName) {                     <<  91   G4String ir49He = G4String("ICRU_R49He") ;
                                                   >>  92   G4String zi85p  = G4String("Ziegler1985p") ;
                                                   >>  93   G4String zi00p  = G4String("SRIM2000p") ;
                                                   >>  94   G4String qao    = G4String("QAO") ;
                                                   >>  95   if(zi77p == modelName) {
                                                   >>  96       eStopingPowerTable = new G4hZiegler1977p();
                                                   >>  97       highEnergyLimit = 100.0*MeV;
                                                   >>  98       lowEnergyLimit  = 1.0*keV;
                                                   >>  99 
                                                   >> 100   } else if(zi77He == modelName) {
                                                   >> 101       eStopingPowerTable = new G4hZiegler1977He();
                                                   >> 102       highEnergyLimit = 10.0*MeV/4.0;
                                                   >> 103       lowEnergyLimit  = 1.0*keV/4.0;
                                                   >> 104 
                                                   >> 105   } else if(zi85p == modelName) {
 94       eStopingPowerTable = new G4hZiegler1985p    106       eStopingPowerTable = new G4hZiegler1985p();
 95       highEnergyLimit = 100.0*MeV;                107       highEnergyLimit = 100.0*MeV;
 96       lowEnergyLimit  = 1.0*keV;                  108       lowEnergyLimit  = 1.0*keV;
 97                                                   109 
                                                   >> 110   } else if(zi00p == modelName ) {
                                                   >> 111       eStopingPowerTable = new G4hSRIM2000p();
                                                   >> 112       highEnergyLimit = 100.0*MeV;
                                                   >> 113       lowEnergyLimit  = 1.0*keV;
                                                   >> 114 
 98   } else if(ir49p == modelName || blank == mod    115   } else if(ir49p == modelName || blank == modelName) {
 99       eStopingPowerTable = new G4hICRU49p();      116       eStopingPowerTable = new G4hICRU49p();
100       highEnergyLimit = 2.0*MeV;                  117       highEnergyLimit = 2.0*MeV;
101       lowEnergyLimit  = 1.0*keV;                  118       lowEnergyLimit  = 1.0*keV;
102                                                   119 
103   } else if(ir49He == modelName) {                120   } else if(ir49He == modelName) {
104       eStopingPowerTable = new G4hICRU49He();     121       eStopingPowerTable = new G4hICRU49He();
105       highEnergyLimit = 10.0*MeV/4.0;             122       highEnergyLimit = 10.0*MeV/4.0;
106       lowEnergyLimit  = 1.0*keV/4.0;              123       lowEnergyLimit  = 1.0*keV/4.0;
107                                                << 124       /*
                                                   >> 125   } else if(qao == modelName) {
                                                   >> 126       eStopingPowerTable = new G4hQAOModel();
                                                   >> 127       highEnergyLimit = 2.0*MeV;
                                                   >> 128       lowEnergyLimit  = 5.0*keV;
                                                   >> 129       */
108   } else {                                        130   } else {
109       eStopingPowerTable = new G4hICRU49p();      131       eStopingPowerTable = new G4hICRU49p();
110       highEnergyLimit = 2.0*MeV;                  132       highEnergyLimit = 2.0*MeV;
111       lowEnergyLimit  = 1.0*keV;                  133       lowEnergyLimit  = 1.0*keV;
112       G4cout << "G4hParametrisedLossModel Warn << 134       G4cout << "G4hParametrisedLossModel Warning: <" << modelName 
113              << "> is unknown - default <"        135              << "> is unknown - default <"
114              << ir49p << ">" << " is used for     136              << ir49p << ">" << " is used for Electronic Stopping"
115              << G4endl;                           137              << G4endl;
116       modelName = ir49p;                          138       modelName = ir49p;
117   }                                               139   }
118       /*                                          140       /*
119       G4cout << "G4hParametrisedLossModel: the    141       G4cout << "G4hParametrisedLossModel: the model <"
120              << modelName << ">" << " is used     142              << modelName << ">" << " is used for Electronic Stopping"
121              << G4endl;                           143              << G4endl;
122 */                                                144 */
123 }                                                 145 }
124                                                   146 
125 //....oooOO0OOooo........oooOO0OOooo........oo    147 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
126                                                   148 
127 G4hParametrisedLossModel::~G4hParametrisedLoss    149 G4hParametrisedLossModel::~G4hParametrisedLossModel()
128 {                                                 150 {
129   delete eStopingPowerTable;                      151   delete eStopingPowerTable;
130 }                                                 152 }
131                                                   153 
132 //....oooOO0OOooo........oooOO0OOooo........oo    154 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
133                                                   155 
134 G4double G4hParametrisedLossModel::TheValue(co    156 G4double G4hParametrisedLossModel::TheValue(const G4DynamicParticle* particle,
135               const G4Material* material)         157               const G4Material* material)
136 {                                                 158 {
137   G4double scaledEnergy = (particle->GetKineti    159   G4double scaledEnergy = (particle->GetKineticEnergy())
138                         * proton_mass_c2/(part    160                         * proton_mass_c2/(particle->GetMass());
139   G4double factor = theZieglerFactor;             161   G4double factor = theZieglerFactor;
140   if (scaledEnergy < lowEnergyLimit) {            162   if (scaledEnergy < lowEnergyLimit) {
141     if (modelName != "QAO") factor *= std::sqr    163     if (modelName != "QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
142     scaledEnergy = lowEnergyLimit;                164     scaledEnergy = lowEnergyLimit;
143   }                                               165   }
144   G4double eloss = StoppingPower(material,scal    166   G4double eloss = StoppingPower(material,scaledEnergy) * factor;
145                                                   167 
146   return eloss;                                   168   return eloss;
147 }                                                 169 }
148                                                   170 
149 //....oooOO0OOooo........oooOO0OOooo........oo    171 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
150                                                   172 
151 G4double G4hParametrisedLossModel::TheValue(co    173 G4double G4hParametrisedLossModel::TheValue(const G4ParticleDefinition* aParticle,
152               const G4Material* material,         174               const G4Material* material,
153                     G4double kineticEnergy)       175                     G4double kineticEnergy)
154 {                                                 176 {
155   G4double scaledEnergy = kineticEnergy           177   G4double scaledEnergy = kineticEnergy
156                         * proton_mass_c2/(aPar    178                         * proton_mass_c2/(aParticle->GetPDGMass());
157                                                   179 
158   G4double factor = theZieglerFactor;             180   G4double factor = theZieglerFactor;
159   if (scaledEnergy < lowEnergyLimit) {            181   if (scaledEnergy < lowEnergyLimit) {
160     if (modelName != "QAO") factor *= std::sqr    182     if (modelName != "QAO") factor *= std::sqrt(scaledEnergy/lowEnergyLimit);
161     scaledEnergy = lowEnergyLimit;                183     scaledEnergy = lowEnergyLimit;
162   }                                               184   }
163   G4double eloss = StoppingPower(material,scal    185   G4double eloss = StoppingPower(material,scaledEnergy) * factor;
164                                                   186 
165   return eloss;                                   187   return eloss;
166 }                                                 188 }
167                                                   189 
168 //....oooOO0OOooo........oooOO0OOooo........oo    190 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
169                                                   191 
170 G4double G4hParametrisedLossModel::LowEnergyLi    192 G4double G4hParametrisedLossModel::LowEnergyLimit(const G4ParticleDefinition* ,
171               const G4Material*) const            193               const G4Material*) const
172 {                                                 194 {
173   return lowEnergyLimit;                          195   return lowEnergyLimit;
174 }                                                 196 }
175                                                   197 
176 //....oooOO0OOooo........oooOO0OOooo........oo    198 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
177                                                   199 
178 G4double G4hParametrisedLossModel::HighEnergyL    200 G4double G4hParametrisedLossModel::HighEnergyLimit(const G4ParticleDefinition* ,
179                const G4Material*) const           201                const G4Material*) const
180 {                                                 202 {
181   return highEnergyLimit;                         203   return highEnergyLimit;
182 }                                                 204 }
183 //....oooOO0OOooo........oooOO0OOooo........oo    205 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
184                                                   206 
185 G4double G4hParametrisedLossModel::LowEnergyLi    207 G4double G4hParametrisedLossModel::LowEnergyLimit(const G4ParticleDefinition* ) const
186 {                                                 208 {
187   return lowEnergyLimit;                          209   return lowEnergyLimit;
188 }                                                 210 }
189                                                   211 
190 //....oooOO0OOooo........oooOO0OOooo........oo    212 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
191                                                   213 
192 G4double G4hParametrisedLossModel::HighEnergyL    214 G4double G4hParametrisedLossModel::HighEnergyLimit(const G4ParticleDefinition* ) const
193 {                                                 215 {
194   return highEnergyLimit;                         216   return highEnergyLimit;
195 }                                                 217 }
196                                                   218 
197 //....oooOO0OOooo........oooOO0OOooo........oo    219 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
198                                                   220 
199 G4bool G4hParametrisedLossModel::IsInCharge(co    221 G4bool G4hParametrisedLossModel::IsInCharge(const G4DynamicParticle* ,
200               const G4Material*) const            222               const G4Material*) const
201 {                                                 223 {
202   return true;                                    224   return true;
203 }                                                 225 }
204                                                   226 
205 //....oooOO0OOooo........oooOO0OOooo........oo    227 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
206                                                   228 
207 G4bool G4hParametrisedLossModel::IsInCharge(co    229 G4bool G4hParametrisedLossModel::IsInCharge(const G4ParticleDefinition* ,
208               const G4Material*) const            230               const G4Material*) const
209 {                                                 231 {
210   return true;                                    232   return true;
211 }                                                 233 }
212                                                   234 
213 //....oooOO0OOooo........oooOO0OOooo........oo    235 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
214                                                   236 
215 G4double G4hParametrisedLossModel::StoppingPow    237 G4double G4hParametrisedLossModel::StoppingPower(const G4Material* material,
216                    G4double kineticEnergy)        238                    G4double kineticEnergy)
217 {                                                 239 {
218   G4double eloss = 0.0;                           240   G4double eloss = 0.0;
219                                                   241 
220   const std::size_t numberOfElements = materia << 242   const G4int numberOfElements = material->GetNumberOfElements() ;
221   const G4double* theAtomicNumDensityVector =     243   const G4double* theAtomicNumDensityVector =
222     material->GetAtomicNumDensityVector() ;       244     material->GetAtomicNumDensityVector() ;
223                                                   245 
224                                                   246 
225   // compound material with parametrisation       247   // compound material with parametrisation
226   if( (eStopingPowerTable->HasMaterial(materia    248   if( (eStopingPowerTable->HasMaterial(material)) ) {
227                                                   249 
228     eloss = eStopingPowerTable->StoppingPower(    250     eloss = eStopingPowerTable->StoppingPower(material, kineticEnergy);
229     if ("QAO" != modelName) {                     251     if ("QAO" != modelName) {
230       eloss *=  material->GetTotNbOfAtomsPerVo    252       eloss *=  material->GetTotNbOfAtomsPerVolume();
231       if(1 < numberOfElements) {                  253       if(1 < numberOfElements) {
232         G4int nAtoms = 0;                         254         G4int nAtoms = 0;
233                                                   255 
234         const G4int* theAtomsVector = material    256         const G4int* theAtomsVector = material->GetAtomsVector();
235         for (std::size_t iel=0; iel<numberOfEl << 257         for (G4int iel=0; iel<numberOfElements; iel++) {
236           nAtoms += theAtomsVector[iel];          258           nAtoms += theAtomsVector[iel];
237         }                                         259         }
238         eloss /= nAtoms;                          260         eloss /= nAtoms;
239       }                                           261       }
240     }                                             262     }
241                                                   263 
242   // pure material                                264   // pure material
243   } else if(1 == numberOfElements) {              265   } else if(1 == numberOfElements) {
244                                                   266 
245     G4double z = material->GetZ();                267     G4double z = material->GetZ();
246     eloss = (eStopingPowerTable->ElectronicSto    268     eloss = (eStopingPowerTable->ElectronicStoppingPower(z, kineticEnergy))
247                                * (material->Ge    269                                * (material->GetTotNbOfAtomsPerVolume()) ;
248                                                   270 
249   // Experimental data exist only for kinetic     271   // Experimental data exist only for kinetic energy 125 keV
250   } else if( MolecIsInZiegler1988(material)) {    272   } else if( MolecIsInZiegler1988(material)) {
251                                                   273 
252   // Cycle over elements - calculation based o    274   // Cycle over elements - calculation based on Bragg's rule
253     G4double eloss125 = 0.0 ;                     275     G4double eloss125 = 0.0 ;
254     const G4ElementVector* theElementVector =     276     const G4ElementVector* theElementVector =
255                            material->GetElemen    277                            material->GetElementVector() ;
256                                                   278 
257                                                   279 
258     //  loop for the elements in the material     280     //  loop for the elements in the material
259     for (std::size_t i=0; i<numberOfElements;  << 281     for (G4int i=0; i<numberOfElements; i++) {
260       const G4Element* element = (*theElementV    282       const G4Element* element = (*theElementVector)[i] ;
261       G4double z = element->GetZ() ;              283       G4double z = element->GetZ() ;
262       eloss    +=(eStopingPowerTable->Electron    284       eloss    +=(eStopingPowerTable->ElectronicStoppingPower(z,kineticEnergy))
263                                     * theAtomi    285                                     * theAtomicNumDensityVector[i] ;
264       eloss125 +=(eStopingPowerTable->Electron    286       eloss125 +=(eStopingPowerTable->ElectronicStoppingPower(z,125.0*keV))
265                                     * theAtomi    287                                     * theAtomicNumDensityVector[i] ;
266     }                                             288     }
267                                                   289 
268     // Chemical factor is taken into account      290     // Chemical factor is taken into account
269     if (eloss125 > 0.0) {                      << 291     eloss *= ChemicalFactor(kineticEnergy, eloss125) ;
270       eloss *= ChemicalFactor(kineticEnergy, e << 
271     }                                          << 
272                                                   292 
273   // Brugg's rule calculation                     293   // Brugg's rule calculation
274   } else {                                        294   } else {
275     const G4ElementVector* theElementVector =     295     const G4ElementVector* theElementVector =
276                            material->GetElemen    296                            material->GetElementVector() ;
277                                                   297 
278     //  loop for the elements in the material     298     //  loop for the elements in the material
279     for (std::size_t i=0; i<numberOfElements;  << 299     for (G4int i=0; i<numberOfElements; i++)
280     {                                             300     {
281       const G4Element* element = (*theElementV    301       const G4Element* element = (*theElementVector)[i] ;
282       G4double z = element->GetZ() ;              302       G4double z = element->GetZ() ;
283       eloss   += (eStopingPowerTable->Electron    303       eloss   += (eStopingPowerTable->ElectronicStoppingPower(z,kineticEnergy))
284                                    * theAtomic    304                                    * theAtomicNumDensityVector[i];
285     }                                             305     }
286   }                                               306   }
287   return eloss;                                   307   return eloss;
288 }                                                 308 }
289                                                   309 
290 //....oooOO0OOooo........oooOO0OOooo........oo    310 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
291                                                   311 
292 G4bool G4hParametrisedLossModel::MolecIsInZieg    312 G4bool G4hParametrisedLossModel::MolecIsInZiegler1988(
293                                  const G4Mater    313                                  const G4Material* material)
294 {                                                 314 {
295   // The list of molecules from                   315   // The list of molecules from
296   // J.F.Ziegler and J.M.Manoyan, The stopping    316   // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
297   // Nucl. Inst. & Meth. in Phys. Res. B35 (19    317   // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
298                                                   318 
299   G4String myFormula = G4String(" ") ;            319   G4String myFormula = G4String(" ") ;
300   const G4String chFormula = material->GetChem    320   const G4String chFormula = material->GetChemicalFormula() ;
301   if (myFormula == chFormula ) return false ;     321   if (myFormula == chFormula ) return false ;
302                                                << 322   
303   //  There are no evidence for difference of     323   //  There are no evidence for difference of stopping power depended on
304   //  phase of the compound except for water.  << 324   //  phase of the compound except for water. The stopping power of the 
305   //  water in gas phase can be predicted usin    325   //  water in gas phase can be predicted using Bragg's rule.
306   //                                           << 326   //  
307   //  No chemical factor for water-gas         << 327   //  No chemical factor for water-gas 
308                                                << 328    
309   myFormula = G4String("H_2O") ;                  329   myFormula = G4String("H_2O") ;
310   const G4State theState = material->GetState(    330   const G4State theState = material->GetState() ;
311   if( theState == kStateGas && myFormula == ch    331   if( theState == kStateGas && myFormula == chFormula) return false ;
312                                                << 332     
313   const std::size_t numberOfMolecula = 53 ;    << 333   const size_t numberOfMolecula = 53 ;
314                                                   334 
315   // The coffecient from Table.4 of Ziegler &     335   // The coffecient from Table.4 of Ziegler & Manoyan
316   static const G4double HeEff = 2.8735 ;       << 336   const G4double HeEff = 2.8735 ;    
317                                                << 337   
318   static const G4String name[numberOfMolecula] << 338   static G4String name[numberOfMolecula] = {
319     "H_2O",     "C_2H_4O",    "C_3H_6O",  "C_2 << 339     "H_2O",      "C_2H_4O",    "C_3H_6O",  "C_2H_2",             "C_H_3OH",
320     "C_2H_5OH",  "C_3H_7OH",   "C_3H_4",   "NH    340     "C_2H_5OH",  "C_3H_7OH",   "C_3H_4",   "NH_3",               "C_14H_10",
321     "C_6H_6",    "C_4H_10",    "C_4H_6",   "C_    341     "C_6H_6",    "C_4H_10",    "C_4H_6",   "C_4H_8O",            "CCl_4",
322     "CF_4",      "C_6H_8",     "C_6H_12",  "C_    342     "CF_4",      "C_6H_8",     "C_6H_12",  "C_6H_10O",           "C_6H_10",
323     "C_8H_16",   "C_5H_10",    "C_5H_8",   "C_    343     "C_8H_16",   "C_5H_10",    "C_5H_8",   "C_3H_6-Cyclopropane","C_2H_4F_2",
324     "C_2H_2F_2", "C_4H_8O_2",  "C_2H_6",   "C_    344     "C_2H_2F_2", "C_4H_8O_2",  "C_2H_6",   "C_2F_6",             "C_2H_6O",
325     "C_3H_6O",   "C_4H_10O",   "C_2H_4",   "C_    345     "C_3H_6O",   "C_4H_10O",   "C_2H_4",   "C_2H_4O",            "C_2H_4S",
326     "SH_2",      "CH_4",       "CCLF_3",   "CC    346     "SH_2",      "CH_4",       "CCLF_3",   "CCl_2F_2",           "CHCl_2F",
327     "(CH_3)_2S", "N_2O",       "C_5H_10O", "C_ << 347     "(CH_3)_2S", "N_2O",       "C_5H_10O", "C_8H_6",             "(CH_2)_N",
328     "(C_3H_6)_N","(C_8H_8)_N", "C_3H_8",   "C_    348     "(C_3H_6)_N","(C_8H_8)_N", "C_3H_8",   "C_3H_6-Propylene",   "C_3H_6O",
329     "C_3H_6S",   "C_4H_4S",    "C_7H_8"           349     "C_3H_6S",   "C_4H_4S",    "C_7H_8"
330   };                                           << 350   } ;
331                                                << 351     
332   static const G4double expStopping[numberOfMo << 352   static G4double expStopping[numberOfMolecula] = {
333      66.1,  190.4, 258.7,  42.2, 141.5,        << 353      66.1,  190.4, 258.7,  42.2, 141.5, 
334     210.9,  279.6, 198.8,  31.0, 267.5,           354     210.9,  279.6, 198.8,  31.0, 267.5,
335     122.8,  311.4, 260.3, 328.9, 391.3,           355     122.8,  311.4, 260.3, 328.9, 391.3,
336     206.6,  374.0, 422.0, 432.0, 398.0,           356     206.6,  374.0, 422.0, 432.0, 398.0,
337     554.0,  353.0, 326.0,  74.6, 220.5,           357     554.0,  353.0, 326.0,  74.6, 220.5,
338     197.4,  362.0, 170.0, 330.5, 211.3,           358     197.4,  362.0, 170.0, 330.5, 211.3,
339     262.3,  349.6,  51.3, 187.0, 236.9,           359     262.3,  349.6,  51.3, 187.0, 236.9,
340     121.9,   35.8, 247.0, 292.6, 268.0,           360     121.9,   35.8, 247.0, 292.6, 268.0,
341     262.3,   49.0, 398.9, 444.0,  22.91,          361     262.3,   49.0, 398.9, 444.0,  22.91,
342      68.0,  155.0,  84.0,  74.2, 254.7,           362      68.0,  155.0,  84.0,  74.2, 254.7,
343     306.8,  324.4, 420.0                          363     306.8,  324.4, 420.0
344   } ;                                             364   } ;
345                                                   365 
346   static const G4double expCharge[numberOfMole << 366   static G4double expCharge[numberOfMolecula] = {
347     HeEff, HeEff, HeEff,   1.0, HeEff,         << 367     HeEff, HeEff, HeEff,   1.0, HeEff, 
348     HeEff, HeEff, HeEff,   1.0,   1.0,            368     HeEff, HeEff, HeEff,   1.0,   1.0,
349       1.0, HeEff, HeEff, HeEff, HeEff,            369       1.0, HeEff, HeEff, HeEff, HeEff,
350     HeEff, HeEff, HeEff, HeEff, HeEff,            370     HeEff, HeEff, HeEff, HeEff, HeEff,
351     HeEff, HeEff, HeEff,   1.0, HeEff,            371     HeEff, HeEff, HeEff,   1.0, HeEff,
352     HeEff, HeEff, HeEff, HeEff, HeEff,            372     HeEff, HeEff, HeEff, HeEff, HeEff,
353     HeEff, HeEff,   1.0, HeEff, HeEff,            373     HeEff, HeEff,   1.0, HeEff, HeEff,
354     HeEff,   1.0, HeEff, HeEff, HeEff,            374     HeEff,   1.0, HeEff, HeEff, HeEff,
355     HeEff,   1.0, HeEff, HeEff,   1.0,            375     HeEff,   1.0, HeEff, HeEff,   1.0,
356       1.0,   1.0,   1.0,   1.0, HeEff,            376       1.0,   1.0,   1.0,   1.0, HeEff,
357     HeEff, HeEff, HeEff                           377     HeEff, HeEff, HeEff
358   } ;                                             378   } ;
359                                                   379 
360   static const G4double numberOfAtomsPerMolecu << 380   static G4double numberOfAtomsPerMolecula[numberOfMolecula] = {
361     3.0,  7.0, 10.0,  4.0,  6.0,               << 381     3.0,  7.0, 10.0,  4.0,  6.0,  
362     9.0, 12.0,  7.0,  4.0, 24.0,                  382     9.0, 12.0,  7.0,  4.0, 24.0,
363     12.0, 14.0, 10.0, 13.0,  5.0,                 383     12.0, 14.0, 10.0, 13.0,  5.0,
364     5.0, 14.0, 18.0, 17.0, 17.0,                  384     5.0, 14.0, 18.0, 17.0, 17.0,
365     24.0, 15.0, 13.0,  9.0,  8.0,                 385     24.0, 15.0, 13.0,  9.0,  8.0,
366     6.0, 14.0,  8.0,  8.0,  9.0,                  386     6.0, 14.0,  8.0,  8.0,  9.0,
367     10.0, 15.0,  6.0,  7.0,  7.0,                 387     10.0, 15.0,  6.0,  7.0,  7.0,
368     3.0,  5.0,  5.0,  5.0,  5.0,                  388     3.0,  5.0,  5.0,  5.0,  5.0,
369     9.0,  3.0, 16.0, 14.0,  3.0,                  389     9.0,  3.0, 16.0, 14.0,  3.0,
370     9.0, 16.0, 11.0,  9.0, 10.0,                  390     9.0, 16.0, 11.0,  9.0, 10.0,
371     10.0,  9.0, 15.0                              391     10.0,  9.0, 15.0
372   } ;                                             392   } ;
373                                                   393 
374   // Search for the compaund in the table         394   // Search for the compaund in the table
375   for (std::size_t i=0; i<numberOfMolecula; ++ << 395   for (size_t i=0; i<numberOfMolecula; i++)
376     {                                          << 396     { 
377       if(chFormula == name[i]) {               << 397       if(chFormula == name[i]) { 
378         G4double exp125 = expStopping[i] *     << 398         G4double exp125 = expStopping[i] * 
379                     (material->GetTotNbOfAtoms    399                     (material->GetTotNbOfAtomsPerVolume()) /
380                     (expCharge[i] * numberOfAt    400                     (expCharge[i] * numberOfAtomsPerMolecula[i]) ;
381         SetExpStopPower125(exp125) ;              401         SetExpStopPower125(exp125) ;
382         return true ;                             402         return true ;
383       }                                           403       }
384     }                                             404     }
385                                                << 405   
386   return false ;                                  406   return false ;
387 }                                                 407 }
388                                                   408 
389 //....oooOO0OOooo........oooOO0OOooo........oo    409 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
390                                                   410 
391 G4double G4hParametrisedLossModel::ChemicalFac    411 G4double G4hParametrisedLossModel::ChemicalFactor(
392                             G4double kineticEn    412                             G4double kineticEnergy, G4double eloss125) const
393 {                                                 413 {
394   // Approximation of Chemical Factor accordin    414   // Approximation of Chemical Factor according to
395   // J.F.Ziegler and J.M.Manoyan, The stopping    415   // J.F.Ziegler and J.M.Manoyan, The stopping of ions in compaunds,
396   // Nucl. Inst. & Meth. in Phys. Res. B35 (19    416   // Nucl. Inst. & Meth. in Phys. Res. B35 (1988) 215-228.
397                                                << 417   
398   G4double gamma    = 1.0 + kineticEnergy/prot << 418   G4double gamma    = 1.0 + kineticEnergy/proton_mass_c2 ;    
399   G4double gamma25  = 1.0 + 25.0*keV /proton_m    419   G4double gamma25  = 1.0 + 25.0*keV /proton_mass_c2 ;
400   G4double gamma125 = 1.0 + 125.0*keV/proton_m    420   G4double gamma125 = 1.0 + 125.0*keV/proton_mass_c2 ;
401   G4double beta     = std::sqrt(1.0 - 1.0/(gam    421   G4double beta     = std::sqrt(1.0 - 1.0/(gamma*gamma)) ;
402   G4double beta25   = std::sqrt(1.0 - 1.0/(gam    422   G4double beta25   = std::sqrt(1.0 - 1.0/(gamma25*gamma25)) ;
403   G4double beta125  = std::sqrt(1.0 - 1.0/(gam    423   G4double beta125  = std::sqrt(1.0 - 1.0/(gamma125*gamma125)) ;
404                                                << 424   
405   G4double factor = 1.0 + (expStopPower125/elo    425   G4double factor = 1.0 + (expStopPower125/eloss125 - 1.0) *
406                    (1.0 + G4Exp( 1.48 * ( beta << 426                    (1.0 + std::exp( 1.48 * ( beta125/beta25 - 7.0 ) ) ) /
407                    (1.0 + G4Exp( 1.48 * ( beta << 427                    (1.0 + std::exp( 1.48 * ( beta/beta25    - 7.0 ) ) ) ;
408                                                << 428   
409   return factor ;                                 429   return factor ;
410 }                                                 430 }
411                                                   431 
412 //....oooOO0OOooo........oooOO0OOooo........oo    432 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
413                                                   433